
// -------------------------------------------------------------
// Client-side global variables
// -------------------------------------------------------------

var viMenu_sOpenTitleID = "";
var viMenu_objOpenMenu = null;

var viMenu_iChunk = 0;
var viMenu_iChunkStep = 15;
var viMenu_iChunkDelay = 25;

var viMenu_sMenuStyle = "down";	// values: "down", "across", "diagonal"

if (!VIIsIEClient())
{
	document.onmousemove = viMenuOnMouseMove;
	document.onmouseout = viMenuOnMouseOut;
}
else
{
	document.onmouseout = viMenuOnMouseOut;
}

// ----------------------------------------------------------
// Function which returns the appropriate menu diplay animation
// ----------------------------------------------------------

function viMenuGetShowStyle()
{
	if ("down" == viMenu_sMenuStyle)
		return "rect(0 100% " + viMenu_iChunk + "% 0)";
		
	if ("across" == viMenu_sMenuStyle)
		return "rect(0 " + viMenu_iChunk + "% 100% 0)";
		
	if ("diagonal" == viMenu_sMenuStyle)
		return "rect(0 " + viMenu_iChunk + "% " + viMenu_iChunk + "% 0)";
	else
		return "rect(0 100% " + viMenu_iChunk + "% 0)";
}

// ----------------------------------------------------------
// Function which incrementally displays Menu in appropriate style
// ----------------------------------------------------------

function viMenuShow(eMenu)
{
	eMenu.style.clip = viMenuGetShowStyle();

	if (100 >= viMenu_iChunk)
	{
		window.setTimeout("viMenuShow(" + eMenu.id + ")", viMenu_iChunkDelay);
	}
	viMenu_iChunk += viMenu_iChunkStep;
}

function viMenuOpen(eMenuTitle)
{
	while (eMenuTitle != null && VIGetElementClass(eMenuTitle) != "clsMenuTitle")
	{
		eMenuTitle = eMenuTitle.parentElement;
	}

	if (eMenuTitle != null)
	{
		if (VIIsIEClient()) window.event.cancelBubble = true;

		// ----------------------------------------------------------
		// If the menu is already open then exit
		// ----------------------------------------------------------

		if (eMenuTitle.id == viMenu_sOpenTitleID)
		{
			return true;
		}

		// ----------------------------------------------------------
		// If we have a menu open then close it
		// ----------------------------------------------------------

		viMenuClose();

		// ----------------------------------------------------------
		// Set style on menu title so that it is highlighted
		// ----------------------------------------------------------

		VISetElementClass(eMenuTitle, "clsMenuTitleSelected");
		viMenu_sOpenTitleID = eMenuTitle.id;

		// ----------------------------------------------------------
		// Cancel default link behavior
		// ----------------------------------------------------------

		if (VIIsIEClient()) window.event.returnValue = false;

		// ----------------------------------------------------------
		// Get Menu associated with the Menu Title and make sure it
		// exists. If it does, show the Menu
		// ----------------------------------------------------------

		var sMenuID = eMenuTitle.id.replace("menuTitle","divMenu")
		viMenu_objOpenMenu = VIGetElement(sMenuID);

		if (viMenu_objOpenMenu != null && VIGetElementClass(viMenu_objOpenMenu) == "clsMenu")
		{
			viMenu_iChunk = viMenu_iChunkStep;

			// ----------------------------------------------------------
			// Calculate left and top offset to the menu title element
			// ----------------------------------------------------------
			var eCurEle = eMenuTitle;
			var nOffsetTop = 0;
			var nOffsetLeft = 0;
			var nMenuWidth = viMenu_objOpenMenu.offsetWidth;
			
			while (eCurEle != null)
			{
				nOffsetTop = Number(nOffsetTop) + VIElementGetOffsetTop(eCurEle);
				nOffsetLeft = Number(nOffsetLeft) + VIElementGetOffsetLeft(eCurEle);
				eCurEle = eCurEle.parentElement;
			}

			// ----------------------------------------------------------
			// Get the TD table element and add the height to the
			// vertical offset
			// ----------------------------------------------------------

			var eTD = eMenuTitle;
			while (eTD != null && eTD.tagName != "TD")
			{
				eTD = eTD.parentElement;
			}

			// ----------------------------------------------------------
			// Set the left and top offsets of the menu
			// ----------------------------------------------------------

			VIElementMoveTo(viMenu_objOpenMenu, Number(nOffsetLeft), Number(nOffsetTop) + VIElementGetHeight(eTD))

			// ----------------------------------------------------------
			// Set padding of each menu item (i.e. <a> element) to
			// fill the width of the menu
			// ----------------------------------------------------------

			var objCurMenuItem = viMenu_objOpenMenu.firstChild;
			while (objCurMenuItem != null)
			{
				if (objCurMenuItem.tagName == 'a' || objCurMenuItem.tagName == 'A')
				{
					viMenuItemPad(objCurMenuItem, nMenuWidth);
				}
				objCurMenuItem = objCurMenuItem.nextSibling;
			}

			// ----------------------------------------------------------
			// Zero out the Menu size and start the viMenuShow process
			// ----------------------------------------------------------

			if (VIIsIEClient())
			{
				viMenu_objOpenMenu.style.clip = "rect(0 0 0 0)";
				VIShowElement(viMenu_objOpenMenu);
				return window.setTimeout("viMenuShow(" + viMenu_objOpenMenu.id + ")", viMenu_iChunkDelay);
			}
			else
			{
				VIElementClipRect(viMenu_objOpenMenu, 0, 0, "100%", "100%");
				VIShowElement(viMenu_objOpenMenu);
				if (VIIsNNClient())
				{
					document.captureEvents(Event.MOUSEMOVE);
					document.captureEvents(Event.MOUSEOUT);
				}
			}
		}
	}
	return true;
}

function viMenuOnMouseMove(objEvent)
{
	if (viMenu_objOpenMenu == null)
	{
		return;   // Bail if there is no menu currently open
	}

	var x;
	var y;

	if (VIIsNNClient())
	{
		x = objEvent.clientX;
		y = objEvent.clientY;

		// Check to see if mouse is now over the open menu
		if (!viMenuContainsPoint(x,y))
		{
			viMenuClose();
		}

		return;
	}
}

function viMenuOnMouseOut(objEvent)
{
	if (viMenu_objOpenMenu == null)
	{
		return;   // Bail if there is no menu currently open
	}

	var objSrcElement;
	var objToElement;
	var x;
	var y;
	var boundsTop;
	var boundBottom;
	var sMenuOpenID = viMenu_objOpenMenu.id;
	var objMenuTitle = VIGetElement(viMenu_sOpenTitleID);

	if (VIIsIEClient())
	{
		x = window.event.clientX;
		y = window.event.clientY;
		boundsTop = objMenuTitle.offsetTop;
		boundsBottom = viMenu_objOpenMenu.offsetTop + viMenu_objOpenMenu.offsetHeight;

		if (y <= boundsTop || y >= boundsBottom)
		{
			viMenuClose();
			return;
		}

		objToElement = window.event.toElement;
		var objCurElement = objToElement;

		while (objCurElement != null)
		{
			if (objCurElement.id == sMenuOpenID || objCurElement.id == viMenu_sOpenTitleID)
			{
				// Current menu or one of its descendents is
				// receiving focus. Bail out and do not close
				// the current menu.
				return;
			}
			objCurElement = objCurElement.parentElement;
		}

		viMenuClose();
	}
}

function viMenuContainsPoint(x,y)
{
	if (viMenu_objOpenMenu == null)
	{
		return false;
	}

	var objMenuTitle = VIGetElement(viMenu_sOpenTitleID);
	var nTitleHeight = 0;
	var boundsLeft = 0;
	var boundsRight = 0;
	var boundsTop = 0;
	var boundsBottom = 0;

	if (objMenuTitle != null)
	{		
		nTitleHeight = objMenuTitle.offsetHeight;
	}

	boundsLeft = viMenu_objOpenMenu.offsetLeft;
	boundsRight = boundsLeft + viMenu_objOpenMenu.offsetWidth;
	boundsTop = viMenu_objOpenMenu.offsetTop - nTitleHeight;
	boundsBottom = viMenu_objOpenMenu.offsetTop + viMenu_objOpenMenu.offsetHeight;

	if (x >= boundsLeft && x <= boundsRight && y >= boundsTop && y <= boundsBottom)
	{
		return true;
	}
	
//	alert("x:" + String(x) + ", y:" + String(y));
//	alert("left:" + String(boundsLeft) + " right:" + String(boundsRight) + " top: " + String(boundsTop) + " bottom:" + String(boundsBottom));

	return false;
}

function viMenuClose()
{
	if (VIIsNNClient())
	{
		document.releaseEvents(Event.MOUSEOUT);
		document.releaseEvents(Event.MOUSEMOVE);
	}
	VISetElementClass(viMenu_sOpenTitleID, "clsMenuTitle");
	if (viMenu_objOpenMenu != null)
	{
		VIHideElement(viMenu_objOpenMenu);
	}
	viMenu_sOpenTitleID = "";
	viMenu_objOpenMenu = null;
}

function viMenuItemPad(objMenuItem, nMenuWidth)
{
	var nItemWidth;
	var nPadding;

	if (objMenuItem != null)
	{
		if (objMenuItem.style.paddingRight.length == 0)
		{
			nItemWidth = objMenuItem.offsetWidth;
			nPadding = nMenuWidth - nItemWidth;
			nPadding = nPadding - 5;
			objMenuItem.style.paddingRight = String(nPadding);
		}
	}
}

function viSysMenuSelectItem(eMenuItem)
{
//	var eMenuItem = window.event.srcElement;

	while (eMenuItem != null && VIGetElementClass(eMenuItem) != "clsSysMenuItem")
	{
		eMenuItem = eMenuItem.parentElement;
	}

	if (eMenuItem != null)
	{
		VISetElementClass(eMenuItem,"clsSysMenuItemSelected");
		if (VIIsIEClient()) window.event.cancelBubble = true;
	}

	return true;
}

function viSysMenuDeselectItem(eMenuItem)
{
//	var eMenuItem = window.event.srcElement;

	while (eMenuItem != null && VIGetElementClass(eMenuItem) != "clsSysMenuItemSelected")
	{
		eMenuItem = eMenuItem.parentElement;
	}

	if (eMenuItem != null)
	{
		VISetElementClass(eMenuItem,"clsSysMenuItem");
		if (VIIsIEClient()) window.event.cancelBubble = true;
	}

	return true;
}
