
// Usage //
//<script>
//if(typeof(LayerManager) != 'undefined')
//{
//	LayerManager.LayerArray.push(new SlideLayer('tdChryslerMenu','divChryslerMenu','RIGHT',1,0,0));
//}
//</script>
// Usage //

var SlideLayer = function(triggerId,layerId,layerPosition,autoPosition,top,left)
{
	this.triggerId = triggerId;
	this.layerId = layerId;
	this.layerPosition = layerPosition;
	this.autoPosition = autoPosition;
	this.top = top;
	this.left = left;
}

var LayerManager = {
	
	LayerArray : new Array(),
	MenuMilliSecondsVisible : 750,
	CurrentMenu  : null,
	HideTimer : null,
	MouseX : 0,
	MouseY : 0,
	BodyHolderEl : document.getElementsByTagName("body")[0],
	
	addEvent : function(elm, evType, fn, useCapture)
	{
	  if (elm.addEventListener) { 
	    elm.addEventListener(evType, fn, useCapture); 
	    return true; 
	  } else if (elm.attachEvent) { 
	    var r = elm.attachEvent('on' + evType, fn); 
	    return r; 
	  } else {
	    elm['on' + evType] = fn;
	  }
	},
	
	// climb up the tree to the supplied tag.
	ascendDOM : function(e, target)
	{
	  while (e.nodeName.toLowerCase() != target.toLowerCase() && e.nodeName.toLowerCase() != 'html')
	    e = e.parentNode;
	  
	  return (e.nodeName.toLowerCase() == 'html') ? null : e;
	},
	
	ascendDOMCheckId : function(e, target)
	{
	  while (e.nodeName.toLowerCase() != target.toLowerCase() && e.nodeName.toLowerCase() != 'html')
	    e = e.parentNode;
	    
	  if(typeof(e.id) == 'undefined' || e.id == null)
	  {
	  	LayerManager.ascendDOMCheckId(e,target);
	  }
	  
	  return (e.nodeName.toLowerCase() == 'html') ? null : e;
	},
	
	ascendDivsCheckId : function(e, target)
	{
	  while ((typeof(e.id) == 'undefined' || e.id == null || e.id == '') && e.nodeName.toLowerCase() != 'html')
	    e = e.parentNode;
	    
	  return (e.nodeName.toLowerCase() == 'html') ? null : e;
	},
	
	ShowLayerTrigger : function(e)
	{
		var el;
		if (window.event && window.event.srcElement)
			el = window.event.srcElement;
		if (e && e.target)
			el = e.target;
		if (!el) return;
		
		LayerManager.HideAllLayers();
		
		//el = LayerManager.ascendDOM(el,"td");
		var oLayer = LayerManager.FindCurrentObjUsingTriggerId(el.id);		
		var layerEl = document.getElementById(oLayer.layerId);
		LayerManager.PositionLayer(el, layerEl, oLayer);
				
		LayerManager.CurrentMenu = layerEl;	
		LayerManager.HideTimer = setInterval("LayerManager.CheckLayerActive()",LayerManager.MenuMilliSecondsVisible);			
		
		//Hide Select Tags
		LayerManager.ControlSelectTags(false);
	},
	
	PositionLayer : function(triggerEl,layerEl,oLayer)
	{
		elPos = ObjectPosition.get(triggerEl);
		layerPos = ObjectPosition.get(layerEl);
		layerLocation = oLayer.layerPosition;
		
		switch(layerLocation)
		{
			case 'TOP' :
				layerEl.style.display = 'block';
				layerEl.style.position = 'absolute';
				layerEl.style.left = elPos.left + "px";
				layerEl.style.top = elPos.top + "px";
				//layerEl.style.width = layerPos.width + "px";
				//layerEl.style.height = layerPos.height + "px";
				break;
				
			case 'LEFT' :
				layerEl.style.display = 'block';
				layerEl.style.position = 'absolute';
				layerEl.style.left = elPos.left - elPos.width + "px";
				layerEl.style.top = elPos.top + "px";
				break;
				
			case 'RIGHT' :
				layerEl.style.display = 'block';
				layerEl.style.position = 'absolute';
				layerEl.style.left = elPos.left + elPos.width + "px";
				layerEl.style.top = elPos.top + "px";
				break;
				
			case 'BOTTOM' :
				layerEl.style.display = 'block';
				layerEl.style.position = 'absolute';
				layerEl.style.left = elPos.left + "px";
				layerEl.style.top = elPos.top + elPos.height + "px";				
				break;
				
			default :
				layerEl.style.display = 'block';
				layerEl.style.position = 'absolute';
				layerEl.style.left = elPos.left + elPos.width + "px";
				layerEl.style.top = elPos.top + "px";
				break;
			
		}
	},
	
	HideLayerTrigger : function(e)
	{
		var el;
		if (window.event && window.event.srcElement)
			el = window.event.srcElement;
		if (e && e.target)
			el = e.target;
		if (!el) return;
		
		el = LayerManager.ascendDOMCheckId(el,"td");
				
		if(typeof(el) != 'undefined' && el != null && el.id != null && el.id != '')
		{
			var oLayer = LayerManager.FindCurrentObjUsingTriggerId(el.id);
			
			if(oLayer != null)
			{	
				var layerEl = document.getElementById(oLayer.layerId);
				layerEl.style.display = 'none';
			}
		}
	},
	
	ShowLayer : function(e)
	{
		var el;
		if (window.event && window.event.srcElement)
			el = window.event.srcElement;
		if (e && e.target)
			el = e.target;
		if (!el) return;
		
		el = LayerManager.ascendDOMCheckId(el,"div");
		//alert(el.id);
		el.style.display = 'block';
	},
	
	HideLayer : function(e)
	{
		var el;
		if (window.event && window.event.srcElement)
			el = window.event.srcElement;
		if (e && e.target)
			el = e.target;
		if (!el) return;
		
		el = LayerManager.ascendDOMCheckId(el,"div");
		
		if(typeof(el) != 'undefined' && el != null && el.id != null && el.id != '')
		{
			var oLayer = LayerManager.FindCurrentObjUsingLayerId(el.id);
			if(oLayer != null)
			{
				el.style.display = 'none';
			}
		}	
	},
	
	HideAllLayers : function()
	{
		clearInterval(LayerManager.HideTimer);
		var arrayLength = LayerManager.LayerArray.length;
		var oLayer = null;
		
		for(i=0; i<arrayLength; i++)
		{
			var oLayer = LayerManager.LayerArray[i];
			var layerEl = document.getElementById(oLayer.layerId);	
			layerEl.style.display = 'none';
		}
		
		//Show Select Tags
		LayerManager.ControlSelectTags(true);		
	},
	
	ControlSelectTags : function(show)
	{
        elementsToToggle = (document.getElementsByTagName) ? document.getElementsByTagName("select") : document.all.tags("select");
        for(var j=0; j<elementsToToggle.length; j++)
        {
            var theElement = elementsToToggle[j];
            
            if(document.getElementById)
            {
                theElement.style.visibility = show ? "visible" : "hidden";
            }
            else
            {
                theElement.visibility = show ? "show" : "hide";
            }
        }
	},
	
	CheckLayerActive : function()
	{
		elPos = ObjectPosition.get(LayerManager.CurrentMenu);
		
		//Get the Trigger Object
		var curLayerObj = LayerManager.FindCurrentObjUsingLayerId(LayerManager.CurrentMenu.id);
		var triggerEl = document.getElementById(curLayerObj.triggerId);
		var triggerPos = ObjectPosition.get(triggerEl);
		
		if(triggerPos.top > LayerManager.MouseY || triggerPos.left > LayerManager.MouseX || triggerPos.left + triggerPos.width <  LayerManager.MouseX || triggerPos.top + triggerPos.height < LayerManager.MouseY)
		{
			//alert(triggerPos.left + " > " +  LayerManager.MouseX);
		
			if(elPos.top > LayerManager.MouseY || elPos.left > LayerManager.MouseX)
			{
				LayerManager.CurrentMenu.style.display = 'none';
				clearInterval(LayerManager.HideTimer);
				//Show Select Tags
		        LayerManager.ControlSelectTags(true);
			}
			else if(elPos.left + elPos.width <  LayerManager.MouseX || elPos.top + elPos.height < LayerManager.MouseY)
			{
				LayerManager.CurrentMenu.style.display = 'none';
				clearInterval(LayerManager.HideTimer);
				//Show Select Tags
		        LayerManager.ControlSelectTags(true);
			}
		}
	},
	
	CheckParentLayer : function(e)
	{
		var el;
		if (window.event && window.event.srcElement)
			el = window.event.srcElement;
		if (e && e.target)
			el = e.target;
		if (!el) return;
		
		
		el = LayerManager.ascendDivsCheckId(el,"div");
		
		if(el != null && typeof(el.id) != 'undefined' && el.id != null && el.id != '')
		{
			var arrayLength = LayerManager.LayerArray.length;
					
			for(i=0; i<arrayLength; i++)
			{
				var oLayer = LayerManager.LayerArray[i];
				
				if(el.id == oLayer.layerId)
				{
					el.style.display = 'block';
					break;
				}
			}
		}		
	},
	
	FindCurrentObjUsingLayerId : function (layerId)
	{
		var arrayLength = LayerManager.LayerArray.length;
		var oLayer = null;
		
		for(i=0; i<arrayLength; i++)
		{
			var oLayer = LayerManager.LayerArray[i];
			
			if(layerId == oLayer.layerId)
			{
				break;
			}
		}
		
		return oLayer;
	},
	
	FindCurrentObjUsingTriggerId : function (triggerId)
	{
		var arrayLength = LayerManager.LayerArray.length;
		var oLayer = null;
		
		for(i=0; i<arrayLength; i++)
		{
			var oLayer = LayerManager.LayerArray[i];
			
			if(triggerId == oLayer.triggerId)
			{
				break;
			}
		}
		
		return oLayer;
	},
	
	FindPosX : function(obj)
	{
		var curleft = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curleft += obj.offsetLeft
				obj = obj.offsetParent;
			}
		}
		else if (obj.x)
			curleft += obj.x;
		return curleft;
	},
	
	FindPosY : function(obj)
	{
		var curtop = 0;
		var printstring = '';
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				printstring += ' element ' + obj.tagName + ' has ' + obj.offsetTop;
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		}
		else if (obj.y)
			curtop += obj.y;
		window.status = printstring;
		return curtop;
	},
	
	SetMouseXY : function(ev)
	{
		var e = window.event ? window.event : ev;
		//var t = e.target ? e.target : e.srcElement;
		
		var isIE = !window.opera && navigator.userAgent.indexOf('MSIE') != -1		
				
		var mX = 0
		var mY = 0
		
		// Main function to retrieve mouse x-y pos.s
		if(e.pageX && e.PageY)
		{
			mX = e.pageX
			mY = e.pageY
		}
		else if(e.clientX && e.clientY)
		{
			mX = e.clientX;
			mY = e.clientY;
		
			if (isIE)
			{
				// grab the x-y pos.s if browser is IE
				mX += document.body.scrollLeft;
				mY += document.body.scrollTop;
			}		
		}  
		// catch possible negative values in NS4
		if (mX < 0)
		{mX = 0}
		if (mY < 0)
		{mY = 0} 
		
		LayerManager.MouseX = mX;
		LayerManager.MouseY = mY;
	},
	
	Initialise : function()
	{
		var arrayLength = LayerManager.LayerArray.length;
		
		for(i=0; i<arrayLength; i++)
		{
			var oLayer = LayerManager.LayerArray[i];
			
			if(document.getElementById(oLayer.triggerId))
			{
				trigger = document.getElementById(oLayer.triggerId);
								
				LayerManager.addEvent(trigger, 'mouseover', LayerManager.ShowLayerTrigger, false);
				LayerManager.addEvent(trigger, 'mouseout', LayerManager.HideLayerTrigger, false);
			}
			if(document.getElementById(oLayer.layerId))
			{
				layer = document.getElementById(oLayer.layerId);
				if(LayerManager.BodyHolderEl != null && typeof(layer) != 'undefined' && layer.parentNode && layer.parentNode.tagName != "body")
	                LayerManager.BodyHolderEl.appendChild(layer);	                
				
				LayerManager.addEvent(layer, 'mouseover', LayerManager.ShowLayer, false);
				LayerManager.addEvent(layer, 'mouseout', LayerManager.HideLayer, false);
				//LayerManager.addEvent(layer, 'mousemove', LayerManager.SetMouseXY, false);
			}
		}
		
		var allDivs = document.getElementsByTagName("div");
		for(i=0; i<allDivs.length; i++)
		{
			if(allDivs[i].id == null || allDivs[i].id == '')
	  		{
				LayerManager.addEvent(allDivs[i], 'mouseover', LayerManager.CheckParentLayer, false);
			}
		}
	}
}
LayerManager.addEvent(window, 'load', LayerManager.Initialise, false);
LayerManager.addEvent(document, 'mouseover', LayerManager.SetMouseXY, false);


