HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall/buyercall/assets/components/contacts/contacts_dashboard.js
var utils = require('../utils');
var moment = require('moment');
var LeadCallView = require('../lead-call');
var LeadSmsView = require('../lead-sms');

const CONTACTS_CSV_URL = `//${appConfig.server_url}/contacts/csv`;
const CONTACTS_DETAILS = `//${appConfig.server_url}/contacts/filteroptions`;

var contacts = {

    tableApi: null,

    fromDate: null,

    ogFromDate: null,

    toDate: null,

    ogToDate: null,

    frPhonenumberObject: null,
    nwPhonenumberObject: null,

    frFormObject: null,
    nwFormObject: null,

    frCallStatusObject: null,
    nwCallStatusObject: null,

    frCallBdcStatusObject: null,
    nwCallBdcStatusObject: null,

    frMarketingSourceObject: null,
    nwMarketingSourceObject: null,

    frMessageObject: null,
    nwMessageObject: null,

    frAssignedAgentObject: null,
    nwAssignedAgentObject: null,

    frApiCheckObject: { id: 0 },
    nwApiCheckObject: null,

    frAdfImportCheckObject: { id: 0 },
    nwAdfImportCheckObject: null,

    frImportCheckObject: { id: 0 },
    nwImportCheckObject: null,

    frFormCheckObject: { id: 0 },
    nwFormCheckObject: null,

    frSmsCheckObject: { id: 0 },
    nwSmsCheckObject: null,

    frPhoneCheckObject: { id: 0 },
    nwPhoneCheckObject: null,

    searchUrl: "",

    gloFiles: null,

    gloErrorFile: null,

    gloRequest: null,

    gloDownloadErrors: null,

    gloRefreshTable: false,

    gloShowAutomotiveItems: false,

    gloShowSuperAutomotiveItems: false,

    gloIsPartnerRole: false,

    gloDateRegEx: /^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/,

    gloPhonenumberRegEx: /^\+?[0-9]{10,12}$/,

    gloEmailRegEx: /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/,

    gloCurrentDate: null,

    editLeadId: -1,

    btnReset: false,

    gloDefaultCampaigns: true,
    gloSelectedCampaign: -1,
    gloCampaignCount: 0,
    gloddModeAdding: false,
    gloddModeEditing: false,

    init: function() {
        var loThat = this;

        if ($('#businessType').val() == 'automotive') {
            loThat.gloShowAutomotiveItems = true;
        }

        if ($('#superUserType').length == 1) {
            const roles = ['partner', 'limitsysadmin']
            if (roles.includes($('#superUserType').val())) {
                loThat.gloIsPartnerRole = true
            }

            if ($('#superBusinessType').val() == 'automotive') {
                loThat.gloShowSuperAutomotiveItems = true;
            }
        }

        var origin = window.location.origin;

        //Define start and end date
        this.ogFromDate = moment().utc().subtract(1, "month");
        this.ogToDate = moment().utc();
        this.fromDate = this.ogFromDate;
        this.toDate = this.ogToDate;

        //Define and format global current date
        loThat.gloCurrentDate = moment().utc();
        //loThat.gloCurrentDate = loThat.gloCurrentDate.format("MMDDYYYY");

        //Load content and events
        loThat.loadTable(loThat.setTableUrl());
        loThat.loadDropDownFilterOptions();
        loThat.loadDatePickers();
        loThat.getContactAgents();
        loThat.setEvents();
        loThat.setTableUrl();
        loThat.loadStyles();

        $('#mySms').modal('hide');

        //Set CSV download link
        $("#btnDownloadExampleCsv").attr("href", origin + "/contacts/import/leads/example")
    },

    getFilter: function(paFilter) {
        var loThat = this,
            evalObject = null;
        if (paFilter === "form_check") {
            evalObject = loThat.frFormCheckObject;
        } else
        if (paFilter === "sms_check") {
            evalObject = loThat.frSmsCheckObject;
        } else
        if (paFilter === "phone_check") {
            evalObject = loThat.frPhoneCheckObject;
        } else
        if (paFilter === "api_check") {
            evalObject = loThat.frApiCheckObject;
        } else
        if (paFilter === "adf_import_check") {
            evalObject = loThat.frAdfImportCheckObject;
        } else
        if (paFilter === "import_check") {
            evalObject = loThat.frImportCheckObject;
        } else
        if (paFilter === "assigned_agent") {
            evalObject = loThat.frAssignedAgentObject;
        } else
        if (paFilter === "form_source") {
            evalObject = loThat.frFormObject;
        } else
        if (paFilter === "call_status") {
            evalObject = loThat.frCallStatusObject;
        } else
        if (paFilter === "call_bdc_status") {
            evalObject = loThat.frCallBdcStatusObject;
        } else
        if (paFilter === "phone_source") {
            evalObject = loThat.frPhonenumberObject;
        } else
        if (paFilter === "message_source") {
            evalObject = loThat.frMessageObject;
        } else
        if (paFilter === "marketing_source") {
            evalObject = loThat.frMarketingSourceObject;
        }

        if (evalObject === null || evalObject === undefined || evalObject.id === undefined) {
            return "null";
        }
        else {
            return evalObject.id;
        }
    },

    getFromDateFilter: function() {
        var loThat = this;

        return loThat.fromDate.utc().format("MMDDYYYY");
    },

    getToDateFilter: function() {
        var loThat = this;

        return loThat.toDate.utc().format("MMDDYYYY");
    },

    loadTable: function(paLeadUrl) {
        spinnerAdded();
        var loThat = this;
        var loImportLeads = $('#leadImports').val();
        var loDom = "<'row'<'col-sm-3 col-md-3 col-lg-2'B><'col-sm-2 col-lg-2'l><'col-xs-12 col-sm-7 col-md-7 col-lg-8 datatables-padding text-right'f>>" +
                 "<'row'<'col-sm-12't>>" +
                 "<'row'<'col-sm-5'i><'col-sm-7'rp>>";
        var loButtons = [];

        if (!loThat.gloShowSuperAutomotiveItems || !loThat.gloIsPartnerRole) {
            loButtons = [{
                text: "Download csv",
                className: "btn-primary btn btn-csv-dl",
                action: function (e, dt, node, config) {
                    var searchOptions = {
                        search: dt.ajax.params().search,
                        aa: loThat.getFilter("assigned_agent"),
                        df: loThat.getFromDateFilter(),
                        dt: loThat.getToDateFilter(),
                        stf: loThat.getFilter("form_check"),
                        sts: loThat.getFilter("sms_check"),
                        sas: loThat.getFilter("api_check"),
                        sais: loThat.getFilter("adf_import_check"),
                        sis: loThat.getFilter("import_check"),
                        stp: loThat.getFilter("phone_check"),
                        fs: loThat.getFilter("form_source"),
                        ps: loThat.getFilter("phone_source"),
                        ms: loThat.getFilter("message_source"),
                        cs: loThat.getFilter("call_status"),
                        cbs: loThat.getFilter("call_bdc_status"),
                        mks: loThat.getFilter("marketing_source")
                    },
                    queryString = $.param(searchOptions),
                    url = `${CONTACTS_CSV_URL}?${queryString}`;
                    window.open(url);
                }
            }];
        } else {
            loButtons = [{
                text: "Restricted",
                className: "btn-primary btn disabled"
            }]
        }

        if (loImportLeads != undefined && loImportLeads != '' && loImportLeads.toLowerCase() == 'true') {
            loDom = "<'row'<'col-sm-5 col-md-5 col-lg-5'B><'col-sm-1 col-lg-1'l><'col-xs-12 col-sm-6 col-md-6 col-lg-6 datatables-padding text-right'f>>" +
                     "<'row'<'col-sm-12't>>" +
                     "<'row'<'col-sm-5'i><'col-sm-7'rp>>";

            loButtons.push({
                    text: "Add Lead",
                    className: "btn-primary btn btn-add-lead",
                    action: function() {
                        $("#addLeadModal").modal();
                    }
             },{
                    text: "Import Leads",
                    className: "btn-primary btn btn-csv-imp",
                    action: function() {
                        $("#importLeadsModal").modal();
                    }
             });
         }

        App.datatables();

        loThat.tableApi = $("#leads-datatable").DataTable({
            fnDrawCallback: function( oSettings ) {
                $(".btn-lead-call").off().on("click", function(e) {
                    var id = this.getAttribute("data-lead-id");
                    new LeadCallView({
                            leadCall: true,
                            callId: id
                         }).render();
                    e.preventDefault();
                });

                $(".btn-lead-sms").off().on("click", function(e) {
                    var leadId = this.getAttribute("data-sms-id");
                    $("#smsModalData").val(leadId);
                    e.preventDefault();
                    $("#mySms").modal();
                });

                $(".btn-new-app").off().on("click", function(e) {
                    var leadId = this.getAttribute("data-new-app-id");
                    $("#newAppData").val(leadId);
                    e.preventDefault();
                    $("#newApplicationModal").modal();
                });

                $(".btn-lead-quick-edit").off().on("click", function(e) {
                    loThat.editLeadId = this.getAttribute("data-edit-id");
                    e.preventDefault();
                    $("#myLeadEditModal").modal();
                });
                spinnerRemoved();
            },
            buttons: loButtons,
            dom: loDom,
            columns: [
                {
                    data: null,
                    render: function (data, type, row, meta) {
                        return loThat.tableApi.page.info().start + meta.row + 1;
                    },
                    searchable: false,
                    orderable: false
                },    // No
                {
                    data: 1,
                     render: function (data, type, row) {
                        if (row[1].length && row[10].length) {
                            return row[1] + ' ' + row[10];
                        } else if (row[1].length && !row[10].length)  {
                            return row[1]
                        } else {
                            return ''
                        }
                    }
                }, // Name
                {
                    data: 2,
                    render: utils.formatNumber
                }, // Phone Number,
                {
                    data: 3
                }, // Email,
                {
                    data: 4,
                    className: "text-center text-capitalize",
                    render: function (source) {
                        var source_types = [],
                            result = "";

                        if (source != undefined && source != null && source != '') {
                            source_types = source.split("-");

                            if (source_types != undefined && source_types != null) {
                                for(var i = 0; i < source_types.length; i++) {
                                     if (source_types.length > 3 && (i == 0 || i == 3)) {
                                       if (i != 3) {
                                            result += '<div>';
                                        } else {
                                            result += '<div style="padding-top:8px;">';
                                        }
                                    }

                                    if (source_types[i] == "api") {
                                        result += '<span class="label label-danger source-padding" title="API source">'+ source_types[i] +'</span>';
                                    } else
                                    if (source_types[i] == "adf") {
                                        result += '<span class="label label-adf source-padding" title="ADF source">'+ source_types[i] +'</span>';
                                    } else
                                    if (source_types[i] == "import") {
                                        result += '<span class="label label-info source-padding" title="Import source">'+ source_types[i] +'</span>';
                                    } else
                                    if (source_types[i] == "sms") {
                                        result += '<span class="label label-warning source-padding" title="SMS source">'+ source_types[i] +'</span>';
                                    } else
                                    if (source_types[i] == "phone") {
                                        result += '<span class="label label-primary source-padding" title="Phone source">'+ source_types[i] +'</span>';
                                    } else
                                    if (source_types[i] == "form") {
                                        result += '<span class="label label-success source-padding" title="Form source">'+ source_types[i] +'</span>';
                                    }
                                    if (source_types[i] == "mobile") {
                                        result += '<span class="label label-rose source-padding" title="Mobile source">'+ source_types[i] +'</span>';
                                    }
                                    if (source_types[i] == "credit") {
                                        result += '<span class="label label-credit source-padding" title="Credit source">'+ source_types[i] +'</span>';
                                    }

                                    if (source_types.length > 3 && (i == 2 || i == (source_types.length - 1))) {
                                        result += '</div>';
                                    }
                                }
                            }
                        }

                        return result;
                    }
                }, // Source Type
                {
                    data: 5,
                    searchable: false,
                    render: function (date) {

                        //return `<time datetime='${date}'>${moment(new Date(date)).fromNow()}</time>`;
                        return `<time datetime='${date}'>${moment(new Date(date)).tz("America/New_York").format('lll')}</time>`;
                    }
                },    // Created Date
                {
                    data: 6,
                    searchable: false,
                    render: function (date) {

                        return `<time datetime='${date}'>${moment(new Date(date)).tz("America/New_York").format('lll')}</time>`;
                    }
                },    // Updated Date
                {
                    data: 7,
                    className: "text-center text-capitalize"
                },   // Status
                {
                    data: 8/*
                    searchable: true,
                    orderable: true,*/
                    /*render: function (data, type, row, meta) {
                        return `<a href="/agents/edit/${row[11]}">${row[10]}</a>`;
                    }*/
                },  // Agents
                {
                    visible: loThat.gloShowAutomotiveItems,
                    data: 9,
                    render: function (data, type, row, meta) {
                        return `<a href="/contacts/edit/${row[0]}#credit">${row[9]}</a>`;
                    }
                }, // Credit Score
                {
                    data: "0",
                    searchable: false,
                    orderable: false,
                    className: "text-center",
                    render: function (id, type, row) {
                        var loCreditScoreItem = '';
                        var loNewApplicationItem = '';

                        if (loThat.gloShowAutomotiveItems == true) {
                            loCreditScoreItem = '<li><a href="/contacts/edit/' + id + '#credit"> Credit Score <span class="label label-small label-success source-padding">NEW</span></a></li>';
                            loNewApplicationItem = '<li><a href="" class="btn-new-app" data-new-app-id="' + id +'"> New Application</a></li>';
                        }

                        if (loThat.gloIsPartnerRole && loThat.gloShowSuperAutomotiveItems) {
                            return '<a href="#" class="btn btn-secondary" aria-expanded="true" disabled> Restricted </a>';
                        } else {
                            return '<div class="dropdown">' +
                                '<a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="true" > Actions ' +
                                    '<b class="caret"></b>' +
                                '</a>' +
                                '<ul class="contact-action-menu dropdown-menu">' +
                                    '<li><a class="btn-lead-quick-edit btn-table-action" data-edit-id="' + id +'"> Quick Edit</a></li>' +
                                    '<li><a href="/contacts/edit/' + id +'"> Advance Edit</a></li>'  +
                                    '<li><a href="/contacts/pdf/' + id +'" target="_blank"> Download PDF</a></li>' +
                                    loCreditScoreItem +
                                    // '<li class="divider"></li>' +
                                    '<li><a href="" class="btn-lead-call" data-lead-id="' + id +'" data-toggle="modal" data-target="#myModal"> Call</a></li>' +
                                    '<li><a href="" class="btn-lead-sms" data-sms-id="' + id +'">SMS</a></li>' +
                                    loNewApplicationItem +
                                '</ul>' +
                            '</div>';
                        }
                    }
                }
            ],
            initComplete: function( settings, json ) {
                var input = $('.dataTables_filter input').unbind(),
                    self = this.api(),
                    $searchButton = $('<a>')
                               .text('search')
                               .click(function() {
                                  self.search(input.val()).draw();
                                  spinnerAdded();
                               }),
                    $clearButton = $('<a>')
                               .text('clear')
                               .click(function() {
                                  input.val('');
                                  $searchButton.click();
                               })
                    $(document).keypress(function (event) {
                        if (event.which == 13) {
                            $searchButton.click();
                        }
                    });
                if (!$(".tbl-search-btn").length) {
                    $('.dataTables_filter').append($searchButton, $clearButton);
                    $("#leads-datatable_filter a").addClass("btn btn-primary btn-default tbl-search-btn");
                    $("#leads-datatable_filter span i").remove();
                }
                if (loThat.objectEmpty(json.data)) {
                    $(".feedback-section").hide();
                    $("#leadLineChart").html("");
                } else {
                    $(".feedback-section").show();
                }
            },
            order: [[ 5, "desc" ]],
            language: {
                "lengthMenu": 'Display <select class="form-control dataTables-records-length-select">'+
                '<option value="30"> 30</option>'+
                '<option value="40"> 40</option>'+
                '<option value="50"> 50</option>'+
                '<option value="100"> 100</option>'+
                '</select> records'
            },
            pageLength: 50,
            processing: false,
            serverSide: true,
            ajax: paLeadUrl
        });



        loThat.loadStyles();
        loThat.tableApi.on("xhr", function(e, settings, json) {
            if (json !== undefined && json !== null) {
                loThat.loadSideBarTexts(
                    json.totalLeads,
                    json.totalPhone,
                    json.totalUniquePhone,
                    json.totalMessages,
                    json.totalUniqueMessages,
                    json.totalFormLeads,
                    json.totalUniqueFormLeads
                );

                loThat.refreshGraph(json.graphLeadPoints, json.graphFormPoints, json.graphPhonePoints, json.graphMessagePoints, json.graphLabels);
            }
        });
        if (! $.fn.DataTable.isDataTable( "#leads-datatable" )) {
            spinnerRemoved();
        };
    },

    loadDropDownFilterOptions: function() {
        var loThat = this;

        $.ajax({
           url: `${CONTACTS_DETAILS}`,
           type: "GET",
           dataType: "json",
           success: function(response) {
                loThat.populateDropDowns("cbAssignedAgent", response.assigned_agent_data, "assigned_agent");
                loThat.populateDropDowns("cbMarketingSource", response.marketing_data, "marketing_data");
                loThat.populateDropDowns("cbFormLeadSource", response.form_source_data, "form_source");
                loThat.populateDropDowns("cbSmsLeadSource", response.message_source_data, "message_source");
                loThat.populateDropDowns("cbPhoneLeadSource", response.phone_source_data, "phone_source");
                loThat.populateDropDowns("cbStatus", response.status_data, "call_status");
                loThat.populateDropDowns("cbBdcStatus", response.bdc_status_data, "call_bdc_status");
           }
        });
    },

    loadDatePickers: function() {
        var loThat = this;

        $("#date-from").datetimepicker({
            format: "MM/DD/YYYY",
            icons: {
                time: "fa fa-clock-o",
                date: "fa fa-calendar",
                up: "fa fa-chevron-up",
                down: "fa fa-chevron-down",
                previous: "fa fa-chevron-left",
                next: "fa fa-chevron-right",
                today: "fa fa-screenshot",
                clear: "fa fa-trash",
                close: "fa fa-remove",
                inline: true
            },
            defaultDate: loThat.fromDate
         });

        $("#date-to").datetimepicker({
            format: "MM/DD/YYYY",
            icons: {
                time: "fa fa-clock-o",
                date: "fa fa-calendar",
                up: "fa fa-chevron-up",
                down: "fa fa-chevron-down",
                previous: "fa fa-chevron-left",
                next: "fa fa-chevron-right",
                today: "fa fa-screenshot",
                clear: "fa fa-trash",
                close: "fa fa-remove",
                inline: true
            },
            defaultDate: loThat.toDate
         });

         $("#addBirthday").datetimepicker({
            format: "MM/DD/YYYY",
            icons: {
                time: "fa fa-clock-o",
                date: "fa fa-calendar",
                up: "fa fa-chevron-up",
                down: "fa fa-chevron-down",
                previous: "fa fa-chevron-left",
                next: "fa fa-chevron-right",
                today: "fa fa-screenshot",
                clear: "fa fa-trash",
                close: "fa fa-remove",
                inline: true
            },
            keepInvalid: true
         });
    },

    showAlert: function(message, alert, addLink) {
        var loThat = this;

        if (addLink) {
            $("#alertImportWrapper").html('<div id="alert" class="alert alert-' + alert + '" role="alert" style="margin-bottom:0px !important;"><span>' + message + '&nbsp;<a id="btnDownloadCsv">Download Errors</a></span></div>');

            $("#btnDownloadCsv").off().on("click", function() {
                if (loThat.gloDownloadErrors != null && loThat.gloDownloadErrors != undefined && loThat.gloDownloadErrors != "") {
                    var link = document.createElement("a");
                    var d = new Date();
                    var year = d.getFullYear();
                    var month = d.getMonth() + 1;
                    var day = d.getDate();
                    var exportedFilename = "";

                    if (month < 10) {
                        month = "0" + month;
                    }

                    exportedFilename = 'Buyercall Leads - Import Errors - '+ year + '-' + month + '-'+ day +'.csv';

                    if (link.download !== undefined) { // feature detection
                        link.setAttribute("id", "hiddenDownloadLink");
                        link.setAttribute("download", exportedFilename);
                        link.style.visibility = 'hidden';
                        link.href = 'data:text/csv;charset=utf-8,' + encodeURI(loThat.gloDownloadErrors);
                        link.target = '_blank';
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                    }
                }
            });

        } else {
            $("#alertImportWrapper").html('<div id="alert" class="alert alert-' + alert + '" role="alert" style="margin-bottom:0px !important;"><span>' + message + '</span></div>');
        }
    },

    reset: function() {
        var loThat = this;
        var fileInputLabel = $("#fileInputLabel");
        var fileInput = $("#fileInput");
        var uploadBtn = $("#uploadBtn");
        var cancelBtn = $("#cancelBtn");
        var downloadTemplate = $("#btnDownloadExampleCsv");
        var progressWrapper = $("#progressWrapper");
        var inputImportSection = $("#inputImportSection");

        loThat.gloFiles = null;

        // Show the input box
        inputImportSection.show();

        // Clear the input
        fileInput.val('');

        // Hide the cancel button
        cancelBtn.hide();
        downloadTemplate.show();

        // Reset the input element
        fileInput.removeAttr('disabled');

        // Show the upload button
        uploadBtn.show();

        // Hide the progress bar
        progressWrapper.hide();

        // Reset the input placeholder
        fileInputLabel.text("Select a file...");
    },

    setEvents: function() {
        var loThat = this;
        var loCurrentDate = moment().utc();

        $("#fileInput").on("input", function(ev) {
            var fileInputLabel = $("#fileInputLabel");

            loThat.gloFiles = this.files;
            fileInputLabel.text(loThat.gloFiles[0].name);

            $("#alertImportWrapper").html('');
            loThat.gloDownloadErrors = null;
        });

        $("#addLeadModal").on('hide.bs.modal', function(){
            $("#addFirstName, #addLastName, #addEmail, #addPhonenumber, #addNote, #addAddress1, #addAddress2, #addCity, #addState, #addZip, #addCountry, #addBirthday").val("");
            $('#addStatus option:first-child').attr("selected", "selected");
            $('#addMarketingSource option:first-child').attr("selected", "selected");
            $('#addAgent option:first-child').attr("selected", "selected");
            $("#chkAddDoNotCallPhone, #chkAddIsUnsubscribed").removeAttr('checked');
            $('#addLeadModal .field-error').remove();
            $('#add-contact-warning').hide();

            $('#addLeadModal .form-group').removeClass('has-error');
        });

        $('#btnAddSave').on('click', function() {
            loThat.addContactDetails();
        });

        $('#btnAddNewAppCreate').on('click', function() {
            var formId = $("#contactForm").val();

            if (formId != "Select form...") {
                var contactId = $("#newAppData").val();
                window.location.replace("/form_leads/add/" + contactId + "/" + formId);
            }
        });

        $("#importLeadsModal").on('hide.bs.modal', function(){
            loThat.reset();
            $("#alertImportWrapper").html('');
            $("#btnDownloadCsv").hide();

            if (loThat.gloRefreshTable) {
                loThat.reloadTable();
                loThat.gloRefreshTable = false;
            }
        });

        $("#uploadBtn").on("click", function(ev) {
            var fileInputLabel = $("#fileInputLabel");
            var origin   = window.location.origin;
            var loUrl = origin + "/contacts/import/leads";
            var filename = "";

            loThat.gloDownloadErrors = null;

            if (loThat.gloFiles != undefined && loThat.gloFiles.length > 0) {
                filename = loThat.gloFiles[0].name;
            }

            if (filename != undefined && filename != "" && filename != "Select file...") {
                var data = new FormData();
                var uploadBtn = $("#uploadBtn");
                var cancelBtn = $("#cancelBtn");
                var progressWrapper = $("#progressWrapper");
                var fileInput = $("#fileInput");
                var inputImportSection = $("#inputImportSection");
                var downloadTemplate = $("#btnDownloadExampleCsv");

                loThat.gloRequest = new XMLHttpRequest();
                loThat.gloRequest.responseType = "json";

                $("alertImportWrapper").html("");

                // Disable the input during upload
                fileInput.attr('disabled', 'disabled');

                // Hide the input box
                inputImportSection.hide();

                // Hide the upload button
                uploadBtn.hide();

                // Show the cancel button
                cancelBtn.show();
                downloadTemplate.hide();

                // Show the progress bar
                progressWrapper.show();

                // Get a reference to the file
                var file = loThat.gloFiles[0];

                // Get a reference to the filename
                var filename = file.name;

                // Get a reference to the filesize & set a cookie
                var filesize = file.size;
                document.cookie = 'filesize=' + filesize;

                // Append the file to the FormData instance
                data.append("file", file);

                // request load handler (transfer complete)
                loThat.gloRequest.addEventListener("load", function (e) {
                    var serviceResponse = loThat.gloRequest.response;

                    if (loThat.gloRequest.status == 200) {
                        var showErrorLink = false;

                        if (serviceResponse.csv_download != undefined && serviceResponse.csv_download == true && serviceResponse.csv_error_list != "") {
                            loThat.gloDownloadErrors = serviceResponse.csv_error_list;
                            showErrorLink = true;
                        } else {
                            loThat.gloDownloadErrors = null;
                        }

                        if (serviceResponse.success == true) {
                            loThat.showAlert(serviceResponse.message, "success", showErrorLink);
                        } else {
                            loThat.showAlert(serviceResponse.message, "warning", showErrorLink);
                        }

                        loThat.gloRefreshTable = true;
                    } else {
                        if (serviceResponse.message.length > 0) {
                            loThat.showAlert(serviceResponse.message, "danger", false);
                        } else {
                            loThat.showAlert('Error uploading file.', "danger", false);
                            fileInput.removeAttr('disabled');
                        }
                    }
                    loThat.reset();
                });

                // request error handler
                loThat.gloRequest.addEventListener("error", function (e) {
                    loThat.reset();
                    loThat.showAlert('Error uploading file.', "warning");
                });

                // request abort handler
                loThat.gloRequest.addEventListener("abort", function (e) {
                    loThat.reset();
                    loThat.showAlert('Upload cancelled.', "warning");
                });

                // Open and send the request
                loThat.gloRequest.open("post", loUrl);
                loThat.gloRequest.send(data);
            } else {
                loThat.showAlert("Error uploading file, no file selected.", "warning");
            }
        });

        $("#cancelBtn").on('click', function(ev) {
            loThat.gloRequest.abort();
        });

        $("#date-from").on("dp.change", function(ev) {
            if (ev.date !== null && ev.date !== undefined) {
                loThat.fromDate = ev.date;
                if (loThat.btnReset === false) {
                    loThat.tableApi.destroy();
                    loThat.loadTable(loThat.setTableUrl());
                }
            }
        });

        $("#date-to").on("dp.change", function(ev) {
            if (ev.date !== null && ev.date !== undefined) {
                loThat.toDate = ev.date;
                if (loThat.btnReset === false) {
                    loThat.tableApi.destroy();
                    loThat.loadTable(loThat.setTableUrl());
                }
            }
        });

        $(".btn-short-today").on("click", function(ev) {
            loThat.btnReset = false
            $("#date-from").data("DateTimePicker").date(loCurrentDate);
            $("#date-to").data("DateTimePicker").date(loCurrentDate);
            loThat.btnReset = true
        });

        $(".btn-short-week").on("click", function(ev) {
            loThat.btnReset = false
            $("#date-from").data("DateTimePicker").date(moment().subtract(7,"d"));
            $("#date-to").data("DateTimePicker").date(loCurrentDate);
            loThat.btnReset = true
        });

        $(".btn-short-month").on("click", function(ev) {
            loThat.btnReset = false
            $("#date-from").data("DateTimePicker").date(loThat.getFirstDayOfMonth());
            $("#date-to").data("DateTimePicker").date(loThat.getLastDayOfMonth());
            loThat.btnReset = true
        });

        $(".btn-short-year").on("click", function(ev) {
            loThat.btnReset = false
            $("#date-from").data("DateTimePicker").date(loThat.getFirstDayOfYear());
            $("#date-to").data("DateTimePicker").date(loThat.getLastDayOfYear());
            loThat.btnReset = true
        });

        $(".btn-additional-filters").on("click", function(ev) {
            $("#myLeadFilterModal").modal("show");

        });

        $("#chkApi").change(function() {
            if (this.checked) {
                loThat.nwApiCheckObject = {
                    id: 1
                };
                loThat.nwAdfImportCheckObject = {
                    id: 0
                };
                loThat.nwImportCheckObject = {
                    id: 0
                };
                $("#chkImport, #chkAdfImport").prop("checked", false);
            } else {
                loThat.nwApiCheckObject = {
                    id: 0
                };
            }
        });

        $("#chkAdfImport").change(function() {
            if (this.checked) {
                loThat.nwAdfImportCheckObject = {
                    id: 1
                };
                loThat.nwApiCheckObject = {
                    id: 0
                };
                loThat.nwImportCheckObject = {
                    id: 0
                };
                $("#chkApi, #chkImport").prop("checked", false);
            } else {
                loThat.nwAdfImportCheckObject = {
                    id: 0
                };
            }
        });

        $("#chkImport").change(function() {
            if (this.checked) {
                loThat.nwImportCheckObject = {
                    id: 1
                };
                loThat.nwApiCheckObject = {
                    id: 0
                };
                loThat.nwAdfImportCheckObject = {
                    id: 0
                };
                $("#chkAdfImport, #chkApi").prop("checked", false);
            } else {
                loThat.nwImportCheckObject = {
                    id: 0
                };
            }
        });

        $("#chkPhone").change(function() {
            if (this.checked) {
                loThat.nwPhoneCheckObject = {
                    id: 1
                };
            } else {
                loThat.nwPhoneCheckObject = {
                    id: 0
                };
            }
        });

        $("#chkForm").change(function() {
            if (this.checked) {
                loThat.nwFormCheckObject = {
                    id: 1
                };
            } else {
                loThat.nwFormCheckObject = {
                    id: 0
                };
            }
        });

        $("#chkSms").change(function() {
            if (this.checked) {
                loThat.nwSmsCheckObject = {
                    id: 1
                };
            } else {
                loThat.nwSmsCheckObject = {
                    id: 0
                };
            }
        });

        $("#btnApply").on("click", function(ev) {

            if (loThat.nwPhonenumberObject !== null) {
                loThat.frPhonenumberObject = loThat.nwPhonenumberObject;
            }

            if (loThat.nwFormObject !== null) {
                loThat.frFormObject = loThat.nwFormObject;
            }

            if (loThat.nwMessageObject !== null) {
                loThat.frMessageObject = loThat.nwMessageObject;
            }

            if (loThat.nwCallStatusObject !== null) {
                loThat.frCallStatusObject = loThat.nwCallStatusObject;
            }

            if (loThat.nwCallBdcStatusObject !== null) {
                loThat.frCallBdcStatusObject = loThat.nwCallBdcStatusObject;
            }

            if (loThat.nwMarketingSourceObject !== null) {
                loThat.frMarketingSourceObject = loThat.nwMarketingSourceObject;
            }

            if (loThat.nwAssignedAgentObject !== null) {
                loThat.frAssignedAgentObject = loThat.nwAssignedAgentObject;
            }

            if (loThat.nwSmsCheckObject !== null) {
                loThat.frSmsCheckObject = loThat.nwSmsCheckObject;
            }

            if (loThat.nwSmsCheckObject !== null) {
                loThat.frSmsCheckObject = loThat.nwSmsCheckObject;
            }

            if (loThat.nwPhoneCheckObject !== null) {
                loThat.frPhoneCheckObject = loThat.nwPhoneCheckObject;
            }

            if (loThat.nwFormCheckObject !== null) {
                loThat.frFormCheckObject = loThat.nwFormCheckObject;
            }

            if (loThat.nwApiCheckObject !== null) {
                loThat.frApiCheckObject = loThat.nwApiCheckObject;
            }

            if (loThat.nwAdfImportCheckObject !== null) {
                loThat.frAdfImportCheckObject = loThat.nwAdfImportCheckObject;
            }

            if (loThat.nwImportCheckObject !== null) {
                loThat.frImportCheckObject = loThat.nwImportCheckObject;
            }

            $("#myLeadFilterModal").modal("hide");

            //Apply new filters
            loThat.reloadTable();
        });

        $("#btnCancel").on("click", function(ev) {
            if (loThat.nwAssignedAgentObject !== undefined && loThat.nwAssignedAgentObject !== null) {
                if (loThat.frAssignedAgentObject !== undefined && loThat.frAssignedAgentObject !== null) {
                    $("#cbAssignedAgent").val(loThat.frAssignedAgentObject.name);
                } else {
                    $("#cbAssignedAgent").val("---");
                }
            }

            if (loThat.nwPhonenumberObject !== undefined && loThat.nwPhonenumberObject !== null) {
                if (loThat.frPhonenumberObject !== undefined && loThat.frPhonenumberObject !== null) {
                    $("#cbPhoneLeadSource").val(loThat.frPhonenumberObject.name);
                } else {
                    $("#cbPhoneLeadSource").val("---");
                }
            }

            if (loThat.nwMessageObject !== undefined && loThat.nwMessageObject !== null) {
                if (loThat.frMessageObject !== undefined && loThat.frMessageObject !== null) {
                    $("#cbSmsLeadSource").val(loThat.frMessageObject.name);
                } else {
                    $("#cbSmsLeadSource").val("---");
                }
            }

            if (loThat.nwFormObject !== undefined && loThat.nwFormObject !== null) {
                if (loThat.frFormObject !== undefined && loThat.frFormObject !== null) {
                    $("#cbFormLeadSource").val(loThat.frFormObject.name);
                } else {
                    $("#cbFormLeadSource").val("---");
                }
            }

            if (loThat.nwCallStatusObject !== undefined && loThat.nwCallStatusObject !== null) {
                if (loThat.frCallStatusObject !== undefined && loThat.frCallStatusObject !== null) {
                    $("#cbStatus").val(loThat.frCallStatusObject.name);
                } else {
                    $("#cbStatus").val("---");
                }
            }

            if (loThat.nwCallBdcStatusObject !== undefined && loThat.nwCallBdcStatusObject !== null) {
                if (loThat.frCallBdcStatusObject !== undefined && loThat.frCallBdcStatusObject !== null) {
                    $("#cbBdcStatus").val(loThat.frCallBdcStatusObject.name);
                } else {
                    $("#cbBdcStatus").val("---");
                }
            }

            if (loThat.nwMarketingSourceObject !== undefined && loThat.nwMarketingSourceObject !== null) {
                if (loThat.frMarketingSourceObject !== undefined && loThat.frMarketingSourceObject !== null) {
                    $("#cbMarketingSource").val(loThat.frMarketingSourceObject.name);
                } else {
                    $("#cbMarketingSource").val("---");
                }
            }

            loThat.nwAssignedAgentObject = null;
            loThat.nwPhonenumberObject = null;
            loThat.nwMessageObject = null;
            loThat.nwFormObject = null;
            loThat.nwCallStatusObject = null;
            loThat.nwCallBdcStatusObject = null;
            loThat.nwMarketingSourceObject = null;
            loThat.nwApiCheckObject = { id: 0 };
            loThat.nwAdfImportCheckObject = { id: 0 };
            loThat.nwImportCheckObject = { id: 0 };
            loThat.nwSmsCheckObject =  { id: 0 };
            loThat.nwFormCheckObject = { id: 0 };
            loThat.nwPhoneCheckObject = { id: 0 };
        });

        $("#btnResetFilters").on("click", function(ev) {
            loThat.btnReset = true;
            // Reset date filters
            $("#date-from").data("DateTimePicker").date(loThat.ogFromDate);
            $("#date-to").data("DateTimePicker").date(loThat.ogToDate);
            $("#chkPhone, #chkForm, #chkSms, #chkApi, #chkAdfImport, #chkImport").prop("checked", false);

            loThat.frAssignedAgentObject = null;
            loThat.nwAssignedAgentObject = null;

            loThat.frApiCheckObject = { id: 0 };
            loThat.nwApiCheckObject = null;

            loThat.frAdfImportCheckObject = { id: 0 };
            loThat.nwAdfImportCheckObject = null;

            loThat.frImportCheckObject = { id: 0 };
            loThat.nwImportCheckObject = null;

            loThat.frFormCheckObject = { id: 0 };
            loThat.nwFormCheckObject = null;

            loThat.frSmsCheckObject = { id: 0 };
            loThat.nwSmsCheckObject = null;

            loThat.frPhoneCheckObject = { id: 0 };
            loThat.nwPhoneCheckObject = null;

            loThat.frPhonenumberObject = null;
            loThat.nwPhonenumberObject = null;

            loThat.frMessageObject = null;
            loThat.nwMessageObject = null;

            loThat.frFormObject = null;
            loThat.nwFormObject = null;

            loThat.frCallStatusObject = null;
            loThat.nwCallStatusObject = null;

            loThat.frCallBdcStatusObject = null;
            loThat.nwCallBdcStatusObject = null;

            loThat.frMarketingSourceObject = null;
            loThat.nwMarketingSourceObject = null;

            $("#cbPhoneLeadSource, #cbFormLeadSource, #cbSmsLeadSource, #cbStatus, #cbBdcStatus, #cbAssignedAgent, #cbMarketingSource").val("---");

            loThat.reloadTable();
        });

        $("#date-from").on("click", function(ev) {
            if (loThat.btnReset === true) {
                loThat.btnReset = false;
            }
        });

        $("#date-to").on("click", function(ev) {
            if (loThat.btnReset === true) {
                loThat.btnReset = false;
            }
        });

        $("#myLeadEditModal").on("shown.bs.modal", function(ev) {
            loThat.getLeadDetails(loThat.editLeadId);
        });

        $("#btnEditApply").on("click", function(ev) {
            loThat.setLeadDetails(loThat.editLeadId);
        });

        $('.campaign_dd_add').off().on('click', function() {
            loThat.gloddModeAdding = true;
            $(this).hide();
            $('#campaign_dd_input').val('').focus();
            $('.campaign_dd_text, .campaign_dd_ok, .campaign_dd_cancel').show();
            $('.campaign_dd, .campaign_dd_edit').hide();
        });

        $('.campaign_dd_edit').off().on('click', function() {
            var campaign_dd = $('#campaign :selected');
            var campaign_id = campaign_dd.val();
            var campaign_text = campaign_dd.text();

            loThat.gloddModeEditing = true;
            $(this).hide();
            $('.campaign_dd_text, .campaign_dd_ok, .campaign_dd_cancel').show();
            $('.campaign_dd, .campaign_dd_add').hide();

            $('#campaign_dd_input').val(campaign_text).focus();
        });

        $('.campaign_dd_ok').off().on('click', function() {
            var textField = $("#campaign_dd_input").val();

            if (textField) {
                $('.campaign_dd, .campaign_dd_add').show();
                $('.campaign_dd_text, .campaign_dd_ok, .campaign_dd_cancel').hide();

                if (loThat.gloddModeAdding) {
                    loThat.setCampaign(-1, textField, 'add');
                    loThat.getCampaigns();
                } else
                if (loThat.gloddModeEditing) {
                    var campaign_dd = $('#campaign :selected');
                    var campaign_id = campaign_dd.val();
                    loThat.setCampaign(campaign_id, textField, 'edit');
                    loThat.getCampaigns();
                }
                loThat.gloddModeAdding = false;
                loThat.gloddModeEditing = false;
                loThat.getCampaigns();
            }
        });

        $('.campaign_dd_cancel').off().on('click', function() {
            var selectedCampaign = $('#campaign').val();

            $('.campaign_dd, .campaign_dd_add').show();
            $('.campaign_dd_text, .campaign_dd_ok, .campaign_dd_cancel').hide();
            $("#campaign_dd_input").val('');

            if (selectedCampaign && selectedCampaign > 0) {
                $('.campaign_dd_edit').show();
            }
            $('#campaign_dd_input').val('');
            loThat.gloddModeAdding = false;
            loThat.gloddModeEditing = false;
        });
    },

    getCampaigns: function() {
        var loThat = this;
        var campaignDetailsUrl = '/contacts/campaigns';

        $.ajax({
            url: campaignDetailsUrl,
            type: 'GET',
            success: function(data) {
                loThat.gloDefaultCampaigns = data.default_campaign;
                loThat.buildCampaignDropDown(data.campaigns);
            }
        });
    },

    setCampaign: function(paId, paText, type) {
        var loThat = this;
        var campaignOptions = {
            id: paId,
            text: paText
        };
        var queryString = $.param(campaignOptions);
        var campaignDetailsUrl = '/contacts/campaigns?'+queryString;

        $.ajax({
            url: campaignDetailsUrl,
            type: 'POST',
            success: function(data) {
                if (data.result == true) {
                    if (type == 'add') {
                        loThat.createFlashMsg($('#divLeadForm'), 'Campaign successfully added.', 'success', 'leadedit');
                    } else {
                        loThat.createFlashMsg($('#divLeadForm'), 'Campaign successfully updated.', 'success', 'leadedit');
                    }
                } else {
                    if (type == 'add') {
                        loThat.createFlashMsg($('#divLeadForm'), 'Error adding campaign.', 'danger', 'leadedit');
                    } else {
                        loThat.createFlashMsg($('#divLeadForm'), 'Error updating campaign.', 'danger', 'leadedit');
                    }
                }
            },
            error: function(data) {
                if (type == 'add') {
                    loThat.createFlashMsg($('#divLeadForm'), 'Error adding campaign.', 'danger', 'leadedit');
                } else {
                    loThat.createFlashMsg($('#divLeadForm'), 'Error updating campaign.', 'danger', 'leadedit');
                }
            }
        });
    },

    buildCampaignDropDown: function(campaigns) {
        var loThat = this;
        var campaign_dd = $('.campaign_dd');
        var campaignString = "<label for='campaign' class='control-label'>Campaign</label>";

        loThat.gloCampaignCount = 0
        campaignString += "<select id='campaign' name='campaign' class='form-control'>";
        campaignString += "<option value=''></option>";
        if (campaigns) {
            var selected = "";

            for ( i in campaigns) {
                loThat.gloCampaignCount++;
                if (i == loThat.gloSelectedCampaign) {
                    selected = "selected";
                } else {
                    selected = "";
                }
                campaignString += "<option value='" + i + "' " + selected + ">" + campaigns[i]  + "</option>";
            }
        }
        campaignString += "</select>";
        campaign_dd.html(campaignString);

        if (loThat.gloSelectedCampaign == undefined || loThat.gloSelectedCampaign == null) {
            $('.campaign_dd').addClass('is-empty');
        }

        $('#campaign').off().on('change', function() {
            var value = $('#campaign').val();

            if (value == undefined || value == null || value == "") {
                value = -1;
            }

            if(!loThat.gloDefaultCampaigns) {
                if (value < 0) {
                    $('.campaign_dd_edit').hide();
                } else {
                    $('.campaign_dd_edit').show();
                }
            }
            loThat.gloSelectedCampaign = value;
            $('#campaign_id').val(value);

            if (loThat.gloSelectedCampaign == undefined || loThat.gloSelectedCampaign == null) {
                $('.campaign_dd').addClass('is-empty');
            }
        });
    },

    loadStyles: function() {
         $("#leads-datatable_filter label").addClass("form-group");
         $("#leads-datatable_length label").addClass("form-group");
         $(".dataTables_filter input").attr("placeholder", "Search Records");
    },

    loadSideBarTexts: function(paTotalLeads, paTotalPhone, paUniquePhone, paTotalMessages, paUniqueMessages, paTotalForm, paUniqueForm) {
        $(".unique-leads").html(paTotalLeads + "<graph> from all sources</graph>");
        $(".unique-calls").html(paUniquePhone + "<graph> "+ paTotalPhone +" total calls </graph>");
        $(".unique-messages").html(paUniqueMessages + "<graph> "+ paTotalMessages +" total messages </graph>");
        $(".unique-form-leads").html(paUniqueForm + "<graph> " + paTotalForm + " total form leads </graph>");
    },

    refreshGraph: function(paLead, paForm, paPhone, paMessage, paLabel) {
        var loWidth = window.innerWidth,
            loGraphHeight =  400,
            loRightBuffer = 40,
            loChartOffset = 60,
            loLabelOffset = 2,
            loXOffset = -10,
            loYOffset = 10,
            loFullWidth = false;

        if (loWidth < 640) {
            loRightBuffer = 5;
            loChartOffset = 12;
            loLabelOffset = 6;
            loXOffset = 0;
            loYOffset = 0;
            $(".graph-section").css("padding-left", 0).css("padding-right", 0);
            $(".graph-chart-content").css("padding-left", 0).css("padding-right", 0);
        }

        if (paLabel.length > 1) {
            loFullWidth = true;
        }

        var loChart = new Chartist.Line("#leadLineChart", {
            // Our labels and three data series
            labels:  paLabel,
            series: [
                paLead,
                paPhone,
                paMessage,
                paForm
            ]}, {
                fullWidth: loFullWidth,
                chartPadding: {
                    right: loRightBuffer
                },
                // We are setting a few options for our chart and override the defaults
                // Set hight of the chart
                height: loGraphHeight,
                // Don't draw the line chart points
                showPoint: true,
                // Disable line smoothing
                lineSmooth: false,
                // X-Axis specific configuration
                axisX: {
                    labelOffset: {
                      x: loXOffset,
                      y: loYOffset
                    },
                    // We can disable the grid for this axis
                    showGrid: true,
                    // and also don't show the label
                    showLabel: true,
                    labelInterpolationFnc: function skipLabels(value, index, labels) {
                      if (labels.length > 15) {
                        return index % loLabelOffset  === 0 ? value : null;
                      } else {
                        return value;
                      }
                    }
                },
                // Y-Axis specific configuration
                axisY: {
                    // Lets offset the chart a bit from the labels
                    low: 0,
                    offset: loChartOffset,
                    // The label interpolation function enables you to modify the values
                    // used for the labels on each axis. Here we are converting the
                    // values into million pound.
                    labelInterpolationFnc: function(value) {
                      return value;
                    },
                    onlyInteger: true
                }
            });
    },

    reloadTable: function() {
        var loThat = this;

        loThat.tableApi.destroy();
        loThat.loadTable(loThat.setTableUrl());
    },

    populateDropDowns: function(paControl, paDict, paShortName) {
        var loThat = this;
        var loHtml = "";

        loHtml = loHtml + '<option id="' + -1 +'" class="'+paShortName+' ">---</option>';

        for (var lpItem in paDict) {
            if (paDict.hasOwnProperty(lpItem)) {
                loHtml = loHtml + '<option class="'+paShortName+'" id="'+ lpItem +'">'+ paDict[lpItem] +'</option>';
            }
        }

        if (paShortName === "assigned_agent") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwAssignedAgentObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "phone_source") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwPhonenumberObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "message_source") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwMessageObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "form_source") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwFormObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "call_status") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwCallStatusObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "call_bdc_status") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwCallBdcStatusObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }

        if (paShortName === "marketing_data") {
            $("#" + paControl).html(loHtml).on("change", function(ev) {
                var loItem = $(this).children(":selected");

                loThat.nwMarketingSourceObject = {
                    id: (loItem.attr("id") == -1) ? null : loItem.attr("id"),
                    name: loItem.val()
                };
            });
        }
    },

    setTableUrl: function() {
        var loThat = this,
            loUrl = "/contacts/data",
            df = "?df=",
            dt = "dt=",
            ms = "ms=",
            aa = "aa=",
            fs = "fs=",
            ps = "ps=",
            as = "as=",
            is = "is=",
            cs = "cs=",
            cbs = "cbs=",
            sas = "sas=",
            sais = "sais=",
            sis = "sis=",
            sts = "sts=",
            stp = "stp=",
            stf = "stf=",
            mks = "mks=";

        aa += loThat.getFilter("assigned_agent") + "&";
        df += loThat.fromDate.format("MMDDYYYY") + "&";
        dt += loThat.toDate.format("MMDDYYYY") + "&";
        fs += loThat.getFilter("form_source") + "&";
        ms += loThat.getFilter("message_source") + "&";
        ps += loThat.getFilter("phone_source") + "&";
        cs += loThat.getFilter("call_status") + "&";
        cbs += loThat.getFilter("call_bdc_status") + "&";
        sas += loThat.getFilter("api_check") + "&";
        sais += loThat.getFilter("adf_import_check") + "&";
        sis += loThat.getFilter("import_check") + "&";
        stf += loThat.getFilter("form_check") + "&";
        stp += loThat.getFilter("phone_check") + "&";
        sts += loThat.getFilter("sms_check") + "&";
        mks += loThat.getFilter("marketing_source");

        loUrl += df + dt + aa + fs + ms + ps + cs + cbs + sas + sais +sis + stp + stf+ sts + mks;
        loThat.searchUrl = loUrl;

        return loUrl;
    },

    getContactAgents: function() {
        var loThat = this;

        $.ajax({
            type: "GET",
            url: '/contacts/agents',
            contentType: 'application/json',
            success: function(data, textStatus) {
                if (data) {
                    if (data.agents != undefined && data.agents != null && data.agents.length > 0) {
                        var loOptions = "";
                        var loAgents = data.agents;

                        loOptions = loOptions + '<option value="Select agent...">Select agent...</option>';

                        for(var i = 0; i < loAgents.length; i++) {
                            var loAgent = loAgents[i];
                            loOptions = loOptions + '<option value="'+ loAgent[0] +'">' + loAgent[1] + '</option>';
                        }

                        $('#addAgent').html(loOptions);
                        $('#addAgent').val("Select agent...");
                    }
                }
            }
        });
    },

    addFormCheckStyling: function(control, message) {
        if (control.parent().find('.field-error').length == 0) {
            control.parent().addClass('has-error');
            control.parent().append('<div class="list-unstyled text-danger field-error">' + message + '</div>');
            control.focus();
        }
    },

    validEmailFormatCheck: function(control, message, regEx) {
        var loControlValue = control.val();

        if (loControlValue != undefined && loControlValue != null && loControlValue != "") {
            if (!loControlValue.match(regEx)) {
                if (control.parent().find('.field-error').length == 0) {
                    control.parent().addClass('has-error');
                    control.parent().append('<div class="list-unstyled text-danger field-error">' + message + '</div>');
                    control.focus();
                }

                return false;
            }
        }

        return true;
    },

    validFormatCheck: function(control, message, regEx) {
        var loControlValue = control.val().replace(" ", "").replace("(", "").replace(")", "").replace("-", "");

        if (loControlValue != undefined && loControlValue != null && loControlValue != "") {
            if (!loControlValue.match(regEx)) {
                if (control.parent().find('.field-error').length == 0) {
                    control.parent().addClass('has-error');
                    control.parent().append('<div class="list-unstyled text-danger field-error">' + message + '</div>');
                    control.focus();
                }

                return false;
            }
        }

        return true;
    },

    validRequiredCheck: function(control) {
        var loControlValue = control.val();

        if (loControlValue == undefined || loControlValue == null || loControlValue == "") {
            if (control.parent().find('.field-error').length == 0) {
                control.parent().append('<div class="list-unstyled text-danger field-error">This field is required.</div>');
                control.focus();
            }

            return false;
        }

        return true;
    },

    addContactDetails: function() {
        var loThat = this;
        var loFirstNameControl = $('#addFirstName');
        var loFirstname = loFirstNameControl.val();
        var loLastNameControl = $('#addLastName');
        var loLastname = loLastNameControl.val();
        var loPhonenumberControl = $('#addPhonenumber');
        var loPhonenumber = loPhonenumberControl.val();
        var loEmailControl = $('#addEmail');
        var loEmail = loEmailControl.val();
        var loStatus = $("#addStatus option:selected").val();
        var loMarketingSource = $("#addMarketingSource option:selected").val();
        var loAgentId = $("#addAgent option:selected").val();
        var loAgentText = $("#addAgent option:selected").text();
        var loAddress1 = $('#addAddress1').val();
        var loAddress2 = $('#addAddress2').val();
        var loCity = $('#addCity').val();
        var loState = $('#addState').val();
        var loZip = $('#addZip').val();
        var loBirthdayControl = $('#addBirthday');
        var loBirthday = loBirthdayControl.val();
        var loCountry = $('#addCountry').val();
        var loDoNotCall = $('#chkAddDoNotCallPhone').prop("checked");
        var loUnsubscribed = $('#chkAddIsUnsubscribed').prop("checked");
        var loNote = $('#addNote').val();

        $('#addLeadModal .field-error').remove();
        $('#addLeadModal>div').removeClass('has-error');

        //Required Validation
        var loValidPhonenumber = loThat.validRequiredCheck(loPhonenumberControl);
        var loValidLastName = loThat.validRequiredCheck(loLastNameControl);
        var loValidFirstName = loThat.validRequiredCheck(loFirstNameControl);

        //Format Validation
        var loValidBirthday = loThat.validFormatCheck(loBirthdayControl, 'Invalid date. Dates must be in mm/dd/yyyy format.', loThat.gloDateRegEx);
        var loValidPhonenumber = loThat.validFormatCheck(loPhonenumberControl, 'Invalid phonenumber.', loThat.gloPhonenumberRegEx);
        var loValidEmail = loThat.validEmailFormatCheck(loEmailControl, 'Invalid email.', loThat.gloEmailRegEx);

        if (loValidFirstName && loValidLastName && loValidPhonenumber && loValidBirthday && loValidPhonenumber) {
            $.ajax({
                type: "POST",
                url: '/contacts/details/add',
                contentType: 'application/json',
                data: JSON.stringify({
                    "firstname": loFirstname,
                    "lastname": loLastname,
                    "status": loStatus,
                    "marketing_source": loMarketingSource,
                    "phonenumber": loPhonenumber,
                    "agent_assigned_id": loAgentId,
                    "agent_assigned_text": loAgentText,
                    "email": loEmail,
                    "note": loNote,
                    "address1": loAddress1,
                    "address2": loAddress2,
                    "city": loCity,
                    "state": loState,
                    "zip": loZip,
                    "country": loCountry,
                    "birthday": loBirthday,
                    "donotcall": loDoNotCall,
                    "unsubscribed": loUnsubscribed
                }),
                success: function(data, textStatus) {
                    if (data.success == true) {
                        $("#addLeadModal").modal("hide");
                        loThat.reloadTable();
                    } else {
                        var missing_message = '';
                        var error_message = '';
                        var invalid_message = '';
                        var final_message = '';

                        $('#add-contact-warning').html('');

                        if (data.missing_message.length > 0) {
                            missing_message = 'The following field(s) are missing: ';

                            for(var i = 0; i < data.missing_message.length; i++) {

                                if (i == (data.missing_message.length - 1)) {
                                    missing_message += data.missing_message[i];
                                } else {
                                    missing_message += data.missing_message[i] + ", ";
                                }
                            }
                        }

                        if (data.error_message.length > 0) {
                            error_message = '';

                            for(var i = 0; i < data.error_message.length; i++) {

                                if (i == (data.error_message.length - 1)) {
                                    error_message += data.error_message[i];
                                } else {
                                    error_message += data.error_message[i] + "<br>";
                                }
                            }
                        }

                        if (data.invalid_message.length > 0) {
                            invalid_message = '';

                            for(var i = 0; i < data.invalid_message.length; i++) {

                                if (i == (data.invalid_message.length - 1)) {
                                    invalid_message += data.invalid_message[i];
                                } else {
                                    invalid_message += data.invalid_message[i] + "<br>";
                                }
                            }
                        }

                        if (missing_message.length > 0) {
                            final_message += missing_message + "<br>";
                        }

                        if (error_message.length > 0) {
                            final_message += error_message + "<br>";
                        }

                        if (invalid_message.length > 0) {
                            final_message += invalid_message + "<br>";
                        }

                        if (invalid_message.length == 0 && missing_message.length == 0 && error_message.length == 0) {
                            $('#add-contact-warning').html('Error adding lead.').show();
                        }
                        else {
                            if (final_message.toLowerCase().includes('phonenumber')) {
                                loThat.addFormCheckStyling(loPhonenumberControl, final_message);
                            }
                        }
                    }
                },
                error: function() {
                    $('#add-contact-warning').html('Error adding lead.').show();
                }
            });
        }
    },

    getLeadDetails: function(leadId) {
        var loThat = this;

        $("#editFirstName, #editLastName, #editPhonenumber, #editEmail, #editNote").val("");

        $.ajax({
            type: "GET",
            url: '/contacts/details/' + leadId,
            contentType: 'application/json',
            success: function(data, textStatus) {
                if (data) {
                    $("#noteCheck").hide();
                    $('.lead-view-notes').attr("href", "/contacts/edit/" + leadId + "#notes");
                    $("#editFirstName").val(data.firstname);
                    $("#editLastName").val(data.lastname);
                    $("#editPhonenumber").val(data.phonenumber);
                    $("#editEmail").val(data.email);
                    loThat.gloSelectedCampaign = data.campaign_id;
                    if (data.notedate) {
                        $("#noteCheck").show();
                        $("#prevNoteDate").text(data.notedate);
                        $("#prevNoteText").text(data.notetext);
                        $("#prevNoteUser").text(data.noteuser);
                    }
                    if (data.status != undefined && data.status != null && data.status != "") {
                        $("#editStatus").val(data.status);
                    } else {
                        $("#editStatus").val("Select status...");
                    }

                    if (data.bdc_status != undefined && data.bdc_status != null && data.bdc_status != "") {
                        $("#editBdcStatus").val(data.bdc_status);
                    } else {
                        $("#editBdcStatus").val("Select BDC status...");
                    }

                    if (data.source != undefined && data.source != null && data.source != "") {
                        $("#editSource").val(data.source);
                    } else {
                        $("#editSource").val("Select marketing source...");
                    }

                    if (data.agents != undefined && data.agents != null && data.agents.length > 0) {
                        var loOptions = "";
                        var loAgents = data.agents;
                        var loNoAgent = true;

                        if (data.agentassigned != undefined && data.agentassigned != null && data.agentassigned != "")
                            loNoAgent = false;

                        if (loNoAgent) {
                            loOptions = loOptions + '<option value="Select agent...">Select agent...</option>';
                        }

                        for(var i = 0; i < loAgents.length; i++) {
                            var loAgent = loAgents[i];
                            loOptions = loOptions + '<option value="'+ loAgent[0] +'">' + loAgent[1] + '</option>';
                        }

                        $('#editAgent').html(loOptions);

                        if (loNoAgent) {
                            $('#editAgent').val("Select agent...");
                        } else {
                            $('#editAgent').val(data.agentassigned);
                        }
                    }
                }
            }
        });

        loThat.getCampaigns();
    },

    setLeadDetails: function(leadId) {
        var loThat = this;
        var loFirstName = $("#editFirstName").val();
        var loLastName = $("#editLastName").val();
        var loEmail = $("#editEmail").val();
        var loStatus = $("#editStatus").val();
        var loBdcStatus = $("#editBdcStatus").val();
        var loSource = $("#editSource").val();
        var loAgent = $("#editAgent").val();
        var loNote = $("#editNote").val();
        var loCampaignId = $("#campaign").val();

        $.ajax({
            type: "POST",
            url: '/contacts/details/' + leadId,
            contentType: 'application/json',
            data: JSON.stringify({
                "contact_id": leadId,
                "firstname": loFirstName,
                "lastname": loLastName,
                "status": loStatus,
                "bdc_status": loBdcStatus,
                "source": loSource,
                "agentassigned": loAgent,
                "email": loEmail,
                "campaign_id": loCampaignId,
                "note": loNote
            }),
            success: function(data, textStatus) {
                if (data == "OK") {
                    $("#myLeadEditModal").modal("hide");
                    $("#editFirstName, #editLastName, #editPhonenumber, #editEmail, #editNote").val("");
                    loThat.reloadTable();
                }
            }
        });
    },

    objectEmpty: function(paObject) {
        if (paObject === null || paObject === undefined || paObject.length == 0)
            return true;
        else if (paObject.length > 0) {
            var count = 0;

            for(var i = 0; i < paObject.length; i++) {
                if (paObject[i] == 0) {
                    count = count + 1;
                }
            }

            if (count == paObject.length) {
                return true;
            }
        }
        else
            return false;
    },

    getFirstDayOfMonth: function() {
        var loDate = new Date(),
            loYear = loDate.getFullYear(),
            loMonth = loDate.getMonth();

        return moment.utc(new Date(loYear, loMonth, 1));
    },

    getLastDayOfMonth: function() {
        var loDate = new Date(),
            loYear = loDate.getFullYear(),
            loMonth = loDate.getMonth();

        return moment.utc(new Date(loYear, loMonth + 1, 0));
    },

    getFirstDayOfYear: function() {
        var loThisYear = (new Date()).getFullYear();
        var loStart = new Date("1/1/" + loThisYear);

        return moment.utc(loStart.valueOf());
    },

    getLastDayOfYear: function() {
        var loThisYear = (new Date()).getFullYear();
        var loEnd = new Date("12/31/" + loThisYear);

        return moment.utc(loEnd.valueOf());
    }
};

// function used to add spinner loader
function spinnerAdded() {
    document.getElementById("loaderContainer").style.display = "block";
    document.getElementById("loader").style.display = "block";
    document.getElementById("postLoader").style.display = "none";
}//end add spinner loader function

// function used to remove spinner loader
function spinnerRemoved() {
    document.getElementById("loaderContainer").style.display = "none";
    document.getElementById("loader").style.display = "none";
    document.getElementById("postLoader").style.display = "block";
}//end remove spinner loader function

$(document).ready(function() {
    contacts.init();
});