var xLoad=null;

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;

	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}

	throw new Error("Could not find an installed XML parser");
}

// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();

			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}

			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);

			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}

			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	XMLDocument.prototype.loadXML =
	Document.prototype.loadXML = function (s) {

		// parse the string to a new doc
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");

		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);

		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};


	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}


function EscapeToWin(AStr){
	if (typeof(AStr)!='string') return AStr;
	var Result='',cc;
	for(var i=0;i<AStr.length;i++) {
		if(AStr.charAt(i)>='À' && AStr.charAt(i)<='ÿ') {
			cc=AStr.charCodeAt(i)-0x0410; Result+='%'+'CDEF'.charAt(cc>>>4);
			cc&=0x0F; Result+=(cc>9) ? 'ABCDEF'.charAt(cc-10): cc;
		} else if(AStr.charAt(i)=='¨')
			Result+='%A8';
		else if(AStr.charAt(i)=='¸')
			Result+='%B8';
		else if(AStr.charAt(i)=='=')
			Result+='%3D';
		else if(AStr.charAt(i)=='&')
			Result+='%26';
		else
			Result+=AStr.charAt(i);
	}
	return Result;
}

function oXMLload () {
}
	oXMLload.prototype.get = function(path,show,sync) {
		// load xml
		this.to_show=show;
		if (!path && !this.path) return; else if (path) this.path=path;
		this.before_load();
		var xmlHttp = XmlHttp.create();
		if (sync) { 
			xmlHttp.open('GET', this.path, false); // sync
			xmlHttp.send(null);
			this.load(xmlHttp.responseXML);
		} else {
			xmlHttp.open('GET', this.path, true); // async
			var _this=this;
			xmlHttp.onreadystatechange = function () {
				if (xmlHttp.readyState == 4) _this.load(xmlHttp.responseXML);
			};
			window.setTimeout(function () {xmlHttp.send(null);}, 10);
			this.loading();
		}
	}

	oXMLload.prototype.load = function(oXml) {
		if (oXml==null || oXml.documentElement == null){
			this.on_error();
			//return alert('Error reading from server!');
			return false;
		}
		this.mode=oXml.documentElement.tagName;
		if (this.mode=='error'){
			//return alert(oXml.documentElement.getAttribute('msg'));
			return false;
		}
		var store='', proc=null, nodes = oXml.documentElement.childNodes;
		for (var i = 0; i < nodes.length; i++) {
			if(nodes[i].nodeName != "#text") {
				proc=nodes[i].getAttribute('cmd');
				if (!proc || proc=='') continue;
				this[proc](nodes[i]);
			}
		}
		this.after_load();
		if (this.to_show) {
			var elm=document.getElementById(this.to_show); if (!elm) return;
			elm.style.display='block';
		}
	}

	oXMLload.prototype.store = function(oXml) {
		if (!oXml.childNodes) return;
		var store=oXml.getAttribute('in');
		if(this.store_var!==false) store=this.store_var;
		var upend=oXml.getAttribute('upend'); if (!store && !upend) return;
		if (store) {
			var astor=store.split('.');
			if (astor.length==1) str=this[store]=[];
			else str=window[astor[0]][astor[1]]=[];
		} else {
			var astor=upend.split('.');
			if (astor.length==1) {
				if (this[upend]) str=this[upend]; else str=this[upend]=[];
			} else {
				if (window[astor[0]][astor[1]]) str=window[astor[0]][astor[1]]; else str=window[astor[0]][astor[1]]=[];
			}
		}
		var byId=oXml.getAttribute('id'); var assoc=oXml.getAttribute('assoc');
		if (byId) {astor=byId.split('='); var id=parseInt(astor[1],10);}

		var nodes=oXml.childNodes, out='', i=0, j=0, n=0, atmp, na;
		for (i = 0; i < nodes.length; i++) {
			if(nodes[i].nodeName != "#text") {
				atmp=[]; na=nodes[i].attributes;
				for (j = 0; j < na.length; j++) if (assoc) atmp[na[j].name]=na[j].value; else atmp[j]=na[j].value;
				if (byId) str[atmp[id]]=atmp; else str[n++]=atmp;
			}
		}
		var store=oXml.getAttribute('run');
		if(this.show_func!==false) store=this.show_func;
		if (store) {
			astor=store.split('.');
			if (astor.length==1) this[store]();
			else window[astor[0]][astor[1]]();
		}
	}
	oXMLload.prototype.set = function(oXml) {
		var elmn=oXml.getAttribute('elm'); if (!elmn) return;
		var elm=document.getElementById(elmn); if (!elm) return;
		var val=oXml.getAttribute('text');	if (val) elm.innerHTML=val;
		var val=oXml.getAttribute('display'); if (val) elm.style.display=val;
		var val=oXml.getAttribute('value'); if (val) elm.value=val;
	}
	oXMLload.prototype.serialize = function(targets,add,save) {
		var tgt,oTgt,data, aTgt=targets.split(','), tmp, out='',name='';
		for (tgt in aTgt) {
			// find data source
			tmp=aTgt[tgt].split('.');
			if (tmp.length==1 && this[aTgt[tgt]]) data=this[aTgt[tgt]], name=aTgt[tgt];
			else if (tmp.length!=1 && window[tmp[0]][tmp[1]]) data=window[tmp[0]][tmp[1]], name=tmp[1];
			else { alert(tmp+' not found'); continue;}
			// serialize data
			if (typeof(data)=='object') out=this.make_serial(name,data);
			else out=name+'='+data;
		}
		if (add) out+=add;
		if (save) this.save(out);
		else return out;
	}
	oXMLload.prototype.make_serial = function(name,data) {
		var itm,atmp=[],out='';
		for (itm in data) {
			if (typeof(data[itm])=='object') out+=this.make_serial(name+'['+itm+']',data[itm]);
			else out+='&'+name+'['+itm+']'+'='+data[itm];
		}
		return out;
	}
	oXMLload.prototype.save = function(sData,path) {
		// sync
		if (!path) path=this.path;
		var xmlHttp = XmlHttp.create();
		xmlHttp.open("POST", path);
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlHttp.send(sData);
	}

	oXMLload.prototype.before_load = function(path) {}
	oXMLload.prototype.loading = function() {}
	oXMLload.prototype.after_load = function(path) {}
	oXMLload.prototype.on_error = function(path) {}
	oXMLload.prototype.store_var = false;
	oXMLload.prototype.show_func = false;

// abstract list loader