// YOZO menu functions
// (c) YOZO LLC, 2006
//
// requires: prototype.js, yozo_menu.css

// initMenu(divId,params)
//
// divId: id of DIV containing menu
// params:
//		zIndex: specifies zIndex to use for menus.  default=100.
//		menuPosition: specifies whether menu is left or right aligned to menu caption. default="left"
//		itemAlign: specifies whether menu items should be left or right aligned within menu.  default="left"
initMenu = function(divId,params) {
	var menuRoot=$(divId);
	
	menuRoot.isMenu = true;
	
	// params
	if (params) {
		menuRoot.menuPosition = params['menuPosition'] || 'left';
		menuRoot.zIndex = params['zIndex'] || 100;
		menuRoot.itemAlign = params['itemAlign'] || 'left';
	} else {
		menuRoot.menuPosition = 'left';
		menuRoot.zIndex = 100;
		menuRoot.itemAlign = 'left';
	}

	var node=null;
	var menu=null;
	Element.addClassName(menuRoot,"nav_menus");
	for (var i=0;i<menuRoot.childNodes.length;i++) {
		node = menuRoot.childNodes[i];
		if (node.tagName=="A") {
			if (Element.hasClassName(node,"nav_menu_caption")) {
				if (node.href=="")
					node.onclick="return false;";
				menu = $('menu' + node.id);
				menu.style.zIndex = menuRoot.zIndex;
				node.onmouseover=function() {
					var menuRoot = getMenu(this);
					showMenu(this.id);
					menuRoot.overMenu = true;
				};
				node.onmouseout=function() {
					var menuRoot = getMenu(this);
					menuRoot.overMenu = false;
					window.setTimeout(
						"closeMenu('" + menuRoot.id + "')",
						100
					);
				};
				menu.onmouseover=function() {
					var menuRoot = getMenu(this);
					menuRoot.overMenu = true;
				};
				menu.onmouseout=function() {
					var menuRoot = getMenu(this);
					menuRoot.overMenu = false;
					window.setTimeout(
						"closeMenu('" + menuRoot.id + "')",
						100
					);
	 			};
	 			// set initial menu position to 0,0
	 			menu.style.left="0%";
				menu.style.top="0%";
			} else if (Element.hasClassName(node,"nav_link")) {
				node.onmouseover=function() {
					var menuRoot = getMenu(this);
					closeMenu(menuRoot.id);
				};
			}
		} else if (node.tagName == "DIV") {
			if (Element.hasClassName(node,"menu"))
				node.style.textAlign = menuRoot.itemAlign;
		}
	}
};

// getMenu(element)
//
// element: searches parent nodes of element until menu is found.  returns null if no menu found.
getMenu = function(el) {
	while (el && !el.isMenu) {
		el = el.parentNode;
	}
	return el || null;
};

// closeMenu(menuId)
//
// menuId: closes any open menu within menu DIV specified by menuId
closeMenu = function(menuId) {
	var menuRoot = $(menuId);
	if (!menuRoot.overMenu)
		hideMenu(menuRoot.activeMenu);
};

// showMenu(menuId)
//
// menuId: opens menu specified by menuId
showMenu = function(menuId) {
	var menuCaption = $(menuId);
	var menu = $('menu' + menuId);
	
	menuRoot = getMenu(menuCaption);
	
	if (menuRoot.activeMenu != menuId) {
		hideMenu(menuRoot.activeMenu);
		menuRoot.activeMenu = null;
	}

	if (menu) {
		var offset = Position.cumulativeOffset(menuCaption);
		var newLeft = offset[0];
		var newTop = offset[1] + menuCaption.offsetHeight;
		
		menu.style.display = "block";
		Element.addClassName(menuCaption,"open");
		menuRoot.activeMenu = menuId;

		// ensure menu is at least as wide as caption
		if (menu.offsetWidth < menuCaption.offsetWidth)
			menu.style.width = menuCaption.offsetWidth + "px";		

		// right align menu if specified or too far right
		var menuWidth = menu.offsetWidth;
		var menusOffset = Position.cumulativeOffset(menuRoot);
		var menusRight = menusOffset[0] + menuRoot.offsetWidth;
		menuRight = newLeft + menuWidth;
		if (menuRoot.menuAlign == "right" || menuRight > menusRight) {
			newLeft = menusRight - menuWidth;
			offset = Position.cumulativeOffset(menuCaption);
			newLeft = offset[0] + menuCaption.offsetWidth - menuWidth;
			menu.style.textAlign = 'right';
		}
		
		menu.style.left = newLeft + 'px';
		menu.style.top = newTop + 'px';
	}
};

// hideMenu(menuId)
//
// menuId: hides menu specified by menuId
hideMenu = function(menuId) {
	var menu = $('menu' + menuId);
	var menuCaption = $(menuId);
	if (menu) {
		menu.style.display = "none";
		Element.removeClassName(menuCaption,"open");
	}
};

