Menu = {
	Version: "1.3.1",
	HORIZONTAL: 1,
	VERTICAL: 2,
	_menuId: null,
	_menuNode: null,
	_showTimeout: null,
	_hideTimeout: null,
	_activeNodes: new Array(),
	_orientation: 1,
	_showPause: 0,
	_hidePause: 1000,
	_opacity: 1,
	
	setHidePause: function(secs)
	{
		Menu._hidePause = secs * 1000;
		alert("Deprecated method Menu.setHidePause() used: Please use the options argument for Menu.init().");
	},
	init: function(menuId, options)
	{
		Menu._menuId = (typeof menuId == "string") ? menuId : "menu";
		if (options)
		{
			if (options.orientation != undefined)
			{
				Menu._orientation = options.orientation;
			}
			if (options.showPause != undefined)
			{
				Menu._showPause = options.showPause * 1000;
			}
			if (options.hidePause != undefined)
			{
				Menu._hidePause = options.hidePause * 1000;
			}
			if (options.opacity != undefined)
			{
				Menu._opacity = options.opacity;
			}
		}
		if (document.loaded === true || $(Menu._menuId))
		{
			Menu._doInit();
		}
		else
		{
			if (document.observe)
			{
				document.observe("dom:loaded", Menu._doInit);
			}
			else
			{
				Element.observe(window, "load", Menu._doInit);
			}
		}
	},
	_doInit: function()
	{
		Menu._menuNode = $(Menu._menuId);
		Menu._addEvents(Menu._menuNode);
	},
	_addEvents: function(ulElement, level)
	{
		if (isNaN(level))
		{
			level = 1;
		}
		var elements = (Element.select) ? ulElement.select("li") : ulElement.getElementsBySelector("li")
		for (var i = 0; i < elements.length; i++)
		{
			if (elements[i].parentNode == ulElement)
			{
				if (level != 1) 
				{
					var a = (Element.select) ? elements[i].select("a")[0] : elements[i].getElementsBySelector("a")[0];
					a.innerHTML = "<div><img src=\"images/dot-orange.jpg\" style=\"margin:12px 6px 0px 6px;\" width=\"4\" height=\"4\" align=\"left\" /><span rel=\"" + level + "\">" + a.innerHTML + "</span></div>";
				}
				var subMenus = (Element.select) ? elements[i].select("ul") : elements[i].getElementsBySelector("ul");
				if (subMenus.length > 0)
				{
					elements[i].observe("mouseover", Menu._showSubMenu.bindAsEventListener(elements[i], level));
					if (level == 1)
					{
						elements[i].observe("mouseout", Menu._hideSubMenu.bindAsEventListener(elements[i], level));
					}
					var a = (Element.select) ? elements[i].select("a")[0] : elements[i].getElementsBySelector("a")[0];
					a.addClassName("submenu");
					Menu._addEvents(subMenus[0], (level + 1));
				}
				else
				{
					elements[i].observe("mouseover", Menu._quickHideSubMenu.bindAsEventListener(elements[i], level));
				}
			}
		}
	},
	_showSubMenu: function(e, level)
	{
		Event.stop(e);
		var isFirst = (Menu._activeNodes.length == 0);
		Menu._quickHideSubMenu(e, level);
		if (isFirst && Menu._showPause > 0)
		{
			Menu._showTimeout = window.setTimeout(function() { Menu._doShowSubMenu(this, level); }.bind(this), Menu._showPause);
		}
		else
		{
			Menu._doShowSubMenu(this, level);
		}
	},
	_doShowSubMenu: function(node, level)
	{
		if (Menu._showTimeout)
		{
			window.clearTimeout(Menu._showTimeout);
		}
		var a = (Element.select) ? node.select("a")[0] : node.getElementsBySelector("a")[0];
		var subMenu = (Element.select) ? node.select("ul")[0] : node.getElementsBySelector("ul")[0];
		var spans = (Element.select) ? subMenu.select("span[rel=\"" + (level + 1) + "\"]") : subMenu.getElementsBySelector("span[rel=\"" + (level + 1) + "\"]");
		
		menu_width = 0;
		for (x = 0; x < spans.length; x++) {
			if (spans[x].offsetWidth > menu_width) menu_width = spans[x].offsetWidth;
		}
		menu_width += 30;
		for (x = 0; x < spans.length; x++) {
			li = spans[x].up("li"); 
			li.style.width = menu_width + "px";
		}
		a.addClassName("menu_open");
		a.parentNode.addClassName("menu_open");
		
		subMenu.style.visibility = "visible";
		subMenu.style.position = "absolute";
		subMenu.style.width = menu_width + "px";
		
		var pos = (Element.positionedOffset) ? node.positionedOffset() : Position.positionedOffset(node);
		//alert(pos);
		if (level == 1 && Menu._orientation == Menu.HORIZONTAL)
		{
			// menu_rightPos = $(this._menuId).positionedOffset().left + $(this._menuId).getDimensions().width;
			// submenu_rightPos = pos[0] + subMenu.getDimensions().width;
			// if (submenu_rightPos > menu_rightPos) {
				// subMenu.style.left = pos[0] - (submenu_rightPos - menu_rightPos) + "px";
			// }
			// else {
				// subMenu.style.left = pos[0] + "px";
			// }
			subMenu.style.left = pos[0] + "px";
			subMenu.style.top = (pos[1] + node.getHeight()) + "px";
		}
		else
		{
			subMenu.style.left = (pos[0] + node.getWidth()) + "px";
			subMenu.style.top = pos[1] + "px";
		}
		
		if (level == 1 && Menu._opacity > 0 && Menu._opacity < 1)
		{
			subMenu.setOpacity(Menu._opacity);
		}
		Menu._activeNodes.push({"level": level, "link": a, "subMenu": subMenu});
	},
	_quickHideSubMenu: function(e, level)
	{
		Event.stop(e);
		if (Menu._hideTimeout)
		{
			window.clearTimeout(Menu._hideTimeout);
		}
		Menu._doHideSubMenusFromLevel(level);
	},
	_hideSubMenu: function(e, level)
	{
		Event.stop(e);
		if (Menu._showTimeout)
		{
			window.clearTimeout(Menu._showTimeout);
		}
		if (Menu._hidePause <= 0)
		{
			Menu._doHideSubMenusFromLevel(1);
		}
		else
		{
			Menu._hideTimeout = window.setTimeout(function() { Menu._doHideSubMenusFromLevel(1); }, Menu._hidePause);
		}
	},
	_doHideSubMenusFromLevel: function(level)
	{
		if (isNaN(level))
		{
			level = 1;
		}
		Menu._activeNodes = Menu._activeNodes.findAll(function(node)
		{
			if (node.level >= level)
			{
				if (node.link)
				{
					node.link.removeClassName("menu_open");
					node.link.parentNode.removeClassName("menu_open");
				}
				if (node.subMenu)
				{
					node.subMenu.style.visibility = "hidden";
				}
				return false;
			}
			return true;
		});
	} 
};
