/* Minification failed. Returning unminified contents.
(9,69-70): run-time error JS1100: Expected ',': =
 */
/* Minification failed. Returning unminified contents.
(6,69-70): run-time error JS1100: Expected ',': =
 */
(function (window, undefined) {
    var userSettingsService = namespace('AgencyPages').userSettingsService;

    var maxMobileScreenWidth = 767;

    function saveUserAgencySettings(isListView, saveDefaultPageView = false) {

        var currentPageUserSettings = userSettingsService.getSettings();

        if (!currentPageUserSettings) {
            currentPageUserSettings = {};
        }

        isListView = (isListView !== undefined)
            ? isListView
            : true;

        if (saveDefaultPageView) {
            if (currentPageUserSettings.isListViewDefaultForPage == isListView)
                return;
            else
                currentPageUserSettings.isListViewDefaultForPage = isListView
        }
        else
            currentPageUserSettings.isListView = isListView;
        userSettingsService.setSettings(currentPageUserSettings);
    }

    function ListGridViewService() {
        var self = this;

        self.isGridEnabled = false;

        self.showList = function(changeUserSettings, forceUpdate) {
            changeUserSettings = changeUserSettings !== undefined
                ? changeUserSettings
                : true;

            forceUpdate = forceUpdate !== undefined
                ? forceUpdate
                : false;

            if (self.isGridEnabled || forceUpdate) {
                self.isGridEnabled = false;

                $('ul.search-results-listing-container').removeClass('hidden');
                $('div.search-results-grid-container').addClass('hidden');
                $('div#eligible-list-result-container').removeClass('hidden');

                $('#action-list-view').parent().addClass('active');
                $('#action-grid-view').parent().removeClass('active');

                $(document).trigger('layoutUpdated');

                if (changeUserSettings) {
                    saveUserAgencySettings(true);
                }
            }
        };

        self.showGrid = function(changeUserSettings, forceUpdate) {
            changeUserSettings = changeUserSettings !== undefined
                ? changeUserSettings
                : true;

            forceUpdate = forceUpdate !== undefined
                ? forceUpdate
                : false;

            if (!self.isGridEnabled || forceUpdate) {
                self.isGridEnabled = true;

                $('ul.search-results-listing-container').addClass('hidden');
                $('div.search-results-grid-container').removeClass('hidden');
                $('div#eligible-list-result-container').removeClass('hidden');

                $('#action-list-view').parent().removeClass('active');
                $('#action-grid-view').parent().addClass('active');

                $(document).trigger('layoutUpdated');

                if (changeUserSettings) {
                    saveUserAgencySettings(false);
                }
            }
        };

        self.showCurrentViewRegardingUserSettings = function (pageSettings, forceUpdate) {
            if ($(window).width() > maxMobileScreenWidth) {
                if (pageSettings && pageSettings.isListView !== undefined) {
                    if (pageSettings.isListView) {
                        self.showList(false, forceUpdate);
                    } else {
                        self.showGrid(false, forceUpdate);
                    }
                }
                else if (pageSettings && pageSettings.isListViewDefaultForPage !== undefined) {
                    if (pageSettings.isListViewDefaultForPage) {
                        self.showList(false, forceUpdate);
                    } else {
                        self.showGrid(false, forceUpdate);
                    }
                }
            }
            else {
                self.showList(false, forceUpdate);
            }
        };

        self.updateView = function (forceUpdate) {
            self.showCurrentViewRegardingUserSettings(userSettingsService.getSettings(), forceUpdate);
        };

        self.saveDefaultPageViewSettings = function (isListView) {
            saveUserAgencySettings(isListView, true);
        }       
    }

    namespace('AgencyPages').listGridViewService = new ListGridViewService();
})(window);;
(function(window, undefined) {
    'use strict';

    var SCROLL_TOP = 0;
    var CLASSSPECS_PER_PAGE = 10;
    var ACTIVE_CLASS_SPEC = 'active-class-spec';
    var CLASS_SPEC_DESCRIPTION_CLAMP_LINE_COUNT = 2;

    var endpoint = AgencyPages.routePrefix + '/classspecifications/index';

    var userSettingsService = namespace('AgencyPages').userSettingsService;
    var listGridViewService = namespace('AgencyPages').listGridViewService;
    var pageInfoService = namespace('AgencyPages').pageInfoService;

    var flyout;
    var jobInterestCardViewModel;
    var sort = null;
    var filters = null;
    var employerFolderName = null;
    var keywords = '';
    var page = null;
    var initialUrl = pageInfoService.getCurrentInitialUrl();
    var layoutHelper = OnlineApp.Helpers.layoutHelper;

    var classSpecsListContainerSelector = '#class-specs-list-container';

    var searhContainer = $('#manage-bar');
    var searchForm = searhContainer.find('.search-form');
    var searchInput = $('input.form-control');
    var keywordSearchInput = searhContainer.find('#keyword-search-input');
    var buttonLink = $('button.btn.btn-link');
    var openSearchFormButton = searhContainer.find('#open-mobile-search-field-button');
    var $jobsContainer = $('.jobs-container');
    var overlay = $('#job-list-overlay');
    var numberFound = $('#number-found-items');
    var $spinner;
    var $openedNotification;
    var $detailsLoadedNotification;

    var $listViewBtn = $('#action-list-view');
    var $gridViewBtn = $('#action-grid-view');

    var filterflyout = undefined;
    var sortClassTitleAsc = 'ClassTitle|Ascending';

    var maxMobileScreenWidth = 767;
    var originalTitle = undefined;
    var classSpecTitle = undefined;
    var stopTitleUpdate = false,
        isOjrMasterQueryParameter = "isOjrMaster",
        emailAddressQueryParameter = "emailAddress",
        credentialQueryParameter = "credential";

    var $subscribeForMultipleClassSpecificationsButton = $('.subscribe-cards-for-multiple-class-specifications-btn');

    function clearNotifications () {
        if ($openedNotification) {
            gJobs.screenReadersService.clearNotification($openedNotification);
        }
        if ($detailsLoadedNotification) {
            gJobs.screenReadersService.clearNotification($detailsLoadedNotification);
        }
    }

    function showOverlay() {
        overlay.show();
    }

    function hideOverlay() {
        overlay.hide();
    }

    function clampClassSpecDescriptions() {
        $('#class-specs-list-container .search-results-listing-container .list-item .list-entry')
            .each(function () {
                clamp(this, CLASS_SPEC_DESCRIPTION_CLAMP_LINE_COUNT);
            });
    }

    function checkNavigationButtonsForVisibility(classSpecLi) {
        var nextButton = flyout.$wrapper.find('.next-posting');
        var prevButton = flyout.$wrapper.find('.prev-posting');

        if (hasNextClassSpec(classSpecLi)) {
            nextButton.removeClass('disable').removeAttr('tabindex aria-disabled');
        } else {
            nextButton.addClass('disable').attr({'tabindex': '-1', 'aria-disabled': 'true'});
        }
        if (hasPrevClassSpec(classSpecLi)) {
            prevButton.removeClass('disable').removeAttr('tabindex aria-disabled');
        } else {
            prevButton.addClass('disable').attr({'tabindex': '-1', 'aria-disabled': 'true'});
        }
    }

    function showClassSpecFlyout(classSpec) {
        clearNotifications();

        if (originalTitle === undefined) {
            originalTitle = document.title;
            stopTitleUpdate = true;
        }
        classSpecTitle = classSpec.classSpecsTitle;
        document.title = "Class Specifications | " + classSpecTitle + " | Class Spec Details";

        var content = $('#class-specs-flyout-content');
        var subscribeButtons = $('#class-specs-flyout-content .flyout-footer, .flyout-switch-button');
        var pageType = pageInfoService.getCurrentPageType().type;
        var query = namespace('AgencyPages').router.removePageTypeFromQuery(classSpec.query || location.search);
        var newQuery = query ?
            query + '&pagetype=' + pageType :
            '?pagetype=' + pageType;

        gJobs.screenReadersService.setNotification($openedNotification, classSpec.classSpecsTitle, ' flyout is loading', true);

        namespace('AgencyPages').router.navigate(classSpec.url + newQuery, true, false, null, null);

        subscribeButtons.addClass('hidden');
        
        $('.list-item').removeClass(ACTIVE_CLASS_SPEC);

        $(document).on('keyup', function (event) {
            if (event.keyCode === $.ui.keyCode.ESCAPE) {
                if ($(event.target).hasClass('job-details-salary-icon')) return;

                namespace('AgencyPages').router.navigate(initialUrl, true, false, null, null, true);
                $(document).off(event);
            }
        });

        var classSpecLi = getClassSpecLiById(classSpec.id);
        classSpecLi.addClass(ACTIVE_CLASS_SPEC);

        var $detailsContainer = $('.class-specs-flyout .details-page .scrollable-container');

        $detailsContainer.html($spinner);

        $.ajax({
            url: classSpec.url,
            cache: false,
            dataType: 'html',
            success: function (data) {
                gJobs.screenReadersService.setNotification($detailsLoadedNotification, classSpec.classSpecsTitle, ' flyout has been opened', true);
                $detailsContainer.html(data);
                $detailsContainer.find('.popover-trigger').popover();

                var $summary = content.find('.summary');
                var acceptSubscriptions = content.find('.scrollable-container > .container.entity-details-tab').data('accept-jic');

                if (acceptSubscriptions && acceptSubscriptions.toLowerCase() === 'true') {
                    subscribeButtons.removeClass('hidden');
                }

                var agencyClassSpecPrintingUrl = $summary.attr('data-printing-url');
                if (agencyClassSpecPrintingUrl) {
                    content.find('.print-button').attr('href', agencyClassSpecPrintingUrl);
                }
                let tablists = document.querySelectorAll('[role=tablist]');
                for (let i = 0; i < tablists.length; i++) {
                    new TabsManual(tablists[i]);
                }
                content.find("#class-spec-benefits-link").attr('tabindex', '-1');
                content.find('#class-spec-definition-link').on('click', function () {
                    $("#class-spec-benefits-link").attr('tabindex', '-1');
                    $("#class-spec-definition-link").attr('tabindex', '0');

                });

                content.find('#class-spec-definition-link').on('keydown', function (event) {
                    if (event.key == "Enter") {
                        $("#class-spec-benefits-link").attr('tabindex', '-1');
                        $("#class-spec-definition-link").attr('tabindex', '0');
                    }

                });
                content.find('#class-spec-benefits-link').on('click', function () {
                    $("#class-spec-benefits-link").attr('tabindex', '0');
                    $("#class-spec-definition-link").attr('tabindex', '1');

                });
                content.find('#class-spec-benefits-link').on('keydown', function (event) {
                    if (event.key == "Enter") {
                        $("#class-spec-benefits-link").attr('tabindex', '0');
                        $("#class-spec-definition-link").attr('tabindex', '1');
                    }

                });
            }
        });

        content.find('.details-page').addClass('active').css('visibility', 'visible');
        content.find('.job-interest-card-page').removeClass('active').css('visibility', 'hidden');

        checkNavigationButtonsForVisibility(classSpecLi);

        initJobInterestCardViewModel(classSpec.id);
        
        
    }

    function addClassSpecsListHandlers() {
        $jobsContainer.find('.item-details-link').on('click', function (event) {
            event.preventDefault();
            showClassSpecFlyout({
                url: $(this).attr('href'),
                id: $(this).parent().parent().data('class-spec-id'),
                classSpecsTitle: $(this).text()
            });
        });

        $jobsContainer.find('.pagination li > a').on('click', function (e) {

            var $this = $(this),
                link = $this.attr('href');
            if (link) {
                var params = namespace('AgencyPages').getUrlParams(link);
                var newPage = params['page'];
                var currentQueryParams = url.get(window.location.search.slice(1), { array: true });
                currentQueryParams.page = newPage;
                var newQuery = '?' + url.buildget(currentQueryParams);

                AgencyPages.router.navigate(initialUrl + newQuery, true, null, null, currentQueryParams);
            }

            e.preventDefault();
        });

        $jobsContainer.find('.search-results-container .search-results-grid-container thead a').on('click', function (event) {
            var $el = $(event.currentTarget),
                sortType;

            var $sortEl = $el.find('.sort-el');

            if ($sortEl.hasClass('sort-down')) {
                sortType = null;
            } else if ($sortEl.hasClass('sort-up')) {
                sortType = '|Descending';
            } else {
                sortType = '|Ascending';
            }

            page = null;
            sort = !sortType ? null : $el.data('sort-type') + sortType;
            $(document).trigger('FilterFlyout:sortByChanged', sort);

            loadClassSpecs();
        });
    }

    function initFilterFlyout() {
        var pageType = searhContainer.data('page');
        filterflyout = new FilterFlyout(pageType);

        $('#filter-options').on('click', '.filter-options-link', function (event) {
            $('body .popover').css('display', 'none');

            var $el = $(this),
                panelType = $el.data('panelType');

            filterflyout.showFilterPanel(panelType, keywords, true);
            event.preventDefault();
        });
    }

    //initialize tooltips for sortable table columns
    function initPopovers($jobsContainer) {
        $jobsContainer.find('[data-toggle="popover"]').popover().click(function(){
            $(this).popover('hide');
        });
    }

    function loadClassSpecs() {

        showOverlay();

        var params = '?';
        var agencyFolderName = pageInfoService.getCurrentAgencyFolderName();

        if (agencyFolderName) {

            params += 'agency=' + encodeURIComponent(agencyFolderName);

            var departmentFolderName = pageInfoService.getCurrentDepartmentFolderName();

            if (departmentFolderName) {
                if (params != '?') {
                    params += '&';
                }

                params += 'departmentFolder=' + encodeURIComponent(departmentFolderName);
            }

            if (sort) {

                var sortParts = sort.split('|');
                var sortField = sortParts[0];
                var sortOrder = sortParts[1];

                params += '&sort=' + encodeURIComponent(sortField) + '&isDescendingSort=' + encodeURIComponent(sortOrder === 'Descending');
            }

            if (filters && filters.salary !== null) {
                params += '&salary=' + encodeURIComponent(filters.salary);
            }

            if (keywords) {
                params += '&keyword=' + encodeURIComponent(keywords);
            }

            if (page) {
                params += '&page=' + encodeURIComponent(page);
            }

            return gJobs.ajax
                .ajaxGet(endpoint + params)
                .then(function(response, status, xhr) {
                    $(classSpecsListContainerSelector).html(response);

                    clampClassSpecDescriptions();

                    updateNumberFound();

                    addClassSpecsListHandlers();

                    listGridViewService.updateView(true);

                    hideOverlay();

                    initPopovers($jobsContainer);

                    $(document).trigger(Events.CommonEventsNames.ClassSpecsListLoaded, $('#job-postings-number').text() || 0);

                    if (!stopTitleUpdate) {
                        originalTitle = document.title;
                    }
                });
        }
    }
    
    function updateNumberFound() {
        var itemsCount = $('#job-postings-number').text() || 0;
        gJobs.screenReadersService.applyNvdaAriaLiveFix(numberFound, itemsCount + ' results found');
    }

        //check if we've already searched for this keyword and have same search results
    function hasSameKeywords(newKeywords) {
        return keywords === decodeURI(newKeywords);
    }

    function searchJobs(newKeywords) {
        if (hasSameKeywords(newKeywords)) {
            return;
        }

        keywords = newKeywords;
        searchInput.val(keywords);

        page = null;

        // Sort by relevance by default for search.
        var sortType = null;

        if (!keywords) {
            sortType = sortClassTitleAsc;
        }

        $(document).trigger('FilterFlyout:sortByChanged', sortType);
        sort = sortType;

        loadClassSpecs();
    }

    function closeClassSpecFlyoutCallback() {
        $('.class-specs-flyout').removeClass('jic-info-flyout');

        clearNotifications();
    }

    function toggleJobInterestCardAndClassSpecificationFlyouts(options) {
        document.title = options.documentTitle;

        var $classSpecsFlyoutContent = $('#class-specs-flyout-content');
        var $jobInterestCardPage = $classSpecsFlyoutContent.find('.job-interest-card-page');
        var $detailsPage = $classSpecsFlyoutContent.find('.details-page');

        //change size for jic info flyout
        $('.class-specs-flyout').addClass('jic-info-flyout');

        $jobInterestCardPage.css('visibility', 'visible');

        if (options.openAdvancedJobInterestCard) {
            $detailsPage.css('visibility', 'hidden');
        } else {
            $detailsPage.css('visibility', 'visible');
        }

        $classSpecsFlyoutContent.one('transitionend', function() {
            gJobs.screenReadersService.setAriaLiveNotification("Job interest card form is opened in flyout window.");

            layoutHelper.tabbing.updateIndices($jobInterestCardPage);

            if (!options.openAdvancedJobInterestCard) {
                if ($jobInterestCardPage.hasClass('active')) {
                    $detailsPage.css('visibility', 'hidden');
                } else {
                    $jobInterestCardPage.css('visibility', 'hidden');
                }
            }
        });

        if (options.openAdvancedJobInterestCard) {
            $jobInterestCardPage.addClass('active');
            $detailsPage.removeClass('active');
            flyout.open($subscribeForMultipleClassSpecificationsButton);
        } else {
            $detailsPage.toggleClass('active');
            $jobInterestCardPage.toggleClass('active');
        }

        gJobs.skipToContentService.showOnNextTab();
    }

    function initFlyout() {
        var content = $('#class-specs-flyout-content');

        flyout = new AgencyPages.Flyout({
            showOverlay: true,
            disableBodyScroll: true,
            container: $('body'),
            content: content,
            closeButton: true,
            wrapperClass: 'class-specs-flyout',
            closeFlyoutCallback: closeClassSpecFlyoutCallback
        });
        namespace('AgencyPages').classSpecFlyout = flyout;
        $spinner = flyout.$wrapper.find('.flyout-spinner').clone();
        $openedNotification = flyout.$wrapper.find(".opened-notification");
        $detailsLoadedNotification = flyout.$wrapper.find(".details-loaded-notification");

        content.find('.flyout-switch-button').click(function (event) {
            var options = {
                documentTitle: "Class Specifications | " + classSpecTitle + " | Job Interest Cards"
            };

            toggleJobInterestCardAndClassSpecificationFlyouts(options);

            event.preventDefault();
        });

        jobInterestCardViewModel = new OnlineApp.ViewModels.JobInterestCardViewModel();
        jobInterestCardViewModel.employerFolderName(employerFolderName);

        ko.applyBindings(jobInterestCardViewModel, $('#job-interest-card').get(0));

        var nextButton = flyout.$wrapper.find('.next-posting');
        var prevButton = flyout.$wrapper.find('.prev-posting');

        function clickClassSpecLink ($link) {
            $link.click();
            var classSpecHref = $link.attr('href');
            var $visibleClassSpecLink = $('[href="' + classSpecHref + '"]:visible').first();
            gJobs.focusService.replaceLastElement($visibleClassSpecLink);
        }

        nextButton.on('click', function() {
            var $nextElement = $('.' + ACTIVE_CLASS_SPEC).next();
            if (!$nextElement.length) {
                loadNextPage()
                    .then(function () {
                        OnlineApp.Services.tabIndexService.disableTabIndex({
                            containerSelector: classSpecsListContainerSelector
                        });

                        var $nextLink = $('.search-results-listing-container')
                            .find('.item-details-link')
                            .first();
                        clickClassSpecLink($nextLink);
                    });
            } else {
                var $nextLink = $nextElement.find('.item-details-link');
                clickClassSpecLink($nextLink);
            }
        });

        prevButton.on('click', function() {
            var $prevElement = $('.' + ACTIVE_CLASS_SPEC).prev();
            if (!$prevElement.length) {
                loadPrevPage()
                    .then(function () {
                        OnlineApp.Services.tabIndexService.disableTabIndex({
                            containerSelector: classSpecsListContainerSelector
                        });

                        var $prevLink = $('.search-results-listing-container')
                            .find('.item-details-link')
                            .last();
                        clickClassSpecLink($prevLink);
                    });
            } else {
                var $prevLink = $prevElement.find('.item-details-link');
                clickClassSpecLink($prevLink);
            }
        });

        var $closeButton = flyout.$closeButton.clone();
        var $jobInterestCardPage = $('.job-interest-card-page', flyout.$wrapper);
        $closeButton.prependTo($jobInterestCardPage);
    }

    function initJobInterestCardViewModel(classSpecificationId) {
            jobInterestCardViewModel.init({
                employerFolderName: employerFolderName,
                countyName: document.agencyName,
                classSpecificationId: classSpecificationId
            });
    }

    function loadNextPage() {
        page = (page)
            ? ++page
            : 2;

        return loadClassSpecs();
    }

    function loadPrevPage() {
        --page;

        return loadClassSpecs();
    }

    function getClassSpecLiById(classSpecId) {
        return $('.search-results-listing-container')
            .find('.list-item[data-class-spec-id="' + classSpecId + '"]')
            .first();
    }

    function hasNextClassSpec(classSpecLi) {
        var currentPage = page || 1;
        var classSpecsNumber = $('#job-postings-number').text();
        var assumedClassSpecsNumber = CLASSSPECS_PER_PAGE * currentPage;

        return classSpecLi.next().length > 0
            || assumedClassSpecsNumber < classSpecsNumber;
    }

    function hasPrevClassSpec(classSpecLi) {
        var currentPage = page || 1;

        return classSpecLi.prev().length > 0
            || currentPage > 1;
    }

    function attachHandlers() {

        $(document).on('click', '.flyout-overlay, .close-button', function () {
            document.title = originalTitle;
            if (stopTitleUpdate) {
                stopTitleUpdate = false;
            }

            var fullUrl = namespace('AgencyPages').router.addQueryString(initialUrl);
            fullUrl = namespace('AgencyPages').router.removePageTypeFromQuery(fullUrl);

            if (initialUrl === fullUrl && window.enableAdvancedJobInterestCards) {
                $('.job-interest-card-page').removeClass('active');                
            }
            
            if (jobInterestCardViewModel) {
                jobInterestCardViewModel.resetInputFields();
            }

            namespace('AgencyPages').router.navigate(fullUrl, true, false, null, null);
            if (flyout) flyout.close();
        });

        $listViewBtn.click(function() {
            listGridViewService.showList();
            gJobs.screenReadersService.setAriaLiveNotification("Search results are shown in list view.");
        });

        $gridViewBtn.click(function() {
            listGridViewService.showGrid();
            gJobs.screenReadersService.setAriaLiveNotification("Search results are shown in grid view.");
        });

        $(document).on('ClassSpecificationsPage:sort', function(e, sortType) {
            page = null;
            sort = sortType;
            loadClassSpecs();
        });

        $(document).on('ClassSpecificationsPage:filtersChanged', function(e, data) {
            if (data.isChangeFromFlyout) {
                page = null;
            }
            filters = data.newfilters;
            loadClassSpecs().then(function () {
                OnlineApp.Services.tabIndexService.disableTabIndex({
                    containerSelector: classSpecsListContainerSelector
                });
            });
        });

        searchForm.on('submit', function(e) {
            e.preventDefault();

            var inputValue = searchInput.val();

            if (hasSameKeywords(inputValue)) {
                if (keywords === '') {
                    AgencyPages.searchPageHelper.showEmptySearchPopover(keywordSearchInput, searchForm, buttonLink);
                }

                return;
            }

            $(document).one(Events.CommonEventsNames.ClassSpecsListLoaded, function () {
                var notification = !!inputValue ? "Search by " + inputValue + " keyword is applied" : "Search by keyword is removed";
                $("#keyword-search-input").focus();
                $("#aria-live-message-container").text('');
                setTimeout(function () {
                    gJobs.screenReadersService.setAriaLiveNotification(notification, $("#aria-live-message-container"), false);
                }, 500);    
            });

            AgencyPages.router.navigate(initialUrl + '?' + url.buildget({ keywords: inputValue }), null, null, null, { keywords: inputValue });
        });

        $subscribeForMultipleClassSpecificationsButton.click(function(event) {
            subscribeForMultipleClassSpecificationsButtonClickHandler(event);
        });
    }

    function subscribeForMultipleClassSpecificationsButtonClickHandler(event) {
        var options = {
            documentTitle: "Class Specifications | Job Interest Cards",
            openAdvancedJobInterestCard: true
        };

        if (jobInterestCardViewModel) {            
            jobInterestCardViewModel.shouldShowAdvancedJobInterestCardFields(true);
            jobInterestCardViewModel.countyName(document.agencyName);
            jobInterestCardViewModel.autoPopulateUserData({ employerFolderName: employerFolderName });
        }

        toggleJobInterestCardAndClassSpecificationFlyouts(options);
        gJobs.screenReadersService.setAriaLiveNotification("Job Interest Cards flyout has been opened.");
        if (event) event.preventDefault();
    }

    function initMobileSearchForm() {
        openSearchFormButton.click(function() {
            openSearchFormButton.closest('li').toggleClass("active");
            searhContainer.toggleClass('search-input-opened');
        });
    }

    function restoreClassSpecsFlyoutTitle(id) {
        var classSpecsList = $(classSpecsListContainerSelector + " li[data-class-spec-id]").toArray();
        var selectedClassSpec = $.grep(classSpecsList, function (classSpec) { return $(classSpec).attr("data-class-spec-id") === id; })

        return $(selectedClassSpec).find("a").text();
    }

    function restoreClassSpecFlyout(params) {
        var classSpecUrl = '';
        var paramsCopy = {};
        var id = '';
        if (params.specId) {

            classSpecUrl = location.pathname + '/' + params.specId;
            id = params.specId;
            delete params.specId;
            delete params.pagetype;
        }
        
        if (classSpecUrl) {
            $.extend(paramsCopy, params); // We need URL parametres without jobId, tab and jobName to restore exact state.
            // We need to wait for populatin jobs list to make "Next Posting" and "Previous posting" buttons work properly.
            $(document).one(Events.CommonEventsNames.ClassSpecsListLoaded, function () {
                showClassSpecFlyout({
                    url: classSpecUrl,
                    id: id,
                    query: '?' + url.buildget(paramsCopy),
                    classSpecsTitle: restoreClassSpecsFlyoutTitle(id)
                });
            });
        }
    }

    function applyQueryParametres(params) {
        restoreClassSpecFlyout(params);

        keywords = params.keywords || '';
        keywords = keywords.replace('+', ' ');
        searchInput.val(keywords);

        if (params.sort) {
            sort = params.sort;
            delete params.sort;
        }

        if (params.page) {
            page = params.page;
            delete params.page;
        }

        if (params.keywords) {
            delete params.keywords;
        }

        if (Object.keys(params).length !== 0) {
            filterflyout.applyFilters(params);
        } else {
            loadClassSpecs();
        }
    }

    $(function() {
        employerFolderName = AgencyPages.pageInfoService &&
            AgencyPages.pageInfoService.getCurrentAgencyFolderName();
        initFlyout();
        initFilterFlyout();

        keywords = AgencyPages.searchPageHelper.getKeywordsFromUrl();
        searchInput.val(keywords);

        sort = sortClassTitleAsc;

        attachHandlers();

        initMobileSearchForm();

        $(document)
            .one(OnlineApp.Events.CommonEventsNames.OjrMasterJicSubscribe, function(event, eventData) {
              
                var queryParams = {
                    token: eventData ? eventData.credential : null,
                    employerFolderName: employerFolderName
                };

                OnlineApp.Services.jobInterestCardService.getJicManageUrlForOjrMaster(queryParams)
                    .done(function (jicManageUrl) {
                        subscribeForMultipleClassSpecificationsButtonClickHandler();
                        if (jicManageUrl && jobInterestCardViewModel) {
                            jobInterestCardViewModel.emailAddress(eventData ? eventData.emailAddress : '');
                            jobInterestCardViewModel.shouldShowAdvancedJobInterestCardFields(false);
                            jobInterestCardViewModel.shouldDisplaySuccessOjrMasterSubscriptionText(true);
                            jobInterestCardViewModel.displaySuccessSubscribeWindow(jicManageUrl);

                            var notificationMessage = 'Job Interest Card flyout has been opened. ' + $('.subscribed').text();
                            gJobs.screenReadersService.setAriaLiveNotification(notificationMessage);
                        }
                    })
                    .fail(function() {
                        toastr.warning('Could not subscribe.');
                    });
            });

        if (window.utils.getUrlParameter(isOjrMasterQueryParameter)) {
            var data = {
                credential: window.utils.getUrlParameter(credentialQueryParameter),
                emailAddress: decodeURIComponent(window.utils.getUrlParameter(emailAddressQueryParameter))
            };

            $(document).trigger(OnlineApp.Events.CommonEventsNames.OjrMasterJicSubscribe, data);
        }

        var params = url.get(window.location.search.slice(1), { array: true });
        if (Object.keys(params).length) {
            applyQueryParametres(params);
        } else {
            loadClassSpecs();
        }

        $(document).trigger('FilterFlyout:sortByChanged', sort);

        /* Most of the tags will be stripped on the back-end, but for now, removing line breaks here */
        $('.job-search-header-verbiage br').remove();
        
        keywordSearchInput.popover('hide');

        $(window).on('scroll resize', function() {
            var searchFieldAutoSuggestionContainer = $('.ui-autocomplete.ui-menu.popover.small-autocomplete');
            if (searchFieldAutoSuggestionContainer
                && searchFieldAutoSuggestionContainer.length > 0
                && $(window).width() > maxMobileScreenWidth) {
                searchFieldAutoSuggestionContainer.hide();
            }

            listGridViewService.showCurrentViewRegardingUserSettings(userSettingsService.getSettings());
        });

        $(window).on('resize', function() {
            clampClassSpecDescriptions();
        });

       

        gJobs.pageTabNavigationService.adjustNavigationForFixedHeader($('body'), '*', '.list-item, .search-results-grid-container tr');
    });

    namespace('AgencyPages').classSpecificationsPage = {
        search: function (newKeywords) {
            newKeywords = newKeywords || '';
            searchJobs(newKeywords);
        },
        goToPage: function (newPageNumber) {
            if (page !== newPageNumber) {
                page = newPageNumber;
                loadClassSpecs();
                $('html, body').animate({ scrollTop: SCROLL_TOP }, "fast");
            }
        }
    };

})(window);
;
(function (window, undefined) {
    'use strict';

    function showEmptySearchPopover(keywordSearchInput, searchForm, buttonLink) {
        var $keywordSearchInput = $(keywordSearchInput || '#keyword-search-input');
        var $buttonLink = $(buttonLink || 'button.btn.btn-link');

        $keywordSearchInput.focus();
        $keywordSearchInput.popover('show');

        $keywordSearchInput.on('blur.emptySearchPopoverShown', function (e) {
            $keywordSearchInput.popover('hide');
            $keywordSearchInput.off('blur.emptySearchPopoverShown keydown.emptySearchPopoverShown');
        });

        $keywordSearchInput.on('keydown.emptySearchPopoverShown', function (e) {
            if (e.keyCode !== $.ui.keyCode.ENTER) {
                $keywordSearchInput.popover('hide');
                $keywordSearchInput.off('blur.emptySearchPopoverShown keydown.emptySearchPopoverShown');
            }
        });
    }

    function getKeywordsFromUrl() {
        var url = window.location.href;
        var urlKeywords = '';

        if (url) {
            urlKeywords = AgencyPages.getUrlParams(url).keywords || '';
        }

        return urlKeywords;
    }

    $(document).ready(function () {
        var $keywordSearchInput = '';
        if (document.getElementById("el-keyword-search-input")) {
            $keywordSearchInput = $("#el-keyword-search-input");
        }
        else if (document.getElementById("el-candidate-keyword-search-input")) {
            $keywordSearchInput = $("#el-candidate-keyword-search-input");
        }
        else {
            $keywordSearchInput = $("#keyword-search-input");
        }
        var $searchForm = $keywordSearchInput.closest('.search-form');
        var $clearFieldButton = $searchForm.find('.clear-field-button');
        var $searchStatus = $searchForm.find('.keyword-search-input-label .ui-helper-hidden-accessible');

        $keywordSearchInput.on('change keyup paste', function (e) {
            if ($keywordSearchInput.val() === '') {
                $keywordSearchInput.removeClass('filled');
                $clearFieldButton.hide();
            } else {
                $keywordSearchInput.addClass('filled');
                $clearFieldButton.show();
                if (e.keyCode === $.ui.keyCode.ENTER) {
                    $searchForm.trigger('submit');
                }
            }
        });

        if ($keywordSearchInput.val() !== '') {
            $clearFieldButton.show();
            $keywordSearchInput.addClass('filled');
        }
        
        $clearFieldButton.click(function () {
            var $kl = $keywordSearchInput.val();
            var numberOfJobsFoundText = $("#number-found-items").text();
            $keywordSearchInput.val('');            
            $searchStatus.text('');
            $keywordSearchInput.focus()
            $keywordSearchInput.trigger('change');
            $searchForm.submit();
            $keywordSearchInput.focus();
            if (numberOfJobsFoundText && numberOfJobsFoundText != "" && numberOfJobsFoundText != "0 jobs found") {
                if (numberOfJobsFoundText != "0 results found") {
                    setTimeout(function () {
                        gJobs.screenReadersService.setAriaLiveNotification("Search by keyword is removed. " + numberOfJobsFoundText, $("#aria-live-message-container"), false);
                    }, 500);
                }
            }
        });
    });

    namespace('AgencyPages').searchPageHelper = {
        showEmptySearchPopover: showEmptySearchPopover,
        getKeywordsFromUrl: getKeywordsFromUrl
    };
})(window)
;
(function (window, undefined) {

    /*  In pages with verbiages (like Class Specs, Jobs, Categories etc.)
        texts should be collapsed to the first two lines with an ability to expand them by clicking the 'show-more' button
    */

    var showMoreTemplate = '<span class="button-text">SHOW MORE</span><i class="icon icon-xs icon-chevron-down"></i>';
    var showLessTemplate = '<span class="button-text" aria-hidden="true">SHOW LESS</span><i class="icon icon-xs icon-chevron-up"></i>';

    var numberLinesShowing = 4;

    var $verbiage,
        $verbiageOverlay,
        $verbiageToggleButtonPanel,
        $verbiageToggleButton;

    function initVerbiageCollapsing(maxVisibleLineCount) {

        $verbiageOverlay = $('.verbiage-overlay');

        $verbiage = $verbiageOverlay.parent();
        $verbiageToggleButtonPanel = $('.verbiage-toggle-button-panel');
        $verbiageToggleButton = $verbiageToggleButtonPanel.find('.verbiage-toggle-button');

        var verbiageOverlayHtml = $("<div />").append($verbiageOverlay.clone()).html();
        $verbiageOverlay.replaceWith('');

        /* Most of the tags will be stripped on the back-end, but for now, removing line breaks here */
        var verbiageText = $verbiage.html() || '';

        $verbiage.html(verbiageText + verbiageOverlayHtml);
        $verbiageOverlay = $verbiage.find('.verbiage-overlay');

        var lineHeight = parseInt($verbiage.css('line-height'), 10);
        var visibleHeight = lineHeight * maxVisibleLineCount;


        // Function to restrict focusability of hidden elements
        function restrictFocusToVisibleContent() {
            var container = document.querySelector('.verbiage');
            if (container) {
               
                var allElements = container.querySelectorAll('*');
                // Select only focusable elements
                var focusableElements = container.querySelectorAll(
                    'a, button, input, textarea, select, [tabindex]'
                );

                allElements.forEach(function (element) {
                    if (container.classList.contains('collapsed')) {
                        var overlay = container.querySelector('.verbiage-overlay');
                        // Handle collapsed state: Hide elements outside the visible area
                        if (element.offsetTop > container.offsetHeight || element.offsetTop >= overlay.offsetTop) {
                            element.setAttribute('aria-hidden', 'true'); // Hide from screen readers
                        } else {
                            element.removeAttribute('aria-hidden'); // Make visible elements readable
                        }
                    } else {
                        // Handle expanded state: Restore visibility for all elements
                        element.removeAttribute('aria-hidden');
                    }
                });

                focusableElements.forEach(function (element) {
                    if (container.classList.contains('collapsed')) {
                        // Handle collapsed state: Make focusable elements outside the visible area unfocusable
                        if (element.offsetTop + element.offsetHeight > container.offsetHeight) {
                            element.setAttribute('tabindex', '-1'); // Make hidden elements unfocusable
                        } else {
                            element.removeAttribute('tabindex'); // Ensure visible elements are focusable
                        }
                    } else {
                        // Handle expanded state: Restore focusability of all focusable elements
                        element.removeAttribute('tabindex');
                    }
                });
            }
        }

        function focusFirstFocusableElement() {
            var container = document.querySelector('.verbiage'); // Select the .verbiage container
            if (container) {
                var focusableElements = container.querySelectorAll(
                    'a, button, input, textarea, select, [tabindex]:not([tabindex="-1"])'
                );

                // Focus the first focusable element
                if (focusableElements.length > 0) {
                    var firstElement = focusableElements[0];
                    firstElement.focus();
                }
                else {
                    $('.verbiage-toggle-button').focus();
                }
            }
        }

        $verbiageToggleButton.ready(function () {
            $verbiageToggleButton.attr("aria-label", "Show more content");

            // Restrict focusability of hidden elements
            restrictFocusToVisibleContent();
        });

        $verbiageToggleButton.on('click', function () {
            if ($verbiage.hasClass('collapsed')) {
                $verbiageToggleButton.blur();
                $verbiage.css('max-height', $verbiage.get(0).scrollHeight);
                $verbiage.removeClass('collapsed');

                $verbiageToggleButton.html(showLessTemplate);
                $verbiageToggleButton.attr("aria-label", "Show less content");
                $verbiageToggleButton.attr("role", "link");
                gJobs.screenReadersService.setAriaLiveNotification("Content is expanded.");

                // Move focus to the first visible focusable element
                setTimeout(function () {                    
                    focusFirstFocusableElement();
                    restrictFocusToVisibleContent();
                }, 500);
            } else {
                $verbiageToggleButton.blur();
                $verbiageToggleButton.attr("aria-label", "Show more content");
                $verbiageToggleButton.attr("role", "link");
                $verbiage.css('max-height', '');
                $verbiage.addClass('collapsed');

                $verbiageToggleButton.html(showMoreTemplate);
                gJobs.screenReadersService.setAriaLiveNotification("Content is collapsed");

                // Restrict focusability of hidden elements
                setTimeout(function () {
                    $verbiageToggleButton.focus();
                    restrictFocusToVisibleContent();
                }, 500);
            }
        });

        $(window).resize(resizeHandler);

        resizeHandler();

        function resizeHandler() {
            if ($verbiage.hasClass('collapsed')) {
                if ($verbiage.get(0).scrollHeight <= visibleHeight) {
                    $verbiageToggleButtonPanel.addClass('hidden');
                    $verbiageOverlay.addClass('hidden');
                } else {
                    $verbiageToggleButtonPanel.removeClass('hidden');
                    $verbiageOverlay.removeClass('hidden');
                }
            }
        }
    }

    $(document).ready(function () {

        initVerbiageCollapsing(numberLinesShowing);

    });

})(window);;
