//get element by id
function DH_$id(id){
	if(typeof(id)=="string"&&id.length>0){var e=document.getElementById(id);}
	if(e&&e.id){return e;}
	return false;
}
//get element by unique class name
function DH_$cn(cn){
	if(typeof(cn)!="string"){return false;}
	var nodes=get_offspring(document);
	var found=[];
	for(var i=0;i<nodes.length;i++){if(nodes[i].className==cn){found[found.length]=nodes[i];}}
	if(found.length==1){
		return found[0];
	}else if(found.length>1){
		return found;
	}
	return false;
}
//get element by unique tag name
function DH_$tn(tn){
	if(typeof(tn)!="string"){return false;}
	return document.getElementsByTagName(tn);
}
//default identifier method
function DH_$(s){
	return DH_$id(s);
}
//get all child (grandchild, etc.) nodes as an array
function DH_get_offspring(e){
	if(!e||!e.hasChildNodes||!e.hasChildNodes()){return false;}
	var nodes=e.childNodes;
	var arr=[];
	for(var i=0;i<nodes.length;i++){arr.push(nodes[i]);var c=DH_get_offspring(nodes[i]);if(c){arr=arr.concat(c);}}
	return arr;
}
//dom event handling
function DH_append_event(e,event,f){
	if(!e||typeof(event)!="string"||typeof(f)!="function"){return false;}
	if(window.addEventListener){
		e.addEventListener(event,f,false);
	}else if(window.attachEvent){
		e.attachEvent("on"+event,f);
	}
}
//dom event removal
function DH_remove_event(e,event,f){
	if(!e||typeof(event)!="string"||typeof(f)!="function"){return false;}
	if(window.removeEventListener){
		e.removeEventListener(event,f,false);
	}else if(window.detachEvent){
		e.detachEvent("on"+event,f);
	}
}
//dom elements
function DH_insert_element(pe,type,attributes,styles){
	if(typeof(type)!="string"){return false;}
	var e=document.createElement(type);
	if(attributes&&typeof(attributes)=="object"){for(var k in attributes){e[k]=attributes[k];}}
	if(styles&&typeof(styles)=="object"){for(var k in styles){e.style[k]=styles[k];}}
	if(pe){pe.appendChild(e);}
	return e;
}
//dom element removal
function DH_delete_element(e){
	if(!e){return false;}
	e.parentNode.removeChild(e);
	return true;
}
//dom element stripping
function DH_strip_element(e){
	if(!e){return false;}
	if(!e.hasChildNodes||!e.hasChildNodes()){return;}
	DH_delete_element(e.childNodes[0]);
	DH_strip_element(e);
	return true;
}
//copy an element
function DH_copy_element(e,pe,attributes,styles,deep){
	if(!e){return false;}
	var ee=e.cloneNode(deep);
	if(attributes&&typeof(attributes)=="object"){for(var k in attributes){ee[k]=attributes[k];}}
	if(styles&&typeof(styles)=="object"){for(var k in styles){ee.style[k]=styles[k];}}
	if(!attributes||typeof(attributes)!="object"){ee.id+="-copy";}
	if(deep){
		var offspring=DH_get_offspring(ee);
		if(offspring){for(var i=0;i<offspring.length;i++){if(!offspring[i].id||offspring[i].id==""){continue;}offspring[i].id+="-copy";}}
	}
	if(pe){pe.appendChild(ee);}
	return ee;
}
//swap one element for another
function DH_swap_element(e,ee){
	if(!e||!ee){return false;}
	var pe=ee.parentNode;
	var pse=ee.nextSibling;
	e.parentNode.replaceChild(ee,e);
	if(pse){pe.insertBefore(e,pse);}else{pe.appendChild(e);}
	return true;
}
//change an element's positioning
function DH_position_element(e,type){
	if(!e||(type!="absolute"&&type!="relative")){return false;}
	if(type=="absolute"){
		if(!DH_set_styles(e,{left:_x(e,1)+"px",top:_y(e,1)+"px",position:"absolute"})){return false;}
	}else if(type=="relative"){
		var x=_x(e);
		var y=_y(e);
		if(!DH_set_styles(e,{position:"relative",top:0,left:0})||!set_styles(e,{left:(x-_x(e))+"px",top:(y-_y(e))+"px"})){return false;}
	}
	return true;
}
//hide an element
function DH_hide_element(e){
	if(!e||!e.style){return false;}
	e.style.visibility="hidden";
	e.odisplay=e.style.display;
	e.style.display="none";
	return true;
}
//show an element
function DH_show_element(e){
	if(!e||!e.style){return false;}
	e.style.visibility="visible";
	e.style.display=e.odisplay||"block";
	return true;
}
//dom text
function DH_insert_text(pe,s){
	var e=document.createTextNode(s);
	if(pe){pe.appendChild(e);}
	return e;
}
//dom text removal
function DH_delete_text(pe){
	if(!pe||!pe.hasChildNodes||!pe.hasChildNodes()){return false;}
	var nodes=pe.childNodes;
	for(var i=0;i<nodes.length;i++){if(nodes[i].nodeType==3){delete_element(nodes[i]);delete_text(pe);return;}}
	return true;
}
//dom text swapping
function DH_change_text(pe,s){
	if(!pe){return false;}
	DH_delete_text(pe);
	DH_insert_text(pe,s);
	return true;
}
//cursor tracking
function DH_track_cursor(ev){
	var x,y;
	ev=ev||window.event;
	if(ev.pageX&&ev.pageY){
		cx=ev.pageX;
		cy=ev.pageY;
	}else if(ev.clientX&&ev.clientY){
		cx=ev.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
		cy=ev.clientY+document.body.scrollTop+document.documentElement.scrollTop;
	}
	return {x:x,y:y};
}
//object cloning
function DH_clone(o){
	if(typeof(o)!="object"){return o;}
	var oo={};
	for(var k in o){oo[k]=DH_clone(o[k]);}
	return oo;
}
//element horizontal positioning
function DH__x(e,d){
	if(!e){return false;}
	d=d||1000000;
	var x=0;
	var dd=0;
	while(e.offsetParent&&dd<d){
		x+=e.offsetLeft;
		e=e.offsetParent;
		dd++;
	}
	return x;
}
//element vertical positioning
function DH__y(e,d){
	if(!e){return false;}
	d=d||1000000;
	var y=0;
	var dd=0;
	while(e.offsetParent&&dd<d){
		y+=e.offsetTop;
		e=e.offsetParent;
		dd++;
	}
	return y;
}
//element width
function DH__w(e){
	if(!e){return false;}
	return e.offsetWidth;
}
//element height
function DH__h(e){
	if(!e){return false;}
	return e.offsetHeight;
}
//element opacity
function DH__a(e){
	if(!e){return false;}
	if(e.style.opacity&&e.style.opacity!=""){
		return parseFloat(e.style.opacity);
	}else if(e.style.filter&&e.style.filter!=""){
		return parseFloat(e.style.filter.substring(e.style.filter.search(/=/)+1,e.style.filter.search(/\)/)))/100;
	}else{
		return 1;
	}
}
//other element property
function DH__(e,property){
	if(!e){return false;}
	//if(property=="width"){return e.offsetWidth;}
	//if(property=="height"){return e.offsetHeight;}
	//if(property=="left"){return e.offsetLeft;}
	//if(property=="top"){return e.offsetTop;}
	if(property=="opacity"){return DH__a(e);}
	if(typeof(e.style[property])=="undefined"){return false;}
	return parseFloat(e.style[property])||0;
}
//style an element
function DH_set_styles(e,styles){
	if(!e||!e.style||typeof(styles)!="object"){return false;}
	for(var k in styles){e.style[k]=styles[k];if(k=="opacity"){e.style.filter="alpha(opacity="+Math.round(styles[k]*100)+")";if(styles[k]<=.01){e.style.visibility="hidden";}else{e.style.visibility="visible";}}}
	return true;
}
//window scroll distances
function DH_window_scroll(){
	var sx=0;var sy=0;
	if(window.scrollX||window.scrollY){
		sx = window.scrollX;
		sy = window.scrollY;
	}else if(window.pageXOffset||window.pageYOffset){
		sx=window.pageXOffset;
		sy=window.pageYOffset;
	}else if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)){
		sx=document.documentElement.scrollLeft;
		sy=document.documentElement.scrollTop;
	}else if(document.body&&(document.body.scrollLeft||document.body.scrollTop)){
		sx=document.body.scrollLeft;
		sy=document.body.scrollTop;
	}
	return {x:sx,y:sy};
}
//window inner dimensions
function DH_window_inner_size(){
	var w=0;var h=0;
	if(window.innerWidth&&window.innerHeight){
		w=window.innerWidth;
		h=window.innerHeight;
	}else if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight){
		w=document.documentElement.clientWidth;
		h=document.documentElement.clientHeight;
	}else if(document.body){
		w=document.body.clientWidth;
		h=document.body.clientHeight;
	}
	return {width:w,height:h};
}
//window outer dimensions
function DH_window_outer_size(){
	var w=0;var h=0;var ow=0;var oh=0;
	var wis=DH_window_inner_size();
	w=wis.width;
	h=wis.height;
	window.resizeTo(w+10,h+10);
	wis=DH_window_inner_size();
	ow=(w+10)-wis.width;
	oh=(h+10)-wis.height;
	window.resizeTo(w+ow,h+oh);
	return {width:ow,height:oh};
}
//ajax handler
var ajaxs=[];
function DH_Ajax(user_functions){
	this.user_functions=user_functions||null;
	this.method="GET";
	this.errors=0;
	this.debugging=false;
	this.raw=false;
	this.req=null;
	this.n=ajaxs.length;
	ajaxs[this.n]=this;
	this.request=function(n,url,f){
		var self=ajaxs[n];
		if(!self||typeof(url)!="string"){ajaxs[n]=null;return false;}
		self.url=url;
		self.f=f||null;
		if(self.url.search(/u\=/)==-1){
			if(self.url.search(/\?/)!=-1){self.url+="&";}else{self.url+="?"}
			var d=new Date();
			self.url+="u="+d.getTime();
		}
		if(!self.req){
			var reqs=[function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new ActiveXObject("Msxml3.XMLHTTP");},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];
			for(var i=0;i<reqs.length;i++){
				try{self.req=reqs[i]();}catch(e){continue;}break;
			}
		}
		if(!self.req||!self.req.open){self.error(n,"Could not create request object.");return;}
		self.req.open(self.method,self.url,true);
		if(!self.req){self.error(n,"Could not create request object.");return;}
		self.req.onreadystatechange=function(){
			if(self.req.readyState!=4){return;}
			if(self.req.status<200||self.req.status>=300||!self.req.responseXML||self.req.responseXML===""){
				self.error(n,"Invalid result returned.");
				return;
			}else{
				if(self.raw){
					self.f(self.req.responseXML);
				}else{
					var obj=self.parse(self.n,self.req.responseXML);
					self.f(obj);
				}
			}
		};
		if(self.req.readyState==4){return;}
		try{self.req.send(null);}catch(e){self.error(n,e);}
		if(self.user_functions&&self.user_functions["request"]){self.user_functions["request"]();}
	};
	this.abort=function(n){
		var self=ajaxs[n];
		if(!self){return false;}
		if(self.req){
			self.req.onreadystatechange=function(){};
			self.req.abort();
			self.req=null;
			self.error(n,"File request aborted.",true);
		}
		if(self.user_functions&&self.user_functions["abort"]){self.user_functions["abort"]();}
	};
	this.parse=function(n,node){
		var self=ajaxs[n];
		if(!self){return false;}
		if(node.nodeType==7){return;}
		if (node.nodeType==3||node.nodeType==4){
			if(node.nodeValue.match(/[^\x00-\x20]/)==null){return;}
			return node.nodeValue;
		}
		var o;
		if(node.attributes&&node.attributes.length){
			o={};
			for(var i=0;i<node.attributes.length;i++){
				var key=node.attributes[i].nodeName;
				if(typeof(key)!="string"){continue;}
				var val=node.attributes[i].nodeValue;
				if(!val){continue;}
				if(!o[key]){
					o[key]=val;
				}else if(typeof(o[key])=="string"){
					o[key]=[o[key],val];
				}else{
					o[key][o[key].length]=val;
				}
			}
		}
		if(node.childNodes&&node.childNodes.length){
			var textonly=true;
			if(o){textonly=false;}
			for(var i=0;i<node.childNodes.length&&textonly;i++){
				var ntype=node.childNodes[i].nodeType;
				if(node.childNodes[i].nodeType==3||node.childNodes[i].nodeType==4){continue;}
				textonly=false;
			}
			if(textonly){
				o="";
				for(var i=0;i<node.childNodes.length;i++){
					o+=node.childNodes[i].nodeValue;
				}
			}else{
				if(!o){o={};}
				for(var i=0;i<node.childNodes.length;i++){
					var key=node.childNodes[i].nodeName;
					if(typeof(key)!="string"){continue;}
					var val=self.parse(n,node.childNodes[i]);
					if(!val){continue;}
					if(!o[key]){
						o[key]=val;
					}else if(typeof(o[key])=="string"){
						o[key]=[o[key],val];
					}else{
						o[key][o[key].length]=val;
					}
				}
			}
		}
		return o;
	};
	this.error=function(n,message,stop){
		var self=ajaxs[n];
		if(!self){return false;}
		if(self.debugging){alert("Error: "+message);}
		self.abort(n);
		if(self.errors<2&&!stop){
			if(self.debugging){alert("Retrying request...");}
			self.request(n,self.url,self.f,self.structure);
		}
		self.errors++;
		if(self.user_functions&&self.user_functions["error"]){self.user_functions["error"]("Error: "+message);}
	};
}
//set a cookie
function DH_set_cookie(name,value,days){
	var expires="";
	if(days){
		var date=new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		expires="; expires="+date.toGMTString();
	}
	var domain=window.location.host.replace(/www\./,"");
	document.cookie=name+"="+value+expires+"; path=/; "+domain;
}
//get a cookie
function DH_fetch_cookie(name){
	var s=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(s)==0){
			return c.substring(s.length,c.length);
		}
	}
	return null;
}
//delete a cookie
function DH_delete_cookie(name){
	DH_set_cookie(name,"",-1);
}