/* Minification failed. Returning unminified contents.
(2526,41-42): run-time error JS1195: Expected expression: >
(2526,59-60): run-time error JS1004: Expected ';': )
(2747,14-15): run-time error JS1195: Expected expression: )
(2853,5-6): run-time error JS1002: Syntax error: }
(2855,37-38): run-time error JS1004: Expected ';': {
(3137,1-2): run-time error JS1002: Syntax error: }
 */
/* Minification failed. Returning unminified contents.
(2518,41-42): run-time error JS1195: Expected expression: >
(2518,59-60): run-time error JS1004: Expected ';': )
(2739,14-15): run-time error JS1195: Expected expression: )
(2845,5-6): run-time error JS1002: Syntax error: }
(2847,37-38): run-time error JS1004: Expected ';': {
(3129,1-2): run-time error JS1002: Syntax error: }
 */
(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 : '';
                var isSubmittedApplicationPageQuery = departmentFolderName ? '&isSubmittedApplicationPage=true' : '?isSubmittedApplicationPage=true';
                return $.get(jobInfoEndpoint + id + departmentQuery + isSubmittedApplicationPageQuery, 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) {
                $('#applications-container-link').attr('tabindex', '-1');
                setActiveTab(self.tabs.jobDetailsTab.id);
                namespace('AgencyPages').router.navigate(applicationBaseUrl + '/' + self.tabs.jobDetailsTab.urlPart, false, null, null, null, true);
                gJobs.skipToContentService.showOnNextTab();
                let tablists = document.querySelectorAll('[role=tablist]');
                for (let i = 0; i < tablists.length; i++) {
                    new TabsManual(tablists[i]);
                }
                $('#job-info').attr('tabindex', '0');
                $('#job-app').attr('tabindex', '-1');

                let desc_li = $('.description');
                let questions_li = $('.questions');
                let benefits_li = $('.benefits');
                let descButton = $('#description');
                let benefitsButton = $('#benefits');
                let questionsButton = $('#questions');
                if (desc_li) {
                    let isDescActive = desc_li.hasClass('active');
                    if (isDescActive == true) {
                        descButton.attr('tabindex', '0');
                        questionsButton.attr('tabindex', '-1');
                        benefitsButton.attr('tabindex', '-1');
                    }
                }
                if (benefits_li) {
                    let isBenefitsActive = benefits_li.hasClass('active');
                    if (isBenefitsActive == true) {
                        descButton.attr('tabindex', '-1');
                        questionsButton.attr('tabindex', '-1');
                        benefitsButton.attr('tabindex', '0');
                    }
                }
                if (questions_li) {
                    let isQuestionsActive = questions_li.hasClass('active');
                    if (isQuestionsActive == true) {
                        descButton.attr('tabindex', '-1');
                        questionsButton.attr('tabindex', '0');
                        benefitsButton.attr('tabindex', '-1');
                    }
                }
            } else {
                $('#applications-container-link').attr('tabindex', '-1');
                setActiveTab(self.tabs.applicationTab.id);
                namespace('AgencyPages').router.navigate(applicationBaseUrl + '/' + self.tabs.applicationTab.urlPart, false, null, null, null, true);
                $('#job-info').attr('tabindex', '-1');
                $('#job-app').attr('tabindex', '0');
                $('.jobapp').focus();
            }
        });

        self.$wrapper.find('.flyout-switch-buttons a').keydown(function (event) {
            if (event.key == "Enter") {
                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();
                    let tablists = document.querySelectorAll('[role=tablist]');
                    for (let i = 0; i < tablists.length; i++) {
                        new TabsManual(tablists[i]);
                    }
                    $('#job-info').focus();
                    $('#job-info').attr('tabindex', '0');
                    $('#job-app').attr('tabindex', '-1');

                    let desc_li = $('.description');
                    let questions_li = $('.questions');
                    let benefits_li = $('.benefits');
                    let descButton = $('#description');
                    let benefitsButton = $('#benefits');
                    let questionsButton = $('#questions');
                    if (desc_li) {
                        let isDescActive = desc_li.hasClass('active');
                        if (isDescActive == true) {
                            descButton.attr('tabindex', '0');
                            questionsButton.attr('tabindex', '-1');
                            benefitsButton.attr('tabindex', '-1');
                        }
                    }
                    if (benefits_li) {
                        let isBenefitsActive = benefits_li.hasClass('active');
                        if (isBenefitsActive == true) {
                            descButton.attr('tabindex', '-1');
                            questionsButton.attr('tabindex', '-1');
                            benefitsButton.attr('tabindex', '0');
                        }
                    }
                    if (questions_li) {
                        let isQuestionsActive = questions_li.hasClass('active');
                        if (isQuestionsActive == true) {
                            descButton.attr('tabindex', '-1');
                            questionsButton.attr('tabindex', '0');
                            benefitsButton.attr('tabindex', '-1');
                        }
                    }
                    $('#applications-container-link').attr('tabindex', '-1');
                } else {
                    $('#applications-container-link').attr('tabindex', '-1');
                    setActiveTab(self.tabs.applicationTab.id);
                    namespace('AgencyPages').router.navigate(applicationBaseUrl + '/' + self.tabs.applicationTab.urlPart, false, null, null, null, true);
                    $('#job-info').attr('tabindex', '-1');
                    $('#job-app').attr('tabindex', '0');
                    $('.jobapp').focus();
                }
            }
        });

        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"]');
                let tablists = document.querySelectorAll('[role=tablist]');
                for (let i = 0; i < tablists.length; i++) {
                    new TabsManual(tablists[i]);
                }
            });

            //APPLICATION
            $jobApplyTab.removeClass('hide');
            $.ajax({
                url: AgencyPages.routePrefix + '/Applications/ApplicationView',
                type: 'GET',
                contentType: 'text/html',
                cache: false
            })
                .done(function (view) {

                    let tablists = document.querySelectorAll('[role=tablist]');
                    for (let i = 0; i < tablists.length; i++) {
                        new TabsManual(tablists[i]);
                    }
                    $('#applications-container-link').attr('tabindex', '-1');
                    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;
                        }
                        let tablists = document.querySelectorAll('[role=tablist]');
                        for (let i = 0; i < tablists.length; i++) {
                            new TabsManual(tablists[i]);
                        }
                        $('#applications-container-link').attr('tabindex', '-1');
                        // 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';
                gJobs.screenReadersService.setAriaLiveNotification("Job Details tab selected");
            } else {
                $jobDetailsTab.removeClass('active');
                $jobApplyTab.addClass('active');
                self.activeTab = self.tabs.applicationTab.id;
                window.document.title = originalPageTitle + ' – Application';
                gJobs.screenReadersService.setAriaLiveNotification("Application tab selected");
            }
        }
    };

    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();
        };

        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 vm = OnlineApp.ViewModels;

    function QuestionsBaseViewModel() {

        var self = vm.Base.EditableViewModel.apply(this, arguments) || this;

        // 3.4.5 The AWQ/SQ pages will support auto-save functionality
        // every 10 seconds as the job seeker fills in the answers.
        // see implementation below
        var timerDelayMs = 10000;
        var timeoutId = null;

        // flag to determine first-time visit
        // we need to suppressValidationErrors only the first time user visits questions tab
        var visited = false;

        function getQuestionsWithAnswers() {
            // "=" equal sign is necessary here if we pass string as a POST data
            // http://stackoverflow.com/questions/13771032/post-string-to-asp-net-web-api-application-returns-null
            //return "=" + ko.toJSON(self.questionsWithAnswers());

            // however "=" is not necessary if we wrap json into the object
            // { JsonQas: getQuestionsWithAnswers() }
            var qas = ko.utils.arrayMap(self.questionsWithAnswers(), function(item) {
                return {
                    questionID: item.questionID(),
                    questionSqlID: item.questionSqlID(),
                    questionType: item.questionType(),

                    answerID: item.answerID(),
                    answerType: item.answerType(),
                    textAnswer: item.textAnswer(),

                    selectAnswers: item.selectAnswers()
                };
            });

            return ko.toJSON(qas);
        }

        function getQuestionsWithAnswersForAutosave() {
            var qas = ko.utils.arrayMap(self.questionsWithAnswers(), function(item) {

                var textAnswer = item.textAnswer();

                if (item.questionType() === 1 || item.questionType() === 2) {
                    if (!OnlineApp.Validation.disallowHtmlValidator.validate(textAnswer, {})) {
                        textAnswer = '';
                    }
                }

                return {
                    questionID: item.questionID(),
                    questionSqlID: item.questionSqlID(),
                    questionType: item.questionType(),

                    answerID: item.answerID(),
                    answerType: item.answerType(),
                    textAnswer: textAnswer,

                    selectAnswers: item.selectAnswers()
                };
            });
            return ko.toJSON(qas);
        }

        self.enableAutosave = ko.observable(true);

        self.questionsWithAnswers = ko.observableArray();

        self.verbiage = ko.observable();

        self.displayButtonsBlock = ko.observable(true);

        // 3.4.4 It is possible that there is a job with no AWQs and/or SQs.
        // In that case, the UI does not display these sections to the end user
        // if there are no questions to be included.
        self.displaySection = ko.observable(true);

        self.areAnswersPrepopulated = ko.observable(false);

        self.validate = function() {
            var isValid = true;

            var itemToValidate = self.editableItem() || self;
            ko.utils.arrayForEach(itemToValidate.questionsWithAnswers(), function(q) {
                if (!q.validate()) {
                    isValid = false;
                }
            });

            self.hasError(!isValid);

            return isValid;
        };

        self.suppressValidationErrors = function () {
            var itemToValidate = self.editableItem() || self;

            ko.utils.arrayForEach(itemToValidate.questionsWithAnswers(), function(q) {
                self.suppressValidationErrorsFor(q);
            });
        };

        self.hasError = ko.observable(false);

        self.fromDataModel = function(data) {
            if (!data || !data.questionsWithAnswers ||
                !(data.questionsWithAnswers.length && data.questionsWithAnswers.length > 0)) {

                self.displaySection(false);
                return;
            }

            self.questionsWithAnswers(ko.utils.arrayMap(data.questionsWithAnswers, function(item) {
                var viewModel = new vm.Questions.QuestionWithAnswerViewModel();
                return viewModel.fromDataModel(item);
            }));

            self.verbiage = data.verbiage;
            self.areAnswersPrepopulated = data.isPrepopulated;

            // when we load and set everything
            // we mark model as clean
            self.resetIsDirty();

            if (self.enableAutosave()) {
                // when model becomes dirty
                // we autosave its state and mark it as clean
                self.isDirty.subscribe(function (isDirty) {

                    if (!timeoutId && isDirty && self.isInEditMode()) {
                        //console.log("dirty - setting timeout");

                        timeoutId = window.setTimeout(function () {
                            window.clearTimeout(timeoutId); // ?? not working
                            timeoutId = null;

                            // model might be already saved (clean) when user went and submitted the app really fast (very rare case)
                            if (self.isDirty()) {
                                // reset isDirty flag when autosave is triggered
                                self.resetIsDirty();

                                // save answers
                                self.saveChanges(null, true);

                                $(document).trigger("questionsAutosaved");
                            }
                        }, timerDelayMs);
                    }
                });
            }
        };

        self.beginEdit = (function(base) {
            return function(item, e) {

                if (!item) {
                    self.isInEditMode(true);
                    self.editableItem(self);

                    if (OnlineApp.Events) {
                        $(document).trigger(
                            OnlineApp.Events.CommonEventsNames.EditableItemBeginEdit, {
                                item: item,
                                isQuestionsItem: true
                            });
                    }
                } else {
                    base(item);
                }

                // suppressValidationErrors - do not show validation errors when we open questions tab
                if (!visited) {
                    self.suppressValidationErrors();
                    visited = true;
                } else {
                    self.validate();
                }
            };
        })(self.beginEdit);

        self.clearQuestions = (function (base) {
            $(document).trigger(
                Events.CommonEventsNames.ShowConfirmDialog,
                {
                    header: 'Clear form?',
                    subHeader: 'Are you sure you want to clear the answers within the Agency Questions section? You cannot undo this action.',
                    confirmButtonText: 'Yes, clear all',
                    cancelButtonText: 'No, go back',
                    ariaLabel: 'Clear form',
                    confirmClick: function () {
                        let itemToValidate = self.editableItem() || self;
                        ko.utils.arrayForEach(itemToValidate.questionsWithAnswers(), function (q) {
                            if (q.toDataModel().templateType == "DropDownSingle") {
                                q.toDataModel().selectAnswer = undefined;
                                q.toDataModel().selectAnswers = [];
                            }
                            $('.agencywide-questions').each(function () {
                                let $this = $(this);

                                // Update the chosen text
                                $this.find('.chzn-single span').text('Choose option...');

                                // Remove search choices
                                $this.find('.chzn-choices .search-choice').remove();
                            });

                            q.selectAnswers('');
                            q.selectAnswer('');
                            q.textAnswer('');
                            setTimeout(function () {
                                gJobs.screenReadersService.setAriaLiveNotification('All selections are cleared');
                            },300);
                        });

                        //self.resetIsDirty();
                        self.suppressValidationErrors();

                        visited = true;
                    }
                });    
        });

        self.endEdit = (function(base) {
            return function(item) {
                if (!item) {
                    item = self;
                }

                var editedItem = base(item);

                // set edited item as readonly
                item.fromViewModel(editedItem);

                return editedItem;
            };
        })(self.endEdit);

        self.saveChanges = (function(base) {
            return function(item, e) {
                // to end editing call base method
                // don't call base here!
                // base(item);

                // second param might come as event source
                // we are faiting for a flag
                var triggeredByAutosave = (typeof e === "boolean" && e === true);

                // if triggered via autosave function => no validation
                var proceedSaving = triggeredByAutosave ? true : self.validate();

                if (proceedSaving) {
                    // set readonly state
                    return self.save({
                        JsonQuestionsWithAnswers: triggeredByAutosave ? getQuestionsWithAnswersForAutosave() : getQuestionsWithAnswers(),
                        Autosave: true // saves questions without server-validation
                    }, triggeredByAutosave).done(function() {

                        if (!triggeredByAutosave && e) {
                            var containerMetrics = getParentContainerMetrics(e.target);
                            var $editableItemContainer = getParentContainer(e.target).parent();

                            var editedItem = self.endEdit(item);
                            // set edited item as readonly
                            item.fromViewModel(editedItem);

                            sendEndEditEvent(containerMetrics, $editableItemContainer);
                        }
                    }); // bypass validation if needed
                } else if (!triggeredByAutosave) {
                    var validationFailedEvent =
                        jQuery.Event(OnlineApp.Events.CommonEventsNames.PreSaveValidationFailed);
                    validationFailedEvent.target = e.target;
                    $(document).trigger(validationFailedEvent);
                }
            };
        })(self.saveChanges);

        self.dirtyItems = ko.computed(function() {
            var itemToCheck = self.editableItem() || self;

            return ko.utils.arrayFilter(itemToCheck.questionsWithAnswers(), function(q) {
                return q.dirtyFlag.isDirty();
            });
        });

        self.isDirty = ko.computed(function() {
            var isDirty = self.dirtyItems().length > 0;

            //console.log(isDirty ? "Dirty" : "Clean");

            return isDirty;
        });

        self.resetIsDirty = function() {
            var itemToReset = self.editableItem() || self;

            ko.utils.arrayForEach(itemToReset.questionsWithAnswers(), function(q) {
                return q.dirtyFlag.reset();
            });
        };

        function getParentContainerMetrics(child) {

            var $container = getParentContainer(child);

            if (!$container) {
                return null;
            }

            var metrics = {
                offset: $container.offset(),
                position: $container.position(),
                padding: parseInt($container.css('padding-top') || 0),
                containerScroll: $container.scrollParent().scrollTop()
            };

            return metrics;
        }

        function getParentContainer(child) {
            if (!child) {
                return null;
            }

            var $container = $(child).closest('.edit-dialog');

            return $container;
        }

        var sendEndEditEvent = function (containerMetrics, $container, dontScrollAfterEditing) {
            var editCompleteEvent = jQuery.Event(OnlineApp.Events.CommonEventsNames.EditItemComplete);
            editCompleteEvent.targetMetrics = containerMetrics;
            editCompleteEvent.editableItemContainer = $container;
            editCompleteEvent.dontScrollAfterEditing = dontScrollAfterEditing;
            $(document).trigger(editCompleteEvent);
        };
    }

    OnlineApp.Namespace.extend('OnlineApp.ViewModels.Questions', {
        QuestionsBaseViewModel: QuestionsBaseViewModel
    });

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

    // defines question template types for Knockout
    // value is a template id
    var QuestionTemplateType = {
        DropDownSingle: "DropDownSingle",
        DropDownMultiple: "DropDownMultiple",
        RadioGroup: "RadioGroup",
        CheckboxGroup: "CheckboxGroup",
        RadioYesNo: "RadioYesNo",
        Text: "Text"
    };

    // Question-Answer flat view model
    // represents one question-answer instance

    function QuestionWithAnswerViewModel() {
        var self = OnlineApp.ViewModels.Base.ValidatableViewModel.apply(this, arguments) || this;

        var noAnswerText = "No answer(s) specified";

        self.questionID = ko.observable();
        self.questionSqlID = ko.observable();
        self.questionText = ko.observable();
        self.questionType = ko.observable();
        self.questionGroup = ko.observable();
        self.questionOptions = ko.observable();
        self.isRequired = ko.observable();

        self.answerID = ko.observable();
        self.answerType = ko.observable();
        self.textAnswer = ko.observable();

        // checkboxes and multiselects are bound to arrays
        // whereas radio button - to just values
        self.selectAnswers = ko.observableArray([]);
        self.selectAnswer = ko.computed({
            read: function() {
                var values = self.selectAnswers();
                return (values && values.length) ? values[0] : undefined;
            },
            write: function(newValue) {
                var intValue = parseInt(newValue);

                if (isNaN(intValue)) {
                    self.selectAnswers([]);
                    return;
                }

                self.selectAnswers([intValue]);
            },
            owner: self
        });

        self.questionLabel = ko.computed(function () {
            var text = self.questionText();
            return utils.stripHtmlTags(text);
        });

        self.stripString = function (question) {
            /*
                lowercase entire question text
                remove all words except first 10
                remove all letters except alphanumeric, dash and space
                replace multiple whitespace with single space
                replace space with dash
                replace multiple dashes with single dash
            */
            var stripped = question
                .toLowerCase()
                .replace(/[^0-9a-z -]/gi, '')
                .replace(/(([^\s]+\s\s*){10})(.*)/,"$1")
                .replace(/\s\s+/g, ' ')
                .replace(/\s/g, "-")
                .replace(/--+/g, "-")
            ;
            return stripped;
        };

        self.getHTMLNameOrIdFromQuestionText = function(tabPrefix, sectionPrefix, sufix) {
            return (tabPrefix || '') + (sectionPrefix || '') + self.stripString(self.questionText()) + self.stripString(sufix || '');
        };

        self.getLabelledBy = function(tabPrefix, sectionPrefix, sufix) {
            return 'label-' + self.getHTMLNameOrIdFromQuestionText(tabPrefix, sectionPrefix, sufix);
        };

        self.questionNumberText = function(index) {
            var number = index + 1;
            return number < 10 ? "0" + number : "" + number;
        };

        self.clearRadioButton = function (context, ev) {   
            gJobs.screenReadersService.clearNotification($("#aria-live-message-container"));
            context.selectAnswers('');
            context.selectAnswer(''); 
            setTimeout(function () {
               
                gJobs.screenReadersService.setAriaLiveNotification('Selection cleared');
            }, 300);
        };

        self.onRadioGroupEnter = function (context, ev) {
            let $currentTarget = $(ev.currentTarget);

            // this attribute was required to show the question text in jaws hot keys
            $currentTarget.removeAttr('aria-label');
            
        };

        self.draftJobApplicationQuestionType = ko.observable();

        self.templateType = ko.computed(function() {
            /*  <QuestionType>
                Text = 1,
                ScrollingText = 2,
                DropDownSingle = 3,
                Checkbox = 4,
                Radio = 5,
                DropDownYesNo = 6,
                DropDownMultiple = 7,
            */

            /*  <QuestionGroup>
                Text = 1,
                Select = 2,
                YesNo = 3
            */

            // "Text" template by default
            var templateType = QuestionTemplateType.Text;

            if (self.questionType() === 6 && self.questionGroup() === 3) {
                templateType = QuestionTemplateType.RadioYesNo;
            } else if (self.questionType() === 7 && self.questionGroup() === 2) {
                templateType = QuestionTemplateType.DropDownMultiple;
            } else if (self.questionType() === 3 && self.questionGroup() === 2) {
                templateType = QuestionTemplateType.DropDownSingle;
            } else if (self.questionType() === 5 && self.questionGroup() === 2) {
                templateType = QuestionTemplateType.RadioGroup;
            } else if (self.questionType() === 4 && self.questionGroup() === 2) {
                templateType = QuestionTemplateType.CheckboxGroup;
                //templateType = QuestionTemplateType.DropDownMultiple;
            }

            return templateType;
        });

        self.readonlyAnswerText = ko.computed(function() {
            var templateType = self.templateType();
            var selectAnswers = self.selectAnswers();
            var options = self.questionOptions();
            var text = self.textAnswer();

            switch (templateType) {
            case QuestionTemplateType.RadioYesNo:
                if (selectAnswers && selectAnswers[0] == '1') { // allow implicit type conversion from 1 to '1' if needed
                    return 'Yes';
                } else if (selectAnswers && selectAnswers[0] == '0') {
                    return 'No';
                } else if (text == '1') {
                    return 'Yes';
                } else if (text == '0') {
                    return 'No';
                } else {
                    return noAnswerText;
                }
            case QuestionTemplateType.RadioGroup:
            case QuestionTemplateType.DropDownSingle:
                if (!selectAnswers) {
                    return noAnswerText;
                }

                // in radio group - only one is selected
                var selectedValue = selectAnswers.join();

                for (var i in options) {
                    var option = options[i];
                    if (option.sqlID == selectedValue) {
                        return option.optionTitle;
                    }
                }
                return noAnswerText;
            case QuestionTemplateType.Text:
                if (!!text) {
                    return utils.normalizeNewlines(text);
                }
                return noAnswerText;
            case QuestionTemplateType.DropDownMultiple:
            case QuestionTemplateType.CheckboxGroup:
                if (!selectAnswers) {
                    return noAnswerText;
                }

                var optionNames = [];

                for (var o in options) {
                    var option = options[o];

                    for (var s in selectAnswers) {
                        var selectedValue = selectAnswers[s];

                        if (option.sqlID == selectedValue) {
                            optionNames.push(option.optionTitle);
                        }
                    }
                }

                return optionNames.length > 0 ? optionNames.join(", ") : noAnswerText;
            default:
                return noAnswerText;
            }
        });

        self.fromDataModel = function(data) {
            self.questionID(data.questionID);
            self.questionSqlID(data.questionSqlID);
            self.questionText(data.questionText);
            self.questionType(data.questionType);
            self.questionGroup(data.questionGroup);
            self.questionOptions(data.questionOptions);
            self.isRequired(data.isRequired);

            self.answerID(data.answerID);
            self.answerType(data.answerType);
            self.textAnswer(data.textAnswer);

            // ?? investigate - make array of strings for correct processing
            self.selectAnswers(data.selectAnswers || []);

            if (self.templateType() === QuestionTemplateType.CheckboxGroup) {
                // make array of strings for correct processing
                var selectAnswers = ko.utils.arrayMap(self.selectAnswers(), function(item) {
                    return item + "";
                });
                self.selectAnswers(selectAnswers);
            }

            if (self.templateType() === QuestionTemplateType.RadioYesNo) {
                if (!data.selectAnswers) {
                    // don't put anything by default
                    //self.selectAnswers([0]);
                    //self.selectAnswer(0);
                } else {
                    self.selectAnswer(data.selectAnswers[0]);
                }
            }

            /*
                Validation
            */

            var config = {
                'all': {}
            };

            if (self.templateType() === QuestionTemplateType.Text) {
                config.all.textAnswer = {
                    disallowHtml: {}
                };
            }

            if (self.isRequired()) {
                if (self.templateType() === QuestionTemplateType.Text) {
                    if (!config.all.textAnswer) {
                        config.all.textAnswer = { };
                    }
                    config.all.textAnswer.required = { };
                } else {
                    config.all.selectAnswer = {
                        required: {}
                    };
                }
            }

            if (config.all.textAnswer || config.all.selectAnswer){
                self.registerValidation(config);
            }

            return self;
        };

        // track only a couple of properties
        self.dirtyFlag = new ko.dirtyFlag({
            textAnswer: self.textAnswer,
            selectAnswers: self.selectAnswers
        });
    }

    OnlineApp.Namespace.extend('OnlineApp.ViewModels.Questions', {
        QuestionWithAnswerViewModel: QuestionWithAnswerViewModel
    });

})(window);;
(function (window, undefined) {

    var vm = OnlineApp.ViewModels;

    function ConvictionQuestionnaireViewModel(options) {

        var config = {
            endpoint: 'convictionQuestions',
            jobApplicationId: options.applicationId
        };

        var self = vm.Questions.QuestionsBaseViewModel.call(this, config) || this;

        self.applicationId = ko.observable(options.applicationId);
        self.applicationTitle = ko.observable(options.applicationTitle);
        self.jobId = options.jobId;

        self.displayButtonsBlock(true);
        self.enableAutosave(false);

        self.isDeadlinePassed = ko.observable(false);

        self.saveChanges = (function (base) {
            return function () {
                var promise,
                    args = arguments;

                var callSaveService = function () {

                    promise = base.apply(self, args);

                    self.beginEdit();

                    promise
                        .done(function(data) {
                            if (data) {
                                if (data.message === 'Deadline passed') {
                                    self.isDeadlinePassed(true);
                                } else {
                                    toastr.success('Successfully saved!');
                                    if (options.successfulSaveCallback) {
                                        options.successfulSaveCallback();
                                    }
                                }
                            } else {
                                toastr.warning('Sorry, could not save answers.');
                            }
                        });
                };

                if (self.validate()) {
                    // Show pop-up and save if Yes is selected
                    $(document).trigger(
                        Events.CommonEventsNames.ShowConfirmDialog,
                        {
                            header: 'Are you sure you want to proceed?',
                            subHeader: 'You won\'t be able to change your answers later.',
                            confirmButtonText: 'Yes',
                            cancelButtonText: 'No',
                            confirmClick: function () {
                                callSaveService();
                            }
                        }
                    );
                }
            };
        })(self.saveChanges);

        self.discardChanges = function () {

        };

        self.afterRender = function (elements, data) {
            OnlineApp.Helpers.layoutHelper.tabbing.updateIndices(OnlineApp.FlyoutWrapperClasses.convictionQuestionnaire.selector);
        };
    }

    OnlineApp.Namespace.extend('OnlineApp.ViewModels.Questions', {
        ConvictionQuestionnaireViewModel: ConvictionQuestionnaireViewModel
    });

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

    function AttachmentTypeViewModel(attachmentTypeId, name, required) {
        var self = this;

        self.id = ko.observable(attachmentTypeId);
        self.name = ko.observable(name);
        self.required = ko.observable(required);

        self.fromDataModel = function (data) {
            self.id(data.id());
            self.name(data.name());
        };
    }

    function AttachmentHistoryViewModel(clientFilename, attachmentHistoryId) {
        var self = this;

        self.clientFilename = clientFilename;
        self.attachmentHistoryId = attachmentHistoryId;
    }



    function AttachedDocumentViewModel(attachmentType, required, fileExtensionAllowedChecker, attachmentHistoryList, supportedFileTypesDescription, allAttachments, jobApplicationId, jobId, acceptedFileTypesSignature) {
        var self = this;

        OnlineApp.ViewModels.FileUploadViewModel.call(self);

        var LAST_VISIBLE_ATTACHMENT_SELECTOR = 'attachment-download-link:visible:last';
        var isUploadone = false;
        var PASSWORD_PROTECTED_FILE_ERROR_CODE = 'PASSWORD_PROTECTED_FILE';
        var PASSWORD_PROTECTED_WARNING_SELECTOR = '.password-protected-warning-container:first';

        self.attachmentType = attachmentType;
        self.hasBeenSentToTopResume = ko.observable(false);
        self.allAttachments = allAttachments;
        self.required = ko.observable(required);

        self.uploadedFileId = ko.observable('');
        self.fileToUpload = ko.observable();
        self.uploadedFile = ko.observable();

        self.isPostingToTopResume = ko.observable(false);
        self.postingToTopResumeComplete = ko.observable(false);
        self.postedToTopResume = ko.observable(false);
        self.topResumeError = ko.observable("");

        self.jobApplicationId = ko.observable(jobApplicationId);
        self.jobId = ko.observable(jobId);
        self.acceptedFileTypesSignature = ko.observable(acceptedFileTypesSignature);

        self.hasKnownAttachmentType = ko.computed(function () {
            return (self.attachmentType.id() !== null);
        });

        self.attachmentType.id.subscribe(function (newValue) {
            if (newValue) {
                // workaround for IE to get focus back to the window and set on the upload button
                // TODO: need to find more proper solution
                gJobs.screenReadersService.stopNotification('.onlineapp-app-container .tab-pane:visible');
                setTimeout(function () {
                    $("button.attachment-upload-button").focus();
                });
            }
        });

        self.fileDownloadUrl = ko.computed(function () {
            return "/api/attachments/downloadRequestedSupplementalAttachment/"
                + "?jobId=" + self.jobId()
                + "&jobApplicationId=" + self.jobApplicationId()
                + "&attachmentId=" + self.uploadedFileId();
        });

        self.swallowClickIfCannotUpload = function () {
            // either let click through or stop event
            return self.hasKnownAttachmentType();
        };

        self.isResumeAttachmentType = function () {
            return self.attachmentType.name() === 'Resume';
        };

        self.isFirstResume = ko.computed(
            function () {
                if (!self.isResumeAttachmentType()) return false;
                for (var i = 0; i < self.allAttachments().length; i++) {
                    if (self.allAttachments()[i].isResumeAttachmentType()) {
                        return self.allAttachments()[i] === self;
                    }
                }
                return false;
            });

        self.onFileAdd = (function () {
            var base = self.onFileAdd;

            return function (e, data) {
                self.fileIsPasswordProtected(false);
                var attachmentContainerDetails = document.getElementById(self.attachmentType.id());
                var attachmentRequestId = 0;
                if (attachmentContainerDetails) {
                    attachmentRequestId = attachmentContainerDetails.dataset.attachmentRequestId;
                }
                if (!self.hasKnownAttachmentType()) return false;

                //we set upload url here because we don't know it before attachmentType is set
                $(this).data('blueimpFileupload').options.url =
                    '/api/attachments/uploadRequestedSupplementalAttachments'
                    + "?jobId=" + self.jobId()
                    + '&jobApplicationId=' + self.jobApplicationId()
                    + '&attachmentTypeId=' + self.attachmentType.id()
                    + '&attachmentRequestId=' + attachmentRequestId
                    + '&__RequestVerificationToken=' + $('input[name="__RequestVerificationToken"]').attr('value');

                if (data.files[0].size === 0) {
                   

                    self.currentlyUploadingFile(data.files[0].name);
                    self.fileUploadError(Resources.FileUploadMessages.invalidFile);

                    return false;
                }

                if (data.files[0].name && !fileExtensionAllowedChecker(data.files[0].name)) {
                    self.currentlyUploadingFile(data.files[0].name);
                    self.fileUploadError(Resources.FileUploadMessages.unsupportedExtensionWithAllowed(supportedFileTypesDescription));

                    $('.upload-file-status > button.btn-primary').focus();

                    return false;
                }

                if (data.files[0].size && data.files[0].size > maximumFileUploadSizeInKB * 1024) {
                    self.currentlyUploadingFile(data.files[0].name);
                    self.fileUploadError(Resources.FileUploadMessages.fileTooLarge());

                    $('.upload-file-status > button.btn-primary').focus();

                    return false;
                }

                var fileName = data.files[0].name;
                self.currentlyUploadingFile(fileName);  
                if (fileName.length > 1) {
                    if (fileName.length > 25) {
                        fileName = fileName.substring(0, 25) + "...";
                    }
                    $("#attachment-download-link").attr('data-toggle', 'popover');
                    $("#attachment-download-link").attr('data-trigger', 'hover focus');
                    $("#attachment-download-link").attr('data-placement', 'bottom');
                    $("#attachment-download-link").attr('data-container', '.submitted-attachments-list-container');
                    $("#attachment-download-link").attr('data-content', data.files[0].name);
                    self.currentlyUploadingFile(fileName);                    
                }

                self.fileToUpload(data.files[0]);

                base(e, data);
            };
        })();

        self.onUploadDone = (function () {

            var base = self.onUploadDone;

            return function (e, data) {

                if (data.result && data.result.status === 'OK') {
                    isUploadone = true;
                    self.uploadedFileId(data.result.attachmentId);
                    self.uploadedFile(self.fileToUpload());                    
                    var display = $('.supplemental-view-attachments-desktop').css('display');
                    var fileName = data.files[0].name;                   
                    
                    if (fileName.length >1) {
                        if (display == "block") {
                            if (fileName.length > 25) {
                                fileName = fileName.substring(0, 25) + "...";

                                $("#" + self.uploadedFileId()).attr('data-toggle', 'popover');
                                $("#" + self.uploadedFileId()).attr('data-trigger', 'hover focus');
                                $("#" + self.uploadedFileId()).attr('data-placement', 'bottom');
                                $("#" + self.uploadedFileId()).attr('data-container', '.box-container');
                                $("#" + self.uploadedFileId()).attr('data-content', data.files[0].name);
                            }
                            self.currentlyUploadingFile(fileName);                            
                            $('.supplemental-view-attachments-desktop').css('display', 'block');
                        }
                        else {
                            if (fileName.length > 25) {
                                fileName = fileName.substring(0, 4) + "..." + fileName.substring(fileName.length - 8);
                            }
                            self.currentlyUploadingFile(fileName);                           
                            $('.supplemental-view-attachments-mobile').css('display', 'block');
                        }
                    }
                    //set new attachment history list
                    attachmentHistoryList(
                        $.map(
                            data.result.newAttachmentHistory,
                            function (attHist) {
                                return new AttachmentHistoryViewModel(
                                    attHist.clientFilename,
                                    attHist.attachmentHistoryEntryId);
                            }));

                    $(document).trigger(Events.CommonEventsNames.SupplementalAttachmentDocAttached);
                } else if (data.result && data.result.errorCode === PASSWORD_PROTECTED_FILE_ERROR_CODE) {
                    self.currentlyUploadingFile('');
                    self.fileIsPasswordProtected(true);

                    gJobs.screenReadersService.setAriaLiveNotification($(PASSWORD_PROTECTED_WARNING_SELECTOR).text());

                    return false;
                }

                $(document)
                    .trigger(OnlineApp.Events.CommonEventsNames.DocumentAttached);

                base(e, data);

                gJobs.common.analytics.trackApplicationEvent({
                    action: 'upload',
                    eventLabel: 'attachment',
                    sendToAllTrackers: true,
                    data: { 'metric4': 1, 'metric6': 1 }
                });

                gJobs.screenReadersService.setNotificationOnElement(
                    {
                        text: data.files[0].name + ' attachment has been successfully loaded',
                        $element: $(LAST_VISIBLE_ATTACHMENT_SELECTOR)
                    });
            };
        })();

        self.showFileSelect = (function () {

            var base = self.showFileSelect;

            return function (data, evnt) {
                if (self.hasKnownAttachmentType()) {
                    base(data, evnt);
                }
            };
        })();

        self.attachFileUploader = function (e) {
            self.fileUploader = $(e).fileupload({
                dataType: "json",
                dropZone: $(e).closest('form').find('.box'),
                add: self.onFileAdd,
                send: self.onFileSend,
                progress: self.onUploadProgress,
                done: self.onUploadDone,
                fail: self.onUploadFail
            });
        };

        self.triggerUploadAttachmentButtonClick = function(data, event) {
            var supplementalAttachmentUploadButton =
                $(event.target).hasClass('attachment-upload-container')
                    ? $(event.target).find('.supplemental-attachments-upload-button').get(0)
                    : $(event.target).closest('.attachment-upload-container').find('.supplemental-attachments-upload-button').get(0);

            if (supplementalAttachmentUploadButton) supplementalAttachmentUploadButton.click();

            return true;
        }

        self.focusOnFirstUploadButton = function(data, event) {            
            var id = $(event.target).data('item-id');
            document.getElementById(id).focus();
        }
    }

    function SupplementalAttachmentsViewModel() {
        var config = { endpoint: "attachments", passJobId: true };
        var self = OnlineApp.ViewModels.Base.DataViewModel.call(this, config) || this;

        self.attachments = ko.observableArray([]);

        self.savedItemsCount = ko.computed(function () {
            return $.grep(self.attachments(), function (att) { return att.uploadedFileId() !== ''; }).length;
        });

        self.allowedAttachmentTypes = ko.observableArray([]);

        self.shouldShowAddSupplementalAttachmentButton = ko.computed(function() {
            return self.savedItemsCount() > 0
                && !window.utils.exists(self.attachments(), function(att) {
                    return att.currentlyUploadingFile() === '';
                });;
        });

        self.supportedFileTypes = ko.observableArray([]);

        self.getSupportedFileTypesWithPeriods = function () {
            return $.map(self.supportedFileTypes(), function (fileType) {
                return "." + fileType;
            });
        };

        self.supportedFileTypesDescription = ko.computed(function () {
            return self.getSupportedFileTypesWithPeriods().join(", ");
        });

        self.acceptedFileTypesSignature = ko.computed(function() {
            return 'Accepted file types are ' + self.getSupportedFileTypesWithPeriods().join(", ");
        });

        self.supportedFileTypesFilter = ko.computed(function () {
            return self.getSupportedFileTypesWithPeriods().join(",");
        });

        self.attachmentHistoryList = ko.observableArray([]);

        self.jobApplicationId = ko.observable(0);
        self.jobId = ko.observable(0);

        self.addSupplementalAttachment = function(data, event) {
            self.attachments.push(
                new AttachedDocumentViewModel(
                    new AttachmentTypeViewModel(self.allowedAttachmentTypes()[0].id(), self.allowedAttachmentTypes()[0].name(), self.allowedAttachmentTypes()[0].required()),
                    false,
                    self.fileExtensionAllowed,
                    self.attachmentHistoryList,
                    self.supportedFileTypesDescription(),
                    self.attachments,
                    self.jobApplicationId(),
                    self.jobId(),
                    self.acceptedFileTypesSignature()));

            var $closestAttachmentTypeSection = $(event.target).closest('.onlineapp-section');

            if ($closestAttachmentTypeSection.length) {
                $closestAttachmentTypeSection
                    .find('.supplemental-attachments-upload-button').last().focus();
            }
        };

        self.deleteAttachment = function (attachment, event) {
            var container = $(event.target).closest('.box-container');
            var fileName = attachment.currentlyUploadingFile();
            var deleteAttachmentPromise = OnlineApp.Services.attachmentsService
                .deleteSupplementalAttachment(self.jobApplicationId(), attachment.uploadedFileId(), self.jobId());

            OnlineApp.Helpers.ajaxResponseValidator.ensurePromiseFailsOnInvalidData(deleteAttachmentPromise)
                .fail(function () {
                    toastr.warning("Error deleting attachment. Please try again.");
                });

            if (attachment.required()) {
                attachment.currentlyUploadingFile('');
                attachment.uploadedFileId('');
            } else {
                self.attachments.remove(attachment);
            }

            var nextButton = $(container).find('.attachment-upload-button');
            if (!nextButton.length) {
                nextButton = $('.attachments-tab .btn-app-add:visible').first();
            }
           
            gJobs.screenReadersService.setAriaLiveNotification(attachment.uploadedFile().name + ' removed successfully. ');
            $('#' + attachment.attachmentType.id()).focus();   
            $(document).trigger(Events.CommonEventsNames.SupplementalAttachmentDocDeleted);
            $(".popover").hide();
        };

        self.fromDataModel = function (data) {
            self.jobApplicationId(data.jobApplicationId);
            self.jobId(data.jobId);

            self.supportedFileTypes(
                $.map(data.allowedAttachmentExtensions, function (ext) {
                    return ext.toLowerCase();
                }));
            if (data.enableSupplementalAttachments == true) {
                self.allowedAttachmentTypes(
                    $.map(data.allowedAttachmentTypes, function (at) {
                        return new AttachmentTypeViewModel(at.attachmentTypeId, at.name, at.required);
                    }));
            }
            else {
                self.allowedAttachmentTypes(
                    $.map(data.attachmentTypes, function (at) {
                        return new AttachmentTypeViewModel(at.attachmentTypeId, at.name, at.hasBeenSentToTopResume);
                    }));
            }

            var requiredAttachmentTypes = $.grep(data.attachmentTypes, function (attType) {
                return attType.required;
            });

            //first cover required attachment types
            self.attachments($.map(requiredAttachmentTypes, function (rat) {
                return new AttachedDocumentViewModel(
                    new AttachmentTypeViewModel(rat.attachmentTypeId, rat.name, self.allowedAttachmentTypes()[0].required()),
                    true,
                    self.fileExtensionAllowed,
                    self.attachmentHistoryList,
                    self.supportedFileTypesDescription(),
                    self.attachments,
                    self.jobApplicationId(),
                    self.jobId(),
                    self.acceptedFileTypesSignature());
            }));

            var undisplayedAttachments = [];
            for (var i = 0; i < data.attachments.length; i++) {
                var attachment = window.utils.firstOrDefault(self.attachments(), function (att) {
                    return att.attachmentType.id() === data.attachments[i].attachmentTypeId && att.uploadedFileId() === '';
                });

                if (attachment) {
                    attachment.currentlyUploadingFile(data.attachments[i].clientFilename);
                    attachment.uploadedFileId(data.attachments[i].attachmentId);
                    attachment.fileUploadComplete(true);
                } else {
                    undisplayedAttachments.push(data.attachments[i]);
                }
            }

            //now go over all attachments received from the server that are not yet displayed
            for (i = 0; i < undisplayedAttachments.length; i++) {
                var attachmentType = window.utils.firstOrDefault(data.attachmentTypes, function (oat) {
                    return oat.attachmentTypeId === undisplayedAttachments[i].attachmentTypeId;
                });
                var attachment = new AttachedDocumentViewModel(
                    new AttachmentTypeViewModel(attachmentType.attachmentTypeId, attachmentType.name),
                    false,
                    self.fileExtensionAllowed,
                    self.attachmentHistoryList,
                    self.supportedFileTypesDescription(),
                    self.attachments,
                    self.jobApplicationId(),
                    self.jobId(),
                    self.acceptedFileTypesSignature());

                attachment.currentlyUploadingFile(undisplayedAttachments[i].clientFilename);
                attachment.uploadedFileId(undisplayedAttachments[i].attachmentId);
                attachment.fileUploadComplete(true);
                attachment.hasBeenSentToTopResume(undisplayedAttachments[i].hasBeenSentToTopResume);

                self.attachments.push(attachment);
            }

            self.attachmentHistoryList($.map(data.attachmentHistory, function (attHist) {
                return new AttachmentHistoryViewModel(attHist.clientFilename, attHist.attachmentHistoryEntryId);
            }));
        };

        self.preventDragAndDropOnEntireTab = function (e) {
            $(e).bind('dragenter drop dragover', function (e) { e.preventDefault(); });
        };

        self.allAttachmentsUploaded = ko.computed(function () {
            var attachmentMissing = false;
            for (var i = 0; i < self.attachments().length; i++) {
                if (self.attachments()[i].required() && self.attachments()[i].uploadedFileId() === '')
                    attachmentMissing = true;
            }

            return !attachmentMissing;
        });

        self.allSupplementalAttachmentsUploaded = function() {
            var attachmentMissing = false;

            if (self.allowedAttachmentTypes()[0] && self.allowedAttachmentTypes()[0].required()) {
                attachmentMissing = !self.attachments().some(function(att) {
                    return att.uploadedFileId() !== '';
                });
            }

            return !attachmentMissing;
        };

        self.shouldEnableAddSupplementalAttachmentButton = ko.computed(function () {
            var shouldEnableAddSupplementalAttachmentButton = !window.utils.exists(self.attachments(), function (att) {
                return !att.attachmentType.id() || (!att.required() && att.currentlyUploadingFile() === '');
            });
            shouldEnableAddSupplementalAttachmentButton = shouldEnableAddSupplementalAttachmentButton && self.allAttachmentsUploaded();
            return shouldEnableAddSupplementalAttachmentButton;
        });

        self.isInEditMode = ko.observable(false);

        self.validateChanges = function () {
            return self.allAttachmentsUploaded();
        };

        self.clearEmptySupplementaryAttachments = function () {
            for (var i = self.attachments().length - 1; i >= 0; i--) {
                var attachment = self.attachments()[i];
                if (!attachment.required() && attachment.currentlyUploadingFile() === '')
                    self.attachments.remove(attachment);
            }
        };

        self.clearSupplementaryAttachmentsWithErrors = function () {
            for (var i = self.attachments().length - 1; i >= 0; i--) {
                var attachment = self.attachments()[i];

                if (attachment.fileUploadError() !== '') {
                    if (!attachment.required()) {
                        self.attachments.remove(attachment);
                    } else {
                        attachment.currentlyUploadingFile('');
                    }
                }
            }
        };

        self.validate = ko.computed(function () {
            var isValid = self.allAttachmentsUploaded();

            self.hasError(!isValid);
            return isValid;
        });

        self.hideAllAttachmentHistoryMenus = hideAllAttachmentHistoryMenus;

        self.fileExtensionAllowed = function (fileName) {
            var extension = getFileExtension(fileName);
            if (extension === '' || extension === null)
                return false;

            return $.inArray(extension.toLowerCase(), self.supportedFileTypes()) != -1;
        };

        self.selectAttachmentTypeAfterRender = function () {
            OnlineApp.Helpers.layoutHelper.tabbing.updateIndices();
        };
    }

    function getFileExtension(fileName) {
        var re = /(?:\.([^.]+))?$/;
        return re.exec(fileName)[1];
    }

    function hideAllAttachmentHistoryMenus() {
        $('.attachments-history-popover.cloned').remove();
        $('.attachments-history-overlay').addClass('hide');

        announceRecentUploadsListState(true);

        gJobs.focusService.restoreFocus();
    }

    OnlineApp.Namespace.extend('OnlineApp.ViewModels.Test', {
        SupplementalAttachmentsViewModel: SupplementalAttachmentsViewModel
    });

    OnlineApp.Namespace.extend('OnlineApp.ViewModels', {
        SupplementalAttachmentsViewModel: SupplementalAttachmentsViewModel
    });

    $(function () {
        $(document).popover({
            selector: '[data-toggle=popover]',
            trigger: 'hover focus'            
        });
    });

    function announceRecentUploadsListState(collapsed) {
        var stateMessage = collapsed ? 'collapsed' : 'expanded';

        var $attachmentHistoryButton = $('.attachment-history-button');
        $attachmentHistoryButton
            .siblings('.ui-helper-hidden-accessible')
            .text('')
            .text('Recent uploads list is ' + stateMessage);
    }
})(window);;
(function (window, AgencyPages, undefined) {
    'use strict';

    var getMoreApplicationsAjaxUrl = '/applications/getMoreApplications',
        getApplicationsPartial = '/applications/applicationsPartial',
        getApplicationHistoryUrl = '/applications/applicationHistory';

    var manageBar = '#manage-bar',
        submittedAppLinksContainer = '#applications-container',
        incompleteAppLinksContainer = '#incomplete-applications-container',
        submittedAppLinksInnerContainer = '#applications-container .submitted-applications',
        incompleteAppLinksInnerContainer = '#incomplete-applications-container .incomplete-applications',
        applicationDom = '.application-container',
        applicationStepsContainer = '.application-steps',
        showStepsLink = '.ss-navigatedown',
        appRemoveButton = '.item-remove-button',
        applications = '#applications',
        applicationsCount = '.applications-count',
        canvassId = '',
        convictionQuestionnaireButton = '.answer-conviction-questionnaire-button';

    var $changeAppointmentLink,
        $scheduleAppointmentLink;

    var appHistoryFlyout;
    var convictionQuestionnaireFlyout;
    var supplementalAttachmentsFlyout;

    var releaseFocus;
    var isIncompleteTabOpened = false;

    var pageInfoService = namespace('AgencyPages').pageInfoService;
    var applicationsPageTabs = {
        submitted: {
            id: 1,
            urlPart: 'submitted',
            tabButtonSelector: '#applications-container-link'
        },
        incomplete: {
            id: 2,
            urlPart: 'incomplete',
            tabButtonSelector: '#incomplete-applications-container-link'
        }
    }

    namespace('agencyPages').applicationsPage = {
        currentAppPageNumber: 1,
        currentDraftPageNumber: 1,

        isReceivingData: false,

        scheduleExamViewModel: null,
        OfferViewModel: null,
        currentExamSubscription: null,

        getMoreApplications: function (agency, appType, page) {
            var self = this,
                isSubmittedApplications = appType === applicationsPageTabs.submitted.urlPart;

            if (isSubmittedApplications) {
                $('.submitted-applications').empty();
            } else {
                $('.incomplete-applications').empty();
            }

            var $spinner = $('.tab-pane .loading-spinner');
            $spinner.removeClass('hide');

            $(document).popover({
                selector: '[data-toggle=popover]',
                trigger: 'hover focus'
            });
            $(document).find('a[data-toggle="popover"]').popover();
            if (page) {
                if (isSubmittedApplications) {
                    agencyPages.applicationsPage.currentAppPageNumber = page;
                } else {
                    agencyPages.applicationsPage.currentDraftPageNumber = page;
                }
            }

            self.isReceivingData = true;

            var url = AgencyPages.router.routePrefix + '/' + agency + getMoreApplicationsAjaxUrl + '?appPageNumber=' + self.currentAppPageNumber +
                '&draftPageNumber=' + self.currentDraftPageNumber + '&isSubmittedApplications=' + isSubmittedApplications;

            if (pageInfoService.isDepartmentPage()) {
                url += '&department=' + pageInfoService.getCurrentDepartmentFolderName();
            }

            $.ajax({
                url: url,
                type: 'GET',
                cache: false
            })
                .done(function (data) {

                    if (isSubmittedApplications) {
                        $("#incomplete-applications-container-link").attr("tabindex", "-1");
                        $("#applications-container-link").attr("tabindex", "0");
                        $('.submitted-applications').replaceWith(data);
                        gJobs.screenReadersService
                            .setAriaLiveNotification($('#submitted-applications-items-count-message').text());
                        var submittedApplicationsCount = $(submittedAppLinksInnerContainer).data('app-count');
                        $(applicationsCount).text(submittedApplicationsCount + ' Submitted Applications found');
                        addPaginationLinkhandlers(submittedAppLinksContainer);
                        isIncompleteTabOpened = false;
                    } else {
                        $("#incomplete-applications-container-link").attr("tabindex", "0");
                        $("#applications-container-link").attr("tabindex", "-1");
                        $('.incomplete-applications').replaceWith(data);
                        gJobs.screenReadersService
                            .setAriaLiveNotification($('#incomplete-applications-items-count-message').text());
                        incompleteAppsLinkHandler(incompleteAppLinksInnerContainer);
                        addPaginationLinkhandlers(incompleteAppLinksContainer);
                        var $firstLink = $('.incomplete-applications a.application-link:first');
                        if (isIncompleteTabOpened) {
                            gJobs.screenReadersService.onceNotification({
                                $element: $firstLink,
                                message: 'Flyout has been closed. '
                            });
                        }
                        $firstLink.focus();
                        isIncompleteTabOpened = true;
                    }
                    $(document).popover({
                        selector: '[data-toggle=popover]',
                        trigger: 'hover focus'
                    });
                    $(document).find('a[data-toggle="popover"]').popover();
                    $('body').scrollTop(0);
                    $(document).trigger('resize');

                    attachHandlersForDynamicElements();
                })
                .fail(function () {
                    toastr.warning(Resources.NotificationMessages.ServerConnectionFailed);
                })
                .always(function () {
                    $spinner.addClass('hide');
                    self.isReceivingData = false;
                });
        },

        switchTab: function (tabName) {
            var newTabSelector = tabName === applicationsPageTabs.submitted.urlPart
                ? applicationsPageTabs.submitted.tabButtonSelector
                : applicationsPageTabs.incomplete.tabButtonSelector;

            $(manageBar).find(newTabSelector).trigger('click.tab.data-api');
        },

        goToPage: function (page) {
            updateApplicationsList(page);
        },

        changeOfferStatus: function (offerId, isOfferAccepted) {
            var $offer = $('.offer-container[data-offer-id="' + offerId + '"]');

            var $submittedOffer = $offer.find('.inactive-offer');

            var offerStatus = isOfferAccepted
                ? 'Offer Accepted'
                : 'Offer Rejected';
            $submittedOffer.find('.submitted-form-status').text(offerStatus);

            var answerDate = OnlineApp.Helpers.DateTimeFormatter.getShortDate(new Date());
            $submittedOffer.find('.submitted-date').text(answerDate);

            $offer.find('.active-offer').addClass('hide');
            $submittedOffer.removeClass('hide');
        },

        applicationsPageTabs: applicationsPageTabs,

        getApplicationsTabUrl: getApplicationsTabUrl
    };

    function getApplicationsTabUrl(tab) {
        var initialUrl = pageInfoService.getCurrentInitialUrl();

        return initialUrl + '/' + tab.urlPart;
    }

    function updateApplicationsList(page) {
        var appType = getApplicationType(),
            agency = AgencyPages.pageInfoService &&
                AgencyPages.pageInfoService.getCurrentAgencyFolderName();

        agencyPages.applicationsPage.getMoreApplications(agency, appType, page);
    }

    function confirmedRemoveIncompleteApplication(removeButton) {

        var $removeButton = $(removeButton);
        var $applicationContainer = $removeButton.closest(applicationDom);
        var applicationId = $removeButton.data('job-application-id');
        var currentActiveElement = document.activeElement;

        $removeButton.data('busy', true);

        $.ajax({
            type: 'DELETE',
            url: AgencyPages.routePrefix + '/Applications/RemoveIncompleteApplication',
            data: {
                jobApplicationId: applicationId
            }
        })
            .done(function () {
                gJobs.applicationMenu.decrementIncompleteApplicationsCount();
                var count = $(incompleteAppLinksInnerContainer).data('app-count') - 1;
                incompleteAppsLinkHandler(incompleteAppLinksInnerContainer, { incompleteApplicationsCount: count });

                var $incompleteApplicationsContainer = $(incompleteAppLinksContainer);
                var $removeAppNotification = $('<span class="hide-notification" tabindex="-1"></span>');
                $removeAppNotification.text('Application successfully removed. ' + count + ' Incomplete Applications found');
                gJobs.screenReadersService.setAriaLiveNotification('Application successfully removed.');
                $incompleteApplicationsContainer.prepend($removeAppNotification);
                $removeAppNotification.focus();

                $removeAppNotification.one('blur', function () {
                    $removeAppNotification.remove();
                });

                $applicationContainer.fadeOut(400, function () {
                    $(document).trigger('resize');

                    var upperBound = parseInt($('#upperIncompleteBound').text()),
                        lowerBound = parseInt($('#lowerIncompleteBound').text());

                    upperBound--;
                    if (upperBound < lowerBound) {
                        if (lowerBound > 1) {
                            $('.incomplete-applications .PagedList-skipToPrevious a').click();
                        } else {
                            agencyPages.applicationsPage.currentDraftPageNumber = 1;
                            updateApplicationsList();
                        }
                    } else {
                        $('#upperIncompleteBound').text(upperBound);
                    }

                });

                var focusableElements = Array.from(document.querySelectorAll('.application-link, .application-additional-link'));
                var nextIndex = focusableElements.indexOf(currentActiveElement) + 1;
                focusableElements[nextIndex].focus();
            })
            .fail(function () {
                toastr.warning(Resources.NotificationMessages.EncounteredProblem);
            })
            .always(function () {
                $removeButton.removeData('busy');
            });

    }

    function init() {
        $('.item-remove-button').popover();

        addManageBarLinksHandlers(manageBar);
        addPaginationLinkhandlers(submittedAppLinksContainer);
        addPaginationLinkhandlers(incompleteAppLinksContainer);

        initAppHistoryFlyout();
        initScheduleExamFlyout();
        initOfferFlyout();
        initCanvassFlyout();
        initConvictionQuestionnaireFlyout();
        initSupplementalAttachmentsFlyout();

        gJobs.pageTabNavigationService.adjustNavigationForFixedHeader($('body'));
    }

    function incompleteAppsLinkHandler(target, data) {
        var $target = $(target);
        var $applicationsCount = $(applicationsCount);
        var incompleteApplicationsCount;

        if (data) {
            incompleteApplicationsCount = data.incompleteApplicationsCount;
            $target.data('app-count', incompleteApplicationsCount);
        } else {
            incompleteApplicationsCount = $target.data('app-count');
        }

        $applicationsCount.text(incompleteApplicationsCount + ' Incomplete Applications found');
    }

    function addManageBarLinksHandlers(containerName) {
        $(containerName).find('#applications-container-link').on('click', function (event) {
            $("#applications-container-link").attr("tabindex", "0");
            $("#incomplete-applications-container-link").attr("tabindex", "-1");
            namespace('AgencyPages').router.navigate(getApplicationsTabUrl(applicationsPageTabs.submitted));
            event.stopPropagation();
            event.preventDefault();
        });

        $(containerName).find('#incomplete-applications-container-link').on('click', function (event) {
            $("#applications-container-link").attr("tabindex", "-1");
            $("#incomplete-applications-container-link").attr("tabindex", "0");
            namespace('AgencyPages').router.navigate(getApplicationsTabUrl(applicationsPageTabs.incomplete));
            event.stopPropagation();
            event.preventDefault();
        });
    }

    function addPaginationLinkhandlers(containerName) {
        $(containerName).find('.pagination li:not(.disabled):not(.active) > a').click(function (event) {
            event.preventDefault();
            var link = $(this).attr('href');
            namespace('AgencyPages').router.navigate(link, true);
        });

        gJobs.accessibilityHtmlTransformer.initPagerSkipButtons(containerName);
    }

    function addShowStepsLinkHandlers() {
        // Toggle the app steps of a card
        $(submittedAppLinksContainer)
            .find(showStepsLink)
            .off('click', showStepsLinkClickHandler)
            .on('click', showStepsLinkClickHandler);

        function showStepsLinkClickHandler() {
            var $applicationStepsContainer = $(this).closest(applicationDom).find(applicationStepsContainer);

            if ($applicationStepsContainer.hasClass('hide')) {
                $applicationStepsContainer.hide().toggleClass('hide').slideToggle();
            } else {
                $applicationStepsContainer.slideToggle(function () {
                    $(this).toggleClass('hide');
                });
            }

            return false;
        };
    }

    function addAppRemoveButtonHandlers() {
        // Bind click for Remove-button in incomplete applications tab
        $(incompleteAppLinksContainer)
            .find(appRemoveButton)
            .off('click', appRemoveClickHandler)
            .on('click', appRemoveClickHandler);

        function appRemoveClickHandler(e) {
            var self = this;
            if ($(self).data('busy')) {
                return;
            }

            $(document).trigger(
                Events.CommonEventsNames.ShowConfirmDialog,
                {
                    header: 'Are you sure?',
                    subHeader: 'If you remove this incomplete application you will lose all progress that you have made.',
                    confirmButtonText: 'Remove Application',
                    cancelButtonText: 'Cancel',
                    confirmClick: function () {
                        confirmedRemoveIncompleteApplication(self);
                    }
                }
            )

            e.preventDefault();
        }
    }

    function initOfferFlyout() {
        var offerViewModel = new OnlineApp.ViewModels.OfferViewModel();
        var $container = $('#offer-flyout-content');
        var $responsiveSignature = $('#responsive-signature');

        if ($container.length > 0) {
            ko.cleanNode($responsiveSignature[0]);
            ko.applyBindings(offerViewModel, $container.get(0));
            ko.applyBindings(offerViewModel.signatureViewModel, $responsiveSignature[0]);
        }

        agencyPages.applicationsPage.offerViewModel = offerViewModel;
    }

    function initCanvassFlyout() {
        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]);
        }

        agencyPages.canvassViewModel = canvassViewModel;
        
    }
    function setHeightScheduleAppoinemnt() {
        if (!(/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent))) {
            if ($('html').hasClass('device-phone')) {
                $(".flyout-window.active").style("margin-top", "100px");
            }
        }
    }
    function initScheduleExamFlyout() {
        var scheduleExamViewModel = new OnlineApp.ViewModels.ScheduleExamViewModel();
        var $container = $('#schedule-exam-flyout-content');
        var $title = $container.find('.flyout-tab-header .title');
        var $notificationContainer = $container.find('.loaded-notification');
        var lastElement = '';

        if ($container.length > 0) {
            ko.applyBindings(scheduleExamViewModel, $container.get(0));
        }

        agencyPages.applicationsPage.scheduleExamViewModel = scheduleExamViewModel;

        $(document).on(Events.CommonEventsNames.AppointmentFlyoutStateChanged, function (e, data) {

            var jobTitle = $container.find('.subtitle').text();
            var changeAppointmentFlyoutTitle = $title.data('change-appointment-text');
            var scheduleAppointmentFlyoutTitle = $title.data('schedule-appointment-text');
            var confirmAppointmentFlyoutTitle = 'Confirm Appointment';

            $(document).one(Events.CommonEventsNames.FlyoutClosing, function () {
                $(document).trigger(Events.CommonEventsNames.ScheduleFlyoutClosed);

                if (releaseFocus) {
                    releaseFocus();
                    releaseFocus = undefined;
                }
                lastElement.focus();

            });

            switch (data.state) {
                case 'scheduled':
                    {
                        changeFlyoutTitle(changeAppointmentFlyoutTitle);
                        gJobs.skipToContentService.showOnNextTab();

                        gJobs.screenReadersService.clearNotification($notificationContainer);
                        gJobs.screenReadersService.setAriaLiveNotification(jobTitle + ' ' + changeAppointmentFlyoutTitle + ' flyout has been opened');
                        gJobs.focusService.replaceLastElement($changeAppointmentLink);
                        setHeightScheduleAppoinemnt();
                        lastElement = $changeAppointmentLink;
                        break;
                    }
                case 'scheduling-loaded':
                    {
                        changeFlyoutTitle(scheduleAppointmentFlyoutTitle);
                        gJobs.screenReadersService.setNotification($notificationContainer, 'User successfully has unschedule appointment.', scheduleAppointmentFlyoutTitle + ' flyout has been opened', true);
                        gJobs.skipToContentService.showOnNextTab();
                        gJobs.focusService.replaceLastElement($scheduleAppointmentLink);
                        lastElement = $scheduleAppointmentLink;
                        break;
                    }
                case 'eligible':
                case 'scheduling':
                    {
                        if (data.isScheduledForExam === false) {
                            changeFlyoutTitle(scheduleAppointmentFlyoutTitle);
                            gJobs.screenReadersService.clearNotification($notificationContainer);
                            gJobs.screenReadersService.setAriaLiveNotification(jobTitle + ' ' + scheduleAppointmentFlyoutTitle + ' flyout has been opened');
                            gJobs.skipToContentService.showOnNextTab();
                            setHeightScheduleAppoinemnt();
                            lastElement = $scheduleAppointmentLink;
                        }
                        break;
                    }
                case 'confirmed':
                    {
                        changeFlyoutTitle(confirmAppointmentFlyoutTitle);
                        gJobs.focusService.replaceLastElement($changeAppointmentLink);
                        gJobs.skipToContentService.showOnNextTab();
                        lastElement = $changeAppointmentLink;
                        setTimeout(function () {
                            gJobs.screenReadersService.setAriaLiveNotification($container.find('.state-confirmed-message').text() + confirmAppointmentFlyoutTitle + ' flyout has been opened');
                        });
                        break;
                    }
            }
        });

        function changeFlyoutTitle(title) {
            $title.text(title);
            var $closeButton = $container.find('.flyout-tab-header .close-button');
            $closeButton.attr('aria-label', 'Close ' + title + ' flyout');
            $closeButton.find('.symbol-label').text('Close ' + title + ' flyout');
        }
    }

    // We don't use event bubbling (like .on('click', selector, function () {...}) ), because
    // adding click handler for the whole container forces JAWS to read
    // 'clickable' for non-clickable text in this container.
    function attachHandlersForDynamicElements() {
        addShowStepsLinkHandlers();
        addAppRemoveButtonHandlers();

        var scheduleExamFlyout = new ScheduleExamFlyout();
        var offerFlyout = new OfferFlyout();
        var canvassFlyout = new CanvassFlyout();

        AgencyPages.offerFlyout = offerFlyout;
        AgencyPages.canvassFlyout = canvassFlyout;

        var jobId, jobTitle, jobApplicationId, evaluationStep, evaluationStepId, applicationId;

        //submitted applications
        $(submittedAppLinksContainer)
            .find('a.application-link, .view-listing a')
            .off('click', submittedAppLinkClickHandler)
            .on('click', submittedAppLinkClickHandler);

        function submittedAppLinkClickHandler(event) {
            var jobTitle = $(this).data('title');
            namespace('AgencyPages').router.navigate($(this).attr('href'), true, null, null,
                {
                    title: jobTitle
                }, true);
            event.preventDefault();
        }

        $(submittedAppLinksContainer)
            .find('a.history-link')
            .off('click', historyLinkClickHandler)
            .on('click', historyLinkClickHandler);

        function historyLinkClickHandler(event) {
            var $this = $(this);
            var $link = $this.closest('.row').find('a.application-link');
            var jobApplicationId = $link.data('jobApplicationId');
            var jobTitle = $link.data('title');
            var flyoutContent = appHistoryFlyout.$wrapper.find('.flyout-content');
            var $openedNotification = appHistoryFlyout.$wrapper.find('.opened-notification');

            $openedNotification.empty();

            appHistoryFlyout.$wrapper.find('h2').text(jobTitle);

            var url = AgencyPages.routePrefix + getApplicationHistoryUrl + '?jobApplicationId=' + jobApplicationId;

            flyoutContent.empty();
            $.ajax({
                url: url,
                type: 'GET',
                cache: false
            }).done(function (data) {
                flyoutContent.html(data);
            });

            $openedNotification.text(jobTitle + ' history flyout has been opened');
            appHistoryFlyout.open($openedNotification);

            gJobs.skipToContentService.showOnNextTab();
            releaseFocus = gJobs.focusService.restrictFocus(appHistoryFlyout.$wrapper);
            $(document).one(Events.CommonEventsNames.FlyoutClosing, releaseFocusHandler);

            event.preventDefault();
        }

        $(submittedAppLinksContainer)
            .off('click', 'a.add-supplemental-attachment-button')
            .on('click', 'a.add-supplemental-attachment-button', function (event) {
                var $addSupplementalAttachmentButton = $(event.target).closest('.add-supplemental-attachment-button');
                var $addSupplementalAttachmentContainer = $(event.target).closest('.add-supplemental-attachment-container');
                var jobApplicationId = $addSupplementalAttachmentButton.data('application-id');
                var jobId = $addSupplementalAttachmentButton.data('job-id');
                var isView = $addSupplementalAttachmentButton.data('isview');
                if (isView) {
                    $('.supplemental-attachments-submit-button').hide();
                    $('.common-instructions-text').hide();
                    $('.title').text('View Attachments');
                    $('.supplemental-attachments-cancel-button').text('Close');
                    $('.supplemental-attachments-cancel-button').removeClass('cancel-button');
                    $('.supplemental-attachments-cancel-button').addClass('cancel-button-view');
                    $('.supplemental-attachments-cancel-button').attr("aria-label", "close");
                }
                else {
                    $('.supplemental-attachments-submit-button').show();
                    $('.common-instructions-text').show();
                    $('.title').text('Add Attachments');
                    $('.supplemental-attachments-cancel-button').text('Cancel');
                    $('.supplemental-attachments-cancel-button').addClass('cancel-button');
                    $('.supplemental-attachments-cancel-button').removeClass('cancel-button-view');
                    $('.supplemental-attachments-cancel-button').attr("aria-label", "cancel");
                }

                var flyoutContent = supplementalAttachmentsFlyout.$wrapper.find('.supplemental-attachments-types-container');
                var $openedNotification = supplementalAttachmentsFlyout.$wrapper.find('.opened-notification');

                $openedNotification.empty();
                flyoutContent.empty();

                var allSupplementalAttachmentsViewModels = [];

                var url = AgencyPages.routePrefix + '/applications/supplementalAttachmentsFlyoutContent' + '?jobApplicationId=' + jobApplicationId + '&isViewFlyout=' + isView;
                $.ajax({
                    url: url,
                    type: 'GET',
                    cache: false
                }).done(function (flyoutContentData) {
                    flyoutContent.html(flyoutContentData);

                    flyoutContent.find('.supplemental-attachment-type-bind-container').each(function () {
                        var attachmentTypeId = $(this).data('attachment-type-id');
                        var attachmentTypeName = $(this).data('attachment-type-name');
                        var attachmentTypeRequired = $(this).data('attachment-type-required');
                        var attachmentTypeExtensions = $(this).data('attachment-type-extensions')
                            .split(', ')
                            .map((ext) => ext.substring(1));

                        var supplementalAttachmentsDataModel = {
                            jobApplicationId: jobApplicationId,
                            jobId: jobId,
                            allowedAttachmentExtensions: attachmentTypeExtensions,
                            allowedAttachmentTypes: [
                                {
                                    "attachmentTypeId": attachmentTypeId,
                                    "name": attachmentTypeName,
                                    "required": attachmentTypeRequired
                                }
                            ],
                            attachmentTypes: [
                                {
                                    "attachmentTypeId": attachmentTypeId,
                                    "name": attachmentTypeName,
                                    "required": true
                                }
                            ],
                            attachmentHistory: [],
                            attachments: [],
                            enableSupplementalAttachments: true
                        };

                        var supplementalAttachmentsViewModel = new OnlineApp.ViewModels.SupplementalAttachmentsViewModel();
                        supplementalAttachmentsViewModel.fromDataModel(supplementalAttachmentsDataModel);

                        ko.applyBindings(supplementalAttachmentsViewModel, $(this).get(0));

                        allSupplementalAttachmentsViewModels.push(supplementalAttachmentsViewModel);
                    });
                });

                $openedNotification.text('Add supplemental attachments flyout was opened.');
                if (isView) {
                    gJobs.screenReadersService
                        .setAriaLiveNotification('View attachments flyout was opened.');
                } else {
                    gJobs.screenReadersService
                        .setAriaLiveNotification('Add supplemental attachments flyout was opened.');
                }
                supplementalAttachmentsFlyout.open($openedNotification);

                gJobs.skipToContentService.showOnNextTab();
                releaseFocus = gJobs.focusService.restrictFocus(supplementalAttachmentsFlyout.$wrapper);
                $(document).one(Events.CommonEventsNames.FlyoutClosing, releaseFocusHandler);

                $(document).off(Events.CommonEventsNames.SupplementalAttachmentDocAttached).on(Events.CommonEventsNames.SupplementalAttachmentDocAttached, function (event) {
                    var allRequiredDocsAttached = !allSupplementalAttachmentsViewModels.some(function (viewModel) {
                        if (viewModel.jobApplicationId() == jobApplicationId) {
                            return !viewModel.allSupplementalAttachmentsUploaded();
                        }
                    });

                    var noRequiredAndOneOptionalDocAttached = false;
                    var noRequiredDocs = !allSupplementalAttachmentsViewModels.some(function (viewModel) {
                        return viewModel.allowedAttachmentTypes()[0].required();
                    });
                    if (noRequiredDocs) {
                        noRequiredAndOneOptionalDocAttached = allSupplementalAttachmentsViewModels.some(function (viewModel) {
                            if (viewModel.jobApplicationId() == jobApplicationId) {
                                return viewModel.attachments().some(function (attachment) {
                                    return attachment.uploadedFileId() !== '';
                                });
                            }
                        });
                    }

                    if (allRequiredDocsAttached || noRequiredAndOneOptionalDocAttached) {
                        $('.supplemental-attachments-submit-button').attr("disabled", false);
                    } else {
                        $('.supplemental-attachments-submit-button').attr("disabled", true);
                    }
                });

                $(document).on(Events.CommonEventsNames.SupplementalAttachmentDocDeleted, function (event) {

                    var allRequiredDocsAttached = !allSupplementalAttachmentsViewModels.some(function (viewModel) {
                        if (viewModel.jobApplicationId() == jobApplicationId) {
                            return !viewModel.allSupplementalAttachmentsUploaded();
                        }


                    });

                    if (!allRequiredDocsAttached) {
                        $('.supplemental-attachments-submit-button').attr("disabled", true);
                    } else {
                        var noRequiredDocs = !allSupplementalAttachmentsViewModels.some(function (viewModel) {
                            return viewModel.allowedAttachmentTypes()[0].required();
                        });
                        if (noRequiredDocs) {
                            var noRequiredAndOneOptionalDocAttached = allSupplementalAttachmentsViewModels.some(function (viewModel) {
                                if (viewModel.jobApplicationId() == jobApplicationId) {
                                    return viewModel.attachments().some(function (attachment) {
                                        return attachment.uploadedFileId() !== '';
                                    });
                                }
                            });

                            if (noRequiredAndOneOptionalDocAttached) {
                                $('.supplemental-attachments-submit-button').attr("disabled", false);
                            } else {
                                $('.supplemental-attachments-submit-button').attr("disabled", true);
                            }
                        }
                    }
                });

                $('.supplemental-attachments-cancel-button').one('click', function (event) {
                    if (isView) {
                        gJobs.screenReadersService
                            .setAriaLiveNotification('View attachments flyout was closed.');
                    } else {
                        gJobs.screenReadersService
                            .setAriaLiveNotification('Add supplemental attachments flyout was closed.');
                    }
                    supplementalAttachmentsFlyout.close();
                    $('.supplemental-attachments-submit-button').attr("disabled", true);
                });
                $('.supplemental-attachments-submit-button').off('click').on('click', function (event) {
                    $('.supplemental-attachments-submit-button').attr('disabled', 'true');
                    $('.supplemental-attachments-submit-button').attr('background-color', '#d8d8d8');

                    $.ajax({
                        type: 'POST',
                        url: '/api/attachments/performRedactionForSupplementalAttachment',
                        data: {
                            jobId: jobId,
                            jobApplicationId: jobApplicationId
                        }
                    }).done(function (data) {


                        var notAttachedDocExists = allSupplementalAttachmentsViewModels.some(function (viewModel) {
                            return viewModel.attachments().some(function (attachment) {
                                return attachment.uploadedFileId() === '';
                            });
                        });
                        if (!notAttachedDocExists) $addSupplementalAttachmentContainer.hide();
                        allSupplementalAttachmentsViewModels.forEach(function (viewModel) {
                            viewModel.attachments().forEach(function (attachment) {
                                if (attachment.uploadedFileId() !== '') {
                                    attachment.uploadedFileId('');
                                }
                            });
                        });
                        gJobs.screenReadersService
                            .setAriaLiveNotification('Attachment submitted and add supplemental attachments flyout was closed.');
                        supplementalAttachmentsFlyout.close({ preventTriggerCloseEvent: true });
                        $('.supplemental-attachments-submit-button').attr("disabled", true);
                        $('#addSupplementalAttachments[data-attachment-application-id="' + data.jobApplicationId + '"]').css("display", "block");
                        var SUPPLEMENTAL_ATTACHMENTS_VIEW_TEMPLATE = '';
                        var $supplementalAttachmentsFormLink = '';
                        if (!data.isAllDocumentsNotSubmitted) {
                            SUPPLEMENTAL_ATTACHMENTS_VIEW_TEMPLATE =
                                '<span class="submitted-form-status">Attachment(s) Submitted</span>' +
                                '<div class="submitted-date"></div>' +
                                '<a id="' + data.jobApplicationId + '" class="add-supplemental-attachment-button"' +
                                'href="#"' +
                                'aria-label="View attachment for ' + data.jobTitle + ' . Link will be opened in a flyout."' +
                                'data-application-id="' + data.jobApplicationId + '"' +
                                'data-job-id="' + data.jobId + '" data-isview="true">' +
                                '<img class="supplemental-attachment-action-image" src="/Content/Images/AddAttachmentSupplementalAttachments.png" alt="" aria-hidden="true" />' +
                                '<span class="supplemental-attachment-action-link">View Attachment</span>' +
                                '</a>';

                            $supplementalAttachmentsFormLink = $('#addSupplementalAttachments[data-attachment-application-id="' + data.jobApplicationId + '"]');
                            $supplementalAttachmentsFormLink.html(SUPPLEMENTAL_ATTACHMENTS_VIEW_TEMPLATE);
                            $supplementalAttachmentsFormLink.find('.submitted-date').text(data.lastAttachmentSubmittedDate);
                            $supplementalAttachmentsFormLink.css("display", "block");
                        }
                        else {
                            SUPPLEMENTAL_ATTACHMENTS_VIEW_TEMPLATE =
                                '<span class="submitted-form-status">Attachment(s) Submitted</span>' +
                                '<div class="submitted-date"></div>';
                            $supplementalAttachmentsFormLink = $('#submittedForm[data-attachment-application-id="' + data.jobApplicationId + '"]');
                            $supplementalAttachmentsFormLink.html(SUPPLEMENTAL_ATTACHMENTS_VIEW_TEMPLATE);
                            $supplementalAttachmentsFormLink.find('.submitted-date').text(data.lastAttachmentSubmittedDate);
                            $('#addSupplementalAttachments[data-attachment-application-id="' + data.jobApplicationId + '"]').find('#add-supplemental-attachment-due-date').text('Due ' + data.dueDate);

                        }
                        $('.supplemental-attachments-submit-button').attr('disabled', 'true');
                        $('.supplemental-attachments-submit-button').attr('background-color', '#6fa003');
                    });

                });

                $(window).on('unload', function () {
                    allSupplementalAttachmentsViewModels.forEach(function (viewModel) {
                        viewModel.attachments().forEach(function (attachment) {
                            if (attachment.uploadedFileId() !== '') {
                                OnlineApp.Services.attachmentsService
                                    .deleteSupplementalAttachment(
                                        viewModel.jobApplicationId(),
                                        attachment.uploadedFileId(),
                                        viewModel.jobId());
                            }
                        });
                    });
                });

                $(document).one(Events.CommonEventsNames.FlyoutClosing, function (event) {
                    if ($('#supplemental-attachments-flyout-content').is(":visible")) {
                        allSupplementalAttachmentsViewModels.forEach(function (viewModel) {
                            viewModel.attachments().forEach(function (attachment) {
                                if (attachment.uploadedFileId() !== '') {
                                    OnlineApp.Services.attachmentsService
                                        .deleteSupplementalAttachment(
                                            viewModel.jobApplicationId(),
                                            attachment.uploadedFileId(),
                                            viewModel.jobId());
                                }
                            });
                        });
                    }
                });

                $('.supplemental-attachments-submit-button').attr("disabled", true);
                event.preventDefault();
            });

        $(submittedAppLinksContainer)
            .find('.offer-link')
            .off('click', viewOfferLinkClickHandler)
            .on('click', viewOfferLinkClickHandler);

        function viewOfferLinkClickHandler(event) {
            var $this = $(this);
            var $link = $this.closest('.offer-container');
            var offerId = $link.data('offerId');
            var $openedNotification = offerFlyout.$wrapper.find('.opened-notification');

            $openedNotification.empty();

            namespace('AgencyPages').router.navigate(pageInfoService.getCurrentAgencyHomePath() +
                '/applications/submitted/offer/' + offerId, true, true, null, null, true);

            event.preventDefault();
        }

        // canvass form click
        $(submittedAppLinksContainer)
            .off('click', '.canvass-link', viewCanvassLinkClickHandler)
            .on('click', '.canvass-link', viewCanvassLinkClickHandler);

        function viewCanvassLinkClickHandler(event) {
            var $this = $(this);
            var $link = $this.closest('.canvass-container');
            var canvassFormId = $link.data('canvassId');
            var $openedNotification = offerFlyout.$wrapper.find('.opened-notification');
            canvassId = canvassFormId;

            $openedNotification.empty();

            namespace('AgencyPages').router.navigate(pageInfoService.getCurrentAgencyHomePath() +
                '/applications/submitted/canvass/' + canvassFormId, true, true, null, null, true);
            $('#skip-to-content-button').focus();
            $('#skip-to-content-button').blur();
            $('.canvass-flyout')
                .off('touchstart click', '.close-button')
                .on('touchstart click', '.close-button', function (event) {
                    $('#canvass-link-' + canvassId).focus()
                });
            $('.canvass-flyout-overlay')
                .off('click')
                .on('click', function () {
                    $('.close-button').click();
                });
        }



        //schedule exam click
        $(submittedAppLinksContainer)
            .find('a.schedule-exam-button')
            .off('click', scheduleExamClickHandler)
            .on('click', scheduleExamClickHandler);

        function scheduleExamClickHandler(event) {
            var $this = $(this).closest('.exam-date');
            jobTitle = $this.data('entity-title');
            applicationId = $this.data('application-id');
            evaluationStep = $this.data('evaluation-step');
            evaluationStepId = $this.data('evaluation-step-id');

            var examData = {
                applicationId: applicationId,
                evaluationStep: evaluationStep,
                evaluationStepId: evaluationStepId,
                isScheduledForExam: !$this.find('.update-exam').hasClass('hide')
            };

            $changeAppointmentLink = $this.find('a.application-additional-link');
            $scheduleAppointmentLink = $this.find('a.schedule-exam');

            scheduleExamFlyout.showSchedule($this, jobTitle, examData);

            releaseFocus = gJobs.focusService.restrictFocus(scheduleExamFlyout.$wrapper);
            $(document).one(Events.CommonEventsNames.FlyoutClosing, releaseFocusHandler);

            $('#skip-to-content-button').focus();
            $('#skip-to-content-button').blur();
        }

        //incomplete applications
        $(incompleteAppLinksContainer)
            .find('a.application-link')
            .off('click', incompleteAppClickHandler)
            .on('click', incompleteAppClickHandler);

        function incompleteAppClickHandler(event) {
            var $this = $(this);
            var pageType = pageInfoService.getCurrentPageType().type;

            var jobId = $(this).data('jobId');
            var jobTitle = $this.text();

            namespace('AgencyPages').router.navigate($this.attr('href') + '/apply?pagetype=' + pageType, true, false, null, {
                id: jobId,
                title: jobTitle,
                tab: 2
            });

            event.preventDefault();
        }
    }

    function initApplicationsPage() {
        init();

        var incompleteAppFlyout = new AgencyPages.JobFlyout({
            content: $('#incomplete-application-flyout-content')
        }),
            submittedAppFlyout = new SubmittedApplicationFlyout();

        namespace('AgencyPages').incompleteAppFlyout = incompleteAppFlyout;
        namespace('AgencyPages').submittedAppFlyout = submittedAppFlyout;

        attachHandlersForDynamicElements();

        applyQueryParametres();

        var applicationType = getApplicationType();
        var applicationCount = getApplicationCount();

        let tablists = document.querySelectorAll('[role=tablist]');
        for (let i = 0; i < tablists.length; i++) {
            new TabsManual(tablists[i]);
        }

        // TODO: separate into function (type, count), make it only point where label is changed
        var $applicationsCount = $(applicationsCount);
        if (applicationType === "submitted") {
            $("#incomplete-applications-container-link").attr("tabindex", "-1");
            $("#applications-container-link").attr("tabindex", "0");
            $applicationsCount.text(applicationCount + ' Submitted Applications found');
        } else {
            $("#incomplete-applications-container-link").attr("tabindex", "0");
            $("#applications-container-link").attr("tabindex", "-1");
            $applicationsCount.text(applicationCount + ' Incomplete Applications found');
        }
        // todo: schedule exam design, toggle ss-navigatedown for submitted app cards
    }

    function restoreJobFlyout(params) {
        var jobUrl = '';
        var jobId = '';
        var currentUrlParts = pageInfoService.getCurrentUrlParts();
        var isDepartmentPage = pageInfoService.isDepartmentPage();
        var isJobDetails = false;
        var paramsCopy = {};

        if (params.jobId && params.jobName) {
            jobId = params.jobId;
            jobUrl = '/' + currentUrlParts[1] + '/' + currentUrlParts[2];

            if (isDepartmentPage) {
                jobUrl += '/' + currentUrlParts[3];
            }

            jobUrl += '/jobs/' + params.jobId + '/' + params.jobName + '/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.
            namespace('AgencyPages').router.navigate(jobUrl + '?' + url.buildget(paramsCopy), true, true, null, {
                jobTitle: $('[data-job-id="' + jobId + '"]').text() || ''
            });

            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, true, null, null, true);
                });
            }
        }
    }

    function applyQueryParametres() {
        var currentTab = getApplicationType();
        var params = url.get(window.location.search.slice(1), { array: true });
        if (currentTab === applicationsPageTabs.incomplete.urlPart && Object.keys(params).length) {
            restoreJobFlyout(params);
        } else if (namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('submittedApplicationRoute') ||
            namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('submittedApplicationDepartmentRoute') ||
            namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('offerLetterRoute') ||
            namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('offerLetterDepartmentRoute') ||
            namespace('AgencyPages').router.isCurrentUrlMatchedToRoute('canvassFormRoute')) {

            History.Adapter.trigger(window, 'statechange');
        }
    }

    function initAppHistoryFlyout() {
        appHistoryFlyout = new AgencyPages.Flyout({
            showOverlay: true,
            disableBodyScroll: true,
            container: $('body'),
            content: $('#app-history-flyout-content'),
            closeButton: true,
            wrapperClass: 'app-history-flyout',
            closeButtonAriaLabel: 'Close application history flyout'
        });
    }

    function initSupplementalAttachmentsFlyout() {
        supplementalAttachmentsFlyout = new AgencyPages.Flyout({
            showOverlay: true,
            disableBodyScroll: true,
            container: $('body'),
            content: $('#supplemental-attachments-flyout-content'),
            closeButton: false,
            wrapperClass: 'supplemental-attachments-flyout',
            closeButtonAriaLabel: 'Close supplemental attachments flyout'
        });
    }

    function initConvictionQuestionnaireFlyout() {
        convictionQuestionnaireFlyout = new AgencyPages.Flyout({
            showOverlay: true,
            disableBodyScroll: true,
            container: $('body'),
            content: $('#conviction-quetionnaire-flyout-content'),
            closeButton: true,
            wrapperClass: OnlineApp.FlyoutWrapperClasses.convictionQuestionnaire.className
        });

        var convictionQuestionnairePage = $('#conviction-quetionnaire-flyout-content').get(0);

        $(submittedAppLinksContainer)
            .find(convictionQuestionnaireButton)
            .off('click', convictionQuestionnaireClickHandler)
            .on('click', convictionQuestionnaireClickHandler);

        function convictionQuestionnaireClickHandler() {
            var $closeButton = convictionQuestionnaireFlyout.$wrapper.find('button.close-button');

            var $convictionQuestionnaireButton = $(this);
            var $this = $(this).closest('.conviction-questionnaire');
            var jobTitle = $this.data('entity-title');
            convictionQuestionnaireFlyout.$wrapper.find('.subtitle').text(jobTitle);
            var applicationId = $this.data('application-id');
            var jobId = $this.data('job-id');

            var $spinner = $('.conviction-questionnaire-page .loading-spinner img');

            var convictionQuestionnaireVMConfig = {
                applicationId: applicationId,
                jobId: jobId,
                applicationTitle: jobTitle
            };

            convictionQuestionnaireVMConfig.successfulSaveCallback = function () {
                $convictionQuestionnaireButton.hide();
                convictionQuestionnaireFlyout.close();
                return;
            };

            $spinner.show();

            window.convictionQuestionnaire =
                new OnlineApp.ViewModels.Questions.ConvictionQuestionnaireViewModel(convictionQuestionnaireVMConfig);

            if (ko.dataFor(convictionQuestionnairePage)) {
                $(convictionQuestionnairePage).find('.conviction-questions').empty();
                ko.cleanNode(convictionQuestionnairePage);
                $closeButton.on('touchstart click', convictionQuestionnaireFlyout.close);
            }

            convictionQuestionnaire.load(true).done(function (data) {
                if (!data) {
                    convictionQuestionnaireFlyout.close();
                    return;
                }

                convictionQuestionnaire.isDeadlinePassed(data.isDeadlinePassed);

                $spinner.hide();
                ko.applyBindings(convictionQuestionnaire, convictionQuestionnairePage);
                convictionQuestionnaire.beginEdit();
            }).fail(function () {
                toastr.warning('We\'ve encountered a problem during loading of Conviction Questionnaire');
                convictionQuestionnaireFlyout.close();
                return;
            });

            var $focusTarget = $closeButton;

            gJobs.screenReadersService.onceNotification({
                $element: $focusTarget,
                message: 'Conviction questionnaire flyout is opened.'
            });

            convictionQuestionnaireFlyout.open($focusTarget);

            releaseFocus = gJobs.focusService.restrictFocus(convictionQuestionnaireFlyout.$wrapper);
            $(document).one(Events.CommonEventsNames.FlyoutClosing, releaseFocusHandler);
        }
    }

    function getApplicationType() {
        return $(".applications-panel .tab-buttons li.active a").data('app-type');
    }

    function getApplicationCount() {
        return +$('#applications-container:visible .submitted-applications,' +
            ' #incomplete-applications-container:visible .incomplete-applications').data('app-count') || 0;
    }

    window.getApplicationType = getApplicationType;

    function releaseFocusHandler() {
        if (releaseFocus) {
            releaseFocus();
            releaseFocus = undefined;
        }
    }

    $(function () {
        $(document).popover({
            selector: '[data-toggle=popover]',
            trigger: 'hover focus'
        });
        $(document).find('a[data-toggle="popover"]').popover();

        OnlineApp.Services.authenticationService.isLoggedIn()
            .done(function (isLoggedIn) {
                if (isLoggedIn) {
                    initApplicationsPage();
                }

                $(document).trigger('layoutUpdated');
            });

        if (gJobs.browserDetector.isMobileBrowser()) {
            $('html').addClass('mobile-only');
        }

        var eventNames = 'loginEvent registerEvent';
        $(document).on(eventNames,
            function () {
                $(applications).removeClass('hide');

                var employerFolderName = AgencyPages.pageInfoService &&
                    AgencyPages.pageInfoService.getCurrentAgencyFolderName();
                var url = AgencyPages.router.routePrefix + '/' + employerFolderName + getApplicationsPartial;

                if (pageInfoService.isDepartmentPage()) {
                    url += '?department=' + pageInfoService.getCurrentDepartmentFolderName();
                }

                var isCacheEnabled = gJobs.browserDetector.isIE() !== 10;

                $.ajax({
                    url: url,
                    type: 'GET',
                    dataType: 'html',
                    cache: isCacheEnabled
                })
                    .done(function (data) {
                        $(applications).html(data);
                        initApplicationsPage();
                        $(document).trigger('layoutUpdated');
                    })
                    .fail(function () {
                        toastr.warning(Resources.NotificationMessages.ServerConnectionFailed);
                    })
                    .complete(function () {
                        self.isReceivingData = false;
                    });
            });

        $(document).on(OnlineApp.Events.CommonEventsNames.ApplicationSubmit, function () {
            var $submittedApplications = $(submittedAppLinksInnerContainer);
            var $incompleteApplications = $(incompleteAppLinksInnerContainer);

            $submittedApplications.data('app-count', +$submittedApplications.data('app-count') + 1);
            $incompleteApplications.data('app-count', +$incompleteApplications.data('app-count') - 1);
        });
    });
})(window, AgencyPages);;
