

cnPrimaryNavMenuManager = new function()
{

	this.VERSION          = '1.1';
	this.MENU_ON_DELAY    = 150;
	this.MENU_OFF_DELAY   = 5;
	this.MENU_OFF_CLASS   = 'cn_pnav_link';
	this.MENU_ON_CLASS    = 'cn_pnav_link_on';
	this.MENU_HOVER_CLASS = 'cn_pnav_link_hover';
	this.MENU_MAT_CLASS   = 'cn_pnav_fmenu_ie_select_block';
	this.MENU_MAT_SRC     = '/images/menu/spacer.gif';
	this.MENU_ELEM_SUFFIX = '_menu';
	this.MENU_GROUP_ID    = 'cn_pnav';
	this.MENU_EXCLUDE_USER_AGENTS = [];
	this.MENU_PRELOAD_URL    = '/gifs/navigation/common/';
	this.MENU_PRELOAD_IMAGES = [];
	

	this._onTimerId     = null;
	this._offTimerId    = null;
	this._turnOnMenu    = function(){};
	this._turnOffMenu   = function(){};
	
	this._clearOnTimer = function ()
	{
		clearTimeout(this._onTimerId);
		
		this._onTimerId  = null;
		this._turnOnMenu = function(){};
	};
	
	this._clearOffTimer = function ()
	{
		clearTimeout(this._offTimerId);
		
		this._offTimerId  = null;
		this._turnOffMenu = function(){};
	};
	

	this._skipMenuDisplay = false; 
	this._onHdrElemId     = null;  
	this._activeHdrElemId = null; 
	this._hdrMenuObjs     = null;  
	this._menuDisabled    = false; 
	

	this.turnOffMenuNow = function(){}; 
	
	this.toggleMenu = function(toggleElem)
	{
		if (this._menuDisabled)       return;
		if (!document.getElementById) return;
		if (!this._hdrMenuObjs)       this._initialize();
		if (this._onTimerId)          this._clearOnTimer();
		
		var self = this; 
		
		for ( var i = 0; i < this._hdrMenuObjs.length; ++i )
		{
			var hdrMenuObj = this._hdrMenuObjs[i];
			var hdrElem    = hdrMenuObj['hdr'];
			var menuElem   = hdrMenuObj['menu'];
		
			if ( toggleElem.id && toggleElem.id == hdrElem.id && menuElem )
			{
				var onHdrElem  = document.getElementById(toggleElem.id);
				var onMenuElem = menuElem;
				
				onHdrElem.className = this.MENU_HOVER_CLASS;
				
				// register mouseout handler in case they leave before menu displays
				registerEventHandler(onHdrElem, 'mouseout', mouseOutHandler);
				
				if (this._skipMenuDisplay) continue;

				this._turnOnMenu = function()
				{
					if (onMenuElem == null) return;

					if ( self._onHdrElemId )
					{
						self._turnOffMenu();
						self._clearOffTimer();
					}
					
					self._showMenu(onHdrElem, onMenuElem);
	
					unregisterEventHandler(onHdrElem, 'mouseout', mouseOutHandler);
					
					registerEventHandler(document,   'mousedown', mouseDownHandler);
					registerEventHandler(onMenuElem, 'mouseout',  mouseOutHandler);
					
					self._clearOnTimer();
					self._onHdrElemId = onHdrElem.id;
					
					self._resetHdrClass(onHdrElem);
				};
				
				this._onTimerId = setTimeout('cnPrimaryNavMenuManager._turnOnMenu()', this.MENU_ON_DELAY);
				
				this.turnOffMenuNow = function(disableCompletely)
				{
					turnOffMenu(onHdrElem, onMenuElem);
					
					self._clearOffTimer();
					self._onHdrElemId = null;
					
					if (disableCompletely) this._menuDisabled = true;
				};
			}
			else if ( menuElem && menuElem.style.display == 'block' )
			{
				var offHdrElem  = hdrElem;
				var offMenuElem = menuElem;
				
				this._resetHdrClass(offHdrElem);
				
				if (this._skipMenuDisplay) continue;
				
				this._turnOffMenu = function()
				{
					turnOffMenu(offHdrElem, offMenuElem);
					
					self._clearOffTimer();
					self._onHdrElemId = null;
				};
				
				this._offTimerId = setTimeout('cnPrimaryNavMenuManager._turnOffMenu()', this.MENU_OFF_DELAY);
			}
		}
		

		function mouseOutHandler(e)
		{
			var event  = pullEvent(e);
			var target = pullTarget(event);
			var toElem = pullDestination(event);

			if ( !self._skipMenuDisplay && toElem && !isChildOf(toElem, onMenuElem) )
			{
				var myHdrElem  = onHdrElem;
				var myMenuElem = onMenuElem;
				
				if (self._onTimerId) self._clearOnTimer();
				
				self._turnOffMenu = function()
				{
					turnOffMenu(myHdrElem, myMenuElem);
					
					self._clearOffTimer();
				};

				self._offTimerId = setTimeout('cnPrimaryNavMenuManager._turnOffMenu()', self.MENU_OFF_DELAY);
			}
			// no else, just cancel bubbling
			
			self._resetHdrClass(onHdrElem);
			
			if (event.stopPropagation) event.stopPropagation();
			else event.cancelBubble = true;
		}
		
		function mouseDownHandler(e)
		{
			var event  = pullEvent(e);
			var target = pullTarget(event);
	
			if ( !isChildOf(target, onMenuElem) )
			{
				turnOffMenu(onHdrElem, onMenuElem);
						
				self._turnOffMenu();
				self._clearOffTimer();
				self._resetHdrClass(onHdrElem);
			}
		}
		
		function turnOffMenu(hdrElem, menuElem)
		{
			hideMenu(hdrElem, menuElem);
			
			unregisterEventHandler(hdrElem,  'mouseout',  mouseOutHandler);
			unregisterEventHandler(document, 'mousedown', mouseDownHandler);
		}
	};
	
	this.preloadImages = function()
	{
		var preloadImages = this.MENU_PRELOAD_IMAGES;
		var tmpLoad       = new Array(preloadImages.length);
		
		for ( var i = 0; i < preloadImages.length; ++i )
		{
			tmpLoad[i]     = new Image();
			tmpLoad[i].src = this.MENU_PRELOAD_URL + preloadImages[i];
		}
	}
	
	// "private" methods
	this._initialize = function ()
	{
		this._skipMenuDisplay = this._verifyUserAgent();
		
		this._hdrMenuObjs = new Array();
		
		var hdrElems = getElementsByClassNames(this.MENU_GROUP_ID, [this.MENU_OFF_CLASS, this.MENU_ON_CLASS]);
		
		for ( var i = 0; i < hdrElems.length; ++i )
		{
			var hdrElem   = hdrElems[i];
			var hdrElemId = hdrElem.id;
			
			if ( hdrElemId )
			{
				var menuElem = document.getElementById(hdrElemId + this.MENU_ELEM_SUFFIX);

				if ( menuElem )
				{
					var menuId = menuElem.id;
					
					if (menuId) this._hdrMenuObjs[this._hdrMenuObjs.length] = { hdr: hdrElem, menu: menuElem };
					
					if (hdrElem.className == this.MENU_ON_CLASS) this._activeHdrElemId = hdrElemId;
				}
			}
		}
		
		return;
	};
	
	this._resetHdrClass = function (hdrElem)
	{
		hdrElem.className = (hdrElem.id == this._activeHdrElemId) ? this.MENU_ON_CLASS : this.MENU_OFF_CLASS;
	}
	
	this._showMenu = function (hdrElem, menuElem)
	{
		hdrElem.style.display  = 'none';
		menuElem.style.display = 'block';
		
		if ( document.all && navigator.appVersion.indexOf('Win') != -1 )
		{
			var matId = menuElem.id+'_ie_mat';
			var ieMat = document.getElementById(matId);
			
			if ( !ieMat )
			{
				ieMat = document.createElement('IFRAME');
				ieMat.setAttribute('scrolling', 'no');
				ieMat.setAttribute('frameborder', 0);
				ieMat.setAttribute('src', this.MENU_MAT_SRC);
				
				var menu  = (menuElem.getElementsByTagName('div'))[1];

				ieMat.id            = matId;
				ieMat.className     = this.MENU_MAT_CLASS;
				ieMat.style.width   = menu.offsetWidth;
				ieMat.style.height  = menu.offsetHeight;
				ieMat.style.zIndex  = menu.style.zIndex - 1;
				ieMat.style.display = 'block';
								
				menu.appendChild(ieMat);
			}
		}
	}
	
	this._verifyUserAgent = function()
	{
		var userAgent = navigator.userAgent;
		
		for ( var i = 0; i < this.MENU_EXCLUDE_USER_AGENTS.length ; ++i )
		{
			if ( userAgent.indexOf(this.MENU_EXCLUDE_USER_AGENTS[i]) != -1 )
			{
				return true;
			}
		}
		
		return false;
	};
	

	
	function getElementsByClassNames(rootElemId, classNames)
	{
		var rootElem         = document.getElementById(rootElemId);	
		var elements         = new Array();
		var captureClassName = new Object();

		for ( var i = 0; i < classNames.length; ++i ) captureClassName[classNames[i]] = true;
		
		if (rootElem) _pullElements(rootElem);
	
		function _pullElements(node)
		{
			if (captureClassName[node.className]) elements[elements.length] = node;
			
			if ( node.hasChildNodes )
			{
				var children = node.childNodes;
				
				for ( var i = 0; i < children.length; ++i )
				{
					_pullElements(children[i]);
				}
			}
		}
	
		return elements;
	}
	
	function hideMenu(hdrElem, menuElem)
	{
		hdrElem.style.display  = 'block';
		menuElem.style.display = 'none';
	}
	
	function isChildOf(node, parentNode)
	{
		var isChild = parentNode == node;
		
		if ( !isChild && node.parentNode )
		{
			isChild = isChildOf(node.parentNode, parentNode);
		}
		
		return isChild;
	}
	
	function pullDestination(e)
	{
		return (e.relatedTarget) ? e.relatedTarget : (e.toElement) ? e.toElement : null;
	}
	
	function pullEvent(e)
	{
		return (e) ? e : (window.event) ? window.event : null;
	}
	
	function pullTarget(e)
	{
		return (e.target) ? e.target : (e.srcElement) ? e.srcElement : null;
	}
	
	function registerEventHandler(elem, event, handler)
	{
		if ( document.addEventListener )
		{
			elem.addEventListener(event, handler, false);
		}
		else if ( document.attachEvent )
		{
			elem.attachEvent('on'+event,  handler);
		}
		else 
		{
			elem['on'+event] = handler;
		}
	}
	
	function unregisterEventHandler(elem, event, handler)
	{
		if ( document.removeEventListener )
		{
			elem.removeEventListener(event, handler, false);
		}
		else if ( document.detachEvent )
		{
			elem.detachEvent('on'+event, handler);
		}
		else 
		{
			elem['on'+event] = null;
		}
	}
}

function changeClass(elemId, newClass)
{
	var elem = null;
	
	if ( document.getElementById )
	{
		elem = document.getElementById(elemId);
	}
	else if ( document.all )
	{
		elem = document.all[elemId];
	}
	
	if (elem) elem.className = newClass;
}

cnPrimaryNavMenuManager.preloadImages();


