//*** This code is copyright 2003-2004 by Gavin Kistner, !@phrogz.net
//*** It is covered under the license viewable at http://phrogz.net/JS/_ReuseLicense.txt
//*** Reuse or modification is free provided you abide by the terms of that license.
//*** (Including the first two lines above in your source code satisfies the conditions.)


// *** See http://phrogz.net/JS/AddClassKillClass_js.txt
function AddClass(obj,cName){ KillClass(obj,cName); return obj.className+=(obj.className.length>0?' ':'')+cName; }
function KillClass(obj,cName){ return obj.className=obj.className.replace(new RegExp("^"+cName+"\\b\\s*|\\s*\\b"+cName+"\\b",'g'),''); }
function HasClass(obj,cName){ return (!obj || !obj.className)?false:(new RegExp("\\b"+cName+"\\b")).test(obj.className) }
function RemoveClass(obj,cName){ KillClass(obj,cName) }


// *** See http://phrogz.net/JS/AttachEvent_js.txt
function AttachEvent(obj,evt,fnc,useCapture){
	if (!useCapture) useCapture=false;
	if (obj.addEventListener){
		obj.addEventListener(evt,fnc,useCapture);
		return true;
	} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
	else{
		MyAttachEvent(obj,evt,fnc);
		obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
	}
}
function MyAttachEvent(obj,evt,fnc){
	if (!obj.myEvents) obj.myEvents={};
	if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
	var evts = obj.myEvents[evt];
	evts[evts.length]=fnc;
}
function MyFireEvent(obj,evt){
	if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
	var evts = obj.myEvents[evt];
	for (var i=0,len=evts.length;i<len;i++) evts[i]();
}

function DetachEvent(obj,evt,fnc,useCapture){
	if (!useCapture) useCapture=false;
	if (obj.removeEventListener) return obj.removeEventListener(evt,fnc,useCapture);
	else if(obj.detachEvent) return obj.detachEvent("on"+evt,fnc);
	else{
		//ToDo: ...
	}
}

function PreventDefault(evt){
	// *** Cross browser function to prevent the default action from occuring.
	if (!evt && window.event) evt=window.event;
	if (evt!=null){
		if (typeof(evt.preventDefault)=='function') evt.preventDefault();
		else evt.returnValue=false;
	}
	return false;
}
function CancelBubble(evt){
	// *** Cross browser function to prevent the event from bubbling.
	if (!evt && window.event) evt=window.event;
	if (evt!=null){
		if (typeof evt.stopPropagation=='function') evt.stopPropagation();
		else evt.cancelBubble=true;
	}
	return false;
}


var debugOutInfo = {	debugLine:0,lastDebugMsg:null,debugMsgCount:0 }
function DebugOut(msg,verbosity,preventRepeats){
	// *** Set global variable 'debugLevel' to an integer. Higher numbers corresponds to more verbose.
	if (this.debugLevel==null || debugLevel<verbosity) return;
	if (preventRepeats){
		if (msg==debugOutInfo.lastDebugMsg){
			debugOutInfo.debugMsgCount++;
			return;
		}
		debugOutInfo.lastDebugMsg = msg;
	}

	var out = document.getElementById('debugoutput');
	if (debugOutInfo.debugMsgCount>0){
		var dupsMessge = "previous output repeated "+debugOutInfo.debugMsgCount+" times...";
		if (out)	out.innerHTML="#"+(debugLine)+": "+dupsMessge+"<br>"+out.innerHTML;
		else alert(dupsMessge);
		debugOutInfo.debugMsgCount=0;
	}
	if (out)	out.innerHTML="#"+(debugOutInfo.debugLine++)+": "+msg.replace(/\n/g,"<br>").replace(/</g,"&lt;").replace(/>/g,"&gt;")+"<br>"+out.innerHTML;
	else alert(msg);
}


function IsHidden(el){
	// *** See http://phrogz.net/JS/IsHidden_js.txt
	while (el!=null){
		if ((el.style && (el.style.display=='none' || el.style.visibility=='hidden')) ||	(el.currentStyle && (el.currentStyle.display=='none' || el.currentStyle.visibility=='hidden')))	return true;
		el=el.parentNode;
	}
	return false;
}

