/*
DOMhelp
written by Chris Heilmann,
extended from developers at H&H
*/
DOMhelp = {
	debugWindowId: 'DOMhelpdebug',
	init: function() {
		if (!document.getElementById || !document.createTextNode) { return; }
	},
	lastSibling: function(node) {
		var tempObj = node.parentNode.lastChild;
		while (tempObj.nodeType != 1 && tempObj.previousSibling != null) {
			tempObj = tempObj.previousSibling;
		}
		return (tempObj.nodeType == 1) ? tempObj : false;
	},
	firstSibling: function(node) {
		var tempObj = node.parentNode.firstChild;
		while (tempObj.nodeType != 1 && tempObj.nextSibling != null) {
			tempObj = tempObj.nextSibling;
		}
		return (tempObj.nodeType == 1) ? tempObj : false;
	},
	getText: function(node) {
		if (!node.hasChildNodes()) { return false; }
		var reg = /^\s+$/;
		var tempObj = node.firstChild;
		while (tempObj.nodeType != 3 && tempObj.nextSibling != null || reg.test(tempObj.nodeValue)) {
			tempObj = tempObj.nextSibling;
		}
		return tempObj.nodeType == 3 ? tempObj.nodeValue : false;
	},
	setText: function(node, txt) {
		if (!node.hasChildNodes()) { return false; }
		var reg = /^\s+$/;
		var tempObj = node.firstChild;
		while (tempObj.nodeType != 3 && tempObj.nextSibling != null || reg.test(tempObj.nodeValue)) {
			tempObj = tempObj.nextSibling;
		}
		if (tempObj.nodeType == 3) { tempObj.nodeValue = txt } else { return false; }
	},
	createLink: function(to, txt) {
		var tempObj = document.createElement('a');
		tempObj.appendChild(document.createTextNode(txt));
		tempObj.setAttribute('href', to);
		return tempObj;
	},
	createTextElm: function(elm, txt) {
		var tempObj = document.createElement(elm);
		tempObj.appendChild(document.createTextNode(txt));
		return tempObj;
	},
	closestSibling: function(node, direction) {
		//direction: 1 = next Sibling; -1 = previous sibling
		var tempObj;
		if (direction == -1 && node.previousSibling != null) {
			tempObj = node.previousSibling;
			while (tempObj.nodeType != 1 && tempObj.previousSibling != null) {
				tempObj = tempObj.previousSibling;
			}
		} else if (direction == 1 && node.nextSibling != null) {
			tempObj = node.nextSibling;
			while (tempObj.nodeType != 1 && tempObj.nextSibling != null) {
				tempObj = tempObj.nextSibling;
			}
		}
		return tempObj.nodeType == 1 ? tempObj : false;
	},
	initDebug: function() {
		if (DOMhelp.debug) { DOMhelp.stopDebug(); }
		DOMhelp.debug = document.createElement('div');
		DOMhelp.debug.setAttribute('id', DOMhelp.debugWindowId);
		document.body.insertBefore(DOMhelp.debug, document.body.firstChild);
	},
	setDebug: function(bug) {
		if (!DOMhelp.debug) { DOMhelp.initDebug(); }
		DOMhelp.debug.innerHTML += bug + '\n';
	},
	stopDebug: function() {
		if (DOMhelp.debug) {
			DOMhelp.debug.parentNode.removeChild(DOMhelp.debug);
			DOMhelp.debug = null;
		}
	},
	getKey: function(e) {
		if (window.event) {
			var key = window.event.keyCode;
		} else if (e) {
			var key = e.keyCode;
		}
		return key;
	},
	/* helper methods */
	getTarget: function(e) {
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target) { return false; }
		while (target.nodeType != 1 && target.nodeName.toLowerCase() != 'body') {
			target = target.parentNode;
		}
		return target;
	},
	stopBubble: function(e) {
		if (window.event && window.event.cancelBubble) {
			window.event.cancelBubble = true;
		}
		if (e && e.stopPropagation) {
			e.stopPropagation();
		}
	},
	stopDefault: function(e) {
		if (window.event && window.event.returnValue) {
			window.event.returnValue = false;
		}
		if (e && e.preventDefault) {
			e.preventDefault();
		}
	},
	cancelClick: function(e) {
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture) {
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	//cssjs(action, element, className1, className2)
	cssjs: function(a, o, c1, c2) {
		switch (a) {
			case 'swap':
				o.className = !DOMhelp.cssjs('check', o, c1) ? o.className.replace(c2, c1) : o.className.replace(c1, c2);
				break;
			case 'add':
				if (!DOMhelp.cssjs('check', o, c1)) { o.className += o.className ? ' ' + c1 : c1; }
				break;
			case 'remove':
				var rep = o.className.match(' ' + c1) ? ' ' + c1 : c1;
				o.className = o.className.replace(rep, '');
				break;
			case 'check':
				var found = false;
				var temparray = o.className.split(' ');
				for (var i = 0; i < temparray.length; i++) {
					if (temparray[i] == c1) { found = true; }
				}
				return found;
				break;
		}
	},
	safariClickFix: function() {
		return false;
	},
	childNodes: function(obj) {
		var children = obj.childNodes, tmp = [];
		for (var ii = 0, nn = children.length, node = null; ii < nn; ii++) {
			node = children[ii];
			if (node.nodeType == 1) tmp.push(node);
		};
		return tmp;
	},
	setAttribute: function(parent, type, value) {
		var t = document.createAttribute(type);
		t.nodeValue = value; parent.setAttributeNode(t);
	},
	getElementsByClassName: function(oElm, strTagName, strClassName) {
		var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		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)
	},
	getEle: function(el) {
		if (typeof el === 'string') {
			return document.getElementById(el);
		} else {
			return el;
		}
	},
	addEle: function(el, dest) {
		var el = this.getEle(el);
		var dest = this.getEle(dest);
		dest.appendChild(el);
	},
	createEle: function(tag, cssClass, id) {
		var tmp = document.createElement(tag);
		if (cssClass) {
			tmp.className = cssClass;
		}
		if (id) {
			tmp.id = id;
		}
		return tmp;
	},
	insertAfter: function(parent, sibling, newNode) {
		parent.insertBefore(newNode, DOMhelp.closestSibling(sibling, 1));
	}
}
DOMhelp.addEvent(window, 'load', DOMhelp.init, false);