﻿

var LHTPrimaryNavigationController = new (function () { // [[Singleton]] constructor: the "new" operator needs to call an anonymous constructor function;


	var navElm, regXFirstChild = (/firstChild/), regXRollover = (/mOver/g), timeoutIdRollout, firstLevelListEntries = [];
	var collapseElement = function (elm/*, idx, arr*/) {
		elm.className = elm.className.replace(regXRollover, "").superTrim();
	};
	var _self = this;


	this.constructor = Object; // finally sanctionate [[Singleton]] as a singleton because this singletons original constructor reference gets replaced by the meta "Object" constructor reference;


	this.onFirstLevelEntryRollover = function (nodeObj) {

		clearTimeout(timeoutIdRollout);

		if (nodeObj.nodeName && (nodeObj.nodeName.toLowerCase() == "a") && (nodeObj.parentNode.parentNode.id == "primaryNavigation")) {

			firstLevelListEntries.forEach(collapseElement);

			var currentClassName = nodeObj.parentNode.className.replace(regXRollover, "").superTrim();
			nodeObj.parentNode.className = ((regXFirstChild.test(currentClassName)) ? (currentClassName.replace(regXFirstChild, "firstChild mOver")) : (currentClassName + " mOver"));
		}
		return true;
	};
	this.onFirstLevelEntryRollout = function (nodeObj) {

		if (nodeObj.nodeName && (nodeObj.nodeName.toLowerCase() == "a") && (nodeObj.parentNode.parentNode.id == "primaryNavigation")) {

			timeoutIdRollout = setTimeout((function () {collapseElement(nodeObj.parentNode);}), 300);
		}
		return true;
	};
	this.onSecondLevelEntryRollover = function (nodeObj) {

		clearTimeout(timeoutIdRollout);/*

		if (nodeObj.nodeName && (nodeObj.nodeName.toLowerCase() == "a") && (nodeObj.parentNode.parentNode.parentNode.parentNode.id == "primaryNavigation")) {
		
		}*/
		return true;
	};
	this.onSecondLevelEntryRollout = function (nodeObj) {

		if (nodeObj.nodeName && (nodeObj.nodeName.toLowerCase() == "a") && (nodeObj.parentNode.parentNode.parentNode.parentNode.id == "primaryNavigation")) {

			timeoutIdRollout = setTimeout((function () {collapseElement(nodeObj.parentNode.parentNode.parentNode);}), 300);
		}
		return true;
	};


	this.compile = function () {

		if (navElm) {return;} // due to operas multiple firing onload event;

		navElm = (document.getElementsByTagName("ul")["primaryNavigation"] || document.getElementById("primaryNavigation"));
		if (navElm && navElm.nodeName && (navElm.nodeName.toLowerCase() == "ul")) {

			var secondLevelListEntries, linkElm, listElm = navElm.firstChild;
			while (listElm) {
				if (listElm.nodeName && (listElm.nodeName.toLowerCase() == "li")) {

					linkElm = listElm.getElementsByTagName("a")[0];
					if (linkElm) {

						linkElm.onmouseover = linkElm.onfocus = function (evtObj) {

							evtObj = (window.event || evtObj);
							var evtSrc = (evtObj.srcElement || evtObj.target);

							return _self.onFirstLevelEntryRollover(evtSrc);
						};
						linkElm.onmouseout = linkElm.onblur = function (evtObj) {

							evtObj = (window.event || evtObj);
							var evtSrc = (evtObj.srcElement || evtObj.target);

							return _self.onFirstLevelEntryRollout(evtSrc);
						};
					}
					firstLevelListEntries.push(listElm);

					secondLevelListEntries = listElm.getElementsByTagName("li");
					if (secondLevelListEntries) {
						Array.forEach(secondLevelListEntries, (function (elm/*, idx, arr*/) {

							var linkElm = elm.getElementsByTagName("a")[0];
							if (linkElm) {

								linkElm.onmouseover = linkElm.onfocus = function (evtObj) {

									evtObj = (window.event || evtObj);
									var evtSrc = (evtObj.srcElement || evtObj.target);

									return _self.onSecondLevelEntryRollover(evtSrc);
								};
								linkElm.onmouseout = linkElm.onblur = function (evtObj) {

									evtObj = (window.event || evtObj);
									var evtSrc = (evtObj.srcElement || evtObj.target);

									return _self.onSecondLevelEntryRollout(evtSrc);
								};
							}
						}));
						if (window.attachEvent && !window.addEventListener) {

							var coll = secondLevelListEntries;
							if (coll && coll[coll.length-1] && (typeof coll[coll.length-1].className == "string")) {

								coll[coll.length-1].className += " lastChild" ;
							}
						}
					}
				}
				listElm = listElm.nextSibling;
			}
		}
	};
})();


if (window.addEventListener) {
	window.addEventListener("load", LHTPrimaryNavigationController.compile, true);
} else if (window.attachEvent) {
	window.attachEvent("onload", LHTPrimaryNavigationController.compile);
}