/////////////////////////////////////////////////////////////////////
//	DESC:	UtilityFunctions.js contains commonly used js functions.
//	
//	FUNCS:	
//			createAjax()
//			createAjaxObject()
//			createHttpRequest()
//			createDateTimeStamp()
//			
//			loadScripts(urls)
//			loadStyles(urls)
//			loadImages(urls)
//			loadPage(domID, url, bustCache)
//			handleLoadPage(pageRequest, domID, url)
//			
//			jah(url, target)
//			jahDone(target)
//			
//			addEvent(element, eventType, func, useCapture)
//			getEventSrc(e)
//			addLoadEvent(func)
//			EventCache.() // listEvents ; add ; flush
//			
//			handleExceptions(msg, url, line)
//			debug(msg)
//			
//			getCookie(name)
//			setCookie(name, value, expires, path, domain, secure)
//			deleteCookie(name, path, domain)
//			
//			trimStr(stringToTrim)
//			ltrimStr(stringToTrim)
//			rtrimStr(stringToTrim)
//			padZeros(objNumber, intSize)
//			
///////////////////////////////////////////////////////////////////// 


// Create Functions /////////////////////////////////////////////////


// Creates a cross browser HTTP request.
function createAjax() {
	try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
	try { return new XMLHttpRequest();                   } catch(e) {}
	throw('Failed to create HttpRequest object');
}

// Creates a cross browser HTTP request with content type set to xml.
function createAjaxObject(){
	var httpRequest = false;
	if (window.XMLHttpRequest) {
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType)
			httpRequest.overrideMimeType('text/xml');
	}
	else if (window.ActiveXObject) { // if IE
		try {httpRequest = new ActiveXObject("Msxml2.XMLHTTP");} 
		catch(e) {
			try {httpRequest = new ActiveXObject("Microsoft.XMLHTTP");}
			catch(e){}
		}
	}
	return httpRequest;
}

// Creates a cross browser HTTP request.
function createHttpRequest() {
	try { return new XMLHttpRequest();                   } catch(e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
	throw('Failed to create HttpRequest object');
}

// Creates a date/time string in a timestamp format.
function createDateTimeStamp() {
	try {
		var now = new Date();
		var returnTimeStamp = '';	
		returnTimeStamp += now.getFullYear() + '-' + padZeros(now.getMonth() + 1, 2) + '-' + padZeros(now.getDate(), 2) + ' ' +
			padZeros(now.getHours(), 2) + ':' + padZeros(now.getMinutes(), 2) + ':' + padZeros(now.getSeconds(), 2);
		return returnTimeStamp;	
	}
	catch(e) {throw('Failed to create DateTimeStamp');}
}


// Dynamic Load Functions ///////////////////////////////////////////


// Collection of currently loaded objects.
var loadedObjects = '';

// Loads script files into the currently loaded document.
function loadScripts(urls) {
	for (var i = 0; i < urls.length; i++) {
		var fileRef = document.createElement('script');
		fileRef.setAttribute("type", "text/javascript");
		fileRef.setAttribute("src", urls[i]);
		if (typeof fileRef != "undefined") {
			if (loadedObjects.indexOf("[" + urls[i] + "]") == -1) {
				document.getElementsByTagName("head")[0].appendChild(fileRef);
				loadedObjects += "[" + urls[i] + "]";
			}
		}
	}
}

// Loads stylesheet files into the currently loaded document.
function loadStyles(urls) {
	for (var i = 0; i < urls.length; i++) {
		var fileRef = document.createElement('link');
		fileRef.setAttribute("rel", "stylesheet");
		fileRef.setAttribute("type", "text/css");
		fileRef.setAttribute("href", urls[i]);
		if (typeof fileRef != "undefined") {
			if (loadedObjects.indexOf("[" + urls[i] + "]") == -1) {
				document.getElementsByTagName("head")[0].appendChild(fileRef);
				loadedObjects += "[" + urls[i] + "]";
			}
		}
	}
}

// Loads image files into the currently loaded 
// document under the specified parent element.
function loadImages(domID, urls) {
	var imgContainer = document.getElementById(domID);
	if (!imgContainer) {
		imgContainer = document.createElement('div');
		imgContainer.setAttribute("id", domID);
		imgContainer.setAttribute("name", domID);
		document.body.appendChild(imgContainer);
	}			
	for (var i = 0; i < urls.length; i++) {
		var tagRef = document.createElement('img');
		tagRef.setAttribute("src", urls[i]);
		imgContainer.appendChild(tagRef);
	}
}

// Loads the specified url into the currently loaded 
// document under the specified parent element.
function loadPage(domID, url, bustCache) {
	var pageRequest = createAjaxObject();
	var friendlyUrl = url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/");
	pageRequest.onreadystatechange = function(){handleLoadPage(pageRequest, domID, url)};
	var bustCacheParm = (friendlyUrl.indexOf("?") != -1) ? "&" + new Date().getTime() : "?" + new Date().getTime();
	document.getElementById(domID).innerHTML = 'Loading, please wait...';
	pageRequest.open('GET', friendlyUrl + bustCacheParm, true);
	pageRequest.send(null);
}

// Callback function for the loadPage() function.
function handleLoadPage(pageRequest, domID, url) {
	if (pageRequest.readyState == 4 && (pageRequest.status == 200 || window.location.href.indexOf("http") == -1)) {
		document.getElementById(domID).innerHTML = pageRequest.responseText;
	}
}


// QUICK AJAX FUNCTIONS /////////////////////////////////////////////


// Loads the specified url into the currently loaded
// document under the specified parent element.
function jah(url, target) {
	document.getElementById(target).innerText = 'sending...';
	request = createAjax();
	request.onreadystatechange = function() {jahDone(target);}
	request.open("GET", url, true);
	request.send(null);
}

// Callback function for the jah() function.
function jahDone(target) {
	if (request.readyState == 4) {
		if (request.status == 200) {
			results = request.responseText;
			document.getElementById(target).innerHTML = results;
		}
		else {
			document.getElementById(target).innerHTML = 'jah error:\n' + request.statusText;
		}
	}
}


// DOM EVENT FUNCTIONS //////////////////////////////////////////////


// Adds an event & event handler to the currently loaded document.
function addLoadListener(func) {
	try {
			if (typeof window.addEventListener != 'undefined') {
				window.addEventListener('load', func, false);}
			else if (typeof document.addEventListener != 'undefined') {
				document.addEventListener('load', func, false);}
			else if (typeof window.attachEvent != 'undefined') {
				window.attachEvent('onload', func);}
			else {
				var oldFunc = window.onload;
				if (typeof window.onload != 'function') {
					window.onload = func;}
				else {
					window.onload = function() {
					oldFunc();
					func();}}}}
	catch(e) {
			alert('addLoadListener() failed.');}
}

// Adds an event & event handler to the currently loaded document.
function addEvent(element, eventType, func, useCapture) {
	if (element.addEventListener) { 
		element.addEventListener(eventType, func, useCapture); 
		return true; 
	}
	else if (element.attachEvent) { 
		var r = element.attachEvent('on' + eventType, func); 
		EventCache.add(element, eventType, func);
		return r; 
	}
	else {
		element['on' + eventType] = func;
	}
}

// Retreives the source of the specified event.
function getEventSrc(e) {
	if (!e) 
		e = window.event;
	if (e.originalTarget)
		return e.originalTarget;
	else if (e.srcElement)
		return e.srcElement;
}

// Adds the load event & event handler to the current document.
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} 
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

// Function to handle the cache for events.
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler, bCapture){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				/* From this point on we need the event names to be prefixed with 'on" */
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

// Ensures the events are properly released when the document is unloaded.
addEvent(window, 'unload', EventCache.flush, false);


// Error & Debug Functions //////////////////////////////////////////


// Handles client side javascript exceptions.
function handleExceptions(msg, url, line) {
	var errorString = "JavaScript Error Occured\n\n";
	errorString += "Message: \n" + msg + "\n\n";
	errorString += "Url: \n" + url + "\n\n";
	errorString += "Line: \n" + line;
	alert(errorString);	
	return true;
}
//window.onerror = handleExceptions;

// Displays messages in a debug window.
function debug(msg) {
	if ((debugWin == null) || (debugWin.closed)) {
		debugWin = window.open("", "debugconsole", "scrollbars=yes,resizable=yes,height=700,width=400");
		debugWin.document.open("text/html", "replace");
	}
	debugWin.document.writeln('<br/>' + msg);
	debugWin.scrollTo(0, 10000);
	debugWin.focus();
}
var debugWin = null;


// Cookie Functions /////////////////////////////////////////////////


// Retreives the value of a cookie.
function getCookie(name) {
	var start = document.cookie.indexOf(name + "=");
	var len = start + name.length + 1;
	if ((!start) && (name != document.cookie.substring(0, name.length))) {
		return null;
	}
	if (start == -1) 
		return null;
	var end = document.cookie.indexOf(';', len);
	if (end == -1) 
		end = document.cookie.length;
	return unescape(document.cookie.substring(len, end));
}

// Sets the value of a cookie.
function setCookie(name, value, expires, path, domain, secure) {
    var today = new Date();
    today.setTime(today.getTime());
    if (expires) {
		expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date(today.getTime() + (expires));
    document.cookie = name+'='+unescape(value) +
		((expires) ? ';expires='+expires_date.toGMTString() : '') + //expires.toGMTString()
		((path) ? ';path=' + path : '') +
		((domain) ? ';domain=' + domain : '') +
		((secure) ? ';secure' : '');
}

// Deletes a cookie.
function deleteCookie(name, path, domain) {
    if (getCookie(name)) 
		document.cookie = name + '=' +
			((path) ? ';path=' + path : '') +
			((domain) ? ';domain=' + domain : '') +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}


// String Functions /////////////////////////////////////////////////


// Trims spaces from the ends of a string.
function trimStr(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

// Trims spaces from left side of string.
function ltrimStr(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}

// Trims spaces from right side of string.
function rtrimStr(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}

// Pads a string with '0's.
function padZeros(objNumber, intSize) {

	var strNumber = String(objNumber);
	var intLengthOfStringNumber = strNumber.length;
	var returnString = strNumber;
	for(x = intSize; x > intLengthOfStringNumber; x--) {
		returnString = '0' + returnString;
	}
	return returnString;
}
