//*** This code is copyright 2002-2003 by Gavin Kistner and Refinery; www.refinery.com
//*** 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 usually satisfies the conditions.)

AttachEvent(window,'load',function(){
	var uls = document.getElementsByTagName('ul');
	for (var i=0,len=uls.length;i<len;i++){
		var ul = uls[i];
		if (!HasClass(ul,'dynamicnested')) continue;
		var lis = ul.getElementsByTagName('li');
		for (var j=0,len2=lis.length;j<len2;j++){
			var li = lis[j];
			var fc = li.firstChild;
			if (fc.nodeType!=3) continue;
			var span = li.insertBefore(document.createElement('span'),fc);
			span.appendChild(fc);
			var uls = li.getElementsByTagName('ul');
			if (!uls || uls.length==0) continue;
			AddClass(li,'parent');
			if (HasClass(li,'open')) Open(li);
			else AddClass(li,'closed');
			span.onclick = function(evt){ Toggle(evt,this.parentNode) };
		}
	}

	function Toggle(evt,li){
		if (HasClass(li,'open')) Close(li);
		else Open(li);
		return CancelBubble(evt);
	}

	function Open(li){
		var ul = Ancestor(li,'ul');
		if (ul.openChild && ul.openChild!=li) Close(ul.openChild);
		SwitchClass(li,'closed','open');
		ul.openChild=li;
	}

	function Close(li){
		var ul = Ancestor(li,'ul');
		SwitchClass(li,'open','closed');
		ul.openChild=null;
	}
	
},false);


// *** LIBRARY FUNCTIONS FOLLOW. SEE http://phrogz.net/JS/ FOR THE LATEST VERSIONS


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 SwitchClass(obj,kill,add){ KillClass(obj,kill); AddClass(obj,add) }



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 PreventDefault(evt){
	if (!evt && window.event) evt=window.event;
	if (!evt) return;
	evt.returnValue=false;
	if (evt.preventDefault) evt.preventDefault();
	return false;
}

function CancelBubble(evt){
	if (!evt && window.event) evt=window.event;
	if (!evt) return;
	evt.cancelBubble=true;
	if (evt.stopPropagation) evt.stopPropagation();
	return false;
}




function Ancestor(el,tagName,attr,value){
	tagName=tagName.toLowerCase();
	while (el){
		if ((!tagName||!el.tagName||tagName==el.tagName.toLowerCase()) && (!attr||el.getAttribute(attr)==value)) return el;
		el=el.parentNode;
	}
	return null;
}

