var zXml = {
	useActiveX:(typeof ActiveXObject!="undefined"), useDom:document.implementation&&document.implementation.createDocument, useXmlHttp:(typeof XMLHttpRequest!="undefined")
	};
	zXml.ARR_XMLHTTP_VERS = ["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];
	zXml.ARR_DOM_VERS=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];;
	
	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.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);
				this.__load__(sURL);
				
			};
			
			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,sXmlNs){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.");}};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;};