// Array of timeouts
var timeouts = new Array();

// Keep track of next z-index
var nextZindex = 100;

/*******************************************************************************
*	Shows the given menu
*
* @param menuName Name of menu to show
*******************************************************************************/
function showMenu(menuName)
{
	// Check if there is a hide timeout for this menu
	if (timeouts[menuName] != null)
	{
		// Cancel the timeout
		clearTimeout(timeouts[menuName]);
		
		// No need to position or display the menu because it already is displayed
		
		// Get menu element
		var menuId = "menu" + menuName, menu;
		if (menu = document.getElementById(menuId))
			menu.style.zIndex = nextZindex++;
	}
	else
	{ 
		// Get elements
		var menuId = "menu" + menuName, menu;
		var linkId = "menuLink" + menuName, link;
		if ((menu = document.getElementById(menuId)) && (link = document.getElementById(linkId)))
		{
			// Set menu position
			menu.style.left = (parseInt(link.parentNode.offsetLeft,10)-1) + "px";
			
			// Show the menu
			removeClass(menu, "hidden");
			menu.style.zIndex = nextZindex++;
			
			// Add a scrollbar if needed
			menu.style.height = "auto";
			var windowHeight = (window.innerHeight != null) ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : 1024);
			var scrollOffset = (window.pageYOffset != null) ? window.pageYOffset : (document.body.parentElement.scrollTop ? document.body.parentElement.scrollTop : 0);
			var offsetTop = getOffsetTop(menu);
			if (offsetTop + menu.offsetHeight > windowHeight + scrollOffset)
			{
				// Resize div
				menu.style.height = (windowHeight - (offsetTop - scrollOffset)) + "px";
				menu.style.overflowY = "scroll";
			}
			else
			{
				// Resize div
				menu.style.height = "auto";
				menu.style.overflowY = "auto";
			}
			
			// Keep the link hovered
			addClass(link, "hover");
		}
	}
}

/*******************************************************************************
*	Computes the offset to the top of the page
*
* @param elem Element to find offset for
*******************************************************************************/
function getOffsetTop(elem)
{
	if (elem.parentNode == null)
	{
		if (elem.offsetTop == null)
			return 0;
		else
			return elem.offsetTop;
	}
	return elem.offsetTop + getOffsetTop(elem.parentNode);
}

/*******************************************************************************
*	Hides the given menu
*
* @param menuName Name of menu to hide
*******************************************************************************/
function hideMenu(menuName)
{
	// Get elements
	var menuId = "menu" + menuName, menu;
	var linkId = "menuLink" + menuName, link;
	if ((menu = document.getElementById(menuId)) && (link = document.getElementById(linkId)))
	{	
		// Hide the menu
		addClass(menu, "hidden");
		
		// Stop the link hovering
		removeClass(link, "hover");
	}
	
	// Set timeout variable to null
	timeouts[menuName] = null;
}

/*******************************************************************************
*	Prepares to hide the given menu
*
* @param menuName Name of menu to hide
*******************************************************************************/
function prepareHideMenu(menuName)
{
	// Set timeout
	timeouts[menuName] = setTimeout("hideMenu('"+menuName+"')", 500); 
}

/*******************************************************************************
*	Adds a class to an element
*
* @param elem Element to add class to
* @param classname Class to add
*******************************************************************************/
function addClass(elem, classname)
{
	// Get current classes
  var arr = elem.className.split(" ");
  
  // Check if it is already in the class
  var found = false;
  for (var i = 0; !found && i < arr.length; i++)
    if (arr[i] == classname)
      found = true;
  
  // Add the class if not already there
  if (!found)
    elem.className = elem.className + " " + classname;
}

/*******************************************************************************
*	Removes a class from an element
*
* @param elem Element to remove class from
* @param classname Class to remove
*******************************************************************************/
function removeClass(elem, classname)
{
  // Get current classes
  var arr = elem.className.split(" ");
  
  // Construct new class string
  var newClass = "";
  for (var i = 0; i < arr.length; i++)
    if (arr[i] != classname)
      newClass += arr[i] + " ";
  
  elem.className = newClass;
}
