if(!document.sophiUtils){
	document.sophiUtils=true;

//	/* create Array.pull if it does not exist */
//	if(!Array.pull){
//		Array.prototype.pull=function(){
//			var result=this[this.length-1];
//			delete(this[this.length-1]);
//			this.length=this.length-1;
//			return result;
//		};
//	}

//	if(!Array.push){
//		Array.prototype.push=function(x){
//			this[this.length]=x;
//			return this.length;
//		}
//	}

	/* create document.getChildren - retrieves an array of all dom elements that are children of specified object */
	if(!document.getChildren){
		document.getChildren=function(x){
			retval=new Array();
			retval.push(x);
			if(x.childNodes.length>0){
				for(var jk=0;jk<x.childNodes.length;jk++){
					if(x.childNodes[jk].nodeType==1){
						retval=retval.concat(document.getChildren(x.childNodes[jk]));
					}
				}
			}
			return retval;
		};
	}

	var loadFuncs=new Array();
	var loadArgs=new Array();

	/* function to call all stored onLoad functions */
	function onLoad(){
		var func;
		var args;
		for(var jk=0;jk<loadFuncs.length;jk++){
			func=undefined;
			args=undefined;

			func=loadFuncs[jk];
			args=loadArts[jk];
			if(typeof(func)=='string'){
				eval(func);
			} else {
				//if args is a string, pass it directly to func
				if(typeof(args)=='string'){
					func(args);
				} else {
					if(args.length>6){
						var strArgs='';
						var addComma=false;
						for(var jka=0;jka<args.length;jka++){
							if(addComma){
								strArgs=strArgs+',';
							}
							addComma=true;
							if(typeof(args[jka])=='string'){
								strArgs=strArgs+"'"+args[jka]+"'";
							} else {
								strArgs=strArgs+args[jka];
							}
						}
						eval(func+'('+strArgs+')');
					} else {
						switch(args.length){
							case 0:
								func();
								break;
							case 1:
								func(args[0]);
								break;
							case 2:
								func(args[0],args[1]);
								break;
							case 3:
								func(args[0],args[1],args[2]);
								break;

							case 4:
								func(args[0],args[1],args[2],args[3]);
								break;

							case 5:
								func(args[0],args[1],args[2],args[3],args[4]);
								break;

							case 6:
								func(args[0],args[1],args[2],args[3],args[4],args[5]);
								break;

							default:
								func(args);
						}
					}
				}
			}
		}
	}

	/**
		function to register an onLoad function
			func - the function, or stringName of a function you would like run upon page load
			args - an array of arguments to be passed to func
	*/
	function registerLoad(func,args){
		loadFuncs[loadFuncs.length]=func;
		loadArgs[loadArgs.length]=args;
	}

	function addLoadEvent(func) {
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = func;
		} else {
			window.onload = function() {
				oldonload();
				func();
			}
		}
	}

	//gets the attribute of an Object regardless of how the attribute is stored
	function getAtt(obj,att){
		if(obj[att]){
			return obj[att];
		} else {
			var ret=undefined;
			if(obj.getAttribute){
				ret=obj.getAttribute(att);
			}
			if(ret==undefined && obj.attributes){
				for(var jk=0;jk<obj.attributes.length;jk++){
					if(obj.attributes[jk].nodeName==att){
						ret=obj.attributes[jk].nodeValue;
						break;
					}
				}
			}
			if(ret!=undefined){
				obj[att]=ret;
			}
			return ret;
		}
	}

	//performs func on all children of the specified object which match the specified class
	function attachToClass(obj,classNm, func){
		if(obj==undefined){ return; }
		if(classNm==undefined){ return; }
		if(func==undefined){ return; }

		if(obj.className==classNm){
			func(obj);
		}

		for(var jk=0;jk<obj.childNodes.length;jk++){
			attachToClass(obj.childNodes[jk],classNm,func);
		}
	}

	//finds the position of obj on the page
	//www.quirksmode.org
	function findPos(obj) {
		var curleft = curtop = 0;
		if (obj.offsetParent) {
			curleft = obj.offsetLeft;
			curtop = obj.offsetTop;
			while (obj = obj.offsetParent) {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			}
		}
		return {x:curleft,y:curtop};
	}

}