/* Minification failed. Returning unminified contents.
(1,21): run-time error CSS1031: Expected selector, found '='
(1,21): run-time error CSS1025: Expected comma or open brace, found '='
(2664,2): run-time error CSS1019: Unexpected token, found '('
(2664,3): run-time error CSS1019: Unexpected token, found ')'
(2665,19): run-time error CSS1031: Expected selector, found '='
(2665,19): run-time error CSS1025: Expected comma or open brace, found '='
 */
var viciIntegration = function () {
    "use strict"

    var ViciStatusButtonClass = {
        PreLogin: "btn btn-success btn-block long",
        None: "",
        Paused: "btn btn-warning btn-block long",
        Ready: "btn btn-success btn-block long",
        Incall: "btn btn-danger btn-block long",
        Dead: "",
        Dispo: ""
    };

    var ViciStatus = {
        PreLogin: 0,
        None: 1,
        Paused: 2,
        Ready: 3,
        Incall: 4,
        Dead: 5,
        Dispo: 6
    };

    var btnViciLogIn = "",
        viciIntegrationPingAttempts = 0,
        btnViciLogAppStatus = "",
        btnViciLogInHtml = "";

    var ViciPageSource = {
        landing: "landing",
        pause: "pause",
        waiting: "waiting",
        loginModal: "loginModal",
        pauseModal: "pauseModal",
        header: "header",
        addNewNumberModal: "addNewNumberModal",
        transferCallModal: "transferCallModal"
    };

    var ViciStatusHRef = {
        PreLogin: "Vici/LogIn/",
        None: "#",
        Paused: "Vici/PausedScreen/",
        Ready: "Vici/WaitingScreen",
        Incall: "#",
        Dead: "#",
        Dispo: "#"
    };

    var ViciloadViewIntoDiv = {
        Main: "#main-body",
        Modal: "#script-modal"
    }

    var PauseCodeID = {
        1: "TEA",
        2: "LUNCH",
        3: "COMF",
        4: "MEET",
        5: "TRAIN",
        6: "BRIEF",
        7: "MYCBK"
    };

    var getAgentTimes_Timer = null;
    var pingViciIntegration_Timer = null;
    var AgentCC_ViciAgentCode = "";
    var getUniqueId_Timer = null;
    var getTransferStatus_Timer = null;


    /********************************************************************************
    *
    * public functions
    * initialize Vici Incall Page
    * call waiting for incall status. If Status = Incall then load customer page else set timer
    * show pause slider
    ********************************************************************************/
    function initializeIncallPage(pageName) {
        waitingForInCallStatus(pageName);
        initializeSliderBtn('checkbox-vici-pause-aftercall', true);
    }

    /********************************************************************************
    *
    * public functions
    * initialize Vici Pre-LogIn Button on Landing Page
    ********************************************************************************/
    function initializePreLoginPage() {
        //HideSpinner();
        //ShowModal();
        //InitFloatLabel();
        //initializeSliderBtn('checkbox-vici-pause-aftercall', false);

        $('#txtPhoneCode').keyup(function (event) {
            if (event.keyCode == 13) {
                getViciStatusAndLogIn('loginModal');
            }
        });

        $('#txtViciUserPassword').keyup(function (event) {
            if (event.keyCode == 13) {
                logInUser('loginModal');
            }
        });
    }

    /********************************************************************************
    *
    * Private functions
    * initialize waiting screen
    * Call Method to Get Agent Times and set Agent Times Timer. 
    * Call Method to Get Call Backs
    * call Wait For In Call Status Method after 1 second. 
    ********************************************************************************/
    function initializeWaitingScreen(pageName) {
        HideSpinner();
        getAgentTimes(pageName);
        getViciCallBacks(pageName);
        initializeSliderBtn('checkbox-vici-pause-aftercall', true);
        setTimeout(function () {
            waitingForInCallStatus(pageName);
        }, 1000);
    }

    /********************************************************************************
    *
    * Private functions
    * initialize Slider Button 
    ********************************************************************************/
    function initializeSliderBtn(pauseBtn, showBtnDiv) {
        if (!$("#" + pauseBtn).hasClass('initiliazed')) {
            var elem = document.querySelector('.js-switch');
            var switchery = new Switchery(elem, { color: '#1AB394' });
            $("#" + pauseBtn).addClass('initiliazed');
        }

        if (showBtnDiv === true) {
            $("#div-" + pauseBtn).show();
        }
        else
            $("#div-" + pauseBtn).hide();
    }

    /********************************************************************************
    *
    * Private functions
    * initialize vici integration. set to pre-login state. 
    * onsuccess only get and show vici status on landing page
    ********************************************************************************/
    function initializeViciIntegration(pageName) {

        var params = $.param({
            "function": "Initialize",
            viciWebAPIURL: "http://elappobcc_uat/OBCC.Vici.API/api/Vici/",
            viciAPIURL: "http://obcc-viciweb/agc/api.php",
            viciNonAgentURL: "http://obcc-viciweb/vicidial/non_agent_api.php",
            viciURL: "http://obcc-viciweb/agc/vicidial.php"
        });

        var errorCallBack = function (jqXHR, exception) {
            //showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception) + " - Vici Integration Service Failed To Initilize", pageName);
            alert("Vici Integration Service Failed To Initilize");
        }

        var successCallBack = function (data) {
            //if (pageName === ViciPageSource.landing) {
            //    loadViciStatusOnLandingPage(pageName);
            //}
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * initialize vici pause screen.
    ********************************************************************************/
    function initializePausePage(pageName) {
        $("#txtViciPauseReason").val(localStorage.getItem("viciPauseReason"));
        $("#txtViciPauseReason").attr('disabled', 'disabled');
        $("#txtViciCampaign").val(localStorage.getItem("viciSelectedCampaign"));
        $("#txtViciCampaign").attr('disabled', 'disabled');
        toggleLeftHeaderMenu(LeftHeaderMenu.Vici_Paused);
        getAgentTimes(pageName);
        getViciCallBacks(pageName);
        initializeSliderBtn('checkbox-vici-pause-aftercall', true);
        InitFloatLabel();
        spinner.hide();
    }

    /********************************************************************************
    *
    * Private functions
    * initialize vici Re-login and change campaign modal
    ********************************************************************************/
    function initializeRelogInAndChangeCampaignModal() {
        var str = $('#scriptModalTitle')[0].innerHTML;
        str = str.replace("Vici Log In", "Re-Log In & Change Vici Campaign");
        $('#scriptModalTitle')[0].innerHTML = str;
        HideSpinner();
        ShowModal();
        InitFloatLabel();
        $("#txtViciUserName").val(localStorage.getItem("viciUserName"));

        $('#txtViciUserPassword')[0].type = "password";

        $("#txtPhoneCode").val(localStorage.getItem("viciPhoneCode"));
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - Initialize, Get Status and LogIn
    * Potential Infinite Loop
    ********************************************************************************/
    function initilizeAndDoLogIn(pageName) {
        var params = $.param({
            "function": "Initialize",
            viciWebAPIURL: "http://elappobcc_dev/OBCC.Vici.API/api/Vici/",
            viciAPIURL: "http://172.19.1.61/agc/api.php",
            viciNonAgentURL: "http://172.19.1.61/vicidial/non_agent_api.php",
            viciURL: "http://172.19.1.61/agc/vicidial.php"
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception) + " - Vici Integration Service Failed To Initilize", pageName);
        }

        var successCallBack = function () {
            getViciStatusAndLogIn(pageName);
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }


    /********************************************************************************
    *
    * Private functions
    * set vici button state on landing page
    ********************************************************************************/
    function changeHyperLinkButtonProperties(buttonName, buttonHtml, href, successCallBack, buttonClass, target) {
        if (IsObjectExist(buttonName)){
            $(buttonName).html(buttonHtml);
            $(buttonName)[0].href = href;
            $(buttonName)[0].setAttribute('data-ajax-success', successCallBack);
            $(buttonName)[0].setAttribute('data-ajax-begin', "spinner.show();");
            $(buttonName)[0].setAttribute('data-ajax-update', target);
            $(buttonName)[0].setAttribute('class', buttonClass);
        }
    }   

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - process vici status result
    ********************************************************************************/
    function landingPageViciStatusResult(data, pageName) {
        hideErrorOnPage(pageName);

        resetViciCallInfo();

        if (data.Result === null) {
            $(btnViciLogAppStatus).html("Logged Out");
            initializeViciIntegration(pageName);
        }
        else {
            var dataResult = JSON.parse(data.Result);

            localStorage.setItem("viciUserName", dataResult.agentCode);
            localStorage.setItem("viciSelectedCampaign", dataResult.selectedCampaign);
            var setHeaderMenu = true;
            var status = '';

            switch (parseInt(dataResult.status)) {

                case ViciStatus.PreLogin:
                    status = 'PreLogin';
                    changeHyperLinkButtonProperties(btnViciLogIn, btnViciLogInHtml, ViciStatusHRef.PreLogin, "viciIntegration.initializePreLoginPage();", ViciStatusButtonClass.PreLogin, ViciloadViewIntoDiv.Modal);
                    sessionStorage.setItem("viciLogIn", false);
                    $(btnViciLogAppStatus).html(status);
                    break;

                case ViciStatus.None:
                    status = 'None';
                    $(btnViciLogIn).html(btnViciLogInHtml);
                    sessionStorage.setItem("viciLogIn", false);
                    $(btnViciLogAppStatus).html(status);
                    initializeViciIntegration(pageName);
                    break;

                case ViciStatus.Paused:
                    status = 'Paused';
                    if (localStorage.getItem("viciUserName") !== AgentCC_ViciAgentCode) {
                        setHeaderMenu = false;
                        var logOutCallBack = function (data) {
                            if (isValidViciResult(data)) {
                                $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                                    toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                                    $('#div-checkbox-vici-pause-aftercall').hide();
                                    landingPage.runFunctionsOnDocReady();
                                    resetvicilogInDetails();
                                    LoadSideMenu(null, null, 1); //Default Menu Items
                                });
                            }
                            else {
                                showErrorOnPage("Vici LogOut Error: " + getViciErrorMessage(data), pageName);
                            }
                        }

                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    else {
                        changeHyperLinkButtonProperties(btnViciLogIn, btnViciLogInHtml, ViciStatusHRef.Paused, "viciIntegration.initializePausePage('pause')", ViciStatusButtonClass.Paused, ViciloadViewIntoDiv.Main);
                        sessionStorage.setItem("viciLogIn", true);
                        $(btnViciLogAppStatus).html(status);
                    }
                    break;

                case ViciStatus.Ready:
                    status = 'Ready';
                    if (localStorage.getItem("viciUserName") !== AgentCC_ViciAgentCode) {
                        setHeaderMenu = false;
                        var logOutCallBack = function (data) {
                            if (isValidViciResult(data)) {
                                $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                                    toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                                    $('#div-checkbox-vici-pause-aftercall').hide();
                                    landingPage.runFunctionsOnDocReady();
                                    resetvicilogInDetails();
                                    LoadSideMenu(null, null, 1); //Default Menu Items
                                });
                            }
                            else {
                                showErrorOnPage("Vici LogOut Error: " + getViciErrorMessage(data), pageName);
                            }
                        }

                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    else {
                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    break;

                case ViciStatus.Incall:
                    status = 'Incall';
                    if (localStorage.getItem("viciUserName") !== AgentCC_ViciAgentCode) {
                        setHeaderMenu = false;
                        var logOutCallBack = function (data) {
                            if (isValidViciResult(data)) {
                                $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                                    toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                                    $('#div-checkbox-vici-pause-aftercall').hide();
                                    landingPage.runFunctionsOnDocReady();
                                    resetvicilogInDetails();
                                    LoadSideMenu(null, null, 1); //Default Menu Items
                                });
                            }
                            else {
                                showErrorOnPage("Vici LogOut Error: " + getViciErrorMessage(data), pageName);
                            }
                        }

                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    else {
                        
                        changeHyperLinkButtonProperties(btnViciLogIn, btnViciLogInHtml, ViciStatusHRef.Incall, "viciIntegration.initializeIncallPage('landing');", ViciStatusButtonClass.Incall, ViciloadViewIntoDiv.Main);
                        sessionStorage.setItem("viciLogIn", true);
                        $(btnViciLogAppStatus).html(status);
                    }
                    break;

                case ViciStatus.Dead:
                    status = 'Dead';
                    if (localStorage.getItem("viciUserName") !== AgentCC_ViciAgentCode) {
                        setHeaderMenu = false;
                        var logOutCallBack = function (data) {
                            if (isValidViciResult(data)) {
                                $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                                    toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                                    $('#div-checkbox-vici-pause-aftercall').hide();
                                    landingPage.runFunctionsOnDocReady();
                                    resetvicilogInDetails();
                                    LoadSideMenu(null, null, 1); //Default Menu Items
                                });
                            }
                            else {
                                showErrorOnPage("Vici LogOut Error: " + getViciErrorMessage(data), pageName);
                            }
                        }

                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    else {
                        quickDispo(ViciPageSource.landing, "HUP", true); 
                        setHeaderMenu = false;
                    }
                    break;

                case ViciStatus.Dispo:
                    status = 'Dispo';
                    if (localStorage.getItem("viciUserName") !== AgentCC_ViciAgentCode) {
                        setHeaderMenu = false;
                        var logOutCallBack = function (data) {
                            if (isValidViciResult(data)) {
                                $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                                    toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                                    $('#div-checkbox-vici-pause-aftercall').hide();
                                    landingPage.runFunctionsOnDocReady();
                                    resetvicilogInDetails();
                                    LoadSideMenu(null, null, 1); //Default Menu Items
                                });
                            }
                            else {
                                showErrorOnPage("Vici LogOut Error: " + getViciErrorMessage(data), pageName);
                            }
                        }

                        quickLogOut(ViciPageSource.landing, "Close", logOutCallBack);
                    }
                    else {
                        quickDispo(ViciPageSource.landing, "HUP", true);
                        setHeaderMenu = false;
                    }
                    break;
            }
            if (setHeaderMenu === true) {
                toggleLeftHeaderMenu(parseInt(dataResult.status));
            }
            else {
                toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
            }
        }
    }


    /********************************************************************************
    *
    * Private functions
    * show error on calling page
    ********************************************************************************/
    function showErrorOnPage(error, pageName) {
        if (pageName === ViciPageSource.landing) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.DefaultLanding, error);
        }

        if (pageName === ViciPageSource.loginModal) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.ViciLogInModal, error);
        }

        if (pageName === ViciPageSource.header || pageName === ViciPageSource.pause || pageName === ViciPageSource.waiting) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.Header, error);
        }

        if (pageName === ViciPageSource.pauseModal) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.ViciPauseModal, error);
        }

        if (pageName === ViciPageSource.addNewNumberModal) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.ViciAddNewNumberModal, error);
        }

        if (pageName === ViciPageSource.transferCallModal) {
            errorHandling.handleErrorOnPage(errorHandling.ErrorDivOnPage.ViciTransferCallModalModal, error);
        }
        //HideSpinner();
    }

    /********************************************************************************
    *
    * Private functions
    * hide error on calling page
    ********************************************************************************/
    function hideErrorOnPage(pageName) {
        if (pageName === ViciPageSource.landing) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.DefaultLanding);
        }

        if (pageName === ViciPageSource.loginModal) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.ViciLogInModal);
        }

        if (pageName === ViciPageSource.header || pageName === ViciPageSource.pause || pageName === ViciPageSource.waiting) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.Header);
        }

        if (pageName == ViciPageSource.pauseModal) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.ViciPauseModal);
        }

        if (pageName == ViciPageSource.addNewNumberModal) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.ViciAddNewNumberModal);
        }

        if (pageName == ViciPageSource.ViciTransferCallModalModal) {
            errorHandling.hideErrorOnPage(errorHandling.ErrorDivOnPage.ViciTransferCallModalModal);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * invoke vici watcher function 
    ********************************************************************************/
    function invokeViciWatcherFunction(params, doneCallBack, showLoading, failCallBack, errMsgCustom) {
        showLoading = typeof showLoading !== 'undefined' ? showLoading : true;
        if (showLoading) {
            $('body').addClass('loading');
        }
        $.ajax({
            url: "http://localhost:7778",
            data: params,
            contentType: "application/json",
            dataType: "jsonp"
        }).done(function (data) {
            doneCallBack(data);

            if (showLoading) {
                $('body').removeClass('loading');
            }
            }).fail(function (jqXHR, exception) {
                failCallBack(errorHandling.compileErrorMsg(jqXHR, exception) + errMsgCustom); //" - Vici Integration Watcher Not Running. Please Contact Your Supervisor.");
        });
    }

    /********************************************************************************
    *
    * Private functions
    * invoke vici function 
    ********************************************************************************/
    function invokeViciFunction(params, doneCallBack, failCallBack) {
        $.ajax({
            url: "http://localhost:7777",
            data: params,
            contentType: "application/json",
            dataType: "jsonp"
        }).done(function (data) {
            doneCallBack(data);
        }).fail(function (jqXHR, exception) {
            failCallBack();
        });
    }

    /********************************************************************************
    *
    * Public functions
    * get vici Status and display on button - Landing Page
    ********************************************************************************/
    function checkViciStatus(params, pageName) {
        try {

            hideErrorOnPage(pageName);
            btnViciLogIn = params[0].ParamValue;
            btnViciLogAppStatus = params[1].ParamValue;
            AgentCC_ViciAgentCode = params[2].ParamValue;

            btnViciLogInHtml = $(btnViciLogIn).html(); //make copy of button html

            $(btnViciLogIn).html("<i class='fa fa-circle-o-notch fa-spin'></i> Fecthing Vici Call Status");//replace with spinner

            pingViciIntegration(pageName);

        } catch (e) {
            showErrorOnPage(e.message, pageName);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * get vici agent times
    ********************************************************************************/
    function getAgentTimes(pageName) {
        if ($("#panel-vici-agent-times").length > 0) {

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            };

            var successCallback = function (data) {
                getAgentTimePercentages(data, pageName);
            }

            var params = $.param({ "function": "GetAgentTimes" });

            invokeViciFunction(params, successCallback, errorCallBack);
        }
    }    

    /********************************************************************************
    *
    * Private functions
    * set Agent Timer with Interval of 30 seconds
    ********************************************************************************/
    function setAgentTimes_Timer(pageName) {
        getAgentTimes_Timer = setInterval(function () {

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            };

            var successCallback = function (data) {
                getAgentTimePercentages(data, pageName);
            };

            var params = $.param({ "function": "GetAgentTimes" });
            invokeViciFunction(params, successCallback, errorCallBack);

        }, 30000);
    }

    /********************************************************************************
    *
    * Private functions
    * ping vici agent time peecentages
    ********************************************************************************/
    function getAgentTimePercentages(data, pageName) {
        var callInfo = data;

        if (callInfo.Success === true && data.Result !== "false" && ($("#panel-vici-agent-times").length > 0)) {
            var params = $.param({
                currentAgentTimes: data.Result
            });

            $.ajax({
                url: baseURL + "Vici/GetTimePercentages",
                type: "POST",
                dataType: "json",
                data: params,
                error: function (jqXHR, exception) {
                    showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                },
                success: function (response) {
                    if (response.success === "Success" && ($("#panel-vici-agent-times").length > 0)) {
                        var pauseTime = JSON.parse(response.pauseTime);
                        setAgentTimerBar("#vici-pause-bench", pauseTime.Percentage);

                        var readyTime = JSON.parse(response.readyTime);
                        setAgentTimerBar("#vici-wait-bench", readyTime.Percentage);


                        var talkTime = JSON.parse(response.talkTime);
                        setAgentTimerBar("#vici-talk-bench", talkTime.Percentage);

                        var dispoTime = JSON.parse(response.dispoTime);
                        setAgentTimerBar("#vici-dispo_dead-bench", dispoTime.Percentage);
                    }
                },
                complete: function () {
                    handleAgentTimer(pageName);
                }
            });
        }
        else {
            if (typeof (getAgentTimes_Timer) !== "undefined") {
                clearAgentTimes_Timer();
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * check if vici agent times panel exist.
    ********************************************************************************/
    function IsObjectExist(objectName) {
        return (($(objectName) !== null && $(objectName).length > 0));
    }

    /********************************************************************************
    *
    * Private functions
    * check if vici agent times panel exist.
    ********************************************************************************/
    function IsViciAgentTimesPanelExist() {
        return (($("#panel-vici-agent-times") !== null && $("#panel-vici-agent-times").length > 0));
    }

    /********************************************************************************
    *
    * Private functions
    * check if vici agent times timer exist
    ********************************************************************************/
    function IsViciAgentTimes_TimerExist() {
        return (typeof (getAgentTimes_Timer) !== "undefined" && getAgentTimes_Timer !== null);
    }

    /********************************************************************************
    *
    * Private functions
    * handle vici agent timer. Enable / Disable Timer
    ********************************************************************************/
    function handleAgentTimer(pageName) {
        if (!IsViciAgentTimesPanelExist()) {
            if (IsViciAgentTimes_TimerExist()){
                clearAgentTimes_Timer();
            }
        }
        else {
            if (IsViciAgentTimesPanelExist()){
                if (!IsViciAgentTimes_TimerExist()) {
                    enableAgentTimes_Timer(pageName);
                }
                else {
                    if (sessionStorage.getItem("startAgentTimes_Timer") === "true") {
                        enableAgentTimes_Timer(pageName);
                    }
                }
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * check if vici agent times timer exist
    ********************************************************************************/
    function IsViciUniqueId_TimerExist() {
        return (typeof (getUniqueId_Timer) !== "undefined" && getUniqueId_Timer !== null);
    }

    /********************************************************************************
    *
    * Private functions
    * handle vici agent timer. Enable / Disable Timer
    ********************************************************************************/
    function handleUniqueId(pageName, callStatus) {

        if (sessionStorage.getItem("UniqueId") !== "" || callStatus !== ViciStatus.Incall) {
            if (IsViciUniqueId_TimerExist()) {
                clearUniqueId_Timer();
            }
        }
        else {
            if (!IsViciUniqueId_TimerExist()) {
                enableUniqueId_Timer(pageName);
                sessionStorage.setItem("startUniqueId_Timer", "false");
            }
            else {
                if (sessionStorage.getItem("startUniqueId_Timer") === "true") {
                    enableUniqueId_Timer(pageName);
                }
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * clear Agent Times Timer 
    ********************************************************************************/
    function clearUniqueId_Timer() {
        clearInterval(getUniqueId_Timer);
        sessionStorage.setItem("startUniqueId_Timer", "true");
    }

    /********************************************************************************
    *
    * Private functions
    * set Agent Times Timer
    ********************************************************************************/
    function enableUniqueId_Timer(pageName) {
        getUniqueId_Timer = setInterval(function () {

            hideErrorOnPage(pageName);

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage("Vici Server Error(CurrentCallInfo) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var successCallBack = function (data) {
                if (isValidViciResult(data)) {
                    saveViciCallInfoToSession(data, pageName);
                }
                else {
                    var errMsg = "Vici Service Error (Get Call Information) - Error: " + getViciErrorMessage(data);
                    showErrorOnPage(errMsg, pageName);
                }
            }

            var params = $.param({ "function": "CurrentCallInfo" });

            invokeViciFunction(params, successCallBack, errorCallBack);

        }, 1000);
    }

    /********************************************************************************
    *
    * Private functions
    * display Agent Times 
    ********************************************************************************/
    function setAgentTimerBar(barBenchObject, percentage) {
        if (IsViciAgentTimesPanelExist()) {
            $(barBenchObject).html(percentage + "%");
            $(barBenchObject).css('width', percentage + '%').attr('aria-valuenow', percentage);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * clear Agent Times Timer 
    ********************************************************************************/
    function clearAgentTimes_Timer() {
        clearInterval(getAgentTimes_Timer);
        sessionStorage.setItem("startAgentTimes_Timer", "true");
    }

    /********************************************************************************
    *
    * Private functions
    * set Agent Times Timer
    ********************************************************************************/
    function enableAgentTimes_Timer(pageName) {
        if (IsViciAgentTimesPanelExist()) {
            setAgentTimes_Timer(pageName);
            sessionStorage.setItem("startAgentTimes_Timer", "false");
        }
        else {
            if (IsViciAgentTimes_TimerExist()) {
                clearAgentTimes_Timer();
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * set Vici Integration Timer with interval of 1 second
    ********************************************************************************/
    function setViciIntegration_Timer(pageName) {
        pingViciIntegration_Timer = setInterval(function () {
            pingViciIntegration(pageName);
        }, 10000);
    }

    /********************************************************************************
    *
    * Private functions
    * clear Vici Integration Timer
    ********************************************************************************/
    function clearPingViciIntegration_Timer() {
        clearInterval(pingViciIntegration_Timer);
    }

    /********************************************************************************
    *
    * Private functions
    * check if Vici Integration Timer exists
    ********************************************************************************/
    function IsViciIntegration_TimerExist() {
        return (typeof (pingViciIntegration_Timer) !== "undefined" && pingViciIntegration_Timer !== null);
    }

    /********************************************************************************
    *
    * Private functions
    * ping vici integration
    ********************************************************************************/
    function pingViciIntegration(pageName) {

        if (viciIntegrationPingAttempts === 0) {
            var errorCallingIntegration = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception) + " - Vici Integration Service Not Running - Attempt To Connect For 30 Seconds", pageName);
                viciIntegrationPingAttempts = viciIntegrationPingAttempts + 1;
                if (!IsViciIntegration_TimerExist()) {
                    setViciIntegration_Timer(pageName);
                }
            }
        }
        else {
            var errorCallingIntegration = function (jqXHR, exception) {
                if (viciIntegrationPingAttempts < 3) {
                    viciIntegrationPingAttempts = viciIntegrationPingAttempts + 1;
                    showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception) + " - Vici Integration Service Not Running - Attempt To Connect For 30 Seconds", pageName);
                }
                else {
                    showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception) + " - Vici Integration Service Not Running. Please Contact Your Supervisor.", pageName);
                    clearPingViciIntegration_Timer();
                    viciIntegrationPingAttempts = 0;
                }
            }

        }

        var successCallBack = function (data) {
            getViciStatusIfIntegrationFound(data, pageName);
        }

        var params = $.param({ "function": "Ping" });

        invokeViciFunction(params, successCallBack, errorCallingIntegration);
    }   

    /********************************************************************************
    *
    * Private functions
    * extract Vici Error Message
    ********************************************************************************/
    function getViciErrorMessage(data) {
        return ((data.ErrorMessage === null) ? "Unknown." : data.ErrorMessage);
    }


    /********************************************************************************
    *
    * Private functions
    * ajax call back function - check vici ping status
    ********************************************************************************/
    function getViciStatusIfIntegrationFound(data, pageName) {
        if (data.Result === "Pong") {
            hideErrorOnPage(pageName);
            //loadViciStatusOnLandingPage(pageName);
        }
        else {
            var errMsg = "Vici Integration Ping Error. Result: " + ((data.Result === null) ? "Unknown." : data.Result) + " - Error Msg: " + getViciErrorMessage(data);
            showErrorOnPage(errMsg, pageName);
        }
    }       
    
    /********************************************************************************
    *
    * Private functions
    * get currrent call information. If landing page
    ********************************************************************************/
    function loadViciStatusOnLandingPage(pageName) {
        if (pageName === ViciPageSource.landing) {
            var params = $.param({ "function": "CurrentCallInfo" });

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var successCallBack = function (data) {
                if (pageName === ViciPageSource.landing) {
                    landingPageViciStatusResult(data, pageName);
                }
            }
            invokeViciFunction(params, successCallBack, errorCallBack);
        }
    }       

    /********************************************************************************
    *
    * Private functions
    * check if Valid Vici Result.
    ********************************************************************************/
    function isValidViciResult(data) {
        return (data.Success === true && data.Result !== "false");
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back - get campaigns for login agent.
    ********************************************************************************/
    function userLoginCampaigns(data, pageName) {
        if (isValidViciResult(data)) {
            var user = $("#txtViciUserName").val();
            var password = $("#txtViciUserPassword").val();

            var params = $.param({
                "function": "UserLoginCampaigns",
                User: user,
                Password: password
            });

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var successCallBack = function (data) {
                if (isValidViciResult(data)) {
                    loadCampaigns(data, pageName);
                }
                else {
                    alert("Vici Error(Get Vici Campaigns)");
                }
            }

            invokeViciFunction(params, successCallBack, errorCallBack);
        }
        else {
            alert("Vici Error(User LogIn) - Incorrect UserName or Password");
        }
    }

    /********************************************************************************
    *
    * Private functions
    * load Campaigns into drop down list. Hide / Show Components
    ********************************************************************************/
    function loadCampaigns(data, pageName) {

        var dataResult = JSON.parse(data.Result);

        var index = 0;

        $('#ddlViciCampaigns').empty();

        $.each(dataResult, function (dataResult, item) {
            if (item === "-- PLEASE SELECT A CAMPAIGN --") {
                $('#ddlViciCampaigns').append("<option disabled='disabled' value='" + index + "' selected='selected'>" + item + "</option>");
            }
            else {
                $('#ddlViciCampaigns').append(
                    '<option value="' + index + '">' + item + '</option>');
            }
            index = index + 1;
        });

        $("#divViciUserName").show();
        $("#divViciUserPassword").show();
        $('#txtViciUserPassword').attr("disabled", "disabled");
        $('#txtViciUserName').attr("disabled", "disabled");
        $("#divPhonePassword").hide();
        $("#divPhoneCode").hide();
        $("#divViciLoginSkip").hide();
        $("#divViciLogin").show();
        $("#divCampaign").show();
        $('#btnlogInUser').hide();
    }

    /********************************************************************************
    *
    * Private functions
    * select vici campaign.
    ********************************************************************************/
    function selectCampaign(pageName) {

        if ($("#ddlViciCampaigns" + " option:selected").text() === "-- PLEASE SELECT A CAMPAIGN --") {
            showErrorOnPage("Please Select a Valid Vici campaign", pageName);
        }
        else {
            var campaign = $("#ddlViciCampaigns" + " option:selected").text();

            var params = $.param({
                "function": "SelectCampaign",
                Campaign: campaign
            });

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var successCallBack = function (data) {
                //closeModalShowPausePage(data, pageName);
                window.location.href = window.location.origin + "/Vetting/VettingConfirmation";
            }

            invokeViciFunction(params, successCallBack, errorCallBack);
        }
        
    }

    /********************************************************************************
    *
    * Private functions
    * Clear and Close Modal. Show Pause Screen. Load Pause Left Menu Items
    ********************************************************************************/
    function closeModalShowPausePage(data, pageName) {
        localStorage.setItem("viciPhoneCode", $("#txtPhoneCode").val());
        localStorage.setItem("viciPhoneCodePassword", $("#txtPhoneCodePassword").val());
        localStorage.setItem("viciUserName", $("#txtViciUserName").val());
        localStorage.setItem("viciUserPassword", $("#txtViciUserPassword").val());
        localStorage.setItem("viciPauseReason", "LOGIN");
        localStorage.setItem("viciSelectedCampaign", $("#ddlViciCampaigns" + " option:selected").text());
        sessionStorage.setItem("viciLogIn", true);
        //LoadSideMenu(null, null, 5);
        //ClearHideModal();
        //$(ViciloadViewIntoDiv.Main).load(baseURL + 'Vici/PausedScreen', function () {
        //    initializePausePage("pause");
        //});
        ////window.location.href = window.location.origin + "/Home/SuccessPage";
    }

    /********************************************************************************
    *
    * Private functions
    * Quick Dial New Number
    ********************************************************************************/
    function quickDial(phoneNumber, contractNo, callBackId, pageName) {

        if (phoneNumber === null || phoneNumber === "") {
            showErrorOnPage("Vici Validation Error (Quick Dial) - Invalid Phone Number: " + (phoneNumber === null) ? "Unknown": "Empty", pageName);
        }
        else {
            hideErrorOnPage(pageName);

            //startSpinner();

            var params = $.param({
                "function": "QuickDial",
                PhoneNumber: phoneNumber,
                ContractNo: contractNo
            });

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage(errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var gotoWaiting = function (data) {
                if (isValidViciResult(data)) {
                    $(ViciloadViewIntoDiv.Main).load(baseURL + 'Vici/WaitingScreen', function () {
                        initializeWaitingScreen('waiting');
                    });
                }
                else {
                    showErrorOnPage("Vici Service Error (Quick Dial) - Error: " + getViciErrorMessage(data), pageName);
                }
            }

            var removeCallBack = function (data) {
                var params = $.param({
                    "function": "RemoveCallBack",
                    CallBackID: callBackId
                });

                invokeViciFunction(params, gotoWaiting, errorCallBack);
            }

            if (callBackId !== null && parseInt(callBackId) > 0) {
                invokeViciFunction(params, removeCallBack, errorCallBack);
            }
            else {
                invokeViciFunction(params, gotoWaiting, errorCallBack);
            }
        }
    }


    /********************************************************************************
    *
    * Private functions
    * log In User
    ********************************************************************************/
    function logInUser(pageName) {
        if (($("#txtViciUserName").val() == "") || ($("#txtViciUserPassword").val() == "")) {
            showErrorOnPage("Please Enter a valid Vici User Code and Password!!", pageName);
        }
        else {

            /*if ($("#txtViciUserName").val() !== AgentCC_ViciAgentCode) {
                showErrorOnPage("Vici Validation Error(Login Details) - UserName Entered is Not the Same as On DB: " + AgentCC_ViciAgentCode, pageName);
            }
            else {*/
                hideErrorOnPage(pageName);
                var user = $("#txtViciUserName").val();;
                var password = $("#txtViciUserPassword").val();

                var params = $.param({
                    "function": "UserLoginPass",
                    User: user,
                    Password: password
                });

                var errorCallBack = function (jqXHR, exception) {
                    showErrorOnPage("Vici Server Error(LogIn) - Error: "+ errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                }

                var successCallBack = function (data) {
                    userLoginCampaigns(data, pageName);
                }

                invokeViciFunction(params, successCallBack, errorCallBack);
            /*}*/
        }
    }

    /********************************************************************************
    *
    * Private functions
    * set Vici Status to Ready (Outbound) / Closer (Inbound)
    ********************************************************************************/
    function resume(pageName) {
        hideErrorOnPage(pageName);

        //startSpinner();

        var params = $.param({ "function": "Resume" });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(Resume) - Error: " +errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }
        
        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                $(ViciloadViewIntoDiv.Main).load(baseURL + "Vici/WaitingScreen", function () {
                    initializeWaitingScreen('waiting');
                });
                ClearHideModal();
            }
            else {
                var errMsg = "Vici Service Error (Unable to resume) - Error: " + getViciErrorMessage(data);
                showErrorOnPage(errMsg, pageName);
            }
            toggleLeftHeaderMenu(LeftHeaderMenu.Vici_Waiting);
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * check status. If Ready Set 1 Second TimeOut. Otherwise Load Customer Page
    ********************************************************************************/
    function doTheRedirect() {
        //alert("waitingForInCallStatus");

        var params = $.param({ "function": "CurrentCallInfo" });

        var successCallBack = function (data) {
            var dataResult = JSON.parse(data.Result);

            if (dataResult == null) {
                initializeViciIntegration('loginModal');
                window.location.href = window.location.origin + "/Home/ViciLogin";
            }

            if (parseInt(dataResult.status) === ViciStatus.None) {
                initializeViciIntegration('loginModal');
                window.location.href = window.location.origin + "/Home/ViciLogin";
            }

            if (parseInt(dataResult.status) === ViciStatus.PreLogin) {
                window.location.href = window.location.origin + "/Home/ViciLogin";
            }
                
            if (parseInt(dataResult.status) === ViciStatus.Dead) {
                window.location.href = window.location.origin + "/Vetting/VettingConfirmation";
            }
                

            if (parseInt(dataResult.status) === ViciStatus.Paused) {
                window.location.href = window.location.origin + "/Vetting/VettingConfirmation";
            }
        }

        var errorCallBack = function (jqXHR, exception) {
            alert("Vici Server Error(CurrentCallInfo)");
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }


    /********************************************************************************
    *
    * Private functions
    * set session variable. Load Customer Page
    ********************************************************************************/
    function getCallInfoAndLoadCustomer(data) {
        toggleLeftHeaderMenu(parseInt(data.status));

        sessionStorage.setItem("PreLoad", "true");

        if (data.IsInboundCall === false) {
            sessionStorage.setItem("SearchValue", data.contractNo);
        }
        else {
            if (data.phoneNumber === null || data.phoneNumber === "") {
                sessionStorage.setItem("PreLoad", "false");
            }
            else {
                sessionStorage.setItem("SearchValue", data.phoneNumber);
            }
        }

        sessionStorage.setItem("LeadId", data.leadID);
        sessionStorage.setItem("IsInboundCall", data.IsInboundCall);

        if (data.contractNo === null || data.contractNo === "") {
            data.contractNo = 0;
        }

        var jsonViciCallInfo = JSON.stringify(data);
        sessionStorage.setItem("jsonViciCallInfo", jsonViciCallInfo);

        $(ViciloadViewIntoDiv.Main).load(baseURL + 'CustomerSearch/INDEX', function () {
            CustomerSearchSetup();
            HideSpinner();
        });
    }    

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - Get Vici Status and LogIn
    ********************************************************************************/
    function getViciStatusAndLogIn(pageName) {
        initializePreLoginPage();

        hideErrorOnPage(pageName);

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(GetAgentStatus) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception));
        }

        var successCallBack = function (data) {
            doPhonelogIn(data, pageName);
        }

        var params = $.param({ "function": "GetAgentStatus" });
        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - check Status. Pre-logIn = LogIn Phone. Other = Initiliaze Vici and Try Again
    * Potential Infinite Loop
    ********************************************************************************/
    function doPhonelogIn(data, pageName) {

        if (data.Result === null) {
            showErrorOnPage("Unable to determine Vici Status!!", pageName);
        }
        else {

            var viciPhoneCode = $("#txtPhoneCode").val();

            var viciPhonePassword = "1234";//Set Default Password

            if ($("#divPhonePassword").is(":visible")) {
                viciPhonePassword = $("#txtPhoneCodePassword").val();
            }
            else {
                $("#txtPhoneCodePassword").val("1234");
            }            

            if (parseInt(data.Result) === ViciStatus.PreLogin) {
                var params = $.param({
                    "function": "PhoneLogin",
                    Phone: viciPhoneCode,
                    Password: viciPhonePassword
                });

                var errorCallBack = function (jqXHR, exception) {
                    showErrorOnPage("Vici Server Error(PhoneLogIn) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                }

                var successCallBack = function (data) {
                    showUserLogIn(data, pageName);
                }

                invokeViciFunction(params, successCallBack, errorCallBack);
            }
            else {
                var successCallBack = function () {
                    initilizeAndDoLogIn(pageName);
                }

                quickLogOut(pageName, "HUP", successCallBack);
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * reset Vici Session Details
    ********************************************************************************/
    function resetvicilogInDetails() {
        localStorage.setItem("viciPhoneCode", null);
        localStorage.setItem("viciPhoneCodePassword", null);
        localStorage.setItem("viciUserName", null);
        localStorage.setItem("viciUserPassword", null);
        localStorage.setItem("viciPauseReason", null);
        localStorage.setItem("viciSelectedCampaign", null);
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function show user logIn components / Error
    ********************************************************************************/
    function showUserLogIn(data, pageName) {
        if (data.Result === "true") {
            $("#divViciUserName").show();
            $("#divViciUserPassword").show();
            $('#txtViciUserPassword')[0].type = "password";
            $("#divPhonePassword").hide();
            $("#divPhoneCode").hide();
            $("#divViciLoginSkip").show();
            $("#divViciLogin").hide();
            $('#txtViciUserName').focus();
            //HideSpinner();
        }
        else {
            if ($("#divPhonePassword").is(":visible")) {
                showErrorOnPage("Phone Login Failed - invalid Phone Code or Password", pageName);
            }
            else {
                showErrorOnPage("Auto Phone login Failed - please enter a Password", pageName);
                $("#txtPhoneCodePassword").val("");
                $("#divPhonePassword").show();
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * ajax function - get Vici Call Information. 
    * OnSuccess - invoke Save Vici Call Information to Session
    ********************************************************************************/
    function saveViciCallInfo(pageName) {
        hideErrorOnPage(pageName);

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(CurrentCallInfo) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                saveViciCallInfoToSession(data, pageName);
            }
            else {
                var errMsg = "Vici Service Error (Get Call Information) - Error: " + getViciErrorMessage(data);
                showErrorOnPage(errMsg, pageName);
            }
        }

        var params = $.param({ "function": "CurrentCallInfo" });

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - save Vici Call Information to Session
    ********************************************************************************/
    function saveViciCallInfoToSession(calBackData, pageName) {

        var dataResult = JSON.parse(calBackData.Result);

        if (calBackData.Success === true && dataResult.status == ViciStatus.Incall) {

            dataResult.contractNo = sessionStorage.getItem("contractNo");
            var callInfo = JSON.stringify(dataResult);
            toggleLeftHeaderMenu(parseInt(dataResult.status));

            sessionStorage.setItem("phoneNumber", dataResult.phoneNumber);
            sessionStorage.setItem("UniqueId", dataResult.UniqueID);

            handleUniqueId(pageName, dataResult.status);

            if (dataResult.UniqueID !== "" && sessionStorage.getItem("sessionId") !== "null") {

                sessionStorage.setItem("LeadId", dataResult.leadID);
                sessionStorage.setItem("IsInboundCall", dataResult.IsInboundCall);
                var jsonViciCallInfo = JSON.stringify(dataResult);
                sessionStorage.setItem("jsonViciCallInfo", jsonViciCallInfo);

                var params = $.param({
                    viciCallInfo: callInfo,
                    sessionID: sessionStorage.getItem("sessionId")
                });

                $.ajax({
                    url: baseURL + "Vici/SaveViciCallInfoPerSession",
                    type: "POST",
                    dataType: "json",
                    data: params,
                    error: function (jqXHR, exception) {
                        showErrorOnPage("Resolution Error(Save CallInfo to Session) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                    },
                    success: function () {
                        HideSpinner();
                        handleUniqueId(pageName, dataResult.status);
                    }

                });
            }
        }
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function 
    * Move Or Create Lead
    * invoke save call back and WrapUp Call
    ********************************************************************************/
    function wrapUpCallback(viciSaveData, pageName) {
        //startSpinner();

        hideErrorOnPage(pageName);

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(MoveOrCreateLead) - Error: "+ errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var endCall = function (data) {
            //update Lead and List Id to New Lead Information
            var newLead = JSON.parse(data.Result);

            viciSaveData.LeadId = newLead.LeadID;
            viciSaveData.ListId = newLead.ListID;

            saveCallBackAndWrapUpCall(viciSaveData, pageName)
        }

        var phoneNumber = viciSaveData.CallBackPhoneNumber.replace(/\s/g, ''); //remove space

        var params = $.param({
            "function": "MoveOrCreateLead",
            ContractNo: viciSaveData.ContractNo,
            PhoneNumber: phoneNumber
        });

        invokeViciFunction(params, endCall, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * ajax call back function - save Vici Call Back - Currently Recipient USERONLY
    ********************************************************************************/
    function saveCallBackAndWrapUpCall(viciSaveData, pageName) {
        //startSpinner();

        if (localStorage.getItem("viciUserName") === "null") {
            showErrorOnPage("Unable to get Agent Code", pageName);
        }
        else {
            var agentCode = localStorage.getItem("viciUserName");

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage("Vici Server Error(SaveCallBackJsonDataInputStr) - Error: "+ errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            }

            var endCall = function (data) {
                if (isValidViciResult(data)) {
                    wrapUpCall(viciSaveData.CallResultIndex, pageName);
                }
                else {
                    showErrorOnPage(data.ErrorMessage, pageName);
                }
            }

            var json_string = JSON.stringify({
                AgentCode: agentCode,
                CallBackDateTime: viciSaveData.CallBackDateTime,
                IsMyCallBack: viciSaveData.IsMyCallBack,
                LeadID: viciSaveData.LeadId,
                ListID: viciSaveData.ListId,
                PhoneNumber: viciSaveData.CallBackPhoneNumber,
                Recipient: 'USERONLY',
                Comment: viciSaveData.CallBackComment
            });

            var params = $.param({
                "function": "SaveCallBackJsonDataInputStr",
                jsonData: json_string
            });

            invokeViciFunction(params, endCall, errorCallBack);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * reset Vici Information for next call
    ********************************************************************************/
    function resetViciCallInfo() {
        sessionStorage.setItem("LeadId", 0);
        sessionStorage.setItem("jsonViciCallInfo", "");
        sessionStorage.setItem("contractNo", null);
        sessionStorage.setItem("sessionId", null);
    }

    /********************************************************************************
    *
    * Private functions
    * reset Vici Information for next call
    ********************************************************************************/
    function wrapUpCall(callResultIndex, pageName) {

        //startSpinner();

        hideErrorOnPage(pageName);


        var params = $.param({
            "function": "GetCallResultDispStatus",
            callResultIndex: callResultIndex
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(GetCallResultDispStatus) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var waitForNewCall = function (data) {
            LoadSideMenu(null, null, 6);
            resetViciCallInfo();
            wrapUpDialogs.showSuccess(function () {
                if (isValidViciResult(data)) {
                    resume('waiting');
                }
                else {
                    var error = getViciErrorMessage(data);
                    showErrorOnPage("Vici Server Error(QuickDispo) - Error: " + error, pageName);
                }
            });
            
        };

        var showPausePartial = function (data) {
            LoadSideMenu(null, null, 5);
            resetViciCallInfo();
            wrapUpDialogs.showSuccess(function () {
                if (isValidViciResult(data)) {
                    showPauseScreen();
                }
                else {
                    var error = getViciErrorMessage(data);
                    showErrorOnPage("Vici Server Error(QuickDispo) - Error: " + error, pageName);
                }
            });
        };
        
        var endCall = function (data) {
            if (isValidViciResult(data)) {
                //startSpinner();
                status = data.Result;
                var params = $.param({
                    "function": "QuickDispo",
                    Status: status
                });

                var errorCallBack = function (jqXHR, exception) {
                    showErrorOnPage("Vici Server Error(QuickDispo) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                }

                if ($('#checkbox-vici-pause-aftercall')[0].checked === false) {
                    invokeViciFunction(params, waitForNewCall, errorCallBack);
                }
                else {
                    invokeViciFunction(params, showPausePartial, errorCallBack);
                }
            }
            else {
                var error = (data.ErrorMessage === null) ? "" : data.ErrorMessage;
                showErrorOnPage("Unable to get disposition status. " + error, pageName);
            }
        };

        invokeViciFunction(params, endCall, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * skip Vici LogIn and Load Customer Page
    ********************************************************************************/
    function loadCustSearchPage(pageName) {
        //startSpinner();
        hideErrorOnPage(pageName);
        sessionStorage.setItem("PreLoad", "false");
        $(ViciloadViewIntoDiv.Main).load(baseURL + 'CustomerSearch/INDEX', function () {
            CustomerSearchSetup();
            HideSpinner();
        });
    }

    /********************************************************************************
    *
    * Private functions
    * Quick Dispo. If Update Pause Status Set - Set Status to HUP (Hang Up)
    ********************************************************************************/
    function quickDispo(id, status, isUpatePauseStatus) {
        //hideErrorOnPage(pageName);

        //if (status === "transfer") {
        //    startSpinner();
        //}

        var params = $.param({
            "function": "QuickDispo",
            Status: status
        });

        var errorCallBack = function (jqXHR, exception) {
            //showErrorOnPage("Vici Server Error(QuickDispo) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            alert("Vici Server Error(QuickDispo)");
        }

        var successCallBack = function () {
        //    if (ViciPageSource.landing === pageName) {
        //        changeHyperLinkButtonProperties(btnViciLogIn, btnViciLogInHtml, ViciStatusHRef.Paused, "viciIntegration.initializePausePage('pause')", ViciStatusButtonClass.Paused, ViciloadViewIntoDiv.Main);
        //        sessionStorage.setItem("viciLogIn", true);
        //        $(btnViciLogAppStatus).html("Pause");
            //        HideSpinner();
            alert("Hung up successfully");
            //document.getElementById("TelephoneStatusIdd").disabled = false;
            document.getElementById("TypeId_" + id).disabled = false;
            document.getElementById("btnRedial_" + id).disabled = false;
            document.getElementById("btnSubmit_" + id).disabled = false;
            //document.getElementById("TypeIdd").disabled = false;
            //document.getElementById("btnRediall").disabled = false;
            //document.getElementById("btnSubmitt").disabled = false;
            document.getElementById("btnHangup_" + id).disabled = true;
            document.getElementById("TelStatus_" + id).style.display = "block";
            document.getElementById("Calling_" + id).style.display = "none";
            }

        //    if (ViciPageSource.transferCallModal === pageName) {
        //        if ($('#checkbox-vici-pause-aftercall')[0].checked === false) {
        //            resume(pageName);
        //        }
        //        else {
        //            showPauseScreen();
        //        }
        //    }
        //}

        var setPauseStatus = function () {
            var params = $.param({
                "function": "Pause",
                PauseCode: "HUP"
            });

            var errorCallBack = function (jqXHR, exception) {
                //showErrorOnPage("Vici Server Error(Pause) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                alert("Vici Server Error(Pause)");
            }

            invokeViciFunction(params, successCallBack, errorCallBack);
        }

        if (isUpatePauseStatus === true) {
            invokeViciFunction(params, setPauseStatus, errorCallBack);
        }
        else {
            invokeViciFunction(params, successCallBack, errorCallBack);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * Quick Log Out. invoke call back on success
    ********************************************************************************/
    function startSpinner() {
        if (!spinner.isSpinning()) {
            spinner.show();
        }
    }

    /********************************************************************************
    *
    * Private functions
    * Quick Log Out. invoke call back on success
    ********************************************************************************/
    function quickLogOut(pageName, status, callBack) {
        hideErrorOnPage(pageName);

        if (ViciPageSource.landing !== pageName) {
            //startSpinner();
        }

        var params = $.param({
            "function": "QuickLogOut",
            Status: status
        });

        var successCallBack = function (data) {
            if (typeof (callBack) !== "undefined" && callBack !== null) {
                callBack(data);
            }
            else {
                if (isValidViciResult(data)) {
                    $(ViciloadViewIntoDiv.Main).load(baseURL + 'Home/Index', function () {
                        HideSpinner();
                        toggleLeftHeaderMenu(LeftHeaderMenu.Normal);
                        $('#div-checkbox-vici-pause-aftercall').hide();
                        landingPage.runFunctionsOnDocReady();
                        resetvicilogInDetails();
                    });
                }
                else {
                    showErrorOnPage("Vici Server Error(HangUp) - Error: " + getViciErrorMessage(data), pageName);
                }
            }
        }
        
        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(QuickLogOut) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Public functions
    * Hang Up 
    ********************************************************************************/
    function hangup(pageName) {
        hideErrorOnPage(pageName);

        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId,
            agent_user: AgentCC_ViciAgentCode
        });

        $.ajax({
            url: baseURL + "Vici/GrabCall",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici API Call(GrabCall) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                if (response.Success === "Error") {
                    showErrorOnPage(response.message, pageName);
                    HideSpinner();
                }
                else {
                    doHangUp(pageName);
                }
            },
            beforeSend: function () {
                //startSpinner();
            }
        });
    }

    /********************************************************************************
    *
    * Private functions
    * Do Hang Up
    ********************************************************************************/
    function doHangUp(id) {

        document.getElementById("TypeId_" + id).disabled = true;
        document.getElementById("btnRedial_" + id).disabled = true;
        document.getElementById("btnSubmit_" + id).disabled = true;
        document.getElementById("btnHangup_"+ id).disabled = true;

        //document.getElementById("TelephoneStatusIdd").disabled = true;
        //document.getElementById("TypeIdd").disabled = true;
        //document.getElementById("btnRediall").disabled = true;
        //document.getElementById("btnSubmitt").disabled = true;

        var params = $.param({
            "function": "Hangup"
        });

        var errorCallBack = function (jqXHR, exception) {
            //showErrorOnPage("Vici Server Error(HangUp) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            alert("Vici Server Error(HangUp)");
        }

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {

                quickDispo(id, "PAUSE", true);
            }
            else {
                //showErrorOnPage("Vici Server Error(HangUp) - Error: " + getViciErrorMessage(data), pageName);
                alert("Vici Server Error(HangUp)" + getViciErrorMessage(data))
            }
            //HideSpinner();
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * Redial (for Outbound) 
    ********************************************************************************/
    function redial(pageName) {

        hideErrorOnPage(pageName);
        
        var params = $.param({
            "function": "Redial"
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(Redial) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                saveViciCallInfo(pageName);
                sessionStorage.setItem("viciLogIn", "true");
            }
            else {
                showErrorOnPage("Vici Server Error(Redial) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Public functions
    * Redial (for Inbound) 
    ********************************************************************************/
    function redialLead(pageName) {

        hideErrorOnPage(pageName);
        var leadId = sessionStorage.getItem("LeadId");
        //startSpinner();

        var params = $.param({
            "function": "RedialLead",
            leadID: leadId
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(RedialLead) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }


        var successCallBack = function (data) {
            HideSpinner();
            if (isValidViciResult(data)) {
                saveViciCallInfo(pageName);
                sessionStorage.setItem("viciLogIn", "true");
            }
            else {
                showErrorOnPage("Vici Server Error(RedialLead) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * get My Call Backs 
    ********************************************************************************/
    function getViciCallBacks(pageName) {

        var params = $.param({
            "function": "GetCallBacks"
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(GetCallBacks) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                loadCallBacks(data, pageName);
            }
            else {
                showErrorOnPage("Vici Server Error(GetCallBacks) - Error: " + getViciErrorMessage, pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * load Call Backs Into Partial View
    ********************************************************************************/
    function loadCallBacks(data, pageName) {

        if (isValidViciResult(data)) {
            var params = $.param({
                viciCallBacks: data.Result,
                ViciPageSource: pageName
            });

            $.ajax({
                url: baseURL + "Vici/GetMyCallBacks",
                type: "POST",
                data: params,
                error: function (jqXHR, exception)  {
                    showErrorOnPage("Resolution Error(GetMyCallBacks) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                },
                success: function (response) {
                    $("#vici-pause-mycallbacks").html(response);
                }
            });
        }
    }

    /********************************************************************************
    *
    * Private functions
    * load Save Pause Reason Modal
    ********************************************************************************/
    function showPauseScreen() {
        clearAgentTimes_Timer();
        //startSpinner();
        $(ViciloadViewIntoDiv.Modal).load("Vici/LoadSavePausedReasonModal/", function () {
            HideSpinner();
            ShowModal();
        });     
    }

    /********************************************************************************
    *
    * Private functions
    * save Pause Reason
    ********************************************************************************/
    function savePauseReason(pageName) {

        hideErrorOnPage(pageName);
        //startSpinner();

        var strPauseCodeID = $("#ddlViciPauseCode" + " option:selected").val();
        var strPauseCode = $("#ddlViciPauseCode" + " option:selected").text();
        var pauseCodeID = 0;
        if (strPauseCodeID !== "") {
            pauseCodeID = parseInt(strPauseCodeID);
        }

        if (typeof (PauseCodeID[pauseCodeID]) === "undefined") {
            showErrorOnPage("Resolution Error(Save Pause Code) - Error: Unknown Vici Pause Code(" + strPauseCodeID + ")" + ". Please contact DEV Team.", pageName);
        }
        else {

            var params = $.param({
                "function": "CurrentCallInfo"
            });

            var pauseCode = PauseCodeID[pauseCodeID];

            var errorCallBack = function (jqXHR, exception) {
                showErrorOnPage("Vici Server Error(Pause) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                HideSpinner();
            }

            var processCallInfo = function (data) {

                var callInfo = JSON.parse(data.Result);

                if (data.Success === true && callInfo.status == ViciStatus.Ready) {

                    var params = $.param({
                        "function": "PauseFromReady",
                        Status: pauseCode
                    });


                    var PauseFromReadyCallBack = function () {
                        localStorage.setItem("viciPauseReason", strPauseCode);
                        ClearHideModal();
                        $(ViciloadViewIntoDiv.Main).load(baseURL + 'Vici/PausedScreen', function () {
                            initializePausePage("pause");
                            HideSpinner();
                        });
                    }

                    invokeViciFunction(params, PauseFromReadyCallBack, errorCallBack);
                }
                else {
                    var params = $.param({
                        "function": "Pause",
                        PauseCode: pauseCode
                    });

                    var successCallBack = function () {
                        localStorage.setItem("viciPauseReason", strPauseCode);
                        ClearHideModal();
                        $(ViciloadViewIntoDiv.Main).load(baseURL + 'Vici/PausedScreen', function () {
                            initializePausePage("pause");
                            HideSpinner();
                        });
                    }

                    invokeViciFunction(params, successCallBack, errorCallBack);
                }
            }

            invokeViciFunction(params, processCallInfo, errorCallBack);
        }
    }

    /********************************************************************************
    *
    * Private functions
    * load Call Other Number Modal
    ********************************************************************************/
    function loadCallOtherNumberModal(pageName){

        hideErrorOnPage(pageName);
        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId
        });

        $.ajax({
            url: baseURL + "Vici/CallOtherNumber",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici - Call Other Number Modal: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                $(ViciloadViewIntoDiv.Modal).html(response);
                ShowModal();
            },
            complete: function () {

            }

        });
    }

    /********************************************************************************
    *
    * Private functions
    * Load Search Page
    ********************************************************************************/
    function searchForContract(pageName) {

        hideErrorOnPage(pageName);
        var contractNo = 0;
        var sessionId = 0;

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId
        });

        $.ajax({
            url: baseURL + "CustomerSearch/INDEX",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici - Unable to load search page: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                $("#main-body").html(response);
                CustomerSearchSetup();
                HideSpinner();
            },
            beforeSend: function () {
                //startSpinner();
                LoadSideMenu(null, null, 0);
            }
        });
    }

    /********************************************************************************
    *
    * Private functions
    * Get Call Information
    * Incall - HangUp. Dial. Save Call Information to Session
    * Not InCall - Dial. Save Call Information to Session    *
    * Dial New Number after 2 seconds
    ********************************************************************************/
    function callOtherNumber(id, phoneNumber, contractNo) {
        document.getElementById("TelStatus_" + id).style.display = "none";
        document.getElementById("Calling_" + id).style.display = "block";
        document.getElementById("TypeId_" + id).disabled = true;
        //document.getElementById("TelephoneStatusIdd").disabled = true;
        //document.getElementById("TypeIdd").disabled = true;
        //document.getElementById("btnRediall").disabled = true;
        //document.getElementById("btnSubmitt").disabled = true;
        document.getElementById("btnRedial_" + id).disabled = true;
        document.getElementById("btnSubmit_" + id).disabled = true;
        document.getElementById("btnHangup_" + id).disabled = false;
        //hideErrorOnPage(pageName);
        //startSpinner();     

        var dialNumber = function (data) {

            if (isValidViciResult(data)) {

                var errorCallBack = function (jqXHR, exception) {
                    //showErrorOnPage("Vici Server Error(QuickDial) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
                    alert("Vici Server Error(QuickDial)");
                }

                var successCallBack = function (data) {
                    if (isValidViciResult(data)) {
                        //ClearHideModal();
                        //saveViciCallInfo(pageName);
                        //sessionStorage.setItem("viciLogIn", "true");
                        //console.log(data);
                        document.getElementById("TypeId_" + id).disabled = true;
                        //document.getElementById("TelephoneStatusIdd").disabled = true;
                        //document.getElementById("TypeIdd").disabled = true;
                        //document.getElementById("btnRediall").disabled = true;
                        //document.getElementById("btnSubmitt").disabled = true;
                        document.getElementById("btnRedial_" + id).disabled = true;
                        document.getElementById("btnSubmit_" + id).disabled = true;
                        document.getElementById("btnHangup_" + id).disabled = false;
                    }
                    else {
                        //showErrorOnPage("Vici Server Error(QuickDial) - Error: " + getViciErrorMessage(data), pageName);
                        alert("Vici Server Error(QuickDial) " + getViciErrorMessage(data));
                    }

                }

                setTimeout(function () {
                    var params = $.param({
                        "function": "QuickDial",
                        PhoneNumber: phoneNumber,
                        ContractNo: contractNo
                    });
                    invokeViciFunction(params, successCallBack, errorCallBack);
                }, 2000);
            }
            else {
                //showErrorOnPage("Vici Server Error(QuickDial) - Error: " + getViciErrorMessage(data), pageName);
                alert("Vici Server Error(QuickDial) " + getViciErrorMessage(data));
            }
        }


        var processCallInfo = function (data) {

            var callInfo = JSON.parse(data.Result);

            if (data.Success === true && callInfo.status == ViciStatus.Incall) {

                var params = $.param({
                    "function": "Hangup"
                });

                invokeViciFunction(params, dialNumber, errorCallBack);
            }
            else {
                dialNumber(data);
            }
        }

        var errorCallBack = function (jqXHR, exception) {
            //showErrorOnPage("Vici Server Error(CurrentCallInfo) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            alert("Vici Server Error(CurrentCallInfo)");
        }

        var params = $.param({
            "function": "CurrentCallInfo"
        });

        invokeViciFunction(params, processCallInfo, errorCallBack);        
    }

    /********************************************************************************
    *
    * Public functions
    * add new number
    ********************************************************************************/
    function addOtherNumber(pageName){

        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");
        var telType = $("#ddlCustAuthAddTelType option:selected").val();
        var telephone = $("#Telephone").val();

        var params = $.param({
            SessionId: sessionId,
            ContractNo: contractNo,
            TelType: telType,
            Telephone: telephone
        });

        $.ajax({
            url: baseURL + "CustomerAuth/AddTelephone",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Resolution Error(AddTelephone) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function () {
                viciIntegration.loadCallOtherNumberModal(pageName);
            }
        });
    }

    /********************************************************************************
    *
    * Public functions
    * Transfer Current Call To Agent
    ********************************************************************************/
    function quickTransferAgent(pageName) {

        hideErrorOnPage(pageName);
        var otherAgentCode = $("input[name='rbAgentTransfer']:checked").val();
        //startSpinner();

        var params = $.param({
            "function": "TransferCurrentCallToAgent",
            otherAgentCode: otherAgentCode
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(TransferCurrentCallToAgent) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }        

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                quickDispo(pageName, "transfer", false);
            }
            else {
                showErrorOnPage("Vici Server Error(TransferCurrentCallToAgent) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Public functions
    * Load Vici Groups
    ********************************************************************************/
    function loadViciGroups(pageName, isLoadViciOtherAgents) {
        hideErrorOnPage(pageName);
        //startSpinner();
        var agentCode = localStorage.getItem("viciUserName");

        var params = $.param({
            "function": "GetXferGroups",
            userId: agentCode
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(GetXferGroups) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var smsmarkup = "<option disabled='disabled' selected='selected'>Transfer to Group</option>";

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                var viciGroups = JSON.parse(data.Result);

                for (var j = 0; j < viciGroups.length; j++) {
                    smsmarkup += "<option value=" + viciGroups[j].ID + ">" + viciGroups[j].Name + "</option>";
                }

                $("#ddlTransferGroups").html(smsmarkup).show();
                if (isLoadViciOtherAgents === true) {
                    loadViciOtherAgents(pageName);
                }
                else {
                    HideSpinner();
                }
            }
            else {
                showErrorOnPage("Vici Server Error(GetTransferGroups) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Public functions
    * Load Vici Agents
    ********************************************************************************/
    function loadViciOtherAgents(pageName) {
        hideErrorOnPage(pageName);

        //startSpinner();

        var agentCode = localStorage.getItem("viciUserName");

        var params = $.param({
            "function": "GetXferAgents",
            userId: agentCode
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(GetOtherAgentStatus) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var content = "";

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                var agents = JSON.parse(data.Result);

                for (var j = 0; j < agents.length; j++) {
                    content += '<tr class="font-size-small"><td> ' + agents[j].FullName + '</td ><td>' + agents[j].UserId + '</td><td>' + agents[j].UserGroup + '</td><td class="status_' + agents[j].UserId+'">' + agents[j].Status + '</td><td class="center_radio"><input id="rbAgentTransfer" name="rbAgentTransfer" type="radio" value="' + agents[j].UserId +'" /></td></tr >';
                }

                if ($.fn.DataTable.isDataTable('#vici-TransferUsers')) {
                    var currDataTable = $('#vici-TransferUsers').DataTable();
                    currDataTable.destroy();
                }
                $('#vici-TransferUsers tbody').html(content); 
                setupTable("#vici-TransferUsers");
                HideSpinner();
            }
            else {
                showErrorOnPage("Vici Server Error(GetOtherAgentStatus) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Private functions
    * Change data into DataTable
    ********************************************************************************/
    function setupTable(dataTable) {
        if (!$.fn.DataTable.isDataTable(dataTable)) {
            return $(dataTable).DataTable({
                "ordering": true,
                "info": false,
                "searching": true,
                "lengthChange": false,
                "pageLength": 5,
                "pagingType": "full_numbers",
                "language":
                {
                    "paginate":
                    {
                        "first": "<<",
                        "previous": "<",
                        "next": ">",
                        "last": ">>"
                    }
                }
            });
        }
    }

    /********************************************************************************
    *
    * Public functions
    * Transfer Current Call To Group
    ********************************************************************************/
    function quickTransferGroup(pageName) {

        hideErrorOnPage(pageName);
        var viciGroupID = $("#ddlTransferGroups" + " option:selected").text();
        //startSpinner();

        var params = $.param({
            "function": "TransferCurrentCallToGroup",
            groupID: viciGroupID
        });

        var errorCallBack = function (jqXHR, exception) {
            showErrorOnPage("Vici Server Error(TransferCurrentCallToAgent) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
        }

        var successCallBack = function (data) {
            if (isValidViciResult(data)) {
                quickDispo(pageName, "transfer", false);
            }
            else {
                showErrorOnPage("Vici Server Error(TransferCurrentCallToAgent) - Error: " + getViciErrorMessage(data), pageName);
            }
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    /********************************************************************************
    *
    * Public functions
    * Load Transfer Call Modal
    ********************************************************************************/
    function loadTranfercallModal(pageName) {

        hideErrorOnPage(pageName);
        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId
        });

        $.ajax({
            url: baseURL + "Vici/TransferCall",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici Server Error(load tranfer call modal) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                $(ViciloadViewIntoDiv.Modal).html(response);
                ShowModal();
            },
            complete: function () {
                loadViciGroups(pageName, true);
            }
        });
    }

    /********************************************************************************
    *
    * Public functions
    * Park Existing Call
    ********************************************************************************/
    function parkCall(pageName) {
        hideErrorOnPage(pageName);
        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId,
            agent_user: AgentCC_ViciAgentCode
        });
        
        $.ajax({
            url: baseURL + "Vici/ParkCall",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici API Call (ParkCall) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                if (response.Success === "Error") {
                    showErrorOnPage(response.message, pageName);
                }
                else {
                    showErrorOnPage("Call OnHold", pageName);
                }
                HideSpinner();
            },
            beforeSend: function () {
                //startSpinner();
            }
        });
    }

    /********************************************************************************
    *
    * Public functions
    * Grab Parked - Existing Call
    ********************************************************************************/
    function grabCall(pageName) {
        hideErrorOnPage(pageName);
        var contractNo = sessionStorage.getItem("contractNo");
        var sessionId = sessionStorage.getItem("sessionId");

        var params = $.param({
            contractNo: contractNo,
            sessionId: sessionId,
            agent_user: AgentCC_ViciAgentCode
        });

        $.ajax({
            url: baseURL + "Vici/GrabCall",
            type: "POST",
            data: params,
            error: function (jqXHR, exception) {
                showErrorOnPage("Vici API Call(GrabCall) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName);
            },
            success: function (response) {
                if (response.Success === "Error") {
                    showErrorOnPage(response.message, pageName);
                }
                HideSpinner();
            },
            beforeSend: function () {
                //startSpinner();
            }
        });
    }

    function checkViciStatusAndRedirect() {
        try {
            var errorCallingIntegration = function () {
                alert('Something went wrong, please try again later or check if Vici is running.');
            }

            var successCallBack = function (data) {
                //console.log(data);
                if (data.Result === "Pong") {

                    doTheRedirect();
                }
                else {
                    alert('Something went wrong, check if Vici is running.');
                }
            }

            var params = $.param({ "function": "Ping" });

            invokeViciFunction(params, successCallBack, errorCallingIntegration);

        } catch (e) {
            alert('Something went wrong, check if Vici is running.');
        }
    }

    function viciLogOut() {

        var params = $.param({
            "function": "QuickLogOut",
            Status: status
        });

        var successCallBack = function (data) {
            console.log("Successfully logged out of Vici");
        }

        var errorCallBack = function (jqXHR, exception) {
            console.log(showErrorOnPage("Vici Server Error(QuickLogOut) - Error: " + errorHandling.compileErrorMsg(jqXHR, exception), pageName));
        }

        invokeViciFunction(params, successCallBack, errorCallBack);
    }

    return {
        checkViciStatus: checkViciStatus,
        getViciStatusAndLogIn: getViciStatusAndLogIn,
        logInUser: logInUser,
        resume: resume,
        saveViciCallInfo: saveViciCallInfo,
        wrapUpCall: wrapUpCall,
        loadCustSearchPage: loadCustSearchPage,
        selectCampaign: selectCampaign,
        quickLogOut: quickLogOut,
        hangup: hangup,
        quickDial: quickDial,
        initializePausePage: initializePausePage,
        initializeRelogInAndChangeCampaignModal: initializeRelogInAndChangeCampaignModal,
        initializeWaitingScreen: initializeWaitingScreen,
        initializePreLoginPage: initializePreLoginPage,
        initializeIncallPage: initializeIncallPage,
        savePauseReason: savePauseReason,
        wrapUpCallback: wrapUpCallback,
        redialLead: redialLead,
        loadCallOtherNumberModal: loadCallOtherNumberModal,
        callOtherNumber: callOtherNumber,
        addOtherNumber: addOtherNumber,
        quickTransferAgent: quickTransferAgent,
        quickTransferGroup: quickTransferGroup,
        loadViciOtherAgents: loadViciOtherAgents,
        loadTranfercallModal: loadTranfercallModal,
        startSpinner: startSpinner,
        showPauseScreen: showPauseScreen,
        searchForContract: searchForContract,
        parkCall: parkCall,
        grabCall: grabCall,
        checkViciStatusAndRedirect: checkViciStatusAndRedirect,
        doHangUp: doHangUp,
        viciLogOut: viciLogOut
    };
}();
var errorHandling = (function () {

    var ErrorDivOnPage = {
        Header: "#header-main-alert",
        DefaultLanding: "#default-landing-page-alert",
        ViciLogInModal: "#loginModal-page-alert",
        ViciPauseModal: "#viciPauseModal-page-alert",
        ViciAddNewNumberModal: "#viciAddNewtelModal-page-alert" 
    };

    /********************************************************************************
    *
    * Private functions
    * compile error message 
    ********************************************************************************/
    function compileErrorMsg(jqXHR, exception) {
        if (typeof (jqXHR) !== "undefined") {
            if (jqXHR.status === 0) {
                return 'Not connect.\n Verify Network.';
            } else if (jqXHR.status == 404) {
                return 'Requested page not found. [404]';
            } else if (jqXHR.status == 500) {
                return 'Internal Server Error [500].';
            } else if (exception === 'parsererror') {
                return 'Requested JSON parse failed.';
            } else if (exception === 'timeout') {
                return 'Time out error.';
            } else if (exception === 'abort') {
                return 'Ajax request aborted.';
            } else {
                return 'Uncaught Error.\n' + jqXHR.responseText;
            }
        }
        else
            return "Unable to catch error.";
    }

    function handleError(error) {
        var href = baseURL + 'Error?errNum=' + error.errNum +
            '&controllerName=' + error.controller +
            '&actionName=' + error.action;

        window.location.href = href;
    }

    function handleJqueryAjaxError(e, jqxhr, settings, exception) {
        e.stopPropagation();
        if (jqxhr != null) {
            var obj = JSON.parse(jqxhr.responseText);
            handleError(obj);
        }
    }

    function handleMVCAjaxFormError(response) {
        if (response && response.responseText) {
            var obj = JSON.parse(response.responseText);
            handleError(obj);
        }
    }

    function handleErrorOnPage(divOnPage, error) {
        $(divOnPage).html("<i class='fa fa-exclamation-circle' aria-hidden='true'></i>&nbsp;" + error);
        $(divOnPage).show();
    }

    function hideErrorOnPage(divOnPage) {
        $(divOnPage).hide();
    }

    return {
        handleError: handleError,
        handleJqueryAjaxError: handleJqueryAjaxError,
        handleMVCAjaxFormError: handleMVCAjaxFormError,
        handleErrorOnPage: handleErrorOnPage,
        ErrorDivOnPage: ErrorDivOnPage,
        hideErrorOnPage: hideErrorOnPage,
        compileErrorMsg: compileErrorMsg
    };

}());
