/* This script is free for use; thanks go to Inside.com for the starting point (although
 it is now so heavily modified, it is barely the same.
 It would be nice to know if you are using this tho!
 Craig McDonald email: cmcdonald@effect.net.au */

if (document.all)    {n=0;ie=1;fShow="visible";fHide="hidden";}
if (document.layers) {n=1;ie=0;fShow="show";   fHide="hide";}

//Init global variables
flexMenu = {
	menuClass: null,
	menuItemClass: null,
	subMenuClass: null,
	subMenuItemClass: null,
	menuOrientation: null,

	bottomY: 0,
	topY: 0,
	leftX: 0,
	rightX: 0,
	
	lastBottomY: 0,
	lastTopY: 0,
	lastLeftX: 0,
	lastRightX: 0,
	
	lastMenu: null,
	lastSubMenu: null,
	lastMenuItem: null,
	
	mainMenuWrapperID: null,
	mainTableID: null
}

aFlexMenu = new Array();

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Public declaration
function Menu(locMenuClass,locMenuItemClass,locSubMenuClass, locSubMenuItemClass, locMenuOrientation, flexMenuID, subMenuImage)
{
	this.addItem    = addItem;
	this.addSubItem = addSubItem;
	this.showMenu   = showMenu;
	this.flexMenuID = flexMenuID;
	this.mainItemIDCount = 0;
	this.itemIDCount = 0;
	this.subMenuImage = subMenuImage;

	flexMenu = new Object;

	flexMenu.menuClass = locMenuClass;
	flexMenu.menuItemClass = locMenuItemClass;
	flexMenu.subMenuClass = locSubMenuClass;
	flexMenu.subMenuItemClass = locSubMenuItemClass;
	flexMenu.menuOrientation = locMenuOrientation;

	flexMenu.bottomY = 0;
	flexMenu.topY = 0;
	flexMenu.leftX = 0;
	flexMenu.lastBottomY = 0;
	flexMenu.lastTopY = 0;	
	flexMenu.lastLeftX = 0;

	flexMenu.mainMenuWrapperID = 'flexMenu' + this.flexMenuID + 'Wrapper';
	flexMenu.mainTableID = 'flexMenu' + this.flexMenuID + 'Table';

	aFlexMenu[flexMenuID] = flexMenu;
	
	HTMLstr = "";
	
	// Build the Menu Wrapper
	HTMLstr += "<!-- MENU PANE DECLARATION BEGINS -->\n";
	HTMLstr += "\n";

	HTMLstr += "<table id='" + flexMenu.mainTableID +"' class=" + flexMenu.menuClass + " cellpadding=0 cellspacing=0>\n";
	if(flexMenu.menuOrientation == "horizontal")
		HTMLstr += "<tr>";

	HTMLstr += "<div id='" + flexMenu.mainMenuWrapperID + "' style='position:relative;'>\n";			
	
	HTMLstr += "<!-- MAIN MENU STARTS -->\n";
	HTMLstr += "<!-- MAIN_MENU -->\n";
	HTMLstr += "<!-- MAIN MENU ENDS -->\n";
	HTMLstr+= "</div>\n";
	
	if(flexMenu.menuOrientation == "horizontal")
		HTMLstr += "</tr>\n";
	HTMLstr += "</table>\n";
	HTMLstr += "\n";
	
	HTMLstr += "<!-- SUB MENU STARTS -->\n";
	HTMLstr += "<!-- SUB_MENU -->\n";
	HTMLstr += "<!-- SUB MENU ENDS -->\n";
	
	HTMLstr += "\n";

	HTMLstr += "<!-- MENU PANE DECALARATION ENDS -->\n";
}

function addItem(text, location, newWindow, submenu, displaySubMenuDirection)
{
	this.mainItemIDCount += 1;
	// Check the menu Orientation and check sub menu flyout direction
	// Vertical can only have LEFT or RIGHT; Horizontal can only have UP or DOWN
	if (flexMenu.menuOrientation == "vertical" && (displaySubMenuDirection == "up" || displaySubMenuDirection == "down"))
		this.displaySubMenuDirection = "right"; 
	else if (flexMenu.menuOrientation == "horizontal" && (displaySubMenuDirection == "left" || displaySubMenuDirection == "right"))
		this.displaySubMenuDirection = "down";
	else
		this.displaySubMenuDirection = displaySubMenuDirection;
	
	// Build the menu item
	var MENUitem = "";
	MENUitem += "\n<!-- ITEM flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+" -->\n";
	
	//Variation in building if the menu is displayed vertically or horizontally
	if (flexMenu.menuOrientation == "vertical")
		MENUitem += "<tr><td>\n";
	else if (flexMenu.menuOrientation == "horizontal")
		MENUitem += "<td>\n";
		
	if (ie)
	{	
		MENUitem += "<div width=\"100%\" id='flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"' class='" + flexMenu.menuItemClass + "' ";
		if(location != '')
			MENUitem += "onclick=\"menuItemOnClick('flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"', '" + location + "', '"+newWindow+"')\" ";
	
		// If this item has a submenu
		if (submenu)
			MENUitem += "onmouseover=\"displaySubMenu('flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"', 'flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"submenu'," + this.flexMenuID + ", '" + this.displaySubMenuDirection + "')\" ";
		else // otherwise just highlight the item then
		{
			MENUitem += "onmouseover=\"menuItemHover('flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"', " + this.flexMenuID + ", false, '"+location+"', true)\" ";		
			MENUitem += "onmouseout=\"menuItemHover('flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+"', " + this.flexMenuID + ", false, null, true)\"";
		}		
		MENUitem += ">\n";			
		MENUitem += text;
		MENUitem += "</div>\n";
	}

	//Variation in building if the menu is displayed vertically or horizontally
	if (flexMenu.menuOrientation == "vertical")
		MENUitem += "</td></tr>\n";
	else if (flexMenu.menuOrientation == "horizontal")
		MENUitem += "</td>\n";

	MENUitem += "<!-- END OF ITEM flex"+this.flexMenuID+"MainItem"+this.mainItemIDCount+" -->\n\n";
	MENUitem += "<!-- MAIN_MENU -->\n";

	HTMLstr = HTMLstr.replace("<!-- MAIN_MENU -->\n", MENUitem);

	return "flex"+this.flexMenuID+"MainItem" + this.mainItemIDCount;
}

function addSubItem(idParent, text, location, newWindow, hasSubMenu, direction, offsetX, offsetY)
{
	this.itemIDCount += 1;
	// Check that the flyout orientation is logically correct:
	// If the submenu is going left, then the flyout has to go left.
	if (direction == null)
	{
		if(this.displaySubMenuDirection == "left")
			this.direction = "left";
		else
			this.direction = "right";
	}
	else if (this.displaySubMenuDirection == "left" && direction == "right")
		this.direction = "left";
	else if (this.displaySubMenuDirection == "right" && direction == "left")
		this.direction = "right";
	else
		this.direction = direction;
	
	var MENUitem = "";
	Lookup = "<!-- NEXT ITEM OF SUB MENU "+ idParent +" -->";
	
	//Build start of submenu if this the first item in the submenu.
	if (HTMLstr.indexOf(Lookup) == -1)
	{
		MENUitem += "\n";
		MENUitem += "<div id='"+idParent+"submenu' style=\"z-index:1;\" class=" + flexMenu.subMenuClass + ">\n";
		MENUitem += "<!-- START INSIDE SUB MENU "+ idParent +" -->\n";
		MENUitem += "<!-- NEXT ITEM OF SUB MENU "+ idParent +" -->\n";
		MENUitem += "</div>\n";
		MENUitem += "\n";
		MENUitem += "<!-- SUB_MENU -->\n";
		HTMLstr = HTMLstr.replace("<!-- SUB_MENU -->\n", MENUitem);
	}
	
	if(ie)
	{
		MENUitem = "<div style=\"width:100%;\" id='flex"+this.flexMenuID+"Item"+ this.itemIDCount + "submenuitem' class=" + flexMenu.subMenuItemClass + " ";
		if(location != '')
			MENUitem += "onclick=\"menuItemOnClick('flex"+this.flexMenuID+"Item"+ this.itemIDCount + "', '"+location+"', '"+newWindow+"')\" ";

		// If this submenu item has a flyout submenu, change the mouseover
		if(hasSubMenu)
		{
			MENUitem += "onmouseover=\"displayFlyOutMenu('flex"+this.flexMenuID+"Item"+this.itemIDCount+"submenuitem', 'flex"+this.flexMenuID+"Item"+this.itemIDCount+"submenu'," + this.flexMenuID + ", '" + this.direction + "', '" + this.displaySubMenuDirection + "', " + offsetX + ", " + offsetY + ")\">";
			MENUitem += text;
			MENUitem += "<img src=\""+ this.subMenuImage + "\" width=15 height=15 border=0 align=\"absmiddle\">";
		}
		else
		{
			// Else change highlight hover for this item
			MENUitem += "onmouseover=\"menuItemHover('flex"+this.flexMenuID+"Item"+this.itemIDCount+"submenuitem', " + this.flexMenuID + ", false, '"+location+"', false)\" ";		
			MENUitem += "onmouseout=\"menuItemHover('flex"+this.flexMenuID+"Item"+this.itemIDCount+"submenuitem', " + this.flexMenuID + ", false, null, false)\">";
			MENUitem += text;			
		}
		MENUitem += "</div>\n";
	}

	// If menu is being displayed up, reverse the order of menu items
	if(this.displaySubMenuDirection == "up") 
	{
		Lookup = "<!-- START INSIDE SUB MENU "+ idParent +" -->\n";
		MENUitem = Lookup.concat(MENUitem);
	}
	else 
	{
		Lookup = "<!-- NEXT ITEM OF SUB MENU "+ idParent +" -->\n";
		MENUitem += Lookup;
	}
	
	HTMLstr = HTMLstr.replace(Lookup, MENUitem);
	
	return "flex"+this.flexMenuID+"Item"+this.itemIDCount;
}

function showMenu()
{
//	document.all('DHTMLMenu').innerHTML = HTMLstr;
	document.writeln(HTMLstr);
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private declaration
function displaySubMenu(idMainMenu, idSubMenu, idFlexMenu, menuDirection)
{
	var menu;
	var submenu;

	if (n)
	{
		submenu = document.layers[idMainMenu+"submenu"];
		if (lastMenu != null && lastMenu != submenu) hideAll();
		submenu.left = document.layers[idMainMenu].pageX;
		submenu.top  = document.layers[idMainMenu].pageY + 18;
		submenu.visibility = fShow;

		leftX  = document.layers[idMainMenu+"submenu"].left;
		rightX = leftX + document.layers[idMainMenu+"submenu"].clip.width;
		leftY  = document.layers[idMainMenu+"submenu"].top+
			document.layers[idMainMenu+"submenu"].clip.height;
		rightY = leftY;
	} 
	else if (ie)
	{
		menu = eval(idMainMenu);
		submenu = eval(idSubMenu);

		// Hide previous menu's and de-highlight
		if (aFlexMenu[idFlexMenu].lastMenuItem != null && aFlexMenu[idFlexMenu].lastMenuItem != menu)
			hideMenus(idFlexMenu);
		else if (aFlexMenu[idFlexMenu].lastMenu != null && aFlexMenu[idFlexMenu].lastMenu != submenu)
			hideMenus(idFlexMenu);
			
		var topOffset = 0;
		var leftOffset = 0;
		var menuPadding = 5;	
		var borderWidth = 0;
		
		if (IsBrowser("IE5up"))
		{
			borderWidth = parseInt(document.all[aFlexMenu[idFlexMenu].mainTableID].currentStyle.borderWidth);
			var subMenuBorderWidth = parseInt(submenu.currentStyle.borderWidth);
		}
		
		if (isNaN(borderWidth))
			borderWidth = 0;
		if(isNaN(subMenuBorderWidth))
			subMenuBorderWidth = 0;
		
		if (IsBrowser("IE5.5"))
		{
			topOffset = borderWidth - subMenuBorderWidth;
			leftOffset = borderWidth - subMenuBorderWidth;
		}
		else if (IsBrowser("IE5"))
		{
			leftOffset = borderWidth - subMenuBorderWidth;
			topOffset = borderWidth - subMenuBorderWidth;
		}
		
		// Determine menu direction and set the position coords	
		if (menuDirection == "up")
		{
			if (IsBrowser("IE5"))
				leftOffset += 2;
			else if (IsBrowser("IE4"))
				leftOffset += 3;
				
			// Set Sub Menu Position Coords
			submenu.style.left = calculateSumOffset(menu, "offsetLeft") - leftOffset;
			submenu.style.top = calculateSumOffset(menu.parentElement, "offsetTop") - submenu.offsetHeight - topOffset;
	
			// Set auto hide coords for this menu
			aFlexMenu[idFlexMenu].leftX  = submenu.style.posLeft;
			aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth;
			aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight + menu.offsetHeight;
			aFlexMenu[idFlexMenu].topY = submenu.style.posTop;
		}
		else if (menuDirection == "down")
		{
			if (IsBrowser("IE5"))
				leftOffset += 2;
			else if (IsBrowser("IE4"))
				leftOffset += 3;
				
			// Set Sub Menu Position Coords
			submenu.style.left = calculateSumOffset(menu, "offsetLeft") - leftOffset;
			submenu.style.top = calculateSumOffset(menu.parentElement, "offsetTop") + menu.offsetHeight + topOffset;

			// Set auto hide coords for this menu
			aFlexMenu[idFlexMenu].leftX  = submenu.style.posLeft;
			aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth;
			aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight;
			aFlexMenu[idFlexMenu].topY = submenu.style.posTop - menu.offsetHeight;
		}
		else if (menuDirection == "left")
		{
			// Set Sub Menu Position Coords
			submenu.style.left = (calculateSumOffset(menu.parentElement, "offsetLeft") - submenu.offsetWidth) - leftOffset;
			submenu.style.top = calculateSumOffset(menu.parentElement, "offsetTop") - topOffset;
			
			// Set auto hide coords for this menu
			aFlexMenu[idFlexMenu].leftX  = submenu.style.posLeft;
			aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth + menu.offsetWidth;
			aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight;
			aFlexMenu[idFlexMenu].topY = submenu.style.posTop;
		}
		else if (menuDirection == "right")
		{
			// Set Sub Menu Position Coords
			submenu.style.left = calculateSumOffset(menu.parentElement, "offsetLeft") + menu.offsetWidth + leftOffset;
			submenu.style.top = calculateSumOffset(menu.parentElement, "offsetTop") - topOffset;

			// Set auto hide coords for this menu
			aFlexMenu[idFlexMenu].leftX  = submenu.style.posLeft - menu.offsetWidth;
			aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + menu.offsetWidth + submenu.offsetWidth;
			aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight;
			aFlexMenu[idFlexMenu].topY = submenu.style.posTop;
		}

		// Highlight Main Menu Item	
		menuItemHover(idMainMenu, idFlexMenu, true, 'test', false);		

		submenu.style.visibility = fShow;
	}

	aFlexMenu[idFlexMenu].lastMenu = submenu; 	// Set last sub menu item
	aFlexMenu[idFlexMenu].lastMenuItem = menu;	// Set last main menu item
}

function displayFlyOutMenu(idMainMenu, idSubMenu, idFlexMenu, menuDirection, mainMenuDirection, offsetX, offsetY)
{
	var menu;
	var submenu;

	if (ie)
	{
		menu = eval(idMainMenu);
		submenu = eval(idSubMenu);

		// Highlight Sub Menu Item	
		menuItemHover(idMainMenu, idFlexMenu, true, 'test', false);		

		aFlexMenu[idFlexMenu].lastLeftX = aFlexMenu[idFlexMenu].leftX;
		aFlexMenu[idFlexMenu].lastRightX = aFlexMenu[idFlexMenu].rightX;
		aFlexMenu[idFlexMenu].lastBottomY = aFlexMenu[idFlexMenu].bottomY;
		aFlexMenu[idFlexMenu].lastTopY = aFlexMenu[idFlexMenu].topY;			

		this.offsetX = offsetX;
		this.offsetY = offsetY;

		if (IsBrowser("IE5up"))
		{
			var borderWidth = parseInt(menu.offsetParent.currentStyle.borderWidth);
			
			if (isNaN(borderWidth))
				borderWidth = 0;
				
			var mainMenuBorderWidth = parseInt(document.all[aFlexMenu[idFlexMenu].mainTableID].currentStyle.borderWidth);
			if (isNaN(mainMenuBorderWidth))
				mainMenuBorderWidth = 0;
		}
		else
		{
			var borderWidth = 0;
			var mainMenuBorderWidth = 0;
		}

		if (menuDirection == "left")
		{
			if (mainMenuDirection == "down")
			{
				// Set Sub Menu Position Coords
				submenu.style.left = menu.offsetParent.style.posLeft - submenu.offsetWidth + borderWidth + this.offsetX;//(menu.parentElement.offsetLeft - submenu.offsetWidth) + borderWidth + this.offsetX;
				submenu.style.top = calculateSumOffset(menu, "offsetTop") + this.offsetY;//(document.all[mainMenuWrapperID].offsetTop - document.all[mainTableID].parentElement.offsetTop) + menu.offsetTop + document.all[mainTableID].offsetHeight - borderWidth - mainMenuBorderWidth + this.offsetY;
	
				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = menu.offsetParent.style.posLeft - submenu.offsetWidth;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth + menu.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight + this.offsetY;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}
			else if (mainMenuDirection == "up")
			{				
				// Set Sub Menu Position Coords
				submenu.style.left = (calculateSumOffset(menu, "offsetLeft") - submenu.offsetWidth) + borderWidth + this.offsetX;

				if (isNaN(parseInt(menu.currentStyle.borderWidth.slice(menu.currentStyle.borderWidth.lastIndexOf(" ")))))
					borderWidth += borderWidth;
				
				submenu.style.top = calculateSumOffset(menu, "offsetTop") - submenu.offsetHeight + menu.offsetHeight + borderWidth - this.offsetY;

				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = menu.offsetParent.style.posLeft - submenu.offsetWidth;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth + menu.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight + menu.offsetHeight + this.offsetY;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}
			else if (mainMenuDirection == "left")
			{
				// Set Sub Menu Position Coords
				submenu.style.left = (calculateSumOffset(menu, "offsetLeft") - submenu.offsetWidth) + borderWidth + this.offsetX;
				submenu.style.top = calculateSumOffset(menu, "offsetTop") + this.offsetY;

				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = submenu.style.posLeft;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + submenu.offsetWidth + menu.offsetWidth + menu.offsetParent.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}			
		}
		else if (menuDirection == "right")
		{
			if (mainMenuDirection == "down")
			{
				// Set Sub Menu Position Coords
				submenu.style.left = menu.offsetParent.style.posLeft + menu.parentElement.offsetWidth - borderWidth - this.offsetX;
				submenu.style.top = calculateSumOffset(menu, "offsetTop") + this.offsetY;
				
				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = menu.offsetParent.style.posLeft;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + menu.offsetWidth + submenu.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight + this.offsetY;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}
			else if (mainMenuDirection == "up")
			{
				// Set Sub Menu Position Coords
				submenu.style.left = calculateSumOffset(menu, "offsetLeft") + menu.parentElement.offsetWidth - borderWidth - this.offsetX;

				if (!isNaN(parseInt(menu.currentStyle.borderWidth.slice(menu.currentStyle.borderWidth.lastIndexOf(" ")))) && parseInt(menu.currentStyle.borderWidth.slice(menu.currentStyle.borderWidth.lastIndexOf(" "))) == 0)
					borderWidth += borderWidth
					
				submenu.style.top = calculateSumOffset(menu, "offsetTop") - submenu.offsetHeight + menu.offsetHeight + borderWidth + this.offsetY;

				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = menu.offsetParent.style.posLeft;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + menu.offsetWidth + submenu.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight + menu.offsetHeight + this.offsetY;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}
			else if (mainMenuDirection == "right")
			{
				// Set Sub Menu Position Coords
				submenu.style.left = calculateSumOffset(menu.parentElement, "offsetLeft") + submenu.offsetWidth - borderWidth - this.offsetX;
				submenu.style.top = calculateSumOffset(menu, "offsetTop") + this.offsetY;

				// Set auto hide coords for this menu
				aFlexMenu[idFlexMenu].leftX  = menu.offsetParent.style.posLeft;
				aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].leftX + menu.offsetWidth + submenu.offsetWidth;
				aFlexMenu[idFlexMenu].bottomY = submenu.style.posTop + submenu.offsetHeight;
				aFlexMenu[idFlexMenu].topY = submenu.style.posTop - this.offsetY;
			}
		}
		
		submenu.style.visibility = fShow;
	}
	aFlexMenu[idFlexMenu].lastSubMenu = submenu; 	// Set last sub menu item
}

function calculateSumOffset(idItem, offsetName)
{
	var totalOffset = 0;
	var item = eval('idItem');
	do
	{
		totalOffset += eval('item.'+offsetName);
		item = eval('item.offsetParent');
		
	} while (item != null);
	return totalOffset;
}

function hideAll()
{
	for(var j = 1; j < aFlexMenu.length; j++)
		hideMenus(j);
}

function hideMenus(idFlexMenu)
{
	if (aFlexMenu[idFlexMenu].lastMenu != null) 
	{
		aFlexMenu[idFlexMenu].lastMenu.style.visibility = fHide;
		aFlexMenu[idFlexMenu].lastMenu = null;
	}

	if(aFlexMenu[idFlexMenu].lastSubMenu != null)
	{
		aFlexMenu[idFlexMenu].lastSubMenu.visibility = fHide;
		aFlexMenu[idFlexMenu].leftX = aFlexMenu[idFlexMenu].lastLeftX;
		aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].lastRightX;
		aFlexMenu[idFlexMenu].bottomY = aFlexMenu[idFlexMenu].lastBottomY;
		aFlexMenu[idFlexMenu].topY = aFlexMenu[idFlexMenu].lastTopY;
	}
	if(aFlexMenu[idFlexMenu].lastMenuItem != null)
	{
		menuItemHover(aFlexMenu[idFlexMenu].lastMenuItem.id, idFlexMenu, false, null, false);
		aFlexMenu[idFlexMenu].lastMenuItem = null;
	}
}

function menuItemHover(object, idFlexMenu, persist, location, orphan) {
	if (document.all)
	{
		//hide the lastmenu
		if (orphan)
		{
			if (aFlexMenu[idFlexMenu].lastMenu != null && aFlexMenu[idFlexMenu].lastMenu != document.all[object].offsetParent)
				hideMenus(idFlexMenu);				
		}
				
		// If there is a lastsubmenu and it is not the currently displayed submenu
		if(aFlexMenu[idFlexMenu].lastSubMenu != null && aFlexMenu[idFlexMenu].lastSubMenu != document.all[object].offsetParent)
		{
			tmpSubMenu = aFlexMenu[idFlexMenu].lastSubMenu;
			aFlexMenu[idFlexMenu].lastSubMenu = null;
			
			// Remove highlight on the last submenu item
			if (tmpSubMenu.id + "item" != object)
				menuItemHover(tmpSubMenu.id + "item", idFlexMenu, false);
				
			// and hide the last submenu
			tmpSubMenu.style.visibility = fHide;
			aFlexMenu[idFlexMenu].leftX = aFlexMenu[idFlexMenu].lastLeftX;
			aFlexMenu[idFlexMenu].rightX = aFlexMenu[idFlexMenu].lastRightX;
			aFlexMenu[idFlexMenu].bottomY = aFlexMenu[idFlexMenu].lastBottomY;
			aFlexMenu[idFlexMenu].topY = aFlexMenu[idFlexMenu].lastTopY;
		}		

		// Set the classname and find the "Hover" in the current classname
		var thisClass = document.all[object].className;
		var cutPos = thisClass.search("Hover");
		
		if (cutPos == -1) // if no hover class found, then change to the hover class
		{
			document.all[object].className = document.all[object].className + "Hover";
			window.status = location;			
		}
		else if (!persist) // else make the class non hover and the menuItem isn't persisting (forcing highlight on)
		{	
			document.all[object].className = thisClass.slice(0, cutPos);
			window.status = "";			
		}


	}
}

// Onclick for menu items
function menuItemOnClick(object, location, name) 
{
	if (name == null)
		name = "_self";
	
	if (document.all)
	{
		window.location.target = name;
		window.location.href = location;
	}
	//window.open(location, name);

}

// Function fired whenever the mouse is moved. Determines whether menus should be hidden mouse movement
function updateIt(e)
{
	if (n)
	{
		var x = e.pageX;
		var y = e.pageY;
	}
	else if (ie)
	{
		var x = window.event.clientX + document.body.scrollLeft;
		var y = window.event.clientY + document.body.scrollTop;
	}
	
	for(var j = 1; j < aFlexMenu.length; j++)
	{
		if (x > aFlexMenu[j].rightX || x < aFlexMenu[j].leftX)
		{
			//alert("Right/Left: " + x + " > " + aFlexMenu[j].rightX + " OR " + x + " < " + aFlexMenu[j].leftX)
			
			aFlexMenu[j].leftX = aFlexMenu[j].lastLeftX;
			aFlexMenu[j].rightX = aFlexMenu[j].lastRightX;
			
			if (x > aFlexMenu[j].rightX || x < aFlexMenu[j].leftX)
				hideMenus(j);
		}
		else if (y > aFlexMenu[j].bottomY || y < aFlexMenu[j].topY) 
		{
//			alert("Bottom/Top: " + y + " > " + aFlexMenu[j].bottomY + " OR " + y + " < " + aFlexMenu[j].topY + " scrolltop: " + document.body.scrollTop)				

			aFlexMenu[j].bottomY = aFlexMenu[j].lastBottomY;
			aFlexMenu[j].topY = aFlexMenu[j].lastTopY;

			if (y > aFlexMenu[j].bottomY || y < aFlexMenu[j].topY)
				hideMenus(j);
		}
	}

}

// Window events to fire hiding of menus at appropriate times
if (document.all)
{
	document.onclick=hideAll;
	document.onscroll=hideAll;
	document.onmousemove=updateIt;
}

function IsBrowser (browserType) 
{   // convert all characters to lowercase to simplify testing 
    var agt=navigator.userAgent.toLowerCase(); 

    // *** BROWSER VERSION *** 
    // Note: On IE5, these return 4, so use is.ie5up to detect IE5. 

    var is_major = parseInt(navigator.appVersion);
    var is_minor = parseFloat(navigator.appVersion);
	
	var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	var is_ie3 = (is_ie && (is_major < 4));
    var is_ie4 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5")==-1));
	var is_ie5 = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1));
	
	if (browserType == "IE3")
		return is_ie3;
	else if (browserType == "IE4")
	    return is_ie4;
	else if (browserType == "IE4up")
		return (is_ie  && (is_major >= 4));
	else if (browserType == "IE5")
	    return is_ie5;
	else if (browserType == "IE5.5")
	    return (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
	else if (browserType == "IE5up")
	    return (is_ie  && !is_ie3 && !is_ie4);
    else if (browserType == "IE5.5up")
		return (is_ie && !is_ie3 && !is_ie4 && !is_ie5);
	else
		return false;
}