/**
 * 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()
	{
		if ($("menu"))
		{
		
			/* save the menu */
			Menu._menu = $("menu");
	
			/* 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

	/**
	 * 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;

		/* 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 */
		if (Menu._activeLink)
		{
			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);