var menuTimeOut;
var _requiredFieldLabelText = "<span class='requiredLabels'><span aria-hidden='true'>(required)</span><span class='sr-only'> required</span></span>";

$(function () {
    $('[data-toggle="tooltip"]').tooltip();
    $('[data-toggle="popover"]').popover();

    $('[data-toggle="popover"]').on('show.bs.popover', function (event) {
        //if popover is selected, hide the other selectors. 
        $('[data-toggle="popover"]').not(this).popover('hide');
    });

    $('body').on('click', function (event) {
        //if user click outside of the body element, hide all popover.
        if (!$(event.target).hasClass("tooltip-label") && !$(event.target).hasClass("popover-icon-button")) {
            $('[data-toggle="popover"]').popover('hide');
        }
    });

    $("a.show-loading-while-redirect").click(function () {
        jgUtils.showLoading();
    });

    //It just gets the element text value, excluding all its child elements
    $.fn.innerText = function () {
        return this.contents().not(this.children()).text();
    };

    $.fn.innerHtml = function (newText) {
        var _childs = this.children();
        return this.html(newText).append(_childs);
    };

    //SET CURSOR POSITION
    $.fn.setCursorPosition = function (pos) {
        this.each(function (index, elem) {
            if (elem.setSelectionRange) {
                elem.focus();
                setTimeout(function () { elem.setSelectionRange(pos, pos); }, 100);
            } else if (elem.createTextRange) {
                let range = elem.createTextRange();
                range.collapse(true);
                range.moveEnd('character', pos);
                range.moveStart('character', pos);
                range.select();
            }
        });
        return this;
    };
});

$(document).ready(function () {
    $('[type="submit"][action]').click(function () {
        $('#ActionType').val($(this).attr('action'));
    });

    $('[type="submit"][data-form-action]').click(function () {
        $('#ActionType').val($(this).attr('data-form-action'));
    });

    $('#ActionType').val('');

    //If this code-only class is applied and its inner field label text is coming from Model with HTML text. Then this will help render the HTML content instead of showing raw HTML text.
    $(".code-only-render-html .control-label").html($(".code-only-render-html .control-label").innerText());
    $(".code-only-render-html .form-label").html($(".code-only-render-html .form-label").innerText());

    //Bootstrap + jQuery based Multiple Select Droddown
    if (jQuery().multiselect) {
        jgUtils.form.bindMultiSelectDropdown();
    }

    $("input[type='number'][maxlength]").keyup(function (e) {
        var maxAllowedSize = parseInt($(this).attr("maxlength"));
        var fieldValue = $(this).val();
        if (fieldValue.length > maxAllowedSize) {
            $(this).val(fieldValue.slice(0, maxAllowedSize));
        }
    });

    $('.modal')
        .on('show.bs.modal', function () {
            scrollPosY = document.documentElement.scrollTop;
            scrollPosX = document.documentElement.scrollLeft;
            $('.header-div').css({ top: 0 });
            $('body').css({ top: -scrollPosY });
        })
        .on('hidden.bs.modal', function () {
            window.scrollTo(scrollPosX, scrollPosY);
        });

    // This is to remove the focusin event on the link modal of ckeditor description textarea. Allows user to enter text into inputs
    if (!jgUtils.isUndefinedOrNull($.fn.modal)) {
        $.fn.modal.Constructor.prototype.enforceFocus = function () {
            var $modalElement = this.$element;
            $(document).on('focusin.modal', function (e) {
                var $parent = $(e.target.parentNode);
                if ($modalElement[0] !== e.target && !$modalElement.has(e.target).length
                    // add whatever conditions you need here:
                    &&
                    ((!$parent.hasClass('cke_dialog_ui_input_select') && !$parent.hasClass('cke_dialog_ui_input_text')) || $modalElement.hasClass('cke_wysiwyg_frame'))) {
                    $modalElement.focus();
                }
            })
        };
    }

    // Set the Form actions if the browser is IE and the version is less than 11
    if ($.browser.msie) {
        var ieVersion = jgUtils.ieVersion();
        if (!isNaN(ieVersion)) {
            if (parseInt(ieVersion) < 11) {
                $('[type="submit"][formaction]').click(function (e) {
                    var $this = $(this);
                    var formAction = $this.attr('formaction');
                    $this.closest('form').attr('action', formAction);
                });
            }
        }
    }

    $(".drop-down-heading").hover(function () {
        clearTimeout(menuTimeOut);
        dropDownHeadingSelect(this);
    }, function () {
        menuTimeOut = setTimeout(function () {
            $(".drop-down-heading").removeClass("active");
            $(".drop-down-menu-div").removeClass("open");
            $(".sub-drop-down-menu-div").removeClass("open");
            $(".sub-menu-heading").find('i').removeClass("rotate90");
        }, 1000);
    });
    $(".drop-down-heading").focus(function () {
        dropDownHeadingSelect(this);
    });
    $(".drop-down-heading").click(function () {
        dropDownHeadingSelect(this);
    });
    $(".drop-down-heading").parent().find(".drop-down-menu-div").hover(function () {
        clearTimeout(menuTimeOut);
    }, function () {
        menuTimeOut = setTimeout(function () {
            $(".drop-down-heading").removeClass("active");
            $(".drop-down-menu-div").removeClass("open");
            $(".sub-drop-down-menu-div").removeClass("open");
            $(".sub-menu-heading").find('i').removeClass("rotate90");
        }, 1000);
    });

    //This is to fix the Accessbility issues in mobile, when hidden elements are not visible, tab index must not go focus on those.
    $(".right-nav").find("a").attr("tabindex", "-1");
    $(".left-nav").find("a").attr("tabindex", "-1");

    $(".left-nav-toggle-link").click(function (e) {
        e.preventDefault();
        $(".login-panel-menu").removeClass("open");
        $(".right-nav").removeClass("menu-open").attr("aria-hidden", "true");
        $(".right-nav-toggle-link").attr("aria-expanded", "false");
        $(".left-nav").toggleClass("menu-open");
        if ($(".left-nav").hasClass("menu-open")) {
            $("body").addClass("menu-open");
            $("html").addClass("menu-open");
            $(this).attr("aria-expanded", "true");
            $(".left-nav").attr("aria-hidden", "false");
            $(".left-nav").find("a").attr("tabindex", "0");
        } else {
            $("body").removeClass("menu-open");
            $("html").removeClass("menu-open");
            $(this).attr("aria-expanded", "false");
            $(".left-nav").attr("aria-hidden", "true");
            $(".left-nav").find("a").attr("tabindex", "-1");
        }
    });
    $(".right-nav-toggle-link").click(function (e) {
        e.preventDefault();
        $(".login-panel-menu").removeClass("open");
        $(".left-nav").removeClass("menu-open").attr("aria-hidden", "true");
        $(".left-nav-toggle-link").attr("aria-expanded", "false");
        $(".right-nav").toggleClass("menu-open");
        if ($(".right-nav").hasClass("menu-open")) {
            $("body").addClass("menu-open");
            $("html").addClass("menu-open");
            $(this).attr("aria-expanded", "true");
            $(".right-nav").attr("aria-hidden", "false");
            $(".right-nav").find("a").attr("tabindex", "0");
        } else {
            $("body").removeClass("menu-open");
            $("html").removeClass("menu-open");
            $(this).attr("aria-expanded", "false");
            $(".right-nav").attr("aria-hidden", "true");
            $(".right-nav").find("a").attr("tabindex", "-1");
        }
    });
    $(".page-body").click(function () {
        $(".drop-down-heading").removeClass('active');
        $(".drop-down-menu-div").removeClass("open");
        $(".login-panel-menu").removeClass("open");
        $(".sub-drop-down-menu-div").removeClass("open");
        $(".sub-menu-heading").find('i').removeClass("rotate90");
    });

    $(".page-body").click(function () {
        $(".left-nav").removeClass("menu-open").attr("aria-hidden", "true");
        $(".right-nav").removeClass("menu-open").attr("aria-hidden", "true");
        $("body").removeClass("menu-open").attr("aria-hidden", "false");
    });
    $(".side-nav-list").find(".drop-down-heading").click(function () {
        $(".drop-down-heading").not(this).parent(".drop-down-heading-li").find(".drop-down-menu-div").removeClass("open");
        $(".drop-down-heading").not(this).removeClass("active-heading");

        $(this).parent(".drop-down-heading-li").find(".drop-down-menu-div").addClass("open");
        $(this).addClass("active-heading");
    });

    $(".quick-job-search button").click(function (e) {
        e.preventDefault();
        var request = { "jobDetailModel": { "jobTitle": $("#_HeaderKeywords").val(), "cityState": $("#_HeaderLocation").val() } };
        cwdsapi.post($(this).attr('data-api'), request, jgLoggedInHeader.quickJobSearchSuccess, jgLoggedInHeader.quickJobSearchFailure);
    });

    $(".employer-quick-job-search button").click(function (e) {
        e.preventDefault();
        var request = { "keyword": $("#_HeaderKeywords").val(), "location": $("#_HeaderLocation").val() };
        cwdsapi.post($(this).attr('data-api'), request, jgEmpLoggedInHeader.searchSuccess, jgEmpLoggedInHeader.searchFailure);
    });

    if (!jgUtils.isUndefinedOrNullOrBlank($("#RequiredText").val())) {
        $('.' + jgUtils.class.reqlabel).append("<span class='requiredLabels'>" + $("#RequiredText").val() + "</span>");
        $('.' + jgUtils.class.controlreqlabel).append("<span class='requiredLabels'>" + $("#RequiredText").val() + "</span>");
        _requiredFieldLabelText = "<span class='requiredLabels'>" + $("#RequiredText").val() + "</span>";
    }

    $('.top-nav-link').keydown(function (e) {
        if ([37, 38, 39, 40].indexOf(e.keyCode) == -1) {
            return;
        }
        var link = $(this);
        switch (e.keyCode) {
            case 37: // left arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').prevAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').nextAll('li').filter(':visible').last().find('a').first().focus();
                } else {
                    link.parent('li').prevAll('li').filter(':visible').first().find('a').first().focus();
                }
                break;
            case 38: /// up arrow
                var dropdown = link.parent('li').find('.menu').find(".drop-down-menu-list");
                if (dropdown.length > 0) {
                    e.preventDefault();
                    e.stopPropagation();
                    dropdown.find('.menu-element').filter(':visible').first().focus();
                }

                break;
            case 39: // right arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').nextAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').prevAll('li').filter(':visible').last().find('a').first().focus();
                } else {
                    link.parent('li').nextAll('li').filter(':visible').first().find('a').first().focus();
                }
                break;
            case 40: // down arrow
                var dropdown = link.parent('li').find('.menu').find(".drop-down-menu-list");
                if (dropdown.length > 0) {
                    e.preventDefault();
                    e.stopPropagation();
                    dropdown.find('.menu-element').filter(':visible').first().focus();
                }
                break;
        }
    });

    $('.drop-down-menu-item').find('.menu-element').keydown(function (e) {
        if ([37, 38, 39, 40].indexOf(e.keyCode) == -1) {
            return;
        }
        var link = $(this);
        switch (e.keyCode) {
            case 37: // left arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').parent('ul').parent('div').parent('li').prevAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').parent('ul').parent('div').parent('li').nextAll('li').filter(':visible').last().find('.top-nav-link').first().focus();
                } else {
                    link.parent('li').parent('ul').parent('div').parent('li').filter(':visible').first().find('.top-nav-link').first().focus();
                }
                break;
            case 38: /// up arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').prevAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').nextAll('li').filter(':visible').last().find('.menu-element').first().focus();
                } else {
                    link.parent('li').prevAll('li').filter(':visible').first().find('.menu-element').first().focus();
                }
                break;
            case 39: // right arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').parent('ul').parent('div').parent('li').nextAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').parent('ul').parent('div').parent('li').prevAll('li').filter(':visible').last().find('.top-nav-link').first().focus();
                } else {
                    link.parent('li').parent('ul').parent('div').parent('li').nextAll('li').filter(':visible').first().find('.top-nav-link').first().focus();
                }
                break;
            case 40: // down arrow
                e.preventDefault();
                e.stopPropagation();
                if (link.parent('li').nextAll('li').filter(':visible').first().length == 0) {
                    link.parent('li').prevAll('li').filter(':visible').last().find('.menu-element').first().focus();
                } else {
                    link.parent('li').nextAll('li').filter(':visible').first().find('.menu-element').first().focus();
                }
                break;
        }
    });

    $('.quick-job-search').find(":text, button").keydown(function (e) {
        if (e.which == 13) {
            $(".code-only-quick-search-button").click();
            return false;
        }
    });
    jobCartShowHide();

    $('.result-content').live('click', function () {
        if ($(this).find(".no-click").length <= 0 && $(this).find("a").length > 0) {
            var target = $(this).find("a").attr('target');
            if (target && target !== '') {
                window.open($(this).find("a").attr('href'), target);
            } else {
                window.location = $(this).find("a").attr("href");
            }

            return false;
        }

        return true;
    });

    $('div.panel-block-link').live('click', function (e) {
        if (!$(this).hasClass("no-click")) {
            e.preventDefault();
            if ($(this).find("a").attr("href")) {
                window.location = $(this).find("a").attr("href");
            }
            return false;
        }
        return true;
    });

    jgUtils.init();

    //DatePicker
    $("input[type=text][data-date-format='mm/dd/yyyy'].datepicker").mask(jgUtils.mask.mmddyyyy);
    $("input[type=text][data-date-format='mm/yyyy'].datepicker").mask(jgUtils.mask.mmyyyy);
    $(".datepicker-cal-icon").click(function (e) {
        e.preventDefault();
        $(this).closest(".input-group").find("input[type=text]").focus();
    });

    $('input[type="text"].datepicker[data-val="true"]').datepicker().on('hide', function (e) {
        var target = $(e.currentTarget);
        if (target.attr('data-val') == 'true' && target.val() !== undefined && target.val() !== null && target.val() !== '' && target.val() !== "__/__/____") {
            //target.removeClass('ignore');
            target.valid();
        }
    });

    //TouchSpin
    $(".touchspin-jg:not(.list .list-results .touchspin-jg, .touchspin-exclude-fwinit)").TouchSpin({});


    /* START: State and County Dropdown Change Event Handling based on Css Class */
    setTimeout(function () {
        //Due to usage of Angular, binding take some time. hence, adding some delay.
        $("select.state-dropdown").each(function () {
            jgUtils.form.hideOrShowCountyByState($(this), false);
        });

        //When dropdown is disabled, stop up/down arrow for the dropdown for screen reader.
        $(document).on('keydown', 'select.disabled', function (e) {
            if (e.keyCode === 38 || e.keyCode === 40) { //up or down
                e.preventDefault();
                e.stopImmediatePropagation();
                return false;
            }
        });
    }, 200);

    //Above code and this are totally different.
    $("select.state-dropdown").change(function () {
        jgUtils.form.hideOrShowCountyByState($(this), true);
    });

    $("select.county-dropdown").change(function () {
        if ($(this).hasClass(".req-field")) {
            $(this).rules('add', 'required');
        }

        if (!jgUtils.isUndefinedOrNullOrBlank($(this).val())) {
            $(this).rules('remove', 'required');
        }
    });
    /* END: State and County Dropdown Change Event Handling based on Css Class */

    //This method will bind event to move input focus to next element on Enter key press, instead of trying to submit the form.
    jgUtils.form.bindMoveFocusToNextActiveInputField();

    // Tooltip icon right next to the input field label will open the modal popup/dialog.
    $("a[data-tooltip-dialog]").on("click", function (e) {
        e.preventDefault();
        if (!jgUtils.isUndefinedOrNullOrBlank($(this).data("tooltip-dialog"))) {
            cwds.dialog.open($(this).data("tooltip-dialog"));
        }
    });
});

function dropDownHeadingSelect(currentHeading) {
    $(".drop-down-heading").removeClass("active");
    $(".drop-down-heading").parent().find(".drop-down-menu-div").removeClass("open");
    $(".top-nav-link").removeClass('active');
    $(".drop-down-heading").not(currentHeading).parent().find(".sub-drop-down-menu-div").removeClass("open");
    $(currentHeading).addClass("active");
    $(currentHeading).parent().find(".drop-down-menu-div").addClass("open");

}
function quickJobSearchFailure() {

}
function jobCartShowHide() {
    if ($(".job-cart").find(".list-item-count").text().trim() > 0) {
        $(".job-cart").find(".list-item-count").removeClass("hidden");
        $(".job-cart").find(".records-list").find(".view-all-button").removeClass("hidden");
        $(".job-cart").find(".records-list").find(".no-records-list-item").addClass("hidden");
    } else {
        $(".job-cart").find(".list-item-count").addClass("hidden");
        $(".job-cart").find(".records-list").find(".view-all-button").addClass("hidden");
        $(".job-cart").find(".records-list").find(".no-records-list-item").removeClass("hidden");
    }
}
function quickJobSearchSuccess(data) {
}
function togglePasswordVisibility() {
    $('#Password').attr('type', $('#show-password').prop('checked') ? 'text' : 'password');
}

function validateForm(e, btn) {
    var returnValue = false;
    var loginForm = $(btn).closest(".menu.login-panel");
    $(loginForm).find("div.validation-area").addClass("hidden");
    $(loginForm).find("div.validation-area").find("a").addClass("hidden");
    var userIdBlank = checkValue($(loginForm).find('#username'));
    var passwordBlank = checkValue($(loginForm).find('#Password'));
    if (userIdBlank || passwordBlank) {
        $(loginForm).find("div.validation-area").removeClass("hidden");
        if (userIdBlank && passwordBlank) { $(loginForm).find('#UserIdPasswordErrorMessageLink').removeClass("hidden").focus(); }
        else if (userIdBlank) { $(loginForm).find('#UserIdErrorMessageLink').removeClass("hidden").focus(); }
        else if (passwordBlank) { $(loginForm).find('#PasswordErrorMessageLink').removeClass("hidden").focus(); }
        returnValue = false;
        e.preventDefault();
    }
    return returnValue;
}

function checkValue(control) {
    var value = $(control).val();
    var matValue = $(control).attr("placeholder");
    if (value === null || value === "" || value === matValue) {
        return true;
    }
    else {
        return false;
    }
}


function UserIdError() {
    document.getElementById("username").focus();
}

function PasswordError() {
    document.getElementById("Password").focus();
}

function messageText(messageType, messageContent) {
    var spanClass = ".message-text-" + messageType;
    $(spanClass).html(messageContent);
}

var jgEmpLoggedInHeader = {
    searchSuccess: function (data) {
        if (data != "") window.location.href = data;
    },
    searchFailure: function () {
        alert("Candidate search cannot be completed right now.  Try again later.");
    }
}

var jgLoggedInHeader = {
    refreshHeaderJobCart: function () {
        var jobCartListItem = $('#LoogedinMainHeader').find('.job-cart.drop-down-heading-li');
        if (jobCartListItem.length > 0) {
            var apiUrl = $(jobCartListItem).attr("data-header-jobcart-api");
            var sRequest = {};
            cwdsapi.post(apiUrl, sRequest, jgLoggedInHeader.refreshHeaderJobCartSuccess, jgLoggedInHeader.refreshHeaderJobCartFailure);
        }
    },
    refreshHeaderJobCartSuccess: function (data) {
        var jobCartListItem = $('#LoogedinMainHeader').find('.job-cart.drop-down-heading-li');
        var mobileJobCartNavLink = $('#LoogedinMainHeader').find('.right-nav .side-nav-link-li.job-cart');
        $(jobCartListItem).find('.list-item-count').empty().append(data.jobCartCount);
        if (data.jobCartCount > 0) {
            $(jobCartListItem).find('.list-item-count').removeClass("hidden");
            $(jobCartListItem).find('.view-all-button').removeClass("hidden");
            $(jobCartListItem).find('.no-records-list-item').addClass("hidden");
        } else {
            $(jobCartListItem).find('.list-item-count').addClass("hidden");
            $(jobCartListItem).find('.view-all-button').addClass("hidden");
            $(jobCartListItem).find('.no-records-list-item').removeClass("hidden");
        }
        $(mobileJobCartNavLink).find('.count-display.jobs-count').empty().append("(" + data.jobCartCount + ")");
        var template = '';
        $(jobCartListItem).find('.drop-down-menu-list.records-list li').not("li.view-all-button, li.no-records-list-item").remove();
        for (var i = 0; i < data.jobPostings.length; i++) {
            template = '<li class=drop-down-menu-item><a href=javascript:void(0)><span class=row><span class="col-xs-8 text-left job-title-span">' + data.jobPostings[i].jobTitle + '</span><span class="col-xs-4 text-right posting-id-span">' + data.jobPostings[i].jobPostingId + '</span></span><span class=row><span class="col-xs-12 job-loc-span">' + data.jobPostings[i].cityState + '</span></span></a></li>';
            $(jobCartListItem).find('.drop-down-menu-list.records-list').prepend(template);
        }
    },
    refreshHeaderJobCartFailure: function () {
        //alert('failure');
    },
    quickJobSearchSuccess: function (data) {
        if (data != "") window.location.href = data;
    },
    quickJobSearchFailure: function (data) {

    }
}

var jgLoggedInEmployerHeader = {
    refreshHeaderJobCart: function () {
        var jobCartListItem = $('#mainHeader').find('.favorite-candidates.drop-down-heading-li');
        if (jobCartListItem.length > 0) {
            var apiUrl = $(jobCartListItem).attr("data-header-jobcart-api");
            var sRequest = {};
            cwdsapi.post(apiUrl, sRequest, jgLoggedInEmployerHeader.refreshHeaderJobCartSuccess, jgLoggedInEmployerHeader.refreshHeaderJobCartFailure);
        }
    },
    refreshHeaderJobCartSuccess: function (data) {
        var jobCartListItem = $('#mainHeader').find('.favorite-candidates.drop-down-heading-li');
        //var mobileJobCartNavLink = $('#mainHeader').find('.right-nav .side-nav-link-li.job-cart');
        $(jobCartListItem).find('.list-item-count').empty().append(data.candidateCount);
        if (data.candidateCount > 0) {
            $(jobCartListItem).find('.list-item-count').removeClass("hidden");
            $(jobCartListItem).find('.view-all-button').removeClass("hidden");
            $(jobCartListItem).find('.no-records-list-item').addClass("hidden");
        } else {
            $(jobCartListItem).find('.list-item-count').addClass("hidden");
            $(jobCartListItem).find('.view-all-button').addClass("hidden");
            $(jobCartListItem).find('.no-records-list-item').removeClass("hidden");
        }
        //$(mobileJobCartNavLink).find('.count-display.jobs-count').empty().append("(" + data.jobCartCount + ")");
        var template = '';
        $(jobCartListItem).find('.drop-down-menu-list.records-list li').not("li.view-all-button, li.no-records-list-item").remove();
        for (var i = 0; i < data.favoriteCandidates.length; i++) {
            template = '<li class=drop-down-menu-item><a href=javascript:void(0)><span class=row><span class="col-xs-8 text-left job-title-span">' + data.favoriteCandidates[i].candidateName + '</span><span class="col-xs-4 text-right posting-id-span">' + data.favoriteCandidates[i].resumeId + '</span></span><span class=row><span class="col-xs-12 job-loc-span">' + data.favoriteCandidates[i].candidateLocation + '</span></span></a></li>';
            $(jobCartListItem).find('.drop-down-menu-list.records-list').prepend(template);
        }
    },
    refreshHeaderJobCartFailure: function () {
        //alert('failure');
    },
    quickJobSearchSuccess: function (data) {
        if (data != "") window.location.href = data;
    },
    quickJobSearchFailure: function (data) {

    }
}


var cwdsapi = {
    post: function (apiUrl, apiData, successCallBack, failureCallBack) {
        apiData.apiOperationContext = cwdsapi.getOperationContext();
        $.ajax({
            type: "POST",
            url: apiUrl,
            data: JSON.stringify(apiData),
            contentType: 'application/json;charset=utf-8',
            dataType: "json", // the data type we want back, so text.  The data will come wrapped in xml
            success: function (data) {
                if ($("#IsUserLoggedIn").val() === "1") {
                    ExtendSession();
                }
                successCallBack(data);
            },
            error: function (ts) {
                console.log(ts);
                if (ts.status === 400) {
                    var url = window.location.href;
                    window.location.href = url.split('/', 4).join('/') + '/error';
                } else {
                    if (ts.status === 502 && ts.responseText) {
                        alert(ts.responseText);
                    }
                    if (typeof (ExtendSession) === 'function') { ExtendSession(); }
                    failureCallBack(ts);
                }

            }
        });
    },
    getOperationContext: function () {
        var oContext = '';
        if ($("#OperationContext_jsonSecured").length > 0) {
            oContext = $("#OperationContext_jsonSecured").val();
        } else if ($("#OperationContext_json").length > 0) {
            oContext = JSON.parse($("#OperationContext_json").val());
        }
        return oContext;
    }
};

var jgUtils = {
    init: function () {
        jgUtils.messages.init();
        jgUtils.upload.init();
        jgUtils.uploadMultiple.init();
        jgUtils.jgTabs.init();
        jgUtils.form.init();
        //Mask Inputs
        jgUtils.initMaskInput();
        
    },
    //Initialize input masking.
    initMaskInput: function () {
        $('.' + jgUtils.class.phone).mask(jgUtils.mask.phone);
        $('.' + jgUtils.class.phoneext).mask(jgUtils.mask.phoneext);
        $('.' + jgUtils.class.phoneExtnV2).mask(jgUtils.mask.phoneExtnV2);
        $('.' + jgUtils.class.ssn).mask(jgUtils.mask.ssn);
        $('.' + jgUtils.class.zipext).mask(jgUtils.mask.zip);
        $('.masked-ssn').unmask().maskSSN(jgUtils.mask.ssn, { maskedChar: '*', maskedCharsLength: 5 });


        //Some delay has to be added because it was not considering the counter.
        setTimeout(function () {
            $("textarea.show-char-count").each(function () {
                jgUtils.initTextAreaCharCount($(this));
            });
        }, 300);

        //SSN: Show hide masking first 5 character
        $(".masked-ssn").siblings("a.input-group-addon").unbind().on('click', function (e) {
            e.preventDefault();
            let _ssnField = $(this).closest(".input-group").find('.masked-ssn');
            if ($(this).find("i").hasClass("fa-eye")) {
                _ssnField.unmask().maskSSN(jgUtils.mask.ssn, { maskedChar: '*', maskedCharsLength: 5 });
            } else {
                _ssnField.unmask().mask(jgUtils.mask.ssn);
            }

            let _ssnTextLength = _ssnField.val().length;
            //_ssnField.focus().val();
            _ssnField.setCursorPosition(_ssnTextLength);
        });
    },
    htmlEncode: function (val) {
        return $('<div/>').text(val).html();
    },
    initTextAreaCharCount: function (ctrl) {
        if (!jgUtils.isUndefinedOrNull(ctrl) && $(ctrl).length > 0 && $(ctrl).is("textarea") && !$(ctrl).hasClass("cc-enable-rtf")) {
            if ($("#" + ctrl.attr("id") + "_count").length > 0) {
                $("#" + ctrl.attr("id") + "_count").remove();
            }
            ctrl.after("<div id='" + ctrl.attr("id") + "_count' class='text-right char-count-label'><span class='char-count'>" + ctrl.val().length + "</span> characters of " + (!jgUtils.isUndefinedOrNullOrBlank(ctrl.attr("data-rtf-maxlength")) ? ctrl.attr("data-rtf-maxlength") : ctrl.attr("maxlength")) + "</div>");

            $(ctrl).on('change keyup paste', function (e) {
                return jgUtils.textAreaCharCount($(this));
            });
        }
    },
    textAreaCharCount: function (ctrl) {
        var r = true;
        var l = $(ctrl).val().length;
        var maxLength = parseInt((!jgUtils.isUndefinedOrNullOrBlank($(ctrl).data("rtf-maxlength")) ? $(ctrl).data("rtf-maxlength") : $(ctrl).attr("maxlength")));

        if (l > maxLength) {
            $(ctrl).val($(ctrl).val().substring(0, maxLength));
            alert('Exceeds max character length');
            r = false;
        }
        $("#" + $(ctrl).attr("id") + '_count').find(".char-count").html($(ctrl).val().length);
        return r;
    },
    class: {
        req: "jg-cv-req",
        reqlabel: "jg-cv-req-lbl",
        controlreqlabel: "req-label",
        phoneext: "jg-cv-phn-ext",
        phoneExtnV2: "mask-phone-extn",
        phone: "jg-cv-phn",
        ssn: "jg-cv-ssn",
        zipext: "jg-zip-ext"
    },
    mask: {
        phone: "(999) 999-9999",
        phoneext: "(999) 999-9999? ext999999",
        phoneExtnV2: "(999) 999-9999? ext.999999",
        zip: "99999?-9999",
        ssn: "999-99-9999",
        mmddyyyy: "99/99/9999",
        mmyyyy: "99/9999"
    },
    upload: {
        docNameAttr: 'document-name',
        newDocAttr: 'new-document',
        init: function () {
            $('.file-upload-root .file-upload-button').click(function (e) {
                e.preventDefault();
                $("#" + $(this).closest('.file-upload-root').find('.file-upload-ctrl')[0].id).trigger('click');
            });
            $(".file-upload-root .file-upload-ctrl").on('change', function () {
                var file = $(this).prop('files');
                var filename = file[0].name;
                var reader = new FileReader();
                var root = $(this).closest('.file-upload-root');
                var fileCtrl = $(this);
                var link = $(root).find(".file-upload-link");
                var label = $(root).find(".file-upload-text");
                var button = $(root).find(".file-upload-button");
                var removeButton = $(root).find(".file-upload-remove-button")
                if (filename) {
                    $(this).attr("file-upload-text-name", filename);
                }
                reader.addEventListener("load", function () {
                    $(button).addClass("hidden");
                    $(link).addClass("hidden");
                    $(label).removeClass("hidden").html(filename);
                    $(fileCtrl).addClass("hidden");
                    $(removeButton).removeClass("hidden");
                    $(root).attr(jgUtils.upload.docNameAttr, filename);
                    $(root).attr(jgUtils.upload.newDocAttr, '1');
                    $(root).addClass("file-selected");
                    $(label).trigger("change");
                }, false);

                if (file[0]) {
                    reader.readAsDataURL(file[0]);
                }
            });
            $(".file-upload-root .file-upload-remove-button").click(function (e) {
                e.preventDefault();
                var root = $(this).closest('.file-upload-root');
                var link = $(root).find(".file-upload-link");
                var label = $(root).find(".file-upload-text");
                var button = $(root).find(".file-upload-button");
                var removeButton = $(root).find(".file-upload-remove-button");
                var inputFile = $("#" + $(root).find('.file-upload-ctrl')[0].id);
                $(root).attr(jgUtils.upload.docNameAttr, '');
                $(root).attr(jgUtils.upload.newDocAttr, '0');
                $(root).removeClass("file-selected");
                $(button).removeClass("hidden");
                $(link).addClass('hidden').attr("aria-hidden", "true").html('No File');
                $(label).addClass("hidden").html('');
                $(removeButton).addClass("hidden");
                $(inputFile).removeClass("hidden");
                $(label).trigger("change");

                inputFile.val("");
                if ($(root).closest('.form-group').length > 0 && $(root).closest('.form-group').find(".control-label").length > 0 && $(root).closest('.form-group').find(".control-label").hasClass("req-label")) {
                    inputFile.rules('add', { required: true });
                }
            });

        },
        showDownload: function (id, fileName, url, title) {
            let root = $("#" + id).closest(".file-upload-root");
            if (root.length > 0) {
                let link = $(root).find(".file-upload-link");
                let label = $(root).find(".file-upload-text");
                let button = $(root).find(".file-upload-button");
                let removeButton = $(root).find(".file-upload-remove-button");
                let showLink = false;
                $(root).attr(jgUtils.upload.docNameAttr, fileName);
                $(root).attr(jgUtils.upload.newDocAttr, '0');
                $(root).addClass("file-selected");
                $(button).addClass("hidden");
                $(link).addClass('hidden').attr("aria-hidden", "true").html('No File');
                $(label).addClass("hidden").html('');
                $(removeButton).removeClass("hidden");
                $("#" + id).val("");
                $("#" + id).rules('remove');

                if (url) {
                    if (url.length > 0) {
                        showLink = true;
                    }
                }
                if (showLink) {
                    $(link).html(fileName).removeAttr("aria-hidden");
                    $(link).removeClass("hidden").attr('href', url).attr('title', title);
                    $(link).unbind();
                } else {
                    $(label).removeClass("hidden").html(fileName);
                }
            }
        },
        showUpload: function (id) {
            let root = $("#" + id).closest(".file-upload-root");
            if (root.length > 0) {
                let link = $(root).find(".file-upload-link");
                let label = $(root).find(".file-upload-text");
                let button = $(root).find(".file-upload-button");
                let removeButton = $(root).find(".file-upload-remove-button");

                $(root).attr(jgUtils.upload.docNameAttr, '');
                $(root).attr(jgUtils.upload.newDocAttr, '0');
                $(root).removeClass("file-selected");
                $(button).removeClass("hidden");
                $(link).addClass('hidden').attr("aria-hidden", "true").attr('href', '#').html('No File');
                $(label).addClass("hidden").html('');
                $(removeButton).addClass("hidden");

                $("#" + id).val("");
                if ($(root).closest('.form-group').length > 0 && $(root).closest('.form-group').find(".control-label").length > 0 && $(root).closest('.form-group').find(".control-label").hasClass("req-label")) {
                    $("#" + id).rules('add', { required: true });
                }
            }
        },
        isDocumentSelected: function (id) {
            var rv = false;
            var root = $("#" + id).closest(".file-upload-root");
            if ($(root).attr(jgUtils.upload.docNameAttr) && $(root).attr(jgUtils.upload.docNameAttr).length > 0) { rv = true; }
            return rv;
        },
        isNewDocument: function (id) {
            var rv = false;
            var root = $("#" + id).closest(".file-upload-root");
            if ($(root).attr(jgUtils.upload.newDocAttr) && $(root).attr(jgUtils.upload.newDocAttr) === '1') { rv = true; }
            return rv;
        }
    },
    uploadMultiple: {
        docNameAttr: 'document-name',
        newDocAttr: 'new-document',
        init: function () {
            $('.file-upload-list-root .file-upload-list-button').click(function (e) {
                $("#" + $(this).closest('.file-upload-list-root').find('.file-upload-ctrl')[0].id).trigger('click');
            });
            $(".file-upload-list-root .file-upload-ctrl").on('change', function () {
                var file = $(this).prop('files');
                var filename = file[0].name;
                var reader = new FileReader();
                var root = $(this).closest('.file-upload-list-root');
                var list = $(root).closest('.form-group');
                var link = $(root).find(".file-upload-list-link");
                var label = $(root).find(".file-upload-list-text");
                var button = $(root).find(".file-upload-list-button");
                var removeButton = $(root).find(".file-upload-remove-list-button");
                reader.addEventListener("load", function () {
                    $(button).addClass("hidden");
                    $(link).addClass("hidden");
                    $(label).removeClass("hidden");
                    $(removeButton).removeClass("hidden");
                    $(label).html(filename);
                    $(root).attr(jgUtils.uploadMultiple.docNameAttr, filename);
                    $(root).attr(jgUtils.uploadMultiple.newDocAttr, '1');
                    jgUtils.uploadMultiple.showHideUploadList(list);
                }, false);

                if (file[0]) {
                    reader.readAsDataURL(file[0]);
                }
            });
            $(".file-upload-list-root .file-upload-remove-list-button").click(function (e) {
                e.preventDefault();
                $('#DeleteDialogYesButton').attr('ctrl', $(this).closest('.file-upload-list-root').find('.file-upload-ctrl')[0].id);
                cwds.dialog.open("DeleteFile");
            });
            $('#DeleteDialogNoButton').click(function (e) {
                cwds.dialog.close("DeleteFile");
            });
        },
        deleteFile: function (root) {
            var list = $(root).closest('.form-group');
            var link = $(root).find(".file-upload-list-link");
            var label = $(root).find(".file-upload-list-text");
            var button = $(root).find(".file-upload-list-button");
            var removeButton = $(root).find(".file-upload-remove-list-button");
            $(root).removeAttr(jgUtils.uploadMultiple.docNameAttr);
            $(root).removeAttr(jgUtils.uploadMultiple.newDocAttr);
            $("#" + $(root).find('.file-upload-ctrl')[0].id).val("");
            $(button).removeClass("hidden");
            $(link).addClass('hidden');
            $(label).addClass("hidden");
            $(removeButton).addClass("hidden");
            $(label).html('');
            $(link).html('');
            jgUtils.uploadMultiple.showHideUploadList(list);
            if ($(list).find(".file-upload-list-root[document-name]").length > 0) {
                $($(list).find(".file-upload-list-root[document-name]")[$(list).find(".file-upload-list-root[document-name]").length - 1]).after($(list).find(".file-upload-list-root:not([document-name])")[0])
            }
        },
        showDownload: function (id, fileName, url, title) {
            var root = $("#" + id).closest('.file-upload-list-root');
            var link = $(root).find(".file-upload-list-link");
            var label = $(root).find(".file-upload-list-text");
            var button = $(root).find(".file-upload-list-button");
            var removeButton = $(root).find(".file-upload-remove-list-button");
            var showLink = false;
            $(root).attr(jgUtils.uploadMultiple.docNameAttr, fileName);
            $(root).attr(jgUtils.uploadMultiple.newDocAttr, '0');
            $(button).addClass("hidden");
            $(link).addClass('hidden');
            $(label).addClass("hidden");
            $(removeButton).removeClass("hidden");
            $(label).html('');
            $(link).html('');
            $("#" + id).val("");

            if (url) {
                if (url.length > 0) {
                    showLink = true;
                }
            }
            if (showLink) {
                $(link).html(fileName);
                $(link).removeClass("hidden").attr('href', url).attr('title', title);
            } else {
                $(label).html(fileName);
                $(label).removeClass("hidden");
            }
        },
        showUpload: function (id) {
            var root = $("#" + id).closest('.file-upload-list-root');
            var link = $(root).find(".file-upload-list-link");
            var label = $(root).find(".file-upload-list-text");
            var button = $(root).find(".file-upload-list-button");
            var removeButton = $(root).find(".file-upload-remove-list-button");
            $("#" + id).val("");
            $(root).attr(jgUtils.uploadMultiple.docNameAttr, '');
            $(root).attr(jgUtils.uploadMultiple.newDocAttr, '0');
            $(button).removeClass("hidden");
            $(link).addClass('hidden');
            $(label).addClass("hidden");
            $(removeButton).addClass("hidden");
            $(label).html('');
            $(link).html('').attr('href', 'javascript:void(0);');
        },
        isDocumentSelected: function (id) {
            var rv = false;
            var root = $("#" + id).closest(".file-upload-list-root");
            if ($(root).attr(jgUtils.uploadMultiple.docNameAttr).length === 0) rv = true;
            return rv;
        },
        isNewDocument: function (id) {
            var rv = false;
            var root = $("#" + id).closest(".file-upload-list-root");
            if ($(root).attr(jgUtils.uploadMultiple.newDocAttr).length === '1') rv = true;
            return rv;
        },
        showHideUploadList: function (docList) {
            if (typeof docList !== typeof undefined) {
                var pageControls = docList.find(".file-upload-list-root:not([document-name])");
                $(pageControls).find(".file-upload-list-link").addClass("hidden")
                $(pageControls).find(".file-upload-list-text").addClass("hidden")
                $(pageControls).find(".file-upload-list-button").addClass("hidden")
                $(pageControls).find(".file-upload-remove-list-button").addClass("hidden")
                $($(pageControls)[0]).find(".file-upload-list-text").removeClass("hidden")
                $($(pageControls)[0]).find(".file-upload-list-button").removeClass("hidden")
            }
        }
    },
    setMessage: function (messageType, messageContent) {
        switch (messageType) {
            case "warning":
                jgUtils.removeMessages();
                $("div.message-panel").addClass("warning").removeClass("hidden");
                $("div.message-panel").find("span").addClass("message-text-warning").html(messageContent);
                break;
            case "information":
                jgUtils.removeMessages();
                $("div.message-panel").addClass("success").removeClass("hidden");
                $("div.message-panel").find("span").addClass("message-text-success").html(messageContent);
                break;
            case "error":
                jgUtils.removeMessages();
                $("div.message-panel").addClass("failure").removeClass("hidden");
                $("div.message-panel").find("span").addClass("message-text-failure").html(messageContent);
                break;
            case "default":
                jgUtils.removeMessages();
                var msgCtrl = $(".msgs-jg");
                var msgList = $(msgCtrl).find(".msg-list");
                var errorTitle = '<span class="db error-title">' + $('#error-text-div').attr('data-error-title') + '</span>';
                if ($(msgList).attr('data-error-title') !== '') { errorTitle = '<span class="db">' + $(msgList).attr('data-error-title') + '</span>'; }
                var list = errorTitle;
                list += '<ul role="group" class="mt10">';
                if ($.isArray(messageContent)) {
                    if (messageContent.length > 0) {
                        if (typeof messageContent[0] === "string") { for (var i = 0, len = messageContent.length; i < len; i++) { list += '<li>' + messageContent[i] + '</li>'; } }
                        else { for (var i = 0, len = messageContent.length; i < len; i++) { list += '<li>' + messageContent[i].Message + '</li>'; } }
                    }
                }
                else {
                    list += '<li>' + messageContent + '</li>';
                }
                list += '</ul>';
                $(msgList).html(list);
                $(msgCtrl).removeClass("hidden");
                $(msgCtrl).find('button.msgs-jg-hide').focus();
                $(msgCtrl).attr('data-msg-new', '1');
                break;
        }
    },
    removeMessages: function () {
        $("div.message-panel").removeClass("success failure warning").addClass("hidden");
        $("div.message-panel").find("span").removeClass("message-text-warning message-text-failure message-text-success").text("");
    },
    removeBusinessMessages: function () {
        var msgCtrl = $(".msgs-jg");
        $(msgCtrl).find(".msg-list").html('');
        $(msgCtrl).addClass("hidden");
        $(msgCtrl).attr('data-msg-new', '0');
    },
    messageSeverity: {
        DEFAULT: "default",
        ERROR: "error",
        INFORMATION: "information",
        WARNING: "warning"
    },
    postForm: function (actionName) {
        $("#__Action").val(actionName);
        $('form').submit();
        $("#__Action").val("");
    },
    autocomplete: function (ctrl, postUrl, modelProperty) {
        $('#' + ctrl).autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: postUrl,
                    data: "{ " + modelProperty + ": '" + request.term.replace(/'/g, "") + "' }",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataFilter: function (data) { return data; },
                    success: function (data) {
                        response($.map(data.d, function (item) {
                            return {
                                value: item
                            }
                        }))
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                    }
                });
            },
            select: function (event, ui) { $('#' + ctrl).val($.trim(ui.item.value)); return false; },
            minLength: 2
        });
    },
    ieVersion: function () {
        var rv = -1;
        if (navigator.appName == 'Microsoft Internet Explorer') {
            var ua = navigator.userAgent;
            var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
            if (re.exec(ua) != null)
                rv = parseFloat(RegExp.$1);
        }
        else if (navigator.appName == 'Netscape') {
            var ua = navigator.userAgent;
            var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
            if (re.exec(ua) != null)
                rv = parseFloat(RegExp.$1);
        }
        return rv;
    },
    table: {
        init: function () {
            $(".cwds-resp-table").each(function () {
                jgUtils.table.process($(this));
            });
        },
        process: function (tbl) {
            var index = -1;
            var colPos = -1;
            var colCI = [];
            var colHI = [];
            var colHeader = [];
            $(tbl).find("tr:first").find("th").each(function () {
                index = index + 1;
                if ($(tbl).hasClass("resp-col-dest")) { colPos = index; }
                else if ($(tbl).hasClass("resp-col-copy")) {
                    colCI.push(index);
                    colHeader.push($(tbl).text());
                    $(tbl).addClass("hidden-sm hidden-xs");
                }
                else if ($(tbl).hasClass("resp-col-hide")) {
                    colHI.push(index);
                    $(tbl).addClass("hidden-sm hidden-xs");
                }
            });
            if (colPos >= 0) {
                $(this).find("tr").not(":first").each(function () {
                    var html = '<div class="mt5 hidden-lg hidden-md">';
                    for (var i = 0, len = colCI.length; i < len; i++) {
                        var d = $(tbl).find("td").get(colCI[i]);
                        $(d).addClass("hidden-sm hidden-xs");
                        html += '<div><label class="bold">' + colHeader[i] + '</label>: &nbsp;' + d.innerHTML + '</div>';
                    }
                    html += '</div>';
                    $($(tbl).find("td").get(colPos)).append(html);
                    for (var i = 0, len = colHI.length; i < len; i++) { $($(tbl).find("td").get(colHI[i])).addClass("hidden-sm hidden-xs"); }
                });
            }
        }
    },

    jgTabs: {
        init: function () {
            $(".cc-jg-tabs a").click(function (e) {
                $(this).tab('show');
            });
            $(".cc-jg-tabs li.active a").each(function () {
                $(this).tab('show');
                var tabContentId = $(this).attr('href');
                $(this).closest('.cc-jg-tabs').find('.tab-content ' + tabContentId).addClass('active');
            });
        }
    },

    messages: {
        init: function () {
            $(".msgs-jg").find(".msgs-jg-hide").click(function (e) {
                jgUtils.messages.hide();
            });
        },
        success: function (msgs) {
            jgUtils.messages.__show(msgs, "bs-callout-success");
        },
        danger: function (msgs) {
            jgUtils.messages.__show(msgs, "bs-callout-danger");
        },
        error: function (msgs) {
            jgUtils.messages.__show(msgs, "bs-callout-danger");
        },
        info: function (msgs) {
            jgUtils.messages.__show(msgs, "bs-callout-info");
        },
        warning: function (msgs) {
            jgUtils.messages.__show(msgs, "bs-callout-warning");
        },
        hide: function () {
            var msg = $(".msgs-jg");
            $(msg).addClass("hidden");
            $(msg).find(".msg-list").addClass("hidden");
        },
        clear: function () {
            var msg = $(".msgs-jg");
            $(msg).addClass("hidden");
            $(msg).find(".msg-list").addClass("hidden");
        },
        __show: function (msgs, cls) {
            var msgCtrl = $(".msgs-jg");
            var list = '';
            $(msgCtrl).find(".bs-callout").removeClass("bs-callout-warning").removeClass("bs-callout-success").removeClass("bs-callout-info").removeClass("bs-callout-danger");
            $(msgCtrl).find(".bs-callout").addClass(cls);

            if ($.isArray(msgs)) {
                if (msgs.length > 1) {
                    if (cls == 'bs-callout-danger') list += '<span class="db">Please check the following error messages:</span>';
                    list += '<ul class="mt10">';
                    for (var i = 0, len = msgs.length; i < len; i++) {
                        if (typeof (msgs[i]) === "string") { list += '<li>' + msgs[i] + '</li>'; }
                        else { list += '<li>' + msgs[i].Message + '</li>'; }
                    }
                    list += '</ul>';
                } else if (msgs.length === 1) {
                    if (typeof (msgs[0]) === "string") { list += '<strong>' + msgs[0] + '</strong>'; }
                    else { list += '<strong>' + msgs[0].Message + '</strong>'; }
                }
            }
            else {
                if (typeof msgs === "string") { list += '<strong>' + msgs + '</strong>'; }
                else { list += '<strong>' + msgs.Message + '</strong>'; }
            }

            $(msgCtrl).find(".msg-list").removeClass("hidden");
            $(msgCtrl).find(".msg-list").html(list);
            $(msgCtrl).removeClass("hidden");
            $('html, body').animate({ scrollTop: 0 }, 'fast');
            $(msgCtrl).find('button.msgs-jg-hide').focus();
            $(msgCtrl).attr('data-msg-new', '1');
        }
    },

    date: {
        isValid: function (dateValue) {
            if (!jgUtils.isUndefinedOrNullOrBlank(dateValue) && !isNaN(Date.parse(dateValue))) {
                var oldestDate = new Date("01/01/1901");
                if ((new Date(dateValue)) < oldestDate) {
                    return false;
                }
                return true;
            }
            return false;
        },
        isFutureDate: function (dateValue) {
            if (!jgUtils.isUndefinedOrNullOrBlank(dateValue)) {
                var enteredDate = new Date(dateValue);
                var today = new Date();
                if (enteredDate > today) {
                    return true;
                }
            }
            return false;
        },
        isPastDate: function (dateValue) {
            if (!jgUtils.isUndefinedOrNullOrBlank(dateValue)) {
                var enteredDate = new Date(dateValue);
                var today = new Date();
                if (enteredDate < today) {
                    return true;
                }
            }
            return false;
        },
        isCurrentDate: function (dateValue) {
            if (!jgUtils.isUndefinedOrNullOrBlank(dateValue)) {
                var enteredDate = new Date(dateValue);
                var today = new Date();
                today = today.setHours(0, 0, 0, 0);
                enteredDate = enteredDate.setHours(0, 0, 0, 0);
                if (enteredDate === today) {
                    return true;
                }
            }
            return false;
        },
        isCurrentOrPastDate: function (dateValue) {
            if (jgUtils.date.isCurrentDate(dateValue) || jgUtils.date.isPastDate(dateValue)) {
                return true;
            }
            return false;
        },
        isCurrentOrFutureDate: function (dateValue) {
            if (jgUtils.date.isCurrentDate(dateValue) || jgUtils.date.isFutureDate(dateValue)) {
                return true;
            }
            return false;
        },
        isValidStartAndEndDate: function (startDate, endDate) {
            if (jgUtils.isUndefinedOrNullOrBlank(startDate) && jgUtils.isUndefinedOrNullOrBlank(endDate)) {
                return true;
            } else {
                if (jgUtils.isUndefinedOrNullOrBlank(startDate) && !jgUtils.isUndefinedOrNullOrBlank(endDate)) {
                    return false;
                } else {
                    var dateA = new Date(startDate);
                    var dateB = new Date(endDate);
                    if (dateA > dateB) {
                        return false;
                    }
                }
            }
            return true;
        },
        //Check the provided date is between startDate and endDate
        isDateBetween: function (startDate, endDate, checkDate) {
            if (jgUtils.isUndefinedOrNullOrBlank(startDate) || jgUtils.isUndefinedOrNullOrBlank(endDate)) {
                return false;
            } else {
                let dateA = new Date(startDate); //Start Date
                let dateB = new Date(endDate); //End Date
                let dateC = new Date(checkDate); //Date to compare
                return dateC >= dateA && dateC <= dateB;
            }
            return false;
        },
        formatDate: function (jsonDate) {
            if (!jgUtils.isUndefinedOrNullOrBlank(jsonDate)) {
                //If date format is coming as /Date(1675227600000)/ - That means its Json Date format.
                if (jsonDate.indexOf('Date') >= 0) {
                    var dateValue = new Date(parseInt(jsonDate.substr(6)));
                    //var utc = new Date(dateValue.getTime() + (dateValue.getTimezoneOffset() * 60000));
                    var utc = dateValue;
                    var dd = ('0' + String(utc.getDate())).slice(-2);
                    var mm = ('0' + String(utc.getMonth() + 1)).slice(-2);
                    return mm + '/' + dd + '/' + utc.getFullYear();
                } else {
                    let dateValue = new Date(jsonDate);
                    let dd = ('0' + String(dateValue.getDate())).slice(-2);
                    let mm = ('0' + String(dateValue.getMonth() + 1)).slice(-2);
                    return mm + '/' + dd + '/' + dateValue.getFullYear();
                }
                return jsonDate;
            }
        },
        formatDateAndTime: function (jsonDate) {
            if (!jgUtils.isUndefinedOrNullOrBlank(jsonDate)) {
                //If date format is coming as /Date(1675227600000)/ - That means its Json Date format.
                if (jsonDate.indexOf('Date') >= 0) {
                    var dateValue = new Date(parseInt(jsonDate.substr(6)));
                    //var utc = new Date(dateValue.getTime() + (dateValue.getTimezoneOffset() * 60000));
                    var utc = dateValue;
                    var dd = ('0' + String(utc.getDate())).slice(-2);
                    var mm = ('0' + String(utc.getMonth() + 1)).slice(-2);
                    var yyyy = utc.getFullYear();
                    var hours = utc.getHours() % 12;
                    hours = (hours ? hours : 12);
                    var timeStamp = ('0' + String(hours)).slice(-2) + ':' + ('0' + String(utc.getMinutes())).slice(-2) + ':' + ('0' + String(utc.getSeconds())).slice(-2);
                    return mm + '/' + dd + '/' + yyyy + ' ' + timeStamp + ' ' + (utc.getHours() >= 12 ? 'PM' : 'AM');
                }
                return jsonDate;
            }
        },
        isValidDateRangeInDays: function (startDate, endDate, numberOfDays) {
            if (jgUtils.isUndefinedOrNullOrBlank(startDate) || jgUtils.isUndefinedOrNullOrBlank(endDate)) {
                return false;
            } else {
                var dateA = new Date(startDate);
                var dateB = new Date(endDate);
                var calculatedDays = Math.round((dateB - dateA) / (1000 * 60 * 60 * 24));
                //console.log(calculatedDays);
                if (calculatedDays > numberOfDays) {
                    return false;
                }
            }
            return true;
        },
        getCurrentDate: function () {
            let _currentDate = new Date();
            return ((_currentDate.getMonth() > 8) ? (_currentDate.getMonth() + 1) : ('0' + (_currentDate.getMonth() + 1))) + '/' + ((_currentDate.getDate() > 9) ? _currentDate.getDate() : ('0' + _currentDate.getDate())) + '/' + _currentDate.getFullYear();
        },
        getStateFiscalYearCount: function (startDate, endDate) {
            let _yearCount = 0;
            if (!jgUtils.isUndefinedOrNullOrBlank(startDate) && !jgUtils.isUndefinedOrNullOrBlank(endDate) && jgUtils.date.isValid(startDate) && jgUtils.date.isValid(endDate)) {
                let sDate = new Date(startDate);
                let eDate = new Date(endDate);
                let defaultFiscalStartDate = new Date('07/01/' + sDate.getFullYear()); //State Fiscal year starts on 1st July.
                while (sDate <= eDate) { //Equal to if End date is 1st July of any year
                    //Consider the fiscal year, if start date is prior to next fiscal year begin date, else don't. Then continue check till endDate. 
                    if (sDate < defaultFiscalStartDate) {
                        sDate = defaultFiscalStartDate;
                    } else {
                        sDate.setFullYear(sDate.getFullYear() + 1);
                    }
                    _yearCount++;
                }
            }
            return _yearCount;
        }
    },

    form: {
        focusInputId: '',
        init: function () {
            //PACL Script is not having same JS code as CWDS because in PACL, we do not have Participant search in header.

            //TODO: Add other required code.
            jgUtils.form.maskCurrencyFields();
        },
        hideOrShowCountyByState: function (stateDropdown, isChangeEvent) {
            var countyDropdown = $(stateDropdown).closest('.row').parent().find("select.county-dropdown");
            if (jgUtils.isUndefinedOrNull(countyDropdown) || countyDropdown.length <= 0) {
                countyDropdown = $(stateDropdown).closest('.row').parent().parent().find("select.county-dropdown");
            }

            if (isChangeEvent) {
                countyDropdown.val((countyDropdown.find("option[value='0']").length > 0 ? '0' : ''));
            }

            if (!jgUtils.isUndefinedOrNullOrBlank(stateDropdown.val()) && stateDropdown.val() === 'PA') {
                countyDropdown.find("option[value='999']").prop("disabled", true).addClass("hidden"); //Hide Out of State County option.            
                countyDropdown.attr("aria-disabled", false).removeClass("disabled");
            } else if (jgUtils.isUndefinedOrNullOrBlank(stateDropdown.val())) {
                countyDropdown.val((countyDropdown.find("option[value='0']").length > 0 ? '0' : ''));
                countyDropdown.attr("aria-disabled", false).removeClass("disabled");
            } else {
                countyDropdown.find("option[value='999']").prop("disabled", false).removeClass("hidden").prop("selected", true); //Default to Out of State County option.
                countyDropdown.attr("aria-disabled", true).addClass("disabled");
            }
        },
        ignoreAllInputValidation: function () {
            $("form").find("input[type='hidden']").addClass("ignore");
            $("form").find("input[type='radio']").addClass("ignore");
            $("form").find("input[type='checkbox']").addClass("ignore");
            $('form').find('.cpn-req-field, .req-field, .jg-cv-req, .input-validation-error').addClass('ignore');
        },
        ignoreMainFormValidation: function (modalId) {
            jgUtils.form.ignoreAllInputValidation();
            if (!jgUtils.isUndefinedOrNullOrBlank(modalId)) {
                $('#' + modalId).find('.cpn-req-field, .req-field, .jg-cv-req, .input-validation-error').removeClass('ignore');
            }
        },
        ignoreModalFormValidation: function () {
            $("form").find("input[type='hidden']").addClass("ignore");
            $("form").find("input[type='radio']").removeClass("ignore");
            $("form").find("input[type='checkbox']").removeClass("ignore");
            $('form').find('.cpn-req-field, .req-field, .jg-cv-req, .input-validation-error').removeClass('ignore');
            $('.modal').find('.cpn-req-field, .req-field, .jg-cv-req, .input-validation-error').addClass('ignore');
        },
        clearAllInputFieldValue: function (pageSectionId) {
            if ($(pageSectionId).length > 0) {
                var inputForm = $(pageSectionId);
                inputForm.find(".form-control").val(null);
                inputForm.find("input[type='checkbox']").prop("checked", false);
                inputForm.find("input[type='radio']").prop("checked", false);
                inputForm.find("textarea").each(function () {
                    jgUtils.initTextAreaCharCount($(this));
                });
                inputForm.find(".cv-error-border").removeClass("cv-error-border");
                inputForm.find(".input-validation-error").removeClass("input-validation-error");
                inputForm.find(".field-validation-error").html('');
            }
        },
        enableFormValidationForAngularJs: function (pageSectionId) {
            //ReInitialize all the form validation rules.
            var currForm = $("form");
            currForm.removeData("validator");
            currForm.removeData("unobtrusiveValidation");
            $.validator.unobtrusive.parse(currForm);
            currForm.validate();

            if ($(pageSectionId).length > 0) {
                var inputForm = $(pageSectionId);
                inputForm.find("[data-toggle='popover']").popover();
                inputForm.find('[data-toggle="popover"]').on('show.bs.popover', function (event) {
                    //if popover is selected, hide the other selectors. 
                    $('[data-toggle="popover"]').not(this).popover('hide');
                });

                inputForm.on('click', function (event) {
                    //if user click outside of the body element, hide all popover.
                    if (!$(event.target).hasClass("tooltip-label") && !$(event.target).hasClass("popover-icon-button")) {
                        $('[data-toggle="popover"]').popover('hide');
                    }
                });

                inputForm.find(".req-label:not(:has(.requiredLabels))").append(_requiredFieldLabelText);
                inputForm.find(".form-control").each(function () {
                    if ($(this).hasClass(".req-field")) {
                        $(this).rules('add', 'required');
                    }

                    if ($(this).is("textarea")) {
                        jgUtils.initTextAreaCharCount($(this));
                    }
                });
            }
        },
        changeDropdownOptionStructureForSafari: function (elementId) {
            //iPhone Safari Browser issues as hidden class does not work for dropdown option.
            //Developer must call this method as needed on their page specific JavaScript.
            //Bug 155511 : 142010.10_Mobile_WF_Staff_CREDENTIALS RECEIVED(required) dropdown is displaying all unavailable options on mobile device
            if (isSafariBrowser && isAppleSmartDevice) {
                // add this class if want to hide disabled options
                $(elementId).find('option').each(function () {
                    var optionHidden = $(this).hasClass("hidden");
                    // only way for hidden class to work in dropdown is to manually wrap <option> in a span, and then unwrap
                    if (optionHidden === true && !($(this).parent().is('span'))) {
                        $(this).wrap('<span>');
                    } else if (optionHidden === false && $(this).parent().is('span')) {
                        $(this).unwrap();
                    }
                });
            }
        },
        bindMultiSelectDropdown: function () {
            $(".multiselect-dropdown").each(function () {
                let _allowSearch = $(this).data("live-search");
                let _defaultOptionText = $(this).data("default-option-text");
                let _changeEventFuncName = $(this).data("change-event-function");

                $(this).multiselect({
                    buttonWidth: '100%',
                    maxHeight: 300,
                    nonSelectedText: _defaultOptionText,
                    enableFiltering: _allowSearch,
                    enableCaseInsensitiveFiltering: true,
                    filterBehavior: 'text',
                    numberDisplayed: 3,
                    includeSelectAllOption: false,
                    onChange: function (option, checked, select) {
                        if (_changeEventFuncName && _changeEventFuncName !== '') {
                            //console.log(_changeEventFuncName);
                            cwds.utility.executeFunctionByName(_changeEventFuncName, checked, option);
                        }
                    }
                });
            });

            //Hack to prevent closing the dropdown menu when specific option is selected.
            $('.multiselect-container .dropdown-item').click(function (e) {
                e.stopPropagation();
            });
        },
        formatCurrency: function (originalAmount) {
            //This method will format amount value (34553.4489) to currency format: $34,553.45
            let outputAmount = '-';
            let _formatter = new Intl.NumberFormat("en-US", { style: 'currency', currency: 'USD' });
            if (!jgUtils.isUndefinedOrNullOrBlank(originalAmount) && $.isNumeric(originalAmount)) {
                outputAmount = _formatter.format(originalAmount);
            }
            return outputAmount;
        },
        maskCurrencyFields: function () {
            //Ref. Link: https://plentz.github.io/jquery-maskmoney/
            //If the maskMoney plug-in is not added in main JS, this code will not execute.
            if ($.fn.maskMoney) {
                $(".mask-currency").maskMoney('destroy');
                $(".mask-currency").maskMoney({ prefix: '$', thousands: ',', decimal: '.', affixesStay: true });

                //$(".mask-currency-2d").maskMoney({ prefix: '$', allowNegative: false, thousands: ',', decimal: '.', affixesStay: true });
                //$(".mask-currency-2d-minus").maskMoney({ prefix: '$', allowNegative: true, thousands: ',', decimal: '.', affixesStay: true });
                //$(".mask-currency-3d").maskMoney({ prefix: '$', allowNegative: false, thousands: ',', decimal: '.', precision: 3, affixesStay: true });
                //$(".mask-currency-3d-minus").maskMoney({ prefix: '$', allowNegative: true, thousands: ',', decimal: '.', precision: 3, affixesStay: true });

                $(".mask-currency").keyup(function (e) {
                    let _amountVal = '0.00';
                    if (!jgUtils.isUndefinedOrNullOrBlank($(this).val())) {
                        _amountVal = $(this).val().replaceAll(',', '').replaceAll('$', '');
                    }
                    $(this).closest(".form-group").find("input.sr-only").val(_amountVal);
                });
            }
        },

        bindMoveFocusToNextActiveInputField: function () {
            //Assign "move-to-next-on-enter" CSS class to the specific parent <div> to enable enter key to automatically move to next element.
            //NOTE: For submit actions, do not use buttons as input[type='submit'], instead always use button[type='submit']
            $(".move-to-next-on-enter").on("keydown", "input, textarea", function (e) {
                if (e.which === 13) {
                    jgUtils.moveFocusToNextElement(this);
                    return false;
                }
            });
            //This function is for Select (Dropdown). When enter hits the option will show and select an option and enter, cursor will move to next input field.
            $(".move-to-next-on-enter").on('change', 'select', function (e) {
                jgUtils.moveFocusToNextElement(this);
                return false;
            });
        },
        toggleRequiredValidation: function (changedElementId, markRequired, validationErrorText) {
            if (markRequired) {
                if (!($(changedElementId).closest(".form-group").find(".control-label").find(".requiredLabels").length > 0)) {
                    $(changedElementId).closest(".form-group").find(".control-label").append(_requiredFieldLabelText);
                }
                $(changedElementId).removeClass('ignore');
                $(changedElementId).rules('add', { required: true, messages: { required: validationErrorText } });
                $(changedElementId).attr("data-val-required", validationErrorText).removeClass("input-validation-error");
            } else {
                $(changedElementId).addClass('ignore');
                $(changedElementId).parent().find("span.requiredLabels").remove();
                $(changedElementId).parent().find(".input-validation-error").removeClass("input-validation-error");
                $(changedElementId).parent().find(".field-validation-error").html('');
                $(changedElementId).rules('remove', 'required');
            }
        }
    },
    moveFocusToNextElement: function (selector) {
        //Getting all the input fields which we need to consider for the focus.
        let allInputs = $(selector).closest(".move-to-next-on-enter").find("input[type='text'], input[type='number'], input[type='radio'], input[type='checkbox'], textarea, dropdown, select, input[type='submit'], input[type='button'], button, a.btn");
        //Excludes elements which are not visible and/or keyboard accessbile.
        let _focusableElements = allInputs.filter(':visible').filter(":not([aria-hidden='true'])");
        //Now get the next element based on current active element.
        let _nextElement = _focusableElements.eq(_focusableElements.index(selector) + 1);
        if (_focusableElements.index(selector) >= 0 && _nextElement && _nextElement.length > 0) {
            _nextElement.focus();

            //If the submit button has the "perform-enter-on-focus" CSS class then system will automatically perform click event. 
            //Best to apply it for final submit button, or "Search" button or "Lookup / Search & Select" button.
            if (_nextElement.hasClass("perform-enter-on-focus")) {
                _nextElement.trigger('click');
            }
        }
    },
    isUndefinedOrNull: function (fieldValue) {
        if (typeof (fieldValue) !== "undefined" && fieldValue !== null) {
            return false;
        }

        return true;
    },
    isUndefinedOrNullOrBlank: function (fieldValue) {
        if (typeof (fieldValue) !== "undefined" && fieldValue !== null && (fieldValue.length > 0 || $.trim(fieldValue) !== '')) {
            return false;
        }

        return true;
    },
    showLoading: function () {
        $('#wrapper').waitMe({ effect: "rotateplane", text: '<strong class="s18">Loading...</strong>', bg: 'rgba(0,0,0,0.2)', color: "#333", sizeW: '40', sizeH: '40', onClose: function () { } });
        $('.waitMe_content').css({ position: 'fixed' });
    },
    hideLoading: function () {
        $('#wrapper').waitMe('hide');
    },
    unCheckBoxes: function (element, length, checkNum) {
        for (let i = 1; i < length; i++) {
            if (i != checkNum) {
                $(element + '_' + i).prop('checked', false);
            }
        }
    }
}

//Chart JS Functions Start
function getColor(colorCode) {
    switch (colorCode) {
        case 0:
            return '#df6a78';
        case 1:
            return '#f5b75f';
        case 2:
            return '#66c796';
        case 3:
            return '#EF8B01';
        case 4:
            return '#0092D6';
    }
}

function getHighlight(colorCode) {
    switch (colorCode) {
        case 0:
            return '#db5565';
        case 1:
            return '#f4ad49';
        case 2:
            return '#51bf87';
        case 3:
            return '#EF8B01';
    }
}

function setPieChartData(chartList, chartName) {
    var donutData = [];
    var i;
    var emptyCounter = 0;

    for (i = 0; i < chartList.length; ++i) {
        if (chartList[i].chartValue === 0) {
            emptyCounter++;
        }
        var donutSection =
        {
            value: chartList[i].chartValue,
            color: getColor(chartList[i].chartColor),
            highlight: getHighlight(chartList.chartColor),
            label: chartList[i].chartString,
            hoverBackgroundColor: "#ffa500"
        };
        donutData.push(donutSection);
    }

    if (donutData.length === emptyCounter) {
        if (!jgUtils.isUndefinedOrNull(document.getElementById(chartName))) {
            var ctxDonut = document.getElementById(chartName).getContext("2d");
            var donutData = [];

            var donutSection = {
                value: 1,
                color: "#a6a6a6"
            }
            donutData.push(donutSection);

            chartList = new Chart(ctxDonut).Doughnut(donutData, {
                responsive: true,
                segmentShowStroke: true,
                segmentStrokeColor: "#fff",
                segmentStrokeWidth: 2,
                percentageInnerCutout: 45,
                animation: true,
                animationSteps: 100,
                animationEasing: "easeOutBounce",
                animateRotate: true,
                animateScale: true,
                showTooltips: false,
            });
        }
    } else {

        var myDonut = [];

        var ctxDonut = document.getElementById(chartName).getContext("2d");

        chartList = new Chart(ctxDonut).Doughnut(donutData, {
            responsive: true,
            //donut options
            segmentShowStroke: true,
            segmentStrokeColor: "#fff",
            segmentStrokeWidth: 2,
            percentageInnerCutout: 45, // This is 0 for Pie charts
            //animations
            animation: true,
            animationSteps: 100,
            animationEasing: "easeOutBounce",
            animateRotate: true,
            animateScale: true,
            //tooltips
            showTooltips: true,
            customTooltips: function (tooltip) {
                var tooltipEl = $('#chartjs-tooltip-' + chartName);
                // Hide if no tooltip
                if (!tooltip) {
                    tooltipEl.css({
                        opacity: 0
                    });
                    return;
                }
                // Set caret Position
                tooltipEl.removeClass('above below');
                tooltipEl.addClass(tooltip.yAlign);
                // Set Text
                tooltipEl.html(tooltip.text);
                // Find Y Location on page
                var top;
                if (tooltip.yAlign == 'above') {
                    top = tooltip.y - tooltip.caretHeight - tooltip.caretPadding;
                } else {
                    top = tooltip.y + tooltip.caretHeight + tooltip.caretPadding;
                }
                if (tooltipEl.hasClass("js-legend-chart-widget")) {
                    // Display, position, and set styles for font
                    tooltipEl.css({
                        opacity: 1,
                        left: tooltip.chart.canvas.offsetLeft + tooltip.x + 15 + 'px',
                        top: tooltip.chart.canvas.offsetTop + top + 75 + 'px',
                        fontFamily: tooltip.fontFamily,
                        fontSize: tooltip.fontSize,
                        fontStyle: tooltip.fontStyle,
                    });
                } else if (tooltipEl.hasClass("js-tabbed-chart-widget")) {
                    // Display, position, and set styles for font
                    tooltipEl.css({
                        opacity: 1,
                        left: tooltip.chart.canvas.offsetLeft + tooltip.x + 15 + 'px',
                        top: tooltip.chart.canvas.offsetTop + top + 'px',
                        fontFamily: tooltip.fontFamily,
                        fontSize: tooltip.fontSize,
                        fontStyle: tooltip.fontStyle,
                    });
                } else {
                    // Display, position, and set styles for font
                    tooltipEl.css({
                        opacity: 1,
                        left: tooltip.chart.canvas.offsetLeft + tooltip.x + 'px',
                        top: tooltip.chart.canvas.offsetTop + top + 'px',
                        fontFamily: tooltip.fontFamily,
                        fontSize: tooltip.fontSize,
                        fontStyle: tooltip.fontStyle,
                    });
                }

            }
            //tooltipFillColor: "#344154",
            //tooltipFontFamily: "'Roboto'",
            //tooltipFontSize: 13,
            //tooltipFontColor: "#fff",
            //tooltipYPadding: 8,
            //tooltipXPadding: 10,
            //tooltipCornerRadius: 2,
            //tooltipTitleFontFamily: "'Roboto'", 

        });

        $("#" + chartName).click(
            function (e) {
                var activePoints = chartList.getSegmentsAtEvent(e);
                if (Object.keys(activePoints).length > 0) {
                    var label = activePoints[0]["label"];
                    var controller = chartName.substring(0, chartName.indexOf("-chart"));
                    $("[ng-controller='" + controller + "']").find("[title*='" + activePoints[0]["label"] + "']")[0].click();
                    //$("[ng-controller='" + controller + "']").find("[title*='" + activePoints[0]["label"] + "']")[0].click();
                    //$("[title*='" + activePoints[0]["label"] + "']")[0].click();
                }
            });
    }
}
//Chart JS Functions End


//Adding functions for PdfMake to call from JavaScript
var cwdsPdfMake = {
    showHideLoading: function (showLoading) {
        if (showLoading) {
            jgUtils.isUndefinedOrNullOrBlank(cwds.dialog.activeDialog) ? jgUtils.showLoading() : cwds.dialog.showLoading(cwds.dialog.activeDialog);
        }
        else {
            jgUtils.isUndefinedOrNullOrBlank(cwds.dialog.activeDialog) ? jgUtils.hideLoading() : cwds.dialog.hideLoading(cwds.dialog.activeDialog);
        }
    },
    generatePdfFromApi: function (apiUrl, apiData, downloadFileName, openInNewTab, printRedirectUrl) {
        apiData.apiOperationContext = cwdsapi.getOperationContext();
        var urlTest = printRedirectUrl; // Adding this temp variable as printRedirectUrl is becoming undefined in the success call.
        cwdsPdfMake.showHideLoading(true);
        $.ajax({
            type: "POST",
            url: apiUrl,
            data: JSON.stringify(apiData),
            contentType: 'application/json;charset=utf-8',
            dataType: "json",
            success: function (data) {
                cwdsPdfMake.showHideLoading(false);
                //console.log(data);
                eval('var jsonData = ' + data);
                //console.log(sampleData);
                if (downloadFileName === undefined || downloadFileName === null || downloadFileName === '') {
                    if (openInNewTab === undefined || openInNewTab === null || openInNewTab === false) {
                        pdfMake.createPdf(jsonData).download();
                    } else {
                        pdfMake.createPdf(jsonData).open();
                    }
                } else {
                    if (openInNewTab === undefined || openInNewTab === null || openInNewTab === false) {
                        pdfMake.createPdf(jsonData).download(downloadFileName);
                    } else {
                        pdfMake.createPdf(jsonData).open();
                    }
                }

                //Redirect to this page, after generating the PDF.
                if (urlTest !== undefined && urlTest !== null && urlTest !== '') {
                    //window.location.href = printRedirectURL.replace(/amp;/g, '');
                    var url = urlTest.replace(/amp;/g, '');
                    //Redirect to this page, after generating the PDF. Adding timeout to wait for pdf generation
                    setTimeout(function () {
                        if (url !== undefined && url !== null && url !== '') {
                            window.location.href = url;
                        }
                    }, 200);
                }

                //Hide Loading based on model popup or main screen.
                if (cwds.dialog.activeDialog && cwds.dialog.activeDialog !== '') {
                    cwds.dialog.hideLoading(cwds.dialog.activeDialog);
                } else {
                    jgUtils.hideLoading();
                }
            },
            error: function (ts) {
                //console.log(data);
                if (ts.status === 400) {
                    var url = window.location.href;
                    window.location.href = url.split('/', 4).join('/') + '/error';
                } else {
                    alert("System encounter an error while calling Api. Please try again.\nError Code: " + (ts.status) + ' - ' + ts.responseText);
                }

                //Hide Loading based on model popup or main screen.
                cwdsPdfMake.showHideLoading(false);
                if (cwds.dialog.activeDialog && cwds.dialog.activeDialog !== '') {
                    cwds.dialog.hideLoading(cwds.dialog.activeDialog);
                } else {
                    jgUtils.hideLoading();
                }
            }
        });
    },
    generatePdfFromJson: function (jsonData, downloadFileName, openInNewTab) {
        if (jsonData === undefined || jsonData === null || $.isEmptyObject(jsonData)) {
            alert("Missing Pdf Data. Render JsonDataForPdfMake property in ViewModel with actual data.");
            return;
        }
        if (downloadFileName === undefined || downloadFileName === null || downloadFileName === '') {
            if (openInNewTab === undefined || openInNewTab === null || openInNewTab === false) {
                pdfMake.createPdf(jsonData).download();
            } else {
                pdfMake.createPdf(jsonData).open();
            }
        } else {
            if (openInNewTab === undefined || openInNewTab === null || openInNewTab === false) {
                pdfMake.createPdf(jsonData).download(downloadFileName);
            } else {
                pdfMake.createPdf(jsonData).open();
            }
        }
    },
    convertSvgToPng: function (base64) {
        let canvas = document.createElement('canvas');
        let img = document.createElement('img');
        img.src = base64;

        canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);

        return canvas.toDataURL('image/png');
    }
};
/*
''' -----------------------------------------------------------------------------
''' Project	 : JobGateWay-MVC
''' Script   : jg-search.js
''' -----------------------------------------------------------------------------
''' <remarks>
''' Copyright © 2016 Commonwealth of Pennsylvania. All Rights Reserved
''' </remarks>
''' <history>
'''     [c-abhuma]    11/28/2015    WUDB00055033    R10.4: Created
'''     [c-lvallurp]  07/27/2018    38326          R12.2: Added title function for IEP Plan Authentication
...     [c-vashah]  02/15/2022  Issue 114942     R15.4: Resolving the issue with duplicate filter for slider column 'Days In Status'-function resetSelectedFacet
''' </history>
''' -----------------------------------------------------------------------------
*/
/*global getSearchCriteria, closeDialogCallBack */
$(function () {
    $(document).ready(function () {
        cwds.init();
    });
});

var cwds = {

    init: function () {
        cwds.search.init();
        cwds.dialog.init();
        cwds.widget.init();
        cwds.searchTipsTable.init();
        cwds.list.init();
    },
    intSearchResults: function (excludeFacets) {
        cwds.search.bindEvents();
        if (!excludeFacets) { cwds.facet.bindEvents(); }
        setTimeout(function () {
            cwds.search.resetSelected();

        }, 0);
    },
    intListResults: function (controller) {
        cwds.list.bindEvents(controller);
    },
    utility: {
        submitForm: function (actionName) {
            $("#__Action").val(actionName);
            cwds.utility.disableValidators();
            $('form').submit();
        },
        disableValidators: function () {
            $('.' + jgUtils.class.req).addClass("ignore");
        },
        queryString: function () {
            var qs;
            return (location.search && location.search.length > 1) ? qs = window.location.search.substring(1) : "";
        },
        queryStringParamByName: function (name) {
            name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
                results = regex.exec(location.search);
            return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
        },
        escapeQuotes: function (str) {
            return str.toString().replace(/'/g, "\\'").replace(/"/g, '\\"');
        },
        createCookie: function (name, value, days) {
            if (days) {
                var date = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                var expires = "; expires=" + date.toGMTString();
            }
            else var expires = "";
            document.cookie = name + "=" + value + expires + "; path=/";
        },
        deleteCookie: function (name) {
            cwds.utility.createCookie("ExcelFileDownloaded", "", -1);
        },
        getCookie: function (cname) {
            var name = cname + "=";
            var ca = document.cookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') {
                    c = c.substring(1);
                }
                if (c.indexOf(name) == 0) {
                    return c.substring(name.length, c.length);
                }
            }
            return "";
        },
        executeFunctionByName: function (functionName, /*, args */) {
            var context = window;
            var args = Array.prototype.slice.call(arguments, 1);
            var namespaces = functionName.split(".");
            var func = namespaces.pop();
            for (var i = 0; i < namespaces.length; i++) {
                context = context[namespaces[i]];
            }
            return context[func].apply(context, args);
        }
    },
    widget: {
        isPagination: false,
        searchParams: [],
        widgetActiveTab: '',
        init: function () {
            var pg = $(".panel .panel-footer .panel-pagination");
            $(pg).find("a.page-first").click(function () {
                if (!$(this).hasClass("not-active")) {
                    cwds.widget.isPagination = true;
                    cwds.widget.paginate($(this), 1);
                }
            });
            $(pg).find("a.page-previous").click(function () {
                if (!$(this).hasClass("not-active")) {
                    cwds.widget.isPagination = true;
                    cwds.widget.paginate($(this), parseInt($(this).closest(".panel-pagination").attr("data-pagination-page")) - 1);
                }
            });
            $(pg).find("a.page-next").click(function () {
                if (!$(this).hasClass("not-active")) {
                    cwds.widget.isPagination = true;
                    cwds.widget.paginate($(this), parseInt($(this).closest(".panel-pagination").attr("data-pagination-page")) + 1);
                }
            });
            $(pg).find("a.page-last").click(function () {
                if (!$(this).hasClass("not-active")) {
                    cwds.widget.isPagination = true;
                    cwds.widget.paginate($(this), parseInt($(this).closest(".panel-pagination").attr("data-pagination-pages")));
                }
            });
            $(".panel.widget").each(function () {
                if ($(this).attr('data-widget-default-search') === "True") {
                    angular.element(this).scope().load(1, this);
                }
            });
            $(".panel.widget .panel-heading a").click(function (e) {
                if ($(this).attr("data-widget-action-post") === "True") {
                    e.preventDefault();
                    cwds.utility.submitForm($(this).closest(".panel.widget").attr("data-widget-name") + $(this).attr("data-widget-action"));
                }
            });
            $(".panel.widget .widget-tabs a").click(function (e) {
                e.preventDefault();
                var wid = $(this).closest('.panel.widget');
                var widgetName = $(wid).attr('data-widget-name');
                angular.element(wid).scope().widgetActiveTab = $(this).attr('href').replace('#' + widgetName, '');
                $(this).tab('show');

                angular.element(wid).scope().load(1, wid);
            });
            $(".panel.widget .widget-tabs li.active a").each(function () {
                var wid = $(this).closest('.panel.widget');
                var widgetName = $(wid).attr('data-widget-name');
                angular.element(wid).scope().widgetActiveTab = $(this).attr('href').replace('#' + widgetName, '');
                $(this).tab('show');

                angular.element(wid).scope().load(1, wid);
                var tabContentId = $(this).attr('href');
                $(this).closest('.panel.widget').find('.tab-content ' + tabContentId).addClass('active');
            });
        },
        paginate: function (pLink, pageNumber) {
            var wc = $(pLink).closest(".panel");
            angular.element(wc).scope().load(pageNumber, wc);
        },
        search: function (widgetName, param) {
            var widget = $(".panel.widget[data-widget-name='" + widgetName + "']");
            var pos = -1;
            for (var i = 0; i < cwds.widget.searchParams.length; i++) {
                if (cwds.widget.searchParams[i].name === widgetName) {
                    pos = i;
                    break;
                }
            }
            if (pos >= 0) {
                cwds.widget.searchParams[pos].param = param;
            } else {
                cwds.widget.searchParams.push({ "name": widgetName, "param": param });
            }
            angular.element(widget).scope().load(1, widget);
        },
        getSearchParam: function (widgetName) {
            var param = null;
            for (var i = 0; i < cwds.widget.searchParams.length; i++) {
                if (cwds.widget.searchParams[i].name === widgetName) {
                    param = cwds.widget.searchParams[i].param;
                    break;
                }
            }
            return param;
        },
        set: function (wResponse, widgetName) {
            var pClass = "not-active text-muted";
            var widget = $(".panel.widget[data-widget-name='" + widgetName + "']");
            var pagePanel = $(widget).find(".panel-pagination");
            $(pagePanel).attr("data-pagination-total", wResponse.totalCount);
            $(pagePanel).attr("data-pagination-page", wResponse.pageNumber);
            $(pagePanel).attr("data-pagination-pages", wResponse.pages);
            //MB - added for no data in widgets with multiple tabs
            $(".tab-nfm-" + wResponse.widgetActiveTab).closest("div.panel-block").find("[class*='tab-nfm-']").addClass("hidden");
            if (wResponse.list && wResponse.list.length > 0) {
                $(widget).find(".panel-footer").removeClass("hidden");
                $(widget).find(".panel-body .no-data-list").addClass("hidden");
                $(widget).find(".panel-body .data-list").removeClass("hidden");
                $(widget).find(".panel-body .process-error").addClass("hidden");
                $(pagePanel).find(".w-pager").removeClass("not-active").removeClass("text-muted");
                $(pagePanel).find(".w-pager").removeAttr('disabled').attr('aria-disabled', 'false');

                if (wResponse.pages === 1) { $(pagePanel).find(".w-pager").addClass(pClass); }
                else {
                    if (wResponse.pageNumber === 1) {
                        $(pagePanel).find(".page-first,.page-previous").addClass(pClass).attr('disabled', 'disabled').attr('aria-disabled', 'true');
                        if (cwds.widget.isPagination) {
                            $(pagePanel).find(".page-next").focus();
                            cwds.widget.isPagination = false;
                        }
                    }
                    else if (wResponse.pageNumber === wResponse.pages) {
                        $(pagePanel).find(".page-next,.page-last").addClass(pClass).attr('disabled', 'disabled').attr('aria-disabled', 'true');
                        if (cwds.widget.isPagination) {
                            $(pagePanel).find(".page-previous").focus();
                            cwds.widget.isPagination = false;
                        }
                    }
                }
                $(widget).find(".panel-footer").find(".paginate-details").html(wResponse.pageNumber + "/" + wResponse.pages);
            }
            else {
                //MB - added for no data in widgets with multiple tabs
                $(".tab-nfm-" + wResponse.widgetActiveTab).removeClass("hidden");
                $(widget).find(".panel-footer").addClass("hidden");
                $(widget).find(".panel-body .no-data-list").removeClass("hidden");
                $(widget).find(".panel-body .data-list").addClass("hidden");
                $(widget).find(".panel-body .process-error").addClass("hidden");
            }
            $(widget).waitMe("hide");
        },
        error: function (response, widgetName) {
            var widget = $(".panel.widget[data-widget-name='" + widgetName + "']");
            $(widget).find(".panel-body .no-data-list").addClass("hidden");
            $(widget).find(".panel-body .data-list").addClass("hidden");
            $(widget).find(".panel-body .process-error").removeClass("hidden");
            $(widget).waitMe("hide");
        },
        setSpinner: function (widgetName) {
            var widget = $(".panel.widget[data-widget-name='" + widgetName + "']");
            $(widget).waitMe({ effect: "rotateplane", text: '', bg: 'rgba(255,255,255,0.7)', color: "#bac3d2", /* sizeW : '32', sizeH : '32'*/ });
        },
        removeSpinner: function (widgetName) {
            var widget = $(".panel.widget[data-widget-name='" + widgetName + "']");
            $(widget).waitMe("hide");
        },
        reload: function (link) {
            var w = $(link).closest('.panel.widget');
            angular.element(w).scope().load(1, w);

        },
        resetActionTitle: function (widgetName, cssClass, titleText) {
            switch (cssClass) {
                case "panel-add":
                    titleText += ": Add"
                    $("[ng-controller='" + widgetName + "']").find("." + cssClass).attr('title', titleText);
                    break;
                case "panel-refresh":
                    titleText += ": Refresh"
                    $("[ng-controller='" + widgetName + "']").find("." + cssClass).attr('title', titleText);
                    break;
                case "panel-edit":
                    titleText += ": Edit"
                    $("[ng-controller='" + widgetName + "']").find("." + cssClass).attr('title', titleText);
                    break;
                case "ViewAll":
                    titleText += ": "
                    $("[ng-controller='" + widgetName + "']").find("." + cssClass).attr('aria-label', titleText);
                    break;
            }
        },
        executeScriptCallBack: function (resp, controller) {
            let ct = $(".widget[ng-controller='" + controller + "']");
            let scriptCallBack = $(ct).attr('data-widget-script-callback');
            if (scriptCallBack) {
                cwds.utility.executeFunctionByName(scriptCallBack, resp.pageNumber, resp.totalCount, resp);
            }
        }
    },
    multipleFacets: {
        selectedFacets: [],
        appliedFacetCount: 0,
        activeSlider: '',
        clearAllFacets: false,
        bindMultipleEvents: function () {
            $("#ChooseMultiple .facet-multiple-select .facet-items-container").find(":checkbox, :radio").click(function () {
                cwds.multipleFacets.selectFilter($(this));
            });

            $("#ChooseMultiple .facet-multiple-select .facet-items-container .facet-dropDown").on("change", function () {
                cwds.multipleFacets.selectDropDownTypeFilter($(this));
            });
        },
        bindFacetEvents: function () {
            $("#ChooseMultiple .facet-multiple-select .facet-items").click(function () {
                var ctrl = $(this);
                cwds.multipleFacets.bindFacetItems(ctrl);
            });

            $("#DialogContent_DialogApplyButton").click(function () {
                cwds.facet.applied = JSON.parse(JSON.stringify(cwds.multipleFacets.selectedFacets))
                if ($('.sort-by-mobile select').val()) {
                    var selectedSortOption = $('.sort-by-mobile select').val();
                    var searchDiv = $(this).closest(".search-page").find('.search');
                    var sortIcon = $(searchDiv).find(".sort-atoz");
                    var sortByCtrl = $(searchDiv).find('.sortby-section select');
                    $(sortByCtrl).val(selectedSortOption);
                    cwds.search.setSortOrder(sortByCtrl, sortIcon);
                }
                angular.element($(".search")).scope().search($(".search").attr("ng-controller"), 1, $(".search"), false);
            });
            $("#ChooseMultiple .facet-items-select select").on("change", function () {
                var ct = $(this).closest(".facet-multiple-select");
                var facetName = $(this).val();
                var searchDiv = $(".search");
                var searchFacetApi = $(searchDiv).attr('search-api').replace("GetSearchResults", "GetFacet");
                cwds.search.refreshSearchCriteria();
                angular.element($(ct)).scope().getFacetItems($(searchDiv).attr("ng-controller"), $(ct), facetName, searchFacetApi);
            });

            //Clear all Facet filters
            $("a.clear-all-facet-filter").on('click', function () {
                var ct = $(this).closest(".search"); //TODO: Need to check
                //Remove all selected facet checkbox and items
                //$(".modal-facet .facet-selected .filter-selected-body .filter-selected").each(function () {
                //set boolean to detect to clear facets when removing selected
                cwds.multipleFacets.clearAllFacets = true;
                $(this).parent().siblings().each(function () {
                    cwds.multipleFacets.removeSelected(this);
                });
                cwds.multipleFacets.clearAllFacets = false;
                //Clear Facet Applied list
                //cwds.facet.applied.length = 0;
                //remove any existing active classes
                $(".facet-items-list .active").removeClass("active");
                //for mobile view: TODO: need to confirm
                $(".search-filter-icon #facetcount").empty().append(cwds.multipleFacets.appliedFacetCount);
                if ($(".search-filter-icon #facetcount").html() !== '' && parseInt($(".search-filter-icon #facetcount").html()) > 0) {
                    $(".search-filter-icon .show-facet-count").removeClass("hidden");
                } else {
                    $(".search-filter-icon .show-facet-count").addClass("hidden");
                }

                if ($(this).closest(".facet-applied-filter-container").length > 0) {
                    cwds.multipleFacets.applyFacet(ct);
                }

                $(ct).find(".code-only-grid-program-id-hidden-field").val('');
            });
        },
        applyFacet: function (ct) {
            let crt = $(".filter-selected-body");
            for (let i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                let facetName = cwds.multipleFacets.selectedFacets[i].Name;
                for (let j = 0; j < cwds.facet.applied.length; j++) {
                    if (cwds.facet.applied[j].Name === facetName) {
                        cwds.facet.applied[j].Items.length = 0;
                        for (let k = 0; k < cwds.multipleFacets.selectedFacets[i].Items.length; k++) {
                            cwds.facet.applied[j].Items.push(cwds.multipleFacets.selectedFacets[i].Items[k]);
                        }
                    }
                }
            }

            angular.element($(".search")).scope().search($(".search").attr("ng-controller"), 1, $(".search"), false);
        },
        selectDropDownTypeFilter: function (c) {
            var crt = $(c).closest('.facet-items-body').find('.facet-selected .filter-selected-body');
            var facetName = $(c).attr("data-search-facet-name");
            var facetLabel = $(c).attr("data-search-facet-label");
            var itemCode = $(c).find('option:selected').val();
            var itemValue = $(c).find('option:selected').attr('data-search-facet-item-value');
            var defaultDDSel = $('.facet-list .facet-list-items[data-search-facet-name="' + facetName + '"]').find('select').find('option:first').val();
            for (var i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                    cwds.multipleFacets.selectedFacets[i].Items.length = 0;
                    cwds.multipleFacets.selectedFacets[i].Items[0] = $(c).find('option:selected').val();
                    break;
                }
            }
            angular.element($(crt)).scope().updateDropDown($(c).closest('.search-page'), facetName, facetLabel, itemCode, itemValue, true, defaultDDSel);
        },
        selectFilter: function (c) {
            var crt = $(c).closest('.facet-multiple-select').find('.facet-selected .filter-selected-body');
            var checkBoxId = $(c).attr('id');
            var facetName = $(c).attr("data-search-facet-name");
            var facetLabel = $(c).attr("data-search-facet-label");
            var itemCode = $(c).attr("data-search-facet-code");
            var itemValue = $(c).attr("data-search-facet-value");
            var checkBoxChecked = $(c).prop('checked');
            var itemExists = false;
            var facetindex;
            for (var i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                    facetindex = i;
                    for (var j = 0; j < cwds.multipleFacets.selectedFacets[i].Items.length; j++) {
                        if (cwds.multipleFacets.selectedFacets[i].Items[j] === itemCode) {
                            itemExists = true;
                            break;
                        }
                    }
                    break;
                }
            }
            if (checkBoxChecked) {
                if (!itemExists) {
                    $('label[for= "' + checkBoxId + '" ]').attr('aria-label', 'Remove filter ' + facetLabel + ': ');
                    cwds.multipleFacets.selectedFacets[facetindex].Items.push(itemCode);
                    angular.element($(crt)).scope().addSelectedFacetLink(facetLabel, facetName, itemCode, itemValue, true);
                }
            } else {
                if (itemExists) {
                    $('label[for= "' + checkBoxId + '" ]').attr('aria-label', 'Filter results by ' + facetLabel + ': ');
                    cwds.multipleFacets.selectedFacets[facetindex].Items.splice(cwds.multipleFacets.selectedFacets[facetindex].Items.indexOf(itemCode), 1);
                    angular.element($(crt)).scope().addSelectedFacetLink(facetLabel, facetName, itemCode, itemValue, false);
                }
            }

            //3/26/2024 c-cwulfsoh - if selection input is a radio control remove all other selections for specific radio filters. Only one radio selection can be applied
            if ($(c).attr("type").toLowerCase() === "radio") {
                $(".facet-modal-body .filter-selected").each(function () {
                    selectedControl = $(this).find('a');
                    if (!jgUtils.isUndefinedOrNullOrBlank(selectedControl)) {
                        if (selectedControl.data('search-facet-name') == $(c).data('search-facet-name') && selectedControl.data('search-facet-code') != $(c).data('search-facet-code')) {
                            cwds.multipleFacets.removeSelected(this);
                        }
                    }
                });
            }
        },
        removeSelected: function (c) {
            let facetName = $(c).find("a").attr('data-search-facet-name');
            let facetItemCode = $(c).find("a").attr('data-search-facet-code');
            let facetLabel = $(c).attr("data-search-facet-label");
            let facetItemValue = $(c).text();
            let mainPageFacetRemoved = ($(c).closest(".facet-applied-filter-container").length > 0);
            //var crt = (".filter-selected-body");
            let crt = $(c).closest('.facet-multiple-select').find('.facet-selected .filter-selected-body');
            let i;
            let j;

            if ($(c).find("a").attr("data-search-facet-type") === "Slider") {
                for (i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                    if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                        cwds.multipleFacets.selectedFacets[i].Items = [];
                        break;
                    }
                }
                angular.element($(crt)).scope().removeSlider(facetName);

            } else if ($(c).find("a").attr("data-search-facet-type") === "DropDown") {
                for (i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                    if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                        cwds.multipleFacets.selectedFacets[i].Items.length = 0;
                        var defaultDDSel = $('.facet-list .facet-list-items[data-search-facet-name="' + facetName + '"]').find('select').find('option:first').val();
                        cwds.multipleFacets.selectedFacets[i].Items.push(defaultDDSel);
                        break;
                    }
                }
                angular.element($(crt)).scope().updateDropDown($(crt).closest('.search-page'), facetName, null, null, null, false, defaultDDSel);
            } else {
                for (i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                    if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                        for (j = 0; j < cwds.multipleFacets.selectedFacets[i].Items.length; j++) {
                            if (cwds.multipleFacets.selectedFacets[i].Items[j] === facetItemCode) {
                                cwds.multipleFacets.selectedFacets[i].Items.splice(cwds.multipleFacets.selectedFacets[i].Items.indexOf(facetItemCode), 1);
                                $(c).closest(".facet-multiple-select").find(".facet-items-container :checkbox[data-search-facet-name='" + facetName + "'][data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").prop('checked', false);
                                $(c).closest(".facet-multiple-select").find(".facet-items-container :radio[data-search-facet-name='" + facetName + "'][data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").prop('checked', false);
                                angular.element($(crt)).scope().addSelectedFacetLink(facetLabel, facetName, facetItemCode, facetItemValue, false);
                                break;
                            }
                        }
                        break;
                    }
                }
            }


            if (mainPageFacetRemoved && !cwds.multipleFacets.clearAllFacets) {
                let ct = $(this).closest(".search");
                cwds.multipleFacets.applyFacet(ct);
            }
        },
        bindFacetItems: function (ctrl) {
            if (!$(ctrl).closest(".facet-items").hasClass("active")) {
                $(".facet-multiple-select .active").removeClass("active");
                $(ctrl).closest(".facet-items").addClass("active");
            }
            var ct = $(ctrl).closest(".facet-multiple-select");
            var facetName = $(ctrl).find("a").attr("data-search-facet-name");
            var searchDiv = $(".search");
            var searchFacetApi = $(searchDiv).attr('search-api').replace("GetSearchResults", "GetFacet");
            cwds.search.refreshSearchCriteria();
            $(".code-only-search-modal-filter").val(null);
            angular.element($(ct)).scope().getFacetItems($(searchDiv).attr("ng-controller"), $(ct), facetName, searchFacetApi);
        },
        resetSelectedCheckBoxes: function () {
            for (var i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                if (cwds.multipleFacets.selectedFacets[i].Type !== "Slider") {
                    for (var j = 0; j < cwds.multipleFacets.selectedFacets[i].Items.length; j++) {
                        var facetName = cwds.multipleFacets.selectedFacets[i].Name;
                        var facetItemCode = cwds.multipleFacets.selectedFacets[i].Items[j];
                        $(".facet-items-container :checkbox[data-search-facet-name='" + facetName + "'][data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").prop('checked', true);
                        $(".facet-items-container :radio[data-search-facet-name='" + facetName + "'][data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").prop('checked', true);
                    }
                }
            }
        },


        bindDateFieldEventsForSlider: function () {
            $("#ChooseMultiple .facet-items-container .facet-slider .facet-cal").click(function (e) {
                $(this).closest(".input-group").find("input[type=text]").focus();
            });
            $("#ChooseMultiple .facet-items-container .facet-slider .facet-calendar").mask(jgUtils.mask.mmddyyyy);

            $("#ChooseMultiple .facet-items-container .show-toggle a").on('touchstart click', function (e) {
                if (e.type == 'touchstart') {
                    e.stopImmediatePropagation();
                }
                e.preventDefault();
                var sliderSection = $(this).closest(".facet-items-container").find(".facet-slider .slider-section");
                var dateFieldSection = $(this).closest(".facet-items-container").find(".facet-slider .date-field-section");
                if ($(this).hasClass("show-date-fields")) {
                    $(sliderSection).addClass("hidden");
                    $(dateFieldSection).removeClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-slider").removeClass("hidden");
                } else {
                    $(sliderSection).removeClass("hidden");
                    $(dateFieldSection).addClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-date-fields").removeClass("hidden");
                }
                //TODO: Need to work for integer type slide
            });

            $("#ChooseMultiple .facet-items-container .facet-slider .date-fields-apply").click(function (e) {
                e.preventDefault();
                var facetSlider = $(this).closest(".facet-items-container").find(".facet-slider");
                var facetName = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-name");
                var facetLabel = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-label");
                var dateFieldMinSel = $(facetSlider).find(".date-field-section .facet-begin-date .facet-calendar").val();
                var dateFieldMaxSel = $(facetSlider).find(".date-field-section .facet-end-date .facet-calendar").val();
                var minValue = $(facetSlider).find(".date-field-section .facet-begin-date .facet-calendar").attr("data-search-facet-slider-range").split(':')[0];
                var maxValue = $(facetSlider).find(".date-field-section .facet-begin-date .facet-calendar").attr("data-search-facet-slider-range").split(':')[1];
                var sliderType = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-slider-type");
                var sRange = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-slider-range").split(":");

                if (dateFieldMaxSel === "" || dateFieldMinSel === "" || !(Date.parse(minValue) <= Date.parse(dateFieldMaxSel)) || !(Date.parse(dateFieldMaxSel) <= Date.parse(maxValue)) || !(Date.parse(minValue) <= Date.parse(dateFieldMinSel)) || !(Date.parse(dateFieldMinSel) <= Date.parse(maxValue)) || Date.parse(dateFieldMinSel) > Date.parse(dateFieldMaxSel)) {
                    return false;
                }

                UpdateSlider(facetName, facetLabel, dateFieldMinSel, dateFieldMaxSel, sliderType, sRange);
            });

            $("#ChooseMultiple .facet-items-container .facet-slider .integer-fields-apply").click(function (e) {
                e.preventDefault();
                var facetSlider = $(this).closest(".facet-items-container").find(".facet-slider");
                var facetName = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-name");
                var facetLabel = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-label");
                var integerFieldMinSel = $(facetSlider).find(".integer-field-section .facet-begin-integer .code-only-min-number-slider").val();
                var integerFieldMaxSel = $(facetSlider).find(".integer-field-section .facet-end-integer .code-only-max-number-slider").val();
                var minValue = $(facetSlider).find(".integer-field-section .facet-end-integer .code-only-max-number-slider").attr('min');
                var maxValue = $(facetSlider).find(".integer-field-section .facet-end-integer .code-only-max-number-slider").attr('max');

                if (integerFieldMaxSel === "" || integerFieldMinSel === "" || !(parseInt(minValue) <= parseInt(integerFieldMaxSel)) || !(parseInt(integerFieldMaxSel) <= parseInt(maxValue)) || !(parseInt(minValue) <= parseInt(integerFieldMinSel)) || !(parseInt(integerFieldMinSel) <= parseInt(maxValue))) {
                    return false;
                }

                var sliderType = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-slider-type");
                var sRange = $(facetSlider).find(".facet-slider-item").attr("data-search-facet-slider-range").split(":");

                UpdateSlider(facetName, facetLabel, integerFieldMinSel, integerFieldMaxSel, sliderType, sRange);
            });

            function UpdateSlider(facetName, facetLabel, minSel, maxSel, sliderType, sRange) {
                for (var i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                    if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                        if (cwds.multipleFacets.selectedFacets[i].Items.length === 0) {
                            cwds.multipleFacets.selectedFacets[i].Items.push(minSel);
                            cwds.multipleFacets.selectedFacets[i].Items.push(maxSel);
                        } else {
                            cwds.multipleFacets.selectedFacets[i].Items[0] = minSel;
                            cwds.multipleFacets.selectedFacets[i].Items[1] = maxSel;
                        }
                        break;
                    }
                }
                var crt = (".filter-selected-body");
                angular.element($(crt)).scope().updateSlider(facetName, facetLabel, cwds.multipleFacets.selectedFacets[i].Items, sliderType, sRange);
            }
        },

        initSlider: function () {
            if ($("#ChooseMultiple .facet-items-container .facet-slider .facet-slider-item").length > 0) {
                $("#ChooseMultiple .facet-items-container .facet-slider .facet-slider-item").each(function () {
                    cwds.multipleFacets.initBootstrapSlider($(this));
                });
            } else {
                cwds.multipleFacets.activeSlider = '';
            }
        },
        initBootstrapSlider: function (ctrl) {
            var facetName = $(ctrl).attr("data-search-facet-name");
            var sliderType = $(ctrl).attr("data-search-facet-slider-type");
            var valMin;
            var valMax;
            var sRange = $(ctrl).attr("data-search-facet-slider-range").split(":");
            var sMin;
            var sMax;
            if (sliderType === 'Integer') {
                valMin = parseInt($(ctrl).attr("data-search-facet-slider-min-value"));
                valMax = parseInt($(ctrl).attr("data-search-facet-slider-max-value"));
                sMin = parseInt(sRange[0]);
                sMax = parseInt(sRange[1]);
                if (sMin < 0) {
                    sMin = 0;
                    $(ctrl).closest(".facet-slider").find(".slider-value").text(valMin + ' - ' + valMax);
                    $(ctrl).bootstrapSlider({
                        id: facetName + 'Dialog',
                        range: true,
                        min: sMin,
                        max: sMax,
                        value: [valMin, valMax]
                    });
                } else {
                    $(ctrl).closest(".facet-slider").find(".slider-value").text('0 - ' + valMin);
                    $(ctrl).bootstrapSlider({
                        id: facetName + 'Dialog',
                        range: false,
                        min: 0,
                        max: sMax,
                        value: valMin
                    });
                }
            } else {
                valMin = $(ctrl).attr("data-search-facet-slider-min-value");
                valMax = $(ctrl).attr("data-search-facet-slider-max-value");
                sMin = sRange[0];
                sMax = sRange[1];
                var sliderDefault = parseInt($(ctrl).attr("data-search-slider-default"));

                var resetSliderOnLoad = $(ctrl).attr("data-search-reset-onload");
                if (resetSliderOnLoad == "1") {
                    if (sliderDefault > 0) {
                        var minDate = new Date(sRange[0]);
                        var maxDate = new Date(sRange[1]);
                        var selMin = new Date(valMin);
                        var selMax = new Date(valMax);
                        var timeDiffSelMin = Math.abs(new Date(minDate).getTime() - new Date(selMin).getTime());
                        var daysDiffSelMin = timeDiffSelMin / (1000 * 3600 * 24);
                        var timeDiffSelMax = Math.abs(new Date(selMax).getTime() - new Date(minDate).getTime());
                        var daysDiffSelMax = timeDiffSelMax / (1000 * 3600 * 24);
                        $(ctrl).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                        $(ctrl).bootstrapSlider({
                            id: facetName + 'Dialog',
                            range: true,
                            min: 0,
                            max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                            value: [daysDiffSelMin, daysDiffSelMax],
                            formatter: function (value) {
                                return cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax)
                            }
                        });
                    } else {
                        var minDate = new Date(sRange[0]);
                        var maxDate = new Date(sRange[1]);
                        $(ctrl).closest(".facet-slider").find(".slider-value").text("No Filter");
                        $(ctrl).bootstrapSlider({
                            id: facetName + 'Dialog',
                            range: false,
                            min: 0,
                            max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                            value: [0, 0]
                        });
                    }
                } else {
                    if (sMin) {
                        var minDate = new Date(sRange[0]);
                        var maxDate = new Date(sRange[1]);
                        var selMin = new Date(valMin);
                        var selMax = new Date(valMax);
                        var timeDiffSelMin = Math.abs(new Date(minDate).getTime() - new Date(selMin).getTime());
                        var daysDiffSelMin = timeDiffSelMin / (1000 * 3600 * 24);
                        var timeDiffSelMax = Math.abs(new Date(selMax).getTime() - new Date(minDate).getTime());
                        var daysDiffSelMax = timeDiffSelMax / (1000 * 3600 * 24);
                        $(ctrl).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                        $(ctrl).bootstrapSlider({
                            id: facetName + 'Dialog',
                            range: true,
                            min: 0,
                            max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                            value: [daysDiffSelMin, daysDiffSelMax],
                            formatter: function (value) {
                                return cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax)
                            }
                        });
                    } else {
                        $(ctrl).closest(".facet-slider").find(".slider-value").text('0 - ' + valMin);
                        $(ctrl).bootstrapSlider({
                            id: facetName + 'Dialog',
                            range: false,
                            min: 0,
                            max: sMax,
                            value: valMin
                        });
                    }
                }
            }
            if (cwds.multipleFacets.activeSlider !== '') {
                $(ctrl).bootstrapSlider('refresh');
            }
            cwds.multipleFacets.activeSlider = facetName;
            $(ctrl).on("slide", function (slideEvt) {
                var sliderType = $(this).attr("data-search-facet-slider-type");
                if (sliderType == 'Integer') {

                    if (slideEvt.value) {
                        if ($.isArray(slideEvt.value)) {
                            $(this).closest(".facet-slider").find(".slider-value").text(slideEvt.value[0] + ' - ' + slideEvt.value[1]);
                        } else {
                            $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + slideEvt.value);
                        }
                    } else {
                        $(this).closest(".facet-slider").find(".slider-value").text('0');
                    }
                } else {
                    if (slideEvt.value) {
                        var sRange = $(this).attr("data-search-facet-slider-range").split(":");
                        var minVal = sRange[0];
                        var maxVal = sRange[1];
                        var selMin = new Date(minVal);
                        var selMax = new Date(minVal);
                        if ($.isArray(slideEvt.value)) {
                            selMin.setDate(selMin.getDate() + slideEvt.value[0]);
                            selMax.setDate(selMax.getDate() + slideEvt.value[1]);
                            $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            $(this).closest(".facet-slider").find(".tooltip-inner").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                        } else {
                            selMin.setDate(selMin.getDate() + slideEvt.value);
                            $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                            $(this).closest(".facet-slider").find(".tooltip-inner").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                        }
                    }
                }
            });
            $(ctrl).on("slideStop", function (slideEvt) {
                var crt = (".filter-selected-body");
                var sliderType = $(this).attr("data-search-facet-slider-type");
                var facetName = $(this).attr("data-search-facet-name");
                var facetLabel = $(this).attr("data-search-facet-label");
                var minRange = 0;
                var maxRange = 0;
                var sRange = $(this).attr("data-search-facet-slider-range").split(":");
                var sliderDefault = parseInt($(this).attr("data-search-slider-default"));
                var resetSliderOnLoad = $(this).attr("data-search-reset-onload");
                if (sliderType == 'Integer') {
                    if (slideEvt.value) {
                        if ($.isArray(slideEvt.value)) {
                            minRange = slideEvt.value[0];
                            maxRange = slideEvt.value[1];
                            $(this).closest(".facet-slider").find(".slider-value").text(minRange + ' - ' + maxRange);
                        } else {
                            minRange = slideEvt.value;
                            maxRange = 0;
                            $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + minRange);
                        }
                    }
                } else {
                    var minVal = sRange[0];
                    var maxVal = sRange[1];
                    var selMin = new Date(minVal);
                    var selMax = new Date(minVal);
                    if (resetSliderOnLoad == "1") {
                        if (sliderDefault > 0 && slideEvt.value && $.isArray(slideEvt.value)) {
                            minRange = slideEvt.value[0];
                            maxRange = slideEvt.value[1];
                            selMin.setDate(selMin.getDate() + slideEvt.value[0]);
                            selMax.setDate(selMax.getDate() + slideEvt.value[1]);
                            $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            $(this).closest(".facet-slider").find(".tooltip-inner").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                        } else {
                            if (slideEvt.value && $.isArray(slideEvt.value)) {
                                minRange = slideEvt.value[0];
                                maxRange = slideEvt.value[1];
                                selMin.setDate(selMin.getDate() + slideEvt.value[0]);
                                selMax.setDate(selMax.getDate() + slideEvt.value[1]);
                                $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                                $(this).closest(".facet-slider").find(".tooltip-inner").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));

                                if (maxRange == "0") {
                                    minRange = slideEvt.value;
                                    maxRange = 0;
                                    selMin.setDate(selMin.getDate() + slideEvt.value);
                                    $(this).closest(".facet-slider").find(".slider-value").text('No Filter');
                                    $(this).closest(".facet-slider").find(".tooltip-inner").text('0 : 0');
                                }
                            }
                        }
                    } else {

                        if (slideEvt.value) {
                            if ($.isArray(slideEvt.value)) {
                                minRange = slideEvt.value[0];
                                maxRange = slideEvt.value[1];
                                selMin.setDate(selMin.getDate() + slideEvt.value[0]);
                                selMax.setDate(selMax.getDate() + slideEvt.value[1]);
                                $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                                $(this).closest(".facet-slider").find(".tooltip-inner").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            } else {
                                minRange = slideEvt.value;
                                maxRange = 0;
                                selMin.setDate(selMin.getDate() + slideEvt.value);
                                $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                                $(this).closest(".facet-slider").find(".tooltip-inner").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                            }
                        }
                    }
                }
                for (var i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                    if (cwds.multipleFacets.selectedFacets[i].Name === facetName) {
                        cwds.multipleFacets.selectedFacets[i].Items = [];
                        if (minRange > 0 || maxRange > 0) {
                            cwds.multipleFacets.selectedFacets[i].Items.push(minRange);
                            cwds.multipleFacets.selectedFacets[i].Items.push(maxRange);
                            angular.element($(crt)).scope().updateSlider(facetName, facetLabel, cwds.multipleFacets.selectedFacets[i].Items, sliderType, sRange);
                        } else {
                            angular.element($(crt)).scope().removeSlider(facetName);
                        }
                        break;
                    }
                }
            });
        },
        clearAppliedFacets: function (appliedFiltersDisplayDiv) {
            $(appliedFiltersDisplayDiv).children().not('.clear-filter-container').remove();
            $(appliedFiltersDisplayDiv).closest(".facet-selected").addClass('hidden');
            $(appliedFiltersDisplayDiv).closest(".facet-multiple-select").find(".modal-facet .modal-facet-body .facet-items").removeClass("selected");
            angular.element($(appliedFiltersDisplayDiv)).scope().updateAppliedFacetCount();
        },
        resetSelectedFacets: function () {
            var facetName;
            var facetLabel;
            var facetItemCode;
            var facetItemValue;
            var index;
            var crt = ("#ChooseMultiple .facet-multiple-select .facet-selected .filter-selected-body");
            var i;
            var j;
            var k;
            cwds.multipleFacets.clearAppliedFacets(crt);
            cwds.multipleFacets.selectedFacets = JSON.parse(JSON.stringify(cwds.facet.applied));
            for (i = 0; i < cwds.multipleFacets.selectedFacets.length; i++) {
                for (j = 0; j < cwds.multipleFacets.selectedFacets[i].Items.length; j++) {
                    if (cwds.multipleFacets.selectedFacets[i].Type === "Slider") {
                        facetName = cwds.multipleFacets.selectedFacets[i].Name;
                        facetSliderRange = $(".search #FacetDetails .facet-list .facet-list-items[data-search-facet-name='" + facetName + "'] .facet-slider-item").attr("data-search-facet-slider-range");
                        facetSliderType = $(".search #FacetDetails .facet-list .facet-list-items[data-search-facet-name='" + facetName + "'] .facet-slider-item").attr("data-search-facet-slider-type");
                        angular.element($(crt)).scope().updateSlider(cwds.multipleFacets.selectedFacets[i].Name, cwds.multipleFacets.selectedFacets[i].Label, cwds.multipleFacets.selectedFacets[i].Items, facetSliderType, facetSliderRange.split(":"));
                        //Comment: Trying to add Days In Status for only once. Checking in both selected filter and applied facet, if they match add only once and if it is added before slice it.
                    } else if (cwds.multipleFacets.selectedFacets[i].Type === "DropDown") {
                        var pSection = $(crt).closest('.search-page');
                        facetName = cwds.multipleFacets.selectedFacets[i].Name;
                        facetLabel = cwds.multipleFacets.selectedFacets[i].Label;
                        facetItemCode = cwds.multipleFacets.selectedFacets[i].Items[j];
                        facetItemValue = $(pSection).find(".search #FacetDetails .facet-list .facet-list-items[data-search-facet-name='" + facetName + "'] select option[value='" + facetItemCode + "']").attr('data-search-facet-item-value');
                        var defaultDDSel = $('.facet-list .facet-list-items[data-search-facet-name="' + facetName + '"]').find('select').find('option:first').val();
                        angular.element($(crt)).scope().updateDropDown($(pSection), facetName, facetLabel, facetItemCode, facetItemValue, true, defaultDDSel);
                    } else {
                        facetLabel = cwds.multipleFacets.selectedFacets[i].Label;
                        facetName = cwds.multipleFacets.selectedFacets[i].Name;
                        facetItemCode = cwds.multipleFacets.selectedFacets[i].Items[j];

                        if (cwds.facet.applied[i].Type.toLowerCase() === "radio") {
                            facetItemValue = $(".search .code-only-facet-details .facet-list .facet-list-items[data-search-facet-name='" + facetName + "'] input[data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").next('label').text();
                        } else {
                            facetItemValue = $(".search .code-only-facet-details .facet-list .facet-list-items[data-search-facet-name='" + facetName + "'] a[data-search-facet-code='" + cwds.utility.escapeQuotes(facetItemCode) + "']").text();
                        }
                        angular.element($(crt)).scope().addSelectedFacetLink(facetLabel, facetName, facetItemCode, facetItemValue, true);

                    }
                }
            }
        }
    },

    facet: {
        group: "",
        applied: [],
        modalFacetDetails: [],
        sliderInitialized: [],
        bindEvents: function () {
            if (cwds.facet.applied.length === 0) {
                $(".facet .facet-list-items").each(function () {
                    var fg = { "Name": $(this).attr("data-search-facet-name"), Items: [], Type: $(this).attr("data-search-facet-type"), Label: $(this).attr("data-search-facet-label"), SliderType: '' };
                    if ($(this).attr("data-search-facet-type") === 'DropDown') {
                        fg.Items[0] = $(this).find('option:selected').val();
                    } else if ($(this).attr("data-search-facet-type") == 'Slider') {
                        fg.SliderType = $(this).find('.facet-slider-item').attr("data-search-facet-slider-type");
                    }
                    cwds.facet.applied.push(fg);
                });
            }
            if (cwds.multipleFacets.selectedFacets.length === 0) {
                $(".facet .facet-list-items").each(function () {
                    var fg = { "Name": $(this).attr("data-search-facet-name"), Items: [], Type: $(this).attr("data-search-facet-type"), Label: $(this).attr("data-search-facet-label") };
                    if ($(this).attr("data-search-facet-type") === 'DropDown') {
                        fg.Items[0] = $(this).find('option:selected').val();
                    }
                    cwds.multipleFacets.selectedFacets.push(fg);
                });
            }
            if (cwds.facet.modalFacetDetails.length === 0 || cwds.facet.modalFacetDetails.length !== $('.facet .facet-list-items').length) {
                cwds.facet.modalFacetDetails.length = 0
                $(".facet .facet-list-items").each(function () {
                    var item = $(this).closest(".facet-list");
                    cwds.facet.modalFacetDetails.push({
                        "name": $(item).find(".facet-list-items").attr("data-search-facet-name"),
                        "allowMultiSelect": $(item).attr("data-search-allow-multi-select"),
                        "label": $(item).find(".list-title a").text(),
                        "type": $(this).attr("data-search-facet-type")
                    });
                });
            }
            $(".facet .list-title .show-hide").each(function () {
                $(this).click(function (e) { e.preventDefault(); cwds.facet.showHideList($(this)); });
            });
            $(".facet .facet-header .facet-sh").each(function () {
                $(this).click(function (e) { e.preventDefault(); cwds.facet.showHideAll($(this)); });
            });
            $(".search .facet .facet-body .facet-list .facet-list-items ul li a").click(function (e) {
                e.preventDefault();
                cwds.facet.addFacetSelectionForLink($(this));
            });


            $(".search .facet .facet-body .facet-list .facet-cal").click(function (e) {
                e.preventDefault();
                $(this).closest(".input-group").find("input[type=text]").focus();
            });
            $(".search .facet .facet-body .facet-list .facet-calendar").mask(jgUtils.mask.mmddyyyy);

            $(".search .facet .facet-body .facet-list .show-toggle a").click(function (e) {
                e.preventDefault();
                var sliderSection = $(this).closest(".facet-list").find(".facet-list-items .facet-slider .slider-section");
                var dateFieldSection = $(this).closest(".facet-list").find(".facet-list-items .facet-slider .date-field-section");

                var sliderIntegerSection = $(this).closest(".facet-list").find(".facet-list-items .facet-slider .slider-integer-section");
                var integerFieldSection = $(this).closest(".facet-list").find(".facet-list-items .facet-slider .integer-field-section");

                if ($(this).hasClass("show-date-fields")) {
                    $(sliderSection).addClass("hidden");
                    $(dateFieldSection).removeClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-slider").removeClass("hidden");
                } else {
                    $(sliderSection).removeClass("hidden");
                    $(dateFieldSection).addClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-date-fields").removeClass("hidden");
                }

                if ($(this).hasClass("show-integer-fields")) {
                    $(sliderIntegerSection).addClass("hidden");
                    $(integerFieldSection).removeClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-slider").removeClass("hidden");
                } else {
                    $(sliderIntegerSection).removeClass("hidden");
                    $(integerFieldSection).addClass("hidden");
                    $(this).addClass('hidden');
                    $(this).closest(".show-toggle").find(".show-integer-fields").removeClass("hidden");
                }
            });

            $(".search-filter-icon .filter-section").click(function (e) {
                e.preventDefault();
                cwds.dialog.open("ChooseMultiple");
                cwds.multipleFacets.resetSelectedFacets();
                var ct = $("#ChooseMultiple .facet-multiple-select");
                $(ct).find("select option:first-child").attr("selected", "selected");
                var facetName = $(ct).find("select").val();
                var searchDiv = $(".search");
                var searchFacetApi = $(searchDiv).attr('search-api').replace("GetSearchResults", "GetFacet");
                angular.element($(ct)).scope().getFacetItems($(searchDiv).attr("ng-controller"), $(ct), facetName, searchFacetApi);
            });


            $(".search .facet .facet-body .facet-list .facet-dropDown").each(function () {
                $(this).on("change", function () {
                    var name = $(this).attr("data-search-facet-name");
                    for (var i = 0; i < cwds.facet.applied.length; i++) {
                        if (cwds.facet.applied[i].Name === name) {
                            cwds.facet.applied[i].Items.length = 0;
                            cwds.facet.applied[i].Items[0] = $(this).find('option:selected').val();
                            //cwds.facet.applied[i].Items[0]= $(this).find('option:selected').attr('data-search-facet-item-value');
                            break;
                        }
                    }
                    var ct = $(this).closest(".search");
                    angular.element($(ct)).scope().search($(ct).attr("ng-controller"), 1, $(ct), false);
                });
            });
            $(".search .facet .facet-body .facet-list .select-more-facet a").click(function (e) {
                e.preventDefault();
                var facetName = $(this).closest(".facet-list").find(".facet-list-items").attr("data-search-facet-name");
                var li = $("#ChooseMultiple").find(".facet-multiple-select .facet-items li a[data-search-facet-name='" + facetName + "']");
                cwds.dialog.open("ChooseMultiple");
                cwds.multipleFacets.resetSelectedFacets();
                cwds.multipleFacets.bindFacetItems($(li).closest('.facet-items'));
            });

            $(".search .facet .facet-body .facet-list .facet-slider .date-fields-apply").click(function (e) {
                e.preventDefault();
                var facetListItems = $(this).closest(".facet-list").find(".facet-list-items");
                var facetName = $(facetListItems).attr("data-search-facet-name");
                var facetLabel = $(facetListItems).attr("data-search-facet-label");
                var dateFieldMinSel = $(facetListItems).find(".date-field-section .facet-begin-date .facet-calendar").val();
                var dateFieldMaxSel = $(facetListItems).find(".date-field-section .facet-end-date .facet-calendar").val();
                var sliderType = $(facetListItems).find(".date-fields-apply").attr("data-search-facet-input-type");
                var minValue = $(facetListItems).find(".date-field-section .facet-end-date .facet-calendar").attr('data-search-facet-slider-range').split(':')[0];
                var maxValue = $(facetListItems).find(".date-field-section .facet-end-date .facet-calendar").attr('data-search-facet-slider-range').split(':')[1];
                var sRange = [minValue, maxValue];

                for (var i = 0; i < cwds.facet.applied.length; i++) {
                    if (cwds.facet.applied[i].Name === facetName) {
                        if (cwds.facet.applied[i].Items.length === 0) {
                            cwds.facet.applied[i].Items.push(dateFieldMinSel);
                            cwds.facet.applied[i].Items.push(dateFieldMaxSel);
                        } else {
                            cwds.facet.applied[i].Items[0] = dateFieldMinSel;
                            cwds.facet.applied[i].Items[1] = dateFieldMaxSel;
                        }
                        break;
                    }
                }
                var ct = $(this).closest(".search");
                angular.element($(ct)).scope().search($(ct).attr("ng-controller"), 1, $(ct), false);
                var crt = (".filter-selected-body");
                angular.element($(crt)).scope().updateSlider(facetName, facetLabel, cwds.multipleFacets.selectedFacets[i].Items, sliderType, sRange);
            });

            $(".search .facet .facet-body .facet-list .facet-slider .integer-fields-apply").click(function (e) {
                e.preventDefault();
                var facetListItems = $(this).closest(".facet-list").find(".facet-list-items");
                var facetName = $(facetListItems).attr("data-search-facet-name");
                var facetLabel = $(facetListItems).find(".facet-slider-items").attr("data-search-facet-label");
                var integerFieldMinSel = $(facetListItems).find(".integer-field-section .facet-begin-integer .code-only-min-number-slider").val();
                var integerFieldMaxSel = $(facetListItems).find(".integer-field-section .facet-end-integer .code-only-max-number-slider").val();
                var sliderType = ''
                var sRange = ''
                for (var i = 0; i < cwds.facet.applied.length; i++) {
                    if (cwds.facet.applied[i].Name === facetName) {
                        if (cwds.facet.applied[i].Items.length === 0) {
                            cwds.facet.applied[i].Items.push(integerFieldMinSel);
                            cwds.facet.applied[i].Items.push(integerFieldMaxSel);
                        } else {
                            cwds.facet.applied[i].Items[0] = integerFieldMinSel;
                            cwds.facet.applied[i].Items[1] = integerFieldMaxSel;
                        }
                        break;
                    }
                }
                var ct = $(this).closest(".search");
                angular.element($(ct)).scope().search($(ct).attr("ng-controller"), 1, $(ct), false);
                var crt = (".filter-selected-body");
                angular.element($(crt)).scope().updateSlider(facetName, facetLabel, cwds.multipleFacets.selectedFacets[i].Items, sliderType, sRange);
            });

            $(".search .facet .facet-body .facet-list .facet-slider .facet-slider-item").each(function () {
                var facetName = $(this).closest(".facet-list-items").attr("data-search-facet-name");
                var sliderType = $(this).attr("data-search-facet-slider-type");
                var valMin;
                var valMax;
                var sRange = $(this).attr("data-search-facet-slider-range").split(":");
                var sMin;
                var sMax;

                if (sliderType === 'Integer') {
                    var valMin = parseInt($(this).attr("data-search-facet-slider-min-value"));
                    var valMax = parseInt($(this).attr("data-search-facet-slider-max-value"));
                    var sMin = parseInt(sRange[0]);
                    var sMax = parseInt(sRange[1]);
                    if (sMin < 0) {
                        sMin = 0;
                        $(this).closest(".facet-slider").find(".slider-value").text(valMin + ' - ' + valMax);
                        $(this).bootstrapSlider({
                            id: facetName + 'Facet',
                            range: true,
                            min: sMin,
                            max: sMax,
                            value: [valMin, valMax]
                        });
                    } else {
                        $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + valMin);
                        $(this).bootstrapSlider({
                            id: facetName + 'Facet',
                            range: false,
                            min: 0,
                            max: sMax,
                            value: valMin
                        });
                    }
                } else if (sliderType === 'Date') {
                    valMin = $(this).attr("data-search-facet-slider-min-value");
                    valMax = $(this).attr("data-search-facet-slider-max-value");
                    sMin = sRange[0];
                    sMax = sRange[1];
                    var sliderDefault = parseInt($(this).attr("data-search-slider-default"));

                    var resetSliderOnLoad = $(this).attr("data-search-reset-onload");
                    if (resetSliderOnLoad == "1") {
                        if (sliderDefault > 0) {
                            var minDate = new Date(sRange[0]);
                            var maxDate = new Date(sRange[1]);
                            var selMin = new Date(valMin);
                            var selMax = new Date(valMax);
                            var timeDiffSelMin = Math.abs(new Date(minDate).getTime() - new Date(selMin).getTime());
                            var daysDiffSelMin = timeDiffSelMin / (1000 * 3600 * 24);
                            var timeDiffSelMax = Math.abs(new Date(selMax).getTime() - new Date(minDate).getTime());
                            var daysDiffSelMax = timeDiffSelMax / (1000 * 3600 * 24);
                            $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            $(this).bootstrapSlider({
                                id: facetName + 'Facet',
                                range: true,
                                min: 0,
                                max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                                value: [daysDiffSelMin, daysDiffSelMax],
                                formatter: function (value) {
                                    return cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax)
                                }
                            });
                        } else {
                            var minDate = new Date(sRange[0]);
                            var maxDate = new Date(sRange[1]);
                            $(this).closest(".facet-slider").find(".slider-value").text("No Filter");
                            $(this).bootstrapSlider({
                                id: facetName + 'Facet',
                                range: false,
                                min: 0,
                                max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                                value: [0, 0]
                            });
                        }
                    } else {
                        if (sMin) {
                            var minDate = new Date(sRange[0]);
                            var maxDate = new Date(sRange[1]);
                            var selMin = new Date(valMin);
                            var selMax = new Date(valMax);
                            var timeDiffSelMin = Math.abs(new Date(minDate).getTime() - new Date(selMin).getTime());
                            var daysDiffSelMin = timeDiffSelMin / (1000 * 3600 * 24);
                            var timeDiffSelMax = Math.abs(new Date(selMax).getTime() - new Date(minDate).getTime());
                            var daysDiffSelMax = timeDiffSelMax / (1000 * 3600 * 24);
                            $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            $(this).bootstrapSlider({
                                id: facetName + 'Facet',
                                range: true,
                                min: 0,
                                max: Math.round((maxDate.getTime() - minDate.getTime()) / 86400000),
                                value: [daysDiffSelMin, daysDiffSelMax],
                                formatter: function (value) {
                                    return cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax)
                                }
                            });
                        } else {
                            $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + valMin);
                            $(this).bootstrapSlider({
                                id: facetName + 'Facet',
                                range: false,
                                min: 0,
                                max: sMax,
                                value: valMin
                            });
                        }
                    }
                }
                $(this).on("slide", function (slideEvt) {
                    var ctrl = $(this);
                    var sliderType = $(ctrl).attr("data-search-facet-slider-type");
                    if (sliderType == 'Integer') {
                        if (slideEvt.value) {
                            if ($.isArray(slideEvt.value)) {
                                $(this).closest(".facet-slider").find(".slider-value").text(slideEvt.value[0] + ' - ' + slideEvt.value[1]);
                            } else {
                                $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + slideEvt.value);
                            }
                        }
                    } else {
                        if (slideEvt.value) {
                            var sRange = $(this).attr("data-search-facet-slider-range").split(":");
                            var minVal = sRange[0];
                            var maxVal = sRange[1];
                            var selMin = new Date(minVal);
                            var selMax = new Date(minVal);
                            if ($.isArray(slideEvt.value)) {
                                selMin.setDate(selMin.getDate() + slideEvt.value[0]);
                                selMax.setDate(selMax.getDate() + slideEvt.value[1]);
                                $(this).closest(".facet-slider").find(".slider-value").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                                $(this).closest(".facet-slider").find(".tooltip-inner").text(cwds.facet.convertToDDMMYYYY(selMin) + ' - ' + cwds.facet.convertToDDMMYYYY(selMax));
                            } else {
                                selMin.setDate(selMin.getDate() + slideEvt.value);
                                $(this).closest(".facet-slider").find(".slider-value").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                                $(this).closest(".facet-slider").find(".tooltip-inner").text('0 - ' + cwds.facet.convertToDDMMYYYY(selMin));
                            }
                        }
                    }
                });
                $(this).on("slideStop", function (slideEvt) {
                    var ctrl = $(this);
                    var sliderType = $(ctrl).attr("data-search-facet-slider-type");
                    var name = $(this).closest(".facet-list-items").attr("data-search-facet-name");
                    var minRange = 0;
                    var maxRange = 0;
                    if (slideEvt.value) {
                        if ($.isArray(slideEvt.value)) {
                            minRange = slideEvt.value[0];
                            maxRange = slideEvt.value[1];
                        } else {
                            minRange = slideEvt.value;
                            maxRange = 0;
                        }
                    }
                    for (var i = 0; i < cwds.facet.applied.length; i++) {
                        if (cwds.facet.applied[i].Name === name) {
                            if (cwds.facet.applied[i].Items.length === 0) {
                                cwds.facet.applied[i].Items.push(minRange);
                                cwds.facet.applied[i].Items.push(maxRange);
                            } else {
                                cwds.facet.applied[i].Items[0] = minRange;
                                cwds.facet.applied[i].Items[1] = maxRange;
                            }
                            break;
                        }
                    }
                    var ct = $(this).closest(".search");
                    angular.element($(ct)).scope().search($(ct).attr("ng-controller"), 1, $(ct), false);
                });
            });
        },

        convertToDDMMYYYY: function (InputDate) {
            var ConvDate = new Date(InputDate);
            var dd = ConvDate.getDate();
            var mm = ConvDate.getMonth() + 1;
            var yyyy = ConvDate.getFullYear();
            if (dd < 10) {
                dd = '0' + dd
            }
            if (mm < 10) {
                mm = '0' + mm
            }
            return (mm + "/" + dd + "/" + yyyy)
        },
        daysBetween: function (startDate, endDate) {
            var diff = Math.round((Date.parse(endDate) - Date.parse(startDate)) / 86400000);
            return diff
        },
        showHideList: function (lCtrl) {
            if ($(lCtrl).find("i.fa-plus").length > 0) cwds.facet.showList(lCtrl);
            else cwds.facet.hideList(lCtrl);
        },
        showList: function (lCtrl) {
            $(lCtrl).find("i.fa-plus").removeClass('fa-plus').addClass('fa-minus');
            var fList = $(lCtrl).closest('.facet-list');
            $(fList).find(".facet-list-items").removeClass("hidden");
            $(fList).find(".select-more-facet").removeClass("hidden");
        },
        hideList: function (lCtrl) {
            $(lCtrl).find("i.fa-minus").removeClass('fa-minus').addClass('fa-plus');
            var fList = $(lCtrl).closest('.facet-list');
            $(fList).find(".facet-list-items").addClass("hidden");
            $(fList).find(".select-more-facet").addClass("hidden");
        },
        showHideAll: function (lCtrl) {
            if ($(lCtrl).find("i.fa-caret-square-o-up").length > 0) {
                $(lCtrl).find("i.fa-caret-square-o-up").removeClass('fa-caret-square-o-up').addClass('fa-caret-square-o-down');
                $(lCtrl).closest('.facet').find(".facet-body").addClass("block");
                $(lCtrl).attr('title', "Hide Additional Filters");
            }
            else {
                $(lCtrl).find("i.fa-caret-square-o-down").removeClass('fa-caret-square-o-down').addClass('fa-caret-square-o-up');
                $(lCtrl).closest('.facet').find(".facet-body").removeClass("block");
                $(lCtrl).attr('title', "Show Additional Filters");
            }
        },
        addFacetSelectionForLink: function (a) {
            var del = $(a).hasClass("facet-delete");
            var name = $(a).closest(".facet-list-items").attr("data-search-facet-name");
            var item = $(a).attr("data-search-facet-code");
            for (var i = 0; i < cwds.facet.applied.length; i++) {
                if (cwds.facet.applied[i].Name === name) {
                    if (del) {
                        var index = cwds.facet.applied[i].Items.indexOf(item);
                        if (index >= 0) cwds.facet.applied[i].Items.splice(index, 1);

                    } else {
                        cwds.facet.applied[i].Items.push(item);
                    }
                    break;
                }
            }
            var ct = $(a).closest(".search");
            cwds.search.refreshSearchCriteria()
            angular.element($(ct)).scope().search($(ct).attr("ng-controller"), 1, $(ct), false);
        },
        showFacetItemsDD: function (fc) {
            var v = $(fc).val();
            var li = $(".facet-select-multiple .facet-items ul li a[data-jg-item-id='" + v + "']");
            cwds.facet.showFacetItems($(li));
        },
        appliedFacetExists: function () {
            var result = false;
            for (var i = 0; i < cwds.facet.applied.length; i++) {
                if (cwds.facet.applied[i].Type === 'Slider') {
                    if (cwds.facet.applied[i].Items.length > 0) {
                        for (var j = 0; j < cwds.facet.applied[i].Items.length; j++) {
                            if (cwds.facet.applied[i].Items[j] !== "" || cwds.facet.applied[i].Items[j] !== "0") {
                                result = true;
                                break;
                            }
                        }
                    }
                } else {
                    if (cwds.facet.applied[i].Items.length > 0) {
                        result = true;
                        break;
                    }
                }
            }
            return result;
        }
    },
    applied: {
        init: function () {
        }
    },
    list: {
        dataSelected: [],
        retainSelection: false,
        searchParams: null,
        exportToExcelTimer: null,
        exportToExcelCookieName: "ExcelFileDownloaded",
        init: function () {
            var pg = $(".list .pagination-section");
            $(pg).find("a.page-first").click(function () {
                if (!$(this).hasClass("not-active")) {
                    var listCtrl = $(this).closest(".list");
                    angular.element($(listCtrl)).scope().search($(listCtrl).attr("ng-controller"), 1, $(listCtrl), false);
                }
            });
            $(pg).find("a.page-previous").click(function () {
                if (!$(this).hasClass("not-active")) {
                    var listCtrl = $(this).closest(".list");
                    var pnumber = parseInt($(listCtrl).find(".pagination-section .panel-pagination").attr("data-pagination-page")) - 1;
                    angular.element($(listCtrl)).scope().search($(listCtrl).attr("ng-controller"), pnumber, $(listCtrl), false);
                }
            });

            $(pg).find("a.page-next").click(function () {
                if (!$(this).hasClass("not-active")) {
                    var listCtrl = $(this).closest(".list");
                    var pnumber = parseInt($(listCtrl).find(".pagination-section .panel-pagination").attr("data-pagination-page")) + 1;
                    angular.element($(listCtrl)).scope().search($(listCtrl).attr("ng-controller"), pnumber, $(listCtrl), false);
                }
            });
            $(pg).find("a.page-last").click(function () {
                if (!$(this).hasClass("not-active")) {
                    var listCtrl = $(this).closest(".list");
                    var pnumber = parseInt($(listCtrl).find(".pagination-section .panel-pagination").attr("data-pagination-pages"));
                    angular.element($(listCtrl)).scope().search($(listCtrl).attr("ng-controller"), pnumber, $(listCtrl), false);
                }
            });

            $(".list").each(function () {
                if ($(this).attr("ng-controller").length > 0) {
                    var row = parseInt($(this).find(".list-details .code-only-grid-page-number-hidden-field").val());
                    if (typeof getSearchCriteria === "function") {
                        try {
                            cwds.list.searchParams = getSearchCriteria();
                        }
                        catch (err) { console.log(err); }
                    }

                    angular.element($(this)).scope().search($(this).attr("ng-controller"), row, $(this), false);
                }

                $(".list .heading-row a.sort-toggle-link").click(function (e) {
                    var listCtrl = $(this).closest(".list");
                    var columnName = $(this).closest(".header-column").attr("data-column-name");
                    var sortBy = '';

                    if ($(this).find("i.fa-sort-asc").hasClass("active-sort-option") || $(this).find("i.fa-sort-desc").hasClass("active-sort-option")) {
                        $(this).find("i.fa-sort-asc").toggleClass("active-sort-option");
                        $(this).find("i.fa-sort-desc").toggleClass("active-sort-option");
                    } else {
                        $("a.sort-toggle-link").not(this).find("i.active-sort-option").removeClass("active-sort-option");
                        $(this).find("i.fa-sort-asc").addClass("active-sort-option");
                    }

                    if ($(this).find("i.active-sort-option").hasClass("fa-sort-asc")) {
                        sortBy = columnName + "asc"
                    } else {
                        sortBy = columnName + "desc"
                    }
                    $(listCtrl).find(".list-details #SortBy").val(sortBy);
                    angular.element($(listCtrl)).scope().search($(listCtrl).attr("ng-controller"), 1, $(listCtrl), false);
                });
            });
            $("a.export-to-excel-list").click(function (e) {
                e.preventDefault();
                $("#__Action").val($(this).attr("data-search-function-id") + "ExportToExcel");
                if (parseInt($(this).attr("data-export-to-excel-count")) > parseInt($(this).attr("data-record-count"))) {
                    cwds.list.startExcelDownload(true, 0);
                }
                else {
                    cwds.list.startExcelDownload(false, $(this).attr("data-export-to-excel-count"));
                }
            });
        },
        startExcelDownload: function (startDownload, count) {
            var mde = $("#ExportToExcelDialog");
            if (startDownload) {
                cwds.utility.disableValidators();
                $(mde).find("#ExportToExcelDetails").addClass("hidden");
                $(mde).find("#ExportToExcelStarted").removeClass("hidden");
                $(mde).find(".modal-footer").addClass("hidden");
                cwds.dialog.open("ExportToExcelDialog");
                cwds.utility.deleteCookie(cwds.list.exportToExcelCookieName);
                cwds.list.exportToExcelTimer = window.setInterval(cwds.list.excelDownloadTimer, 200);
                $('form').submit();
            } else {
                $(mde).find(".export-to-excel-download-limit").html(count);
                $(mde).find("#ExportToExcelDetails").removeClass("hidden");
                $(mde).find("#ExportToExcelStarted").addClass("hidden");
                $(mde).find(".modal-footer").removeClass("hidden");
                cwds.dialog.open("ExportToExcelDialog");
            }
        },
        excelDownloadTimer: function () {
            if (cwds.utility.getCookie(cwds.list.exportToExcelCookieName) === "1") {
                window.clearInterval(cwds.list.exportToExcelTimer);
                cwds.dialog.close("ExportToExcelDialog");
                cwds.utility.deleteCookie(cwds.list.exportToExcelCookieName);
            }
        },
        executeScriptCallBack: function (resp, controller) {
            let ct = $(".list[ng-controller='" + controller + "']");
            let scriptCallBack = $(ct).attr('data-list-script-callback');
            if (scriptCallBack) {
                cwds.utility.executeFunctionByName(scriptCallBack, resp.pageNumber, resp.totalCount, resp);
            }

            //This code will get executed when AngularJs Looping (repeater) code is done with execution. 
            //This is generic code to hide the Action columns when there is no row with action items.
            let _hasValidMoreAction = false;
            $(ct).find(".result-actions").each(function () {
                if ($(this).find(".action-list a:not(.ng-hide)").length <= 0) {
                    $(this).addClass("hidden");
                }
                else {
                    _hasValidMoreAction = true;
                    $(this).removeClass("hidden");
                }
            });

            //If there is a single record with more action visible, then display header column heading.
            if (!_hasValidMoreAction) {
                $(ct).find(".actions-heading").addClass("hidden");
                $(ct).find(".actions-heading").prev().removeClass("col-sm-10").addClass("col-sm-12");
                $(ct).find(".result-actions").each(function () {
                    $(this).prev().removeClass("col-sm-10").addClass("col-sm-12");
                });
            } else {
                $(ct).find(".actions-heading").prev().removeClass("col-sm-12").addClass("col-sm-10");
            }
        },
        setPaginationDetails: function (resp, controller) {
            let pClass = "not-active text-muted";
            let listCtrl = $(".list[ng-controller='" + controller + "']");
            let pagePanel = $(listCtrl).find(".pagination-section .panel-pagination");
            $(pagePanel).attr("data-pagination-total", resp.totalCount);
            $(pagePanel).attr("data-pagination-page", resp.pageNumber);
            $(pagePanel).attr("data-pagination-pages", resp.pages);
            if (resp.totalCount > 0) {
                $(listCtrl).find(".export-to-excel-list").removeClass("hidden");
                $(listCtrl).find(".export-to-excel-list").attr("data-record-count", resp.totalCount);
            }
            else {
                $(listCtrl).find(".export-to-excel-list").addClass("hidden");
            }


            if (resp.results.length > 0) {
                $(pagePanel).find(".w-pager").removeClass("not-active").removeClass("text-muted");
                $(pagePanel).find(".w-pager").removeAttr('disabled').attr('aria-disabled', 'false');

                if (resp.pages === 1) {
                    $(pagePanel).find(".w-pager").addClass(pClass);
                } else {
                    if (resp.pageNumber === 1) {
                        $(pagePanel).find(".page-first,.page-previous").addClass(pClass).attr('disabled', 'disabled').attr('aria-disabled', 'true');
                        //Ensure that the tab index does not focus on the pagination controls when the page loads.
                        //Prevent the page from scrolling down to highlight pagination when users click sort icons or trigger change events.
                        //Maintain the user's position on the page during these interactions to avoid abrupt jumps or scrolls.

                        //$(pagePanel).find(".page-next").focus();
                    }
                    else if (resp.pageNumber === resp.pages) {
                        $(pagePanel).find(".page-next,.page-last").addClass(pClass).attr('disabled', 'disabled').attr('aria-disabled', 'true');
                        //Ensure that the tab index does not focus on the pagination controls when the page loads.
                        //Prevent the page from scrolling down to highlight pagination when users click sort icons or trigger change events.
                        //Maintain the user's position on the page during these interactions to avoid abrupt jumps or scrolls.

                        //$(pagePanel).find(".page-previous").focus();
                    }
                }
                $(pagePanel).find(".paginate-details").html(resp.pageNumber + "/" + resp.pages);
            }
        },
        bindEvents: function (controller) {
            var listCtrl = $(".list[ng-controller='" + controller + "']");
            cwds.list.bindTriggers(controller);
            cwds.list.quickActions();
            cwds.list.quickActionResultClick();
            //cwds.list.formatMobileTable();
            cwds.list.initControls();
        },
        initControls: function () {
            $(".list .list-results .touchspin-cwds").TouchSpin({});
        },
        bindTriggers: function (controller) {
            var listCtrl = $(".list[ng-controller='" + controller + "']");

            $(listCtrl).find(".data-row .expand-trigger").click(function (e) {
                e.preventDefault();
                $(this).closest(".data-row").find(".collapse-trigger").removeClass("hidden");
                $(this).addClass("hidden");
                $(this).closest(".data-row").find(".mobile-info").removeClass("hidden");
            });

            $(listCtrl).find(".data-row .collapse-trigger").click(function (e) {
                e.preventDefault();
                $(this).closest(".data-row").find(".expand-trigger").removeClass("hidden");
                $(this).addClass("hidden");
                $(this).closest(".data-row").find(".mobile-info").addClass("hidden");
            });
        },
        quickActions: function () {
            $(document).on('click', function (e) {
                if ((!$(e.target).closest('.action-more').length) && (!$(e.target).closest('.action-list').length)) {
                    $(".action-list:visible").addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                }
            });
            $("a.action-more").click(function (e) {
                e.preventDefault();
                var ctrl = $(this);
                var aI = $(ctrl).closest(".result-actions").find(".action-list");
                if ($(aI).hasClass("hidden")) {
                    $(".result-actions .action-list:visible").addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                    $(aI).removeClass("hidden");
                    $(ctrl).children("div.active-icon-indicator").addClass("active");
                    $(aI).find("a").first().focus();
                } else {
                    $(aI).addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                }
            });
            $(".result-actions .action-list").find("a").click(function (e) {
                e.preventDefault();
                $(".result-actions .action-list:visible").addClass("hidden");
            });
        },
        quickActionResultClick: function () {
            $(".list .data-row").find("a.quick-action-item, a.quick-action-item-cs, a.action-item, a.client-action-item").click(function (e) {
                e.preventDefault();
                if ($(this).hasClass("client-action-item") || $(this).hasClass("quick-action-item-cs")) {
                    var selRowDetails = $(this).closest(".data-row").attr("data-search-row-id");
                    var selRowDetailsList = [];
                    selRowDetailsList.push(selRowDetails);
                    cwds.utility.executeFunctionByName($(this).attr("data-script-call-back"), $(this), selRowDetailsList);
                }
                else {
                    cwds.list.dataSelected = [];
                    var selRowDetails = $(this).closest(".data-row").attr("data-search-row-id");
                    cwds.list.dataSelected.push(selRowDetails);
                    $(this).closest(".list").find(".list-details #SelectedIdList").val(JSON.stringify(cwds.list.dataSelected));
                    cwds.utility.submitForm($(this).closest(".list").find(".list-details #SearchFunctionId").val() + $(this).attr("data-search-action-name"));
                }
            });
        },
        formatMobileTable: function () {
            $(".list .jg-resp-table").each(function () {
                var index = -1;
                var colPos = -1;
                var colHeader = [];
                var colCI = [];
                $(this).find(".heading-row").find(".header-column").each(function () {
                    index += 1;
                    if (!$(this).hasClass("hidden-xs")) {
                        colPos = index;
                    } else {
                        colCI.push(index);
                        colHeader.push($(this).text());
                    }
                });

                if (colPos >= 0) {
                    $(this).find(".data-row").each(function () {
                        var mobileDiv = $(this).find(".mobile-info");
                        var html = '';
                        for (var i = 0, len = colCI.length; i < len; i++) {
                            //var d = $(this).find(".data-content-cell").get(colCI[i]);
                            var d = $(this).find(".data-content-column .data-content-cell:first-child").get(colCI[i]);
                            html += '<div class="col-xs-12"><div class="row"><div class="col-xs-5 mt5"><div class="info-label-div">' + colHeader[i] + '</div></div><div class="col-xs-7 mt5">' + d.innerHTML + '</div></div></div>';
                            $(d).addClass("hidden-xs");
                        }
                        $(mobileDiv).append(html);
                    });
                }
            });
        },
        submit: function (listCtrl, actionName, selectedList) {
            cwds.list.dataSelected = [];
            cwds.list.dataSelected = selectedList;
            $(listCtrl).find(".list-details #SelectedIdList").val(JSON.stringify(cwds.list.dataSelected));
            cwds.utility.submitForm(actionName);
        },
        search: function (functionId) {
            var ct = $(".list[ng-controller='" + functionId + "']");
            angular.element($(ct)).scope().search(functionId, 1, $(ct), false);
        },
        getSelectedIDs: function (selectedElement) {
            if ($(selectedElement)) {
                let selRowDetails = $(selectedElement).closest(".data-row").data("search-row-id");
                let selRowDetailsList = [];
                selRowDetailsList.push(selRowDetails);
                return selRowDetailsList;
            }
            return null;
        }
    },
    search: {
        dataSelected: [],
        retainSelection: false,
        searchParams: null,
        isPageSearch: false,
        exportToExcelTimer: null,
        exportToExcelCookieName: "ExcelFileDownloaded",
        init: function () {
            $(".search").each(function () {
                if ($(this).attr("ng-controller").length > 0) {
                    var jsonContent = $(this).find(".search-details .code-only-grid-facets-json-hidden-field").val();
                    if (jsonContent.length > 0) {
                        cwds.facet.applied = JSON.parse(jsonContent.split("^").join("&#44;"));
                    }
                    if ($(this).find(".search-details .code-only-grid-selected-id-list-field").val().length > 0) {
                        cwds.search.retainSelection = true;
                        cwds.search.dataSelected = JSON.parse($(this).find(".search-details .code-only-grid-selected-id-list-field").val());
                        cwds.search.setSelectedCount($(this).find(".search-results .pagination-section"));
                    }
                    if ($("#results-top-pagination").html().length > 0) {
                        $("#results-bottom-pagination").empty().append($("#results-top-pagination").html());
                    }
                    var row = parseInt($(this).find(".search-details .code-only-grid-page-number-hidden-field").val());
                    if (typeof getSearchCriteria === "function") {
                        try {
                            cwds.search.searchParams = getSearchCriteria();
                        }
                        catch (err) { console.log(err); }
                    }

                    angular.element($(this)).scope().search($(this).attr("ng-controller"), row, $(this), false);
                }
            });
            cwds.search.paginate();
            cwds.search.quickActionTopClick();
            $(".export-to-excel").click(function (e) {
                e.preventDefault();
                $("#__Action").val($(this).attr("data-search-function_id") + "ExportToExcel");
                if (parseInt($(this).attr("data-export-to-excel-count")) >= parseInt($(this).attr("data-record-count"))) {
                    cwds.search.startExcelDownload(true, 0);
                }
                else {
                    cwds.search.startExcelDownload(false, $(this).attr("data-export-to-excel-count"));
                }
            });
            $("#ExportToExcelDialog").find("#DownloadExcelButton").click(function (e) {
                e.preventDefault();
                cwds.search.startExcelDownload(true, 0);
            });
            $(".search .sortby-section select").on("change", function () {
                var selectedSortOption = $(this).val();
                var searchDiv = $(this).closest(".search");
                var sortIcon = $(searchDiv).find(".sort-atoz");
                cwds.search.setSortOrder($(this), sortIcon);
                $(searchDiv).find(".sortby-section select").each(function () {
                    $(this).val(selectedSortOption);
                });

                cwds.search.clearSelected();
                $(searchDiv).find(".code-only-grid-sort-by-field").val(selectedSortOption + ' ' + $(searchDiv).find(".sortby-section .sort-atoz").attr('data-sort-order'));
                angular.element($(searchDiv)).scope().search($(searchDiv).attr("ng-controller"), 1, $(searchDiv), false);
            });
            $(".sortby-section .sort-atoz").click(function () {
                var searchDiv = $(this).closest(".search");
                var sortbySection = $(searchDiv).find(".sortby-section");
                if ($(this).find("i").hasClass('fa-sort-alpha-asc')) {
                    $(sortbySection).each(function () {
                        $(sortbySection).find(".sort-atoz i").removeClass('fa-sort-alpha-asc').addClass('fa-sort-alpha-desc');
                        $(sortbySection).find(".sort-atoz").attr({ 'data-sort-order': 'desc', 'aria-label': $(sortbySection).find(".sort-atoz").attr('data-asc-title'), 'title': $(sortbySection).find(".sort-atoz").attr('data-asc-title') });
                    });
                } else {
                    $(sortbySection).each(function () {
                        $(sortbySection).find(".sort-atoz i").removeClass('fa-sort-alpha-desc').addClass('fa-sort-alpha-asc');
                        $(sortbySection).find(".sort-atoz").attr({ 'data-sort-order': 'asc', 'aria-label': $(sortbySection).find(".sort-atoz").attr('data-desc-title'), 'title': $(sortbySection).find(".sort-atoz").attr('data-desc-title') });
                    });
                }

                cwds.search.clearSelected();
                $(searchDiv).find(".code-only-grid-sort-by-field").val($(searchDiv).find(".sortby-section select").val() + ' ' + $(searchDiv).find(".sortby-section .sort-atoz").attr('data-sort-order'));
                angular.element($(searchDiv)).scope().search($(searchDiv).attr("ng-controller"), 1, $(searchDiv), false);
            });
            $(".mobile-search .filter-section").click(function (e) {
                e.preventDefault();
                cwds.dialog.open("ChooseMultiple");

                $("#ChooseMultiple").find('.sort-by-mobile select').empty().append($('.search .sortby-section select').html());
                $("#ChooseMultiple").find('.sort-by-mobile select').val($('.search .sortby-section select').val());

                cwds.multipleFacets.resetSelectedFacets();
                var ct = $("#ChooseMultiple .facet-multiple-select");
                $(ct).find("select option:first-child").attr("selected", "selected");
                var facetName = $(ct).find("select").val();
                var searchDiv = $(".search");
                var searchFacetApi = $(searchDiv).attr('search-api').replace("GetSearchResults", "GetFacet");
                cwds.search.refreshSearchCriteria();
                angular.element($(ct)).scope().getFacetItems($(searchDiv).attr("ng-controller"), $(ct), facetName, searchFacetApi);
            });

            //Moving code which was there in Search.vbhtml to common search.js file
            //$(document).on("touchstart mousedown", 'a.action-more', function () {
            //    var popContainer = $(this).parent('.result-actions');
            //    if (popContainer.length > 0) {
            //        var position = $(popContainer).offset();
            //        if (position && position.top < 525) {
            //            $(popContainer).find(".action-list").css("top", "14px");
            //        } else {
            //            $(popContainer).find(".action-list").css("bottom", "14px");
            //        }
            //    }
            //});
            //8/2/2024 c-cwulfsoh - functionality to filter selection results based on search filter input, results matching will be shown, no match will be hidden but selection will remain if selected
            $(".code-only-search-modal-filter").keyup(function (event) {
                if (event.keyCode == 13) {
                    event.preventDefault();
                    return false;
                }
                let filterText = $(this).val();
                $("input[data-search-facet-value]").each(function (val, control) {
                    if (!jgUtils.isUndefinedOrNullOrBlank($(control).data("search-facet-value"))) {
                        if (!$(control).data("search-facet-value").toLowerCase().includes(filterText.toLowerCase())) {
                            $(control).parent().addClass("hidden");
                        }
                        else {
                            $(control).parent().removeClass("hidden");
                        }
                    }
                });
            });
        },
        reload: function (link, retainFacet) {
            angular.element(link).scope().search(link.attr("ng-controller"), 1, link, retainFacet);

        },
        refreshSearchCriteria: function () {
            if (typeof getSearchCriteria === "function") {
                try { cwds.search.searchParams = getSearchCriteria(); }
                catch (err) { console.log(err); }
            }
        },
        getSearchCriteria: function (searchFunctionId) {
            var searchDiv = $(".search[ng-controller='" + searchFunctionId + "']");
            var searchRequest = {
                "pageNumber": parseInt($(searchDiv).find(".search-details #PageNumber").val()),
                "rows": parseInt($(searchDiv).find(".search-details #Rows").val()),
                "excludeFacets": true,
                "searchFunctionId": searchFunctionId,
                "appliedFacets": cwds.facet.applied,
                "sortBy": $(searchDiv).find(".sortby-section #searchsortby").val() + ' ' + $(searchDiv).find(".sortby-section .sort-atoz").attr('data-sort-order')
            };
            if (Array.isArray(cwds.search.searchParams)) {
                for (i = 0; i < cwds.search.searchParams.length; i++) {
                    searchRequest[cwds.search.searchParams[i][0]] = cwds.search.searchParams[i][1];
                }
            }
            return searchRequest;
        },
        setSearchFooterLink: function (searchFunctionId, footerLinkName, footerLinkIcon, footerLinkScriptCallBack) {
            var searchDiv = $(".search[ng-controller='" + searchFunctionId + "']");
            var footerLink = '<a id="searchFooterLink" class="export-to-excel" href="javascript:void(0)" onclick=' + footerLinkScriptCallBack + '> ' + footerLinkIcon + ' ' + footerLinkName + '</a>';
            $(searchDiv).find('.search-footerlink-section').empty().addClass("mt10").append(footerLink);
        },
        removeSearchFooterLink: function (searchFunctionId) {
            var searchDiv = $(".search[ng-controller='" + searchFunctionId + "']");
            $(searchDiv).find('.search-footerlink-section').empty().removeClass("mt10");
        },
        setSortOrder: function (sortByCtrl, sortIcon) {
            if ($(sortByCtrl).val()) {
                var selectedSortOption = $(sortByCtrl).val();
                if (selectedSortOption === "Relevance") {
                    $(sortIcon).addClass("hidden");
                } else {
                    $(sortIcon).removeClass("hidden");
                    if ($(sortByCtrl).attr("data-default-sort-desc").indexOf("," + selectedSortOption) >= 0) {
                        $(sortIcon).attr({ 'data-sort-order': 'desc', 'aria-label': $(sortIcon).attr("data-asc-title"), 'title': $(sortIcon).attr("data-asc-title") });
                        $(sortIcon).find("i").removeClass('fa-sort-alpha-asc').addClass('fa-sort-alpha-desc');
                    } else {
                        $(sortIcon).attr({ 'data-sort-order': 'asc', 'aria-label': $(sortIcon).attr("data-desc-title"), 'title': $(sortIcon).attr("data-desc-title") });
                        $(sortIcon).find("i").removeClass('fa-sort-alpha-desc').addClass('fa-sort-alpha-asc');
                    }
                }
            }
        },
        addFacetSelection: function (facetName, itemCode, sSection, performNewSearch) {

            if (facetName && itemCode && sSection) {
                var itemCodeArray = itemCode.split("|,|");
                if (performNewSearch) {
                    cwds.facet.applied.length = 0;
                    cwds.search.refreshSearchCriteria();
                }
                if (cwds.facet.applied.length === 0) {
                    $(".facet .facet-list-items").each(function () {
                        var fg = { "Name": $(this).attr("data-search-facet-name"), Items: [], Type: $(this).attr("data-search-facet-type"), Label: $(this).attr("data-search-facet-label") };
                        if ($(this).attr("data-search-facet-type") === 'DropDown') {
                            fg.Items[0] = $(this).find('option:selected').val();
                        }
                        cwds.facet.applied.push(fg);
                    });
                }
                for (var i = 0; i < cwds.facet.applied.length; i++) {
                    if (cwds.facet.applied[i].Name === facetName) {
                        for (var j = 0; j < itemCodeArray.length; j++) {
                            cwds.facet.applied[i].Items.push(itemCodeArray[j]);
                        }
                        break;
                    }
                }
                angular.element($(sSection)).scope().search($(sSection).attr("ng-controller"), 1, $(sSection), false);
            }
        },
        search: function (functionId, searchParams, maintainFacets) {
            cwds.search.isPageSearch = true;
            cwds.search.searchParams = searchParams;
            var ct = $(".search[ng-controller='" + functionId + "']");
            if (!maintainFacets) {
                cwds.facet.applied.length = 0;
            }

            $(".top-action-list-label:visible").addClass("hidden");
            angular.element($(ct)).scope().search(functionId, 1, $(ct), false);
        },
        list: function (functionId, searchParams) {
            cwds.search.isPageSearch = false;
            cwds.search.searchParams = searchParams;
            var ct = $(".search[ng-controller='" + functionId + "']");
            cwds.facet.applied.length = 0;
            $(".top-action-list-label:visible").addClass("hidden");
            angular.element($(ct)).scope().search(functionId, 1, $(ct), false);
        },
        error: function (response, widgetName) {
            var sc = $(".panel.widget[data-widget-name='" + widgetName + "']");
            $(sc).find(".panel-body .no-data-list").addClass("hidden");
            $(sc).find(".panel-body .data-list").addClass("hidden");
            $(sc).find(".panel-body .process-error").removeClass("hidden");
            $(sc).waitMe("hide");
        },
        setSpinner: function (sc) {
            $(sc).waitMe({ effect: "rotateplane", text: '', bg: 'rgba(255,255,255,0.7)', color: "#bac3d2", sizeW: '32', sizeH: '32' });
        },
        removeSpinner: function (sc) {
            $(sc).waitMe("hide");

            //Adding custom code to remove the style of clickable grid when it is not needed.
            if ($(".result-content").length > 0) {
                var gridItems = $(".result-content");
                if (gridItems.find(".no-click").length > 0 || gridItems.find("a").length <= 0) {
                    gridItems.css("cursor", "default");
                    gridItems.find("label").css("cursor", "default");
                }
            }
        },
        bindEvents: function () {
            cwds.search.setSelectedItem();
            cwds.search.quickActions();
            cwds.search.quickActionResultClick();
        },
        resetSelected: function () {
            //var a = $(".search .search-results .results-row .result-select");
            //for (var i = 0; i < cwds.search.dataSelected.length; i++) {
            //    $(a).find("a.checkbox[data-search-row-id='" + cwds.search.dataSelected[i] + "']").addClass("is-checked");
            //    $(a).find("a.checkbox[data-search-row-id='" + cwds.search.dataSelected[i] + "']").closest(".results-row").addClass("selected");
            //}

            //console.log("Check if this is called on pagination");
            cwds.search.setPageCheckboxStateOnRefresh();
        },
        executeScriptCallBack: function (resp, controller) {
            var ct = $(".search[ng-controller='" + controller + "']");
            var scriptCallBack = $(ct).attr('data-search-script-callback');
            if (scriptCallBack) {
                cwds.utility.executeFunctionByName(scriptCallBack, resp.pageNumber, resp.totalCount, resp);
            }
        },
        setPaginationDetails: function (resp, controller) {
            var pClass = "not-active text-muted";
            var ct = $(".search[ng-controller='" + controller + "']");
            var sp = $(ct).find(".pagination-section");
            var start = 0;
            var st = '0';
            var formattedTotalCount = '0';
            if (resp.totalCount > 0) {
                formattedTotalCount = cwds.search.formatNumbers(resp.totalCount);
                start = ((resp.pageNumber - 1) * resp.rows) + 1;
                st = cwds.search.formatNumbers(start);
                $(ct).find(".export-to-excel").removeClass("hidden").addClass("dib");
                $(ct).find(".print-results").removeClass("hidden").addClass("dib");
                $(ct).find(".export-to-excel").attr("data-record-count", resp.totalCount);
            }
            else {
                $(ct).find(".export-to-excel").addClass("hidden").removeClass("dib");
                $(ct).find(".print-results").addClass("hidden").removeClass("dib");
            }
            $(ct).find(".search-details #PageNumber").val(resp.pageNumber);
            if ($(ct).attr('data-search-pgntion-type') === 'Arrows') {
                if (resp.rows > resp.totalCount) {
                    $(sp).find(".search-pages").html(st + '-' + formattedTotalCount + '<span class="hidden-xs"> of ' + formattedTotalCount + '</span>');
                } else {
                    if (resp.pageNumber < resp.pages) {
                        $(sp).find(".search-pages").html(st + '-' + cwds.search.formatNumbers((start + resp.rows - 1)) + '<span class="hidden-xs"> of ' + formattedTotalCount + '</span>');
                    } else {
                        $(sp).find(".search-pages").html(st + '-' + formattedTotalCount + '<span class="hidden-xs"> of ' + formattedTotalCount + '</span>');
                    }
                }
                $(ct).find(".search-details .code-only-grid-page-number-hidden-field").val(resp.pageNumber);
                $(sp).find("a").removeClass("not-active").removeClass("text-muted").removeAttr('aria-disabled');
                $(sp).find("a.page-previous,a.page-next,a.page-first,a.page-last").attr('aria-disabled', 'false');
                if (resp.pages <= 1) { $(sp).find("a.page-previous,a.page-next,a.page-first,a.page-last").addClass(pClass).attr('aria-disabled', 'true'); }
                else {
                    if (resp.pageNumber === 1) { $(sp).find("a.page-previous,a.page-first").addClass(pClass).attr('aria-disabled', 'true'); }
                    else if (resp.pageNumber === resp.pages) { $(sp).find("a.page-next,a.page-last").addClass(pClass).attr('aria-disabled', 'true'); }
                }
            } else {
                var paginationSection = $(ct).find('.pagination.paginate-numbers-list');
                var disClass = "disabled";
                var activeClass = '';
                var pageNumTemplate = '';
                var index = 0;
                var maxVisiblePages = 5;
                var prevArrow = '<li class="page-item page-nav page-prev-nav"><a title="Previous" class="page-link" role="button" href="#"><i class="fa fa-arrow-left" aria-hidden=true></i><span class="sr-only">Previous Page</span></a></li>';
                var nextArrow = '<li class="page-item page-nav page-next-nav"><a title="Next" class="page-link" role="button" href="#"><i class="fa fa-arrow-right" aria-hidden=true></i><span class="sr-only">Next Page</span></a></li>';

                if (resp.pageNumber <= 2) { var start = 1; }
                else if (resp.pageNumber >= resp.pages - 1) {
                    var start = (resp.pages - maxVisiblePages + 1) > 0 ? (resp.pages - maxVisiblePages + 1) : 1;
                }
                else { var start = resp.pageNumber - 2; }

                for (var i = start; index < maxVisiblePages && i >= 1 && i <= resp.pages; i++) {
                    index += 1;
                    activeClass = (i === resp.pageNumber) ? 'active' : '';
                    pageNumTemplate += '<li class="page-item ' + activeClass + '"><a aria-label="Page ' + i + ' " class="page-link" role="button" href="#"> ' + i + ' </a></li>';
                }
                $(paginationSection).empty().append(prevArrow).append(pageNumTemplate).append(nextArrow);
                $(paginationSection).find(".page-link").unbind().click(function (e) {
                    e.preventDefault();
                    cwds.search.paginateNumberItems($(this).parent());
                });
                if (resp.pages <= 1) { $(paginationSection).find('.page-item').addClass(disClass); }
                else {
                    if (resp.pageNumber === 1) { $(paginationSection).find('.page-prev-nav').addClass(disClass); }
                    else if (resp.pageNumber === resp.pages) { $(paginationSection).find('.page-next-nav').addClass(disClass); }
                }
            }

            //Select All Related Code
            $(ct).find(".code-only-grid-total-search-results-field").val(resp.totalCount);

            if ($(ct).find(".code-only-grid-selected-pages").val() != undefined && $(ct).find(".code-only-grid-selected-pages").val() !== '') {
                var selectedPages = $(ct).find(".code-only-grid-selected-pages").val().split(',');
                var pgIdx = selectedPages.indexOf(resp.pageNumber.toString());
                if (pgIdx >= 0) {
                    $(ct).find('.selectAllCheckMark').addClass("selectAllCheckMarkSelected");
                    $(ct).find(".selectAllCheck").prop('checked', true).attr("aria-checked", "true");
                } else {
                    $(ct).find('.selectAllCheckMark').removeClass("selectAllCheckMarkSelected");
                    $(ct).find(".selectAllCheck").prop('checked', false).attr("aria-checked", "false");
                }
            } else {
                $(ct).find('.selectAllCheckMark').removeClass("selectAllCheckMarkSelected");
                $(ct).find(".selectAllCheck").prop('checked', false).attr("aria-checked", "false");
            }
        },
        paginateNumberItems: function (pageItem) {
            var paginationSection = $(pageItem).closest('.pagination.paginate-numbers-list');
            var ct = $(paginationSection).closest('.search');
            var ap;
            if ($(pageItem).hasClass('page-nav')) {
                var cp = parseInt($(ct).find(".search-details #PageNumber").val());
                ap = ($(pageItem).hasClass('page-prev-nav')) ? cp - 1 : cp + 1;
                angular.element(ct).scope().search($(ct).attr("ng-controller"), ap, $(ct), true);
            } else {
                if (!$(pageItem).hasClass('active')) {
                    $(paginationSection).find('.page-item.active').removeClass('active');
                    $(pageItem).addClass('active');
                    ap = parseInt($(pageItem).find('.page-link').text());
                    angular.element(ct).scope().search($(ct).attr("ng-controller"), ap, $(ct), true);
                }
            }
        },
        paginate: function () {
            $(".search-results .pagination-section a.page").click(function (e) {
                e.preventDefault();
                var ap;
                var ct = $(this).closest(".search");
                var totalPagescount = parseInt($(ct).find(".search-results #page-info-0").html().replace("|", ""));
                if (!$(this).hasClass("not-active")) {
                    $(this).addClass("np-clicked");
                    var cp = parseInt($(ct).find(".search-details .code-only-grid-page-number-hidden-field").val());
                    if ($(this).hasClass("page-previous") || $(this).hasClass("page-next")) {
                        ap = ($(this).hasClass("page-previous")) ? cp - 1 : cp + 1;
                    } else {
                        ap = ($(this).hasClass("page-first")) ? 1 : totalPagescount;
                    }
                    angular.element(ct).scope().search($(ct).attr("ng-controller"), ap, $(ct), true);
                }
            });
        },
        setSelectedItem: function () {
            $("div.search-results .results-row a.checkbox").click(function (e) {
                e.preventDefault();
                var id = $(this).attr("data-search-row-id");
                var sc = $(this).closest(".search");
                var pg = $(sc).find(".pagination-section");
                var ams = $(pg).attr('data-search-allow-multi-select').toLowerCase() === "true" ? true : false;
                var sl = parseInt($(pg).attr('data-search-multi-select-limit'));

                var selectedPages = [];
                if ($(sc).find(".search-details .code-only-grid-selected-pages").val() != undefined && $(sc).find(".search-details .code-only-grid-selected-pages").val() != '') {
                    selectedPages = $(sc).find(".search-details .code-only-grid-selected-pages").val().split(',');
                }

                if ($(this).hasClass("is-checked")) {
                    $(this).closest(".results-row").removeClass("selected");
                    var index = cwds.search.dataSelected.indexOf(id);
                    if (index >= 0) cwds.search.dataSelected.splice(index, 1);

                    var _selectAllCheckbox = $(sc).find(".selectAllCheck");
                    if ($(_selectAllCheckbox).is(':checked')) {
                        $('.selectAllCheckMark').toggleClass("selectAllCheckMarkSelected");
                        $(_selectAllCheckbox).prop('checked', false).attr("aria-checked", "false");
                        $(sc).find(".code-only-grid-uncheck-count-field").val("1");

                        var pgIdx = selectedPages.indexOf($(sc).find(".search-details .code-only-grid-page-number-hidden-field").val());
                        if (pgIdx >= 0) {
                            selectedPages.splice(pgIdx, 1);
                            $(sc).find(".search-details .code-only-grid-selected-pages").val(selectedPages.toString());
                        }
                    }
                }
                else {
                    if (!ams) {
                        cwds.search.dataSelected = [];
                        $(this).closest(".search").find("a.is-checked").removeClass("is-checked");
                        $(this).closest(".search").find(".search-results .results-row.selected").removeClass("selected");
                    } else {
                        if (cwds.search.dataSelected.length === sl) {
                            $(sc).find('div[id$="SearchMaxSelectionModelPopup"]').modal({ keyboard: false });
                            //alert($(pg).find(".selection-limit-msg").html());
                            return;
                        }
                    }
                    cwds.search.dataSelected.push(id);
                    $(this).closest(".results-row").addClass("selected");
                }

                $(this).toggleClass("is-checked");
                cwds.search.setSelectedCount(pg);
                cwds.search.setTopActionsVisibility(pg);
                $(sc).find(".search-details .code-only-grid-selected-id-list-field").val(JSON.stringify(cwds.search.dataSelected));

                var checkboxScriptCallback = $(this).data("checkbox-changed-callback");
                if (checkboxScriptCallback && checkboxScriptCallback !== '') {
                    cwds.utility.executeFunctionByName(checkboxScriptCallback, $(this), $(this).hasClass("is-checked"), cwds.search.dataSelected);
                }
            });

            //Select All Checkbox Checked in Header / Footer
            $('.selectAllCheck').click(function () {
                var _selectAllRecordsOfCurrentPage = $(this).data("select-all-current-page-records");
                var sc = $(this).closest(".search");
                var pg = $(sc).find(".pagination-section");
                var _maxSelectLimit = parseInt($(pg).attr('data-search-multi-select-limit'));
                var _functionId = $(sc).attr("ng-controller");
                var _apiUrl = $(sc).attr("search-api");

                if ($(sc).find(".search-details .code-only-grid-selected-id-list-field").length > 0) {
                    cwds.search.dataSelected = [];
                    cwds.search.dataSelected = JSON.parse($(sc).find(".search-details .code-only-grid-selected-id-list-field").val());
                }

                var selectedPages = [];
                if ($(sc).find(".search-details .code-only-grid-selected-pages").val() != undefined && $(sc).find(".search-details .code-only-grid-selected-pages").val() != '') {
                    selectedPages = $(sc).find(".search-details .code-only-grid-selected-pages").val().split(',');
                }

                var pageNumber = $(sc).find(".search-details .code-only-grid-page-number-hidden-field").val();
                var pgIdx = selectedPages.indexOf(pageNumber);

                var checkboxScriptCallback = $(this).data("checkbox-changed-callback");
                if ($(this).is(':checked')) {
                    $(this).attr("aria-checked", "true");
                    $('.selectAllCheckMark').addClass("selectAllCheckMarkSelected");

                    if (_selectAllRecordsOfCurrentPage) {
                        cwds.search.selcetedIds = [];
                        var reachedSelectionLimit = false;

                        var checkboxes = $(sc).find(".search-results .results-row .result-select a.checkbox");
                        var _selectedRecords = 0;
                        checkboxes.each(function (index) {
                            if (!$(this).hasClass("disabled")) {
                                //Check the selection limit is not going beyond.
                                if (cwds.search.dataSelected.length >= _maxSelectLimit) {
                                    reachedSelectionLimit = true;
                                    return false;
                                }

                                var _selectedIds = String($(this).data("search-row-id"));
                                var selectedIndex = cwds.search.dataSelected.indexOf(_selectedIds);
                                if (selectedIndex < 0) {
                                    cwds.search.dataSelected.push(_selectedIds);
                                }
                                _selectedRecords++;
                            }
                        });

                        if (checkboxes.length === _selectedRecords) {
                            if (pgIdx == -1) { selectedPages.push(pageNumber); }
                            $(sc).find(".search-details .code-only-grid-selected-pages").val(selectedPages.toString());
                        }

                        //Selecting all checkboxes and setting other section hide/show
                        cwds.search.setPageCheckboxStateOnRefresh();

                        if (reachedSelectionLimit || cwds.search.dataSelected.length > _maxSelectLimit) {
                            $(sc).find('div[id$="SearchMaxSelectionModelPopup"]').modal({ keyboard: false });
                            return;
                        }

                        if (checkboxScriptCallback && checkboxScriptCallback !== '') {
                            cwds.utility.executeFunctionByName(checkboxScriptCallback, $(this), true, cwds.search.dataSelected);
                        }

                    } else {
                        if (cwds.search.dataSelected.length >= _maxSelectLimit) {
                            $(sc).find('div[id$="SearchMaxSelectionModelPopup"]').modal({ keyboard: false });
                            return;
                        }

                        cwds.search.setSpinner(sc);

                        var keyword = $("#SearchModel_Keywords").val();
                        var selectAllRequest = {
                            "keywords": keyword,
                            "rows": _maxSelectLimit,
                            "pageNumber": 1,
                            "appliedFacets": cwds.facet.applied,
                            "searchFunctionId": _functionId,
                            "sortBy": $(sc).find(".sortby-section .search-sort-by").first().val() + ' ' + $(sc).find(".sortby-section .sort-atoz").first().attr('data-sort-order')
                        };
                        selectAllRequest = { "SearchModel": selectAllRequest };

                        cwdsapi.post(_apiUrl, selectAllRequest, cwds.search.successCallbackForSelectAll, cwds.search.errorCallbackForSelectAll);
                    }
                }
                else {
                    $('.selectAllCheckMark').removeClass("selectAllCheckMarkSelected");
                    $(this).attr("aria-checked", "false");

                    if (pgIdx >= 0) {
                        selectedPages.splice(pgIdx, 1);
                        $(sc).find(".search-details .code-only-grid-selected-pages").val(selectedPages.toString());
                    }

                    if (cwds.search.dataSelected.length > 0) {
                        var checkboxes = $(sc).find(".search-results .results-row .result-select a.checkbox");
                        checkboxes.each(function (index) {
                            var _selectedIds = String($(this).data("search-row-id"));
                            var selectedIndex = cwds.search.dataSelected.indexOf(_selectedIds);
                            if (selectedIndex >= 0) {
                                cwds.search.dataSelected.splice(selectedIndex, 1);
                            }
                        });
                    }

                    cwds.search.setPageCheckboxStateOnRefresh();

                    //Select all checkbox is unselected, remove all the selection.
                    if (!_selectAllRecordsOfCurrentPage) {
                        cwds.search.retainSelection = false;
                        cwds.search.clearSelected(sc);
                    }

                    if (checkboxScriptCallback && checkboxScriptCallback !== '') {
                        cwds.utility.executeFunctionByName(checkboxScriptCallback, $(this), false, cwds.search.dataSelected);
                    }
                }
                $(sc).find(".search-details .code-only-grid-selected-id-list-field").val(JSON.stringify(cwds.search.dataSelected));
            });
        },
        setPageCheckboxStateOnRefresh: function () {
            var sc = $(".search");
            var pg = $(sc).find(".pagination-section");
            var _selectedRows = 0;
            var _removedRows = 0;

            var _maxSelectLimit = parseInt($(pg).attr('data-search-multi-select-limit'));
            var checkboxes = $(sc).find(".search-results .results-row .result-select a.checkbox");
            var _pageRows = checkboxes.length;
            checkboxes.each(function (index) {
                var _selectedIds = String($(this).data("search-row-id"));
                var selectedIndex = cwds.search.dataSelected.indexOf(_selectedIds);
                if (selectedIndex >= 0 && !$(this).hasClass("disabled")) {
                    $(this).addClass("is-checked");
                    $(this).closest(".results-row").addClass("selected");
                    _selectedRows++;
                } else {
                    $(this).removeClass("is-checked");
                    $(this).closest(".results-row").removeClass("selected");
                    if (selectedIndex >= 0) { cwds.search.dataSelected.splice(selectedIndex, 1); }
                    _removedRows++;
                }
            });

            var _currentPageNumber = $(sc).find(".search-details .code-only-grid-page-number-hidden-field").val();
            var selectedPages = [];
            if ($(sc).find(".search-details .code-only-grid-selected-pages").val() != undefined || $(sc).find(".search-details .code-only-grid-selected-pages").val() != '') {
                selectedPages = $(sc).find(".search-details .code-only-grid-selected-pages").val().split(',');
            }
            var _currentPageSelectedIndex = selectedPages.indexOf(_currentPageNumber);

            if (_selectedRows >= _pageRows || _selectedRows >= _maxSelectLimit) {
                $(sc).find('.selectAllCheckMark').addClass("selectAllCheckMarkSelected");
                $(sc).find(".selectAllCheck").prop('checked', true).attr("aria-checked", "true");
                if (_currentPageSelectedIndex == -1) { selectedPages.push(_currentPageNumber); }
            } else {
                $(sc).find('.selectAllCheckMark').removeClass("selectAllCheckMarkSelected");
                $(sc).find(".selectAllCheck").prop('checked', false).attr("aria-checked", "false");
                if (_currentPageSelectedIndex >= 0 && _removedRows >= _pageRows) {
                    selectedPages.splice(_currentPageSelectedIndex, 1);
                }
            }

            $(sc).find(".search-details .code-only-grid-selected-pages").val(selectedPages.toString());

            if (!cwds.search.dataSelected || cwds.search.dataSelected.length <= 0) {
                $(sc).find(".search-selected").addClass("hidden");
            }

            cwds.search.setTopActionsVisibility(pg);
            cwds.search.setSelectedCount(pg);
        },
        successCallbackForSelectAll: function (data) {
            var sc = $(".search");
            var results = data.results;

            var _validKeys = $.map($(sc).data("selection-fields").split(','), $.trim);
            cwds.search.dataSelected = [];
            for (var i = 0; i < results.length; i++) {
                var _selectionFieldValues = [];
                _validKeys.forEach(function (key) {
                    _selectionFieldValues.push(results[i][key]);
                });
                cwds.search.dataSelected.push(_selectionFieldValues.join("|"));
            }

            cwds.search.setPageCheckboxStateOnRefresh();
            $(sc).find(".search-details .code-only-grid-selected-id-list-field").val(JSON.stringify(cwds.search.dataSelected));

            var _selectAllCheckbox = $(sc).find(".selectAllCheck");
            var checkboxScriptCallback = _selectAllCheckbox.data("checkbox-changed-callback");
            if (checkboxScriptCallback && checkboxScriptCallback !== '') {
                cwds.utility.executeFunctionByName(checkboxScriptCallback, _selectAllCheckbox, true, cwds.search.dataSelected);
            }

            cwds.search.removeSpinner(sc);
        },
        errorCallbackForSelectAll: function (error) {
            console.log(error);
            cwds.search.removeSpinner($(".search"));
            alert("Unable to select all records due to API call failed. Please contact the system administrator.");
        },
        clearSelected: function (sc) {
            var pg = $(sc).find(".pagination-section");
            if (!cwds.search.retainSelection) {
                cwds.search.dataSelected = [];
                cwds.search.selcetedIds = [];
                $(sc).find(".search-details .code-only-grid-selected-id-list-field").val(JSON.stringify(cwds.search.dataSelected));
                $(sc).find(".search-details .code-only-grid-selected-pages").val('');
            }
            cwds.search.retainSelection = false;
            cwds.search.setTopActionsVisibility(pg);
            cwds.search.setSelectedCount(pg);
        },
        setSelectedCount: function (pg) {
            var sc = $(pg).closest(".search");
            if (cwds.search.dataSelected.length > 0) {
                $(sc).find(".search-selected").removeClass("hidden");
                $(sc).find(".search-selected .bulk-selected-count").html(cwds.search.dataSelected.length);
            } else {
                $(sc).find(".search-selected").addClass("hidden");
            }
        },
        setTopActionsVisibility: function (pg) {
            var l = cwds.search.dataSelected.length;
            var _maxSelectLimit = parseInt($(pg).attr('data-search-multi-select-limit'));
            if (l === 0) {
                $(pg).find("a.top-action-item, a.top-action-more").addClass("hidden");
            } else {
                $(pg).find("a.top-action-more").removeClass("hidden");
                $(pg).find("a.top-action-item").each(function () {
                    var rl = parseInt($(this).data("search-action-record-limit"));
                    if (rl > 0) {
                        if (rl >= l) {
                            $(this).removeClass("hidden");
                        } else {
                            $(this).addClass("hidden");
                        }
                    }
                });
                $(pg).find("ul.top-action-list a.top-action-list-item").each(function () {
                    var rl = parseInt($(this).data("search-action-record-limit"));
                    if (rl > 0) { if (rl >= l) $(this).closest("li").removeClass("hidden"); else $(this).closest("li").addClass("hidden"); }
                });
            }
        },

        showHideFilterCountVisibility: function () {
            var appliedFacetCount = 0;
            if (cwds.facet.applied.length > 0) {
                for (var i = 0; i < cwds.facet.applied.length; i++) {
                    if (cwds.facet.applied[i].Items.length > 0) {
                        if (cwds.facet.applied[i].Type === "Slider") {
                            appliedFacetCount += 1;
                        } else if (cwds.facet.applied[i].Type === "DropDown") {
                            var facetName = cwds.facet.applied[i].Name;
                            var itemCode = cwds.facet.applied[i].Items[0];
                            var defaultDDSel = $('.facet-list .facet-list-items[data-search-facet-name="' + facetName + '"]').find('select').find('option:first').val();
                            if (itemCode && defaultDDSel && (itemCode !== defaultDDSel)) {
                                appliedFacetCount += 1;
                            }
                        } else {
                            appliedFacetCount += cwds.facet.applied[i].Items.length;
                        }
                    }
                }
            }
            if (appliedFacetCount > 0) {
                $(".mobile-search #facetcount").empty().append(appliedFacetCount);
                $(".mobile-search .show-facet-count").removeClass("hidden");
            } else {
                $(".mobile-search #facetcount").empty();
                $(".mobile-search .show-facet-count").addClass("hidden");
            }
        },
        quickActions: function () {
            $(document).on('click', function (e) {
                if ((!$(e.target).closest('.action-more').length) && (!$(e.target).closest('.action-list').length)) {
                    $(".action-list:visible").addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                }
            });
            $("a.action-more").click(function (e) {
                e.preventDefault();
                var ctrl = $(this);
                var aI = $(ctrl).parent(".result-actions").find(".action-list");
                if ($(aI).hasClass("hidden")) {
                    $(".result-actions .action-list:visible").addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                    $(aI).removeClass("hidden");
                    $(ctrl).children("div.active-icon-indicator").addClass("active");
                    $(aI).find("a").first().focus();
                } else {
                    $(aI).addClass("hidden");
                    $("div.active-icon-indicator").removeClass("active");
                }
            });
            $(".result-actions .action-list").find("a").click(function (e) {
                e.preventDefault();
                $(".result-actions .action-list:visible").addClass("hidden");
            });
        },
        quickActionTopClick: function () {
            $(".search .results-pagination .top-action-more").click(function (e) {
                e.preventDefault();
                var tal = $(this).closest(".pagination-section").find(".top-action-list-label");
                if (tal.hasClass("hidden")) {
                    $(".top-action-list-label:visible").addClass("hidden");
                    tal.removeClass("hidden");
                    tal.attr("aria-hidden", "false");
                } else {
                    tal.addClass("hidden");
                    tal.attr("aria-hidden", "true");
                }
            });
            $(document).on('click', function (e) {
                if ((!$(e.target).closest('.top-action-more').length) && ($(e.target).closest('.top-action-list-label').length === 0)) {
                    $(".top-action-list-label:visible").addClass("hidden");
                    var tal = $(e.target).closest(".search-page").find("#results-top-pagination .pagination-section .top-action-list-label");
                    if ($(tal).hasClass("hidden")) { $(tal).attr("aria-hidden", "true"); } else { $(tal).attr("aria-hidden", "false"); }
                }
            });

            // R11.2 - Modified for JG WOTC Search and Introduced data-script-call-back attribute in Search.vbhtml. Remove Commented Section  
            $(".search .results-pagination").find("a.top-action-item, a.top-action-list-item").click(function (e) {
                e.preventDefault();
                var attr = $(this).attr("data-script-call-back");
                if (attr && attr !== "") {
                    var idList = [];
                    for (i = 0; i < cwds.search.dataSelected.length; i++) {
                        idList.push(cwds.search.dataSelected[i]);
                    }
                    cwds.utility.executeFunctionByName(attr, $(this), idList);
                } else {
                    cwds.utility.submitForm($(this).closest(".search").find(".search-details #SearchFunctionId").val() + $(this).attr("data-search-action-name"));
                }

            });
        },
        quickActionResultClick: function () {
            $(".search .results-row").find("a.quick-action-item, a.quick-action-item-cs, a.action-item, a.client-action-item").click(function (e) {
                let actionUrl = $(this).attr("href");
                //If the action button already have valid Href / Link then just redirect the user.
                if (!jgUtils.isUndefinedOrNullOrBlank(actionUrl) && actionUrl !== '#' && actionUrl.length > 15) {
                    window.location = actionUrl;
                    return;
                } else {
                    e.preventDefault(); //If its not valid Url, we will prevent the click event, and perform other operations.
                }

                //If the action link is not valid, it will trigger expected callback operations as expected.
                var selectedRowDataIds = $(this).closest(".results-row").find(".result-select a.checkbox").attr("data-search-row-id");

                if ($(this).hasClass("client-action-item") || $(this).hasClass("quick-action-item-cs")) {
                    var idList = [];
                    idList.push(selectedRowDataIds);
                    cwds.utility.executeFunctionByName($(this).attr("data-script-call-back"), this, idList);
                }
                else {
                    cwds.search.dataSelected = [];
                    cwds.search.dataSelected.push(selectedRowDataIds);
                    $(this).closest(".search").find(".search-details .code-only-grid-selected-id-list-field").val(JSON.stringify(cwds.search.dataSelected));
                    cwds.utility.submitForm($(this).closest(".search").find(".search-details .code-only-grid-search-function-id-field").val() + $(this).attr("data-search-action-name"));
                }
            });
        },
        formatNumbers: function (num) {
            if (num) { return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
        },
        startExcelDownload: function (startDownload, count) {
            var mde = $("#ExportToExcelDialog");
            if (startDownload) {
                $('.' + jgUtils.class.req).addClass("ignore");
                $(mde).find("#ExportToExcelDetails").addClass("hidden");
                $(mde).find("#ExportToExcelStarted").removeClass("hidden");
                $(mde).find(".modal-footer").addClass("hidden");
                cwds.dialog.open("ExportToExcelDialog");
                cwds.utility.deleteCookie(cwds.search.exportToExcelCookieName);
                cwds.search.exportToExcelTimer = window.setInterval(cwds.search.excelDownloadTimer, 200);
                $('form').submit();
            } else {
                $(mde).find(".export-to-excel-download-limit").html(count);
                $(mde).find("#ExportToExcelDetails").removeClass("hidden");
                $(mde).find("#ExportToExcelStarted").addClass("hidden");
                $(mde).find(".modal-footer").removeClass("hidden");
                cwds.dialog.open("ExportToExcelDialog");
            }
        },
        excelDownloadTimer: function () {
            if (cwds.utility.getCookie(cwds.search.exportToExcelCookieName) === "1") {
                window.clearInterval(cwds.search.exportToExcelTimer);
                cwds.dialog.close("ExportToExcelDialog");
                cwds.utility.deleteCookie(cwds.search.exportToExcelCookieName);
            }
        },
        assignSelectedIDs: function (selectedIDs) {
            jgUtils.messages.clear();
            $("input[name='SearchModel.SelectedIdList']").empty();
            $("input[name='SearchModel.SelectedIdList']").val(JSON.stringify(selectedIDs));
        },
        getSelectedIDs: function (selectedElement) {
            if ($(selectedElement)) {
                let selRowDetails = $(selectedElement).closest(".results-row").find(".result-select a.checkbox").data("search-row-id");
                let selRowDetailsList = [];
                selRowDetailsList.push(selRowDetails);
                return selRowDetailsList;
            }
            return null;
        }
    },
    searchTipsTable: {
        init: function () {
            $(".searchtips-container").each(function () {
                var index = -1;
                var colPos = -1;
                var colHeader = [];
                var colCI = [];
                $(this).find(".searchtips-header-column").find(".searchtips-header-cell").each(function () {
                    index += 1;
                    if ($(this).hasClass("search-col-dest")) {
                        colPos = index;
                    } else {
                        colCI.push(index);
                        colHeader.push($(this).text());
                        $(this).addClass("hidden-sm hidden-xs");
                    }
                });
                if (colPos >= 0) {
                    $(this).find(".searchtips-column").each(function () {
                        var html = '<div class= "mt5 hidden-lg hidden-md">';
                        for (var i = 0, len = colCI.length; i < len; i++) {
                            var d = $(this).find(".searchtips-cell").get(colCI[i]);
                            $(d).addClass("hidden-sm hidden-xs");
                            html += '<div><label class="bold search-tips-col-heading">' + colHeader[i] + '</label> &nbsp;' + d.innerHTML + '</div>';
                        }
                        html += '</div>';
                        $($(this).find(".searchtips-cell").get(colPos)).append(html);
                    });
                }
            });
        }
    },
    dialog: {
        init: function () {
            $(".modal").each(function () {
                $(this).keydown(function (e) { cwds.dialog.stayInDialogOnTab($(this), e); });
                //$(this).keydown(function (e) { cwds.dialog.closeOnEscapeKey($(this), e); });
            });
            $(".modal.fade").click(function (event) {
                if (!$(event.target).closest('.modal-dialog').length > 0) {
                    $(this).find(".modal-header button").focus();
                }
            });
            $(".modal").on("shown.bs.modal", function () {
                cwds.dialog.enableDisablePage("true");
                $(this).click(function (e) {
                    if (!$(e.target).closest('.modal-content').length) { cwds.dialog.setFocus($(this)); }
                });
                cwds.dialog.setFocus($(this));
                cwds.dialog.activeDialog = $(this).attr("id");
                cwds.dialog.setAria(this, true);
                $(".msgs-jg").attr('data-msg-new', '0');
            });
            $(".modal").on("hidden.bs.modal", function () {
                cwds.dialog.enableDisablePage("false");
                if (typeof (closeDialogCallBack) === 'function') { closeDialogCallBack($(this).attr("id")); }
                cwds.dialog.clearErrors($(this).attr("id"));
                cwds.dialog.setAria(this, false);
                if ($(".msgs-jg").attr('data-msg-new') !== '1') { $(cwds.dialog.elementTriggeredDialog).focus(); }
                else { $(".msgs-jg").find('button.msgs-jg-hide').focus(); }
                cwds.dialog.elementTriggeredDialog = null;
                cwds.dialog.activeDialog = '';
                if ($('.modal.in').length > 0) { $('body').addClass("modal-open"); }
                else { $('body').removeClass("modal-open"); }
            });
        },
        activeDialog: '',
        elementTriggeredDialog: null,
        // Created global elements to focus to after modal window is closed.
        open: function (ctrl, setLoadingAnimation, allowEscKey) {
            if ($(document.activeElement).closest("div.panel.widget").not("hidden").length !== 0) {
                cwds.dialog.elementTriggeredDialog = $(document.activeElement).closest("div.panel.widget").not("hidden").find("a.hidden-accessible-button");
            } else {
                cwds.dialog.elementTriggeredDialog = document.activeElement;
            }
            let md = $('#' + ctrl);
            cwds.dialog.activeDialog = ctrl;
            $(md).modal({ backdrop: 'static', keyboard: (allowEscKey ?? true) });
            if ($(md).attr('data-initial-open') === "0") {
                cwds.dialog.clearErrors(ctrl);
            } else {
                $(md).attr('data-initial-open', '0');
                if ($(md).find(".modal-errors ul").length > 0) {
                    $(md).find(".modal-errors").removeClass("hidden");
                } else {
                    cwds.dialog.clearErrors(ctrl);
                }
            }
            if (setLoadingAnimation === true) {
                $(md).find('.modal-loading').removeClass("hidden");
            } else {
                $(md).find('.modal-loading').addClass("hidden");
            }
            $(md).find(".req-field, .jg-cv-req").each(function () {
                $(this).clearValidation();
                $(this).removeClass("ignore");
            });
            $(md).find("textarea.show-char-count").each(function () {
                jgUtils.initTextAreaCharCount($(this));
            });

            //Resize to refresh the CKeditor so its properly editable in mobile devices.
            if (typeof CKEDITOR !== "undefined" && CKEDITOR !== null && typeof CKEDITOR.instances !== "undefined" && CKEDITOR.instances !== null) {
                setTimeout(function () {
                    for (let ins in CKEDITOR.instances) {
                        if ($(md).find("#" + ins).length > 0) {
                            CKEDITOR.instances[ins].resize();
                        }
                    }
                }, 300);
            }
        },
        adjustTextAreaCharCount: function (modelPopupId) {
            $('#' + modelPopupId).find("textarea.show-char-count").each(function () {
                jgUtils.initTextAreaCharCount($(this));
            });
        },
        alertDialog: function (ctrl, describedByCtrl) {
            cwds.dialog.open(ctrl);
            let md = $('#' + ctrl);
            $(md).attr('aria-labelledby', describedByCtrl).attr('role', 'alertdialog');
        },
        clearValidations: function (ctrl) {
            let md = $('#' + ctrl);
            $(md).find(".jg-cv-req").each(function () {
                $(this).clearValidation();
                $(this).removeClass("ignore");
            });
            $(md).find(".req-field").each(function () {
                $(this).clearValidation();
                $(this).removeClass("ignore");
            });
        },
        clearAlertDialog: function (ctrl) {
            $('#' + ctrl).attr('aria-labelledby', '').attr('role', '');
        },
        loadCompleted: function (ctrl) {
            $('#' + ctrl).find(".modal-loading").addClass("hidden");
        },
        showLoading: function (ctrl) {
            $('#' + ctrl).find(".modal-loading").removeClass("hidden");
        },
        hideLoading: function (ctrl) {
            $('#' + ctrl).find(".modal-loading").addClass("hidden");
        },
        appendErrors: function (modelPopupId, errorsToAppend) {
            let finalErrors = new Array();

            //Getting existing messages list
            let msgList = $('#' + modelPopupId).find('.modal-errors .msg-list');
            if (msgList && msgList.length > 0 && msgList.html() !== '') {
                if (msgList.find('li').length > 0) {
                    msgList.find('li').each(function () {
                        finalErrors.push($(this).html());
                    });
                } else {
                    finalErrors.push(msgList.find('strong').html());
                }
            }

            //Checking types and then combining both the list.
            if (jQuery.type(errorsToAppend) === "string") {
                finalErrors.push(errorsToAppend);
            } else if (jQuery.type(errorsToAppend) === "array") {
                for (let i = 0; i < errorsToAppend.length; i++) {
                    finalErrors.push(errorsToAppend[i]);
                }
            }

            cwds.dialog.__showErrors(modelPopupId, cwds.dialog.getMessages(finalErrors));
        },
        title: function (ctrl, title) {
            $("#" + ctrl).find(".modal-title").html(title);
            $("#" + ctrl).attr("aria-label", title + ' Modal Popup');
            $("#" + ctrl).find("button.close").attr("aria-label", 'Close ' + title + ' Modal Popup');
        },
        close: function (ctrl) {
            $("#" + ctrl).modal("hide");
        },
        closeOnEscapeKey: function (obj, e) {
            if ((e.which === 27) && (cwds.dialog.activeDialog !== '')) {
                cwds.dialog.close(cwds.dialog.activeDialog);
                e.preventDefault();
            }
        },
        stayInDialogOnTab: function (obj, e) {
            if (e.which === 9) {
                let fi = obj.find('*').filter("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(':visible');
                let nfi = fi.length;
                let fii = fi.index($(':focus'));
                if (e.shiftKey) { if (fii === 0) { fi.get(nfi - 1).focus(); e.preventDefault(); } }
                else { if (fii === nfi - 1) { fi.get(0).focus(); e.preventDefault(); } }
            }
        },
        enableDisablePage: function (ed) {
            $(".cs-page-content, .cs-error-sum").attr("aria-hidden", ed);
        },
        setBusinessErrors: function (modelPopupId, businessErrors) {
            cwds.dialog.__showErrors(modelPopupId, cwds.dialog.getMessages(businessErrors));
        },
        setBusinessMessageSuccess: function (modelPopupId) {
            cwds.dialog.showSuccessMessages(modelPopupId, 'Saved Successfully.');
        },
        __showErrors: function (modelPopupId, erroMessagesHtml) {
            let errorTitle = 'Please check the following errors: ';
            if ($(".msgs-jg .msg-list").attr('data-error-title') && $(".msgs-jg .msg-list").attr('data-error-title') !== '') {
                errorTitle = $(".msgs-jg .msg-list").attr('data-error-title');
            }

            let finalErrorText = '';
            if (erroMessagesHtml && erroMessagesHtml.indexOf('<li>') >= 0) {
                finalErrorText += '<span class="db">' + errorTitle + '</span>';
                finalErrorText += '<ul class="mt10">';
                finalErrorText += erroMessagesHtml;
                finalErrorText += '</ul>';
            } else {
                finalErrorText = erroMessagesHtml;
            }
            cwds.dialog.__showMessages(modelPopupId, finalErrorText, 'bs-callout-danger');
        },
        setErrors: function (modelPopupId, errors) {
            cwds.dialog.__showErrors(modelPopupId, cwds.dialog.getMessages(errors));
        },
        showSuccessMessages: function (modelPopupId, messages) {
            cwds.dialog.__showMessages(modelPopupId, cwds.dialog.getMessages(messages), 'bs-callout-success');
        },
        showWarningMessages: function (modelPopupId, messages) {
            cwds.dialog.__showMessages(modelPopupId, cwds.dialog.getMessages(messages), 'bs-callout-warning');
        },
        clearErrors: function (modelPopupId) {
            cwds.dialog.clearMessages(modelPopupId);
        },
        clearMessages: function (modelPopupId) {
            $('#' + modelPopupId).find('.modal-errors .msg-list').html('');
            $('#' + modelPopupId).find('.modal-errors').addClass("hidden").attr('aria-hidden', 'true').removeAttr('role');
        },
        getMessages: function (msg) {
            let list = '';
            if (msg && msg.length > 0) {
                if (jQuery.type(msg) === "array") {
                    if (msg.length === 1) {
                        list += '<strong>' + (msg[0].Message ? msg[0].Message : msg[0]) + '</strong>';
                    } else {
                        for (let i = 0; i < msg.length; i++) {
                            list += '<li>' + (msg[i].Message ? msg[i].Message : msg[i]) + '</li>';
                        }
                    }
                }
                else {
                    list += '<strong>' + msg + '</strong>';
                }
            }

            return list;
        },
        __showMessages: function (modelPopupId, messagesHtml, calloutClassName) {
            let modelDialog = $('#' + modelPopupId);
            let bsCallout = modelDialog.find(".modal-errors .bs-callout");
            if (bsCallout) {
                bsCallout.removeClass("bs-callout-danger").removeClass("bs-callout-success").removeClass("bs-callout-warning");
                bsCallout.addClass((!calloutClassName || calloutClassName === '' ? 'bs-callout-danger' : calloutClassName));

                let list = '<a href="#" class="code-only-dialog-error-focus" aria-hidden="true" tabindex="-1"><span class="sr-only">Errors</span></a>';
                list += messagesHtml;

                modelDialog.find('.modal-errors .msg-list').html(list);
                modelDialog.find('.modal-errors').removeClass("hidden").attr('aria-hidden', 'false').attr('role', 'alert');
                modelDialog.find('.code-only-dialog-error-focus').focus();
            }
        },
        setFocus: function (ctrl) {
            let fi = $(ctrl).find(".modal-body").find('*').filter("a[href], area[href], :not([data-provide='datepicker']), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter(':visible');
            if (fi.length > 0) { fi.get(0).focus(); }
            else {
                if ($(ctrl).find(".modal-start-focus").length > 0) {
                    $(ctrl).find(".modal-start-focus").focus();
                }
                else if ($(ctrl).find(".modal-header button").length > 0) {
                    $(ctrl).find(".modal-header button").focus();
                }
            }
        },
        setAria: function (dg, showDialog) {
            let dv = (!showDialog).toString();
            $(dg).attr('aria-hidden', dv);
            $(dg).attr('tabindex', (showDialog ? '0' : '-1'));

            if (showDialog) {
                $('#mainHeader').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#StaffHeader').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#LoogedinMainHeader').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#sidebar').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#footer').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#PageFormContent').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('.message-panel').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('.staff-header').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('.skip-to-main').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#back-to-top').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('.ginger-extension-writer').attr('aria-hidden', 'true').attr('tabindex', '-1');
                $('#menuHeader').attr('aria-hidden', 'true').attr('tabindex', '-1');

                //Based on new stucture of HTML
                $("div[role='banner']").attr('aria-hidden', 'true').attr('tabindex', '-1');
                $("div[role='contentinfo']").attr('aria-hidden', 'true').attr('tabindex', '-1');
                $(".business-messages").attr('aria-hidden', 'true').attr('tabindex', '-1');
                $("#bannerHeadingImage").attr('aria-hidden', 'true').attr('tabindex', '-1');

                //Google plugins on PACL
                $("#goog-gt-tt").attr('aria-hidden', 'true').attr('tabindex', '-1');
                $(".goog-te-spinner-pos").attr('aria-hidden', 'true').attr('tabindex', '-1');
            } else {
                $('#mainHeader').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#StaffHeader').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#LoogedinMainHeader').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#sidebar').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#footer').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#PageFormContent').removeAttr('aria-hidden').removeAttr('tabindex');
                $('.message-panel').removeAttr('aria-hidden').removeAttr('tabindex');
                $('.staff-header').removeAttr('aria-hidden').removeAttr('tabindex');
                $('.skip-to-main').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#back-to-top').removeAttr('aria-hidden').removeAttr('tabindex');
                $('.ginger-extension-writer').removeAttr('aria-hidden').removeAttr('tabindex');
                $('#menuHeader').removeAttr('aria-hidden').removeAttr('tabindex');

                //Based on new stucture of HTML
                $("div[role='banner']").removeAttr('aria-hidden').removeAttr('tabindex');
                $("div[role='contentinfo']").removeAttr('aria-hidden').removeAttr('tabindex');
                $(".business-messages").removeAttr('aria-hidden').removeAttr('tabindex');
                $("#bannerHeadingImage").removeAttr('aria-hidden').removeAttr('tabindex');

                //Google plugins on PACL
                $("#goog-gt-tt").removeAttr('aria-hidden').removeAttr('tabindex');
                $(".goog-te-spinner-pos").removeAttr('aria-hidden').removeAttr('tabindex');
            }
        },
        showAudit: function (modelPopupId, auditInfo) {
            cwds.dialog.hideAudit(modelPopupId);
            var modelBody = $('#' + modelPopupId + ' .modal-body:not(.modal-errors)');
            if (auditInfo && auditInfo.CreatedById && auditInfo.CreatedById > 0) {
                var auditHtml = '<div class="row code-only-audit-info">';
                auditHtml += '<div class="col-xs-12">';
                auditHtml += '<div class="p10 mt10 mb5 gray-lighter-bg">';

                auditHtml += '<div class="row">';
                auditHtml += '<div class="col-md-3 col-sm-6 col-xs-12">';
                auditHtml += '<span class="form-label s12">Created Date</span>';
                auditHtml += '<div class="form-content pb0 s14 color-dark">' + jgUtils.date.formatDateAndTime(auditInfo.CreatedDate) + '</div>';
                auditHtml += '</div>';
                auditHtml += '<div class="col-md-3 col-sm-6 col-xs-12">';
                auditHtml += '<span class="form-label s12">Created By</span>';
                auditHtml += '<div class="form-content pb0 s14">' + auditInfo.CreatedBy + '</a></div>';
                auditHtml += '</div>';
                if (auditInfo.UpdatedById > 0) {
                    auditHtml += '<div class="col-md-3 col-sm-6 col-xs-12">';
                    auditHtml += '<span class="form-label s12">Updated Date</span>';
                    auditHtml += '<div class="form-content pb0 s14 color-dark">' + jgUtils.date.formatDateAndTime(auditInfo.UpdatedDate) + '</div>';
                    auditHtml += '</div>';
                    auditHtml += '<div class="col-md-3 col-sm-6 col-xs-12">';
                    auditHtml += '<span class="form-label s12">Updated By</span>';
                    auditHtml += '<div class="form-content pb0 s14">';
                    if (!jgUtils.isUndefinedOrNullOrBlank(auditInfo.UpdatedBy)) {
                        auditHtml += auditInfo.UpdatedBy;
                    } else {
                        auditHtml += '-';
                    }
                    auditHtml += '</div>';
                    auditHtml += '</div>';
                }
                auditHtml += '</div>';

                auditHtml += '</div>';
                auditHtml += '</div>';
                auditHtml += '</div>';
                modelBody.append(auditHtml);
            }
        },
        hideAudit: function (modelPopupId) {
            if (modelPopupId && modelPopupId !== '') {
                var modelBody = $('#' + modelPopupId + ' .modal-body:not(.modal-errors)');
                if (modelBody.find(".code-only-audit-info").length > 0) {
                    modelBody.find(".code-only-audit-info").remove();
                }
            }
        }
    }
};;
//Good read on jQuery Validation: http://www.runningcoder.org/jqueryvalidation/

//Highlight control or control's containing div
var __icbv = false;

//Do not hide error on focus out: https://stackoverflow.com/questions/9430727/jquery-validation-remove-blur-on-one-field
$.validator.setDefaults({
    ignore: ".ignore, :hidden:not(.js-validate-hidden-field)",
    highlight: function (element) {
        if ($(element).is(':checkbox') || $(element).is(':radio')) {
            $(element).closest('.list-container').addClass("cv-error-border");
        } else if ($(element).is(':hidden.js-validate-hidden-field')) {
            $(element).closest('.error-border-container').addClass('cv-error-border');
            $(element).addClass("input-validation-error");
        } else {
            $(element).addClass("input-validation-error");
        }

        if ($(element).hasClass("cc-enable-rtf")) {
            $("#cke_" + $(element).attr("id")).addClass("input-validation-error");
        }

        //Removing invalid id from aria-describedby attributes.
        manageAriaDescriptionForInputFields($(element));
    },
    unhighlight: function (element) {
        if ($(element).is(':checkbox') || $(element).is(':radio')) {
            $(element).closest('.list-container').removeClass("cv-error-border");
        } else if ($(element).is(':hidden.js-validate-hidden-field')) {
            $(element).closest('.error-border-container').removeClass('cv-error-border');
            $(element).removeClass("input-validation-error");
        } else {
            $(element).removeClass("input-validation-error");
        }

        if ($(element).hasClass("cc-enable-rtf")) {
            $("#cke_" + $(element).attr("id")).removeClass("input-validation-error");
        }

        //Removing invalid id from aria-describedby attributes.
        manageAriaDescriptionForInputFields($(element));
    }
});

function manageAriaDescriptionForInputFields(element) {
    //May be try other approch as well:
    //https://stackoverflow.com/questions/1244214/jquery-validation-plugin-how-to-call-a-function-when-a-field-is-validated
    //https://stackoverflow.com/questions/26498899/jquery-validate-custom-error-message-location

    //If input field is missing id, we are adding it when its required field.
    if (!jgUtils.isUndefinedOrNullOrBlank($(element).data("val")) && jgUtils.isUndefinedOrNullOrBlank($(element).attr("id")) && !jgUtils.isUndefinedOrNullOrBlank($(element).attr("name"))) {
        var uniqueIdFromName = $(element).attr("name");
        uniqueIdFromName = uniqueIdFromName.replace(/\\/g, '').replace(/\$/g, '').replace(/\./g, '_');
        $(element).attr("id", uniqueIdFromName);
    }

    var fieldIds = $(element).attr("aria-describedby");
    if (!jgUtils.isUndefinedOrNullOrBlank(fieldIds)) {
        fieldIds = fieldIds.replace(/\\/g, '').replace(/\$/g, '').replace(/\./g, '_');
        var describedbyArray = (fieldIds).split(/\s+/);
        var uniqueAriaIDList = [];
        describedbyArray.forEach(function (elementId) {
            if ($('#' + elementId).length > 0 && uniqueAriaIDList.indexOf(elementId) !== -1) {
                uniqueAriaIDList.push(elementId);
            }
        });

        if (uniqueAriaIDList.length > 0) {
            $(element).attr("aria-describedby", uniqueAriaIDList.join(" "));
        } else {
            $(element).removeAttr("aria-describedby");
        }
    }
}

$(function () {
    $("input[type=checkbox].jg-cv-req").on('keydown', function (e) {
        if (e.which === 9) {
            var c = $(this).attr("id");
            var f = $(this).closest(".list-container").find("input:checkbox:first").attr("id");
            var l = $(this).closest(".list-container").find("input:checkbox:last").attr("id");
            __icbv = ((e.shiftKey && f !== c) || (!e.shiftKey && l !== c));
            //console.log('first: ' + f + ', last: ' + l + ', current: ' + c + ', status: ' + __icbv);
        }
    });

    $(".jg-cv-req:not(.ignore)").on('blur change', function () {
        var control = $(this);
        if (control.is(':radio')) {
            if (!$('[id*="' + control.attr('name').replace('.', '_') + '"]').is(':focus')) { control.valid(); }
        }
        else if (control.is(':checkbox')) {
            if (!__icbv) { control.valid(); }
            __icbv = false;
        }
        else if (control.attr('data-provide') === 'datepicker') {
            if (control.val() !== undefined && control.val() !== null && control.val() !== '' && control.val() !== "__/__/____") {
                control.valid();
            }
        } else {
            control.valid();
        }
    });

    // Because we are dealing with hidden fields, be sure to call .trigger('change') whenever setting the hidden fields value.
    $(':hidden.js-validate-hidden-field').on('change', function () {
        $(this).valid();
    });

    $(".jg-datepicker:not(.jg-cv-req)").on('blur change', function () {
        var control = $(this);
        control.valid();
    });

    //Assign the input field max-length for restriction
    $("input[data-val-length-max], textarea[data-val-length-max]").each(function () {
        if (!$(this).attr("maxlength")) {
            var length = parseInt($(this).data("val-length-max"));
            $(this).prop("maxlength", length);
        }
    });

    $(document).ready(function () {
        //Block Copy and Paste on any input field
        $('.block-copy-paste').on("cut copy paste", function (e) {
            e.preventDefault();
        });

        //Only allow Numeric values to 'Paste' on any input field 
        $('.allow-copy-paste-numeric').on("paste", function (e) {
            let checkString = e.originalEvent.clipboardData.getData('Text');
            if (!jgUtils.isUndefinedOrNull(checkString) && checkString !== '' && $.isNumeric(checkString)) {
                $(this).val(checkString);
            } else {
                e.preventDefault();
            }
        });

        //Allow only number digits to be type on any input field.
        $(document).on('keypress', ".only-numeric", function (e) {
            if (e.which !== 8 && e.which !== 0 && (e.which < 48 || e.which > 57)) {
                return false;
            }

            return true;
        });

        //Check for may be correct implementation.
        //https://stackoverflow.com/questions/38989559/jquery-keyup-event-for-mobile-device
        //Allow only currency digits to be type on any input field.
        //404197: Included [-]? to accept Negative amount
        $(document).on('keyup input', ".only-currency", function (e) {
            let finalString = (jgUtils.isUndefinedOrNull($(this).val()) ? '' : $(this).val()).toLowerCase();
            let currencyRegEx = /^\$?[-]?(\d{0,10})(\.\d{0,2})?$/;

            if (finalString !== '' && !currencyRegEx.test(finalString)) {
                finalString = finalString.replace(String.fromCharCode(e.which).toLowerCase(), '');
                $(this).val(finalString);
            }

            if (e.which === 8 || e.which === 0 || currencyRegEx.test(finalString)) {
                return true;
            }

            return false;
        });
    });
});


//JG Custom Validation
$.validator.addMethod("jgrequired", function (value, element, params) {
    if (typeof (value) === 'undefined' || value === null || value.toString().trim() === '') {
        return false;
    }

    return true;
});

$.validator.unobtrusive.adapters.add("jgrequired", function (options) {
    options.rules["jgrequired"] = options.element.id;
    options.messages["jgrequired"] = options.message;
});

//Radiobutton List Validation
$.validator.addMethod("radiobuttonlistrequired", function (value, element, params) {
    if ($("[name='" + element.name + "']").filter(function () { return $(this).is(":checked"); }).length > 0) {
        return true;
    }

    return false;
});

$.validator.unobtrusive.adapters.add("radiobuttonlistrequired", function (options) {
    options.rules["radiobuttonlistrequired"] = options.element.id;
    options.messages["radiobuttonlistrequired"] = options.message;
});

//Checkbox List Validation
$.validator.addMethod("checkboxlistrequired", function (value, element, params) {
    if ($("[name='" + element.name + "']").filter(function () { return $(this).is(":checked"); }).length > 0) {
        return true;
    }

    return false;
});

$.validator.unobtrusive.adapters.add("checkboxlistrequired", function (options) {
    options.rules["checkboxlistrequired"] = options.element.id;
    options.messages["checkboxlistrequired"] = options.message;
});


//SSN Validation
$.validator.addMethod("ssnrequired", function (value, element, params) {
    value = value.replace(/_/g, '').replace(/-/g, '');
    if (value.length !== 9) {
        return false;
    }

    return true;
});

$.validator.unobtrusive.adapters.add("ssnrequired", function (options) {
    options.rules["ssnrequired"] = options.element.id;
    options.messages["ssnrequired"] = options.message;
});

$.validator.addMethod("ssnnotrequired", function (value, element, params) {
    return true;
});

//Date Validation
$.validator.addMethod("validatedate", function (value, element, params) {
    return validateDate(value, element, false);
});

$.validator.unobtrusive.adapters.add("validatedate", function (options) {
    options.rules["validatedate"] = options.element.id;
    options.messages["validatedate"] = options.message;
});

$.validator.addMethod("daterequired", function (value, element, params) {
    if (value.trim() === '') {
        return false;
    }

    return true;
});

$.validator.unobtrusive.adapters.add("daterequired", function (options) {
    options.rules["daterequired"] = options.element.id;
    options.messages["daterequired"] = options.message;
});

$.validator.addMethod("futuredatecheck", function (value, element, params) {
    return isPastOrCurrentDate(value, element);
});

$.validator.unobtrusive.adapters.add("futuredatecheck", function (options) {
    options.rules["futuredatecheck"] = options.element.id;
    options.messages["futuredatecheck"] = options.message;
});

function isPastOrCurrentDate(value, element) {
    if (value != "__/__/____" && value != "") {
        var mm = value.substr(0, 2);
        var dd = value.substr(3, 2);
        var yyyy = value.substr(6, 4);
        var fdtDate = mm + "/" + dd + "/" + yyyy;
        fdtDate = Date.parse(fdtDate);
        var ldtCurrentDate = new Date();
        if (fdtDate > ldtCurrentDate) {
            return false;
        }
    }
    return true;
}

$.validator.addMethod("shouldbefuturedatecheck", function (value, element, params) {
    return isFutureDate(value, element);
});

$.validator.unobtrusive.adapters.add("shouldbefuturedatecheck", function (options) {
    options.rules["shouldbefuturedatecheck"] = options.element.id;
    options.messages["shouldbefuturedatecheck"] = options.message;
});

function isFutureDate(value, element) {
    if (value != "__/__/____" && value != "") {
        var mm = value.substr(0, 2);
        var dd = value.substr(3, 2);
        var yyyy = value.substr(6, 4);
        var fdtDate = mm + "/" + dd + "/" + yyyy;
        fdtDate = Date.parse(fdtDate);
        var ldtCurrentDate = new Date();
        if (fdtDate <= ldtCurrentDate) {
            return false;
        }
    }
    return true;
}

$.validator.addMethod("pastdatecheck", function (value, element, params) {
    return isPastDate(value, element);
});

$.validator.unobtrusive.adapters.add("pastdatecheck", function (options) {
    options.rules["pastdatecheck"] = options.element.id;
    options.messages["pastdatecheck"] = options.message;
});

function isPastDate(value, element) {
    if (value != "__/__/____" && value != "") {
        var mm = value.substr(0, 2);
        var dd = value.substr(3, 2);
        var yyyy = value.substr(6, 4);
        var fdtDate = mm + "/" + dd + "/" + yyyy;
        fdtDate = Date.parse(fdtDate);
        var ldtCurrentDate = new Date();
        var result = ((ldtCurrentDate.getMonth().toString().length > 1) ? (ldtCurrentDate.getMonth() + 1) : ('0' + (ldtCurrentDate.getMonth() + 1))) + '/' + ((ldtCurrentDate.getDate().toString().length > 1) ? ldtCurrentDate.getDate() : ('0' + ldtCurrentDate.getDate())) + '/' + ldtCurrentDate.getFullYear();
        if (fdtDate < Date.parse(result)) {
            return false;
        }
    }
    return true;
}

function validateDate(value, element, isRequired) {
    var d = $.trim(value);
    if (!isRequired && (d == "" || d == "mm/dd/yyyy" || d == "mm/yyyy" || d == "__/__/____" || d == "__/____")) {
        return true;
    } else {
        if (d != "" && d != "mm/dd/yyyy" && d != "mm/yyyy" && d != "__/__/____" && d != "__/____") {
            s = isValidDate(d);
            if (!s && $(element).attr("data-date-format") === "mm/yyyy") {
                var t = d.split('/');
                if (t.length > 1) d = t[0] + "/01/" + t[1];
                for (var i = 2, len = t.length; i < len; i++) {
                    d += "/" + t[i];
                }
                s = isValidDate(d);
            }
            if (!s) { return false; } else { return true; }
        }
    }
}

function isValidDate(value) {
    dl = /[^mdy]/.exec("mm/dd/yyyy")[0],
        f = ("mm/dd/yyyy").split(dl),
        dt = value.split(dl),
        isdt = function (date, ft) {
            var m, d, y
            for (var i = 0, len = ft.length; i < len; i++) {
                if (/m/.test(ft[i])) m = date[i]
                if (/d/.test(ft[i])) d = date[i]
                if (/y/.test(ft[i])) y = date[i]
            }
            return (m > 0 && m < 13 && y && y.length === 4 && y >= 1753 && d > 0 && d <= (new Date(y, m, 0)).getDate())
        }
    return isdt(dt, f)
}



//Phone Validation
$.validator.addMethod("phonerequired", function (value, element, params) {
    value = value.replace(/_/g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, '').replace(/\D/g, '');
    if (value.trim() === '') {
        return false;
    } else {
        return true;
    }
});

$.validator.unobtrusive.adapters.add("phonerequired", function (options) {
    var id = '#' + options.element.id;
    var errorMessage = $(id).closest('[data-val-phonemsg]').attr('data-val-phonemsg');
    errorMessage = errorMessage + " " + options.message;
    options.rules["phonerequired"] = options.element.id;
    options.messages["phonerequired"] = errorMessage;
});

// RequiredIf Validation
$.validator.addMethod("requiredif", function (value, element, params) {
    if (typeof value === 'undefined' || value == "") {
        var data = JSON.parse(params);
        var objNamePrefix = element.name.substr(0, element.name.lastIndexOf('.') + 1);
        var isRequired = false;
        var previousResult = false;
        //var objIDPrefix = '#' + element.name.substr(0, element.name.lastIndexOf('.') + 1).replace(/\./g, '_');

        var RelationalOperator = {
            EqualTo: 1,
            NotEqualTo: 2,
            GreaterThan: 3,
            LessThan: 4,
            CollectionContains: 5
        };

        var LogicalOperator = {
            AndAlso: 1,
            OrElse: 2
        };

        $.each(data, function (_index, _condition) {
            var objName = objNamePrefix + _condition.ConditionField;
            var obj = $('input[name="' + objName + '"]:not(:hidden)'); // :not(:hidden) needed for Standalone CheckBoxes/Toggle Buttons to work correctly.
            var result = false;

            if (obj.length == 0) {
                obj = $('input[name="' + objName + '"]');

                if (obj.length == 0) {
                    obj = $('select[name="' + objName + '"]');

                    if (obj.length == 0) {
                        //console.log("RequiredIf: Could not locate object '" + objName + "'to be validated.");
                        return false; // Exit loop
                    }
                }
            }

            var valueArray = [];

            if (obj.length == 1) {
                if (obj.get(0).type == "radio" || obj.get(0).type == "checkbox") {
                    if (obj.get(0).checked == true) {
                        valueArray.push("True");
                    } else {
                        valueArray.push("False");
                    }
                } else {
                    valueArray.push(obj.get(0).value);
                }
            } else {
                $.each(obj, function (__index, __item) {
                    if (__item.type == "radio" || __item.type == "checkbox") {
                        if (__item.checked == true) {
                            valueArray.push(__item.value);
                        }
                    } else {
                        valueArray.push(__item.value);
                    }
                });
            }

            switch (_condition.RelationalOperator) {
                case RelationalOperator.EqualTo:
                    if (valueArray[0].toString().toLowerCase() == _condition.ConditionValue.toString().toLowerCase()) {
                        result = true;
                    }
                    break;
                case RelationalOperator.NotEqualTo:
                    if (valueArray[0].toString().toLowerCase() != _condition.ConditionValue.toString().toLowerCase()) {
                        result = true;
                    }
                    break;
                case RelationalOperator.GreaterThan:
                    if (valueArray[0].toString().toLowerCase() > _condition.ConditionValue.toString().toLowerCase()) {
                        result = true;
                    }
                    break;
                case RelationalOperator.LessThan:
                    if (valueArray[0].toString().toLowerCase() < _condition.ConditionValue.toString().toLowerCase()) {
                        result = true;
                    }
                    break;
                case RelationalOperator.CollectionContains:
                    $.each(valueArray, function (__index, __value) {
                        if (valueArray[__index].toString().toLowerCase() == _condition.ConditionValue.toString().toLowerCase()) {
                            result = true;
                            return false; // Exit loop
                        }
                    });
                    break;
                default:
                    //console.log("RequiredIf: Error with RelationalOperator type '" + _condition.RelationalOperator + "' and object '" + objName + "'.");
                    break;
            }

            if (_condition.PrecedingLogicalOperator == null) {
                if (data.length == 1) {
                    if (result) {
                        isRequired = true;
                        //return false; // Exit loop
                    }
                } else {
                    if (_index == 0) {
                        previousResult = result;
                    } else {
                        console.log("RequiredIf: Missing required input LogicalOperator.");
                    }
                }
            } else {
                switch (_condition.PrecedingLogicalOperator) {
                    case LogicalOperator.AndAlso:
                        if (previousResult && result) {
                            isRequired = true;
                            return false; // Exit loop
                        } else {
                            previousResult = result;
                        }
                        break;
                    case LogicalOperator.OrElse:
                        if (previousResult || result) {
                            isRequired = true;
                            return false; // Exit loop
                        } else {
                            previousResult = result;
                        }
                        break;
                    default:
                        //console.log("RequiredIf: LogicalOperator type '" + __condition.PrecedingLogicalOperator + "' not supported.");
                        break;
                }
            }
        });

        if (isRequired) {
            return false;
        } else {
            return true;
        }
    } else {
        return true;
    }
});

$.validator.unobtrusive.adapters.add("requiredif", ["requiredcondition"], function (options) {
    options.rules["requiredif"] = options.params.requiredcondition;
    options.messages["requiredif"] = options.message;
});

(function ($) {
    $.fn.ignoreValidation = function () {
        var $this = $(this);
        return $this.each(function () {
            $(this).attr("data-val", "true");
            $(this).attr("aria-invalid", "false");
            $(this).addClass('ignore');
            if ($(this).hasClass('cv-error')) { $(this).removeClass('cv-error'); }
            if ($(this).hasClass('input-validation-error')) { $(this).removeClass('input-validation-error') }
            else if ($(this).closest('.list-container').hasClass('cv-error-border')) { $(this).closest('.list-container').removeClass('cv-error-border'); }
            $("span.field-validation-error[data-valmsg-for='" + this.name + "']").html('').removeClass('field-validation-error').addClass('field-validation-valid');
        });
    };
    $.fn.clearValidation = function () {
        var $this = $(this);
        return $this.each(function () {
            $(this).attr("data-val", "true");
            $(this).attr("aria-invalid", "false");
            if ($(this).hasClass('cv-error')) { $(this).removeClass('cv-error'); }
            if ($(this).hasClass('input-validation-error')) { $(this).removeClass('input-validation-error') }
            else if ($(this).closest('.list-container').hasClass('cv-error-border')) { $(this).closest('.list-container').removeClass('cv-error-border'); }
            $("span.field-validation-error[data-valmsg-for='" + this.name + "']").html('').removeClass('field-validation-error').addClass('field-validation-valid');
        });
    };
    $.fn.setValidation = function () {
        var $this = $(this);
        return $this.each(function () { $(this).removeClass('ignore'); });
    };
    $.fn.textareaVal = function (text) {
        $(this).val(text);
        if ($(this).hasClass('show-char-count')) jgUtils.textAreaCharCount($(this));
    };
}(jQuery));
;
