var showMenu="", timeOutCancel;

// shows/hides some element with ID=<name> as menu 
// if <show> is true shows else hides
// <ev> is the event fired
// <timeout> this is timeout in ms for wait before show
function switchMenu(name, show, ev, timeout)
{
	var mnu = document.getElementById(name);
	if(mnu)
		if( show )  
		{
			if(showMenu) hideMenu(ev);
			timeOutCancel = setTimeout( 'document.getElementById("'+mnu.id+'").style.display = "block"' , timeout);
			stopProp(ev?ev:event);
			mnu.onmouseover = stopProp;
			showMenu = name;
		}
		else
		{
			clearTimeout(timeOutCancel);
			mnu.style.display = "none";
			showMenu = "";
		}
}

function stopProp(evt)
{
	if( evt = (evt) ? evt : event )
		if( evt.stopPropagation )
			evt.stopPropagation();
		else
			evt.cancelBubble = true;
}

function hideMenu(ev)
{
	switchMenu(showMenu, false, ev?ev:event);
	try{documentOnmouseover( ev?ev:event );}catch(e){}
}
document.onmouseover = hideMenu;

function getEl(el)
{
	return (typeof(el)=="object")?el:document.getElementById(el);
}

function getPosition(el, side)
{
	var pos = 0, posMoz = 0, offs;
	el = getEl(el);

	while(el && el.nodeType == 1)
	{
		offs = ( side.toLowerCase() == "left" ) ? el.offsetLeft : el.offsetTop;
		
		pos += (offs<0?0:offs); 
		posMoz += offs; 
		if( side.toLowerCase() == "left" && el.tagName!="BODY" )
		{
			pos -= el.scrollLeft; 
			posMoz -= el.scrollLeft; 
		}
		el = el.offsetParent;
	}
	
	if( navigator.userAgent.toLowerCase().indexOf('gecko') == -1 )//-- if the bowser is not firefox
		return pos; 
	else
		return posMoz;
}

function moveElTo( El, toEl, toRight, toTop, noWidth )
{
	var i;
	El=getEl(El); toEl=getEl(toEl);
	if( !El || !toEl ) return -1;
	
	i = El.style.display;
	El.style.display = "block";
	if(!noWidth) 
	{
		El.style.width = toEl.offsetWidth;
		El.style.width = El.offsetWidth;
	}
	El.style.left = getPosition(toEl, "left") + (toRight?toEl.offsetWidth-El.offsetWidth:0);
	El.style.top = getPosition(toEl, "top") + (toTop?-El.offsetHeight:toEl.offsetHeight);
	El.style.display = i;
}

//-----------------------------------------------------------------------------------------------------------

// -- Functions is used :
	// -  function addEvent(obj, evType, fn)  -- from ../scripts/inc/ajax.js
	
/////////////////////////////////////////////////////////////////////////////////
	var objMenuesList = {};
/////////////////////////////////////////////////////////////////////////////////
	
	function showMenuFor( destEl, mnuEl, side, type, hideTimeout )
	{
		if( !(destEl = getEl(destEl)) ) return;
		if( !(mnuEl = getEl(mnuEl)) ) return;
		
		if( mnuEl.id == "")
			mnuEl.id = Math.random()*100000;
			
		var objMenu = objMenuesList[mnuEl.id];		
		if( !objMenu ) // -- if menu object does not exists then create it
		{
			objMenu = new TMenu( mnuEl, type, destEl, hideTimeout );
			objMenuesList[mnuEl.id] = objMenu;
		}
		
		if( type!=1 ) //-- when menu is hidden when mouse out of it
			objMenu.cancelHiding();

		objMenu.showNear( destEl, side )
	}
	
	function hideMenuAfter( mnuEl, timeout )
	{
		if( !( mnuEl = getEl(mnuEl) )  ) return;
		var objMenu = objMenuesList[mnuEl.id] ;
		if( objMenu ) objMenu.hideAfter(timeout);
	}

	function hideMenuNow( mnuEl )
	{
		if( !( mnuEl = getEl(mnuEl) )  ) return;
		var objMenu = objMenuesList[mnuEl.id];
		if( objMenu ) objMenu.hide();
	}
	
	function unhideMenu( mnuEl )
	{
		if( !( mnuEl = getEl(mnuEl) )  ) return;
		var objMenu = objMenuesList[mnuEl.id];  
		if( objMenu ) objMenu.cancelHiding();
	}
	
	function TMenu( mnuEl, type, destEl, hideTimeout )
	{
		mnuEl = getEl(mnuEl);
		this.mnuEl = ( mnuEl && mnuEl.tagName ? mnuEl : null );
		this.type =  type ||  0 ;
		this.destEl = destEl;
		this.timer = 0;
		
		if( this.mnuEl )
		{
			var objThis = this;
			this.mnuEl.style.position = "absolute";

			if(this.type != 1)
			{
				addEvent(this.destEl, 'mouseout', function(){ objThis.hideAfter(20);} ); //-- prevent immidiate hidding of menu	
				
				hideTimeout = hideTimeout || 20;
				addEvent(this.mnuEl, 'mouseout', function(){ objThis.hideAfter(hideTimeout);} );	
				addEvent(this.mnuEl, 'mouseover', function(){ objThis.cancelHiding();} );	
			}
			//-- Hide menu when user click on area that is not menu and is not destination element
				addEvent(document, 'mousedown', function(e)
					{
						if (!e) var e = window.event;
						var tg = (window.event) ? e.srcElement : e.target;
						if( tg == objThis.destEl) return;
						while( tg.parentNode && tg !=objThis.mnuEl && tg != objThis.destEl) 
							tg = tg.parentNode;
						if(tg!=objThis.mnuEl && tg != objThis.destEl) objThis.hide(); 
					} )	
					
			//-- Hide menu on window resize						
				addEvent(window, 'resize', function(e){objThis.hide();});
				
			//-- prevent menu overlay by select element for IE
				addEvent(this.mnuEl, 'propertychange', function(ev){ iePreventOverlay(ev||event);} );	
				
		}
	}
	
	TMenu.prototype.showNear = function( destEl, side, delay )
	{
		destEl = destEl || this.destEl;
		if( !this.mnuEl || !destEl ) return;
		
		//-- Show menu ( must be before calculating a new position otherwise it is not always possible to determine its new position and size  )
			screenWidth = document.getElementsByTagName('body')[0].clientWidth;
			//alert(screenWidth)
			this.mnuEl.style.display = "block";
			this.destEl = destEl;
			
		//-- Get new position of menu
			var objThis = this;
			var top = 0, topExt = 0;  
			var left = 0, leftExt = 0;
			switch(side)
			{
				case "left":
						 topExt = 0; 
						 leftExt = -this.mnuEl.offsetWidth - 1 ;
					break;
				case "right":
						topExt = 0; 
						leftExt = destEl.offsetWidth ;
					break;
				default: //-- bottom
				
						// - change width of menu according destination Element ( if it is small )
							if( this.mnuEl.offsetWidth < destEl.offsetWidth )
								this.mnuEl.style.width = destEl.offsetWidth + 'px';
								
						topExt = destEl.offsetHeight; 
						if( side == "bottom_rtl" )
							leftExt = destEl.offsetWidth-this.mnuEl.offsetWidth-1;
						else
							leftExt = 0;
								
					break;
			}
			
			left = getPosition( destEl, "left") + leftExt + 1;
			if( side!="left")
			{
				var bodyLeftScroll = document.getElementsByTagName("BODY")[0].scrollLeft;
				if( left<bodyLeftScroll ) 
				{
					if( getPosition( destEl, "left") >= bodyLeftScroll)
						left = getPosition( destEl, "left")
					else
						left = bodyLeftScroll;
				}
				else if(side!="right")
				{	//-- on showing  menu its content may be changed, and we don't want that it will shown partly   
					//-- so after 100ms move menu in order it will be shown fully (if need)	
					setTimeout(  
						function(){ 
							if( left + objThis.mnuEl.offsetWidth > screenWidth  + bodyLeftScroll  )
								objThis.mnuEl.style.left = screenWidth + bodyLeftScroll  - objThis.mnuEl.offsetWidth;
						} 
						, 50 );
				}
			}	
			
		//-- Locate menu on new position
			this.mnuEl.style.left = left;
			this.mnuEl.style.top = getPosition( destEl, "top") + topExt;

		//-- size of menu may be changed so for ajusting it under destEl refresh menu's left position
			if( side == "bottom_rtl"  && typeof(this.fnMenuOnblur)=='undefined' )
			{
				this.fnMenuOnblur = function(ev){
					objThis.mnuEl.style.visibility = 'hidden';
					setTimeout( 
						function(){
							if( objThis.mnuEl.offsetWidth < objThis.destEl.offsetWidth )
								objThis.mnuEl.style.width = objThis.destEl.offsetWidth + 'px';										
								
							var leftExt = objThis.destEl.offsetWidth-objThis.mnuEl.offsetWidth-1;;
							var left = getPosition( objThis.destEl, "left") + leftExt + 1;
							objThis.mnuEl.style.left = left;
							objThis.mnuEl.style.visibility = '';
						},10)
				}
				addEvent(this.mnuEl, 'click', function(ev){ objThis.fnMenuOnblur(ev); }  );	
			}
	}
	
	TMenu.prototype.hide = function()
	{	if( !this.mnuEl ) return;
		this.cancelHiding();
		this.mnuEl.style.display = "none";
	}
	
	TMenu.prototype.hideAfter = function(time)
	{	if( !this.mnuEl ) return;

		var objThis = this;
		this.cancelHiding();
		this.timer = setTimeout(  function(){ objThis.hide() }  , (time||500) );	
	}
	
	TMenu.prototype.cancelHiding = function()
	{	if( !this.mnuEl ) return;
		try{ clearTimeout( this.timer ); } catch(e){}
	}

	//----------------------------------------------------------------------------
	//-- This function prevent absolutely positioned element be overlaid
	// 	with a dropdown or some ActiveX component in IE
	// 	by positioning transparent iframe under this element 
	function iePreventOverlay(ev)
	{	
		if(ev.propertyName=="onpropertychange") //-- this is nedded to avoid error message of IExplorer
			return;
			
		var el = ev.srcElement;
		if( !el ) return;
		
		//----------------------------------------------------------------------------------------
		if(el.id=="") el.id=Math.random();
		
		var iframe = document.getElementById("ifrmLayer_"+el.id);
		if( !iframe )
		{
			iframe = document.body.appendChild( document.createElement("iframe"));
			iframe.id = "ifrmLayer_"+el.id;
			iframe.style.position = "absolute";
			iframe.style["filter"] = "alpha(opacity=0)";		
			iframe.style["opacity"] = ".05";	
			iframe.style["zIndex"] = "10";	
			if( parseInt(el.style["zIndex"],10)<10 )
				el.style["zIndex"] = "11";
		}
		if( !iframe ) return;
		//----------------------------------------------------------------------------------------
		switch(ev.propertyName)
		{
			case "style.visibility": 
					iframe.style.visibility = el.style.visibility;
			case "style.display": 
					iframe.style.display = el.style.display;		
					if(el.style.display != 'none' && el.style.visibility != 'hidden')
					{
						iframe.style.left = el.offsetLeft+"px";
						iframe.style.top = el.offsetTop+"px";
						iframe.style.width = el.offsetWidth+"px";
						iframe.style.height = el.offsetHeight+"px";
					}
				break;
			case "style.top": 
					//getEl("topTest").innerHTML = el.style.top;				
					iframe.style.top = el.offsetTop+"px";
				break;
			case "style.left": 
					//getEl("leftTest").innerHTML = el.style.left;
					iframe.style.left = el.offsetLeft+"px";
				break;
			case "style.offsetWidth": 
					//getEl("widthTest").innerHTML = el.style.offsetWidth;
					iframe.style.width = el.offsetWidth+"px";
				break;
			case "style.offsetHeight": 
					//getEl("heightTest").innerHTML = el.offsetHeight;	
					iframe.style.height = el.offsetHeight+"px";
				break;
		}	
		var i,timeout=50;
		for( i=1; i<4; i++ )
		{
			setTimeout(function(){
				iframe.style.width = el.offsetWidth+"px";
				iframe.style.height = el.offsetHeight+"px";
			},timeout);
			timeout*=2;
		}
	}
	
	//-- define function to attach event
	addEvent = typeof(addEvent)!='undefined' ? addEvent : function (obj, evType, fn)
	{
		if (obj.attachEvent) return obj.attachEvent("on"+evType, fn);
		if (obj.addEventListener)
		{
			obj.addEventListener(evType, fn, true);
			return true;
		} 
		return false;
	}
	