/* =====================================================================
									 						 
 * ===================================================================== */

/* === TEST JAVASCRIPT SUPPORT === */
var DOM = !!(document.getElementById && document.getElementsByTagName); /* Basic W3C DOM Support */
var advDOM = !!(DOM && document.createElement); /* More Advanced W3C DOM Support */


/* === DEBUGING HELPERS === */
var debug = (getURLVars()['debug'] != null);
function dalert(msg) {
	if (debug) alert(msg);
}




/* === EVENT HANDLING (via http://www.scottandrew.com/weblog/articles/cbs-events) === */
function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r = elm.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}
function removeEvent(elm, evType, fn, useCapture) {
	if (elm.removeEventListener) {
		elm.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.detachEvent) {
		var r = elm.detachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

/* === CLASSNAME FUNCTIONS === */
String.prototype.hasClass = function(cls) {
	return new RegExp('(^| )'+cls+'( |$)').test(this);
};
String.prototype.addClass = function(cls) {
	if (this == '') return cls;
	if (this.hasClass(cls)) return this;
	return this+" "+cls;
};
String.prototype.removeClass = function(cls) {
	return this.replace(new RegExp('(^| )'+cls+'( |$)'), '');
};
function getElementsByClassName(node, cls, tag) {
	if (!DOM) return [];
	var i, elem, elems = node.getElementsByTagName( (tag != null ? tag : '*') ), results = [];
	for (i=0; elem = elems[i]; i++) if (elem.className.hasClass(cls)) results.push(elem);
	return results;
}


/* === URL/PATH/HISTORY INFORMATION/MANIPULATION === */
function getDirs(path) { // returns an array of directory hierarchy
	var folders = path.split('/');
	if (folders[0] == "") folders.shift(); // remove empty first element
	if (re.index.test(folders[folders.length-1])) folders[folders.length-1] = '';
	return folders;
}
function getReferringPage() {
	if (document.referrer) return document.referrer;
	else if (window.opener) return window.opener.location;
	else return '';
}
function getURLVars() {
	var url = document.URL; //used document.URL instead of location because URL is returned as a string, location as an object
	if (!url || url.indexOf('?') < 0) return {};
	var pairs, i, v, vars = {};
	pairs = url.replace(/&(amp;)?/, '&amp;').substring(url.lastIndexOf('?')+1).split('&amp;'); //account for & and &amp; delimeters
	for (i=0; i<pairs.length; i++) {
		v = pairs[i].split('=');
		vars[v[0]] = unescape(v[1]);
	}
	return vars;
}

/* === COOKIE MANAGEMENT (via http://www.quirksmode.org/js/cookies.html) === */
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	} else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}
function eraseCookie(name)
{
	createCookie(name,"",-1);
}

function popup(url, s) {
	if (!url) return true;
	if (window.opener) window.location = url; // if already in a popup just change location
	else window.open(url,'popup'+(new Date().getSeconds()), (s && popups[s]) ? popups[s] : popups.normal);
	return false;
}


function getLabel(field) {
	var i, labels = document.getElementsByTagName("label");
	for (i=0; i<labels.length; i++) {
		if (labels[i].htmlFor == field.id) return labels[i];
	}
	return null;
}