﻿// JScript 文件
//操作XML文件，完成Xml文件的读取和使用Xsl对Xml进行解析
var sUserAgent = navigator.userAgent;
var isKHTML = sUserAgent.indexOf("KHTML") > -1 
              || sUserAgent.indexOf("Konqueror") > -1 
              || sUserAgent.indexOf("AppleWebKit") > -1; 
var isMoz = sUserAgent.indexOf("Gecko") > -1 && !isKHTML;

//xml文件的通用操作类，完成XML文件在IE和FF下的操作
function XmlDom() {
    if (window.ActiveXObject) {
        var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
                             "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
                             "Microsoft.XmlDom"];
                         
        for (var i=0; i < arrSignatures.length; i++) {
            try {
        
                var oXmlDom = new ActiveXObject(arrSignatures[i]);
                oXmlDom.async=false;//不许异步的读取数据
                oXmlDom.validateOnParse=false;//不分析有效性
                return oXmlDom;
        
            } catch (oError) {
                //ignore
            }
        }          

        throw new Error("MSXML is not installed on your system."); 
              
    } else if (document.implementation && document.implementation.createDocument) {
        
        
        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 {
        throw new Error("Your browser doesn't support an XML DOM object.");
    }
}

if (isMoz) {
    Document.prototype.readyState = 0;
    Document.prototype.onreadystatechange = null;

    Document.prototype.__changeReadyState__ = function (iReadyState) {
        this.readyState = iReadyState;

        if (typeof this.onreadystatechange == "function") {
            this.onreadystatechange();
        }
    };

    Document.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;
    };
    
    Document.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;
        }
    };
        
        
    //读入xml字符串
    Document.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);

    };
    
    //读入xml文件
    Document.prototype.__load__ = Document.prototype.load;

    Document.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");
    });

}

//使用xsl对XML进行解析，xmlUrl:xml文件的路径，xslUrl:xsl文件的路径，contentId:存放解析后内容的控件的ID
function TransXml(xmlUrl,xslUrl,contentId)
{

    if (document.implementation && document.implementation.createDocument) {
    
        var oXmlDom = new XmlDom();
        var oXslDom = new XmlDom();
        
        oXmlDom.async = false;
        oXslDom.async = false;
        
        oXmlDom.load(xmlUrl);
        oXslDom.load(xslUrl);
        
        var oProcessor = new XSLTProcessor();
        oProcessor.importStylesheet(oXslDom);

        var oResultFragment = oProcessor.transformToFragment(oXmlDom, document);
        var oDiv = document.getElementById(contentId);
        
        oDiv.appendChild(oResultFragment);
    
    } else {
    
        var oXmlDom = new XmlDom();
        var oXslDom = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
        
        oXmlDom.async = false;
        oXslDom.async = false;
        
        oXmlDom.load(xmlUrl);
        oXslDom.load(xslUrl);
        
        var oTemplate = new ActiveXObject("Msxml2.XSLTemplate");
        oTemplate.stylesheet = oXslDom;
        
        var oProcessor = oTemplate.createProcessor();
        oProcessor.input = oXmlDom;
        oProcessor.transform();                

        var oDiv = document.getElementById(contentId);
        oDiv.innerHTML = oProcessor.output;
    }    
}

//将一个xml文档用制定的xsl文件解析，然后放到指定的控件中
function TransXmlFromDoc(xmlString,xslUrl,contentId)
{

    if (document.implementation && document.implementation.createDocument) {
    
        var oXmlDom = new XmlDom();
        var oXslDom = new XmlDom();
        
        oXmlDom.async = false;
        oXslDom.async = false;
        
        oXmlDom.loadXML(xmlString);
        oXslDom.load(xslUrl);
        
        var oProcessor = new XSLTProcessor();
        oProcessor.importStylesheet(oXslDom);

        var oResultFragment = oProcessor.transformToFragment(oXmlDom, document);
        var oDiv = document.getElementById(contentId);
        
        oDiv.appendChild(oResultFragment);
    
    } else {
    
        var oXmlDom = new XmlDom();
        var oXslDom = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
        
        oXmlDom.async = false;
        oXslDom.async = false;
        
        oXmlDom.loadXML(xmlString);
        oXslDom.load(xslUrl);
        
        var oTemplate = new ActiveXObject("Msxml2.XSLTemplate");
        oTemplate.stylesheet = oXslDom;
        
        var oProcessor = oTemplate.createProcessor();
        oProcessor.input = oXmlDom;
        oProcessor.transform();                

        var oDiv = document.getElementById(contentId);
        oDiv.innerHTML = oProcessor.output;
    }        
}

// 从制定的xDoc文档中查找制定路径的节点集合
function SelectNodesFromDoc(xDoc,XPath) {
        if (isMoz) {
            
              
            var oEvaluator = new XPathEvaluator();
            var oResult = oEvaluator.evaluate(XPath, xDoc, null, 0, null);
            var aNodes = new Array();
            if (oResult != null) {
                for (var i=0; i < oResult.snapshotLength; i++) { 
                                         
                    aNodes.push(oResult.snapshotItem(i));
                }
                var oElement = oResult.iterateNext();
                while (oElement) {
                    aNodes.push(oElement);
                    oElement = oResult.iterateNext()
                }
            }
            else
            {
                alert("nodes is null");
            }
            return aNodes;
        } else {
            return xDoc.selectNodes(XPath);
        }
    };
