var containerClass;
var hiddenClass;
var arrMenus;
var arrSubMenus;
var arrOpenSubMenus;
var arrLinks;

if(!Array.indexOf){
	Array.prototype.indexOf = function(obj) {
		for(var i=0; i<this.length; i++){
			if (this[i] == obj) {
				return i;
			}
		}
		return -1;
	}
}

function init (sContainerClass, sHiddenClass) {
	containerClass = sContainerClass;
	hiddenClass = sHiddenClass;


	// Check for DOM support
	if (!document.getElementById || !document.createTextNode) {
		return;
	}
	// arrMenus: an array of references to each expanding menu CONTAINER that's in the document.
	arrMenus = this.getElementsByClassName(document, 'ul', containerClass);
	// arrSubMenus: an array of references to each expanding menu ITEM within an expanding menu container
	// oSubMenu: a single reference to an expanding menu <ul> ELEMENT  within an expanding menu container
	// oLink: a reference to the link <a> ELEMENT of an expanding menu element
	var meunCookie = readCookie("freight_menus_open");
	if (meunCookie) {
		arrOpenSubMenus = meunCookie.split("|");
	} else {
		arrOpenSubMenus	= new Array();
	}
	arrLinks = new Array();
	var oSubMenu;
	var oLink;
	// loop through all the expanding menu containers (although there's probably only going to be one)
	for (var i = 0; i < arrMenus.length; i++) {
		// populate arrSubMenus
		arrSubMenus = arrMenus[i].getElementsByTagName('ul');
		// loop through all of the expanding menu items
		for (var j = 0; j < arrSubMenus.length; j++) {
			// populate oSubMenu
			oSubMenu = arrSubMenus[j];
			// populate oLink
			oLink = oSubMenu.parentNode.getElementsByTagName('a')[0];
			arrLinks.push(oLink);
			// set the onClick function for oLink
			oLink.onclick = function() {
				var idx = arrLinks.indexOf(this);
				// toggle the expanding menu item's open/closed state
				toggle(this.parentNode.getElementsByTagName('ul')[0], hiddenClass, idx);
				// toggle the expanding menu item's open/closed ICON
				toggleIndicator(this);
				return false;
			}
			// set oLink to initially have the open ICON
			oLink.className = "openExpandingMenu";
			// set open/closed state of oSubMenu, based on the user's cookie
			if (!arrOpenSubMenus[j]) {
				toggle(oSubMenu, hiddenClass, j);
				oLink.className = "closedExpandingMenu";
			} else {
				if (arrOpenSubMenus[j] == "closed") {
					// set oSubMenu to be initially closed (hidden)
					toggle(oSubMenu, hiddenClass, j);
					oLink.className = "closedExpandingMenu";
				}
			}
			// check if the user clicked a link in one of the subMenus, and highlight it
			var arrSubMenuSubLinks = oSubMenu.getElementsByTagName('a');
			for (var k = 0; k < arrSubMenuSubLinks.length; k++) {
				var el = arrSubMenuSubLinks[k];
				var linkURL = el.href;
				var currentURL = location.href;
				if (linkURL == currentURL) {
					el.className = el.className + ' selectedLink';
				}
			}
		}
	}
}

// toggles the hidden state of each submenu block 
function toggle(el, hiddenClass, idx) {
	var oRegExp = new RegExp("(^|\\s)" + hiddenClass + "(\\s|$)");
	// Add or remove the class name that hides the element
	if (oRegExp.test(el.className)) {
		// show the submenu
		el.className = el.className.replace(oRegExp, '')
		arrOpenSubMenus[idx] = "open";
	} else {
		// hide the submenu
		el.className = el.className + ' ' + hiddenClass;
		arrOpenSubMenus[idx] = "closed";
	}
	setCookie(arrOpenSubMenus);
}

// set a submenu block to be closed 
function setClosed(el, hiddenClass) {
	var oRegExp = new RegExp("(^|\\s)" + hiddenClass + "(\\s|$)");
	// check if the submenu is NOT already hidden
	if (!oRegExp.test(el.className)) {
		// force the submenu to be closed (hidden)
		el.className = el.className + ' ' + hiddenClass;
	}
}

// set a submenu block to be open 
function setOpen(el, hiddenClass) {
	var oRegExp = new RegExp("(^|\\s)" + hiddenClass + "(\\s|$)");
	// check if the submenu is already hidden
	if (oRegExp.test(el.className)) {
		// force the submenu to be open (not hidden)
		el.className = el.className.replace(oRegExp, '');
	}
}

// toggles the plus and minus signs as appropriate
function toggleIndicator(el) {
	el.className = (el.className == "openExpandingMenu") ? "closedExpandingMenu" : "openExpandingMenu";
}

// returns an array of which menus are open 
function getOpenMenus() {
	// *** PKL: Remove next 2 lines after 2009/04/15
	//var arrMenus = this.getElementsByClassName(document, 'ul', 'expandingMenu');
	//var arrSubMenus = arrMenus[0].getElementsByTagName('ul');
	//
	var arrOpenMenus = new Array();
	for (var i=0; i < arrSubMenus.length; i++) {
		var oRegExp = new RegExp("(^|\\s)" + 'expandingMenuHidden' + "(\\s|$)");
		// test if the menu is open
		if (!oRegExp.test(arrSubMenus[i].className)) {
			arrOpenMenus.push("open");
		} else {
			arrOpenMenus.push("closed");
		}
	}
	return arrOpenMenus;
}

// addEvent function from http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html 
function addEvent(obj, type, fn) {
	if (obj.addEventListener)
		obj.addEventListener(type, fn, false);
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() {obj["e"+type+fn](window.event);}
		obj.attachEvent("on"+type, obj[type+fn]);
	}
}

/*
Written by Jonathan Snook, http://www.snook.ca/jonathan
Add-ons by Robert Nyman, http://www.robertnyman.com
*/
function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];      
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}   
	}
	return (arrReturnElements)
}
	
addEvent(window, 'load', function(){init('expandingMenu','expandingMenuHidden');});
