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) {
            var axo = new ActiveXObject(zXml.DOM_VER);
            if (axo.readyState == null) {
                axo.readyState = function(val) {
                    var value = val;

                    this.getValue = function() {
                        if (BrowserDetect.browser == "Firefox" && BrowserDetect.version >= 3.6) {
                            return value;
                        }
                        else {
                            return this.readyState;
                        }
                    };

                    this.setValue = function(val) {
                        if (BrowserDetect.browser == "Firefox" && BrowserDetect.version >= 3.6) {
                            value = val;
                        }
                        else {
                            this.readyState = val;
                        }
                    };
                }
            }
            return axo;
        } 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 != null && !window.opera) {

    // 04/26/10 boh - added to support ff 3.6
    oMozDocument.prototype.readyState = function(val) {
        var value = val;

        this.getValue = function() {
            if (BrowserDetect.browser == "Firefox" && BrowserDetect.version >= 3.6) {
                return value;
            }
            else {
                return this.readyState;
            }
        };

        this.setValue = function(val) {
            if (BrowserDetect.browser == "Firefox" && BrowserDetect.version >= 3.6) {
                value = val;
            }
            else {
                this.readyState = val;
            }
        };
    }

	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,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.");
				}
			};

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;
						   };
