function SpdtAJAX() {
    this.POST_METHOD = "POST";
    this.GET_METHOD = "GET";
}
SpdtAJAX.prototype.getRequest = function() {
    var rtno = null;
    if (window.XMLHttpRequest) {
        rtno = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        rtno = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return rtno;
}
SpdtAJAX.prototype.getXML = function(url,prmts,method) {
    var rtno = null;
    if (!method) method = this.GET_METHOD;
    if (!prmts) prmts = null;
    var req = this.getRequest();
    req.open(method, url, false);
    if (method == this.POST_METHOD) {
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    req.send(prmts);
    if (req.readyState == 4) {
        if (req.status == 200 || req.status == 0) {
            rtno = req.responseXML;
        }
    }
    return rtno;
}
SpdtAJAX.prototype.sendXML = function(url,xmlDom) {
    var rtno = null;
    var req = this.getRequest();
    req.open(this.POST_METHOD, url, false);
    req.send(xmlDom);
    if (req.readyState == 4) {
        if (req.status == 200 || req.status == 0) {
            rtno = req.responseXML;
        }
    }
    return rtno;
}
SpdtAJAX.prototype.getElementsByXPath = function (source, xpath) {
    if (source) {
        if (window.ActiveXObject) {
            return source.selectNodes(xpath);
        } else if (document.implementation && document.implementation.createDocument) {
          // code for Mozilla, Firefox, Opera, etc.    
            var rtno = new Array();
            var nodes = document.evaluate(xpath, xml, null, XPathResult.ANY_TYPE, null);
            var result = nodes.iterateNext();
            while (result) {
                rtno.push(result);
                result = iterateNext();
            }
            return rtno;
        }
    }
}
SpdtAJAX.prototype.toTokenBase = function (str,token) {
    var aTokens = str.split(token)
    var rtno = new Array();
    rtno[0] = aTokens[0];
    rtno[1] = "";
    for(var n=1; n < aTokens.length; n++) {
        rtno[1]+=aTokens[n];
        if (n < aTokens.length -1) {
            rtno[1]+=token;
        }
    }
    return rtno;
}
SpdtAJAX.prototype.getElement = function (source,xpath,ns) {
    var rtno = null;
    var tokenBase = this.toTokenBase(xpath,"/");
    var element = null;
    var elements = null;
    
    if (tokenBase[0].indexOf('[') == -1) {
        elements = this.getElementsByName(source,tokenBase[0],ns);
        element = (elements.length == 1) ? elements[0] : null;
    } else {
        element = this.getElementByExpr(source,tokenBase[0],ns);
    }
    if (element) {
        if (tokenBase[1] != "") {
            element = this.getElement(element,tokenBase[1],ns);
        }
    } else if (elements) {
        if (elements.length > 1) {
            if (tokenBase[1] != "") {
                for(var n=0; n < elements.length; n++) {
                    element = elements[n];
                    element = this.getElement(element,tokenBase[1],ns);
                    if (element) {
                        break;
                    }
                }
            } else {
              element = elements[0] ;
            }
        }
    }
    return element;
}
SpdtAJAX.prototype.getElementsByName =  function (source,name,ns) {
    if (source.getElementsByTagNameNS) {
        var pos = name.indexOf(":");
        if (pos > 0) {
            return source.getElementsByTagNameNS(ns,name.substring(pos+1));
        } else {
            return source.getElementsByTagNameNS(ns,name);
        }
    } else {
        return source.getElementsByTagName(name);
    }
}
SpdtAJAX.prototype.getElementByExpr = function(source,xexpr,ns) {
    var pos = xexpr.indexOf('[');
    var name = xexpr.substring(0,pos);
    var expr = xexpr.substring(pos+1,xexpr.length-1);
    var veri = this.getExprArray(expr);
    var element = null;
    var elements = null;
    var attributes = null;
    var attribute = null;
    var found = false;
    for(var n = 0; n < veri.length; n++) {
        comparable = veri[n];
        if (comparable.type == "E") {
            elements = this.getElementsByName(source,comparable.name,ns);
            for(var x=0; x < elements.length; x++) {
                element = elements[x];
                if (element.nodeValue == comparable.value) {
                    found=true;
                    break;
                }
            }
        }
        if (comparable.type == "A") {
            elements = this.getElementsByName(source,name,ns);
            if (elements.length > 0) {
                for(var x=0; x < elements.length; x++) {
                    element = elements[x];
                    if (element.getAttribute(comparable.name) == comparable.value) {
                        found=true;
                        break;
                    }
                }
            } else {
                if (source.getAttribute(comparable.name) == comparable.value) {
                    element = source;
                    found=true;
                    break;
                }
            }
        }
        if (found) {
            break;
        }
    }
    if (!found) {
        element = null;
    }
    return element;
}
SpdtAJAX.prototype.getExprArray = function(expr) {
    var rtno = new Array();
    var inName=true;
    var inValue=false;
    var endedExpr = false;
    var ch = "";
    var name = "";
    var value = "";
    var comasCount = 0;
    for(var n=0; n < expr.length; n++) {
        ch = expr.charAt(n);
        if (inName) {
            if (ch == "=") {
                inName=false;
                inValue=true;
            } else {
                name+=ch;
            }
        }
        if (inValue) {
            if (ch == "'") {
                comasCount++;
            }
            if ((comasCount == 2)) {
                inValue=false;
                endedExpr=true;
            } else if (ch != "'") {
                if (comasCount > 0) {
                    value+=ch;
                }
            }
        }
        if (endedExpr) {
            if (name.indexOf("@") == 0) {
                rtno[rtno.length] = new Comparable("A",name.substring(1),"=",value);
            } else {
                rtno[rtno.length] = new Comparable("E",name,"=",value);
            }
            inName=true;
            inValue=false;
            endedExpr = false;
            name = "";
            value = "";
            comasCount = 0;
        }
    }
    return rtno;
}

SpdtAJAX.prototype.transform = function (xslDoc,xmlDoc,displayDiv) {
    if (window.ActiveXObject) {
        //displayDiv.innerHTML = xmlDoc.transformNode(xslDoc);
        displayDiv.insertAdjacentHTML("afterBegin",xmlDoc.transformNode(xslDoc));
    } else if (window.XMLHttpRequest) {
        var parser = new DOMParser();
        var xsltProcessor = new XSLTProcessor();
        xsltProcessor.importStylesheet(xslDoc);
        var trResult = xsltProcessor.transformToFragment(xmlDoc, document);
        //displayDiv.innerHTML = "";
        displayDiv.appendChild(trResult);
        displayDiv.innerHTML = displayDiv.innerHTML.replace( /&lt;(([^&]|\&[^g]|&g[^t]|&gt[^;])+)&gt;/g, "<$1>" );
    }  
}
SpdtAJAX.prototype.parse = function (node,level) {
    var msg = "level: "+level+" node.nodeName: "+node.nodeName;
    if (node.nodeName == "#text") {
        msg += "value: "+node.nodeValue;
    }
    if (node.attributes) {
        msg += " atributes: ";
        for (var nAtr = 0; nAtr < node.attributes.length; nAtr++) {
            msg += node.attributes[nAtr].name+"="+node.attributes[nAtr].value+" ";
        }
    }
    _SpdtDebug.writemsg(msg);
    for (var n = 0; n < node.childNodes.length; n++) {
        this.parse(node.childNodes[n],level+1);
    }
}



_SpdtAJAX = new SpdtAJAX();