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;
};


