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;
}

// Special Effects
function setOpacity(obj, opacity) {
	//opacity = (opacity == 100)?99.999:opacity;
	if (opacity > 100) opacity = 100;
	if (opacity < 0) opacity = 0;
	
	// IE/Win
	obj.style.filter = "alpha(opacity:"+opacity+")";
	
	// Safari<1.2, Konqueror
	obj.style.KHTMLOpacity = opacity/100;
	
	// Older Mozilla and Firefox
	obj.style.MozOpacity = opacity/100;
	
	// Safari 1.2, newer Firefox and Mozilla, CSS3
	obj.style.opacity = opacity/100;
}

function getOpacity(obj) {
	if(typeof obj.style.opacity == "string") {
		return obj.style.opacity * 100;
	} else {
		return obj.filters.alpha.opacity;
	}
	return false;
}

/*
function fadeIn(objId, cmdDone, opacity) {
	if (cmdDone == null) cmdDone = "";
	if (document.getElementById) {
		var obj = document.getElementById(objId);
		var cOpacity = getOpacity(obj);
		
		if (cOpacity == 100) {
			eval(cmdDone);
			return;
		}
		
		//if ( (opacity != null) && (opacity != cOpacity) ) return;
		
		//alert ("Menu Opacity: " + cOpacity);
		
		setOpacity(obj, cOpacity+20);
		window.setTimeout("fadeIn('"+objId+"', \""+cmdDone+"\" , "+(opacity+20)+")", 70);
	}
}

function fadeOut(objId, cmdDone, opacity) {
	if (cmdDone == null) cmdDone = "";
	if (document.getElementById) {
		var obj = document.getElementById(objId);
		var cOpacity = getOpacity(obj);
		
		if (cOpacity == 0) {
			eval(cmdDone);
			return;
		}
		
		// Avoid a race condition
		if ( (opacity != null) && (opacity != cOpacity) ) return;
		
		setOpacity(obj, cOpacity-20);
		window.setTimeout("fadeOut('"+objId+"', \""+cmdDone+"\" , "+(opacity-20)+")", 70);
	}
}
*/

var fadeSpeed = 20;
var fadeSpeedMs = 50;

function fadeProc(objId) {
	var obj = document.getElementById(objId);
	var cOpacity = getOpacity(obj);
	var fadeTo = obj.getAttribute("fadeTo");
	var cmdDone = obj.getAttribute("fadeToCmdDone");
	
	if ( Math.abs(cOpacity - fadeTo) < fadeSpeed ) {
		setOpacity(obj, fadeTo);
		eval(cmdDone);
		//alert("Fade To Proc.\nSetting Final Opacity.");
	} else if ( (cOpacity - fadeTo) < 0 ) {
		setOpacity(obj, cOpacity+fadeSpeed);
		//alert("Fade To Proc.\nFading in.");
		window.setTimeout("fadeProc('"+objId+"')", fadeSpeedMs);
	} else if ( (cOpacity - fadeTo) > 0 ) {
		setOpacity(obj, cOpacity-fadeSpeed-10);
		//alert("Fade To Proc.\nFading out.");
		window.setTimeout("fadeProc('"+objId+"')", fadeSpeedMs);
	} else {
		alert("Error in proc.");
	}
}

function fadeTo(objId, opacity, cmdDone) {
	if (cmdDone == null) cmdDone = "";
	if (document.getElementById) {
		var obj = document.getElementById(objId);
		var cOpacity = getOpacity(obj);
		
		var retrievedFadeVal = obj.getAttribute("fadeTo");
		
		obj.setAttribute("fadeTo", opacity);
		obj.setAttribute("fadeToCmdDone", cmdDone);
		
		//alert("Fade To: " + opacity);
		
		// If we alread have a opacity to fade to (a fade process is already running)
		if ( (!retrievedFadeVal) || (retrievedFadeVal == cOpacity) ) {
			// Start Proc
			//alert("Starting Proc.");
			window.setTimeout("fadeProc('"+objId+"')", fadeSpeedMs);
		} else {
			//alert("Proc Running");
		}
	}
}

// handle showing / hiding menus
function popupMenu(menuID, menuHeaderOBJ) {
	var pos = findPos(menuHeaderOBJ);
	var menuOBJ = document.getElementById(menuID);
	
	
	//setOpacity(menuOBJ, 0);
	
	// 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;
	
	menuOBJ.style.top = top+"px";
	menuOBJ.style.left = pos[0]+"px";
	
	fadeTo(menuID, 100, "");
}

function hideMenu(menuOBJ) {
	if (menuOBJ == null) return;
	/*
	menuOBJ.style.top = "-999px";
	menuOBJ.style.left = "-999px";
	*/
	fadeTo(menuOBJ.id, 0, "obj.style.top = '-999px';obj.style.left = '-999px';");
	//fadeOut(menuOBJ.id, "menuOBJ.style.top = '-999px';menuOBJ.style.left = '-999px';");
}


// 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;