function isIE(){ return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent); }
function getSelectionStart(o){ if(o.createTextRange){ var r = document.selection.createRange().duplicate(); r.moveEnd('character', o.value.length); if(r.text == ''){ return o.value.length; } return o.value.lastIndexOf(r.text); }else{ return o.selectionStart; } }
function numbersOnly(e){
	var unicode = e.charCode ? e.charCode : e.keyCode;
	var normalKey = isIE() ? true : e.charCode;
	if( normalKey ){
		// non system key pressed (letter, number, or symbol)
		if(unicode < 48 || unicode > 57)
			return false;
	}else{
		// system key pressed - arrow, backspace delete
		if(unicode != 8 && unicode != 9  && unicode != 46 && unicode != 45 && (unicode < 33 || unicode > 40))
			return false;
	}
	return true;
}
function zipValue(e, txtID){
	var txt = document.getElementById(txtID);
	var hasDash = (txt.value.indexOf("-") > 0);
	var unicode = e.charCode ? e.charCode : e.keyCode;
	var normalKey = isIE() ? true : e.charCode;
	if( normalKey ){
		// non system key pressed (letter, number, or symbol)
		if( (unicode != 45 && (unicode < 48 || unicode > 57)) || (unicode == 45 && hasDash) )
			return false;
		else{
			if( unicode == 45 && !hasDash && !(txt.value.length == 5) )
				return false;
			if( unicode == 45 && !hasDash && txt.value.length == 5 )
				hasDash = true;
		}
	}else{
		// system key pressed - arrow, backspace delete
		if(unicode != 8 && unicode != 9 && unicode != 46 && unicode != 45 && (unicode < 33 || unicode > 40))
			return false;
		else
			return true;
	}
	
	var selStart = getSelectionStart(txt);
	if( txt.value.indexOf("-") >= 0 && selStart > txt.value.indexOf("-") && txt.value.substring(txt.value.indexOf("-")).length == 5 )
		return false;
	
	if( !hasDash && txt.value.length == 5 )
		return false;
	
	return true;
}
function dollarValue(e, txtID){
	var txt = document.getElementById(txtID);
	var hasDecimal = (txt.value.indexOf(".") > 0);
	var unicode = e.charCode ? e.charCode : e.keyCode;
	var normalKey = isIE() ? true : e.charCode;
	if( normalKey ){
		// non system key pressed (letter, number, or symbol)
		if( (unicode != 46 && (unicode < 48 || unicode > 57)) || (unicode == 46 && hasDecimal) )
			return false;
		else{
			if( unicode == 46 && !hasDecimal )
				hasDecimal = true;
		}
	}else{
		// system key pressed - arrow, backspace delete
		if(unicode != 8 && unicode != 9 && unicode != 46 && unicode != 45 && (unicode < 33 || unicode > 40))
			return false;
		else
			return true;
	}
	
	var selStart = getSelectionStart(txt);
	if( txt.value.indexOf(".") >= 0 && selStart > txt.value.indexOf(".") && txt.value.substring(txt.value.indexOf(".")).length == 3 )
		return false;
	
	return true;
}
function IndexOf(item){
	for(var i = 0; i < this.length; i++){
		if( this[i] == item )
			return i;
	}
	return -1;
}
Array.prototype.indexOf = IndexOf;
function ToggleClass(element, firstClass, secondClass, event){
	event.cancelBubble = true;
	
	var classes = element.className.split(" ");
	var cls1 = classes.indexOf(firstClass);
	var cls2 = classes.indexOf(secondClass);
	
	if( cls1 == -1 && cls2 == -1 )
		classes[classes.length] = firstClass;
	else if( cls1 != -1 )
		classes[cls1] = secondClass;
	else if( cls2 != -1 )
		classes[cls2] = firstClass;
	
	element.className = classes.join(" ");
}
function SetClass(element, cls){
	var classes = element.className.split(" ");
	var c1 = classes.indexOf("tv-collapsed");
	var c2 = classes.indexOf("tv-expanded");
	var c3 = classes.indexOf("tv-empty");
	
	if( c1 != -1 )
		classes.splice(c1, 1);
	if( c2 != -1 )
		classes.splice(c2, 1);
	if( c3 != -1 )
		classes.splice(c3, 1);
	
	classes[classes.length] = cls;
	element.className = classes.join(" ");
}

function ToggleNodeStateHandler(event){
	ToggleClass(this, "tv-collapsed", "tv-expanded", (event == null) ? window.event : event);
}
function PreventBubbleHandler(event){
	if( !event ) event = window.event;
	event.cancelBubble = true;
}
function SetupTreeViews(){
	var uls = document.getElementsByTagName("ul");
	for( var u = 0; u < uls.length; u++ ){
		var classes = uls[u].className.split(" ");
		if( classes.indexOf("treeView") != -1 ){
			var treeElements = uls[u].getElementsByTagName("li");
			for( var i = 0; i < treeElements.length; i++ ){
				if( treeElements[i].getElementsByTagName("ul").length > 0 ){
					SetClass(treeElements[i], "tv-collapsed");
					treeElements[i].onclick = ToggleNodeStateHandler;
				}else{
					SetClass(treeElements[i], "tv-empty");
					treeElements[i].onclick = PreventBubbleHandler;
				}
			}
		}
	}
}
function getElementsByClassName(classname, type, node) {
    if(!node) node = document.getElementsByTagName("body")[0];
    if(!type) type = "*";
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName(type);
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}
function hideShowDefinitions(class2Hide, class2Show){
	var defs = getElementsByClassName(class2Hide, "div");
	for(var i=0,j=defs.length; i<j; i++)
		defs[i].style.display = "none";
	
	var qs = getElementsByClassName(class2Show, "div");
	for(var i=0,j=qs.length; i<j; i++)
		qs[i].style.display = "block";
}

function addLoadEvent(func){var oldonload = window.onload;if(typeof window.onload != 'function'){window.onload = func;}else{window.onload = function(){if(oldonload){oldonload();}func();}}}
addLoadEvent(SetupTreeViews);