/**
 * 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.
 */
MenuSite = {

	/* 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)
	{
		MenuSite._hidePause = secs * 1000;
	}, // function setHidePause

	/**
	 * Initialises the drop down menu.
	 *
	 * Should be called on page load.
	 */
	init: function()
	{
		if ($("main-menu"))
		{
		
			/* save the menu */
			MenuSite._menu = $("main-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 (MenuSite._menu.id != "main-menu")
			{
				MenuSite._menu = null;
				var uls = document.getElementsByTagName("ul");
				for (var u = 0; u < uls.length; u++)
				{
					if (uls[u].id == "menu")
					{
						MenuSite._menu = uls[u];
						break;
					}
				}
			}
	
			/* find all menu items */
			var elements = MenuSite._menu.getElementsByTagName("li");
			for (var i = 0; i < elements.length; i++)
			{
				if (elements[i].parentNode.id == "main-menu")
				{
					if (elements[i].getElementsByTagName("ul").length > 0)
					{
						connect(elements[i], "onmouseover", bind(MenuSite._showSubMenu, elements[i]));
						connect(elements[i], "onmouseout", bind(MenuSite._hideSubMenu, elements[i]));
		
						addElementClass(elements[i], "submenu");
						addElementClass(elements[i].getElementsByTagName("a")[0], "submenu");
					}
					else
					{
						connect(elements[i], "onmouseover", bind(MenuSite._hoverWithoutSubMenu, elements[i]));
						connect(elements[i], "onmouseout", MenuSite._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 */
		MenuSite._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(MenuSite._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 */
		MenuSite._activeLink = a;
		MenuSite._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 */
		MenuSite._quickHideSubMenu();

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

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

	/**
	 * Immediatly hides the active menu.
	 */
	_quickHideSubMenu: function()
	{
		/* clear possible timeout */
		if (MenuSite._hideTimeout)
		{
			window.clearTimeout(MenuSite._hideTimeout);
		}
		/* remove hover style */
		if (MenuSite._activeLink)
		{
			removeElementClass(MenuSite._activeLink, "menu_open");
			removeElementClass(MenuSite._activeLink.parentNode, "menu_open");
		}
		/* hide sub menu */
		if (MenuSite._activeSubMenu)
		{
			updateNodeAttributes(MenuSite._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 */
		MenuSite._hideTimeout = window.setTimeout(function() { removeElementClass(a, "menu_open"); removeElementClass(a.parentNode, "menu_open"); updateNodeAttributes(subMenu, {"style": {"visibility": "hidden"}}); }, MenuSite._hidePause);
	}, // function _hideSubMenu

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

}; // class Menu


/**
 * Initialize menu on page load.
 */
MenuSite.setHidePause(0.5);
addLoadEvent(MenuSite.init);