/* from utils.js */
function tii_dom_removeWhitespaceTextNodes(node) {
	for (var x = 0; x < node.childNodes.length; x++) {
		var child = node.childNodes [x];
		if (child.nodeType == 3 && !/\S/.test(child.nodeValue)) {
			node.removeChild(node.childNodes[x]);
			x--;
		}
		if (child.nodeType == 1) {
			tii_dom_removeWhitespaceTextNodes(child);
		}
	}
}


function tii_addEventHandler(targetElement, eventType, functionToCall, bubbleEventUpDOMTree) {
	if (!targetElement) {
		window.status = 'Warning: Tried to attach event to null object';
		return false;
	}
	if (typeof targetElement.addEventListener != 'undefined') {
		targetElement.addEventListener (eventType, functionToCall, bubbleEventUpDOMTree);
	}
	else if (typeof targetElement.attachEvent != 'undefined') {
		targetElement.attachEvent ('on' + eventType, functionToCall);
	}
	else {
		eventType = 'on' + eventType;
		if (typeof targetElement [eventType] == 'function') {
			var oldListener = targetElement [eventType];
			targetElement [eventType] = function () {
				oldListener ();
				return functionToCall ();
			}
		}
		else {
			targetElement [eventType] = functionToCall;
		}
	}
	return true;
}



/* Global dropdown menu variables */
var tii_pnav_closeMenuDelay = 1; /* milliseconds */
var tii_pnav_closeMenuDelayIE6 = 1; /* milliseconds */

/* This is the core dropdown menu function */
function tii_pnav_initializeDropdownMenu (primaryNavId, hideOrShowMenuFunction, changeStateFunction) {
	var isopera = typeof window.opera != 'undefined';
	var isie = typeof document.all != 'undefined' && !isopera && navigator.vendor != 'KDE';
	var isie6 = navigator.userAgent.indexOf ('MSIE 6.0') > -1;
	var issafari = navigator.vendor == 'Apple Computer, Inc.';
	var isfirefox = navigator.userAgent.toLowerCase ().indexOf ('firefox') > -1;
	var root = document.getElementById (primaryNavId);
	var doHandleFocus = true;
	var doHandleAllFocus = true;
	var focusEventSource;
	var focusLevel = -1;
	var lastEventType = -1;
	var lastEventSource;
	var lastPrimaryLi;
	var lastLevel = -1;
	var lastMenu;
	var delayMenuClose;
	var delayMenuUlClose;
	var lastBlurEventSource;
	var lastBlurPrimaryLi;
	var lastBlurLevel = -1;
	var lastLastEventType = -1;
	var lastLastBlurEventSource;
	var lastLastBlurPrimaryLi;
	var lastLastBlurLevel = -1;
	if (!root) {
		return false;
	}
	var primeUl = root.getElementsByTagName('ul').item(0);
	if (!primeUl) {
		return false;
	}
	if (window.Node && Node.prototype && !Node.prototype.contains) {
		Node.prototype.contains = function (arg) {
			return !!(this.compareDocumentPosition (arg) & 16)
		}
	}
	if (issafari) {
		primeUl.contains = containsFunction;
	}
	if (!isie) {
		tii_dom_removeWhitespaceTextNodes(primeUl);
	}
	tii_addEventHandler (primeUl, 'mouseout', function (event) {
		var related = typeof event.relatedTarget != 'undefined' ? event.relatedTarget : window.event.toElement;
		if (related && !primeUl.contains (related)) {
			var menu = getMenu (event);
			if (menu) {
				if (!focusEventSource || focusEventSource != lastEventSource || menu.contains (focusEventSource)) {
					deactivateLink (lastEventSource, lastLevel, true, true);
				}
			}
		}
	}, false);
	var primeLis = primeUl.childNodes;
	var primeLisLength = primeLis.length;
	for (var i = 0; i < primeLisLength; i++) {
		primeLi = primeLis.item(i);
		if (issafari) {
			primeLi.contains = containsFunction;
		}
		var primeLiKids = primeLi.childNodes;
		var primeLiKidsLength = primeLiKids.length;
		for (var j = 0; j < primeLiKidsLength; j++) {
			var primeLiKid = primeLiKids.item(j);
			var primeLiKidNodeName = primeLiKid.nodeName;
			if (primeLiKidNodeName == 'A') {
				addLinkEventHandlers(primeLiKid, 0);
			}
			else if (primeLiKidNodeName == 'UL') {
				if (!isie) {
					tii_dom_removeWhitespaceTextNodes(primeLiKid);
				}
				if (issafari) {
					primeLiKid.contains = containsFunction;
				}
				tii_pnav_assignFlyoutLis(primeLiKid, addLinkEventHandlers)
			}
		}
	}
	var keyevent = issafari || isie ? 'keydown' : 'keypress';
	tii_addEventHandler(document, keyevent, function (event) {
		var target = typeof event.target != 'undefined'? event.target : event.srcElement;
		if (primeUl.contains(target) && target.getAttribute('href')) {
			if (event.keyCode == 27) /* escape key */ {
				closeAllDropdowns();
				if (typeof event.preventDefault != 'undefined') {
					event.preventDefault();
				}
				return false;
			}
		}
		return true;
	}, false);
	var elements = document.getElementsByTagName('*');
	var elementsLength = elements.length;
	for (p = 0; p < elementsLength; p++) {
		tii_addEventHandler(elements.item(p), 'focus', function(event) {
			if (doHandleAllFocus) {
				var target = typeof event.target != 'undefined' ? event.target : event.srcElement;
				if (!primeUl.contains(target)) {
					closeAllDropdowns();
				}
			}
		}, false);
	}
	if (isfirefox) {
		tii_addEventHandler(document, 'focus', function(event) {
			var target = typeof event.target != 'undefined' ? event.target : event.srcElement;
			if (target == document) {
				if (lastBlurPrimaryLi) {
					doHandleFocus = false;
					deactivateLink(lastBlurPrimaryLi.getElementsByTagName('a').item(0), 0, true, true);
					var resetDelay = setTimeout (function() {changeStateFunction (lastBlurPrimaryLi, false, 0); }, 1);
				}
			}
		}, false);
	}
	else {
		tii_addEventHandler(window, 'blur', function() {
			if (lastEventSource) {
				deactivateLink(lastEventSource, lastLevel, true, true);
			}
		}, false);
	}
	function containsFunction(node) {
		if (node == null) {
			return false;
		}
		if (node == this) {
			return true;
		}
		else {
			return this.contains(node.parentNode);
		}
	}
	function getMenu(event) {
		try {
			var menu = typeof event.target != 'undefined' ? event.target : event.srcElement;
			while (menu && menu.parentNode.parentNode.parentNode != root) {
				menu = menu.parentNode;
			}
			if (menu && menu.parentNode.parentNode.parentNode == root) {
				return menu;
			}
			else {
				return null;
			}
		}
		catch(error) {return null;}
	}
	function closeAllDropdowns() {
		for (var n = 0; n < primeLisLength; n++) {
			deactivateLink(primeLis.item(n).getElementsByTagName('a').item(0), 0, true, true);
		}
	}
	function addLinkEventHandlers (link, level) {
		tii_addEventHandler(link, 'mouseover', callHandleEvent, false);
		tii_addEventHandler(link, 'mouseout', callHandleEvent, false);
		tii_addEventHandler(link, 'focus', callHandleEvent, false);
		tii_addEventHandler(link, 'blur', callHandleEvent, false);
		function callHandleEvent(event) {
			handleEvent(event, level);
		}
	}
	function handleEvent(event, level) {
		var eventSource = typeof event.target != 'undefined' ? event.target : window.event.srcElement;
		while (eventSource && eventSource.nodeName != 'A') {
			eventSource = eventSource.parentNode;
		}
		if (!eventSource || eventSource.nodeName != 'A') {
			return;
		}
		var eventType = event.type;
		if (issafari && (eventType == 'mouseover' || eventType == 'mouseout') && tii_pnav_isUnwantedTextEvent()) {
			return;
		}
		if (eventType == 'mouseover') {
			handleMouseover(eventSource, level);
		}
		if (eventType == 'mouseout' && level == 0) {
			handleMouseout(eventSource, level, event);
		}
		else if (eventType == 'focus') {
			handleFocus(eventSource, level);
		}
		else if (eventType == 'blur') {
			handleBlur(eventSource, level);
		}
	}
	function handleMouseover (eventSource, level) {
		var closeMenu = false;
		if (level == 0) {
			if (eventSource.parentNode != lastPrimaryLi) {
				closeMenu = true;
			}
			else {
				if (lastLevel > 0) {
					clearTimeout (delayMenuClose);
				}
				closeMenu = false;
			}
			deactivateLink(lastEventSource, lastLevel, false, closeMenu);
			activateLink(eventSource, level);
		}
		else {
			if (issafari) {
				if (lastPrimaryLi && !lastPrimaryLi.contains) {
					lastPrimaryLi.contains = containsFunction;
				}
			}
			if (isfirefox && lastEventType == 2 && lastLastEventType == 2) {
				if (!lastLastBlurPrimaryLi.contains(eventSource) || !lastBlurPrimaryLi.contains(eventSource)) {
					var delayBlurMenuClose = setTimeout (function() {
						var lastLastBlurMenu = lastLastBlurPrimaryLi.getElementsByTagName('ul').item(0);
						hideOrShowMenuFunction(lastLastBlurMenu, true, lastLastBlurPrimaryLi);
						changeStateFunction(lastLastBlurPrimaryLi, false, 0);
					}, (isie6 ? tii_pnav_closeMenuDelayIE6 : tii_pnav_closeMenuDelay));
				}
			}
			if (lastEventSource) {
				if (lastPrimaryLi.contains(eventSource)) {
					clearTimeout(delayMenuClose);
					closeMenu = false;
				}
				else {
					closeMenu = true;
				}
				deactivateLink(lastEventSource, lastLevel, false, closeMenu);
			}
			activateLink(eventSource, level);
		}
		lastLastEventType = lastEventType;
		lastEventType = 0;
		lastEventSource = eventSource;
		lastPrimaryLi = (level == 0 ? lastEventSource.parentNode : (level == 1 ? lastEventSource.parentNode.parentNode.parentNode : lastEventSource.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode));
		lastLevel = level;
		doHandleFocus = false;
		doHandleAllFocus = false;
		eventSource.focus();
	}
	function handleMouseout(eventSource, level, event) {
		var related = typeof event.relatedTarget != 'undefined' ? event.relatedTarget : window.event.toElement;
		if (!eventSource.parentNode.contains (related)) {
			deactivateLink (eventSource, level, true, true);
		}
	}
	function handleFocus (eventSource, level) {
		var closeMenu = false;
		if (!doHandleFocus) {
			doHandleFocus = true;
			return;
		}
		doHandleAllFocus = true;
		focusEventSource = eventSource;
		focusLevel = level;
		if (lastEventSource) {
			if (issafari && !lastPrimaryLi.contains) {
				lastPrimaryLi.contains = containsFunction;
			}
			if (lastPrimaryLi && lastPrimaryLi.contains(eventSource)) {
				closeMenu = false;
			}
			else {
				closeMenu = true;
			}
			deactivateLink(lastEventSource, lastLevel, true, closeMenu);
		}
		activateLink(eventSource, level);
		lastLastEventType = lastEventType;
		lastEventType = 2;
		lastEventSource = eventSource;
		lastPrimaryLi = level == 0 ? lastEventSource.parentNode : (level == 1 ? lastEventSource.parentNode.parentNode.parentNode : lastEventSource.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode);
		lastLevel = level;
	}
	function handleBlur(eventSource, level) {
		lastLastBlurEventSource = lastBlurEventSource;
		lastLastBlurPrimaryLi = lastBlurPrimaryLi;
		lastLastBlurLevel = lastBlurLevel;
		lastBlurEventSource = eventSource;
		lastBlurPrimaryLi = (level == 0 ? lastBlurEventSource.parentNode : (level == 1 ? lastBlurEventSource.parentNode.parentNode.parentNode : lastBlurEventSource.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode));
		lastBlurLevel = level;
	}
	function activateLink(link, level) {
		if (level == 0) {
			changeStateFunction (link.parentNode, false, 2);
			var menu = link.parentNode.getElementsByTagName ('ul').item(0);
			if (!menu) {
				return;
			}
			hideOrShowMenuFunction (menu, false, menu.parentNode);
		}
		else if (level == 1 || level == 2) {
			var secondLi = link.parentNode;
			if (level == 1) {
				menu = secondLi.parentNode;
			}
			else {
				menu = secondLi.parentNode.parentNode.parentNode.parentNode;
			}
			hideOrShowMenuFunction(menu, false, menu.parentNode);
			changeStateFunction(secondLi, true, 2);
			if (lastLevel == 0) {
				changeStateFunction(menu.parentNode, false, 1);
			}
		}
	}
	function deactivateLink (link, level, skipDelay, closeMenu) {
		var menu;
		var primeLi;
		var secondLi;
		if (level == 0) {
			primeLi = link.parentNode;
			menu = primeLi.getElementsByTagName('ul').item(0);
			if (!menu) {
				changeStateFunction(primeLi, false, 0);
				return;
			}
		}
		else if (level == 1 || level == 2) {
			secondLi = link.parentNode;
			changeStateFunction(secondLi, true, 0);
			if (level == 1) {
				menu = secondLi.parentNode;
			}
			else {
				menu = secondLi.parentNode.parentNode.parentNode.parentNode;
			}
			primeLi = menu.parentNode;
		}
		if (menu && closeMenu) {
			doMenuClose(menu, primeLi, skipDelay);
		}
	}
	function doMenuClose (menu, primeLi, skipDelay) {
		if (skipDelay) {
			hideOrShowMenuFunction(menu, true, menu.parentNode);
			changeStateFunction(primeLi, false, 0);
			return;
		}
		delayMenuClose = setTimeout (function() {
			hideOrShowMenuFunction (menu, true, menu.parentNode);
			changeStateFunction (primeLi, false, 0);
		}, (isie6 ? tii_pnav_closeMenuDelayIE6 : tii_pnav_closeMenuDelay));
	}
}

function tii_pnav_assignFlyoutLis (flyoutUl, addLinkEventHandlers) {
	var isMulticolumn = true;
	var flyoutLis = flyoutUl.childNodes;
	var flyoutLisLength = flyoutLis.length;
	for (var k = 0; k < flyoutLisLength; k++) {
		var flyoutLi = flyoutLis.item(k);
		var secondFlyoutLis = flyoutLi.getElementsByTagName('li');
		var secondFlyoutLisLength = secondFlyoutLis.length;
		if (secondFlyoutLisLength == 0) {
			var flyoutLinks = flyoutLi.getElementsByTagName('a');
			var flyoutLinksLength = flyoutLinks.length;
			for (var m = 0; m < flyoutLinksLength; m++) {
				addLinkEventHandlers.call(this, flyoutLinks.item(m), 1);
			}
		}
		else {
			for (var n = 0; n < secondFlyoutLisLength; n++) {
				var secondFlyoutLi = secondFlyoutLis.item(n);
				var secondFlyoutLinks = secondFlyoutLi.getElementsByTagName('a');
				var secondFlyoutLinksLength = secondFlyoutLinks.length;
				for (var p = 0; p < secondFlyoutLinksLength; p++) {
					addLinkEventHandlers.call(this, secondFlyoutLinks.item(p), 2);
				}
			}
		}
	}
}

function tii_pnav_isUnwantedTextEvent() {
 	return (navigator.vendor == 'Apple Computer, Inc.'
      && (event.target == event.relatedTarget.parentNode
      || (event.eventPhase == 3
      && event.target.parentNode == event.relatedTarget)));
}



/* This is the hide/show menu function that needs to be defined for each site */
function pnav_hideOrShowMenuFunction(menu, hideElseShow, menuParent) {
	menu.style.left = (hideElseShow ? '-9999' : (menuParent.offsetLeft)) + 'px';
}

/* This is the change/clear status function that needs to be defined for each site */
function pnav_changeStateFunction (element, isADropdownItem, state) {
	if (isADropdownItem) {
		element.className = element.className.replace(/active/gi, '');
		switch (state) {
			case 0: /* default */
				break;
			case 2:
				element.className += (element.className == '' ? '' : ' ') + 'active';
				break;
		}
	}
	else {
		element.className = element.className.replace(/selected/gi, '');
		element.className = element.className.replace(/active/gi, '');
		switch (state) {
			case 0: /* default */
				element.className = element.className.replace(/current_marker/gi, 'current_page');
				break;
			case 1:
				element.className += (element.className == '' ? '' : ' ') + 'selected';
				break;
			case 2:
				element.className = element.className.replace(/current_page/gi, 'current_marker');
				element.className += (element.className == '' ? '' : ' ') + 'active';
				break;
		}
	}
}


document.observe("dom:loaded", function() {
	//initialize the primary navigation menu
	tii_pnav_initializeDropdownMenu.apply(this, new Array ('topnav', pnav_hideOrShowMenuFunction, pnav_changeStateFunction));

});

