/* Functions to handle browser incompatibilites */

/*
	NOTE: i know this is not good practice,
	but there doesn't seem to be any other 
	way of determining the correct name for 
	the keydown/keypress/onkeydown event
	as addEventListener() is specified as 
	having no return value
*/
if (navigator.userAgent.indexOf("Safari") > 0)
{
  isSafari = true;
  isMoz = false;
  isIE = false;
}
else if (navigator.product == "Gecko")
{
  isSafari = false;
  isMoz = true;
  isIE = false;
}
else
{
  isSafari = false;
  isMoz = false;
  isIE = true;
}

function eventElement(event)
{
  if(isMoz)
  {
    return event.currentTarget;
  }
  else
  {
    return event.srcElement;
  }
}

function getEventTarget(e)
{
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3){ // defeat Safari bug
		targ = targ.parentNode;
	}
	
	return targ;
}

function addKeyListener(element, listener)
{
  if (isSafari)
    element.addEventListener("keydown",listener,false);
  else if (isMoz)
    element.addEventListener("keypress",listener,false);
  else
  {
   // element.attachEvent('onkeydown',listener);
	element.onkeydown = listener;
   }
}

function addListener(element, type, listener)
{
  if(element.addEventListener)
  {
    element.addEventListener(type, listener, false);
  }
  else
  {
    element.attachEvent('on' + type, listener);
  }
}

function removeListener(element, type, listener)
{
  if(element.removeEventListener)
  {
    element.removeEventListener(type, listener, false);
  }
  else
  {
    element.detachEvent('on' + type, listener);
  }
}



// get objects across browsers
function getStyleObj( elem, parent ){
	
	var sRef = getStyleObjRef(elem,parent);
	var objTheObj = eval(sRef);
	
	
	if( objTheObj ){
		return objTheObj;
	}
}

function getStyleObjRef(elem,parent) {  
	if (document.getElementById) {  
		return "document.getElementById('"+elem+"').style";  
	} else if (document.layers) {  
		if (parent) {  
			return "document."+parent+".document."+elem;
		} else {  
			return "document."+elem + ".style";  
		}  
	} else if (document.all) {  
		return "document.all."+elem + ".style";  
	} 
} 
		
function getObj( elem, parent ){
	return eval(getObjRef(elem,parent));	
}
function getObjRef(elem,parent) {  
	if (document.layers) {  
		if (parent) {  
			return "document."+parent+".document."+elem;
		} else {  
			return "document."+elem;  
		}  
	} else if (document.all) {  
		return "document.all."+elem;  
	} else if (document.getElementById) {  
		return "document.getElementById('"+elem+"')";  
	} 
} 


// cancel an event
function cancelEvent(e){
	if(isIE){
		event.returnValue = false;
	} else {
		e.preventDefault();
	}
}

// set height of a DOM object
function set_height( sObjID, iVal ){
	var obj = getObj( sObjID );
	obj.style.height = iVal;
}

// get the effective height of a DOM object
// NOTE: the object must be visible or it 
// returns zero!
function get_height( sObjID ){
	var obj = getObj( sObjID );
	if( obj.offsetHeight ){
		return obj.offsetHeight;
	} else {
		return 0;
	}
}
function getObjHeight( obj ){
	if( obj.offsetHeight ){
		return obj.offsetHeight;
	} else {
		return 0;
	}
}

// get the effective width of a DOM object
// NOTE: the object must be visible or it 
// returns zero!
function get_width( sObjID ){
	var obj = getObj( sObjID );
	if( obj.offsetWidth ){
		return obj.offsetWidth;
	} else {
		return 0;
	}
}
function getObjWidth(obj){
	if( obj.offsetWidth ){
		return obj.offsetWidth;
	} else {
		return 0;
	}
}

// returns the actual x-position of an object
// on the page
function findPosX(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;
}

// returns the actual y-position of an object
// on the page
function findPosY(obj)
{
	var curTop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curTop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curTop += obj.y;
	return curTop;
}

// move an object to the given position
function moveTo(obj,x,y){
	obj.style.top = y + "px";
	obj.style.left = x + "px";
}

// move an object to the left/right/top/bottom of another object
function moveToObjectPos( objMove, objReference, cPos ){
	var refX = findPosX(objReference);
	var refY = findPosY(objReference);
	var sPos = cPos.toUpperCase();
	
	switch( sPos ){
		case "T":
		{
			// TOP - subtract the "move" object height
			refY -= getObjHeight(objMove);
			break;
		}
		case "B":
		{
			// BOTTOM - add on the "reference" object height
			refY += getObjHeight(objReference);
			break;
		}
		case "L":
		{
			// LEFT - subtract the "move" object width
			refX -= getObjWidth(objMove);
			break;
		}
		case "R":
		{
			// RIGHT - add on the "reference" object width
			refX += getObjWidth(objReference);
			break;
		}
	}
	moveTo( objMove, refX, refY );
}


// get height of the browser window / document
function getDocHeight(){
	return getObjHeight(document.body);
}


function addOnLoad( func ){
	if( onloads ){
		onloads[onloads.length] = func;
	}
}



function showHide( elemRef, parent ){
	var objTheObj = getStyleObj( elemRef, parent );    

    if( objTheObj ){
		if( objTheObj.display == "block" ){
			objTheObj.display = "none";
		} else {
			objTheObj.display = "block";       
		}           
	}
}

                        

function forceShowHide( elemRef, parent, bShow ){
	var objTheObj = getStyleObj( elemRef, parent );    
	if( objTheObj ){
		if( bShow ){
			objTheObj.display = "block";
		} else {
			objTheObj.display = "none";
		}
	} else {
		alert( "!objTheObj (" + elemRef + ")" );
	}
}

 

function show( sID ){
	objElem = getStyleObj( sID );
	if( objElem ){
		objElem.visibility = "visible";
	}           
}

 

function hide( sID ){
	objElem = getStyleObj( sID );
	if( objElem ){
		objElem.visibility = "hidden";
	}           
}


function showObj( obj ){
	show( obj.id );
}
function hideObj( obj ){
	hide( obj.id );
}

function expandContract(sName){
	var objLink = document.getElementById(sName + "_link");
	if( objLink.className == "expand" ){
		expand( sName );
	} else if ( objLink.className == "expand_admin" ){
		expandAdmin( sName );
	} else if ( objLink.className == "contract_admin" ){
		contractAdmin( sName );
	} else {
		contract( sName);
	}
}

function expand(sName){
	var objLink = document.getElementById(sName + "_link");
	
	// change the link
	objLink.innerHTML = "Click to hide...";
	objLink.className = "contract";
	
	new Effect.Appear(sName);
}
function expandAdmin(sName){
	var objLink = document.getElementById(sName + "_link");
	
	// change the link
	objLink.innerHTML = 'Admin <img src="/img/hide_admin.png" alt="Click to hide" />';
	objLink.className = "contract_admin";
	
	new Effect.Appear(sName);
}

function contract(sName){
	var objLink = document.getElementById(sName + "_link");
	
	// change the link
	objLink.innerHTML = "Click to expand...";
	objLink.className = "expand";
	
	new Effect.Fade(sName);
	//forceShowHide( sName, null, false );
}
function contractAdmin(sName){
	var objLink = document.getElementById(sName + "_link");
	
	// change the link
	objLink.innerHTML = 'Admin <img src="/img/show_admin.png" alt="Click to show" />';
	objLink.className = "expand_admin";
	
	new Effect.Fade(sName);
}


// Generic window open script
var hWind = null

	function newwin(url,winwidth,winheight){

	if(hWind == null || hWind.closed){
		hWind = window.open(url,'options','resizable=1,scrollbars=1,width='+winwidth+',height='+winheight);
		hWind.focus();
	}else{
		
		hWind.close();
		newwin(url,winwidth,winheight);
		
	}	

}




/*
    Written by Jonathan Snook, http://www.snook.ca/jonathan
    Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

function highlightOnLoad(){
	// get all elements with class highlightOnLoad_info
	var arElems = document.getElementsByClassName("highlightOnLoad_info",document);
	if( arElems.length ){
		for( var i = 0; i < arElems.length; i++ ){
			// highlight each one
			new Effect.Highlight( arElems[i], {startcolor:'#ffDE0'} );
		}
	}
	
	// get all elements with class highlightOnLoad_error
	var arElems = document.getElementsByClassName("highlightOnLoad_error",document);
	if( arElems.length ){
		for( var i = 0; i < arElems.length; i++ ){
			// highlight each one
			new Effect.Highlight( arElems[i], {startcolor:'#ff0000'} );
		}
	}
}


addOnLoad( highlightOnLoad );