/* ******************************************************************* */
/*   DOM FUNCTIONS                                                     */
/* ******************************************************************* */
function defined(o) { return (typeof(o)!="undefined"); };
function isArray(o) { return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0]))); };
function isObject(o) { return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName)); };
var DOM = (function() { 
	var dom = {};
	
	// Creat an Element
	dom.createElement = function ( type, attr, cont, html ) {
		var ne = document.createElement( type );
		if (!ne) return false;
			
		for (var a in attr)
			ne[a] = attr[a];
			
		if (typeof(cont) == "string" && !html)
			ne.appendChild( document.createTextNode(cont) );
		else if (typeof(cont) == "string" && html)
			ne.innerHTML = cont;
		else if (typeof(cont) == "object")
			ne.appendChild( cont );
	
		return ne;
	}
	dom.cE= dom.createElement;
	
	dom.getElementsByClass = function(className, tag, node) {
		if(node==null) node = document;
		if(tag==null) tag = '*';
		var arrElements = (tag == "*" && node.all)? node.all : node.getElementsByTagName(tag);
		var arrReturnElements = new Array();
		className = className.replace(/-/g, "\-");
		var oRegExp = new RegExp("(^|\s)" + className + "(\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements)
	}
	
	// Get the position of an element.
	dom.getPos = function(o) {
		var curleft = curtop = curright = curbottom = 0;
		if (o.offsetParent) {
			curleft = o.offsetLeft;
			curtop = o.offsetTop;
			while (o = o.offsetParent) {
				curleft += o.offsetLeft;
				curtop += o.offsetTop;
			}
		} else if (o.x) {
			curleft += obj.x;
			curtop += obj.y;
		}
		
		return {x:curleft,y:curtop};
	}
	
	// Get a parent tag with a given nodename
	dom.getParentByTagName = function(o,tagName) {
		if(o==null) { return null; }
		tagName = tagName.toUpperCase();
		while (o=o.parentNode) {
			if (o.nodeName && tagName==o.nodeName) {
				return o;
			}
		}
		return null;
	};
	
	// Get the outer width in pixels of an object, including borders, padding, and margin
	dom.getOuterWidth = function(o) {
		if (defined(o.offsetWidth)) return o.offsetWidth;
		return null;
	};

	// Get the outer height in pixels of an object, including borders, padding, and margin
	dom.getOuterHeight = function(o) {
		if (defined(o.offsetHeight)) return o.offsetHeight;
		return null;
	};

	// Insert a node after another node.
	dom.insertAfter = function(insert,refNode){
		try {
			if(refNode.nextSibling)
				refNode.parentNode.insertBefore(insert, refNode.nextSibling);
			else
				refNode.parentNode.appendChild(insert);
		} catch(e) {
			refNode.parentNode.appendChild(insert);
		}
	};
	
	dom.isAncestorOf = function(ancestor, o) {
		//Base cases
		if(o == document) return false;
		if(o == ancestor) return true;
		return isAncestorOf(ancestor, o.parentNode);
	}
	
	// Remove a node from its parent
	dom.removeNode = function(o) {
		o = this.$(o);
		if (o!=null && o.parentNode && o.parentNode.removeChild) {
			o.parentNode.removeChild(o);
			return true;
		}
		return false;
	};
	dom.remE = dom.removeNode;

	dom.removeChildren = function(o) {
		if (o.hasChildNodes()) {
			while (o.childNodes.length>=1)	o.removeChild(o.firstChild);       
		}
	}
	
	// Resolve an item, an array of items, or an object of items
	dom.resolve = function() {
		if (typeof(arguments) == "undefined") return false;
		if(arguments.length==0) return false;
		var results = new Array();
		for (var i=0; i<arguments.length; i++) {
			var o = arguments[i];
			if (typeof(o)=='string') {
				if (document.getElementById) {
					o = document.getElementById(o);
				} else if (document.all) { 
					o = document.all[o]; 
				}
				if (arguments.length==1) return o;
				results[results.length] = o;
			} else if (isArray(o)) {
				for (var j=0; j<o.length; j++) { results[results.length] = o[j]; }
			}
			else if (isObject(o)) {
				for (var j in o) { results[results.length] = o[j]; }
			}
			else if (arguments.length==1) {
				return o;
			}
			else {
				results[results.length] = o;
			}
	  }
	  return results;
	};
	
	// set the property of an element or array of elements
	dom.setProperty = function(nodes,propertyName,value) {
		var i,n;
		if(!isArray(nodes) && !isObject(nodes)) { nodes[propertyName]=value; return; }
		if(isArray(nodes)) 	{ 
			for(i=0;i<nodes.length; i++) {
				if(nodes[i]) {
					try{ eval("nodes[i]." + propertyName + "=value;"); } catch(e) {}
				}
			}
			return;
		}
		if(isObject(nodes)) { 
			for(i in nodes) {
				if(nodes[i]) {
					try{ eval("nodes[i]." + propertyName + "=value;"); } catch(e) {}
				}
			}
			return; 
		}
	}
	// set an attribute of an element or array of elements
	dom.setAttribute = function(nodes,propertyName,value) {
		var i,n;
		if(!isArray(nodes) && !isObject(nodes)) { nodes[propertyName]=value; return; }
		if(isArray(nodes)) 	{ 
			for(i=0;i<nodes.length; i++) {
				if(nodes[i]) {
					try{ nodes[i].setAttribute(propertyName,value); } catch(e) {}
				}
			}
			return;
		}
		if(isObject(nodes)) { 
			for(i in nodes) {
				if(nodes[i]) {
					try{ nodes[i].setAttribute(propertyName,value); } catch(e) {}
				}
			}
			return; 
		}
	}
	dom.$ = dom.resolve;
	
	if(window['$'] == undefined){
		window.$=dom.resolve;
	}
	
	return dom;
})();

isAncestorOf = DOM.isAncestorOf;
//findPos = DOM.getPos;