Object.prototype.get = function() {
	function g(o,a,i) { return ((r=o[a[i]])==null)?null:(i<a.length-1)?g(r,a,i+1):r; }
	return g(this,arguments,0);
}

function StrBuff() { this.buffer = []; }
StrBuff.prototype.isBuffer = true;
StrBuff.prototype.toString = function() { return this.buffer.join(""); }
StrBuff.prototype.join = function(b) { this.buffer = this.buffer.concat(b); }
StrBuff.prototype.append = StrBuff.prototype.app = function(s) {
	this.buffer.push(s);
	return this;
}
StrBuff.prototype.appendAll = function() {
	for (var i=0, a=a=StrBuff.prototype.appendAll.arguments; i<a.length; i++)
		if(a[i]&&a[i].isBuffer) this.join(a[i]); else this.app(a[i]);
	return this;
}

Array.prototype.ary = function () { return true; }
Array.prototype.add = function(o) {
	this[this.length] = o;
	return o;
}
Array.prototype.addAll = function(a) {
	if (a) for (var i=0; i < a.length; i++) this[this.length] = a[i];
}
Array.prototype.insert = function(p,tst) {
	if(p<0)p=0;if(p>this.length)p=this.length;
	for(var i=this.length;i>p;i--)this[i]=this[i-1];
	this[p]=tst;
	return tst;
}
Array.prototype.remove = function(p) {
	if(p==-1) return;
	var tmp=this[p];
	for(var i=p+1;i<this.length;i++)this[i-1]=this[i];
	this.length=this.length-1;
	return tmp;
}
Array.prototype.indexOf = function(tst) {
	for (var i=0;i<this.length;i++) if (this[i]==tst) return i;
	return -1;
}

function Map() {
	this.keys = [];
	this.the_map = [];

	this.get = function(key) {
		return this.the_map['k'+key];
	}
	this.put = function(key, value) {
		var i = this.keys.indexOf(key);
		if (i== -1) this.keys.add(key);
		this.the_map['k'+key] = value;
	}
	this.remove = function(key) {
		var k = 'k'+key;
		if (this.the_map[k]) this.the_map[k] == null;

		var i = this.keys.indexOf(key);
		if (i!= -1) this.keys.remove(i);
	}
}

function NVObj(n, v) {
	this.name = n;
	this.value = v;
}

var lary = ["a","b","c","d","e","f","g","h","i","j"];
function toAlpha(i) {
	var s = ""+i,r="";
	for (var k=0;k< s.length;k++) r += lary[parseInt(s.charAt(k))];
	return r;
}

function nbspNull(val) { return (val == null? "&nbsp;" : val); }
function nbspZero(val) { return (val == null || val == 0? "&nbsp;" : val); }

function emptyNull(pStr) { return pStr ? pStr : '' ; }
function spaceNull(pStr) { return pStr ? pStr : ' ' ; }
function isEmpty(pStr) { return (pStr==null || pStr == ''); }

function emptyStringForNull(v) {
	if (v != null) return v;
	return '';
}

function emptySwitch(v,r) {
	if (v == null || v.length <=0) return r;
	return v;
}

function removeDocElementById(id) {
	var elem = getDocElementById(id);
	if (elem) {
		if(elem.parentNode) elem.parentNode.removeChild(elem);
		else {
			elem.innerHTML = "";
			elem.style.display = "none";
		}
	}
}

function getDocElementValueById(pElementId, pOptional) {
	var temp = getDocElementById(pElementId, pOptional);
	return (!temp)? null : temp.value;
}

function setDocElementValueById(pElementId, pValue, pOptional) {
	var temp = getDocElementById(pElementId, pOptional);
	if(!temp) return false;

	temp.value = pValue;
	return true;
}

function getDocInnerHtmlById(pElementId, pOptional) {
	return getDocElementAttribute(pElementId, "innerHTML", pOptional);
}

function setDocInnerHtmlById(pElementId, pInnerHtml, pOptional) {
	return setDocElementAttribute(pElementId, "innerHTML", pInnerHtml, pOptional);
}

function getDocElementAttribute(pElementId, pAttribute, pOptional) {
	var temp = getDocElementById(pElementId, pOptional);
	if(!temp) return null;

	var ret = null;
	eval('ret = temp.' + pAttribute);
	return ret;
}

function setDocElementAttribute(pElementId, pAttribute, pValue, pOptional) {
	var temp = getDocElementById(pElementId, pOptional);
	if(!temp) return false;

	eval('temp.' + pAttribute + ' = pValue');
	return true;
}

function getDocElementById(pElementId, pOptional) {
	return document.getElementById(pElementId);
}

function isTrueStr(val,defaultTrue) {
	if(val == null && defaultTrue) return true;
	else if(val == null) return false;

	var temp = (val + "").toLowerCase();
	if(defaultTrue) return !(temp=="n" || temp=="false");
	else return (temp=="y" || temp=="true");
}

function arrayToCommaSep(ary) {
	if(ary && ary.toString) return ary.toString();
	else return '';
}

function time() {
	return (new Date()).getTime();
}

function debug(msg) {
	alert("Calling function: " + debug.caller + ":\n" + msg);
}

function debugWin(title,text){
	var mywin=window.open('/','debug','location=no,toolbar=no,width=800,height=600');
	mywin.document.write('<form><h2>'+title+'</h2><center><textarea style="width:750px; height:480px;">' + text +
		'</textarea></center></form><div align="right"><A href="javascript:window.close()">[close]</A></div>');
	mywin.focus();
}

function checkAll() {
	for (var i=0, a=checkAll.arguments; i<a.length; i++) {
		if (!a[i] || a[i].length <= 0) return false;
	}
	return true;
}

function checkNth(count) {
	var c = 0;
	for (var i=1, a=checkNth.arguments; i<a.length; i++) {
		if (!a[i] || a[i].length <= 0) continue;
		c++;
	}
	return (c >= count);
}

var _cookieCache = [];
function getCookie(arg) {
	if(_cookieCache[arg] != null) {
		if(_cookieCache[arg] == '*null*') return null;
		else return _cookieCache[arg];
	}
	var argN = arg + "=";
	for (var i=0; i < document.cookie.length;) {
		var j = i + argN.length;
		if (document.cookie.substring(i, j) == argN) {
			var s = cookie_getCookieVal(j);
			_cookieCache[arg] = s;
			
			return s;
		}

		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) {
			_cookieCache[arg] = '*null*';
			break;
		}
	}
	return null;
}

function cookie_getCookieVal(offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1) endstr = document.cookie.length;

	return unescape(document.cookie.substring(offset, endstr));
}

function fixCookieDate(date) {
	var base = new Date(0);
	var skew = base.getTime(); // dawn of (Unix) time - should be 0
	if (skew > 0) date.setTime(date.getTime() - skew); // Except on the Mac - ahead of its time
	return date;
}

function addDaysToDate(date, days) {
	var t = (date)? date.getTime() : (new Date()).getTime();
	var d = days * 24000 * 3600;
	return (new Date(t + d));
}

function setCookie(name,value,expires,path,domain,secure) {
	_cookieCache[name] = value;
	document.cookie = name + "=" + escape (value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "; path=/") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
}

function deleteCookie(name,path,domain) {
	if (getCookie(name)) {
		document.cookie = name + "=" +
		((path) ? "; path=" + path : "path=/") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}


function offsetTop(id){
	var e=getDocElementById(id);
	var top=0;
	if(e){
		top = e.offsetTop;
		while((e=e.offsetParent)!=null){
			top+=e.offsetTop;
		}
	}
	return top;
}

function frameWidth() {
	if (window.innerWidth) return window.innerWidth;
	else if (document.all) return document.body.clientWidth;
}

function frameHeight() {
	if (window.innerHeight) return window.innerHeight;
	else if (document.all) return document.body.clientHeight;
}

function remainingHeight(id) {
	return frameHeight() - offsetTop(id);
}

function setPaneHeight(name, lHeight){
	var pane = getDocElementById(name+'-pane');
	var h = lHeight - getPaneOffsetHeight(name);
	if(h<0) h=0;
	if(pane) pane.style.height=h+'px';
}

function getPaneOffsetHeight(name){
	var container = getDocElementById(name);
	var header = getDocElementById(name+'-header');
	var pane = getDocElementById(name+'-pane');
	var footer = getDocElementById(name+'-footer');
	var h=0;

	if(container && pane){
		if(header) h+=header.offsetHeight;
		if(footer) h+=footer.offsetHeight;
	}
	return h;
}

function getPaneScrollYOffset(name) {
	var pane = getDocElementById(name);
	if(pane) {
		if (pane.pageYOffset != null) return pane.pageYOffset;
		else if (pane.scrollTop != null) return pane.scrollTop;
	}
	return 0;
}

function setPaneScrollYOffset(name, value) {
	var pane = getDocElementById(name);
	if(pane) {
		if (pane.pageYOffset != null) pane.pageYOffset = value;
		else if (pane.scrollTop != null) pane.scrollTop = value;
	}
}


function addWithLimit(a,o,l) {
	if (l>0 && a.length < l) a[a.length] = o;
	else { 
		for(var i=0;i<a.length-1;i++) a[i]=a[i+1];
		a[a.length-1]=o;
	}
}


 
 if (!XML_declared_already) {

var XML = new Object();
var XML_declared_already = true;

function hasKids(x) {
	return (x!=null&&x.childNodes&&x.childNodes.length>0);
}

function prepRoot() {
	if (XML.rootDocument != null) return;
	if (document.all) XML.rootDocument = new ActiveXObject("Microsoft.XMLDOM");
	else XML.rootDocument = new DOMParser().parseFromString("<empty/>","text/xml");
}

XML.hasKids = hasKids;

XML.createElement =function(n) {
	prepRoot();
	if (XML.rootDocument != null) return XML.rootDocument.createElement(n);
}

XML.createText =function(t) {
	prepRoot();
	if (XML.rootDocument != null) return XML.rootDocument.createTextNode(t);
}

XML.select =function(x,name,k,len) {
	if (!hasKids(x)) return new Array();
	var ay = new Array();
	for (var i=0,a=x.childNodes;i< a.length;i++) if (a[i].nodeName ==name) ay.add(a[i]);
	if (XML.select.arguments.length < 3) return ay;

	var atwo = new Array();
	for (var i=k;i< ay.length;i++) { atwo.add(ay[i]); if (atwo.length == len) return atwo; }
	return atwo;
}

XML.selectFirstChild =function(x) {
	if (!hasKids(x)) return null;
	for (var i=0,a=x.childNodes;i< a.length;i++) if (a[i].nodeName !="#text") return a[i];
}

XML.selectChildren =function(x) {
	if (!hasKids(x)) return null;
	var kids = new Array();
	for (var i=0,a=x.childNodes;i< a.length;i++) if (a[i].nodeName !="#text") kids.add(a[i]);
	return kids;
}

XML.selectAll =function(x) {
	if (!hasKids(x)) return new Array();
	else return XML.selectChildren(x);
}

XML.selectById = function(x,id) {
	if (!hasKids(x)) return null;
	for (var i=0,c=x.childNodes;i< c.length;i++) {
		if ((document.all || c[i].getAttribute) && (c[i].getAttribute("id") + '') == (id + '')) return c[i];
	}
	return null;
}

XML.selectOne =function(x,name,k) {
	if (!hasKids(x)) return null;
	if(XML.selectOne.arguments.length==2){
		for (var i=0,a=x.childNodes;i< a.length;i++) if (a[i].nodeName ==name) return a[i];
	} else {
		for (var i=0,c=-1,a=x.childNodes;i< a.length;i++){
			if (a[i].nodeName ==name) c++;
			if (c==k) return a[i];
		}
	}
	return null;
}

XML.getText =function() {
	var args = XML.getText.arguments;
	if (!args[0]) return null;
	var x = args[0].childNodes;
	if(args.length==1){
		if (!x||!x[0]||!x[0].nodeName||!x[0].nodeName||!x[0].nodeName.indexOf("#text")==-1) return null;
		return x[0].nodeValue;
	}
	if(!hasKids(args[0]))return null;
	return XML.getText(XML.selectOne(args[0],args[1]));
}

XML.setText =function() {
	var args =XML.setText.arguments;
	var x=args[0];
	if(args.length==2){
		var s = null;
		if (!hasKids(x)) x.appendChild(XML.createText(args[1]));
		else if (x.childNodes[0].nodeName!="#text") x.insertBefore(XML.createText(args[1]),x.childNodes[0]);
		else x.replaceChild(XML.createText(args[1]),x.childNodes[0]);
		return;
	}
	var make = !(hasKids(args[0]));
	var tmp = null;
	if (!make) {
		tmp = XML.selectOne(args[0],args[1]);
		make = (tmp == null);
	}
	if (make) {
		tmp = XML.createElement(args[1]);
		XML.addContent(args[0],tmp);
	}
	XML.setText(tmp,args[2]);
}

XML.getName = function(x) {
	if (!x) return null;
	return x.nodeName;
}

XML.getAttribute =function() {
	var args =XML.getAttribute.arguments;
	if (!args[0]) return null;
	if (args.length ==2) return args[0].getAttribute(args[1]);
	return (hasKids(args[0])?XML.selectOne(args[0],args[1]).getAttribute(args[2]):null);
}

XML.setAttribute =function() {
	var args =XML.setAttribute.arguments;
	if (args.length ==3) args[0].setAttribute(args[1],args[2]);
	else if(hasKids(args[0])) XML.selectOne(args[0],args[1]).setAttribute(args[2],args[3]);
}

XML.getAttributes =function(x,t,a) {
	if (!hasKids(x)) return null;
	var ay = new Array();
	for (var i=0,v=null;i< x.childNodes.length;i++){
		if ((document.all || x.childNodes[i].getAttribute) && x.childNodes[i].nodeName ==t){
			v =x.childNodes[i].getAttribute(a);
			if(v!=null) ay.add(v);
		}
	}
	return ay;
}

XML.addContent =function(x,b) {
	x.appendChild(b);
}

XML.insert =function(x,t,b) {
	XML.selectOne(x,t).appendChild(b);
}

XML.update =function(x,t,b) {
	x.replaceChild(b,XML.selectOne(x,t));
}

XML.parse =function(texxt) {
	var xml=null;
	if(texxt==null)	return xml;

	if (document.all) {
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		XML.rootDocument = xmlDoc;

		xmlDoc.async="false";
		xmlDoc.loadXML(texxt);
		xml = xmlDoc.documentElement;
	} else {
		var dParser = new DOMParser();
		var stuff = dParser.parseFromString(texxt,"text/xml");
		XML.rootDocument = stuff;
		xml = stuff.childNodes[0];
	}

	if(xml) xml.normalize();
	return xml;
}

XML.remove = function(x,t) {
	if (!t||t==null) while(x.childNodes.length > 0) { x.removeChild(x.childNodes[0]); }
	else {
		var i = 0;
		while(i< x.childNodes.length > 0) {
			if (x.childNodes[i].nodeName != t) { i++; continue; }
			x.removeChild(x.childNodes[i]);
		}
	}
}
XML.removeOne = function(x,name,k) {
	if (!hasKids(x)) return null;
	if(XML.removeOne.arguments.length==2){
		for (var i=0,a=x.childNodes;i< a.length;i++) if (a[i].nodeName ==name) { x.removeChild(a[i]); return; }
	}else{
		for (var i=0,c=-1,a=x.childNodes;i< a.length;i++){
			if (a[i].nodeName ==name) c++;
			if (c==k) { x.removeChild(a[i]); return; }
		}
	}
}
XML.removeById = function(x,id) {
	for (var i=0,c=x.childNodes;i< c.length;i++) {
		if ((document.all || c[i].getAttribute) && (c[i].getAttribute("id") + '') == (id + '')) x.removeChild(x.childNodes[i]);
	}
}

XML.removeByAttr = function(x,attr,id) {
	for (var i=0,c=x.childNodes;i< c.length;i++) {
		if ((document.all || c[i].getAttribute) && (c[i].getAttribute(attr) + '') == (id + '')) x.removeChild(x.childNodes[i]);
	}
}

XML.replaceById = function(x,id,n) {
	for (var i=0,c=x.childNodes;i< c.length;i++) {
		if ((document.all || c[i].getAttribute) && (c[i].getAttribute("id") + '') == (id + '')) {
			x.insertBefore(n,x.childNodes[i]);
			var victim = x.childNodes[i+1];
			x.removeChild(x.childNodes[i+1]);
			return victim;
		}
	}
	return null;
}

XML.badBrowser = false;
try {
	var v = navigator.userAgent.toLowerCase();
	if(v && v.indexOf("netscape") > -1 && v.indexOf("7.0") > -1) XML.badBrowser = true;
} catch(e) {}

XML.toString =function(x) {
	if (!x) return "";
	if (x.xml) return x.xml;
	var doExtra = XML.badBrowser;
	var xs = new XMLSerializer();

	try { if(!doExtra) return xs.serializeToString(x); }
	catch (e) { doExtra = true; }

	if(doExtra) {
				var dParser = new DOMParser();
		var stuff = dParser.parseFromString("<empty/>","text/xml");
		stuff.replaceChild(x.cloneNode(true),stuff.childNodes[0]);
		return xs.serializeToString(stuff);
	}
}
}


function sortXmlByText(xml, sortNodeName, sortOn, reverse) {
	sortXml(xml, sortNodeName, sortXmlText, sortOn, reverse);
}
function sortXmlByNumericValue(xml, sortNodeName, sortOn, reverse) {
	sortXml(xml, sortNodeName, sortXmlValue, sortOn, reverse);
}
function sortXmlByDate(xml, sortNodeName, sortOn, reverse) {
	sortXml(xml, sortNodeName, sortXmlDate, sortOn, reverse);
}

function sortXml(xml, sortNodeName, func, sortProperty, reverse) {
	var tempArray = XML.select(xml, sortNodeName);
	if(sortProperty != null && sortProperty != "") tempArray = sortXmlArray(tempArray, sortProperty, func, reverse);
	else tempArray = tempArray.sort(func);

	XML.remove(xml, sortNodeName);
	if(tempArray != null) {
		for(var i=0; i<tempArray.length; i++) {
			XML.addContent(xml, tempArray[i]);
		}
	}
}

function sortXmlArray(xmlArray, sortProperty, func, reverse) {
	sortProp = sortProperty;
	var temp = xmlArray.sort(func);
	if(reverse == true) temp = temp.reverse();
	return temp;
}

function sortXmlText(xml1, xml2) {
	var v1 = XML.getText(xml1, sortProp);
	var v2 = XML.getText(xml2, sortProp);
	if(v1 == null && v2 == null) {
		v1 = XML.getAttribute(xml1, sortProp);
		v2 = XML.getAttribute(xml2, sortProp);
	}

	return (v1<v2? -1:(v1>v2? 1:0) );
}

function sortXmlValue(xml1, xml2) {
	var v1 = XML.getText(xml1, sortProp);
	var v2 = XML.getText(xml2, sortProp);
	if(v1 == null && v2 == null) {
		v1 = XML.getAttribute(xml1, sortProp);
		v2 = XML.getAttribute(xml2, sortProp);
	}

	v1 = parseFloat(v1);
	v2 = parseFloat(v2);
	return (v1<v2? -1:(v1>v2? 1:0) );
}

function sortXmlDate(xml1, xml2) {
	var v1 = XML.getText(xml1, sortProp);
	var v2 = XML.getText(xml2, sortProp);

	v1 = new Date(v1).getTime();
	v2 = new Date(v2).getTime();
	
	return (v1<v2? -1:(v1>v2? 1:0) );
}

 
 