var zXml={
	useActiveX:(typeof ActiveXObject!="undefined"),
	useDom:document.implementation&&document.implementation.createDocument,
	useXmlHttp:(typeof XMLHttpRequest!="undefined")
};

zXml.ARR_XMLHTTP_VERS=["MSXML2.XmlHttp.6.0","MSXML2.XmlHttp.3.0"];
zXml.ARR_DOM_VERS=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0"];
zXml.AJAX_EVENTS = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

function zXmlHttp()
{
}

zXmlHttp.createRequest=function(){
	if(zXml.useXmlHttp){
		return new XMLHttpRequest();
	}else if(zXml.useActiveX){
		if(!zXml.XMLHTTP_VER){
			for(var i=0;i<zXml.ARR_XMLHTTP_VERS.length;i++){
				try{
					new ActiveXObject(zXml.ARR_XMLHTTP_VERS[i]);
					zXml.XMLHTTP_VER=zXml.ARR_XMLHTTP_VERS[i];
					break;
				}catch(oError){;}
			}
		}
		if(zXml.XMLHTTP_VER){
			return new ActiveXObject(zXml.XMLHTTP_VER);
		}else{
			throw new Error("Could not create XML HTTP Request.");
		}
	}else{
		throw new Error("Your browser doesn't support an XML HTTP Request.");
	}
};

zXmlHttp.Request = function (url, options) {
    this.method = options.method || "get";
    this.asynchronous = options.asynchronous || true;
    this.params = options.parameters;
    this.onComplete = options.onComplete || function (){};
    this.onSuccess = options.onSuccess || function (){};
    this.onError = options.onError || function (){ alert("Error!"); };
    this.xmlHttp = zXmlHttp.createRequest();
    this.body = this.method == 'post' ? (options.postBody || this.params) : null;
    this.headers = {};
    this.options = {};
    this.options.contentType = options.contentType || "text/html";
    this.options.encoding = options.encoding || "utf-8";
    if (this.xmlHttp) {
		try{
			var loader = this;
			this.xmlHttp.onreadystatechange = function () {
				loader.onReadyState.call(loader);
			}
			
            if (this.method == 'post')
              this.headers['Content-type'] = this.options.contentType +
                (this.options.encoding ? '; charset=' + this.options.encoding : '');
                
            if (this.xmlHttp.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
                this.headers['Connection'] = 'close';
                
            for (var name in this.headers) 
                this.xmlHttp.setRequestHeader(name, this.headers[name]);
            if (this.method == 'get' && this.params)
                url += (url.indexOf('?') > -1 ? '&' : '?') + this.params;
                
            this.xmlHttp.onreadystatechange = function () {
                var readyState = loader.xmlHttp.readyState;
                if (readyState > 1) {
                    var state = zXml.AJAX_EVENTS[readyState];
                    try
                    {
                        if (state == 'Complete') {
                            loader.onComplete(loader.xmlHttp);
                        }
                        if (loader.xmlHttp.status >= 200 && loader.xmlHttp.status < 300) {
                            loader.onSuccess(loader.xmlHttp);
                        }
                    } catch (e) {}
                }
            };
			this.xmlHttp.open(this.method, url, this.asynchronous);
			this.xmlHttp.send(this.body);
		} catch (err) {
			this.onError.call(this);
		}
    }

//    this.onSuccess
//    onComplete
//    method
//    contentType
//    encoding
//    postBody
//    parameters
//    asynchronous
};

zXmlHttp.isSupported=function(){
	return zXml.useXmlHttp||zXml.useActiveX;
};

function zXmlDom(){}

zXmlDom.createDocument=function(){
	if(zXml.useDom){
		var oXmlDom=document.implementation.createDocument("","",null);
		oXmlDom.parseError={
			valueOf:function(){
				return this.errorCode;
			},
			toString:function(){
				return this.errorCode.toString()
			}
		};
		oXmlDom.__initError__();
		oXmlDom.addEventListener("load",function(){
			this.__checkForErrors__();
			this.__changeReadyState__(4);
		},false);
		return oXmlDom;;
	}else if(zXml.useActiveX){
		if(!zXml.DOM_VER){
			for(var i=0;i<zXml.ARR_DOM_VERS.length;i++){
				try{
					new ActiveXObject(zXml.ARR_DOM_VERS[i]);
					zXml.DOM_VER=zXml.ARR_DOM_VERS[i];
					break;
				}catch(oError){;}
			}
		}
		if(zXml.DOM_VER){
			return new ActiveXObject(zXml.DOM_VER);
		}else{
			throw new Error("Could not create XML DOM document.");
		}
	}else{
		throw new Error("Your browser doesn't support an XML DOM document.");
	}
};

zXmlDom.isSupported=function(){
	return zXml.useDom||zXml.useActiveX;
};
var oMozDocument=null;
if(typeof XMLDocument!="undefined"){
	oMozDocument=XMLDocument;
}else if(typeof Document!="undefined"){
	oMozDocument=Document;
}if(oMozDocument&&!window.opera){
	oMozDocument.prototype.readyState=0;
	oMozDocument.prototype.onreadystatechange=null;
	oMozDocument.prototype.__changeReadyState__=function(iReadyState){
		this.readyState=iReadyState;
		if(typeof this.onreadystatechange=="function"){
			this.onreadystatechange();
		}
	};
	oMozDocument.prototype.__initError__=function(){
		this.parseError.errorCode=0;
		this.parseError.filepos=-1;
		this.parseError.line=-1;
		this.parseError.linepos=-1;
		this.parseError.reason=null;
		this.parseError.srcText=null;
		this.parseError.url=null;
	};
	oMozDocument.prototype.__checkForErrors__=function(){
		if(this.documentElement.tagName=="parsererror"){
			var reError=/>([\s\S]*?)Location:([\s\S]*?)Line Number(\d+),Column(\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
			reError.test(this.xml);
			this.parseError.errorCode=-999999;
			this.parseError.reason=RegExp.$1;
			this.parseError.url=RegExp.$2;
			this.parseError.line=parseInt(RegExp.$3);
			this.parseError.linepos=parseInt(RegExp.$4);
			this.parseError.srcText=RegExp.$5;
		}
	};
	oMozDocument.prototype.loadXML=function(sXml){
		this.__initError__();
		this.__changeReadyState__(1);
		var oParser=new DOMParser();
		var oXmlDom=oParser.parseFromString(sXml,"text/xml");
		
		while(this.firstChild){
			this.removeChild(this.firstChild);
		}
		
		for(var i=0;i<oXmlDom.childNodes.length;i++){
			var oNewNode=this.importNode(oXmlDom.childNodes[i],true);
			this.appendChild(oNewNode);
		}
		this.__checkForErrors__();
		this.__changeReadyState__(4);
	};
	oMozDocument.prototype.__load__=oMozDocument.prototype.load;
	oMozDocument.prototype.load=function(sURL){
		this.__initError__();
		this.__changeReadyState__(1);
		var thisObj = this;
		setTimeout( function () { thisObj.__load__(sURL); }, 10);
	};
	Node.prototype.__defineGetter__("xml",function(){
		var oSerializer=new XMLSerializer();
		return oSerializer.serializeToString(this,"text/xml");
	});
	Node.prototype.__defineGetter__("text",function(){
		var sText="";
		for(var i=0;i<this.childNodes.length;i++){
			if(this.childNodes[i].hasChildNodes()){
				sText+=this.childNodes[i].text;
			}else{
				sText+=this.childNodes[i].nodeValue;
			}
		}
		return sText;
	});
}

function zXslt(){}

zXslt.transformToText=function(oXml,oXslt){
	if(typeof XSLTProcessor!="undefined"){
		var oProcessor=new XSLTProcessor();
		oProcessor.importStylesheet(oXslt);
		var oResultDom=oProcessor.transformToDocument(oXml);
		var sResult=oResultDom.xml;
		if(sResult.indexOf("<transformiix:result")>-1){
			sResult=sResult.substring(sResult.indexOf(">")+1,sResult.lastIndexOf("<"));
		}
		return sResult;;
	}else if(zXml.useActiveX){
		return oXml.transformNode(oXslt);
	}else{
		throw new Error("No XSLT engine found.");
	}
};

function zXPath(){}zXPath.selectNodes=function(oRefNode,sXPath,oXmlNs){
	if(typeof XPathEvaluator!="undefined"){
		oXmlNs=oXmlNs||{};
		var nsResolver=function(sPrefix){
			return oXmlNs[sPrefix];
		};
		var oEvaluator=new XPathEvaluator();
		var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsResolver,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
		var aNodes=new Array;
		if(oResult!=null){
			var oElement=oResult.iterateNext();
			while(oElement){
				aNodes.push(oElement);
				oElement=oResult.iterateNext();
			}
		}
		return aNodes;
	}else if(zXml.useActiveX){
		if(oXmlNs){
			var sXmlNs="";
			for(var sProp in oXmlNs){
				sXmlNs+="xmlns:"+sProp+"=\'"+oXmlNs[sProp]+"\' ";
			}
			oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);
		};
		return oRefNode.selectNodes(sXPath);
	}else{
		throw new Error("No XPath engine found.");
	}
};

zXPath.selectSingleNode=function(oRefNode,sXPath,oXmlNs){
	if(typeof XPathEvaluator!="undefined"){
		;oXmlNs=oXmlNs||{};
		var nsResolver=function(sPrefix){
			return oXmlNs[sPrefix];
		};
		var oEvaluator=new XPathEvaluator();
		var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
		if(oResult!=null){
			return oResult.singleNodeValue;
		}else{
			return null;
		};
	}else if(zXml.useActiveX){
		if(oXmlNs){
			var sXmlNs="";
			for(var sProp in oXmlNs){
				sXmlNs+="xmlns:\'"+sProp+"="+oXmlNs[sProp]+"\' ";
			}
			oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);
		};
		return oRefNode.selectSingleNode(sXPath);
	}else{
		throw new Error("No XPath engine found.");
	}
};
//zXPath.getElementByTagName: function (oRefNode, tagName) {
//	if (zXml.useActiveX)
//			xmlNodes = this.xmlDoc.selectNodes(xPath);
//	else{
//		var oEvaluator = new XPathEvaluator();
//		var oResult = oEvaluator.evaluate(xPath, this.xmlDoc.documentElement, null,
//			XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

//		var oElement;
//		xmlNodes = [];
//		while (oElement = oResult.iterateNext()) {
//			  xmlNodes.push(oElement);
//		}
//	}
//	
//	return xmlNodes;
//}

function zXMLSerializer(){}

zXMLSerializer.prototype.serializeToString=function(oNode){
	var sXml="";
	switch(oNode.nodeType){
		case 1: sXml="<"+oNode.tagName;
				for(var i=0;i<oNode.attributes.length;i++){
					sXml+=" "+oNode.attributes[i].name+"=\""+oNode.attributes[i].value+"\"";
				}sXml+=">";
				for(var i=0;i<oNode.childNodes.length;i++){
					sXml+=this.serializeToString(oNode.childNodes[i]);
				}
				sXml+="</"+oNode.tagName+">";
				break;
		case 3: sXml=oNode.nodeValue;
				break;
		case 4: sXml="<![CDATA["+oNode.nodeValue+"]]>";
				break;
		case 7: sXml="<?"+oNode.nodevalue+"?>";
				break;
		case 8: sXml="<!--"+oNode.nodevalue+"-->";
				break;
		case 9: for(var i=0;i<oNode.childNodes.length;i++){
					sXml+=this.serializeToString(oNode.childNodes[i]);
				}
				break;
	};
	return sXml;
};







