﻿var AJAXIndicator = null;
var base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~@";

function getHTTPInstance()
{
    if (typeof XMLHttpRequest != 'undefined')
    {
        return new XMLHttpRequest();
    }
    try
    {
        return new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
        try
        {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                xmlhttp = window.createRequest();
            }
            catch (e)
            {
                xmlhttp=false;
            }
        }
    }
    return false;
}

function GetHttpRequestInitialized(receptor, errresolver, skipLoading)
{
    var HTTPRequest = getHTTPInstance();
    if (HTTPRequest==null)
    {
        alert(MSG("WC_NOAJAX"));
        return;
    }

    var clicker = new TClicker(function(request, func, errresolver) 
    {
        if (request.readyState == 4) {
            if (!skipLoading)
                AJAXRequestEnded();
                
            if (request.responseText.charAt(0) == '{') 
            {
                try 
                {
                    var json = eval("(" + request.responseText + ")");
                    if (json.ERROR != null) {
                        ReportAjaxError(errresolver, null, json);
                    }
                    else
                        func(json);
                }
                catch (ex) {
                    ReportAjaxError(errresolver, ex);
                }
            }
            else {
                if (func)
                    func(request.responseText);
                else
                    alert(MSG(request.responseText));
            }
        }
    }, HTTPRequest, receptor, errresolver);
    HTTPRequest.onreadystatechange = clicker.Click;
    return HTTPRequest;
}

function GetHttpResponse( query, receptor, errresolver)
{
    SetApplicationTimeOut(TIMEOUT);
    var HTTPRequest = GetHttpRequestInitialized(receptor,errresolver,true);
    if (HTTPRequest==null)
        return;
    try
    {
        HTTPRequest.open( "GET", query, true );
        HTTPRequest.send( null );
        //AJAXRequestStarted();
    }
    catch (ex)
    {
        //AJAXRequestEnded();
        ReportAjaxError(errresolver,ex);
    }
}

function PostHttpResponse( query, post, receptor, errresolver, skipLoading, skipTimeOut )
{
    if (!skipTimeOut)
        SetApplicationTimeOut(TIMEOUT);
        
    var HTTPRequest = GetHttpRequestInitialized(receptor, errresolver, skipLoading);
    if (HTTPRequest==null)
        return;
    try
    {
        if (CURRENT_WS != null && post.toLowerCase().indexOf('webservicelocation') < 0)
        {
            if (post != '')
                post += '&' + "WebServiceLocation=" + CURRENT_WS;
            else
                post += "WebServiceLocation=" + CURRENT_WS;
        }
        
        HTTPRequest.open( "POST", query, true );
        HTTPRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        HTTPRequest.send(post);
        if (!skipLoading)
            AJAXRequestStarted();
    }
    catch (ex) 
    {
        if (!skipLoading)
            AJAXRequestEnded();
            
        ReportAjaxError(errresolver,ex);
    }
}

function ReportAjaxError(errresolver,ex,json,txt)
{
    var err;
    if (ex)
        err = ""+ex;
    else if (txt)
        err = txt;
    else
    {
        if (json.ERROR!=null)
        {
            if (json.ERROR.Type != null && json.ERROR.Type == "UserSession")
            {
                err = "ZCP_WC07";
                CURRENT_PBX_REF = null;
            }
            else 
            {
                if (json.ERROR.Message != null)
                    err = json.ERROR.Message;
                else
                    err = json.ERROR;
            }
        }
        else
            err = json;
    }
    if (errresolver)
        errresolver(err);
    else
        alert(MSG(err));
}

function EncodeBase64( input )
{
    if (input==null || input.length<=0)
        return null;
    var out = "";
    var C1, C2, C3;
    var E1, E2, E3, E4;
    var p = 0;
    do
    {
        C1 = input.charCodeAt(p++);
        C2 = input.charCodeAt(p++);
        C3 = input.charCodeAt(p++);
        E1 = C1 >> 2;
        E2 = ((C1 & 3) << 4) | (C2 >> 4);
        E3 = ((C2 & 15) << 2) | (C3 >> 6);
        E4 = C3 & 63;
        if (isNaN(C2))
            E3 = E4 = 64;
        else if (isNaN(C3))
            E4 = 64;
        out += base64chars.charAt(E1) + base64chars.charAt(E2) + base64chars.charAt(E3) + base64chars.charAt(E4);
    }
    while (p < input.length);
    return out;
}
    
function DecodeBase64( input )
{
    if (input==null)
        return null
    if (input.length<=0)
        return "";
    var out = "";
    var C1, C2, C3;
    var E1, E2, E3, E4;
    var i = 0;
    input = input.replace(/[^A-Za-z0-9\~\/\=\@]/g, "");
    do
    {
        E1 = base64chars.indexOf(input.charAt(i++));
        E2 = base64chars.indexOf(input.charAt(i++));
        E3 = base64chars.indexOf(input.charAt(i++));
        E4 = base64chars.indexOf(input.charAt(i++));

        C1 = (E1 << 2) | (E2 >> 4);
        C2 = ((E2 & 15) << 4) | (E3 >> 2);
        C3 = ((E3 & 3) << 6) | E4;

        out = out + String.fromCharCode(C1);

        if (C2!=0 && E3 != 64)
            out += String.fromCharCode(C2);
        if (C3!=0 && E4 != 64)
            out += String.fromCharCode(C3);
    }
    while (i < input.length);
    return out;
}

function AJAXRequestStarted()
{
    if (AJAXIndicator==null)
        AJAXIndicator = new ctlAJAXIndicator();
        
    AJAXIndicator.Started();
}

function AJAXRequestEnded()
{
    if (AJAXIndicator==null)
        AJAXIndicator = new ctlAJAXIndicator();
    AJAXIndicator.Ended();
}

function ctlAJAXIndicator()
{
    var This=this;
    var Indicator = document.getElementById("AJAXIndicator");
    var Count = 0;
    var TimerID = null;
    this.Started = function() {
        if (Indicator == null)
            return;
        
        if (Count == 0)
            Indicator.style.display = "";

        Count++;
        Makeup();
    }

    this.Ended = function() 
    {
        if (Indicator == null)
            return;
        
        Count--;
        if (Count < 0)
            Count = 0;

        Makeup();
    }
}
