﻿    
var cachedArgs = null;
var concurentRequests = 0;

cfw_prepareParam = function(param, sb) {
    if (typeOf(param) == "Date") {
        sb.append(encode_utf8(param.format("s").split(":").join("WW")));
    }
    else if (param == null) {
        sb.append("null");
    }
    else if (typeof (param) == "object" && param.__type && param.__sig) {
        sb.append(param.getSig());
//        sb.append("-");
//        sb.append(param.__type);
    }
    else if (typeOf(param) == "String" || typeOf(param) == "string") {
        sb.append(encode_utf8(cfw_escChars(param)));
    }
    else if (typeOf(param) == "Array") {
        sb.append("[");
        for (var i = 0; i < param.length; i++) {
            sb.append(cfw_prepareParam(param[i], sb));
            if (i < param.length-1)
                sb.append("~");
        }
        sb.append("]");
    }
    else {
        sb.append(param);
    }
}
cfw_escComma = function(text) {
    return text.split(",").join("{COMMA}");
}


cfw_escChars = function(text) {

    text = text.split("+").join("{PLUS}");
    text = text.split("-").join("{MINUS}");
    return text;
}

cfw_prepareParameters = function(params) {

    var sb = new Sys.StringBuilder();

    for (var p = 0; p < params.length; p++) {
       cfw_prepareParam(params[p], sb);
       sb.append("~");
    }
    var rv = sb.toString();
    return rv.substr(0, rv.length - 1);
}

cfw_sendReq = function(url, onSuccess, onFailure, asm, args, method, exp) {
    var bpc; var idx = 4; var to = 3535;

    var a = cfw_sendReq.caller.caller.arguments;
    if (url.indexOf("_SetData$$") != -1) {

//        if(cfw_sendReq.caller.arguments[5])
//            exp = cfw_sendReq.caller.arguments[5];
        idx--;
    }



    if (a.length > idx && a[idx]) exp = a[idx]; idx++;
    if (exp || (a.length > idx && a[idx])) bpc = a[idx]; idx++;
    if (bpc || (a.length > idx && a[idx])) to = a[idx]; idx++;

    var wRequest = new Sys.Net.WebRequest();

    wRequest.set_httpVerb(method);
    wRequest.add_completed(function(e, x) { cfw_prepareResponse(e, onSuccess, onFailure); });
    wRequest.set_timeout(to);

    var hash = hex_md4(url);

    var splittedUrl = url.split('$');
    var params = splittedUrl[1];

    if (method == "POST") {
        splittedUrl[1] = hash;
        url = splittedUrl.join('$');

        var body = "p=" + params;
        wRequest.set_body(body);
        wRequest.get_headers()["Content-Length"] = body.length;
    }

    if (asm && asm.length > 0)
        wRequest.get_headers()["X-Corvus-Asm"] = asm;

    wRequest.get_headers()["X-Corvus-Args"] = hash;

    if (exp) {
        var c = '';
        for (var i in exp) {
            if (i != '0') c += ';';
            c += exp[i].t + '$' + exp[i].e;
        }

        if (c && c.length > 0)
            wRequest.get_headers()["X-Corvus-Exp"] = c;
    }


    if (params == "" || method == "POST")
        params = " ";

    if (method == "GET")
        wRequest.get_headers()["X-Corvus-URI"] = params;


    if (bpc)
        url = url + "?t=" + (new Date()).valueOf();

    wRequest.set_url(url);
    wRequest.invoke();
    concurentRequests++;

    if (typeOf(args) != "undefined")
        cfw_setArgsCache(hash, args);

    return wRequest;
}
    
     
    cfw_get = function(url, onSuccess, onFailure, asm, args, exp) {
    
        return cfw_sendReq(url, onSuccess, onFailure, asm, args, "GET", exp);
    }
    
    
     cfw_post = function(url, onSuccess, onFailure, asm, args) {
               
        return cfw_sendReq(url, onSuccess, onFailure, asm, args, "POST");
    }
    
    cfw_setArgsCache = function(hash, args)
    {
      if(cachedArgs == null)
            cachedArgs = new Hashtable();
            
       cachedArgs.put(hash, args);
    }
    
    cfw_getArgsCache = function(executor)
    {
        var argsHeader = executor.getResponseHeader("X-Corvus-Args");
        
        
        
        if(!argsHeader || !cachedArgs)
            return null;
            
         var value = cachedArgs.get(argsHeader);
         
        if(!concurentRequests)
            cachedArgs = new Hashtable();         
            
         /*
         if(value != null)
         {
          cachedArgs.remove(argsHeader);
         }
         
         
        
         cachedArgs.moveLast();
         
         while (cachedArgs.previous())
         {
           if((+ new Date) - cachedArgs.getKey() >  15000)
                cachedArgs.remove(cachedArgs.getKey());
         }
         */
         
         return value;
            
    }
    
    
    retryReq = function(timeoutedReq, onSuccess, onFailure)
    {
        var wRequest = new Sys.Net.WebRequest();
       
        wRequest.set_httpVerb(timeoutedReq.get_httpVerb());
        wRequest.add_completed(function(e,x){cfw_prepareResponse(e,onSuccess,onFailure);});
        wRequest.set_timeout(5555);
        
        if(timeoutedReq.get_httpVerb() == "POST")
        {
            wRequest.set_body(timeoutedReq.get_body());
            //wRequest.get_headers()["Content-Length"] = timeoutedReq.get_body().length;
        }
        
        if(timeoutedReq.get_headers()["X-Corvus-Asm"]!=null)
            wRequest.get_headers()["X-Corvus-Asm"] = timeoutedReq.get_headers()["X-Corvus-Asm"];
        
        if(timeoutedReq.get_headers()["X-Corvus-Exp"]!=null)
            wRequest.get_headers()["X-Corvus-Exp"] = timeoutedReq.get_headers()["X-Corvus-Exp"];
            
        wRequest.get_headers()["X-Corvus-Args"] = timeoutedReq.get_headers()["X-Corvus-Args"];
        wRequest.get_headers()["X-Corvus-URI"] = timeoutedReq.get_headers()["X-Corvus-URI"];
        
        wRequest.set_url( timeoutedReq.get_url());
        wRequest.invoke(); 
        
    }

    cfw_prepareResponse = function(executor, onSuccess, onFailure) {
        concurentRequests--;
        var statusCode = null;

        var response = null;

        if (!executor || executor.get_aborted()) {
            //  cfw_forwardResponse(onFailure, { "IsSucceded": false, "ResponseType": "Aborted", "Message": "Zahtjev na poslužitelj je prekinut.", "UserID": response[0].UserID, "ErrorID": 0 }, cfw_getArgsCache(executor));
            return;
        }

        try {
            response = cfw_deSerialize(executor.get_responseData());
        }
        catch (err) {
            if (executor) {
                if (executor.get_timedOut()) {
                    var req = executor.get_webRequest();
                    if (req.get_timeout() != 5555) {
                        retryReq(req, onSuccess, onFailure);
                        return;
                    }
                    else {
                        cfw_forwardResponse(onFailure, { "IsSucceded": false, "ResponseType": "TimeOut", "Message": adminTextProvider["TIMEOUT"], "UserID": 0, "ErrorID": 0 }, cfw_getArgsCache(executor));
                        return;
                    }
                }
            }

            cfw_forwardResponse(onFailure, { "IsSucceded": false, "ResponseType": "SerializationError", "Message": err.toString(), "UserID": 0, "ErrorID": 0 }, cfw_getArgsCache(executor));
            return;
        }

        response = cfw_cast(response);

        try {
            statusCode = executor.get_statusCode();
        }
        catch (e) {
            statusCode = 0;
        }

        if (statusCode != 567 && statusCode != 403) {
            if ((statusCode < 100) || (statusCode >= 600)) {
                cfw_forwardResponse(onFailure, { "IsSucceded": false, "ResponseType": "ConnectionError", "Message": adminTextProvider["CONNECTIONERROR"], "UserID": response[0].UserID, "ErrorID": 0 }, cfw_getArgsCache(executor));
                return;
            }
            else if ((statusCode < 200) || (statusCode >= 300)) {
                cfw_forwardResponse(onFailure, { "IsSucceded": false, "ResponseType": "HTTPError", "Message": adminTextProvider["HTTPERROR"], "UserID": response[0].UserID, "ErrorID": 0 }, cfw_getArgsCache(executor));
                return;
            }
        }

        if (!response[0].IsSucceded)
            cfw_forwardResponse(onFailure, response[0], cfw_getArgsCache(executor));
        else
            cfw_forwardResponse(onSuccess, response[0], cfw_getArgsCache(executor), response[1]);

    }

    cfw_forwardResponse = function(funct, logInfo, args, response) {

    if (typeof (CorvusCMS) != "undefined" && CorvusCMS.Logger &&
        logInfo.ResponseType && logInfo.ResponseType != "None" &&
         logInfo.ResponseType != "SetData" ) {
            CorvusCMS.Logger.Log(logInfo);
        }

        funct((arguments.length > 3 ? response : logInfo), args, logInfo.UserID);
    }

    cfw_parseSig = function(obj)
    {
        var sb = new Sys.StringBuilder();
        var arr = obj.__sig; 
        for(var s in arr)
        {   
            if(typeof(arr[s]) == "function")
                continue;
                
            sb.append("'");
            sb.append(obj[arr[s]]);
            sb.append("'");
            
            if(s<arr.length-1)
                sb.append(",");
        }
        return sb.toString();
    }
    
    cfw_deSerialize = function(json)
    {
        return eval("(" + json + ")");
    }
     
     cfw_cast = function(obj)
     {
        
        if(obj == null)
            return null;
        
        if(!obj.__type && (typeOf(obj)=="Array" || typeOf(obj)=="Object"))
        {
            for (var element in obj)
                if(typeof(obj[element]) != "function")
                    obj[element] = cfw_cast(obj[element]);
              
           return obj;
        }
        
        if(!obj.__type)
            return obj;
        
        var type = obj.__type;
        var instance = eval("new " + type + "(" + cfw_parseSig(obj) + ");");
        
        for(var property in instance)
        {
            if(typeof(instance[property])!="function")
                instance[property] = cfw_cast(obj[property]);
        }
        return instance;
     }
     

Type.registerNamespace("Corvus.JsBase");

Corvus.JsBase.Base = function (type, sig)
{

}

Corvus.JsBase.Base.prototype = {

    getSig: function() {
        var str = "";
        for (var _el in this.__sig) {
            if (typeof (this.__sig[_el]) == "function")
                continue;

            if (typeOf(this.__sig[_el]) == "Array") {
                str += "[";
                for (i = 0; i < this.__sig[_el].length; i++) {
                    str += this.__sig[_el].getSig ? this.__sig[_el].getSig() : this.__sig[_el].toString();
                    if (i < this.__sig[_el].length - 1)
                        str += ",";
                }
                str += "]";
            }
            if (typeOf(this.__sig[_el]) != "Object") {
                if (typeOf(this[this.__sig[_el]]) == "Array") {
                    for (var i = 0; i < this[this.__sig[_el]].length; i++) {
                        str += this.__sig[_el] + "=[";
                        for (i = 0; i < this[this.__sig[_el]].length; i++) {
                            str += this[this.__sig[_el]][i].getSig ? this[this.__sig[_el]][i].getSig() : this[this.__sig[_el]][i].toString();
                            if (i < this[this.__sig[_el]].length - 1)
                                str += "~";
                        }
                        str += "]";
                    }
                }
                else
                    str += (this[this.__sig[_el]].__type ? this[this.__sig[_el]].getSig() : this.__sig[_el] + "=" + (typeof this[this.__sig[_el]] == "string" ? cfw_escComma(this[this.__sig[_el]]) : this[this.__sig[_el]]));
            }
            else {
                str += this.resolveSig(this.__sig[_el]);
            }
            str += ",";
        }
        var retVal = str.substr(0, str.length - 1);
        //if (retVal.match(this.__type) != null)
        if (retVal.match("/^[" + this.__type + "].+/") != null)
            return retVal;

        return str.substr(0, str.length - 1) + "-" + this.__type;
    },

    resolveSig: function(sig) {
        var sb2 = new Sys.StringBuilder();
        for (var _el in sig) {
            if (typeOf(_el) == "String" && typeOf(sig[_el]) == "Array") {
                sb2.append(_el);
                sb2.append("=");
                sb2.append(this[_el].__type ? this[_el].getSig() : this[_el]);
            }
        }
        return sb2.toString();
    }
}

Corvus.JsBase.Base.registerClass("Corvus.JsBase.Base");
 if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
