// The cleanest possible way to do drop down menus

var exmenu_currentdropdown = null;
var exmenu_lastdropdown = null;
var exmenu_linkprefix = "menuitem_";
var exmenu_menuprefix = "menulist_";
var exmenu_timeout = 500;
// TODO: the maximum width of 942px is hard-coded, fix this 
var exmenu_maxwidth = 942;

function exmenu_menuclose(menuid, force) {
	// Check to see if no menu should be open, or if we're forcing close
	if (exmenu_currentdropdown == null || force) {
		var ele = document.getElementById(exmenu_menuprefix + menuid);
		var linkele = document.getElementById(exmenu_linkprefix + menuid);
		if (ele != null) {
			ele.style.display = "none";
			linkele.className = linkele.className.replace(" menuopen", "");
		}
	}
}

function exmenu_menuopen(menuid) {
	var ele = document.getElementById(exmenu_menuprefix + menuid);
	var linkele = document.getElementById(exmenu_linkprefix + menuid);
	if (ele != null && ele.style.display != "block") {
		ele.style.display = "block";
		linkele.className += " menuopen";
		
		if (exmenu_lastdropdown != menuid) {
			// Check to see if menu is offscreen and compensate as necessary
			var chkele = linkele;
			var left = 0;
			var bodyoffset = 0;
			// Figure out where the element is in the client area (absolute positioning)
			// by summing up the offsetLeft of each offsetParent element
			while (chkele.offsetParent != null) {
				left += chkele.offsetLeft;
				if (chkele.offsetParent.tagName == "BODY") {
					bodyoffset = chkele.offsetLeft;
				}
				chkele = chkele.offsetParent;
			}
			var right = left + ele.offsetWidth;
			var chkright = exmenu_maxwidth + bodyoffset;
			// If the right side is offscreen
			if (right > chkright) {
				// Adjust left to compensate for number of pixels it is offscreen
				left = left + chkright - right;
				ele.style.left = left + "px";
			}
			
			// Adjust li width to width of ul when opened
			// (this creates highlight bars that stretch to the end)
			for (var i = 0; i < ele.childNodes.length; i++) {
				if (ele.childNodes[i].tagName == "LI") {
					if (ele.childNodes[i].style.width == ele.clientWidth + "px") {
						break;
					}
					ele.childNodes[i].style.width = ele.clientWidth + "px";
				}
			}
		}
	}
}

function exmenu_getMenuid(eid) {
	if (eid.substring(0, exmenu_linkprefix.length) == exmenu_linkprefix) {
		return eid.substring(exmenu_linkprefix.length);
	} else if (eid.substring(0, exmenu_menuprefix.length) == exmenu_menuprefix) {
		return eid.substring(exmenu_menuprefix.length);
	} else {
		return null;
	}
}

function exmenu_mouseover(eid) {
	var menuid = exmenu_getMenuid(eid);
	if (menuid != null) {
		// Ensure there is even a menu for this item before doing anything
		var ele = document.getElementById(exmenu_menuprefix + menuid)
		if (ele != null) {
			if (menuid != exmenu_currentdropdown) {
				if (exmenu_currentdropdown != null) {
					exmenu_menuclose(exmenu_currentdropdown, true);
				}
				if (exmenu_lastdropdown != null) {
					exmenu_menuclose(exmenu_lastdropdown, true);
				}
				exmenu_currentdropdown = menuid;
				exmenu_menuopen(menuid);
			}
		}
	}
}

function exmenu_mouseout(eid) {
	var menuid = exmenu_getMenuid(eid);
	if (menuid != null) {
		exmenu_lastdropdown = exmenu_currentdropdown;
		exmenu_currentdropdown = null;
		setTimeout("exmenu_menuclose(\"" + menuid + "\", false)", exmenu_timeout);
	}
}
