
var xpath_checker = {};

xpath_checker = {

    init: function () {
        xpath_checker.check();
    }

    ,
    reset_field: function (id) {
        var el = document.getElementById(id);
        if (el.value && !el.getAttribute('reset')) {
            el.value = "";
            el.setAttribute('reset', true);
            document.getElementById("result").value = "";
        }
    }

    ,
    check: function () {

        xpath_checker.xmlString = "";

        var xPath = document.getElementById("query").value;

        var xmlString = document.getElementById("xml").value;

        if (xmlString != xpath_checker.xmlString) {
            xpath_checker.xmlString = xmlString;
            xpath_checker.xmlDoc = xpath_checker.createXMLDoc(xmlString);
        }

        document.getElementById("result").value = "";

        var nodes;
        if (xPath!='')
            nodes = xpath_checker.selectNodes(xpath_checker.xmlDoc, xPath)

        if (nodes) {
            var result = "";
            for (var i = 0; i < nodes.length; i++) {
                result += xpath_checker.getNodeView(xpath_checker.selectSingleNode(nodes[i], ".")) + "\n";
            }
            document.getElementById("result").value = result;
        }
    }

    ,
    getNodeView: function (node) {
        var result = "";

        var attr = "";

        if (node.attributes && node.attributes.length > 0) {
            attr = " ";
            for (var i = 0; i < node.attributes.length; i++)
            attr += node.attributes[i].nodeName + "=\"" + node.attributes[i].nodeValue + "\" ";
        }

        var internal = (node.childNodes[0] && node.childNodes[0].nodeValue) ? node.childNodes[0].nodeValue.substr(0, 30) : "";
        result = "<" + node.tagName + attr + ">" + internal + "...</" + node.tagName + ">";

        return result;
    }

    ,
    selectNodes: function (DomElement, XPathPattern) {

        if (window.ActiveXObject && DomElement) DomElement.setProperty("SelectionLanguage", "XPath");

        if ((XPathPattern == null) || (DomElement == null) || (XPathPattern == "")) return null;

        if (window.ActiveXObject) {
            var result;
            try {
                result = DomElement.selectNodes(XPathPattern)
            } catch (ex) {
                return false;
            }
            return result;
        } else {
            var theParentDoc = (DomElement.nodeName == '#document') ? DomElement : DomElement.ownerDocument;

            try {
                var iterator = theParentDoc.evaluate(XPathPattern, DomElement, null, XPathResult.ANY_TYPE, null);
                var relayArr = new Array();
                var index = 0
                while (it = iterator.iterateNext()) {
                    relayArr[index] = it;
                    index++
                }
                return relayArr;
            }
            catch (ex) {
                return false;
            }
        }
    }

    ,
    selectSingleNode: function (DomElement, XPathPattern) {
        if ((XPathPattern == null) || (DomElement == null)) {
            return null;
        }

        if (window.ActiveXObject) {
            return DomElement.selectSingleNode(XPathPattern);
        } else {
            var theParentDoc = (DomElement.nodeName == '#document') ? DomElement : DomElement.ownerDocument;
            var iterator = theParentDoc.evaluate(XPathPattern, DomElement, null, XPathResult.ANY_TYPE, null);
            var theNode = iterator.iterateNext();
            if (theNode != null) {
                return theNode;
            } else {
                return null;
            }
        }
    }

    ,
    createXMLDoc: function (xmlString) {

        if (window.ActiveXObject) {
            var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(xmlString);
        } else {
            var xmlDoc = new DOMParser().parseFromString(xmlString, "text/xml");
        }

        return xmlDoc;
    }

    ,
    getNodeText: function (node) {
        if (typeof (node) != "object") return '';

        if (!node) return '';

        if (!node.hasChildNodes()) return '';

        return node.childNodes[0].nodeValue;
    }

    ,
    isSpecialKey: function (k) {
        return k == 9 || k == 13 || k == 40 || k == 27 || (k == 16) || (k == 17) || (k >= 18 && k <= 20) || (k >= 33 && k <= 35) || (k >= 36 && k <= 39) || (k >= 44 && k <= 45);
    }

    ,
    help: function () {
        var h = document.getElementById('help');
        if (h.style.visibility == "visible") {
            h.style.visibility = "hidden";
        } else {
            var dw = document.body.clientWidth;
            h.style.left = parseInt(dw / 2);
            h.style.visibility = "visible";
        }
    }



}

