﻿var _crossDomainRequests = Array();
var AjaxObj = function() {
};


AjaxObj.prototype.LoadUrl = function(url, methodOnComplete, stateChangeCallback) {
    var reqObj = this.InitializeObj();

    if (stateChangeCallback != null)
        this.stateChangeCallback = stateChangeCallback;

    var _this = this;

    if (reqObj) {
        reqObj.onreadystatechange = function() {
            _handleStateChange(reqObj, methodOnComplete);

            if (_this.stateChangeCallback != null)
                _this.stateChangeCallback(reqObj);
        }
        _this.startTime = new Date().getTime();
        reqObj.open("GET", url, true);
        reqObj.send("");
    }
}

function _handleStateChange(reqObj, methodOnComplete) {
    // only if req shows "loaded"
    if (reqObj.readyState == 4) {
        // only if "OK"
        if (reqObj.status == 0 || reqObj.status == 200) {
            if (methodOnComplete) {
                /*if (reqObj.responseText.trim().indexOf("REDIR")==0)
                {
                var url = reqObj.responseText.substring(6,reqObj.responseText.length);
                location = url;
                }
                else*/
                {
                    methodOnComplete(reqObj);
                }
            }
        }
        else {
            alert("There was a problem retrieving the XML data:\n" +
					reqObj.statusText);
        }
    }
}

AjaxObj.prototype.InitializeObj = function() {
    req = false;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        try {
            req = new XMLHttpRequest();
        } catch (e) {
            req = false;
        }
        // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                req = false;
            }
        }
    }

    return req;
}

var CrossDomainRequestClass = function(AjaxObject, Object, Method, Params, OnCompleteMethod) {
    this.Object = Object;
    this.Method = Method;
    this.Params = Params;
    this.AjaxObj = AjaxObject;
    this.OnCompleteMethod = OnCompleteMethod;
}

AjaxObj.prototype.CrossDomainRequest = function(Object, Method, Params, OnCompleteMethod) {
    if (this.CrossDomainRequestProxy == null)
        throw "You must set the CrossDomainRequestProxy property before calling this method";

    var cdrClass = new CrossDomainRequestClass(this, Object, Method, Params, OnCompleteMethod);
    var idx = _crossDomainRequests.length;
    _crossDomainRequests[_crossDomainRequests.length] = cdrClass;
    var paramsStr = "";
    if (Params != null && Params.length > 0) {
        for (i = 0; i < Params.length; i++) {
            paramsStr += "p0=" + Params[i] + "&";
        }
    }

    var head = document.getElementsByTagName("head").item(0);
    var oScript = document.getElementById("oScript");
    if (oScript)
        head.removeChild(oScript);
    oScript = document.createElement("script");
    //document.write(this.CrossDomainRequestProxy+"?object="+Object+"&method="+Method+"&"+paramsStr+"&requestId="+idx);
    oScript.setAttribute("src", this.CrossDomainRequestProxy + "?object=" + Object + "&method=" + Method + "&" + paramsStr + "&requestId=" + idx);
    oScript.setAttribute("id", "oScript");
    head.appendChild(oScript);
}

function __crossDomainCallbackHandler(responseObject) {
    obj = _crossDomainRequests[responseObject.requestId];

    responseObject.responseXML = __getXMLDocument(responseObject.responseText);
    if (responseObject.responseText.indexOf("JSODException") >= 0) {
        responseObject.exception = __ParseToObject(responseObject.responseXML); ;

    }
    else {
        responseObject.object = __ParseToObject(responseObject.responseXML);
    }
    obj.OnCompleteMethod(responseObject, obj);
}

function __getXMLDocument(xmlString) {

    if (window.ActiveXObject) {
        var doc = new ActiveXObject("Microsoft.XMLDOM");
        doc.async = "false";
        doc.loadXML(xmlString);
    }
    // code for Mozilla, Firefox, Opera, etc.
    else {
        var parser = new DOMParser();
        var doc = parser.parseFromString(xmlString, "text/xml");
    }
    //reflect(doc);
    return doc;
}


function reflect(obj) {
    var str = "";
    for (i in obj) {
        str += i + " " + obj[i] + "<br/>";
    }
    document.write(str);
}

function JSODException(Message, InnerMessage, StackTrace) {
    this.message = Message;
    this.innerMessage = InnerMessage;
    this.stackTrace = StackTrace;
}


function __ParseToObject(XmlDocument) {
    var Node = XmlDocument.firstChild;
    if (null == Node)
        return;

    if (XmlDocument.firstChild.nodeName == "xml")
        Node = XmlDocument.childNodes[1];

    if (null == Node)
        return;

    var str = "" + __GetScriptForNodeRecursive(Node) + "";

    // document.write(str);
    var r = eval("(" + str + ");");
    return r;

}

function __GetScriptForNodeRecursive(Node, openAlready) {
    if (null == Node)
        throw "Node cannot be null";
    if (Node.nodeName == "xml")
        return;
    if (Node.nodeName == "#text")
        return;
    var ret = "";
    if (!openAlready) ret += "{";
    ret += " \"" + Node.nodeName + "\" : ";

    var attrWritten = false;
    var cnWritten = false;
    var bodyWritten = false;
    if (Node.firstChild && Node.firstChild.nodeName == "#text") {
        ret += " { \"value\" : \"" + Node.firstChild.nodeValue.replace(/\r\n|\r|\n/g, ' ') + "\"";
        attrWritten = true;
        bodyWritten = true;
    }
    if (Node.attributes && Node.attributes.length > 0) {
        if (!attrWritten)
            ret += " { ";
        else
            ret += ", ";
        attrWritten = true;

        var i = 0;
        for (i = 0; i < Node.attributes.length; i++) {
            ret += " \"" + Node.attributes[i].nodeName + "\" : \"" + Node.attributes[i].nodeValue.replace(/\r\n|\r|\n/g, ' ') + "\"";
            if (i + 1 < Node.attributes.length) {
                ret += ", ";
            }
        }
    }
    if (__NodeHasValidChildren(Node)) {
        cnWritten = true;
        if (!attrWritten)
            ret += " { ";
        else {
            ret += ", ";
        }
        var x = 0;
        for (x = 0; x < Node.childNodes.length; x++) {
            cstr = __GetScriptForNodeRecursive(Node.childNodes[x], true);
            if (cstr != null) {
                ret += cstr;
                if (x + 1 < Node.childNodes.length) {
                    ret += ", ";
                }
            }

        }
    }
    if (cnWritten || attrWritten)
        ret += " } ";
    else if (!bodyWritten) {
        ret += "''";
    }
    if (!openAlready) ret += "}";

    return ret;
}

function __NodeHasValidChildren(Node) {
    var x = 0;
    if (Node.childNodes == null)
        return false;
    for (x = 0; x < Node.childNodes.length; x++) {
        if (Node.childNodes[x].nodeName != "xml" && Node.childNodes[x].nodeName != "#text")
            return true;
    }
    return false;

}

