// Required script file for popup menus

var menu_timeout = 600;
var menu_timeoutID;

var popup_timeout = 300;
var popup_timeoutID;
var popup_timeout_item;

var menu_padding = 3;

var popupMenus = new Array();

// definition of PopupMemu object
function PopupMenu(name, pxLeft, pxTop, opener) {
	this.name = "popmen_" + name;
	this.menuItems = new Array();
	this.selectedItem = "";
	this.opener = (opener) ? opener : null;
	this.openedChild = null;
	this.left = (pxLeft) ? pxLeft : null;
	this.top = (pxTop) ? pxTop : null;
}

// define PopupMenu methods via prototype object
new PopupMenu("");

function addPopupMenuItem(txt, url, img) {
	var i = this.menuItems.length;
	this.menuItems[i] = new Array(txt, url, img);
	return this.name + "_" + i.toString();
}
PopupMenu.prototype.addItem = addPopupMenuItem;
function buildPopupMenu() {
	// No DHTML for NN4 - treat like non-scripting browser
	var lnkStyle = (document.layers) ? "menuLinkNoScript" : "menuLink";
	
	document.write("<div id='" + this.name + "'");
	if (this.top && this.left) {
		document.write(" style='position: absolute; visibility: hidden; left: " + this.left.toString() + "px; top: " + this.top.toString() + "px;'");
	}
	document.write(">");
	document.write("<table class='navMenu' cellpadding='" + menu_padding.toString() + "' cellspacing='0' border='0' onmouseout='menuRollOut(event);'>");
	var i;
	for (i = 0; i < this.menuItems.length; i++) {
		document.write("<tr><td id='" + this.name + "_" + i.toString() + "Blk' class='menuItem' onmouseover='menuRollOver(event);' onclick='followMenuLink(event);'>");
		document.write("<a id='" + this.name + "_" + i.toString() + "' class='" + lnkStyle + "' href='" + this.menuItems[i][1] + "'>" + this.menuItems[i][0] + "</a>");
		document.write("</td></tr>");
	}
	document.write("</table></div>");
	
	// add to global menu array
	popupMenus[popupMenus.length] = this;
	// clear memory allocated to menu items
	this.menuItems = null;
}
PopupMenu.prototype.build = buildPopupMenu;

// called when mouse moves over menu item
function menuRollOver(evt) {
	elemID = getEventTargetID(evt);
	if (elemID) {
		menuHighlight(elemID);
	}
}
// called when mouse moves off of menu
function menuRollOut(evt) {
	elemID = getEventRelatedTargetID(evt);
	if (!elemID || elemID.substr(0, 7) != "popmen_") {
		resetMenuTimeout();
		menu_timeoutID = setTimeout("resetMenus()", menu_timeout);

		resetPopupTimeout(); 
	}
}
// resets the menu rollout timer
function resetMenuTimeout() {
	if (menu_timeoutID) {
		clearTimeout(menu_timeoutID);
		menu_timeoutID = null;
	}
}
// resets popup timeout
function resetPopupTimeout() {
	if (popup_timeoutID) {
		clearTimeout(popup_timeoutID);
		popup_timeoutID = null;
	}
}
// opens popup menu after a short delay
function openPopupMenu() {
	var menuChild = getMenuChild(popup_timeout_item);
	if (menuChild) {
		// turn any leftover highlights off
		menuHighlightOff(menuChild);
		show(menuChild.name);
		
		var objMenu = getMenuObject(getMenuID(popup_timeout_item));
		objMenu.openedChild = menuChild.name;
	}
	popup_timeoutID = null;
	popup_timeout_item = null;
}
// main menu functionality
function menuHighlight(name) {
	if (name) {
		// turn off timer
		resetMenuTimeout();
		
		name = name.replace(/Blk/, "");
		
		// get PopupMenu variable
		var objMenu = getMenuObject(getMenuID(name));
		
		// exit if already selected
		if (objMenu.selectedItem == name) {
			// continue popup timeout if cleared due to mouse off
			if (!popup_timeoutID && popup_timeout_item && popup_timeout_item == name) {
				popup_timeoutID = setTimeout("openPopupMenu()", popup_timeout);
			}
			return;
		}
		
		resetPopupTimeout();
		
		// un-highlight previously selected element
		menuHighlightOff(objMenu);
		
		// hide open child menus, if any
		hideMenuChild(objMenu.name);

		// highlight currently selected element
		setCSSClass(name, "menuLinkHighlight");
		setCSSClass(name + 'Blk', "menuItemHighlight");
		objMenu.selectedItem = name;
		
		// open child menu, if one is specified
		var menuChild = getMenuChild(name);
		if (menuChild) {
			popup_timeout_item = name;
			popup_timeoutID = setTimeout("openPopupMenu()", popup_timeout);
		} else {
			popup_timeout_item = null;
		}
		
	}
}

function followMenuLink(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	if (evt) {
		var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
		if (elem) {
			if (elem.nodeType) {
				elem = (elem.nodeType == 1 || elem.nodeType == 9 ) ? elem : elem.parentNode;
			}
			if (elem.id) {
				var lnk = getRawObject(elem.id.replace(/Blk/, ""));
				if (lnk && lnk.href) { document.location.href = lnk.href; }
			}
		}
	}
}

// turns off highlighted element
function menuHighlightOff(objMenu) {
	if (objMenu.selectedItem != "") {
		setCSSClass(objMenu.selectedItem, "menuLink");
		setCSSClass(objMenu.selectedItem + 'Blk', "menuItem");
		objMenu.selectedItem = "";
	}
}
// hides all open child menus of given menu
function hideMenuChild(name) {
	var objMenu = getMenuObject(name);
	if (objMenu) {
		if (objMenu.openedChild) {
			hideMenuChild(objMenu.openedChild);
			hide(objMenu.openedChild);
			objMenu.openedChild = null;
		}
	}
}
// resets menus after rollout
function resetMenus() {
	hideMenuChild(popupMenus[0].name);
	menuHighlightOff(popupMenus[0]);
	menu_timeoutID = null;
}
// returns name of menu based upon menu item name
function getMenuID(name) {
	var pref;
	var pos = name.lastIndexOf("_")
	if (pos > 0) {
		pref = name.substring(0, pos);
	}
	return pref;
}
// returns PopupMenu object with given name
function getMenuObject(name) {
	for (var i = 0; i < popupMenus.length; i++) {
		if (popupMenus[i].name == name) {
			return popupMenus[i];
			break;
		}
	}
}
// finds child menu associated with specified element
function getMenuChild(name) {
	for (var i = 0; i < popupMenus.length; i++) {
		if (popupMenus[i].opener) {
			if (popupMenus[i].opener == name) {
				return popupMenus[i];
				break;
			}
		}
	}
}