/******************************************************************************
 *
 * Copyright (c) Enigma Interactive 2003
 * 7-15 pink lane / newcastle / ne1 5dw / england
 * t: +44 (0)191 261 2991 www.enigma-interactive.co.uk f: +44 (0)191 261 2378
 *
 * Filename: 	dropdown.js
 * Description:	A set of javascript functions for a rollover menu
 * Note: 		More efficient than the previous dropdown menu. I think.
 *
 *
 * History
 * ver	date		who					comment
 * ----------------------------------------------------------------------------
 * 1.0 	28-01-05	Andy Lewis 			Made the thing
 *****************************************************************************/

 var gLiveMenu = null;
 var gTrigger = null;
 var gDropdownTimeout = null;
 var gdParams = null;
 
 function displayDropdown(id, posId, offsetX, offsetY)
 
 {
 	var menu = xGetElementById(id);
 	var pos = xGetElementById(posId);
	var x;
	var y;
	var params = new Array();
	var index;
	
	if ((gLiveMenu == menu) && ((menu == gTrigger) || (pos == gTrigger))) {
		maintainDropdown();
		return;
	}
	
	hideDropdown();
	
	for (index = 4; index < arguments.length; index++) {
		if (typeof(arguments[index]) != 'undefined') {
			params[params.length] = arguments[index];
		}
	}
	
	gdParams = params;
	
	if (!menu || !pos)
		return;
	
	xHide(menu);
	xMoveTo(menu, xLeft(id), xTop(id));
	
	x = xLeft(id) + (xPageX(pos) - xPageX(id)) + offsetX;
	y = xTop(id) + (xPageY(pos) - xPageY(id)) + offsetY;
	
	xMoveTo(menu, x, y);

	xShow(menu);
	
	xAddEventListener(document, 'mousemove', maintainDropdown, false);
	
	gTrigger = pos;
	gLiveMenu = menu;
 }
 
 
 function hideDropdown()
 
 {
 	var menu = xGetElementById(gLiveMenu);
	
	if (menu)
		xHide(menu);
	
	xRemoveEventListener(document, 'mousemove', maintainDropdown, false);
	gLiveMenu = null;
}

 
 function clearDropdown()
 
 {
	if (gDropdownTimeout)
		window.clearTimeout(gDropdownTimeout);
	
	gDropdownTimeout = window.setTimeout("hideDropdown();", 50);
}

 
 function maintainDropdown(evt)
 
 {
 	var e = new xEvent(evt);
	var x = e.pageX;
	var y = e.pageY;
	var inside = dxHasPoint(gLiveMenu, x, y) || dxHasPoint(gTrigger, x, y);
	
	//alert(xPageY(gTrigger));

	if (!inside)
		clearDropdown()
	else {	
		if (gDropdownTimeout)
			window.clearTimeout(gDropdownTimeout);
		gDropdownTimeout = 0;
	}
}

// Leave this one! It may seem superfluous, but it ain't!
function dd()

{
}


function dxHasPoint(ele, iLeft, iTop, iClpT, iClpR, iClpB, iClpL) {
  if (!xNum(iClpT)){iClpT=iClpR=iClpB=iClpL=0;}
  else if (!xNum(iClpR)){iClpR=iClpB=iClpL=iClpT;}
  else if (!xNum(iClpB)){iClpL=iClpR; iClpB=iClpT;}
  var thisX = xPageX(ele), thisY = dxPageY(ele);
  return (iLeft >= thisX + iClpL && iLeft <= thisX + xWidth(ele) - iClpR &&
          iTop >=thisY + iClpT && iTop <= thisY + xHeight(ele) - iClpB );
}

function dxPageY(e) {
  if (!(e=xGetElementById(e))) return 0;
  var y = 0;
  while (e) {
    if (xDef(e.offsetTop)) y += e.offsetTop;
    if (xDef(e.scrollTop) && (e.scrollTop > 0)) y -= e.scrollTop;
    e = xDef(e.offsetParent) ? e.offsetParent : null;
  }
//  if (xOp7) return y - document.body.offsetTop; // v3.14, temporary hack for opera bug 130324 (reported 1nov03)
  return y;
}
