if (!SIGI) throw ("SIGI.XML depends on the following scripts. Please make sure these are included.\nSIGI.js");
function XMLObject() {
    this.Base = Base;
}
XMLObject.inherits(SIGI.Base);

XMLObject.prototype.XMLDocument = function(xml, remote) {
    if (!remote) remote = false;
    var xmlDoc;
    if (SIGI.Browser.isIE) {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        if (xml) {
            if (remote) {
                xmlDoc.async = false;
                xmlDoc.load(xml);
            } else if (typeof (xml) == "string") {
                xmlDoc.loadXML(xml);
            } else if (typeof (xml) == "object") {
                return xml;
            }
        }
    } else {
        var xmlDoc = document.implementation.createDocument("", "", null);
        if (xml) {
            if (remote) {
                var xmlXMLHttp = this.XMLHttpRequest();
                xmlXMLHttp.open("GET", xml, false);
                xmlXMLHttp.send(null);
                xmlDoc = this.XMLDocument(xmlXMLHttp.responseText);
            } else if (typeof (xml) == "string") {
                var dparser = new DOMParser();
                xml = xml.replace(/&amp;/gi, "&#38;");
                xml = xml.replace(/&lt;/gi, "&#60;");
                xml = xml.replace(/&gt;/gi, "&#62;");
                xml = xml.replace(/&nbsp;/gi, "&#160;");
                xmlDoc = dparser.parseFromString(xml, "text/xml");
            } else if (typeof (xml) == "object") {
                var cloneNode = xmlDoc.importNode(xml, true);
                xmlDoc.appendChild(cloneNode);
            }
        }
    }
    return xmlDoc;
}

XMLObject.prototype.XMLHttpRequest = function() {
    var http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new window.XMLHttpRequest();
        if (http_request.overrideMimeType) {
            // ensures that the returned data is of the correct mime type
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) { }
        }
    }
    if (!http_request) {
        throw ("Your browser does not support XMLHttp");
    } else {
        return http_request;
    }
}

XMLObject.prototype.getXmlDataIsland = function(id) {
    var xmlNode = document.getElementById(id);
    if (SIGI.Browser.isIE) {
        return xmlNode;
    } else if (xmlNode && xmlNode.hasChildNodes()) {
        //return new this.XMLDocument(xmlNode.getElementsByTagName("ROW"));
        return new this.XMLDocument(xmlNode.innerHTML);
    }
}

XMLObject.prototype.transform = function(xmlNode, styleSheet, parentID, xPath, vars) {
    try {
        var xml = null;
        var node = null;
        if (typeof xmlNode == "object") {
            xml = xmlNode;
        } else {
            xml = this.getXmlDataIsland(xmlNode);
        }

        var parent = null;
        if (typeof parentID == "object") {
            parent = parentID;
            parentID = parent.id;
        }
        else {
            parent = document.getElementById(parentID);
        }

        if (xml) {
            if (parent) {
                parent.innerHTML = "";
            }
            if (xPath) {
                node = xml.selectSingleNode(xPath);
            } else {
                node = xml;
            }
            var xsl = null;
            if (typeof styleSheet == "string") {
                var xslXMLHttp = new this.XMLHttpRequest();
                xslXMLHttp.open("GET", styleSheet, false);
                xslXMLHttp.send(null);
                xsl = new this.XMLDocument(xslXMLHttp.responseText);
            }
            else {
                xsl = styleSheet;
            }
            var xslString = "";
            if (xsl.xml) {
                xslString = xsl.xml;
            }
            else {
                if (typeof (XMLSerializer) != "undefined") {
                    var serializer = new XMLSerializer();
                    xslString = serializer.serializeToString(xsl);
                }
            }

            if (vars) {
                strToInject = "";
                var arr = vars.split(";");
                for (i = 0; i < arr.length; i++) {
                    var item = arr[i].split(":");
                    //strToInject += "<xsl:variable name=\"" + item[0] + "\" select='" + item[1] + "' />"
                    strToInject += "<xsl:variable name=\"" + item[0] + "\" select='\"" + item[1] + "\"' />";
                }
                //xsl.xml = xsl.xml.replace("<xsl:template match=\"/\">", "<xsl:template match=\"/\">" + strToInject)
                idxRoot = xslString.indexOf("<xsl:stylesheet");
                idxEnd = xslString.indexOf(">", idxRoot + 1) + 1;
                rootString = xslString.substring(idxRoot, idxEnd);
                xsl = new this.XMLDocument(xslString.replace(rootString, rootString + "\n\t" + strToInject + "\n\t"));
            }
            var html = "";
            if (SIGI.Browser.isIE) {
                html = node.transformNode(xsl);
                if (parent) {
                    parent.insertAdjacentHTML("beforeEnd", html);
                }
            } else {
                var xsltProcessor = new XSLTProcessor();
                xsltProcessor.importStylesheet(xsl);
                var fragment = xsltProcessor.transformToFragment(node, document);
                if (parent) {
                    parent.appendChild(fragment);
                    html = parent.innerHTML;
                }
                else {
                    var el = document.createElement('div');
                    el.appendChild(fragment);
                    html = el.innerHTML;
                }
                html = html.replace(/&amp;/gi, "&");
                html = html.replace(/&lt;/gi, "<");
                html = html.replace(/&gt;/gi, ">");
                if (parent) {
                    parent.innerHTML = html;
                }
            }
            try {
                if (setHover) {
                    setHover(parent, "true");
                }
            }
            catch (ex) {
            }
            return html;
        }
    } catch (ex) {
        //debugger;
    }
}

XMLObject.prototype.getInnerXml = function(node) {
    var ELEMENT_NODE = 1;
    var ATTRIBUTE_NODE = 2;
    var TEXT_NODE = 3;
    var CDATA_SECTION_NODE = 4;
    var s = "<" + node.nodeName;
    if (node.hasChildNodes()) {
        for (var i = 0; i < node.childNodes.length; i++) {
            if (node.childNodes[i].nodeType == TEXT_NODE)
                s += ">" + node.childNodes[i].nodeValue;
            if (node.childNodes[i].nodeType == ELEMENT_NODE)
                s += getInnerXml(node.childNodes[i]);
        }
        s += "</" + node.nodeName + ">";
    } else {
        s += "></" + node.nodeName + ">";
    }
    return s;
}

// check for XPath implementation
//if (document.implementation.hasFeature("XPath", "3.0")) {
// prototying the XMLDocument
XMLObject.prototype.selectNodes = function(cXPathString, xNode) {
    isFF = document.implementation.hasFeature("XPath", "3.0");
    if (cXPathString == null || cXPathString == "") {
        if (isFF) {
            cXPathString = "//row";
        }
        else {
            cXPathString = "//ROW";
        }
    }
    if (isFF) {
        if (!xNode) { xNode = this; }
        var oEvaluator = new XPathEvaluator();
        var oNSResolver = oEvaluator.createNSResolver(xNode);
        var aItems = oEvaluator.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var aResult = [];
        for (var i = 0; i < aItems.snapshotLength; i++) {
            aResult[i] = aItems.snapshotItem(i);
        }
        return aResult;
    }
    else {
        if (xNode.documentElement == null) {
            return xNode.selectNodes(cXPathString)
        }
        else {
            return xNode.documentElement.selectNodes(cXPathString)
        }

    }
};
//}

SIGI.XML = new XMLObject();
