/*****************************************************
 All javascript herein is copyrighted (c) to
 Media Manifest, LLC
 
 Use or duplication of this script is not permitted
 without the prior written consent of Media Manifest,
 LLC
 
 copyright (c) 2005, All rights reserved
 
 The following script is used for the drop down
 navigation in the defualt Infusion style. This
 script is more of a show, hide, and place elements
 script and neccessarily a drop down navigation
 script.
*****************************************************/

/*****************************************************
 Determine their browser type
*****************************************************/
var ua = navigator.userAgent.toLowerCase(); 

// browser name
var isOpera = (ua.indexOf('opera') != -1); 
var ie = (ua.indexOf('msie') != -1 && !isOpera && (ua.indexOf('webtv') == -1) ); 
var ns4 = document.layers;
var op5 = (navigator.userAgent.indexOf("Opera 5")!=-1) || (navigator.userAgent.indexOf("Opera/5")!=-1);
var op6 = (navigator.userAgent.indexOf("Opera 6")!=-1) || (navigator.userAgent.indexOf("Opera/6")!=-1); 
var agt = navigator.userAgent.toLowerCase();
var mac = (agt.indexOf("mac")!=-1);
var mac_ie = mac && ie;


/*****************************************************
 Global variables used throughout the script
*****************************************************/
var timerID = null;
var timerOn = false;
var timecount = 700; // time in which to show the menu before closing it on a mouseout
var what = null;
var newbrowser = true;
var check = false;
var maxLayers = 20;
var lastLayers = new Array(maxLayers);
var oldClassName = null;
for(var i=0;i<lastLayers.length;i++)
	lastLayers[i] = new Array();
var lastHoveredLayers = new Array(maxLayers);
for(var i=0;i<lastHoveredLayers.length;i++)
	lastHoveredLayers[i] = new Array();

if (ns4) {
	layerRef="document.layers";
	styleSwitch="";
	visibleVar="show";
	what ="ns4";
} else if(ie) {
	layerRef="document.all";
	styleSwitch=".style";
	visibleVar="visible";
	what ="ie";
} else if(document.getElementById) {
	layerRef="document.getElementByID";
	styleSwitch=".style";
	visibleVar="visible";
	what="dom1";
} else {
	what="none";
	newbrowser = false;
}

check = true;

/*****************************************************
 Returns an elements object to access it's style
 properties
*****************************************************/
function getStyleObject(objectId){
	if(document.getElementById && document.getElementById(objectId)) {
		return document.getElementById(objectId).style;
	} else if (document.all && document.all(objectId)) {
		return document.all(objectId).style;
	} else if (document.layers && document.layers[objectId]) {
		return getObjNN4(document,objectId);
	} else {
		return false;
	}
}

/*****************************************************
 Returns an elements objects for netscapre v4 to
 access its propoerties
*****************************************************/
function getObjNN4(obj,name)
{
	var x = obj.layers;
	var foundLayer;
	for (var i=0;i<x.length;i++)
	{
		if (x.id == name)
		 	foundLayer = x;
		else if (x.layers.length)
			var tmp = getObjNN4(x,name);
		if (tmp) foundLayer = tmp;
	}
	return foundLayer;
} 

/*****************************************************
 Returns an elements height in pixels
*****************************************************/
function getElementHeight(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.clip.height;
	} else {
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		if (op5) { 
			xPos = elem.style.pixelHeight;
		} else {
			xPos = elem.offsetHeight;
		}
		return xPos;
	} 
}

/*****************************************************
 Returns an elements width in pixels
*****************************************************/
function getElementWidth(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.clip.width;
	} else {
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		if (op5) {
			xPos = elem.style.pixelWidth;
		} else {
			xPos = elem.offsetWidth;
		}
		return xPos;
	}
}

/*****************************************************
 Returned an elements absolute left page coordinates
*****************************************************/
function getElementLeft(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.pageX;
	} else {
		var elem;
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		xPos = elem.offsetLeft;
		tempEl = elem.offsetParent;
  		while (tempEl != null) {
  			xPos += tempEl.offsetLeft;
	  		tempEl = tempEl.offsetParent;
  		}
		return xPos;
	}
}

/*****************************************************
 Returns an elements absolute top page coordinates
*****************************************************/
function getElementTop(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.pageY;
	} else {
		if(document.getElementById) {	
			var elem = document.getElementById(Elem);
		} else if (document.all) {
			var elem = document.all[Elem];
		}
		yPos = elem.offsetTop;
		tempEl = elem.offsetParent;
		while (tempEl != null) {
  			yPos += tempEl.offsetTop;
	  		tempEl = tempEl.offsetParent;
  		}
		return yPos;
	}
}

/*****************************************************
 Moves an elements to pixels X,Y
*****************************************************/
function moveXY(myObject, x, y) {
	obj = getStyleObject(myObject);
	if (ns4) {
		obj.top = y;
 		obj.left = x;
	} else {
		if (op5) {
			obj.pixelTop = y;
 			obj.pixelLeft = x;
		} else {
			obj.top = y + 'px';
 			obj.left = x + 'px';
		}	
	}
}

/*****************************************************
 Changes an elements class
*****************************************************/
function changeClass(Elem, myClass) {
	var elem;
	if(document.getElementById) {
		var elem = document.getElementById(Elem);
	} else if (document.all){
		var elem = document.all[Elem];
	}
	elem.className = myClass;
}

/*****************************************************
 Changes an elements visibility css attribute to visible
*****************************************************/
function showLayer(layerName) {
	if(check) {
		if (what =="none") {
			return;
		} else if (what == "dom1") {
			document.getElementById(layerName).style.visibility="visible"; 
		} else {
			eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility="visible"');
		}
	} else {
		return;
	}
}

/*****************************************************
 Changes an elements visibility css attribute to hidden
*****************************************************/
function hideLayer(layerName) { 
	if(check) { 
		if (what =="none") { 
			return; 
		} else if (what == "dom1") { 
			document.getElementById(layerName).style.visibility="hidden"; 
		} else {
			eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility="hidden"'); 
		}
	} else { 
		return; 
	} 
}

/*****************************************************
 Hides all elements >= layer
*****************************************************/
function hideLayers(layer)
{
	if(!layer)
		layer = 0;
	
	for(i=layer;i<lastLayers.length;i++)
	{
		for(j=0;j<lastLayers[i].length;j++)
		{
			hideLayer(lastLayers[i][j]);
			if(ie) {
			tmp_obj = document.getElementById(lastLayers[i][j]+'_iframe');
			if(tmp_obj) tmp_obj.removeNode(true);
			}
			changeClass(lastHoveredLayers[i][j],oldClassName);
		}
	}
}

/*****************************************************
 Starts the time to hide all layers
*****************************************************/
function startTime() { 
	if (timerOn == false) { 
		timerID=setTimeout( "hideLayers()" , timecount); 
		timerOn = true; 
	}
} 

/*****************************************************
 Stops the startTime() function
*****************************************************/
function stopTime() { 
	if (timerOn) { 
		clearTimeout(timerID); 
		timerID = null; 
		timerOn = false; 
	} 
}

/*****************************************************
 Function to emulate a menu system
*****************************************************/
function showMenu() {
	var relElTop, relElLeft, relElHeight, relElWidth, elTop, elLeft, elHeight, elWidth, newX, newY, lastLayersIndex, lastHoveredLayersIndex, layer, inArray = false, i;
	
	hideLayers(arguments[5]);
	
	if(arguments[5] <= 0)
	{
		lastLayers = new Array(maxLayers);
		for(i=0;i<lastLayers.length;i++)
			lastLayers[i] = new Array();
		
		lastHoveredLayers = new Array(maxLayers);
		for(i=0;i<lastHoveredLayers.length;i++)
			lastHoveredLayers[i] = new Array();
		
		lastLayers[0][0] = arguments[0];
		lastHoveredLayers[0][0] = arguments[1];
	} else
	{
		layer = arguments[5];
		
		for(i=0;i<lastLayers[layer].length;i++)
		{
			if(lastLayers[layer][i] === arguments[0])
			{
				inArray = true;
			}
		}
		
		if(inArray == false)
		{
			lastLayersIndex = lastLayers[layer].length;
			lastLayers[layer][lastLayersIndex] = arguments[0];
			lastHoveredLayers[layer][lastLayersIndex] = arguments[1];
		}
	}
	
	oldClassName = (arguments[6]) ? arguments[6] : null;
	
	hoverClassName = (arguments[7]) ? arguments[7] : 'hover';
	changeClass(arguments[1],hoverClassName);
		
	relElTop = getElementTop(arguments[1]);
	relElLeft = getElementLeft(arguments[1]);
	relElHeight = getElementHeight(arguments[1]);
	relElWidth = getElementWidth(arguments[1]);
	
	elTop = getElementTop(arguments[0]);
	elLeft = getElementLeft(arguments[0]);
	elHeight = getElementHeight(arguments[0]);
	elWidth = getElementWidth(arguments[0]);
	
	switch(arguments[2])
	{
		case 'topLeft':
			newX = relElLeft;
			newY = relElTop - elHeight;
		break;
		
		case 'topCenter':
			newX = relElLeft + (Math.round(relElWidth / 2)) - (Math.round(elWidth / 2));
			newY = relElTop - elHeight;
		break;
		
		case 'topRight':
			newX = relElLeft - (elWidth - relElWidth);
			newY = relElTop - elHeight;
		break;
		
		case 'rightTop':
			newX = relElLeft + relElWidth;
			newY = relElTop;
		break;
		
		case 'rightMiddle':
			newX = relElLeft + relElWidth;
			newY = relElTop + (Math.round(relElHeight / 2)) - (Math.round(elHeight / 2));
		break;
		
		case 'rightBottom':
			newX = relElLeft + relElWidth;
			newY = relElTop  - (elHeight - relElHeight);
		break;
		
		case 'bottomLeft':
			newX = relElLeft;
			newY = relElTop + relElHeight;
		break;
		
		case 'bottomCenter':
			newX = relElLeft + (Math.round(relElWidth / 2)) - (Math.round(elWidth / 2));
			newY = relElTop + relElHeight;
		break;
		
		case 'bottomRight':
			newX = relElLeft - (elWidth - relElWidth);
			newY = relElTop + relElHeight;
		break;
		
		case 'leftTop':
			newX = relElLeft - elWidth;
			newY = relElTop;
		break;
		
		case 'leftMiddle':
			newX = relElLeft - elWidth;
			newY = relElTop + (Math.round(relElHeight / 2)) - (Math.round(elHeight / 2));
		break;
		
		case 'leftBottom':
			newX = relElLeft - elWidth;
			newY = relElTop - (elHeight - relElHeight);
		break;
	}
	
	if(arguments[3])
		newX += arguments[3];
		
	if(arguments[4])
		newY += arguments[4];
	
	for(i=0;i<2;i++)
		moveXY(arguments[0],newX,newY);
	
	showLayer(arguments[0]);
	
	// The following is a work around for the IE select z-index bug.
	// IE for some reason wont let you place elements above select boxes
	if(ie)
	{
		var ifObj = document.createElement('<iframe id="'+arguments[0]+'_iframe" src="/dropdown_iframe.htm" scrolling="no" frameborder="0" style="position:absolute; top: 0px; left: 0px; visibility: hidden; z-index: 99;"></iframe>');
		var bodyObj = document.getElementsByTagName('body');
		bodyObj[0].appendChild(ifObj);
		
		var elObj = getStyleObject(arguments[0]);
		var ifObj = getStyleObject(arguments[0]+'_iframe');

		ifObj.width = elWidth;
		ifObj.height = elHeight;
		ifObj.top = newY;
		ifObj.left = newX;
		ifObj.zIndex = elObj.zIndex - 1;
		ifObj.visibility = "visible";
		
	}
	
	stopTime();
}