////////////////////////////////////////////////////////
//Global utility variables 
////////////////////////////////////////////////////////



//Browser utilities

	
{
	// convert all characters to lowercase to simplify testing
	var agt=navigator.userAgent.toLowerCase();

	var isKonqueror 	= (agt.indexOf('konqueror')!=-1);
	var isOpera 		= (agt.indexOf('opera')!=-1);
	var isSafari 		= (agt.indexOf('safari')!=-1);
	var isGecko 		= (agt.indexOf('gecko')!=-1);
	var isIE 			= (agt.indexOf('msie')!=-1) 
						   && ( agt.indexOf("msie 5.5")!=-1 
							 || agt.indexOf("msie 6.")!=-1 
							 || agt.indexOf("msie 7.")!=-1
						      );

					  

	var isUnsupported   = (!isGecko && !isIE && !isKonqueror && !isOpera && !isSafari);
	
	var isDOM = false;
	
	var isDOM = (
					isGecko
					|| isKonqueror
					|| isSafari
					|| isOpera
					|| isIE 
				);
					
	var isMac 	= (agt.indexOf("mac")!=-1);
}


				

//Abstract wierd stylistic conventions
visible = "visible";
hidden = "hidden";



/*
 popup
 
 Displays a new browser window with the specified URL.
 Using this function ensures that the new window is 
 always in focus on the OS.
*/
var myWin;
function popup(URL, Target, Options) {
	
	if ((! myWin) || (myWin.closed)) {
		myWin = window.open(URL, Target, Options);
	}  else	{
		if (isIE) {
			myWin.navigate(URL);
		} else {
			myWin.location=URL;
		}
	}
	
	myWin.focus();
	
	//return false so that href click is not followed!
	return false;
}


function getNodePosition(node) {
	var ret=new Array(0);
	var objLeft,objTop,objParent;
	
	// Find the element's offsetTop and offsetLeft relative to the BODY tag.
	objLeft   = node.offsetLeft;
	objTop    = node.offsetTop;
	objParent = node.offsetParent;
	while (objParent.tagName.toUpperCase() != "BODY") {
		objLeft  += objParent.offsetLeft;
		objTop   += objParent.offsetTop;
		objParent = objParent.offsetParent;
	}
	ret["left"] = objLeft;
	ret["top"] = objTop;
	
	return ret;
}		


	
function hideElement(elementType,elementOver) {
	var elementCol = document.getElementsByTagName(elementType);
	var curObjPos;
	
	for (i = 0; i < elementCol.length; i++) {
		obj = elementCol[i];
		if (! obj || ! obj.offsetParent)
			continue;
		
		curObjPos = getNodePosition(obj);
		

		if ((elementOver.offsetLeft > curObjPos["left"] + obj.offsetWidth) ||
			(curObjPos["left"] > elementOver.offsetLeft + elementOver.offsetWidth));
		else if ((elementOver.offsetTop > curObjPos["top"] + obj.offsetHeight) ||
				 (curObjPos["top"] > elementOver.offsetTop + elementOver.offsetHeight));
		else
			obj.style.visibility = "hidden";
	}
}

function showElement(elementType) {
	var elementCol = document.getElementsByTagName(elementType);
	for (i = 0; i < elementCol.length; i++) {
		obj = elementCol[i];
		if (! obj || ! obj.offsetParent)
			continue;
		obj.style.visibility = "";
	}
}



/*************************************************************

EVENT LISTENERS FOR HOTLY CONTESTED Events

**************************************************************/
//EventListener Array
global_event_listeners = new Array();

/***************
* Popular Events
****************/
EVENT_TYPE_ONLOAD = "onload";
EVENT_TYPE_ONMOUSEMOVE = "onmousemove";
EVENT_TYPE_ONMOUSEUP = "onmouseup";
EVENT_TYPE_ONMOUSEDOWN = "onmousedown";

EVENT_TYPE_ADJUST = /^on/;

			
//registerEvent Listeners to be called later
function registerEventListener(eventListener) {
	global_event_listeners[global_event_listeners.length] = eventListener;
	if (window.addEventListener) {
		//remove leading 'on' from eventType
		eventListener.eventType = eventListener.eventType.replace(EVENT_TYPE_ADJUST,'');
		if (eventListener.eventTarget) eventListener.eventTarget.addEventListener(eventListener.eventType,eventListener.functionPointer,true);
	} else if (window.attachEvent) 	{
		if (eventListener.eventTarget) eventListener.eventTarget.attachEvent(eventListener.eventType,eventListener.functionPointer,false);
	}
}

// Helper EventListener Object
function eventListener(eventTarget,eventType,functionPointer) {
	this.eventTarget = eventTarget;
	this.eventType = eventType;
	this.functionPointer = functionPointer;
}

// make sure that we have an event object to pass around
function normalizeEvent(event) {
	if (window.event) {event = window.event};
	return event;
}

// return the srcElement of the event
function getEventSource(event) {
	if (window.event) {
		// this works on internet explorer only!
		return window.event.srcElement;
	} else {
		return event.currentTarget;
	}
}