/**
 * Contains the Javascript class Menu.
 *
 * @copyright	2000-2008 CARE Internet Services B.V. All Rights Reserved
 * @internal	$Date$
 * @author		$Author$
 * @version		$Revision$
 * @category	CARE
 * @package 	Frontend
 */


/**
 * Class for the drop down menu.
 */
Menu = {

	/* hold the menu */
	_menu: null,

	/* hold the hide timer */
	_hideTimeout: null,

	/* will hold the active A element */
	_activeLink: null,

	/* will hold the active UL element */
	_activeSubMenu: null,

	/* time in milliseconds before hiding the submenu */
	_hidePause: 1000,

	/**
	 * Sets the time to wait before hiding the sub menu.
	 *
	 * @param int secs
	 */
	setHidePause: function(secs)
	{
		Menu._hidePause = secs * 1000;
	}, // function setHidePause

	/**
	 * Initialises the drop down menu.
	 *
	 * Should be called on page load.
	 */
	init: function()
	{
		/* save the menu */
		Menu._menu = $("menu");
		
		/* center the menu */
		//Menu._centerMenu();
		
		/* Due to a bug in IE and some Opera versions, we can get back elements
		 * with a name="menu" attribute (used for Flash), so if the "id"
		 * attribute of the returned element is not "menu", try to find the
		 * correct element in another way.
		 */
		if (Menu._menu.id != "menu")
		{
			Menu._menu = null;
			var uls = document.getElementsByTagName("ul");
			for (var u = 0; u < uls.length; u++)
			{
				if (uls[u].id == "menu")
				{
					Menu._menu = uls[u];
					break;
				}
			}
		}

		/* find all menu items */
		var elements = Menu._menu.getElementsByTagName("li");
		for (var i = 0; i < elements.length; i++)
		{
			if (elements[i].parentNode.id == "menu")
			{
				if (elements[i].getElementsByTagName("ul").length > 0)
				{
					connect(elements[i], "onmouseover", bind(Menu._showSubMenu, elements[i]));
					connect(elements[i], "onmouseout", bind(Menu._hideSubMenu, elements[i]));
	
					addElementClass(elements[i], "submenu");
					addElementClass(elements[i].getElementsByTagName("a")[0], "submenu");
				}
				else
				{
					connect(elements[i], "onmouseover", bind(Menu._hoverWithoutSubMenu, elements[i]));
					connect(elements[i], "onmouseout", Menu._hideWithoutSubMenu);
				}
			}
		}
	}, // function init

	/**
	 * Centers the menu.
	 */
	_centerMenu: function()
	{
		/* find the last element in the first level of items */
		var ele = getElementsByTagAndClassName("li", "last", "menu");
		
		/* get the position of the element */
		var pos = getElementPosition(ele[0], Menu._menu);
		
		/* set the menu margin */
		Menu._menu.style.marginLeft = ((pos.x / 2) - 4) + 'px';
	}, // function centerMenu

	/**
	 * Shows the sub menu.
	 */
	_showSubMenu: function(e)
	{
		var a = this.getElementsByTagName("a")[0];
		var subMenu = this.getElementsByTagName("ul")[0];

		/* hide previous opened sub menu */
		Menu._quickHideSubMenu();

		/* keep hover style as long as opened */
		addElementClass(a, "menu_open");
		addElementClass(a.parentNode, "menu_open");

		/* show sub menu */
		updateNodeAttributes(subMenu, {"style": {"visibility": "visible"}});

		/* calculate correct position for submenu */
		var parentPos = elementPosition(Menu._menu);
		var pos = elementPosition(this);
		var leftPos = pos.x - parentPos.x;

		/* DO NOT set position of the sub menu */
		//subMenu.style.left = leftPos + "px";

		/* save sub menu */
		Menu._activeLink = a;
		Menu._activeSubMenu = subMenu;
	}, // function _showSubMenu

	/**
	 * Hover effect when we've got mno submenu.
	 */
	_hoverWithoutSubMenu: function(e)
	{
		var a = this.getElementsByTagName("a")[0];

		/* hide previous opened sub menu */
		Menu._quickHideSubMenu();

		/* keep hover style as long as opened */
		addElementClass(a, "menu_open");
		addElementClass(a.parentNode, "menu_open");

		/* save active link */
		Menu._activeLink = a;
	}, // function _hoverWithoutSubMenu

	/**
	 * Immediatly hides the active menu.
	 */
	_quickHideSubMenu: function()
	{
		/* clear possible timeout */
		if (Menu._hideTimeout)
		{
			window.clearTimeout(Menu._hideTimeout);
		}
		/* remove hover style */
		if (Menu._activeLink)
		{
			removeElementClass(Menu._activeLink, "menu_open");
			removeElementClass(Menu._activeLink.parentNode, "menu_open");
		}
		/* hide sub menu */
		if (Menu._activeSubMenu)
		{
			updateNodeAttributes(Menu._activeSubMenu, {"style": {"visibility": "hidden"}});
		}
	}, // function _quickHideSubMenu

	/**
	 * Method for hiding the submenu, takes
	 */
	_hideSubMenu: function()
	{
		var a = this.getElementsByTagName("a")[0];
		var subMenu = this.getElementsByTagName("ul")[0];

		/* hide in x second */
		Menu._hideTimeout = window.setTimeout(function() { removeElementClass(a, "menu_open"); removeElementClass(a.parentNode, "menu_open"); updateNodeAttributes(subMenu, {"style": {"visibility": "hidden"}}); }, Menu._hidePause);
	}, // function _hideSubMenu

	/**
	 * Method for removing the hover effect when we've got no submenu.
	 */
	_hideWithoutSubMenu: function(e)
	{
		/* remove hover style */
		removeElementClass(Menu._activeLink, "menu_open");
		removeElementClass(Menu._activeLink.parentNode, "menu_open");
	} // function _hideWithoutSubMenu

}; // class Menu


/**
 * Initialize menu on page load.
 */

Menu.setHidePause(0.5);
addLoadEvent(Menu.init);
