function xml_http_request() { this.init(); };
xml_http_request.prototype = {
	xmlhttp: null,
	xml: null,
	base_url : "index.php?module=xml",
    
	init: function() {
		try {
			this.xmlhttp = new XMLHttpRequest();
		} catch (e) {
			var msxml_xmlhttp_progids = new Array(
					"MSXML2.XMLHTTP.5.0",
					"MSXML2.XMLHTTP.4.0",
					"MSXML2.XMLHTTP.3.0",
					"MSXML2.XMLHTTP",
					"Microsoft.XMLHTTP"
					);
			for (var i = 0; i< msxml_xmlhttp_progids.length; i++) {
				try {
					this.xmlhttp = new ActiveXObject(msxml_xmlhttp_progids[i]);
				} catch (e) { }
			}
		}
	},

	get: function (url) {
		this.xmlhttp.open("GET", this.base_url + "&" + url, false);
		this.xmlhttp.send(null);
		if (this.xmlhttp.readyState == 4 && this.xmlhttp.status == 200) this.xml = this.xmlhttp.responseXML.documentElement;
		else this.xml = null;
		return (this.node2array());
	},

	node2array: function (node) {
		if (node == undefined || node == null) node = this.xml;
		var child_node;
		var has_text = false;
		for (var i = 0; i < node.childNodes.length; i++) {
			var child_node = node.childNodes[i];
			if (child_node.nodeType == 3) has_text = true;
		}
		if (has_text || node.childNodes.length == 0) {
			if (node.hasChildNodes && node.firstChild) value = node.firstChild.nodeValue;
			else value = "";
			return value;
		}
		var result = new Array();
		for (var i = 0; i < node.childNodes.length; i++) {
			var child_node = node.childNodes[i];
			var map = new Object();			
			for (var j = 0; j < child_node.childNodes.length; j++) {
				var sub_child_node = child_node.childNodes[j];
				map[sub_child_node.nodeName] = this.node2array(sub_child_node);
			}
			result[result.length] = map;
		}
		return result;
	}
}

function xmlObj() { this.init(); };
xmlObj.prototype = {
	doc:null,
	init:function() {
		if (moz) {
			this.doc = document.implementation.createDocument("", "", null)
			this.doc.async = false;
		} else if (ie) {
			this.doc = new ActiveXObject("Microsoft.XMLDOM");
			this.doc.async = false;
			while(this.doc.readyState != 4) {};
		}
	}
}
// check for XPath implementation
if( document.implementation.hasFeature("XPath", "3.0") )
{
   // prototying the XMLDocument
   XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
   {
      if( !xNode ) { xNode = this; } 
      var oNSResolver = this.createNSResolver(this.documentElement)
      var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
                   XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
      var aResult = [];
      for( var i = 0; i < aItems.snapshotLength; i++)
      {
         aResult[i] =  aItems.snapshotItem(i);
      }
      return aResult;
   }

   // prototying the Element
   Element.prototype.selectNodes = function(cXPathString)
   {
      if(this.ownerDocument.selectNodes)
      {
	     return this.ownerDocument.selectNodes(cXPathString, this);
      }
      else{throw "For XML Elements Only";}
   }
}
// check for XPath implementation
if( document.implementation.hasFeature("XPath", "3.0") )
{
   // prototying the XMLDocument
   XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
   {
      if( !xNode ) { xNode = this; } 
      var xItems = this.selectNodes(cXPathString, xNode);
      if( xItems.length > 0 )
      {
         return xItems[0];
      }
      else
      {
         return null;
      }
   }
   
   // prototying the Element
   Element.prototype.selectSingleNode = function(cXPathString)
   {	
      if(this.ownerDocument.selectSingleNode)
      {
         return this.ownerDocument.selectSingleNode(cXPathString, this);
      }
      else{throw "For XML Elements Only";}
   }
}

function xslt_transform(xmlSource, xsltSource, container) {
	var params=false;
	if(xslt_transform.arguments.length>3) {
		params=arguments[3];
	}
	if(ie) {
		var xsl=null;
		var template=null;
		var processor=null;

		xsl = new ActiveXObject("MSXML2.FreeThreadedDomDocument.3.0");
		xsl.async = false;
		xsl.loadXML(xsltSource.xml);

		template = new ActiveXObject("MSXML2.XSLTemplate")
		template.stylesheet = xsl;
		processor = template.createProcessor();

		processor.input = xmlSource;

		if(params) {
			for(key in params) {
				if(typeof(params[key])!="function") {
					processor.addParameter(key, params[key])
				}
			}
		}
		processor.transform();
		container.innerHTML=processor.output;//xmlSource.transformNode(xsltSource);
	} else if(moz) {
		var result;
		var xsltProcessor = new XSLTProcessor();
		xsltProcessor.importStylesheet(xsltSource);

		if(params) {
			for(key in params) {
				xsltProcessor.setParameter(null, key, params[key])
			}
		}

		result = xsltProcessor.transformToFragment(xmlSource, document);
		container.innerHTML="";
		container.appendChild(result);
	} else {
		alert("Your browser still not supported yet");
	}
}

function get_request(f) {
	var r=new String("");
	var j=0;
	var curEl=null;
	for(var i=0;i<f.elements.length;i++) {
		curEl=f.elements[i];
		if(curEl.name!="") {
			r+=(j>0?"&":"")+curEl.name+"="+(curEl.type=="checkbox"?(curEl.checked?"checked":"unchecked"):curEl.value);
			j++;
		}
	}
	return r;
}

function update_node(node, value) {
	var txt=null;
	if(!node.hasChildNodes()) {
		txt=document.createTextNode("");
		node.appendChild(txt);
	}
	node.firstChild.nodeValue=value;

}

function empty_node(node) {
	while(node.hasChildNodes()) {
		node.removeChild(node.firstChild);
	}
}

function string2xml(string) {
	var xml;
	if (document.all) {
		xml = new ActiveXObject("Msxml2.DOMDocument.3.0");
		xml.loadXML(string);
	} else {
		var dom_parser = new DOMParser();
		xml = dom_parser.parseFromString(string, "application/xml");
	}
	return xml;
}

function xml2string(xml) {
	if (xml == null || xml == undefined) {
		return null;
	}
	if (document.all) {
		return xml.xml;
	} else {
		try {
			return (new XMLSerializer()).serializeToString(xml);
		} catch (e) {
			return false;
		}
	}
}

function form2string(f) {
	var res = new String("");
	var arr = new Array();
	var e = null;
	var j = 0;
	for(var i=0;i<f.elements.length;i++) {
		e = f.elements[i];
		if((e.name!='')&&(!(e.type=="checkbox"&&!e.checked))) {
			if(e.nodeName == "SELECT") {
				for(var o=0;o<e.options.length;o++) {
					if(e.options[o].selected) {
						arr[j] = encodeURIComponent(e.name)+"="+encodeURIComponent(e.options[o].value);
						j++;                                                                   
					}
				}
				j--;
			} else {
				arr[j] = encodeURIComponent(e.name)+"="+encodeURIComponent(e.value);
			}
			j++;
		}
	}
	for(var i=0;i<arr.length;i++) {
		res += (i!=0 ? "&" : "")+arr[i];
	}
	return res;
}


function form2string2(f) {
	var res = new String("");
	var arr = new Array();
	var e = null;
	var j = 0;
	for(var i=0;i<f.elements.length;i++) {
		e = f.elements[i];
		if(e.name!='') {
			if(e.nodeName == "SELECT") {
				for(var o=0;o<e.options.length;o++) {
					if(e.options[o].selected) {
						arr[j] = encodeURIComponent(e.name)+"="+encodeURIComponent(e.options[o].value);
						j++;                                                                   
					}
				}
			} else if(e.type=="checkbox") {
				arr[j] = encodeURIComponent(e.name)+"="+encodeURIComponent(e.checked ? "1" : "0");
			} else {
				arr[j] = encodeURIComponent(e.name)+"="+encodeURIComponent(e.value);
			}
			j++;
		}
	}
	for(var i=0;i<arr.length;i++) {
		res += (i!=0 ? "&" : "")+arr[i];
	}
	return res;
}

function form2xmlstring(f) {
	var res = new String("");
	var arr = new Array();
	var e = null;
	var j = 0;
	for(var i=0;i<f.elements.length;i++) {
		e = f.elements[i];
		if(e.name!='') {
			arr[j] = "<"+e.name+">"+(e.type=="checkbox" ? (e.checked ? "1" : "0") : e.value)+"</"+e.name+">";
			j++;
		}
	}
	res = "<item>\n";
	for(var i=0;i<arr.length;i++) {
		res += arr[i]+"\n";
	}
	res += "</item>\n"
	return res;
}

function loadXMLByAction(a) {
	httpRequest.xmlhttp.open("POST", scriptName, false, "", "");
	httpRequest.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpRequest.xmlhttp.send("action="+a);
//alert(httpRequest.xmlhttp.responseText);
	return httpRequest.xmlhttp.responseXML;
}

function loadTextByAction(a) {
	httpRequest.xmlhttp.open("POST", scriptName, false, "", "");
	httpRequest.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpRequest.xmlhttp.send("action="+a);
//alert(httpRequest.xmlhttp.responseText);
	return httpRequest.xmlhttp.responseText;
}

function xmlLoader() { this.init(); };
xmlLoader.prototype = {
	objects: null,
    onloadstart: null,
    onloadend: null,

	_c:0,

	init: function() {
		this.objects = new Array();
	},

	free: function() {
		for(var i in this.objects) {
			delete this.objects[i];
		}
		this.init();           
	},

	add: function(url, action) {
		var i = this.objects.length;
		this.objects.push({url:url, action:action, xhr:new xml_http_request(), response:null, callback:function(){stateChanged(i);}});
	},

	view: function() {
		for(var i=0;i<this.objects.length;i++) {
			alert(this.objects[i].url+" "+this.objects[i].action+" "+this.objects[i].xhr);
		}
	},

	load: function() {
		currentLoader = this;
		if(this.onloadstart) {
			this.onloadstart.call();
		}
		this._c = this.objects.length;

		for(var i=0;i<this.objects.length;i++) {
			this.objects[i].xhr.xmlhttp.open("POST", this.objects[i].url, true, "", "");
			this.objects[i].xhr.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			this.objects[i].xhr.xmlhttp.onreadystatechange = this.objects[i].callback;
			this.objects[i].xhr.xmlhttp.send(this.objects[i].action);
		}
	}
}

function stateChanged(idx) {
	if(currentLoader.objects[idx].xhr.xmlhttp.readyState==4) {
	//alert(currentLoader.objects[idx].xhr.xmlhttp.responseText);
		currentLoader.objects[idx].response = currentLoader.objects[idx].xhr.xmlhttp.responseXML;
		currentLoader._c--;
		if(currentLoader._c<=0) {
			if(currentLoader.onloadend) {
				currentLoader.onloadend.call();
			}
		}
		
	}
}
