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='/bitrix/templates/main_new/images/spacer.gif';
	this.MENU_ELEM_SUFFIX='_menu';
	this.MENU_GROUP_ID='cn_pnav';
	this.MENU_EXCLUDE_USER_AGENTS=[];
	this.MENU_PRELOAD_URL='/bitrix/templates/main_new/images/';
	this.MENU_PRELOAD_IMAGES=['header_flymenu_bg.gif','header_mainnav_bg_off.gif','header_mainnav_bg_on.gif','header_mainnav_bg_over.gif','mold_highlight_bottom_off.gif','mold_highlight_bottom_on.gif','mold_shade_bottom_off.gif','mold_highlight_bottom_over.gif','mold_shade_bottom_over.gif','header_flymenu_bghighlight.gif'];
	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;
				registerEventHandler(onHdrElem,'mouseout',mouseOutHandler);
				if(this._skipMenuDisplay)
					continue;
				this._turnOnMenu=function()
				{
					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);
			}
			
			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];
		}
	};
	
	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;
}
