/**
 * jt_.js (was 'jt_utils.js') - "JavaScript Toolkit"
 *
 * Copyright (c) 2005-2008 by Joseph Oster, wingo.com
 * http://www.wingo.com/jt_/jt_.js
 * @license http://www.wingo.com/jt_/license.html
 */

var jt_HTML = { // required by 'jt_Trace.xml()'
	safe: function(st) { // encode
		if (st.length === 0) return "";
		st = st.replace(/</gi,"&lt;");
		st = st.replace(/>/gi,"&gt;");
		st = st.replace(/\"/gi,'&quot;');
		st = st.replace(/\'/gi,"&#39;");
		st = st.replace(/\\/gi,"&#92;");
		return st;
		},
	unsafe: function(st) { // decode
		if (st.length === 0) return "";
		st = st.replace(/&lt;/gi,"<");
		st = st.replace(/&gt;/gi,">");
		st = st.replace(/&quot;/gi,'"');
		st = st.replace(/&#39;/gi,"'");
		st = st.replace(/&#92;/gi,"\\");
		return st;
		}
	}



var jt_Trace = {
	msg: function(txt) {
		jt_Trace.init();
		if (jt_Trace.trace) jt_Trace.txt(txt);
		},
	xml: function(req, lbl) { // 'req' is 'XMLHttpRequest', requires 'jt_HTML'
		jt_Trace.init();
		if (jt_Trace.trace && jt_Trace.traceXML) jt_Trace.txt(lbl + "<br>" + jt_HTML.safe(req.responseText).replace(/\t/gi,"&nbsp;&nbsp;&nbsp;&nbsp;").replace(/\n/gi,"<br>"));
		},
	on: function() {
		jt_Trace.trace = true;
		if (jt_Trace.tDIV) {jt_Trace.tDIV.style.display = "block";}
		},
	off: function() {
		jt_Trace.trace = false;
		if (jt_Trace.tDIV) {jt_Trace.tDIV.style.display = "none";}
		},
	bg: function(bg) {
		//if (jt_Trace.tDIV) {jt_Trace.tDIV.style.background = bg ? jt_Trace.css.background : "none";}
		},
	clr: function() {
		if (jt_Trace.tDIV) {
			jt_Trace.bg();
			jt_Trace.tDIV.innerHTML = jt_Trace.aTag('jt_Trace.off()', 'off') + jt_Trace.aTag('jt_Trace.clr()', 'clear trace', true);
			jt_Trace.clrd = jt_Trace.tDIV.childNodes.length;
			}
		},

	// PRIVATE BELOW
	txt: function(txt) {
		var txtDIV = document.createElement("div");
		txtDIV.innerHTML = txt;
		if (jt_Trace.tDIV.childNodes.length == jt_Trace.clrd) jt_Trace.tDIV.appendChild(txtDIV)
		else jt_Trace.tDIV.insertBefore(txtDIV, jt_Trace.tDIV.childNodes[jt_Trace.clrd]);
		jt_Trace.tDIV.style.top = jt_Trace.css.top;
		jt_Trace.tDIV.style.left = jt_Trace.css.left;
		},
	init: function() {
		if (!jt_Trace.pq) {
			jt_Trace.pq = new jt_parseQuery();
			if (jt_Trace.pq.trace) jt_Trace.trace = (jt_Trace.pq.trace != 0);
			if (jt_Trace.pq.traceXML) jt_Trace.traceXML = (jt_Trace.pq.traceXML != 0);
			}
		if (jt_Trace.trace && !jt_Trace.tDIV) {
			jt_Trace.tDIV = document.createElement("div");
			for (var prop in jt_Trace.css) jt_Trace.tDIV.style[prop] = jt_Trace.css[prop];
			if (jt_BodyZ) jt_BodyZ.toTop(jt_Trace.tDIV);
			else document.body.appendChild(jt_Trace.tDIV);
			jt_Trace.clr();
			}
		},
	traceXML: true,
	aTag: function(aFunc, aTxt, dash) {return (dash ? ' - ' : '') + '<a href="" onClick="' + aFunc + ';return false;">' + aTxt + '</a>'},
	css: {top:"20px", left:"20px", background:"#FFFFFF", border:"1px solid #a9a9a9", color:"#5a5a5a", textAlign:"left", fontSize:"0.85em", padding:"5px", opacity:"0.9", className:"jt_Trace", position:"absolute"}
	}



var jt_TraceObj = {
	str: function(obj, sep, links) { // convert any JS object 'obj' to string of name:value pairs - adds 'links' for 'jt_TraceObj.show()'

			function stLbl(lbl) {
				st += (st == "" ? "" : "<br>") + '<b><font color="#FF0000">' + lbl + '</font></b>: ';
				addSep = false;
				}

			function aLnk(aObj, aTxt) {
				if (addSep) st += sep;
				if (links && (typeof aObj == "object")) {
					st += jt_Trace.aTag('jt_TraceObj.mem(' + jt_TraceObj.stack.length + ')', aTxt);
					jt_TraceObj.stack.push(aObj);
					}
				else st += aTxt;
				var p = aTxt;
				st += ":" + ((p.toLowerCase().indexOf("html") == -1) ? aObj : "HTML");
				addSep = true;
				}

		if (!sep) sep = ' ][ ';
		var st = "";
		var addSep = false;
		if (obj) {
			try {
				if (obj.length && (obj.length > 0) && (typeof obj.item != "undefined")) {
					stLbl('items');
					for (var x = 0; x < obj.length; x++)
						if (obj.item(x)) aLnk(obj.item(x), obj.item(x).nodeName);
					}
				stLbl('props');
				for (var prop in obj) {
					if (prop.charAt(0) == '$') continue;
					if ((typeof obj[prop] == 'function') && !jt_TraceObj.okf) continue;
					aLnk(obj[prop], prop);
					}
				if (obj.attributes) {
					stLbl('attributes');
					for (var x = 0; x < obj.attributes.length; x++)
						if (obj.attributes[x].nodeValue) aLnk(obj.attributes[x].nodeValue, obj.attributes[x].nodeName);
					}
				}
			catch(e) {st += "ERROR: " + e.message;}
			}
		return st;
		},
	show: function(obj, inLine) { // use 'jt_Trace', show 'links' 

			function aTag(aFunc, aTxt) {return jt_Trace.aTag('jt_TraceObj.show(jt_TraceObj.tObj.' + aFunc + ')', aTxt, true);}

		jt_Trace.init();
		if (jt_Trace.trace) {
			jt_TraceObj.clr(obj, inLine);
			jt_Trace.msg(jt_TraceObj.str(obj, null, true));
			jt_TraceObj.hist.push(obj);
			var lnk = jt_Trace.aTag('jt_TraceObj.clr()', 'clear') + jt_Trace.aTag('jt_TraceObj.okfT()', 'functions', true);
			if (jt_TraceObj.tn != obj) lnk += jt_Trace.aTag('jt_TraceObj.bac()', 'back', true) + jt_Trace.aTag('jt_TraceObj.show(jt_TraceObj.tn)', 'begin', true);
			if (obj) {
				if (obj.parentNode) lnk += aTag('parentNode', 'parent');
				if (obj.previousSibling) lnk += aTag('previousSibling', 'prev');
				if (obj.nextSibling) lnk += aTag('nextSibling', 'next');
				if (obj.childNodes && (obj.childNodes.length > 0)) lnk += jt_Trace.aTag('jt_TraceObj.cnOn(event)', 'childNodes', true);
				if (obj.nodeName) {
					lnk += ' - ' + obj.nodeName;
					if (obj.id) lnk += ' (' + obj.id + ')';
				}
			}
			jt_Trace.msg('<b>jt_TraceObj: ' + lnk + '</b>');
			jt_Trace.bg(true);
		}
	},
	clr: function(obj, inLine) {
		if (!inLine) jt_Trace.clr();
		jt_TraceObj.stack = [];
		jt_TraceObj.tObj = obj;
		jt_TraceObj.cnOff();
		if (obj && ((jt_TraceObj.tn == null) || (jt_TraceObj.tn == obj))) {
			jt_TraceObj.tn = obj;
			jt_TraceObj.hist = [];
			}
		},

	// PRIVATE BELOW
	tn: null,
	okf:false,
	mem: function(idx) {jt_TraceObj.show(jt_TraceObj.stack[idx]);},
	bac: function() {
		var t = jt_TraceObj.hist.pop();
		jt_TraceObj.show(jt_TraceObj.hist.pop());
		},
	okfT: function() {
		jt_TraceObj.okf = !jt_TraceObj.okf;
		jt_TraceObj.show(jt_TraceObj.hist.pop());
		},
	cnOn: function(ev) {

			function pfxGet(depth) {
				if (!jt_TraceObj.cnT[depth]) {
					jt_TraceObj.cnT[depth] = "";
					for (var i=0; i<depth; i++) jt_TraceObj.cnT[depth] += jt_TraceObj.spTab;
					}
				return jt_TraceObj.cnT[depth];
				}

			function addCNs(obj, depth) {
				if (obj.childNodes && (obj.childNodes.length > 0)) {
					var pfx = pfxGet(depth);
					if ((obj == jt_Trace.tDIV) && (depth > 0)) st.push(pfx + jt_Trace.aTag('jt_TraceObj.show(jt_Trace.tDIV)', 'jt_Trace') + '<br>');
					else for (var x=0; x<obj.childNodes.length; x++) {
						var itm = obj.childNodes.item(x);
						if (itm) {
							var iVal = (itm.nodeName == "#text") ? (' ' + itm.nodeValue) : '';
							st.push(pfx + jt_Trace.aTag('jt_TraceObj.mem(' + jt_TraceObj.stack.length + ')', itm.nodeName) + iVal + '<br>');
							jt_TraceObj.stack.push(itm);
							addCNs(itm, depth+1);
							}
						}
					}
				}

		if (!jt_TraceObj.cnDIV) {
			jt_TraceObj.cnDIV = document.createElement("div");
			for (var prop in jt_TraceObj.cnCss) jt_TraceObj.cnDIV.style[prop] = jt_TraceObj.cnCss[prop];
			jt_TraceObj.spTab = "";
			for (var i=0; i<7; i++) jt_TraceObj.spTab += "&nbsp;";
			}
		var targ = ev.srcElement ? ev.srcElement : ev.target;
		targ.parentNode.parentNode.parentNode.appendChild(jt_TraceObj.cnDIV);
		jt_TraceObj.cnDIV.style.zIndex = jt_Trace.tDIV.zIndex+1;
		var st = ['<b>[', jt_Trace.aTag('jt_TraceObj.cnOff()', 'childNodes'), ']</b><br>'];
		addCNs(jt_TraceObj.tObj, 0);
		jt_TraceObj.cnDIV.innerHTML = st.join('');
		jt_TraceObj.cnDIV.style.display = "block";
		},
	cnOff: function() {if (jt_TraceObj.cnDIV) jt_TraceObj.cnDIV.style.display = "none";},
	cnCss: {top:"40px", left:"40px", background:"#FFFFFF", border:"1px solid blue", padding:"10px", className:"jt_TraceObj_cnCss", position:"absolute", display:"none"},
	cnT: []
	} /***** END: 'jt_TraceObj' */


var jt_BodyZ = { /***** manages z-Index visibility */
	init: function() {
	   if (!jt_BodyZ.que) {
		var oldQue = document.getElementById('jt_BodyZQue');
		if (oldQue) {
			jt_BodyZ.que = oldQue;
		} else {
			jt_BodyZ.que = document.createElement("div");
			jt_BodyZ.que.setAttribute('id', 'jt_BodyZQue');
			document.body.appendChild(jt_BodyZ.que);
		}
	   }
		if (!jt_BodyZ.que.veilArray) {
			jt_BodyZ.que.veilArray = [];
		}
    },
	toTop: function(elm) { // adds any 'elm' to top of 'jt_BodyZ.que'
    	jt_BodyZ.init();
    	if (!elm.jt_BodyZZ) {
			elm.jt_BodyZZ = jt_BodyZ.nid++;
			jt_AddListener(elm, "mousedown", function() {
				jt_BodyZ.toTop(elm);
				if (jt_BodyZ.trace && (elm != jt_Trace.tDIV)) {jt_TraceObj.show(elm);}
				});
			jt_BodyZ.set(elm);
			}
		else if ((jt_BodyZ.last == null) || (elm.jt_BodyZZ != jt_BodyZ.last.jt_BodyZZ)) jt_BodyZ.set(elm);
		},

	// PRIVATE BELOW
	set: function(elm) {
	    //elm.style.zIndex = 1;
		elm.style.zIndex = jt_BodyZ.nextZ;
		jt_BodyZ.nextZ = jt_BodyZ.nextZ + 2;
		jt_BodyZ.last = elm;
		},
    clear: function() {
      while (jt_BodyZ.que.hasChildNodes()) {
		var oldChild = jt_BodyZ.que.removeChild(jt_BodyZ.que.childNodes[jt_BodyZ.que.childNodes.length-1]);
		delete(oldChild);
	  }
    
    },
	nid:1,
	nextZ:1
	}
	



var jt_Veil = { /***** cooperates w/ 'jt_BodyZ', required by 'jt_DialogBox' */
	show: function(showIt, elem) {
	if (elem) {
			jt_Veil.init(elem);
			if (showIt) {
				//jt_Veil.fix();
				elem.veil.style.zIndex = elem.style.zIndex-1;
				elem.veil.style.display = "block";
			}
			
 	  }
	},

	// PRIVATE BELOW
	fix: function() {
		for (var index=0;index<jt_BodyZ.que.veilArray.length;index++) {
			var node = jt_BodyZ.que.veilArray[index];
			node.style.width = jt_valPx(Math.max(document.body.scrollWidth, jt_winW()));
			node.style.height = jt_valPx(Math.max(document.body.scrollHeight, jt_winH()));
		} 
		},
	init: function(elem) {
		if (!elem.veil) {
			jt_Veil.deleteVeil(elem.id);
			elem.veil = document.createElement('div');
			elem.veil.setAttribute('id', 'veil'+elem.id);
			elem.veil.innerHTML = "&nbsp;";
			elem.parentNode.insertBefore(elem.veil, elem);
			jt_BodyZ.que.veilArray.push(elem.veil);
			jt_AddListener(window, "resize", jt_Veil.fix);
		}

			for (var prop in jt_Veil.css) elem.veil.style[prop] = jt_Veil.css[prop];
		},
	deleteVeil: function(objId) {
			var node = null;
			var veilId = 'veil'+objId;
			var newVeilArray = [];
			for (var index=0;index<jt_BodyZ.que.veilArray.length;index++) {
				if (jt_BodyZ.que.veilArray[index].id == veilId) {
					node = jt_BodyZ.que.veilArray[index];
				} else {
					newVeilArray.push(jt_BodyZ.que.veilArray[index]);
				}
			}
			if (node) {
				var veilParent = node.parentNode;
				if (veilParent) {
					veilParent.removeChild(node);	
				} 
				jt_BodyZ.que.veilArray = newVeilArray;
			}
		},
	css: {position:"absolute", display:"none", top:0, left:0, cursor:"not-allowed", backgroundColor:"#000000", filter:"alpha(opacity=20)", opacity:0.2}
	}

function jt_ShowHideElm(elm, showIt) {
	if (elm) {elm.style.visibility = (showIt) ? "visible" : "hidden";}
	}

function jt_ShowNoneElm(elm, showIt, showStyle) {
	if (elm) {elm.style.display = showIt ? (showStyle ? showStyle : 'block') : "none";}
	}

function jt_ShowHide(divName, showIt) {
	jt_ShowHideElm(document.getElementById(divName), showIt);
	}

function jt_ShowNone(divName, showIt, showStyle) {
	jt_ShowNoneElm(document.getElementById(divName), showIt, showStyle);
	}

function jt_setOpacity(elm, opacity) {
	elm.style.opacity = opacity / 100;
	elm.style.filter = 'alpha(opacity=' + opacity + ')';
	}

function jt_valPx(pixels) {
	return pixels + "px";
	}

function jt_moveTo(obj, x, y) {
	obj.style.left = jt_valPx(x);
	obj.style.top = jt_valPx(y);
	}

function jt_Point(x, y) {
	// returns a "Point" object with '.x' and '.y' properties
	this.x = x;
	this.y = y;
	}

function jt_getOffsetXY(obj, findID, point) {
	// returns 'jt_Point' object with '.x' and '.y' offsets of 'obj' relative to page
	// or relative to optional 'findID', if 'findID' is found as a parent
	if (point) { // optional 'point' is re-used when valid; good practice when dragging
		point.x = obj.offsetLeft;
		point.y = obj.offsetTop;
		}
	else {point = new jt_Point(obj.offsetLeft, obj.offsetTop);}
	var parent = obj.offsetParent;
	while (parent !== null) {
		if (findID && (parent.id == findID)) break;
		point.x += parent.offsetLeft;
		point.y += parent.offsetTop;
		parent = parent.offsetParent;
		}
	return point;
	}

function jt_AddListener(obj, evType, fn) {
	if (obj.addEventListener) {obj.addEventListener(evType, fn, false);}
	else if (obj.attachEvent) {obj.attachEvent('on' + evType, fn);}
	}

function jt_RemListener(obj, evType, fn) {
	if (obj.removeEventListener) {obj.removeEventListener(evType, fn, false);}
	else if (obj.detachEvent) {obj.detachEvent('on' + evType, fn);}
	}

function jt_fixE(ev) {
	var e = ev ? ev : window.event;
	return e;
	}

function jt_currStyle(divToRead) { // return current (derived) CSS style object
	var cs = divToRead.style;
	if (window.getComputedStyle) {cs = window.getComputedStyle(divToRead,null);}
	else if (divToRead.currentStyle) {cs = divToRead.currentStyle;}
	return cs;
	}

function jt_width(divToRead, currStyle) {
	var wide = currStyle ? currStyle.width : jt_currStyle(divToRead).width;
	return (wide = 'auto') ? divToRead.offsetWidth : parseInt(wide);
	}

function jt_height(divToRead, currStyle) {
	var high = currStyle ? currStyle.height : jt_currStyle(divToRead).height;
	return (high = 'auto') ? divToRead.offsetHeight : parseInt(high);
	}

function jt_winW() {
	if (document.documentElement && (document.documentElement.clientWidth > 0)) {return document.documentElement.clientWidth;}
	else if (window.innerWidth) {return window.innerWidth;}
	else {return document.body.clientWidth;}
	}

function jt_winH() {
	if (window.innerHeight) {return window.innerHeight;}
	else if (document.documentElement && (document.documentElement.clientHeight > 0)) {return document.documentElement.clientHeight;}
	else {return document.body.clientHeight;}
	}

function jt_scrollLeft() {
	if (window.pageXOffset) {return window.pageXOffset;}
	else if (document.documentElement && (document.documentElement.scrollLeft > 0)) {return document.documentElement.scrollLeft;}
	else {return document.body.scrollLeft;}
	}

function jt_scrollTop() {
	if (window.pageYOffset) {return window.pageYOffset;}
	else if (document.documentElement && (document.documentElement.scrollTop > 0)) {return document.documentElement.scrollTop;}
	else {return document.body.scrollTop;}
	}

function jt_parseQuery(queryString) { // converts name/value pairs in 'queryString' to JS object
	var stQuery = (queryString) ? queryString : top.location.search; // use 'top.location.search' if 'queryString' is null
	if (stQuery.indexOf("?") === 0) stQuery = stQuery.substring(1);
	var qObj = {};
	if (stQuery) {
		var nvPairs = stQuery.split("&");
		for (var i=0; i < nvPairs.length; i++) {
			var posEq = nvPairs[i].indexOf("=");
			if (posEq !== -1) {
				var nam = nvPairs[i].substring(0,posEq);
				if (nam.indexOf('.') === -1) qObj[nam] = nvPairs[i].substring(posEq+1);
				}
			}
		}
	return qObj;
	}

function jt_alignCorner(elmToMove, elmAnchor, TlTrBlBr, xOffset, yOffset) {
	// aligns 'elmToMove' with 'elmAnchor' based on 2-character 'TlTrBlBr' indicating corner: 'TL' | 'TR' | 'BL' | 'BR'
	xOffset = xOffset ? xOffset : 0; // optional param
	yOffset = yOffset ? yOffset : 0; // optional param
	var anchorXY = jt_getOffsetXY(elmAnchor);
	var xxOffset = (TlTrBlBr.indexOf('R') !== -1) ? (elmToMove.offsetWidth - elmAnchor.offsetWidth) : 0;
	var yyOffset = (TlTrBlBr.indexOf('B') !== -1) ? elmToMove.offsetHeight : 0;
	jt_moveTo(elmToMove, anchorXY.x - xxOffset + xOffset, anchorXY.y - yyOffset + yOffset);
	}

function jt_divOnScrn(divOnScrn) {
	var divPos = jt_getOffsetXY(divOnScrn);
	var newX = divPos.x;
	var newY = divPos.y;
	if (divPos.x + divOnScrn.offsetWidth - document.body.scrollLeft > document.body.clientWidth) newX = document.body.scrollLeft + document.body.clientWidth - divOnScrn.offsetWidth;
	if (divPos.x < document.body.scrollLeft) newX = document.body.scrollLeft;
	if (divPos.y + divOnScrn.offsetHeight - document.body.scrollTop > document.body.clientHeight) newY = document.body.scrollTop + document.body.clientHeight - divOnScrn.offsetHeight;
	if (divPos.y < document.body.scrollTop) newY = document.body.scrollTop;
	if ((newX !== divPos.x) || (newY !== divPos.y)) jt_moveTo(divOnScrn, newX, newY);
	}

function jt_appendRelative(dragDIV, newParentDIV, xOffset, yOffset) {
	var dragPos = jt_getOffsetXY(dragDIV);
	var newParentPos = jt_getOffsetXY(newParentDIV);
	var xPos = dragPos.x - newParentPos.x;
	var yPos = dragPos.y - newParentPos.y;
	jt_moveTo(dragDIV, xPos + (xOffset ? xOffset : 0), yPos + (yOffset ? yOffset : 0));
	newParentDIV.appendChild(dragDIV);
	}

function jt_DelChildren(elm) { // remove all child nodes of 'elm' from DOM and delete them
	while (elm.hasChildNodes()) {
		var oldChild = elm.removeChild(elm.childNodes[elm.childNodes.length-1]);
		delete(oldChild);
		}
	}

String.prototype.trim = function () {
	return this.replace(/^\s+/g, '').replace(/\s+$/g, '');
	}




