/*
 * DOM Helper
 * 
 * 	Commonly used document object model functions
 *
 * @filesource		$Id: domhelper.js,v 1.2 2008/01/27 00:21:57 chris Exp chris $
 * @copyright		Copyright 2005-2008, Christopher Snead
 * @link		http://www.cochris.com
 * @version		$Revision: 1.2 $
 * @lastmodified	$Date: 2008/01/27 00:21:57 $
 * 
 * $Log: domhelper.js,v $
 * Revision 1.2  2008/01/27 00:21:57  chris
 * Added utility functions
 *
 * Revision 1.1  2008/01/26 21:07:04  chris
 * Initial revision
 *
 *
 */
CSDOMHelper={
	debugWindowId:'CSDOMHelperdebug',
	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){
		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(CSDOMHelper.debug){CSDOMHelper.stopDebug();}
		CSDOMHelper.debug=document.createElement('div');
		CSDOMHelper.debug.setAttribute('id',CSDOMHelper.debugWindowId);
		document.body.insertBefore(CSDOMHelper.debug,document.body.firstChild);
	},
	setDebug:function(bug){
		if(!CSDOMHelper.debug){CSDOMHelper.initDebug();}
		CSDOMHelper.debug.innerHTML+=bug+'\n';
	},
	stopDebug:function(){
		if(CSDOMHelper.debug){
			CSDOMHelper.debug.parentNode.removeChild(CSDOMHelper.debug);
			CSDOMHelper.debug=null;
		}
	},
	getKey:function(e){
		if(window.event){
	      var key = window.event.keyCode;
	    } else if(e){
	      var key=e.keyCode;
	    }
		return key;
	},
	addClass : function(target, classValue) {
		var pattern = new RegExp("(^| )" + classValue + "( |$)");
		if (!pattern.test(target.className)) {
			if (target.className == "") {
				target.className = classValue;
			} else {
				target.className += " " + classValue;
			}
		}
		return true;
	},
	removeClass : function( target, classValue ) {
		var removedClass = target.className;
		var pattern = new RegExp("(^| )" + classvalue + "( |$)");
		removedClass = removedClass.replace(pattern, "$1");
		removedClass = removedClass.replace(/ $/, "");
		
		target.className = removedClass;
		
		return true;
	},
/* 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 {
			evType = 'on' + evType;
			if (elm[evType]) {
				var oldListener = elm[evType];
				elm[evType] = function() {
					oldListener();
					return fn();
				};
			} else {
				elm[evType] = fn;
			}
		}
	},
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!CSDOMHelper.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!CSDOMHelper.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;
    }
}
CSDOMHelper.addEvent(window, 'load', CSDOMHelper.init, false);
