/************************************************** 
*  Common functionality to be available globally. *
***************************************************/


/*
* To trim white space from either end of a string.
*/
String.prototype.trim = function () {
    return this.replace(
        /^\s*(\S*(\s+\S+)*)\s*$/, "$1"); 
}; 


/* 
* Example use:
*	var template = '<table border="{border}">' +
*		'<tr><th>Last</th><td>{last}</td></tr>' +
*		'<tr><th>First</th><td>{first}</td></tr>' +
*		'</table>';
*		
*	var data = {
*		first: "Carl", 
*		last: "Hollywood", 
*		border: 2
*	};
*
*	mydiv.innerHTML = template.supplant(data);
*/
String.prototype.supplant = function (o) { 
    return this.replace(/{([^{}]*)}/g, 
        function (a, b) {  
            var r = o[b];
            return typeof r === 'string' ? 
                r : a; 
        }
    ); 
};


/*
* Used just like document.getElementsByTagName('tag'); Returns all elements with a given
* class name. 
*/
document.getElementsByClassName = function (className) { 
    var results = []; 
    walkTheDOM(document.body, function (node) { 
        var a, c = node.className, i; 
        if (c) { 
            a = c.split(' '); 
            for (i = 0; i < a.length; i += 1) { 
                if (a[i] === className) { 
                    results.push(node); 
                    break; 
                } 
            } 
        } 
    }); 
    return results; 
};


/*
* Custom addEvent function that supports multiple architectures.
*/
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) { // W3C
		obj.addEventListener( type, fn, false ); // false for bubble up architecture
	}
	else if (obj.attachEvent) { // IE
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); };
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
	else { // This one should always work
		obj["on"+type] = fn; 
	}

	EventCache.add(obj, type, fn);
}
/*
* Custom removeEvent function that supports multiple architectures.
*/
function removeEvent( obj, type, fn ) {
	if (obj.removeEventListener) { // W3C
		obj.removeEventListener( type, fn, false );
	}
	else if (obj.detachEvent) { // IE
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
	else {
		obj["on"+type] = null; 
	}

	EventCache.remove(obj, type);
}
/*
* Event cache to keep an eye on what events are currently present.
*/
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		remove : function (node, sEventName) {
			for(i = 0; i < listEvents.length; i += 1) {
				if (listEvents[i][0] === node && listEvents[i][1] === sEventName) {
					listEvents[i] = null;
					listEvents.splice(i, 1);
				}
			}
		},
		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]);
				}
				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;
			}
		}
	};
}();
addEvent(window,'unload',EventCache.flush);


/*
* Function used to recursively go through all elements in the DOM below a given element
* and call a given function passing it each element.
*/
function walkTheDOM(node, func) {
	func(node); 
	node = node.firstChild; 
	while (node) { 
		walkTheDOM(node, func); 
		node = node.nextSibling; 
	} 
}

/*
* Get a cookie by it's name
*/
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));
}
/*
* Set a cookie. name and value are the least required variables here.
*/
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+"="+escape(value) +
		((expires) ? ";expires="+expires_date.toGMTString() : "") + 
		((path) ? ";path=" + path : "") +
		((domain) ? ";domain=" + domain : "") +
		((secure) ? ";secure" : "");
}
/*
* Delete a cookie. name is the least required variable here.
*/
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";
	}
}


/*
* Get current style attribute value for a given element.
*/
function getStyle(node,styleName) {
	if (typeof(node) === 'string') {
		node = document.getElementById(node);
	}

	if (!node) {
		return null;
	}
	else if (node.style[styleName]) { // inline styles
		return node.style[styleName];
	}
	else if (node.currentStyle) { // IE 
		return node.currentStyle[styleName];
	}
	else if (document.defaultView) { // W3C 
		return document.defaultView.getComputedStyle(node, null).getPropertyValue(styleName);
	}

	return undefined;
}

function findPosLeft(obj) {
		var curleft = 0;
		if(obj.offsetParent)
			while(1) 
			{
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
			}
		else if(obj.x)
			curleft += obj.x;
		return curleft;
	}

function findPosTop(obj) {
	var curtop = 0;
	if(obj.offsetParent)
		while(1)
		{
		curtop += obj.offsetTop;
		if(!obj.offsetParent)
			break;
		obj = obj.offsetParent;
		}
	else if(obj.y)
		curtop += obj.y;
	return curtop;
}

function uploadCompleted()
{
	location.reload();
}

