/* Minification failed. Returning unminified contents.
(1126,22-23): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: i
(1126,74-75): run-time error JS1294: Strict-mode does not allow ++ or -- on certain objects: i
 */
/* Minification failed. Returning unminified contents.
(1122,22-23): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: i
(1122,74-75): run-time error JS1294: Strict-mode does not allow ++ or -- on certain objects: i
 */
(function (window, undefined) {
    var userSettingsService = namespace('AgencyPages').userSettingsService;

    var maxMobileScreenWidth = 767;

    function saveUserAgencySettings(isListView) {
        isListView = (isListView !== undefined)
            ? isListView
            : true;

        var currentPageUserSettings = userSettingsService.getSettings();

        if (!currentPageUserSettings) {
            currentPageUserSettings = {};
        }

        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 {
                self.showList(false, forceUpdate);
            }
        };

        self.updateView = function (forceUpdate) {
            self.showCurrentViewRegardingUserSettings(userSettingsService.getSettings(), forceUpdate);
        };
    }

    namespace('AgencyPages').listGridViewService = new ListGridViewService();
})(window);;
(function (window, undefined) {

    var transitionEvents = "transitionend" //major current browsers
            + " webkitTransitionEnd" //safari, chrome
            + " MSTransitionEnd"; //old IE 

    var applicationReviewPrintUrl = '/Applications/Print/';

    var $body = $('body');
    
    //todo: declare all selectors as constants
    var CachedJobInfoSource = function () {
        var jobInfoEndpoint = '/careers/jobInfo/agencyJobDetails/';
        var self = this;

        var cache = {};

        self.get = function (id, departmentFolderName) {
            if (cache[id]) {
                return (new $.Deferred()).resolve(cache[id]).promise();
            } else {
                var departmentQuery = departmentFolderName ? '?departmentFolder=' + departmentFolderName : '';

                return $.get(jobInfoEndpoint + id + departmentQuery, function (data) {
                    cache[id] = data;
                });
            }
        };
    };

    var submittedApplicationFlyoutConstructor = function (options) {
        
        var content = $('#submitted-application-flyout-content');
        var $openedNotification = content.find('.opened-notification');
        var $loadedNotification = content.find('.loaded-notification');
        var applicationsPageTabs = agencyPages.applicationsPage.applicationsPageTabs;
        var initialUrl = agencyPages.applicationsPage.getApplicationsTabUrl(applicationsPageTabs.submitted);
        var applicationBaseUrl = null;
        var originalPageTitle = window.document.title;

        var self = window.Flyout.call(this, {
            showOverlay: true,
            disableBodyScroll: true,
            container: $body,
            content: content,
            closeButton: true,
            //todo: rename to job-flyout, also in agency specific razor-generated css
            wrapperClass: 'new-job-flyout'
        }) || this;
        
        var $jobDetailsTab = self.$wrapper.find('.entity-details-tab'),
            $jobApplyTab = self.$wrapper.find('.application-review-tab'),
            $appViewContainer = self.$wrapper.find('.application-view-container');

        self.tabs = {
            jobDetailsTab: {
                id: 1,
                urlPart: 'jobdetails'
            },
            applicationTab: {
                id: 2,
                urlPart: 'application'
            }
        };

        var baseClose = self.close;
        self.close = function () {
            //Using .on() and .off() instead of .one() because if there are multiple events used in one() with same handler, only for the triggered event, the binding is removed
            self.$wrapper.on(transitionEvents, function () {
                $jobDetailsTab.removeClass('active');
                $jobApplyTab.addClass('active');
                self.$wrapper.off(transitionEvents);
            });

            namespace('AgencyPages').router.navigate(initialUrl, false, false, null, null, true);
            baseClose();
            self.activeJobId = null;
            self.activeTab = null;

            window.document.title = originalPageTitle;
        };

        self.activeJobId = null;
        self.activeJobTitle = null;
        self.activeTab = null;
        self.activeJobApplicationId = null;

        var jobInfoSource = new CachedJobInfoSource();

        self.$wrapper
            .find('.close-button')
            .add(self.$overlay)
            .off('click').on('click', self.close);

        self.$wrapper.find('.flyout-switch-buttons a').click(function (event) {

            var tab = $(event.currentTarget).data('tab-type');

            if (tab === self.tabs.jobDetailsTab.id) {
                setActiveTab(self.tabs.jobDetailsTab.id);
                namespace('AgencyPages').router.navigate(applicationBaseUrl + '/' + self.tabs.jobDetailsTab.urlPart, false, null, null, null, true);
                gJobs.skipToContentService.showOnNextTab();
            } else {
                setActiveTab(self.tabs.applicationTab.id);
                namespace('AgencyPages').router.navigate(applicationBaseUrl + '/' + self.tabs.applicationTab.urlPart, false, null, null, null, true);
            }
        });

        var $scrollableContainers = $jobApplyTab.find('.application-container').add($jobDetailsTab.find('.entity-info'));

        AgencyPages.scrollableContainerAdjuster.addHeaderShadowOnScrolling($scrollableContainers);

        self.showJob = function (jobInfo) {
            $openedNotification.empty();
            var tabTitle = '';
            applicationBaseUrl = initialUrl + '/' + jobInfo.id + '/' + jobInfo.jobApplicationId;

            if (jobInfo.tab === undefined) {
                jobInfo.tab = self.tabs.applicationTab.id;
            }
            
            if (jobInfo.id === self.activeJobId) {
                if (jobInfo.tab !== self.activeTab) {
                    // The same application, need only to set flyout tab.
                    setActiveTab(jobInfo.tab);
                }
                return;
            }

            if (jobInfo.tab === self.tabs.applicationTab.id) {
                tabTitle = 'Application';
            } else {
                tabTitle = 'Job Details';
            }

            self.activeJobId = jobInfo.id;
            setActiveTab(jobInfo.tab);
            self.activeJobTitle = jobInfo.title;
            self.activeJobApplicationId = jobInfo.jobApplicationId;

            $openedNotification.text(jobInfo.title + ' flyout is opened. ' + tabTitle + ' tab has been activated');

            self.open($openedNotification);

            $jobApplyTab.find('h1.entity-title').text(jobInfo.title);

            //JOB
            var $jobInfoContainer = self.$wrapper.find('.entity-info').empty();
            var departmentFolderName = namespace('AgencyPages').pageInfoService.getCurrentDepartmentFolderName();

            jobInfoSource.get(jobInfo.id, departmentFolderName).done(function (data) {
                $jobInfoContainer.html(data);

                self.activeJobTitle = $jobInfoContainer.find('.summary .title').text();
                $jobApplyTab.find('h1.entity-title').text(self.activeJobTitle);

                //set print button href
                var printingUrl = $jobInfoContainer.find('.summary').data('printing-url');
                $jobDetailsTab.find('a.print-button').attr('href', printingUrl);

                OnlineApp.Helpers.popoverHelper.initializePopover(content, 'span[data-toggle="popover"]');
            });

            //APPLICATION
            $jobApplyTab.removeClass('hide');
            $.ajax({
                url: AgencyPages.routePrefix + '/Applications/ApplicationView',
                type: 'GET',
                contentType: 'text/html',
                cache: false
            })
            .done(function (view) {

                var $appReviewPrintLink = $jobApplyTab.find('.header-buttons').find('a.print-button');
                $appReviewPrintLink.attr('href', applicationReviewPrintUrl + jobInfo.jobApplicationId);

                // Insert received HTML into container
                var getAppSettingsUrl = "/api/applicationTemplate/GetAppSettings";
                $appViewContainer.html(view);

                // Remove content on closing flyout.
                // New subscription because of incomplete application flyout.
                //$(document).one(Events.CommonEventsNames.TryCloseFlyout, function () {
                //    appViewContainer.empty();
                //});


                //todo: clean up this code and categorize it well
                // Get JobApplication data
                $.ajax({
                    type: 'GET',
                    url: '/api/jobapplication/getJobApplication',
                    data: {
                        jobApplicationId: jobInfo.jobApplicationId
                    }
                }).done(function (jobApplicationData) {
                    if (!jobApplicationData) {
                        $appViewContainer.find(".flyout-spinner").hide();
                        toastr.warning("Sorry.. Nothing to show");
                        return;
                    }

                    // Get Settings for specified Job
                    $.ajax({
                        type: "GET",
                        url: getAppSettingsUrl,
                        cache: false,
                        data: { jobId: jobInfo.id }
                    }).fail(function () {
                            toastr.warning(Resources.NotificationMessages.LoadTemplateFail);
                        })
                        .done(function (appSettings) {
                            // process template here

                            //if (!appSettings) {
                            //    toastr.warning(Resources.NotificationMessages.LoadTemplateFail);
                            //    return;
                            //}

                            var vm = OnlineApp.ViewModels;
                            OnlineApp.ViewModels.applicationViewModel.definitionsViewModel = new vm.DefinitionsViewModel(true);
                            var applicationReviewViewModel = new vm.ApplicationReviewViewModel();

                            // update jobApplicationData
                            applicationReviewViewModel.fromDataModel(jobApplicationData, appSettings);

                            // apply ko bindings only for specific region on a page
                            var applicationView = $appViewContainer.find('.application-view');
                            ko.applyBindings(applicationReviewViewModel,
                                applicationView.get(0));

                            //if (!appReviewTemplatesLoading) {
                            $appViewContainer.find(".flyout-spinner").hide();
                            //}
                        });
                    });
            })
            .fail(function () {
                toastr.warning(Resources.NotificationMessages.ServerConnectionFailed);
            });
        };

        self.$wrapper
            .find('a[data-toggle="popover"], span[data-toggle="popover"]')
            .popover();

        function setActiveTab(tabNumber) {
            if (tabNumber === self.tabs.jobDetailsTab.id) {
                $jobDetailsTab.addClass('active');
                $jobApplyTab.removeClass('active');
                self.activeTab = self.tabs.jobDetailsTab.id;
                window.document.title = originalPageTitle + ' – Job Details';
            } else {
                $jobDetailsTab.removeClass('active');
                $jobApplyTab.addClass('active');
                self.activeTab = self.tabs.applicationTab.id;
                window.document.title = originalPageTitle + ' – Application';
            }
        }
    };

    var scheduleExamFlyoutConstructor = function (options) {

        var content = $('#schedule-exam-flyout-content'),
            scheduleExamButton = $('#applications-container .schedule-exam-button');

        var self = window.Flyout.call(this, {
            showOverlay: true,
            disableBodyScroll: true,
            container: $body,
            content: content,
            //todo: rename to job-flyout, also in agency specific razor-generated css
            wrapperClass: 'schedule-exam-flyout'
        }) || this;

        var baseClose = self.close,
            baseOpen = self.open;

        var NO_SLOTS_MESSAGE = 'We’re sorry, there are no available time slots. Please check back soon.';

        self.close = function () {
            baseClose();
            self.activeJobId = null;
            self.activeTab = null;
            scheduleExamButton.removeAttr('tabindex');
        };

        self.open = function ($focusTarget) {
            baseOpen($focusTarget);
            scheduleExamButton.attr('tabindex', -1);
        };

        self.activeJobId = null;
        self.activeJobTitle = null;
        self.activeTab = null;

        var $closeButon = self.$wrapper.find('.close-button');

        $closeButon.click(function () {
            self.close();
        });

        self.showSchedule = function ($this, title, examData) {
            //Set job subtitle
            self.$wrapper.find('.flyout-tab-header .subtitle').text(title);

            agencyPages.applicationsPage.stateChangeHandler = function () {

                var state = this.da();
                if (state === 'confirmed') {
                    var dateTime = scheduleExamViewModel
                        .selectedExam()
                        .selectedTimeSlot()
                        .displayDate;
                    $this.find('.exam-date-text').html(dateTime);
                    $this.find('.update-exam').removeClass('hide');
                    $this.find('.schedule-exam').addClass('hide');
                }
                else if (state === 'scheduling') {
                    $this.find('.update-exam').addClass('hide');
                    $this.find('.schedule-exam').removeClass('hide');
                }
            };
            agencyPages.applicationsPage.scheduleExamViewModel.state('loading');
            var promise = OnlineApp.Services.dataService.exam.get(null, examData);
            promise
                .always(function () {
                    if (agencyPages.applicationsPage.currentExamSubscription) {
                        agencyPages.applicationsPage.currentExamSubscription.dispose();
                        agencyPages.applicationsPage.currentExamSubscription = null;
                    }
                })
                .done(function (data) {
                    $.extend(data, examData);

                    var scheduleExamViewModel = agencyPages.applicationsPage.scheduleExamViewModel;
                    scheduleExamViewModel.fromDataModel(data);

                    if (scheduleExamViewModel.state() === 'no-time-slots') {
                        gJobs.screenReadersService
                            .setAriaLiveNotification(NO_SLOTS_MESSAGE);
                    }

                    agencyPages.applicationsPage.currentExamSubscription = scheduleExamViewModel.state.subscribe(agencyPages.applicationsPage.stateChangeHandler);
                });

            gJobs.skipToContentService.showOnNextTab();

            var openedNotification = content.find('.flyout-tab-header .title').data('schedule-appointment-text') +
                ' flyout is opened.';

            var $openedNotification = 
                content.find('.opened-notification')
                    .text(openedNotification);

            self.open($openedNotification);
        };

        var scheduleExamViewModel = agencyPages.applicationsPage.scheduleExamViewModel;
    };

    var offerFlyoutConstructor = function(options) {
        var $content = $('#offer-flyout-content');
        var $responsiveSignature = $('#responsive-signature');
        var originalPageTitle = window.document.title;
        var initialUrl = agencyPages.applicationsPage.getApplicationsTabUrl(agencyPages.applicationsPage.applicationsPageTabs.submitted);

        var self = window.Flyout.call(this, {
            showOverlay: true,
            disableBodyScroll: true,
            container: $body,
            content: $content,
            closeButton: true,
            wrapperClass: 'offer-flyout'
        }) || this;

        var baseClose = self.close;

        self.close = function() {
            window.document.title = originalPageTitle;
            namespace('AgencyPages').router.navigate(initialUrl, false, false, null, null, true);
            baseClose();
        }

        self.showOffer = function (offerData) {
            OnlineApp.Services.dataService.offer.get(offerData.offerId)
                .done(function (data) {
                    window.document.title = originalPageTitle + ' – Offer Letter';
                    $.extend(data, offerData);
                    var OfferViewModel = agencyPages.applicationsPage.offerViewModel;

                    ko.cleanNode($responsiveSignature[0]);
                    ko.applyBindings(OfferViewModel.signatureViewModel, $responsiveSignature[0]);

                    OfferViewModel.fromDataModel(data);

                    $content.find('.popover-trigger').popover();

                    $closeButton = self.$wrapper.find('.close-button');
                    $closeButton
                        .removeClass('hide')
                        .add(self.$overlay)
                        .off('click')
                        .on('click', self.close);

                    gJobs.skipToContentService.showOnNextTab();

                    var $openedNotification = 
                        $content.find('.opened-notification')
                            .text('View Offer flyout is opened.');

                    self.open($openedNotification);
                })
                .fail(function() {
                    toastr.error(Resources.NotificationMessages.EncounteredProblem);
                });
        };
    };

    var canvassFlyoutConstructor = function(options) {
        var $content = $('#canvass-flyout-content');
        var $responsiveSignature = $('#responsive-signature');
        var originalPageTitle = window.document.title;
        var initialUrl = namespace('agencyPages') && agencyPages.applicationsPage ?
            agencyPages.applicationsPage.getApplicationsTabUrl(agencyPages.applicationsPage.applicationsPageTabs.submitted) :
            namespace('AgencyPages').pageInfoService.getCurrentInitialUrl();

        var self = window.Flyout.call(this, {
            showOverlay: true,
            disableBodyScroll: true,
            container: $body,
            content: $content,
            closeButton: true,
            wrapperClass: 'canvass-flyout'
        }) || this;

        var baseClose = self.close;

        self.showCanvass = function (canvassData) {
            OnlineApp.Services.canvassFlyoutService.getCanvassForm(canvassData.canvassFormId)
                .then(function (data) {
                    window.document.title = originalPageTitle + ' – Canvass Form';

                    $.extend(data, canvassData);

                    var CanvassViewModel = agencyPages.canvassViewModel;
                    ko.cleanNode($content[0]);
                    ko.cleanNode($responsiveSignature[0])

                    OnlineApp.Services.canvassFlyoutService.setupCanvassFlyout(data.description, data.isReadOnly);

                    ko.applyBindings(CanvassViewModel, $content[0]);
                    ko.applyBindings(CanvassViewModel.signatureViewModel, $responsiveSignature[0]);
                    CanvassViewModel.fromDataModel(data);

                    $content.find('.popover-trigger').popover();

                    $closeButton = self.$wrapper.find('.close-button');
                    $closeButton
                        .removeClass('hide')
                        .add(self.$overlay)
                        .off('click')
                        .on('click', self.close);

                    gJobs.skipToContentService.showOnNextTab();

                    var $openedNotification = 
                        $content.find('.opened-notification')
                            .text('View Canvass form flyout is opened.');

                    self.open($openedNotification);
                })
                .fail(function (error) {
                    toastr.error(error.responseJSON && error.responseJSON.message || Resources.NotificationMessages.EncounteredProblem);
                });
        };

        self.close = function() {
            window.document.title = originalPageTitle;
            namespace('AgencyPages').router.navigate(initialUrl, false, false, null, null, true);
            baseClose();
        }
    };

    window.SubmittedApplicationFlyout = submittedApplicationFlyoutConstructor;
    window.ScheduleExamFlyout = scheduleExamFlyoutConstructor;
    window.OfferFlyout = offerFlyoutConstructor;
    window.CanvassFlyout = canvassFlyoutConstructor;
})(window);;
(function (window, undefined) {
    'use strict';

    var SEARCH_AGENCY_JOBS_URL = AgencyPages.routePrefix + '/home/index';
    var MAX_CATEGORIES_LENGTH = 120;
    var SCROLL_TOP = 0;
    var JOBS_PER_PAGE = 10;

    var JOB_DESCRIPTION_CLAMP_LINE_COUNT = 2;

    var jobListContainerSelector = '#job-list-container';

    var jobsContainer = $(jobListContainerSelector);
    var searchInput = $('input.form-control');
    var actionListView = $('#action-list-view');
    var actionGridView = $('#action-grid-view');
    var overlay = $('#job-list-overlay');
    var searhContainer = $('#manage-bar');
    var searchForm = searhContainer.find('.search-form');
    var numberFound = $('#number-found-items');
    var keywordSearchInput = searhContainer.find('#keyword-search-input');
    var buttonLink = $('button.btn.btn-link');
    var keywords = '';
    var sort = null;
    var filters = null;
    var page = null;
    var filterflyout = undefined;
    var defaultSortingOrder = null;

    var pageInfoService = namespace('AgencyPages').pageInfoService;
    var userSettingsService = namespace('AgencyPages').userSettingsService;
    var listGridViewService = namespace('AgencyPages').listGridViewService;

    var initialUrl = pageInfoService.getCurrentInitialUrl();
    var maxMobileScreenWidth = 767;

    // Cuurent url params for jobs.
    var currentParams = {};

    function clampJobDescriptions() {
        jobsContainer.find('.search-results-listing-container .list-item .list-entry')
            .each(function() {
                clamp(this, JOB_DESCRIPTION_CLAMP_LINE_COUNT);
            });
    }

    function initFilterFlyout() {
        var page = searhContainer.data('page');
        filterflyout = new FilterFlyout(page);

        $('#filter-options').on('click', 'a.filter-options-link', function (event) {
            $('body .popover').css('display', 'none');

            var $el = $(this),
                panelType = $el.data('panelType');

            filterflyout.showFilterPanel(panelType, keywords, true);
            event.preventDefault();

            $(document).on(Events.CommonEventsNames.FlyoutClosing, function() {
                OnlineApp.Services.tabIndexService.restoreTabIndex();
            });
        });
    }

    function initCanvassFlyout() {
        var canvassFlyout = new CanvassFlyout();
        AgencyPages.canvassFlyout = canvassFlyout;

        var canvassViewModel = new OnlineApp.ViewModels.CanvassViewModel();
        var $container = $('#canvass-flyout-content');
        var $responsiveSignature = $('#responsive-signature');

        if ($container.length > 0) {
            ko.cleanNode($responsiveSignature[0]);
            ko.applyBindings(canvassViewModel, $container.get(0));
            ko.applyBindings(canvassViewModel.signatureViewModel, $responsiveSignature[0]);
        }

        namespace('agencyPages').canvassViewModel = canvassViewModel;
    }

    //todo take object
    function loadJobs(jobsContainer, jobtitle, page, sort, filters) {

        showOverlay();

        // Save current parameters.
        currentParams = {
            jobtitle: jobtitle,
            page: parseInt(page),
            sort: sort,
            filters: filters
        };

        var params = undefined;         
        let filterAction = [];         

        var agencyFolderName = pageInfoService.getCurrentAgencyFolderName();

        var departmentFolderName = pageInfoService.getCurrentDepartmentFolderName();

        if (agencyFolderName || jobtitle || page || sort || filters || isPromotionalJobs() || isTransferJobs()) {

            params = '?';

            if (agencyFolderName) {
                if (params != '?') {
                    params += '&';
                }

                params += 'agency=' + encodeURIComponent(agencyFolderName);
            }

            if (departmentFolderName) {
                if (params != '?') {
                    params += '&';
                }

                params += 'departmentFolder=' + encodeURIComponent(departmentFolderName);
            }

            if (jobtitle) {
                if (params != '?') {
                    params += '&';
                }
                
                params += 'keyword=' + encodeURIComponent(jobtitle);
                filterAction.push('Jobs Searched');
            }

            if (page) {
                if (params != '?') {
                    params += '&';
                }

                params += 'page=' + encodeURIComponent(page);
            }

            if (sort) {
                if (params != '?') {
                    params += '&';
                }

                var sortParts = sort.split('|');
                var sortField = sortParts[0];
                var sortOrder = sortParts[1];

                params += 'sort=' + encodeURIComponent(sortField) + '&isDescendingSort=' + encodeURIComponent(sortOrder === 'Descending');
            }

            if (filters) {
                //todo common check
                var i;

                if (filters.location) {
                    for (i = 0; i < filters.location.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'facetlocation=' + encodeURIComponent(filters.location[i]);
                    }
                }

                if (filters.department) {
                    for (i = 0; i < filters.department.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'department=' + encodeURIComponent(filters.department[i]);
                    }
                }

                if (filters.category) {
                    for (i = 0; i < filters.category.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'category=' + encodeURIComponent(filters.category[i]);
                    }
                }


                if (filters.salary) {
                    if (params != '?') {
                        params += '&';
                    }

                    params += 'salary=' + encodeURIComponent(filters.salary);
                }

                if (filters.remoteworkoptionids) {
                    for (i = 0; i < filters.remoteworkoptionids.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'remoteworkoptionids=' + encodeURIComponent(filters.remoteworkoptionids[i]);
                    }
                }

                if (filters.classspecificationscodes) {
                    for (i = 0; i < filters.classspecificationscodes.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'classspecificationscodes=' + encodeURIComponent(filters.classspecificationscodes[i]);
                    }
                }

                if (filters.examType) {
                    for (i = 0; i < filters.examType.length; i++) {
                        if (params != '?') {
                            params += '&';
                        }

                        params += 'examType=' + encodeURIComponent(filters.examType[i]);
                    }
                }

                if (!$.isEmptyObject(filters)) //Log Google Analytics only if Filters applied
                    filterAction.push('Jobs Filtered');
            }

            if (isPromotionalJobs()) {
                if (params != '?') {
                    params += '&';
                }

                params += 'ispromotional=true';
            }

            if (isTransferJobs()) {
                if (params != '?') {
                    params += '&';
                }

                params += 'istransfer=true';
            }
        }

        if (filterAction.length > 0)//Track Career job searches in Google Analytics
            gJobs.common.analytics.trackCareerJobSearchEvent(filterAction.join(' & '));

        var searchUrl = (params)
            ? SEARCH_AGENCY_JOBS_URL + params
            : SEARCH_AGENCY_JOBS_URL;

        return gJobs.ajax
            .ajaxGet(searchUrl)
            .then(function (response, status, xhr) {
                if (status != "success") {
                    jobsContainer.html('<h1>Cannot load jobs.</h1>');
                } else {
                    jobsContainer.html(response);

                    if (AgencyPages.canvassFlyout.isOpen()) {
                        var focusableSelector = gJobs.ariaSelectors.getFocusableSelector();
                        OnlineApp.Services.tabIndexService.disableTabIndex(
                            {
                                containerSelector: jobListContainerSelector,
                                tabIndexElementsSelector: focusableSelector,
                            }
                        );
                    }

                    clampJobDescriptions();
                }

                hideOverlay();

                checkIfNotFoundAndAdjust(jobtitle);

                addHandlers(jobsContainer);
                adjustCategoriesList();
                updateNumberFound();
                notifyShowedItemsCount();

                gJobs.common.social.init();

                initPopovers(jobsContainer);

                listGridViewService.updateView(true);
                $(document).trigger(Events.CommonEventsNames.JobsListLoaded, $('#job-postings-number').text() || 0);

                if (filterflyout.isOpen()) {
                    OnlineApp.Services.tabIndexService.disableTabIndex();
                }

                // Remove redundant title attribute added by addthis JS
                var shareClasses = ['facebook', 'twitter', 'linkedin', 'google_plusone_share', 'email'];
                shareClasses.forEach(function (elClass) {
                    $('.addthis_button_' + elClass).removeAttr('title');
                });
            });
    }

    function checkIfNotFoundAndAdjust(keywords) {
        if ($('.jobs-not-found-container').length && !keywords && !filters) {
            if (isTransferJobs() || isPromotionalJobs()) {
                searhContainer.addClass('inactive');
            }
        }
    }

    function isTransferJobs() {
        return pageInfoService.getCurrentPageType().type == pageInfoService.getPageTypes().transferJobs.type;
    }

    function isPromotionalJobs() {
        return pageInfoService.getCurrentPageType().type == pageInfoService.getPageTypes().promotionalJobs.type;
    }
    
    function updateNumberFound() {
        var jobsCount = $('#job-postings-number').text() || 0;
        gJobs.screenReadersService.applyNvdaAriaLiveFix(numberFound, jobsCount + ' jobs found');
    }

    function notifyShowedItemsCount() {
        var jobsCount = $('#job-postings-number').text() || 0;
        var $showItemsCount = $('#show-items-count');
        var lowRange = $('.pager-container-normal .items-div span:first-child').text();
        var topRange = $('.pager-container-normal .items-div span:last-child').text();

        $showItemsCount.text('');

        setTimeout(function() {
            if(jobsCount != 0) {
                lowRange = $.isNumeric(lowRange)? lowRange : 1;
                topRange = $.isNumeric(topRange)? topRange : jobsCount;
                $showItemsCount.text('Showing ' + lowRange + '-' + topRange + ' of ' + jobsCount + ' jobs');
            }
        }, 500); 
    }

    function adjustCategoriesList() {

        $('.categories-list > span').each(function () {

            var $this = $(this);
            var fullText = $this.text();

            if (fullText.length > MAX_CATEGORIES_LENGTH) {

                var words = fullText.split('/');

                var resultCategories = words[0];

                if (words.length > 1) {
                    var counter = 1;
                    while (resultCategories.length + words[counter].length < MAX_CATEGORIES_LENGTH) {
                        resultCategories += '/' + words[counter];
                        counter++;
                    }

                    resultCategories += '... ';
                }

                $this.text(resultCategories);

                // Add link for showing all categories
                var $showAllCategoriesLink = $('<a>show all</a>');
                $this.after($showAllCategoriesLink);
                $showAllCategoriesLink.on('click', function () {
                    $this.text(fullText);
                    $(this).remove();
                });
            }
        });
    }

    //initialize tooltips for sortable table columns and social media buttons
    function initPopovers($jobsContainer) {
        $jobsContainer.find('[data-toggle="popover"]').popover().click(function(){
            $(this).popover('hide');
        });
    }

    function addHandlers($jobsContainer) {

        $jobsContainer.find('.pagination li > a').click(function (e) {

            var $this = $(this);

            var 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('a.item-details-link').on('click', function (event) {

            var $this = $(this);

            var jobId = $this.closest('li, td').data('jobId');
            var jobTitle = $this.text();
            var departmentName = $this.data('department-name');

            var pageType = pageInfoService.getCurrentPageType().type;
            var newQuery = location.search ?
                location.search + '&pagetype=' + pageType :
                '?pagetype=' + pageType;

            namespace('AgencyPages').router.navigate($this.attr('href') + newQuery, true, false, null, {
                id: jobId,
                title: jobTitle,
                tab: 1
            });

            trackJobPageView(jobTitle, departmentName);

            event.preventDefault();
        });

        $jobsContainer.find('.search-results-grid-container thead a[href]').on('click', function (event) {
            var $el = $(event.currentTarget),
                sortBy = $el.data('sort-type'),
                sortType;

            if (sortBy) {
                var router = AgencyPages.router;

                var $sortEl = $el.find('.sort-el');

                if ($sortEl.hasClass('sort-up')) {
                    sortType = '|Descending';
                } else if ($sortEl.hasClass('sort-down')) {
                    sortType = null;
                } else {
                    sortType = '|Ascending';
                }

                sort = !sortType ? null : sortBy + sortType;

                var currentFilters = filters || {};
                $.extend(currentFilters, { sort: sort });
                if (keywords) {
                    $.extend(currentFilters, { keywords: keywords });
                }
                
                var query = url.buildget(currentFilters);

                router.navigate(initialUrl + '?' + query, false);

                $(document).trigger('SearchPage:sort', sort);
                $(document).trigger('FilterFlyout:sortByChanged', sort);

                $(document).one(Events.CommonEventsNames.JobsListLoaded, function (event) {
                    $('a[data-sort-type="'+ sortBy + '"]').focus();
                });
            }
        });
    }

    function showOverlay() {
        overlay.show();
    }

    function hideOverlay() {
        overlay.hide();
    }

    function hideAutoSuggestion() {
        var searchFieldAutoSuggestionContainer = $('.ui-autocomplete.ui-menu.popover.small-autocomplete');
        if (searchFieldAutoSuggestionContainer
            && searchFieldAutoSuggestionContainer.length > 0
            && $(window).width() > maxMobileScreenWidth) {
            searchFieldAutoSuggestionContainer.hide();
        }
    }

    //check if we've already searched for this keyword and have same search results
    function hasSameKeywords(newKeywords) {
        return keywords === decodeURI(newKeywords);
    }

    function searchJobs(newKeywords) {
        hideAutoSuggestion();

        if (hasSameKeywords(newKeywords)) {
            return;
        }

        keywords = newKeywords;
        searchInput.val(keywords);

        // Sort by relevance by default for search.
        sort = null;

        if (keywords == '') {
            sort = defaultSortingOrder;
        }

        $(document).trigger('FilterFlyout:sortByChanged', sort);

        loadJobs(jobsContainer, keywords, null, sort, filters);
    }

    searchForm.on('submit', function(e) {
        e.preventDefault();

        hideAutoSuggestion();
        var inputValue = searchInput.val();  
        
        if (hasSameKeywords(inputValue)) {
            if (keywords === '') {
                AgencyPages.searchPageHelper.showEmptySearchPopover(keywordSearchInput, searchForm, buttonLink);
            }

            return;
        }

        $(document).one(Events.CommonEventsNames.JobsListLoaded, function () {
            var notification = !!inputValue ? "Search by " + inputValue + " keyword is applied" : "Search by keyword is removed";
            gJobs.screenReadersService.readPageTitle(searchForm.find("#keyword-search-input"), notification);
        });  

        if (filters) {
            if (filters.classspecificationscodes) {
                var params = '';
                for (i = 0; i < filters.classspecificationscodes.length; i++) {
                    

                    params += '&classspecificationscodes[' + i + ']=' + encodeURIComponent(filters.classspecificationscodes[i]);
                }
                AgencyPages.router.navigate(initialUrl + '?' + url.buildget({ keywords: inputValue }) + params, null, null, null, { keywords: inputValue });
            }
            else {
                AgencyPages.router.navigate(initialUrl + '?' + url.buildget({ keywords: inputValue }), null, null, null, { keywords: inputValue });
            }
        }
        else {
            AgencyPages.router.navigate(initialUrl + '?' + url.buildget({ keywords: inputValue }), null, null, null, { keywords: inputValue });
        }
    });

    actionListView.on('click', function (e) {
        listGridViewService.showList();
        gJobs.screenReadersService.setAriaLiveNotification("Search results are shown in list view.");
        notifyShowedItemsCount();
    });

    actionGridView.on('click', function (e) {
        listGridViewService.showGrid();
        gJobs.screenReadersService.setAriaLiveNotification("Search results are shown in grid view.");
        notifyShowedItemsCount();
    });

    $(document).on('SearchPage:sort', function (e, sortType) {
        sort = sortType;
        loadJobs(jobsContainer, keywords, null, sort, filters);
    });

    $(document).on('SearchPage:filtersChanged', function (e, data) {
        filters = data.newfilters;
        if (data.isChangeFromFlyout) {
            page = null;
        }
        loadJobs(jobsContainer, keywords, page, sort, filters);
    });

    function initJobFlyout() {

        var agencyPagesJobListAdapter = (function () {
            /* This adapter still needs to be improved, because it counts only jobs listed on the current page
               todo: check whether there are jobs on other pages, and think of a way to navigate to a different page,
                     flyout may notify this adapter by triggering a common job-changed event, or an extra method may be addded into the adapter
               */

            var currentNavigationStatus = '';

            var getJobLi = function (id, position) {
                return $('.job-listing-container li[data-job-id="' + id + '"]')[position]('li[data-job-id]');
            };

            function clickJobLink($jobLink) {
                gJobs.focusService.restoreFocus();
                $jobLink.click();
                var jobHref = $jobLink.attr('href');
                var $visibleJobLink = $('[href="' + jobHref + '"]:visible').first();
                gJobs.focusService.replaceLastElement($visibleJobLink);
            }

            return {
                hasNextJob: function (id) {
                    var currentPage = currentParams.page || 1;
                    var jobsNumber = $('#job-postings-number').text();
                    var assumedJobsNumber = JOBS_PER_PAGE * currentPage;

                    return !!getJobLi(id, 'next').length || assumedJobsNumber < jobsNumber;
                },
                hasPreviousJob: function (id) {
                    var currentPage = currentParams.page || 1;

                    return !!getJobLi(id, 'prev').length || currentPage > 1;
                },
                getNextJob: function (id) {
                    var $nextJobLi = getJobLi(id, 'next');
                    var $nextJobLink = $nextJobLi.find('a.item-details-link');
                    currentNavigationStatus = 'Next job';

                    if (!$nextJobLink.length) {
                        var currentPage = currentParams.page || 1;
                        var nextPage = currentPage + 1;
                        loadJobs(jobsContainer, currentParams.jobtitle,
                            nextPage, currentParams.sort, currentParams.filters)
                            .then(function () {
                                OnlineApp.Services.tabIndexService.disableTabIndex({
                                    containerSelector: jobListContainerSelector
                                });

                                $nextJobLi = $('.job-listing-container li.list-item').first();
                                $nextJobLink = $nextJobLi.find('a.item-details-link');
                                clickJobLink($nextJobLink);
                            });
                    } else {
                        clickJobLink($nextJobLink);
                    }
                },
                getPreviousJob: function (id) {
                    var $prevJobLi = getJobLi(id, 'prev');
                    var $prevJobLink = $prevJobLi.find('a.item-details-link');
                    currentNavigationStatus = 'Previous job';

                    if (!$prevJobLink.length) {
                        var currentPage = currentParams.page;
                        var prevPage = currentPage - 1 || 1;
                        loadJobs(jobsContainer, currentParams.jobtitle,
                            prevPage, currentParams.sort, currentParams.filters)
                            .then(function () {
                                OnlineApp.Services.tabIndexService.disableTabIndex({
                                    containerSelector: jobListContainerSelector
                                });

                                $prevJobLi = $('.job-listing-container li.list-item').last();
                                $prevJobLink = $prevJobLi.find('a.item-details-link');
                                clickJobLink($prevJobLink);
                            });
                    } else {
                        clickJobLink($prevJobLink);
                    }
                },
                getJobNavigationStatus: function () {
                    return currentNavigationStatus;
                },
                resetJobNavigationStatus: function () {
                    currentNavigationStatus = '';
                }
            };
        })();

        var jobFlyout = new JobFlyout({ jobListAdapter: agencyPagesJobListAdapter });

        namespace('AgencyPages').jobFlyout = jobFlyout;
    }

    function restoreJobFlyout(params) {
        var jobUrl = '';
        var jobId = '';
        var currentUrlParts = pageInfoService.getCurrentUrlParts();
        var isDepartmentPage = pageInfoService.isDepartmentPage();
        var isJobDetails = false;
        var paramsCopy = {};

        if (params.jobId && params.tab && params.jobName) {
            jobId = params.jobId;
            jobUrl = '/' + currentUrlParts[1] + '/' + currentUrlParts[2];

            if (isDepartmentPage) {
                jobUrl += '/' + currentUrlParts[3];
            }

            jobUrl += '/jobs/' + params.jobId + '/' + params.jobName;

            if (params.tab == 2) {
                jobUrl += '/apply';

                if (params.jobDetails == 1) {
                    isJobDetails = true;
                    delete params.jobDetails;
                }
            }
            delete params.jobId;
            delete params.tab;
            delete params.jobName;
        }

        if (jobUrl) {
            $.extend(paramsCopy, params); // We need URL parametres without jobId, tab and jobName to restore exact state.
            // We need to wait for populating jobs list to make "Next Posting" and "Previous posting" buttons work properly.
            $(document).one(Events.CommonEventsNames.JobsListLoaded, function () {
                // todo: Find a better way to populate job title
                var $jobLink = $('[data-job-id="' + jobId + '"]').find('a.item-details-link:visible');
                var jobTitle = $jobLink.text();
                var departmentName = $jobLink.data('department-name');
                namespace('AgencyPages').router.navigate(jobUrl + '?' + url.buildget(paramsCopy), true, false, null,
                {
                    jobTitle: jobTitle || ''
                });

                $(document).on(Events.CommonEventsNames.GoogleAnalyticsTrackersInjected, function () {
                    trackJobPageView(jobTitle, departmentName);
                });
                $(document).trigger(Events.CommonEventsNames.JobDetailsLoaded);
            });

            if (isJobDetails) {
                // Waiting for loading OnlineApp and updating last completed step in it to load JobDetails flyout.
                $(document).one(OnlineApp.Events.CommonEventsNames.ApplicationRendered, function () {
                    namespace('AgencyPages').router.navigate(jobUrl + '/jobdetails', true, false, null, null, true);
                });
            }
        }
    }

    function trackJobPageView(jobTitle, departmentName) {
        if (jobTitle && departmentName) {
            gJobs.common.analytics.setProperties({
                properties: {
                    dimension8: jobTitle,
                    dimension9: departmentName
                },
                sendToAllTrackers: true
            });
        }

        gJobs.common.analytics.trackVirtualPageView({
            page: 'modal',
            title: 'Job Opportunities | ' + jobTitle,
            sendToAllTrackers: true
        });
    }

    function applyQueryParametres(params) {
        restoreJobFlyout(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 {
            loadJobs(jobsContainer, keywords, page, sort, filters);
        }
    }

    $(document).ready(function () {
        defaultSortingOrder = searhContainer.data('default-sort-type');
        initJobFlyout();
        initFilterFlyout();
        initCanvassFlyout();
        // Decode escaped '[' & ']' to get correct arrays of parameters.
        var params = url.get(decodeURI(window.location.search.slice(1)), { array: true });

        // Don't use default sort order if we have keywords (default to relevance for search by keyword)
        if (!params.keywords) {
            sort = defaultSortingOrder;
        }

        if (Object.keys(params).length) {
            applyQueryParametres(params);
        } else {
            loadJobs(jobsContainer, keywords, null, sort, filters);
        }

        if (namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('careersCanvassFormRoute') ||
            namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('careersCanvassFormDepartmentRoute'))
        {
            History.Adapter.trigger(window, 'statechange');
        }

        $(document).trigger('FilterFlyout:sortByChanged', sort);

        $('.ui-autocomplete.ui-menu').on('click', '.ui-menu-item', function () {
            searchForm.trigger('submit');
        });

        $(window).on('scroll resize', function () {
            hideAutoSuggestion();

            listGridViewService.showCurrentViewRegardingUserSettings(userSettingsService.getSettings());
        });

        $(window).on('resize', function() {
            clampJobDescriptions();
        });

        $(document).on(OnlineApp.Events.CommonEventsNames.ApplyTabOpened, function () {
            gJobs.skipToContentService.showOnNextTab();
        });

        if (gJobs.browserDetector.isIE()) {
            gJobs.pageTabNavigationService.enableScrollForElements(jobsContainer, '.item-details-link', '.list-item');
        }
        gJobs.pageTabNavigationService.adjustNavigationForFixedHeader($('body'));
    });

    namespace('AgencyPages').searchPage = {
        search: function (newKeywords) {
            newKeywords = newKeywords || '';
            searchJobs(newKeywords);
        },

        goToPage: function (newPageNumber) {
            if (page !== newPageNumber) {
                page = newPageNumber;
                loadJobs(jobsContainer, keywords, newPageNumber, sort, filters);
                $('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();
            $keywordSearchInput.val('');
            gJobs.screenReadersService.setNotification($("#aria-live-message-container"), $kl + ' keywords are cleared','',true);
            $searchStatus.text('');
            $keywordSearchInput.trigger('change');
            $searchForm.submit();
            $keywordSearchInput.focus();
        });
    });

    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;

        $verbiageToggleButton.ready(function () {
            var shortContent = $('.verbiage').find('p:first').text();
            $verbiageToggleButton.attr("aria-label", "Show more content");
        });

        $verbiageToggleButton.on('click', function () {
            if ($verbiage.hasClass('collapsed')) {
                
                var fullContent = $('.verbiage').text();

                $verbiage.css('max-height', $verbiage.get(0).scrollHeight);
                $verbiage.removeClass('collapsed');

                $verbiageToggleButton.html(showLessTemplate);
                $verbiageToggleButton.attr("aria-label", " Show less content");
                gJobs.screenReadersService.setAriaLiveNotification("Content is expanded.");
            } else {
               
                var shortContent = $('.verbiage').find('p:first').text();
                $verbiageToggleButton.attr("aria-label", "Show more content");

                $verbiage.css('max-height', '');
                $verbiage.addClass('collapsed');

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

        $(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);;
