LUNATIC.util.Dom=new function(){
	this.get=function(el){
		if(typeof el=='string'){
			el=document.getElementById(el);
		}
		return el;
	};
	this.getStyle=function(el,property){
		var value=null;
		var dv=document.defaultView;
		el=this.get(el);
		if(property=='opacity'&&el.filters){
			value=1;
			try{
				value=el.filters.item('DXImageTransform.Microsoft.Alpha').opacity/100;}
			catch(e){
				try{value=el.filters.item('alpha').opacity/100;}
				catch(e){}
			}
		}else if(el.style[property]){
			value=el.style[property];
		}else if(el.currentStyle&&el.currentStyle[property]){
			value=el.currentStyle[property];
		}else if(dv&&dv.getComputedStyle){
			var converted='';
			for(i=0,len=property.length;i<len;++i){
				if(property.charAt(i)==property.charAt(i).toUpperCase()){
					converted=converted+'-'+property.charAt(i).toLowerCase();
				}else{
					converted=converted+property.charAt(i);
				}
			}
			if(dv.getComputedStyle(el,'').getPropertyValue(converted)){
				value=dv.getComputedStyle(el,'').getPropertyValue(converted);
			}
		}
		return value;
	};
	this.setStyle=function(el,property,val){
		el=this.get(el);
		switch(property){
			case'opacity':
				if(el.filters){
					el.style.filter='alpha(opacity='+val*100+')';
					if(!el.currentStyle.hasLayout){
						el.style.zoom=1;
					}
				}else{
					el.style.opacity=val;
					el.style['-moz-opacity']=val;
					el.style['-khtml-opacity']=val;
				}
				break;
			default:
				el.style[property]=val;
		}
	};
	this.getXY=function(el){
		el=this.get(el);
		if(el.parentNode===null||this.getStyle(el,'display')=='none'){
			return false;
		}
		var parent=null;
		var pos=[];
		var box;
		if(el.getBoundingClientRect){
			box=el.getBoundingClientRect();
			var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
			var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;
			return[box.left+scrollLeft,box.top+scrollTop];
		}else if(document.getBoxObjectFor){
			box=document.getBoxObjectFor(el);
			pos=[box.x,box.y];
		}else{
			pos=[el.offsetLeft,el.offsetTop];
			parent=el.offsetParent;
			if(parent!=el){
				while(parent){
					pos[0]+=parent.offsetLeft;
					pos[1]+=parent.offsetTop;
					parent=parent.offsetParent;
				}
			}
			var ua=navigator.userAgent.toLowerCase();
			if(ua.indexOf('opera')!=-1||(ua.indexOf('safari')!=-1&&this.getStyle(el,'position')=='absolute')){
				pos[0]-=document.body.offsetLeft;
				pos[1]-=document.body.offsetTop;
			}
		}
		if(el.parentNode){
			parent=el.parentNode;
		}else{
			parent=null;
		}
		while(parent&&parent.tagName!='BODY'&&parent.tagName!='HTML'){
			pos[0]-=parent.scrollLeft;
			pos[1]-=parent.scrollTop;
			if(parent.parentNode){
				parent=parent.parentNode;
			}else{
				parent=null;
			}
		}
		return pos;
	};
	this.getX=function(el){
		return this.getXY(el)[0];
	};
	this.getY=function(el){
		return this.getXY(el)[1];
	};
	this.setXY=function(el,pos,noRetry){
		el=this.get(el);
		var pageXY=LUNATIC.util.Dom.getXY(el);
		if(pageXY===false){
			return false;
		}
		if(this.getStyle(el,'position')=='static'){
			this.setStyle(el,'position','relative');
		}
		var delta=[parseInt(LUNATIC.util.Dom.getStyle(el,'left'),10),parseInt(LUNATIC.util.Dom.getStyle(el,'top'),10)];
		if(isNaN(delta[0])){
			delta[0]=0;
		}
		if(isNaN(delta[1])){
			delta[1]=0;
		}
		if(pos[0]!==null){
			el.style.left=pos[0]-pageXY[0]+delta[0]+'px';
		}
		if(pos[1]!==null){
			el.style.top=pos[1]-pageXY[1]+delta[1]+'px';
		}
		var newXY=this.getXY(el);
		if(!noRetry&&(newXY[0]!=pos[0]||newXY[1]!=pos[1])){
			this.setXY(el,pos,true);
		}
		return true;
	};
	this.setX=function(el,x){
		return this.setXY(el,[x,null]);
	};
	this.setY=function(el,y){
		return this.setXY(el,[null,y]);
	};
	this.getRegion=function(el){
		el=this.get(el);
		return new LUNATIC.util.Region.getRegion(el);
	};
	this.getClientWidth=function(){
		return(document.documentElement.offsetWidth||document.body.offsetWidth);
	};
	this.getClientHeight=function(){
		return(self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight);
	};
	this.getElementsByClassName=function(className,tag,root){
		root=root||document;
		tag=tag||'*';
		var nodes=[];
		var elements=root.getElementsByTagName(tag);
		var re=new RegExp('(^|\\s)'+className+'(\\s|$)');
		for(var i=0,len=elements.length;i<len;++i){
			if(re.test(elements[i]['className'])){
				nodes[nodes.length]=elements[i];
			}
		}
		return nodes;
	};
	this.hasClass=function(el,className){
		el=this.get(el);
		var re=new RegExp('(^|\\s)'+className+'(\\s|$)');
		return re.test(el['className']);
	};
	this.addClass=function(el,className){
		if(this.hasClass(el,className)){
			return false;
		}
		el=this.get(el);
		el['className']=[el['className'],className].join(' ');
		return true;
	};
	this.removeClass=function(el,className){
		if(!this.hasClass(el,className)){
			return false;
		}
		el=this.get(el);
		var re=new RegExp('(^|\\s)'+className+'(\\s|$)');
		var c=el['className'];
		el['className']=c.replace(re,'');
		return true;
	};
};
LUNATIC.util.Region=function(t,r,b,l){
	this.top=t;
	this.right=r;
	this.bottom=b;
	this.left=l;
};
LUNATIC.util.Region.prototype.contains=function(region){
	return(region.left>=this.left&&region.right<=this.right&&region.top>=this.top&&region.bottom<=this.bottom);
};
LUNATIC.util.Region.prototype.getArea=function(){
	return((this.bottom-this.top)*(this.right-this.left));
};
LUNATIC.util.Region.prototype.intersect=function(region){
	var t=Math.max(this.top,region.top);
	var r=Math.min(this.right,region.right);
	var b=Math.min(this.bottom,region.bottom);
	var l=Math.max(this.left,region.left);
	if(b>=t&&r>=l){
		return new LUNATIC.util.Region(t,r,b,l);
	}else{
		return null;
	}
};
LUNATIC.util.Region.prototype.union=function(region){
	var t=Math.min(this.top,region.top);
	var r=Math.max(this.right,region.right);
	var b=Math.max(this.bottom,region.bottom);
	var l=Math.min(this.left,region.left);
	return new LUNATIC.util.Region(t,r,b,l);
};
LUNATIC.util.Region.prototype.toString=function(){
	return("Region {"+"  t: "+this.top+", r: "+this.right+", b: "+this.bottom+", l: "+this.left+"}");
};
LUNATIC.util.Region.getRegion=function(el){
	var p=LUNATIC.util.Dom.getXY(el);
	var t=p[1];
	var r=p[0]+el.offsetWidth;
	var b=p[1]+el.offsetHeight;
	var l=p[0];
	return new LUNATIC.util.Region(t,r,b,l);
};
LUNATIC.util.Point=function(x,y){
	this.x=x;
	this.y=y;
	this.top=y;
	this.right=x;
	this.bottom=y;
	this.left=x;
};
LUNATIC.util.Point.prototype=new LUNATIC.util.Region();