var enableHilites = true;
var hilitecolor = "#c0d8da";

// Defeat locating bug in W3C
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	
	return [curleft,curtop];
}

function parentHasClassName(obj, className) {
	var cNode = obj;
	var nodesUp = 0;
	while (cNode.parentNode) {
		if (cNode.className == className) return nodesUp;
		cNode = cNode.parentNode;
		nodesUp++;
	}
	return false;
}

function getParentWithClassName(obj, className) {
	var cNode = obj;
	while (cNode.parentNode) {
		if (cNode.className == className) return cNode;
		cNode = cNode.parentNode;
	}
	return false;
}

function isMenuItem(obj) {
	if (obj.tagName == "TD") {
		// Make Seperators fail to register as Menu Items
		if (obj.firstChild) {
			if (obj.firstChild.tagName == "HR") return false;
		}
		
		if (obj.parentNode) {
			if (obj.parentNode.parentNode) {
				if (obj.parentNode.parentNode.parentNode) {
					if (obj.parentNode.parentNode.parentNode.className == "Menu") {
						return true;
					}
				}
			}
		}
	}
	return false;
}

// handle showing / hiding menus
function popupMenu(menu, menuHeader) {
	var menuHeaderOBJ = $(menuHeader);
	var pos = findPos(menuHeaderOBJ);
	var menuOBJ = $(menu);
	
	// Find the position for the menu (left-aligned, below the header)
	var top = pos[1]+menuHeaderOBJ.offsetHeight;
	
	// Fix a tabe positioning bug in Chronium and Safari
	top -= menuHeaderOBJ.offsetTop;
	
	// Start the transition engine
	//if (!menuOBJ._myFx) menuOBJ._myFx = new Fx.Slide(menu);
	
	// Start with the div hidden
	if (!menuOBJ._processed) {
		menuOBJ.set('opacity', 0.0);
		menuOBJ._processed = true;
	}
	//menuOBJ._myFx.hide();
	
	// Move the element to the screen
	menuOBJ.set('styles', {
				'position': "absolute",
        'top': top + "px",
        'left': pos[0] + "px"
    });
	
	menuOBJ.fade(1.0);
}

function hideMenu(menuOBJ) {
	if (menuOBJ == null) return;
	
	var obj = menuOBJ;
	//eval("obj.style.top = '-999px';obj.style.left = '-999px';");
	//fadeTo(menuOBJ.id, 0, "obj.style.top = '-999px';obj.style.left = '-999px';");
	menuOBJ.fade(0.0);
	//menuOBJ._myFx.slideOut('horizontal');
}


// Handle mouse out events
function documentMouseOut(e) {
	if (!e) var e = window.event;
	var fromOBJ = (window.event) ? e.srcElement : e.target;
	var toOBJ = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	
	if (enableHilites) {
		/*if (isMenuItem(fromOBJ)) {
			fromOBJ.style.background = "";
		}*/
		
		if (parentHasClassName(fromOBJ, "Menu")) {
			var tmpNode = fromOBJ;
			while (tmpNode.parentNode) {
				if (isMenuItem(tmpNode)) {
					tmpNode.style.background = "";
					break;
				}
				tmpNode = tmpNode.parentNode;
			}
		}
	}
	
	// If leaving a Menu or MenuItem
	if ( (fromOBJ.className == "Menu") || (parentHasClassName(fromOBJ, "Menu")) ) {
		
		// end event if we are entering a menu
		if (toOBJ.className == "Menu") return true;
		
		// end event if we are entering a menuItem
		//if (isMenuItem(toOBJ)) return true;
		
		// end event if we are entering another part of a menu
		if (parentHasClassName(toOBJ, "Menu")) return true;
		
		if (fromOBJ.className == "Menu")
		{
			hideMenu(fromOBJ);
		} else {
			hideMenu(getParentWithClassName(fromOBJ, "Menu"));
		}
	}
	
	if (parentHasClassName(fromOBJ, "MenuHeader") || (fromOBJ.className == "MenuHeader") ) {
		var header = (fromOBJ.className == "MenuHeader") ? fromOBJ : getParentWithClassName(fromOBJ, "MenuHeader");
		var childMenuID = header.id.substr(0, header.id.lastIndexOf('Header'));
		var childMenuOBJ = document.getElementById(childMenuID);
		
		// If the menu can not be found, end sequence
		if (!childMenuOBJ) return true;
		
		// If the object we are going to is the menu, end sequence
		if (toOBJ.id == childMenuID) return true;
		
		// If we are going into this menu's header don't do anything
		if (parentHasClassName(toOBJ, "MenuHeader") || (toOBJ.className == "MenuHeader") ) {
			var tmp = (toOBJ.id == "MenuHeader") ? toOBJ : getParentWithClassName(toOBJ, "MenuHeader");
			if (tmp.id == header.id) return true;
		}
		
		// If the object we are going to is a table cell
		if (toOBJ.tagName == "TD") {
			if (toOBJ.parentNode) {
				if (toOBJ.parentNode.parentNode) {
					if (toOBJ.parentNode.parentNode.parentNode) {
						if (toOBJ.parentNode.parentNode.parentNode.id == childMenuID) {
							return true;
						}
					}
				}
			}
		}
		
		// If the object we are going to is a table row
		if (toOBJ.tagName == "TR") {
			if (toOBJ.parentNode) {
				if (toOBJ.parentNode.parentNode) {
					if (toOBJ.parentNode.parentNode.id == childMenuID) {
						return true;
					}
				}
			}
		}
		
		// Catchall - Scan up the DOM tree for a Menu class
		{
			var menu = getParentWithClassName(toOBJ, "Menu");
			if (menu) {
				if (menu == childMenuOBJ) return true;
			}
		}
			
		
		hideMenu(childMenuOBJ);
	}
}

// Handle mouse over events
function documentMouseOver(e) {
	if (!e) var e = window.event;
	var toOBJ = (window.event) ? e.srcElement : e.target;
	var fromOBJ = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	
	if (enableHilites) {
		/*if (isMenuItem(toOBJ)) {
			toOBJ.style.background = hilitecolor;
		}*/
		
		if (parentHasClassName(toOBJ, "Menu")) {
			var tmpNode = toOBJ;
			while (tmpNode.parentNode) {
				if (isMenuItem(tmpNode)) {
					tmpNode.style.background = hilitecolor;
					break;
				}
				tmpNode = tmpNode.parentNode;
			}
		}
	}
	
	if (parentHasClassName(toOBJ, "MenuHeader") || (toOBJ.className == "MenuHeader") ) {
		var header = (toOBJ.className == "MenuHeader") ? toOBJ : getParentWithClassName(toOBJ, "MenuHeader");
		var childMenuID = header.id.substr(0, header.id.lastIndexOf('Header'));
		
		if (document.getElementById(childMenuID)) popupMenu(childMenuID, header);
	}
}

// Handle mouse click events
function documentMouseClick(e) {
	if (!e) var e = window.event;
	var toOBJ = (window.event) ? e.srcElement : e.target;
	
	if ((parentHasClassName(toOBJ, "Menu")) && (toOBJ.tagName == "A") ) {
		hideMenu(getParentWithClassName(toOBJ, "Menu"));
	}
	
	if ((parentHasClassName(toOBJ, "MenuHeader")) && (toOBJ.tagName == "A") ) {
		var header = getParentWithClassName(toOBJ, "MenuHeader");
		var childMenuID = header.id.substr(0, header.id.lastIndexOf('Header'));
		var childMenuOBJ = document.getElementById(childMenuID);
		if (childMenuOBJ != null) hideMenu(childMenuOBJ);
	}
	
	/* This makes clicking a menu item cell the same as clicking the link. Use display: block; on the link instead
	if (isMenuItem(toOBJ)) {
		if (toOBJ.firstChild) {
			if (toOBJ.firstChild.tagName == "A") {
				hideMenu(getParentWithClassName(toOBJ, "Menu"));
				location.href = toOBJ.firstChild.href;
			}
		}
	}
	*/
	
	return true;
}
	

document.documentElement.onmouseout = documentMouseOut;
document.documentElement.onmouseover = documentMouseOver;
document.documentElement.onclick = documentMouseClick;