/**************************************************\
*                      DOM                         *
* Author: Andrew Green                             *
* Modified: 3/2/2009                               *
* Description:                                     *
*  Crossbrowser Help with the Document Object Model*
*                                                  *
\**************************************************/

/****************************\
* jslint verified 03/02/2009 *
* http://www.jslint.com/     *
\****************************/

var DOM=
{
	pageLoaded:false
	,
	noRightClick:function(){
		document.onmousedown=function(e){
				e=DOM.event(e);
				if(e.button!=1){
					return false;
				}
			};
		document.oncontextmenu=function(){return false;};	
		
		
	},
	GetElementDocument:function ( element )
	{
		if(element.getElementById){//this is document
			return element;
		}

		return element.ownerDocument || element.document ;
	},
	GetElementWindow:function ( element )
	{
		var doc=DOM.GetElementDocument(element);
		if(doc.parentWindow){
			return doc.parentWindow;
		}
		if(doc.defaultView){
			return doc.defaultView;
		}

	},
	event:function (e) 
	{
		if(e && e.e){
			return e;
		}
		var eventObj={};//create object
		e = (e) ? e : window.event;
		if(!e){
			return;
		}
		eventObj.e=e;
		eventObj.type = e.type?e.type:false;
		eventObj.target = e.target || e.srcElement;
		eventObj.relatedTarget = e.relatedTarget;
		if (e.pageX) {
			eventObj.pageX = e.pageX ;
			eventObj.pageY = e.pageY;
		} else {
			if(document.documentElement && document.documentElement.scrollTop){
				eventObj.pageX = document.documentElement.scrollLeft + e.clientX;
				eventObj.pageY = document.documentElement.scrollTop + e.clientY;
			}else{
				eventObj.pageX = document.body.scrollLeft + e.clientX;
				eventObj.pageY = document.body.scrollTop + e.clientY;
			}
    	}

		if(e.button){
			eventObj.button=e.button;
		}else{
			eventObj.button=e.which;
		}
		eventObj.keyCode = e.keyCode || e.which || 0;
		eventObj.shiftKey = e.shiftKey; eventObj.ctrlKey = e.ctrlKey; eventObj.altKey = e.altKey;
		eventObj.stopPropagation = function(){
			eventObj.e.cancelBubble = true;
			if (eventObj.e.stopPropagation){
				eventObj.e.stopPropagation();
			}
		};
		eventObj.preventDefault=function(){
			if(eventObj.e.preventDefault){
				eventObj.e.preventDefault();
			}
			return false;
		};
	  	return eventObj;
	},
	absoluteOffsetLeft:	function (obj){
		var _abLeft=obj.offsetLeft;
		var _parent=obj;
		while(_parent.offsetParent){
			_abLeft+=_parent.offsetParent.offsetLeft;
			_parent=_parent.offsetParent;
		}	
		return _abLeft;
	},
	absoluteOffsetTop:	function (obj){
		var _abTop=obj.offsetTop;
		var _parent=obj;
		while(_parent.offsetParent){
			_abTop+=_parent.offsetParent.offsetTop;
			_parent=_parent.offsetParent;
		}	
		return _abTop;
	},
	addEvent: function(obj,evt,fn) {
		evt=evt.toLowerCase();
		if(obj.addEvent){
			obj.addEvent(evt,fn);
		}else if(obj.addEventListener){
			obj.addEventListener(evt,fn,false);
		}else if (obj.attachEvent){
			obj.attachEvent('on'+evt,fn);
		}
	},
	removeEvent: function (obj,evt,fn) {
		evt=evt.toLowerCase();
		if(obj.removeEvent){
			obj.removeEvent(evt,fn);
		}else if (obj.removeEventListener){
			obj.removeEventListener(evt,fn,false);
		}else if (obj.detachEvent){
			obj.detachEvent('on'+evt,fn);
		}
	},
	destroyElement: function(element){//ie will not release memory even on page change.
		if(DOM.pageLoaded){//ie causes problem if element is destroyed before page load
			var garbageBin = document.getElementById('IELeakGarbageBin');
			if (!garbageBin) {
				garbageBin = document.createElement('DIV');
				garbageBin.id = 'IELeakGarbageBin';
				garbageBin.style.display = 'none';
				document.body.appendChild(garbageBin);
			}
			//if attached then detach
			if(element.parentNode){
				element.parentNode.removeChild(element);
			}
			// move the element to the garbage bin
			garbageBin.appendChild(element);
			garbageBin.innerHTML = '';
		}else{
			DOM.addEvent(window,'load',function(){
					DOM.pageLoaded=true;
					DOM.destroyElement(element);
				});
		}
			
	},
	createElement: function (elementText,asHtml) {
		if(asHtml){
			var htmlContainer=DOM.createElement('div');
			htmlContainer.innerHTML=elementText;
			var toReturn=htmlContainer.childNodes[0];
			DOM.removeElement(toReturn);
			htmlContainer.innerHTML="ASdf";
			DOM.destroyElement(htmlContainer);

			
			return toReturn;
		}else{
			return document.createElement(elementText);
		}
	},
	createTextNode: function (elementText) {
		return document.createTextNode(elementText);
	},
	wrapElements: function (element,obj){
		if(!obj){
			obj={};
		}
		for(var i=0;i<element.childNodes.length;i++){
			if(element.childNodes[i].tagName){
				var x=0;
				var tagName=element.childNodes[i].tagName;
				
				if(obj[tagName]){
					x=obj[tagName].length;
					obj[tagName][x]={"element":element.childNodes[i]};
				}else{
					obj[tagName]=[];
					obj[tagName][0]={"element":element.childNodes[i]};
				}
				this.wrapElements(element.childNodes[i],obj[tagName][x]);
			}
		}
		return obj;
	},
	removeElement: function (element) {
		if(element.parentNode){
			element.parentNode.removeChild(element);
		}
	},
	prepend : function (element,toElement) {
		if(toElement.childNodes[0]){
			this.insertBefore(element,toElement.childNodes[0]);
		}else{
			toElement.appendChild(element);
		}
	},
	insertBefore: function (element,before) {
		before.parentNode.insertBefore(element, before);
	},
	insertAfter: function (element,after) {
		if(after.nextSibling){
			after.parentNode.insertBefore(element, after.nextSibling);
		}else{
			after.parentNode.appendChild(element);
		}
	},
	setOpacity: function (element,value){

		element.style.opacity = value;// CSS3
		element.style.filter = 'alpha(opacity=' + (value*100 )+ ')';//ie5.5
		element.style.MozOpacity = value;// Gecko
		element.style.KhtmlOpacity = value;// Konquerer and Safari
	},
	getScrollTop: function (_Win)
	{
		if(!_Win){
			_Win=window;
		}
		var _pos;
		if(_Win.document.documentElement && _Win.document.documentElement.scrollTop){
			_pos = _Win.document.documentElement.scrollTop;
		}else if(_Win.document.body && _Win.document.body.scrollTop){
			_pos = _Win.document.body.scrollTop;
		}
			
		if(_pos === undefined){
			 _pos=0;
		}
		return _pos;
	},
	getScrollLeft: function (_Win)
	{
		if(!_Win){
			_Win=window;
		}
		var _pos;
		if(_Win.document.documentElement && _Win.document.documentElement.scrollLeft){
			_pos = _Win.document.documentElement.scrollLeft;
		}else if(_Win.document.body && _Win.document.body.scrollLeft){
			_pos = _Win.document.body.scrollLeft;
		}
			
		if(_pos === undefined){
			_pos=0;
		}
		return _pos;
	},
	getWindowWidth: function (_Win)
	{
		if(!_Win){
			_Win=window;
		}
		var _val;
		if(_Win.document.documentElement && _Win.document.documentElement.clientWidth){
			_val = _Win.document.documentElement.clientWidth;
		}else if(_Win.document.body && _Win.document.body.clientWidth){
			_val = _Win.document.body.clientWidth;
		}
		return _val;
	},
	getWindowHeight: function (_Win)
	{
		if(!_Win){
			_Win=window;
		}
		var _val;
		if(_Win.document.documentElement && _Win.document.documentElement.clientHeight){
			_val = _Win.document.documentElement.clientHeight;
		}else if(_Win.document.body && _Win.document.body.clientHeight){
			_val = _Win.document.body.clientHeight;
		}
		return _val;
	},
	getElementsByClassName: function (strTagName, strClassName,_Win)
	{
		if(!_Win){
			_Win=window;
		}
		var _Doc=_Win.document;
		var arrElements = (strTagName == "*" && _Doc.all)? _Doc.all : _Doc.getElementsByTagName(strTagName);
		var arrReturnElements = [];
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements);
	},
	hasClass:function (el, cls) {
	
		if( !el){
			return 0;
		}
		if(!cls){
			return 0;
		}
	
		var pat = new RegExp("\\b" + cls + "\\b", "i");
	
		return pat.test( el.className );
	},
	addClass:function (el, cls) {
	
		if( !el){
			return 0;
		}
		if(!cls){
			return 0;
		}
	
		if( el.className ){
			el.className = el.className + " " + cls;
		}else{
			el.className = cls;
		}
		return cls;
	},
	delClass:function (el, cls) {
	
		if( !el){
			return 0;
		}
		if(!cls){
			return 0;
		}
	
		var pat1 = new RegExp(  " " + cls + "\\b", "i");
		var pat2 = new RegExp("\\b" + cls +   " ", "i");
		var pat3 = new RegExp("\\b" + cls + "\\b", "i");
	
		if( pat1.test( el.className ) ){
			el.className = el.className.replace(pat1, "");
			return el.className;
		}else if( pat2.test( el.className ) ){
			el.className = el.className.replace(pat2, "");
			return el.className;
		}else if( pat3.test( el.className ) ){
			el.className = el.className.replace(pat3, "");
			return el.className;
		}
	
		return 0;
	}
};

DOM.addEvent(window,'load',function(){
	DOM.pageLoaded=true;
});

function $(id){
	return document.getElementById(id);	
}


