/*
	Store layout details for each request globally
*/
var GL_LayoutProps = [];

/*
	Get a handle on the dom object by passing stringId or obj itself 
	(means you can use either reference in parent function)
*/
function GL_GetEl(obj){
	var dElement = (typeof(obj) == 'string') ? document.getElementById(obj) : obj;
	return dElement;
}

/*
	Get the layout properties of dom object relative to a specified parent element
	You can define different layout properties for the same dom object relative to a 
	specified parent node, ie: footer_parent, footer_parent's_parent.
	If you don't specify a parent node, it defaults to the next parent node without an id
	The xPos, yPos, height and width values are both stored in a global layout-properties
	array AND returned by the function
	FunctionArgs[0] = dom obj you want to get properties for (dom,str) | required
	FunctionArgs[1] = relative parentId (str) | optional	
*/
function GL_GetLayoutProps(obj, sParentId, bGetStoredProps){
	var dElement = GL_GetEl(obj);

	if(dElement == null){ 
	return; 
	}
	
	var sPropsKey = (sParentId) ? dElement.id + '_' + sParentId : dElement.id;
	var bIsBodyEl = false; 	
	var dCurrentEl = dElement;
	
	if((GL_LayoutProps[sPropsKey]) && (bGetStoredProps)){
		//alert('get cached props for ' + sPropsKey);
		return GL_LayoutProps[sPropsKey];
	}
	
	var nXPos = dElement.offsetTop; 	var nYPos = dElement.offsetLeft;
	var nWidth = dElement.offsetWidth; 	var nHeight = dElement.offsetHeight;
	
	while((!bIsBodyEl)){ 
		if(dCurrentEl.id == ''){
			break;
		}
		dCurrentEl = dCurrentEl.parentNode;
		bIsBodyEl = (dCurrentEl.id == sParentId);
		nYPos = nYPos + dCurrentEl.offsetLeft;
		nXPos = nXPos + dCurrentEl.offsetTop;
	}

	var oProps = {
					xPos	: nXPos,
					yPos 	: nYPos,
					width 	: nWidth,
					height 	: nHeight
				 }	
				 
	GL_LayoutProps[sPropsKey] = oProps;
	return oProps;
}

/*
	Set the specified layout properties of the dom object and it's JS representation (in GL_LayoutProps)
	FunctionArgs[0] = dom obj you want to change (dom,str) | required
	FunctionArgs[1] = props you want to change (['height','width','xPos','yPos']) | at least one item of [] required
	FunctionArgs[2] = new prop values ({height:10, width:10, xPos:10, yPos:10}) | at least one name/value in {} required
	FunctionArgs[3] = relative parentId used when setting LayoutProps key (str) | optional
*/
function GL_SetLayoutProps(obj, aChangeProps, oNewProps, sParentId){
	var dElement = GL_GetEl(obj);
	var oCurrentProps = GL_GetLayoutProps(obj, sParentId);

	for (i=0; i<aChangeProps.length; i++) {
  		oCurrentProps[aChangeProps[i]] = oNewProps[aChangeProps[i]]
		switch(aChangeProps[i]){
			case 'xPos':
  				dElement.style.top = oNewProps['xPos'] + 'px';
  			break 
			case 'yPos':
  				dElement.style.left = oNewProps['yPos'] + 'px';
  			break
			case 'width':
  				dElement.style.width = oNewProps['width'] + 'px';
  			break
			case 'height':
  				dElement.style.height = oNewProps['height'] + 'px';
  			break  
			default:
			return;
		}
	}
	return;
}


/*
	Convert string value into specified object type
	FunctionArgs[0] = object value (str, int, float, date) | required
	FunctionArgs[1] = type of object you want to convert value to, defaults to str | optional
	
*/
function GL_Convert(oValue, sDataType){
	if(!oValue){
		oValue = '';
	}
	switch(sDataType){
		case 'date':
			// Convert European date into US equivalent for sorting
			var aSplitDate = oValue.split('/')
			var aUSDate = [];
			aUSDate[0] = aSplitDate[1]; // Month
			aUSDate[1] = aSplitDate[0]; // Day
			aUSDate[2] = aSplitDate[2]; // Year
			var sUSDate = aUSDate.join("/");
			
			var myDate = new Date(Date.parse(sUSDate));
			return myDate;
		break;
		case 'int':
			return parseInt(oValue);
		break;
		case 'float':
			return parseFloat(oValue);
		break;
		default:
		return oValue.toString();
	}
}

/*
	Image Preloader Object - monitors when all images are loaded.
	You can add onerror and onabort event handlers if you need to
	FunctionArgs[0] = array of image src's (array) | required
	FunctionArgs[1] = proceeding image path (str) | optional
	FunctionArgs[2] = client locale set dynamically (str) | optional
*/
function GL_ImagePreloader(aImageSrc, sPath){
   	this.nLoaded = 0;
   	this.nProcessed = 0;
	this.aImages = [];
  	this.nImages = aImageSrc.length;
	this.sPath = sPath;
	/*this.sLocale = sLocale;*/
	for(var i=0; i<aImageSrc.length; i++){
    	this.preload(aImageSrc[i]);
	}
}
GL_ImagePreloader.prototype.preload = function(image){
   	var oImage = new Image;
	this.aImages.push(oImage);
   	oImage.onload = GL_ImagePreloader.prototype.onload;
	oImage.oImagePreloader = this;
	oImage.bLoaded = false;
	//alert(this.sPath + this.sLocale + image)
	//oImage.src = this.sPath + this.sLocale + image;
    oImage.src = this.sPath + image;
}
GL_ImagePreloader.prototype.onComplete = function(){
  	this.nProcessed++;
  	if(this.nProcessed == this.nImages){
  		//alert('image loading complete');
   	}
}
GL_ImagePreloader.prototype.onload = function(){
  	this.bLoaded = true;
  	this.oImagePreloader.nLoaded++;
  	this.oImagePreloader.onComplete();
}


/*
	Image Swap Object.
	FunctionArgs[0] = event object | required
	FunctionArgs[1] = image extension with default as .gif (str) | optional
*/
function GL_ImageSwap(oEvent, sImageType){
	var sElementId = (oEvent.srcElement) ? oEvent.srcElement.id : oEvent.target.id;
	var sEventType = oEvent.type;
	var sEvent = (sEventType == 'mouseover') ? '_on' : '' ;
	var dImage = GL_GetEl(sElementId);
	var sImgType = (sImageType) ? sImageType : '.gif';
    dImage.src = sPath + sNavPath  + '/'+ sElementId + sEvent + sImgType;
    //alert(dImage.src)
    //dImage.src = sPath + sLocale + '/' + sElementId + sEvent + sImgType;
}


/*
	Dynamically build an associative array Object.
	FunctionArgs[0] = primary array (arr) | required
	FunctionArgs[1] = key to store new arrays under (str) | optional
	FunctionArgs[2] = new array to add (str) | optional
*/
function GL_setArray(aArray, sKey, aToAdd){
	var sKey = (sKey == '') ? 'UNDEFINED' : sKey;
	if(aArray[sKey] == undefined){
		aArray[sKey] = [];
		aArray["KEYS"].push(sKey);
	}
	aArray[sKey].push(aToAdd);
}


function GL_AttachEvent(dObj, sEvent, oHandler, bUsecapture){
	if(!bUsecapture){ 
		bUsecapture == false; 
	}
	if(window.addEventListener){
		dObj.addEventListener(sEvent, oHandler, bUsecapture);
	} 
	else {
		sIEEvent = 'on' + sEvent;
		dObj.attachEvent(sIEEvent, oHandler);
	}
}