//	Cascade Menu Handling routines

//	Copyright (c) gaelITech 2008
//	www.gaelitech.ie

//	Values of oElement.giType Flags:
var	gi_Cascade_IsMenu = 1;		// TRUE - Element is a Menu, FALSE - Element is a MenuItem
var	gi_Cascade_IsHeadMenu = 2;	// TRUE - Element is a Head Menu, FALSE - Element is a Sub Menu
var	gi_Cascade_IsHRef = 4;		// TRUE - MenuItem calls an HRef, FALSE - MenuItem calls a Sub Menu

var	gi_Cascade_OpenMenus = new Array();	// List of Sub Menu numbers currently visible

var	gi_Cascade_InMenu = 0;				// Menu Number which cursor is presently in

var	gi_Cascade_Session = "";			// Session suffix to be added to hrefs

//	Return the Object targeted by an Event Object, hiding platform differences
function	gi_Cascade_Menu_GetElement(oEvent)
{
	oEvent = (oEvent) ? oEvent : ((window.event) ? window.event : null);
	return (oEvent.target) ? oEvent.target : oEvent.srcElement;
}

//	Get an Element's class, hiding platform differences
function	gi_Cascade_Menu_GetClass(oElement)
{
	if	(oElement.className)
		return oElement.className;
	else
		return oElement.getAttribute("class");
}

//	Add to an Element's saved class, hiding platform differences
function	gi_Cascade_Menu_AddClass(oElement, sClass)
{
	if	(oElement.className)
		oElement.className = oElement.giSaveClass + " " + sClass;
	else
		oElement.setAttribute("class", oElement.giSaveClass + " " + sClass);
}

//	Open a Sub Menu
function	gi_Cascade_Menu_Open(oMenuItem)
{
	var	oMenu;
	var	xPos = 0;
	var	yPos = 0;
	var	oPointer;
	var	i;

	oMenu = document.getElementById("gi_cascade_menu_" + oMenuItem.giMenuOpen);
	oMenu.giOpenedBy = oMenuItem;
	oMenuItem.giMenuOpened = 1;
	if	(oMenuItem.giType & gi_Cascade_IsHeadMenu)
		gi_Cascade_Menu_AddClass(oMenuItem, "gi_cascade_headmenu_item_clicked");
	else
		gi_Cascade_Menu_AddClass(oMenuItem, "gi_cascade_submenu_item_clicked");

	if	(oMenu != null)
	{
		//	This piece of code is required because IE doesn't always return consistent values
		//	if the Menu has been opened before, and flown-over, so we remember the first time
		//	values, and re-use them.  Other browsers seem to be better behaved...
		if	((oMenu.gixPos == 0) && (oMenu.giyPos == 0))
		{
			oPointer = oMenuItem;
			while	(oPointer)
			{
				xPos += oPointer.offsetLeft;
				yPos += oPointer.offsetTop;
				oPointer = oPointer.offsetParent;
			}

			xPos = xPos + oMenuItem.offsetWidth;
			oMenu.gixPos = xPos;
			oMenu.giyPos = yPos;
		}
		else
		{
			xPos = oMenu.gixPos;
			yPos = oMenu.giyPos;
		}
		
		oMenu.style.left = xPos + "px";
		oMenu.style.top = yPos + "px";
		oMenu.style.visibility = "visible";

		for	(i = 0; i < gi_Cascade_OpenMenus.length; i++)
			if	(gi_Cascade_OpenMenus[i] == 0)
			{
				gi_Cascade_OpenMenus[i] = oMenuItem.giMenuOpen;
				return;
			}
		gi_Cascade_OpenMenus[gi_Cascade_OpenMenus.length] = oMenuItem.giMenuOpen;
	}
}

//	Close all Sub Menus below this one
function	gi_Cascade_Menu_Close_Cascade(nMenu)
{
	for	(i = gi_Cascade_OpenMenus.length - 1; i >= 0; i--)
		if	(gi_Cascade_OpenMenus[i] != 0)
			if	(gi_Cascade_OpenMenus[i] != nMenu)
				gi_Cascade_Menu_Close(gi_Cascade_OpenMenus[i]);
			else
				break;
}

//	Close a Sub Menu
function	gi_Cascade_Menu_Close(nMenu)
{
	var	oMenu = document.getElementById("gi_cascade_menu_" + nMenu);
	var	i;

	if	(oMenu != null)
	{
		for	(i = 0; i < gi_Cascade_OpenMenus.length; i++)
			if	(nMenu == gi_Cascade_OpenMenus[i])
			{
				oMenu.style.visibility = "hidden";
				gi_Cascade_OpenMenus[i] = 0;
				oMenu.giOpenedBy.giMenuOpened = 0;
				if	(oMenu.giOpenedBy.giType & gi_Cascade_IsHeadMenu)
					gi_Cascade_Menu_AddClass(oMenu.giOpenedBy, "gi_cascade_headmenu_item_normal");
				else
					gi_Cascade_Menu_AddClass(oMenu.giOpenedBy, "gi_cascade_submenu_item_normal");
				break;
			}
	}
}

//	Clear all Sub Menus if cursor not in a menu
function	gi_Cascade_Menu_Clear()
{
	if	(!gi_Cascade_InMenu)
		gi_Cascade_Menu_Close_Cascade(-1);
}

//	React to a MouseOver event on a Menu Item
function	gi_Cascade_MenuItem_MouseOver(oEvent)
{
	var	oElement = gi_Cascade_Menu_GetElement(oEvent);
	
	gi_Cascade_InMenu = oElement.giMenu;

	gi_Cascade_Menu_Close_Cascade(gi_Cascade_InMenu);
	
	if	(oElement.giType & gi_Cascade_IsHeadMenu)
		gi_Cascade_Menu_AddClass(oElement, "gi_cascade_headmenu_item_hover");
	else
		gi_Cascade_Menu_AddClass(oElement, "gi_cascade_submenu_item_hover");

	if	(!(oElement.giType & gi_Cascade_IsHRef))
		gi_Cascade_Menu_Open(oElement);
}

//	React to a MouseOut event on a Menu Item
function	gi_Cascade_MenuItem_MouseOut(oEvent)
{
	var	oElement = gi_Cascade_Menu_GetElement(oEvent);

	if	(!oElement.giMenuOpened)
		if	(oElement.giType & gi_Cascade_IsHeadMenu)
			gi_Cascade_Menu_AddClass(oElement, "gi_cascade_headmenu_item_normal");
		else
			gi_Cascade_Menu_AddClass(oElement, "gi_cascade_submenu_item_normal");

	gi_Cascade_InMenu = 0;

	window.setTimeout("gi_Cascade_Menu_Clear()", 2000);
}

//	React to a MouseClick event on a Menu Item
function	gi_Cascade_MenuItem_Click(oEvent)
{
	var	oElement = gi_Cascade_Menu_GetElement(oEvent);

	if	(oElement.giType & gi_Cascade_IsHRef)
	{
		window.location.href = oElement.giHRef + gi_Cascade_Session;
	}
}

//	Initialise a Menu Item
function	gi_Cascade_InitMenuItem(oItem)
{
	var	th = oItem.innerHTML.split("|");
	
	oItem.giMenu = oItem.parentNode.giMenu;
	oItem.giType = 0;
	oItem.giMenuOpened = 0;

	if	(isNaN(parseInt(th[1])))
	{
		oItem.giType += gi_Cascade_IsHRef;
		oItem.innerHTML = th[0];
	}
	else
	{
		oItem.innerHTML = th[0] + "&nbsp;&raquo;";
		oItem.giMenuOpen = parseInt(th[1]);
	}
	
	oItem.giHRef = th[1];

	oItem.giSaveClass = gi_Cascade_Menu_GetClass(oItem);
	
	if	(oItem.giSaveClass.indexOf("gi_cascade_headmenu") == -1)
	{
		oItem.giType += gi_Cascade_IsHeadMenu;
		gi_Cascade_Menu_AddClass(oItem, "gi_cascade_headmenu_item_normal");
	}
	else
		gi_Cascade_Menu_AddClass(oItem, "gi_cascade_submenu_item_normal");
		
	oItem.onmouseover = gi_Cascade_MenuItem_MouseOver;
	oItem.onmouseout = gi_Cascade_MenuItem_MouseOut;
	oItem.onclick = gi_Cascade_MenuItem_Click;
}

//	Initialise a Menu
function	gi_Cascade_InitMenu(oItem, nMenu)
{
	oItem.giSaveClass = gi_Cascade_Menu_GetClass(oItem);
	oItem.giMenu = nMenu;
	oItem.giType = gi_Cascade_IsMenu;
	oItem.gixPos = 0;
	oItem.giyPos = 0;
	oItem.giOpenedBy = null;
	
	if	(oItem.giSaveClass.indexOf("gi_cascade_headmenu") == -1)
		oItem.style.visibility = "hidden";
	else
		oItem.giType += gi_Cascade_IsHeadMenu;
}

//	Initialise all Menus - called after <body> is loaded
function	gi_Cascade_InitMenus()
{
	var	oItem;
	var	i;
	var	sItemName;
	var	sAnchor;
	
	for	(i = 1; ; i++)
	{
		sItemName = "gi_cascade_menu_" + i;
		oItem = document.getElementById(sItemName);	
		if	(oItem == null)
			break;
		gi_Cascade_InitMenu(oItem, i);
	}

	for	(i = 1; ; i++)
	{
		sItemName = "gi_cascade_menuitem_" + i;
		oItem = document.getElementById(sItemName);	
		if	(oItem == null)
			break;
		gi_Cascade_InitMenuItem(oItem);
	}

	sItemName = "gi_cascade_menu_session_anchor";
	oItem = document.getElementById(sItemName);	
	if	(oItem != null)
	{
		if	(oItem.href.indexOf("?") >= 0)
		{
			sAnchor = oItem.href.split("?");
			gi_Cascade_Session = "?" + sAnchor[1];
		}
	}
}

//	Handle window resize
function	gi_Cascade_ResizeMenus()
{
	var	oItem;
	var	i;
	
	for	(i = 1; ; i++)
	{
		sItemName = "gi_cascade_menu_" + i;
		oItem = document.getElementById(sItemName);	
		if	(oItem == null)
			break;
		oItem.gixPos = 0;
		oItem.giyPos = 0;
	}
}

window.onload = gi_Cascade_InitMenus;
window.onresize = gi_Cascade_ResizeMenus;
