var isIE = document.all ? true : false;

function $(s) { 	return	document.getElementById(s);	}
function getElementByNodeName(s, obj) {
	s = s.toLowerCase();
	obj = (obj==undefined) ? document.body : obj;
	if(obj.childNodes) {
		for(var k=0; k<obj.childNodes.length; k++) {
			var targ = getElementByNodeName(s, obj.childNodes[k]);
			if(targ)	return targ;
		}
	}
	if(obj.nodeName.toLowerCase() == s)
		return obj;
	else	return false;
}

function getImgVers(src, ext) {
	var start = src.lastIndexOf('.');
	return src.substring(0,start)+'.'+ext+src.substring(start);
}

function disableSelect(targ){
	if (typeof targ.onselectstart!="undefined") //IE
			targ.onselectstart=function(){return false;};
	else if (typeof targ.style.MozUserSelect!="undefined") //FF
			targ.style.MozUserSelect="none";
	else // others
			targ.onmousedown=function(){return false;};
	targ.style.cursor = "default"
}

function processParams(url, delim) {
	var ary = url.split(delim!=undefined?delim:'&');
	var returnAry = Array();
	for(var i in ary) {
		if(indexOf(ary, '=') && (typeof ary[i]=='string')) {
			var tmp = ary[i].split('=',2);
			returnAry[tmp[0]] = tmp[1];
		}
	}
	return returnAry;
}

//=============================== event handlers ================================//
var eventHandlers = new Array();
function addEventHandler(obj, eventType, fn) {
	if(!eventHandlers[obj])	eventHandlers[obj] = Array();		// if no other listener is setup yet for this object
	if(!eventHandlers[obj][eventType]) {				// if no other listener for this object of this type is setup yet
		eventHandlers[obj][eventType] = Array();
		if(!obj.eventType)	obj['on'+eventType] = handle;
	}

	// fix for IE
	var indx = indexOf(eventHandlers[obj][eventType], fn);
	if(indx===false || indx==-1) {		// add to array of things to trigger on event
		eventHandlers[obj][eventType][eventHandlers[obj][eventType].length] = fn;
		return eventHandlers[obj][eventType].length-1;
	} else 	return indx;
}
function clearEventHandler(obj, eventType, fn) {
	if(eventHandlers[obj] && eventHandlers[obj][eventType]) {
		if(fn == undefined) {
			eventHandlers[obj][eventType].pop();
		}
		var indx = -1;
		if((typeof fn)=='number')
			indx = fn;
		else	indx = indexOf(eventHandlers[obj][eventType].indexOf, fn);
		if(indx!=-1) {
			delete eventHandlers[obj][eventType][indx];
		}
	}
}
function handle(e) {
	e = e ? e : window.event;
	if(!e)	return;
	
	var obj = e ? e.target : undefined;
	var eventType = e.type;
	var executeOn = new Array();
	if(e.bubbles) {
		while(obj) {							// cycle ancestors
			executeOn[executeOn.length] = obj;
			obj = obj.parentNode;					// get next parent 
		}
		executeOn[executeOn.length] = window;				// always execute on window
	} else 	{
		executeOn[0] = obj;
	}

	var toReturn = false;
	for(var i in executeOn) {
		var obj = executeOn[i];
		if(obj==undefined)	obj = window;
		if(eventHandlers[obj] && eventHandlers[obj][eventType]) {
			for(var i in eventHandlers[obj][eventType]) {		// cycle through possibly multiple events
				var fn = eventHandlers[obj][eventType][i];
				if(obj.fn) 	toReturn = obj.fn(e); 		// execute fn with event as param from object
				else if(fn)	toReturn = fn(e); 		// execute fn with event as param
			}
		}
	}
	return toReturn;
}
function callTest(e){debug(this);alert(this.nodeName);};
//clearHandler(window, 'keypress', callTest); };
//addEventHandler(window, 'click', callTest);

var _cascadeEvents = Array();
function addCascadingEvent(id, fn, pauseTime) {			// execute a function if an event hasn't triggered it (reduce overhead)
	if(!_cascadeEvents[id]) {
		_cascadeEvents[id] = new Object();		// create new object to hold cascade event
	} else if(_cascadeEvents[id].timer) {
		window.clearTimeout(_cascadeEvents[id].timer);	// stop old timer
	}
	_cascadeEvents[id].fn = fn;
	_cascadeEvents[id].timer = setTimeout("execCascadingEvent('"+id+"');", pauseTime);
}
function execCascadingEvent(id) {
	if(_cascadeEvents[id].timer) {
		window.clearTimeout(_cascadeEvents[id].timer);
		_cascadeEvents[id].timer = false;
	}
	_cascadeEvents[id].fn();
}


//=============================== string functions ================================//
function replace(str,find,replacement) {
	if(!str)	return '';
	var strLength = str.length, txtLength = find.length;
	if ((strLength == 0) || (txtLength == 0)) return str;
	if(str.indexOf) {
		var i = str.indexOf(find);
		if ((!i) && (find != str.substring(0,txtLength))) return str;
		if (i == -1) return str;
		var newstr = str.substring(0,i) + replacement;
		if (i+txtLength < strLength)	newstr += replace(str.substring(i+txtLength,strLength),find,replacement);
		return newstr;
	}
}
function string_generator(desired_len, alpha, symbols) {
	var choose_from = '0123456789';
	if(alpha)      choose_from += 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ';
	if(symbols)    choose_from += '!@#$%^&*()_+-=';
	choose_from_len = choose_from.length;

	var str = '';
	for(var z = 0; z < desired_len; z++)
		str  += choose_from[Math.floor(Math.random()*choose_from_len)];
	return str;
}
function addCommas(num) {
	num += '';
	ary = num.split('.');
	x1 = ary[0];
	x2 = ary.length > 1 ? '.' + ary[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) x1 = x1.replace(rgx, '$1' + ',' + '$2');
	return x1 + x2;
}

//=============================== end string functions ================================//

//=============================== div functions ================================//
function removeBlankChildren(rent, identifier) {
	for(var x=0; x<rent.childNodes.length; x++) {
		if(rent.childNodes[x] && rent.childNodes[x].nodeName == '#text' && rent.childNodes[x].innerHTML == undefined) {
			rent.removeChild(rent.childNodes[x]);
		}
		if(rent.childNodes[x] && rent.childNodes[x].nodeName == '#comment') {
			rent.removeChild(rent.childNodes[x]);
		}
	}
	return rent;
}
function remove(obj) {
	if(obj && obj.parentNode) {
		obj.parentNode.removeChild(obj);
		obj=false;
	}
}
function addChild(rent, nodeName, cls, id, innerHTML) {
	var x = document.createElement(nodeName);
	rent.appendChild(x);
	if(id)		x.id = id;
	if(cls) 	x.className = cls;
	if(innerHTML)	x.innerHTML = innerHTML;
	return x;
}
function insertChild(rent, nodeName, cls, id) {
	var x = document.createElement(nodeName);
	if(rent.childNodes)
		rent.insertBefore(x,rent.firstChild);
	else	rent.appendChild(x);
	if(id)	x.id = id;
	if(cls) x.className = cls;
	return x;
}
function addClearDv(to) {
	var clearDv = addChild(to, 'div');
	clearDv.style.clear='both'; 
	clearDv.style.height='0px';
}
function getChildIndex(obj) {
	var children = obj.parentNode.childNodes;
	for(var i=0; i<children.length; i++) {
		if(children[i]==obj)	return i;
	}
	return false;
}

function highlight(obj, rent, highClass) {
	if(!rent)	rent = obj.parentNode;
	if(!highClass)	highClass = 'high';
	for(var i in rent.childNodes) {
		if(rent.childNodes[i].className) rent.childNodes[i].className = rent.childNodes[i].className.replace(highClass,'');
	}
	obj.className = obj.className ? obj.className+' '+highClass : highClass;
}
//=============================== end div functions ================================//

var invisibleDiv = false;
var preloadedImgAry = Array();
function preloadImg(src) {
	if(!invisibleDiv) {
		invisibleDiv = addChild(document.body, 'div');
		invisibleDiv.style.width='0px';
		invisibleDiv.style.height='0px';
		invisibleDiv.style.overflow='hidden';
		invisibleDiv.style.visiblity='hidden';
	}
	if(preloadedImgAry.indexOf(src)==-1) {			// make sure it's not already loaded
		var im = addChild(invisibleDiv,'img');
		im.src = src;
		preloadedImgAry[preloadedImgAry.length] = src;
	}

}

function setDefaultText(inp) {
	if(!inp.alt)	inp.alt = inp.value;
	inp.onfocus = function() { 	if(this.value==this.alt)	this.value = ''; 	this.className=this.className.replace(/def/g,''); 			};
	inp.onblur = function() { 	if((!this.value) || (this.value==this.alt)) {	this.value = this.alt;	this.className = this.className + ' def';	}	};	
	inp.onfocus();	// run new focus command
}
/*
if(!Array.indexOf){
	Array.prototype.indexOf = function(obj){
		for(var i=0; i<this.length; i++) if(this[i]==obj) return i;
		return -1;
	};
}
*/
function indexOf(ary, obj){
	for(var i=0; i<ary.length; i++) 
		if(ary[i]==obj) return i;
	return -1;
}

function is_numeric(str) {
	return !isNaN(str);
}
function is_array(obj) {
	return typeof(obj)=='object'&&(obj instanceof Array);
}
function in_array(haystack, needle) {
	if(haystack) for(var i in haystack) {
		if(haystack[i]==needle)	return true;
	}
	return false;
}
function indexOf(haystack, needle) {
	var k = 0;
	if(haystack) for(var i in haystack) {
		if(haystack[i]==needle)	return k;
		k++;
	}
	return false;
}
function unique_array(ary) {
	var newAry = Array();
	for(var i=0; i<ary.length; i++) {
		if(newAry.indexOf(ary[i])==-1)	newAry[newAry.length]=ary[i];
	}
	return newAry;
};
/* obstrucated */
function parseXML(XML,Tag_Label){
	if(typeof(Tag_Label)=='string')Tag_Label=new Array(Tag_Label);
	//XML=replace(XML,'\n',"\r");
	if(XML) {
		XML = XML.replace(/\n/g, '');
		XML = XML.replace(/\t/g, '');
	}
	var tmp=new Array();
	iterations=0;
	for(var index in Tag_Label){
		var aN=Tag_Label[index];aN=replace(aN,'|',"->");
		var regEx=new RegExp("<"+aN+".*?>(.*?)</"+aN+">","i");
		if(XML){
			tmp=XML.match(regEx);
			if(tmp){
				XML=(tmp[2]&&(tmp[2]!=undefined))?tmp[2]:tmp[1];
				iterations++;
			}
		}
	}
	return(iterations==Tag_Label.length)?XML:'';
};function eatXML(XML,Tag_Label){
	if(XML) { XML = XML.replace(/\n/g, ''); XML = XML.replace(/\t/g, ''); }if(typeof(Tag_Label)=='string')Tag_Label=new Array(Tag_Label);unsafe=Array("\n","  ");XML=XML.replace(unsafe,"");for(var index in Tag_Label){var aN=Tag_Label[index];var regEx=new RegExp("<"+aN+".*?>(.*?)</"+aN+">","i");XML=XML.replace(regEx,'');}return XML;};

function ltrim(toTrim,ac){if(!ac||ac==undefined)ac="\\s"
				;ac=ac||"\\s";
				return toTrim.replace(new RegExp("^["+ac+"]+","g"),"");};
function rtrim(toTrim,ac){if(!ac||ac==undefined)ac="\\s";
	return toTrim.replace(new RegExp("["+ac+"]+$","g"),"");};
function trim(toTrim,ac){return rtrim(ltrim(toTrim,ac),ac);};
function ParseFirstXML(XML){var regEx=new RegExp("<(.*?)>(.*?)</\\1>");var tmp=XML.match(regEx);var ary=new Array();if(tmp){tmp.shift();return tmp;}else return false;};

function getElementByTagName(searchIn, tag) {
	if(searchIn.nodeName.toLowerCase() == tag.toLowerCase())	return searchIn;

	if(searchIn.childNodes) {
		for(var i in searchIn.childNodes) {
			var result  = getElementByTagName(searchIn.childNodes[i], tag);
			if(result)	return result;
		}
	}
	return false;
}
function load(url,params,pZ, callbackFn, callbackObj, debug){
	if(pZ==undefined)	pZ=true;

	if(url.indexOf('?')== -1)	url=url+'?';
	var paramStr='';
	if(params&&(params!=undefined)){
		for(var i in params){
			paramStr+=i+'='+params[i]+'&';
		}
	}
	if(typeof window.ActiveXObject!='undefined')
		requestObj=new ActiveXObject("Microsoft.XMLHTTP");
	else 	requestObj=new XMLHttpRequest();
	if(url.indexOf('?')== -1) 
		url=url+'?_inline';
	else 	url=rtrim(url,'&')+'&_inline';

	if(pZ==undefined) pZ=true;
	requestObj.open(pZ?'POST':"GET",url,callbackFn?true:false);
	if(callbackFn) {
		//requestObj.onreadystatechange = callbackFn;
		requestObj.onreadystatechange = function(){
			if (requestObj.readyState == 4) {
				if(callbackObj)
					callbackObj[callbackFn](requestObj.responseText);
				else	callbackFn(requestObj.responseText);
			}
		};
	}
	requestObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	requestObj.send(pZ?paramStr:null);
	return requestObj.responseText;
}

function Left(obj) {
	if(obj) {
		var x = eval(obj).offsetLeft;
		elem = eval(obj).offsetParent;
		while (elem != null) {
			x += elem.offsetLeft;
			elem = elem.offsetParent;
		}
		return x;
	}
}
function Top(obj) {
	y = eval(obj).offsetTop;
	elem = eval(obj).offsetParent;
	while (elem != null) {
		y += parseFloat(elem.offsetTop);
		elem = elem.offsetParent;
	}
	return y;
}
function getScrollY() {	return isIE ? document.documentElement.scrollTop  : window.pageYOffset; }
function getScrollX() {	return isIE ? document.documentElement.scrollLeft : window.pageXOffset; }

function getWinWidth() {	return isIE ? (document.documentElement.clientWidth?document.documentElement.clientWidth:document.body.clientWidth)	: window.innerWidth; }
function getWinHeight() {	return isIE ? (document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight)	: window.innerHeight; }
function getFullWinWidth() {	
	return Math.max(
	        document.body.scrollWidth, document.documentElement.scrollWidth,
		document.body.offsetWidth, document.documentElement.offsetWidth,
		document.body.clientWidth, document.documentElement.clientWidth
			);
}
function getFullWinHeight() {	
	return Math.max(
	        document.body.scrollHeight, document.documentElement.scrollHeight,
		document.body.offsetHeight, document.documentElement.offsetHeight,
		document.body.clientHeight, document.documentElement.clientHeight
			);
}
function getScrollHeight() {	return isIE ? document.documentElement.scrollTop			: window.pageYOffset; }

function scrollDiv(dv, x, y) {
	if(x!=undefined)	dv.scrollLeft = x;
	if(y!=undefined)	dv.scrollTop = y;
}

//document.onmousemove = mouseMove; 
var mousePos;
function mouseMove(e){ 
	e = e || window.event; 
	mousePos = mouseCoords(e); 
} 
addEventHandler(document, 'mousemove', mouseMove);
addEventHandler(window, 'mousemove', mouseMove);

function mouseCoords(evt){ 
	if(evt.pageX || evt.pageY)	
		return {x:evt.pageX, y:evt.pageY}; 
	else {
		if(evt && document.body)
			return { 
				x:evt.clientX + document.body.scrollLeft - document.body.clientLeft, 
				y:evt.clientY + document.body.scrollTop  - document.body.clientTop 
			}; 
	}
} 
function isOver(obj, x, y) {	// see if cursor is over an object
	if(!mousePos)	return false;
	if(x==undefined)	x = mousePos['x'];
	if(y==undefined)	y = mousePos['y'];

	if((x>=(Left(obj)-getScrollX())) && (y>=(Top(obj)-getScrollY())) && (x<=(Left(obj)+obj.offsetWidth-getScrollX())) && (y<=(Top(obj)+obj.offsetHeight-getScrollY())) ) 
		return true;
	else	return false;
}
function isAncestor(targ, ancestor) {
	while(targ.parentNode) {
		if(targ==ancestor)
			return true
		else 	targ = targ.parentNode;
	}
	return false;
}

function parseNumber(tmp_num) {
	if(tmp_num=='')	return 0;
	if(tmp_num == undefined) return 0;
	var num = tmp_num.toString();
	num = num.toString();
	var str = '';
	if(num.indexOf) 
		while(num.indexOf(',') != -1)
			num = num.replace(',', '');
	return parseFloat(num);
}

function debug(elem) {
	var properties = "<HEAD><link href='/styles/sections.css' rel='stylesheet' type='text/css'></HEAD><BODY><TABLE WIDTH='100%'><TR><TH>Element<TH>Document<TH>Window</TR><TD VALIGn=TOP>";
	for(var e in elem) 
		properties += '<LI>'+e + (elem[e]?": " + elem[e]:'')+"</LI>\n";
	properties += "<TD VALIGn=TOP>";
	for(var e in document) 
		properties += '<LI>'+e+(document.e ? ' = '+document.e : '')+"</LI>\n";
	properties += "<TD VALIGn=TOP>";
	for(e in window) 
		properties += '<LI>'+e;
	properties += "</TR></TABLE></BODY>";

	var newwindow=window.open('','name','height=700,width=750,scrollbars=yes,scroll=yes');
	var tmp = newwindow.document;
	tmp.write(properties);
}
function trace(msg, clear, dv) {
	if(!dv)		dv = $('debug');
	if(clear)	dv.innerHTML = '';
	dv.innerHTML = msg+"\n"+dv.innerHTML;
}

var months = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var daysOfWeek = new Array('Sun','Mon','Tues','Wed','Thu','Fri','Sat','Sun');

function onlyNumbers(targ) {
	var newNum = '';
	var nums = '1234567890';
	for(var x=0; x<targ.value.length; x++) 
		if(nums.indexOf(targ.value[x])!=-1)	newNum += targ.value[x];
	if(newNum!=targ.value)	targ.value = newNum;
}

function setMaxChars(inp, max, msgDv) {
	var room = max - inp.value.length;
	if(room<0)	inp.value = inp.value.substring(0, max);
	var room = max - inp.value.length;
	msgDv.innerHTML = room+' character'+((room==1)?'':'s')+' remaining.';
}
function isEmailLegit(str) {
	var regX  = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
	return regX.test(str);
}
function setFocusClass(obj) {
	obj.onblur = function() {	this.className = this.className.replace(/focus/ig, '');	};
	obj.onfocus = function() {	this.className = this.className+ ' focus'; };
	if(obj.className==undefined)	obj.className = '';
	obj.onfocus();
}
function setHoverClass(obj) {
	obj.onmouseout = function() {	this.className = this.className.replace(/hover/ig, '');	};
	obj.onmouseover = function() {	this.className = this.className+ ' hover'; };
	if(obj.className==undefined)	obj.className = '';
	obj.onmouseover();
}
var _preloadedRollOver = Array();
function processRollOvers() {
	for(var i in _preloadedRollOver) {
		setRollOver($(i), _preloadedRollOver[i]);
	}
}
function setRollOver(obj, rollSrc) {
	if(!obj)	return false;

	obj['targ'] = obj;
	while(obj.targ && obj.targ.nodeName.toLowerCase()!='img')	// find first embedded img
		obj.targ = obj.targ.firstChild;
	if(!obj.targ)	return false;					// no img found

	_preloadedRollOver[obj.id] = new Image();
	_preloadedRollOver[obj.id].src = rollSrc;

	var orig = obj.targ.src;
	obj.onmouseover = function() {	this.targ.src = _preloadedRollOver[this.id].src;	};
	obj.onmouseout = function() {	this.targ.src = orig;				};
	obj.targ.onload = function() { };
}

