// Copyright (c) 2000-2017 Ericsson Telecom AB                                                       //
// All rights reserved. This program and the accompanying materials are made available under the     //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html                                                         //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CDsRestAPIComm(p_extension) {
    "use strict";
    
    var mRequestsDisabled = false;
    var mTimeLastRequestFailed = 0;
    var mNoAnswer = [{"node":{"val":"No answer", "tp":3}}];
    
    // disable cache (mainly for IE, it works all right with firefox and chrome)
    $.ajaxSetup({cache: false});
    
    /* This gives a more sane initial value than being zero. */
    var start = Date.now();
    var ajaxCallURL = "api.dsapi";
    if (p_extension != undefined) {
        ajaxCallURL = "api." + p_extension;
    }
    
    /** public functions */
    this.ajaxCall = function(aData, aHandler) {
        if (mRequestsDisabled) {
            aData = {"requests": [], "timeOut": 5.0};
        }
        
        var end = Date.now();
        $('#cll_DsRestAPI_FPS').html((1000 / (end - start)).toFixed(2)); // diff to previous ajaxCall's end.
        start = Date.now();
        $.ajax({
            url: ajaxCallURL,
            type: 'POST',
            data: JSON.stringify(aData),
            //contentType: 'application/json',
            //accepts: 'application/json',
            dataType: 'text',
            cache: false,
            success: function(data, textStatus, jqXHR) {
                var end = Date.now();
                if (mRequestsDisabled) {
                    mRequestsDisabled = false;
                    // if we were disconnected for more than 15 secs, reload the page
                    if (end - mTimeLastRequestFailed > 15000) {
                        location.reload();
                    } else {
                        aHandler(mNoAnswer);
                    }
                } else {
                    $('#cll_DsRestAPI_serverTime').html(parseFloat(jqXHR.getResponseHeader("X-EPTF-CLL-ServerTime")).toFixed(2));
                    $('#cll_DsRestAPI_roundtrip').html(end - start);
                    $('#cll_DsRestAPI_dataSize').html(data.length);
                    $('#cll_DsRestAPI_error').html("");
                    $('#cll_DsRestAPI_error').addClass("hidden");
                    if (data && data !== "" && data !== " ")
                        aHandler(JSON.parse(data).contentList);
                    else
                        aHandler(mNoAnswer);
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if (!mRequestsDisabled) {
                    mRequestsDisabled = true;
                    mTimeLastRequestFailed = Date.now();
                }
                
                $('#cll_DsRestAPI_roundtrip').html(end - start);
                $('#cll_DsRestAPI_error').html("State: UI has been disconnected<br/>Error: " + textStatus + "<br/>Action: reconnecting");
                $('#cll_DsRestAPI_error').removeClass("hidden");
                var end = Date.now();
                aHandler(mNoAnswer);
            },
            timeout: 10000
        });
    };
}
