/**
 * @required: Schematic
**/

Schematic.Dom = function() {

	if (!Schematic.Flag.W3) {
		return;
	}

	return {
		
		addClass : function(e, elClass) {
			if (!(new RegExp(elClass, "i").test(e.className))) {
				e.className = e.className + ((e.className.length > 0) ? " " : "") + elClass;
			}
		},
		
		removeClass : function(e, elClass) {
			e.className = e.className.replace(new RegExp((elClass + "\s?"), "i"), "").replace(/^\s?|\s?$/g, "");
			if (e.className === "") {
				e.removeAttribute("class");
			}
		},
		
		replaceClass : function(e, elClass, elNewClass) {
			e.className = e.className.replace(elClass, elNewClass);
		},
		
		hasClass : function(e, elClass) {
			return new RegExp("(?:^|\\s+)" + elClass + "(?:\\s+|$)").test(e.className);
		},
		
		getById : function() {
			var elements = [], element;
			for (var i = 0, j = arguments.length; i < j; i++) {
				element = arguments[i];
				if (typeof element === "string") {
					element = document.getElementById(element);
					if (arguments.length == 1 && element) {
						return element;
					}
					if(element) {
						elements.push(element);
					}
				}
			}
			if (elements.length) {
				return elements;
			} else {
				return false;
			}
		},
		
		getByClass : function (elClass, elScope, elTag) {
			if (typeof elScope === "undefined") {
				elScope = document;
			}
			if (typeof elTag === "undefined") {
				elTag = "*";
			}
			if (document.getElementsByClassName) {
				return elScope.getElementsByClassName(elClass);
			}
			var els = (elTag === "*" && elScope.all) ? elScope.all : elScope.getElementsByTagName(elTag),
			    elArray = [], regExArray = [],
			    e, _match, i, k, l;
			if (typeof elClass === "object") {
				for (i = 0; i < elClass.length; i++) {
					regExArray.push(new RegExp("(^|\\s)" + elClass[i].replace(/\-/g, "\\-") + "(\\s|$)"));
				}
			} else {
				regExArray.push(new RegExp("(^|\\s)" + elClass.replace(/\-/g, "\\-") + "(\\s|$)"));
			}
			for (i = 0; i < els.length; i++) {
				e = els[i]; _match = true;
				for (k = 0, l = regExArray.length; k < l; k++) {
					if (!regExArray[k].test(e.className)) {
						_match = false;
						break;
					}
				}
				if (_match) {
					elArray.push(e);
				}
			}
			return (elArray);
		},
		
		getByTag : function(elTag, elScope) {
			if (typeof elScope !== "object") {
				elScope = this.getById(elScope) || document;
			}
			return elScope.getElementsByTagName(elTag);
		},
		
		getStyle : function (el, cssProp){
			if (typeof el === "undefined") {
				return;
			}
			if (document.defaultView && document.defaultView.getComputedStyle) {
				return document.defaultView.getComputedStyle(el, "").getPropertyValue(cssProp) || "";
			}
			else if (el.currentStyle) {
				cssProp = cssProp.replace(/-(w)/g, function (match, p) {
					return p.toUpperCase();
				});
				return el.currentStyle[cssProp] || "";
			}
		},
		
		stripWhitespace : function(el, recurse) {
			if (typeof el === "undefined") {
				el = document;
				recurse = true;
			}
			var i, j, n;			
			for (i = 0; i < el.childNodes.length; i++) {
				n = el.childNodes[i];
				if (n.nodeType == 3 && !(/\S/.test(n.nodeValue))) {
					el.removeChild(n);
				}
			}
			if (recurse) {
				for (j = 0; j < el.childNodes.length; j++) {
					this.stripWhitespace(el.childNodes[j], true);
				}
			}
		},
		
		removeChildNodes : function(el) {
			while (el.hasChildNodes()) {
				el.removeChild(el.childNodes[el.childNodes.length -1]);
			}
		}
		
	};
	
}();