/* 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)));
}  

/* These two function calls initialize the primary navigation menu 250 milliseconds after the 'topnav' div is loaded.
   Their parameters are specific to EW */
tii_callFunctionOnElementLoad ('topnav', function ()
{
	var delay = setTimeout (ew_initializeNav, 10);
});
 
function ew_initializeNav ()
{
	tii_pnav_initializeDropdownMenu.apply (this, new Array ('topnav', ew_pnav_hideOrShowMenuFunction, ew_pnav_changeStateFunction));
}
							   
/* This is the hide/show menu function specific to EW */
function ew_pnav_hideOrShowMenuFunction (menu, hideElseShow, menuParent)
{
	menu.style.left = (hideElseShow ? '-999' : (menuParent.offsetLeft - 1)) + 'px';
}

/* This is the change/clear status function specific to EW */
function ew_pnav_changeStateFunction (element, isADropdownItem, state)
{
	if (isADropdownItem)
	{
		switch (state)
		{
			case 0:
				element.className = '';
				break;
			case 2:
				element.className = 'active';
				break;
		}
	}
	else
	{
		var anchor = element.getElementsByTagName ('a').item (0);
		var em = element.getElementsByTagName ('em').item (0);
		
		switch (state)
		{
			case 0:
				anchor.style.visibility = 'visible';
				em.style.visibility = 'visible';
				break;
			case 1:
				anchor.style.visibility = 'hidden';
				em.style.visibility = 'hidden';
				break;
			case 2:
				anchor.style.visibility = 'visible';
				em.style.visibility = 'hidden';
				break;
		}
	}
}

