(function () {
    var lodash;

    angular
        .module('lodash', [])
        .factory('_', ["$window", function ($window) {
            //We use the approach below primarily because this factory will 
            //be run multiple times when the unit tests are run.  If we rely 
            //solely on $windows._ then the second time this runs it will 
            //fail since the first through we delete $windows._.
            lodash = lodash || $window._;
            delete ($window._);
            return lodash;
        } ]);

    angular.module('eyemed.shared', [
        'ui.bootstrap',
        'ui.router',
        'lodash',
        'ngAnimate'
    ]);
} ());
(function (module) {
    'use strict';

    module
        .provider('formGroupValidationConfig', formGroupValidationConfig)
        .directive("gbsFormGroupValidation", [
            'formGroupValidationConfig',
            '$interpolate', 
            formGroupValidation
        ]);

    function formGroupValidation(formGroupValidationConfig, $interpolate) {
        return {
            scope: true,
            restrict: "A",
            require: "^form",
            compile: compile
        };

        function compile(elt, attrs) {
            var ngMessagesElt = angular.element(elt[0].querySelector('[ng-messages]'));

            if (ngMessagesElt) {
                ngMessagesElt.attr("for", "getErrors()");
                ngMessagesElt.attr("ng-if", "showErrors()");
            }
            return link;
        }

        function link(scope, elt, attrs, form) {
            var
                options = scope.$eval(attrs.gbsFormGroupValidation) || {},
                defaultOptions = formGroupValidationConfig,
                effectiveOptions = angular.extend({}, defaultOptions, options),
                triggered = false,
                inputElt = angular.element(elt[0].querySelector('.form-control[name]')),
                inputName = $interpolate(inputElt.attr('name') || '')(scope);

            if (!inputName) {
                throw "gbs-form-group-validation element has no child input elements with a 'name' attribute and a 'form-control' class";
            }

            scope.getErrors = function () {
                return form[inputName].$error;
            };

            scope.showErrors = function () {
                return form[inputName].$invalid && (form[inputName].$touched || form.$submitted);
            };

            scope.$watch("showErrors()", function (invalid) {
                elt.toggleClass('has-error', invalid);
            });

        }
    }

    function formGroupValidationConfig() {
        var _triggerEvent = 'blur';
        this.setTriggerEvent = function (triggerEvent) {
            return _triggerEvent = triggerEvent;
        };
        this.$get = function () {
            return {
                triggerEvent: _triggerEvent
            };
        };
    }

})(angular.module("eyemed.shared"));
(function (module) {
    'use strict';

    module.controller("messageBoxController", ["title", "message", "$uibModalInstance", messageBoxController]);

    function messageBoxController(title, message, $uibModalInstance) {
        var vm = this;
        vm.title = title;
        vm.message = message;
        vm.close = function () { $uibModalInstance.close() };
    }
})(angular.module("eyemed.shared"));
(function (module) {
    'use strict';

    module.factory("messageBox", ["$uibModal", messageBox]);

    function messageBox($uibModal) {
        var me = {};

        me.open = open;

        return me;

        function open(message, title) {
            $uibModal.open({
                animation: true,
                templateUrl: "Areas/Shared/messageBox.template.html",
                controller: "messageBoxController",
                controllerAs: "vm",
                size: "sm",
                resolve: {
                    title: function () { return title; },
                    message: function () { return message; }
                }
            });
        }
    }
})(angular.module("eyemed.shared"));
(function (module) {

    // this forced the fa-spinner to hide immediately when it has an ng-if or ng-hide...
    // otherwise it waits for the animation to finish before hiding...making you think a process is taking longer.
    module.config(['$animateProvider', function ($animateProvider) {
        $animateProvider.classNameFilter(/^((?!(fa-spinner)).)*$/);
    }]);

})(angular.module("eyemed.shared"));
(function (module) {
    'use strict';

    module.directive("validateTruthy", function () {

        // requires an isloated model
        return {
            // restrict to an attribute type.
            restrict: 'A',
            // element must have ng-model attribute.
            require: 'ngModel',
            link: function (scope, ele, attrs, ctrl) {

                
                scope.$watch(attrs.ngModel, function (value) {
                    var valid = attrs.validateTruthy == "true";
                    ctrl.$setValidity("notTruthy", valid);
                    if (valid === true) ctrl.$setTouched();
                });
            }
        }
    });
})(angular.module("eyemed.shared"));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var StepNames = /** @class */ (function () {
                        function StepNames() {
                        }
                        StepNames.overview = "Overview";
                        StepNames.disclosureOfOwnershipFormRequirement = "DisclosureOfOwnershipFormRequirement";
                        StepNames.disclosureOfOwnershipFormQuestion = "DisclosureOfOwnershipFormQuestion";
                        StepNames.disclosureOfOwnershipFormPortalLink = "DisclosureOfOwnershipFormPortalLink";
                        StepNames.disclosureOfOwnershipFormSkipInfo = "DisclosureOfOwnershipFormSkipInfo";
                        StepNames.salesAndUseTaxResaleCertificateQuestion = "SalesAndUseTaxResaleCertificateQuestion";
                        StepNames.salesAndUseTaxResaleCertificateForm = "SalesAndUseTaxResaleCertificateForm";
                        StepNames.salesAndUseTaxResaleCertificateSkipInfo = "SalesAndUseTaxResaleCertificateSkipInfo";
                        StepNames.onlineClaimsUserIDRequestFormQuestion = "OnlineClaimsUserIDRequestFormQuestion";
                        StepNames.onlineClaimsUserIDRequestFormPortalLink = "OnlineClaimsUserIDRequestFormPortalLink";
                        StepNames.onlineClaimsUserIDRequestFormSkipInfo = "OnlineClaimsUserIDRequestFormSkipInfo";
                        StepNames.directDepositFormQuestion = "DirectDepositFormQuestion";
                        StepNames.directDepositFormPortalLink = "DirectDepositFormPortalLink";
                        StepNames.directDepositFormSkipInfo = "DirectDepositFormSkipInfo";
                        StepNames.review = "Review";
                        StepNames.signature = "Signature";
                        return StepNames;
                    }());
                    Steps.StepNames = StepNames;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var StepLabels = /** @class */ (function () {
                        function StepLabels() {
                        }
                        StepLabels.overview = "Overview";
                        StepLabels.disclosureOfOwnership = "Disclosure of Ownership";
                        StepLabels.salesAndUseTaxResaleCertificate = "Sales and Use Tax Resale Certificate";
                        StepLabels.onlineClaimsUserIDRequest = "Online Claims User ID Request";
                        StepLabels.directDeposit = "Direct Deposit";
                        StepLabels.review = "Review";
                        StepLabels.signature = "Signature";
                        return StepLabels;
                    }());
                    Steps.StepLabels = StepLabels;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
;
;
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var ResponseController = /** @class */ (function () {
                    function ResponseController(userSession, baseUrl, responseType, $state, $uibModalInstance, $http, $log, $q) {
                        this.userSession = userSession;
                        this.baseUrl = baseUrl;
                        this.responseType = responseType;
                        this.$state = $state;
                        this.$uibModalInstance = $uibModalInstance;
                        this.$http = $http;
                        this.$log = $log;
                        this.$q = $q;
                        this.responseTypeConfigs = {
                            accept: {
                                label: "Accept Contract Process",
                                completeUrl: "/Contracts/Provider-Response/api/Contract/{contractId}/Acceptance",
                                completeActionLabel: "I Accept",
                                onCompleteStateName: "acceptedMessage"
                            },
                            decline: {
                                label: "Decline Contract",
                                completeUrl: "/Contracts/Provider-Response/api/Contract/{contractId}/Rejection",
                                completeActionLabel: "I Decline",
                                onCompleteStateName: "declinedMessage"
                            }
                        };
                        this.responseType = (responseType === "accept") ? "accept" : "decline";
                        this.activeResponseTypeConfig = this.responseTypeConfigs[this.responseType];
                        this.contract = userSession.contract;
                        this.isWorking = false;
                        this.response = {
                            id: this.contract.id,
                            type: responseType,
                            firstName: "",
                            lastName: "",
                            title: "",
                            phone: "",
                            email: "",
                            feeScheduleOption: "",
                            ipAddressEncrypted: "",
                            medicaidNo: "",
                            declineReason: ""
                        };
                        userSession.loadContract();
                    }
                    Object.defineProperty(ResponseController.prototype, "label", {
                        get: function () {
                            return this.activeResponseTypeConfig.label;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    Object.defineProperty(ResponseController.prototype, "canRespond", {
                        get: function () {
                            var canAccept = this.contract.canAccept ||
                                this.contract.canAcceptStatus !== "VIEW_REQUIRED";
                            return canAccept && this.contract.canDecline;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    Object.defineProperty(ResponseController.prototype, "formHasErrors", {
                        get: function () {
                            return this.formController.$invalid && this.formController.$submitted;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    ResponseController.prototype.setupWizard = function (wizard) {
                        this.wizardController = new Response.ResponseWizardController(wizard, this.userSession, this.response, this.activeResponseTypeConfig);
                    };
                    ResponseController.prototype.setSubmitAction = function (action) {
                        this.submitAction = action;
                    };
                    ResponseController.prototype.tryExecuteSubmitAction = function () {
                        if (!this.formController.$valid)
                            return;
                        if (!this.submitAction)
                            throw new Error("A submit action has not been set.");
                        this.executeAction(this.submitAction);
                    };
                    ResponseController.prototype.executeAction = function (action) {
                        var _this = this;
                        this.isWorking = true;
                        this.message = "";
                        return this.$q.when(action.execute())
                            .then(function (newStepName) {
                            if (newStepName)
                                _this.formController.$setPristine();
                            return _this.userSession
                                .loadContract()
                                .then(function () { return newStepName; });
                        })
                            .finally(function () { return _this.isWorking = false; });
                    };
                    ResponseController.prototype.responseComplete = function () {
                        this.$uibModalInstance.close(this.activeResponseTypeConfig.onCompleteStateName);
                    };
                    ResponseController.prototype.cancel = function () {
                        this.$uibModalInstance.dismiss("cancel");
                    };
                    ResponseController.open = function (modal, responseType) {
                        var modalInstance = modal.open({
                            animation: true,
                            backdrop: "static",
                            controller: ResponseController,
                            controllerAs: "vm",
                            templateUrl: "Areas/Contracts/ProviderResponse/Response/response.template.html",
                            resolve: {
                                responseType: function () { return responseType; },
                            }
                        });
                        return modalInstance.result;
                    };
                    ResponseController.$inject = [
                        "userSession",
                        "baseUrl",
                        "responseType",
                        "$state",
                        "$uibModalInstance",
                        "$http",
                        "$log",
                        "$q"
                    ];
                    return ResponseController;
                }());
                Response.ResponseController = ResponseController;
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var ResponseWizardController = /** @class */ (function () {
                    function ResponseWizardController(wizard, userSession, response, responseTypeConfig) {
                        var _this = this;
                        this.wizard = wizard;
                        this.userSession = userSession;
                        this.response = response;
                        this.responseTypeConfig = responseTypeConfig;
                        this.stepConfigs = [];
                        var firstStepName = response.type === "decline"
                            ? Response.Steps.StepNames.signature
                            : userSession.contract.hasForms
                                ? Response.Steps.StepNames.overview
                                : Response.Steps.StepNames.signature;
                        wizard.createStepContext = function () { return ({
                            response: _this.response,
                            responseTypeConfig: responseTypeConfig,
                            contract: _this.userSession.contract
                        }); };
                        wizard.createStepTemplateUrl =
                            function (stepName) { return "Areas/Contracts/ProviderResponse/Response/Steps/" + stepName + ".html"; };
                        wizard.tryMapNextStepName = function (step, nextStepName) { return _this.tryMapNextStepName(step, nextStepName); };
                        wizard.canMovePreviousStep = function (step, nextStepName) { return _this.canMovePreviousStep(step, nextStepName); };
                        this.addStepConfig(Response.Steps.OverviewStep);
                        this.addStepConfig(Response.Steps.SalesAndUseTaxResaleCertificateQuestionStep, ProviderResponse.FormNames.salesAndUseTaxResaleCertificateFormName);
                        this.addStepConfig(Response.Steps.SalesAndUseTaxResaleCertificateFormStep, ProviderResponse.FormNames.salesAndUseTaxResaleCertificateFormName);
                        this.addStepConfig(Response.Steps.SalesAndUseTaxResaleCertificateSkipInfoStep, ProviderResponse.FormNames.salesAndUseTaxResaleCertificateFormName);
                        this.addStepConfig(Response.Steps.OnlineClaimsUserIDRequestFormQuestionStep, ProviderResponse.FormNames.onlineClaimsUserIDRequestFormName);
                        this.addStepConfig(Response.Steps.OnlineClaimsUserIDRequestFormSkipInfoStep, ProviderResponse.FormNames.onlineClaimsUserIDRequestFormName);
                        this.addStepConfig(Response.Steps.OnlineClaimsUserIDRequestFormPortalLinkStep, ProviderResponse.FormNames.onlineClaimsUserIDRequestFormName);
                        this.addStepConfig(Response.Steps.DirectDepositFormQuestionStep, ProviderResponse.FormNames.directDepositFormName);
                        this.addStepConfig(Response.Steps.DirectDepositFormPortalLinkStep, ProviderResponse.FormNames.directDepositFormName);
                        this.addStepConfig(Response.Steps.DirectDepositFormSkipInfoStep, ProviderResponse.FormNames.directDepositFormName);
                        this.addStepConfig(Response.Steps.ReviewStep);
                        this.addStepConfig(Response.Steps.SignatureStep);
                        wizard.setFirstStep(firstStepName);
                    }
                    Object.defineProperty(ResponseWizardController.prototype, "currentStep", {
                        get: function () {
                            return this.wizard.currentStep;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    Object.defineProperty(ResponseWizardController.prototype, "previousStepAction", {
                        get: function () {
                            return this.wizard.previousStepAction;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    Object.defineProperty(ResponseWizardController.prototype, "nextStepActions", {
                        get: function () {
                            return this.wizard.nextStepActions;
                        },
                        enumerable: true,
                        configurable: true
                    });
                    ResponseWizardController.prototype.addStepConfig = function (stepConstructor, formName) {
                        this.wizard.addStepConfig(stepConstructor);
                        this.stepConfigs.push({
                            name: stepConstructor.stepName,
                            formName: formName
                        });
                    };
                    ResponseWizardController.prototype.getStepConfig = function (stepName) {
                        return this.stepConfigs
                            .filter(function (x) { return x.name === stepName; })
                            .shift();
                    };
                    ResponseWizardController.prototype.getNextStepConfigs = function (stepName, filter) {
                        var currentStepConfig = this.getStepConfig(stepName);
                        if (!currentStepConfig)
                            return null;
                        if (!filter)
                            filter = function (currentStepConfig, otherStepConfig) { return true; };
                        var currentConfigIndex = this.stepConfigs.indexOf(currentStepConfig);
                        return this.stepConfigs
                            .filter(function (config, index) { return index > currentConfigIndex; })
                            .filter(function (config) { return filter(currentStepConfig, config); });
                    };
                    ResponseWizardController.prototype.formStepsAreNeeded = function (formName) {
                        var forms = this.userSession.contract.forms
                            .filter(function (x) { return x.name === formName; });
                        var form = forms.length > 0
                            ? forms[0]
                            : null;
                        return form && !form.isComplete;
                    };
                    ResponseWizardController.prototype.canMovePreviousStep = function (currentStepInstance, previousStepName) {
                        var previousFormConfig = this.getStepConfig(previousStepName);
                        if (!previousFormConfig || !previousFormConfig.formName)
                            return true;
                        return this.formStepsAreNeeded(previousFormConfig.formName);
                    };
                    ResponseWizardController.prototype.tryMapNextStepName = function (currentStepInstance, nextStepName) {
                        var _this = this;
                        if (nextStepName !== ProviderResponse.Wizard.GenericStepNames.next)
                            return null;
                        var currentStepName = currentStepInstance.stepConfig.constructor.stepName;
                        var nextStepConfigs = this.getNextStepConfigs(currentStepName, function (current, other) {
                            var currentStepHasNoForm = !current.formName;
                            var currentStepFormNotOtherStepForm = current.formName !== other.formName;
                            return currentStepHasNoForm || currentStepFormNotOtherStepForm;
                        });
                        if (nextStepConfigs && nextStepConfigs.length) {
                            return nextStepConfigs
                                .filter(function (config) { return !config.formName || _this.formStepsAreNeeded(config.formName); })
                                .map(function (config) { return config.name; })
                                .shift();
                        }
                        throw new Error("Unable to find next step for " + currentStepInstance.stepConfig.constructor.stepName + " step.");
                    };
                    return ResponseWizardController;
                }());
                Response.ResponseWizardController = ResponseWizardController;
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var DirectDepositFormPortalLinkStep = /** @class */ (function () {
                        function DirectDepositFormPortalLinkStep(userSession, wizard, $q, $log) {
                            this.userSession = userSession;
                            this.wizard = wizard;
                            this.$q = $q;
                            this.$log = $log;
                            this.label = Steps.StepLabels.directDeposit;
                            this.portalLinkStep = new Steps.PortalLinkStep(ProviderResponse.FormNames.directDepositFormName, userSession, wizard, $q, $log);
                        }
                        Object.defineProperty(DirectDepositFormPortalLinkStep.prototype, "form", {
                            get: function () {
                                return this.portalLinkStep.form;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        DirectDepositFormPortalLinkStep.prototype.getNextActions = function () {
                            var _this = this;
                            return [
                                {
                                    label: "Continue",
                                    execute: function () { return _this.portalLinkStep.execute(); },
                                    isPrimary: true
                                }
                            ];
                        };
                        DirectDepositFormPortalLinkStep.$inject = [
                            "userSession",
                            "wizard",
                            "$q",
                            "$log"
                        ];
                        DirectDepositFormPortalLinkStep.stepName = Steps.StepNames.directDepositFormPortalLink;
                        return DirectDepositFormPortalLinkStep;
                    }());
                    Steps.DirectDepositFormPortalLinkStep = DirectDepositFormPortalLinkStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var DirectDepositFormQuestionStep = /** @class */ (function () {
                        function DirectDepositFormQuestionStep() {
                            this.label = Steps.StepLabels.directDeposit;
                        }
                        DirectDepositFormQuestionStep.prototype.getNextActions = function () {
                            return [
                                { label: "No", execute: function () { return Steps.StepNames.directDepositFormSkipInfo; } },
                                { label: "Yes", execute: function () { return Steps.StepNames.directDepositFormPortalLink; }, isPrimary: true }
                            ];
                        };
                        DirectDepositFormQuestionStep.stepName = Steps.StepNames.directDepositFormQuestion;
                        return DirectDepositFormQuestionStep;
                    }());
                    Steps.DirectDepositFormQuestionStep = DirectDepositFormQuestionStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var DirectDepositFormSkipInfoStep = /** @class */ (function () {
                        function DirectDepositFormSkipInfoStep() {
                            this.label = Steps.StepLabels.directDeposit;
                        }
                        DirectDepositFormSkipInfoStep.prototype.getNextActions = function () {
                            return [
                                { label: "Continue", execute: function () { return ProviderResponse.Wizard.GenericStepNames.next; }, isPrimary: true }
                            ];
                        };
                        DirectDepositFormSkipInfoStep.stepName = Steps.StepNames.directDepositFormSkipInfo;
                        return DirectDepositFormSkipInfoStep;
                    }());
                    Steps.DirectDepositFormSkipInfoStep = DirectDepositFormSkipInfoStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var OnlineClaimsUserIDRequestFormPortalLinkStep = /** @class */ (function () {
                        function OnlineClaimsUserIDRequestFormPortalLinkStep(userSession, wizard, $q, $log) {
                            this.userSession = userSession;
                            this.wizard = wizard;
                            this.$q = $q;
                            this.$log = $log;
                            this.label = Steps.StepLabels.onlineClaimsUserIDRequest;
                            this.portalLinkStep = new Steps.PortalLinkStep(ProviderResponse.FormNames.onlineClaimsUserIDRequestFormName, userSession, wizard, $q, $log);
                        }
                        Object.defineProperty(OnlineClaimsUserIDRequestFormPortalLinkStep.prototype, "form", {
                            get: function () {
                                return this.portalLinkStep.form;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        OnlineClaimsUserIDRequestFormPortalLinkStep.prototype.getNextActions = function () {
                            var _this = this;
                            return [
                                {
                                    label: "Continue",
                                    execute: function () { return _this.portalLinkStep.execute(); },
                                    isPrimary: true
                                }
                            ];
                        };
                        OnlineClaimsUserIDRequestFormPortalLinkStep.$inject = [
                            "userSession",
                            "wizard",
                            "$q",
                            "$log"
                        ];
                        OnlineClaimsUserIDRequestFormPortalLinkStep.stepName = Steps.StepNames.onlineClaimsUserIDRequestFormPortalLink;
                        return OnlineClaimsUserIDRequestFormPortalLinkStep;
                    }());
                    Steps.OnlineClaimsUserIDRequestFormPortalLinkStep = OnlineClaimsUserIDRequestFormPortalLinkStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var OnlineClaimsUserIDRequestFormQuestionStep = /** @class */ (function () {
                        function OnlineClaimsUserIDRequestFormQuestionStep() {
                            this.label = Steps.StepLabels.onlineClaimsUserIDRequest;
                        }
                        OnlineClaimsUserIDRequestFormQuestionStep.prototype.getNextActions = function () {
                            return [
                                { label: "No", execute: function () { return Steps.StepNames.onlineClaimsUserIDRequestFormSkipInfo; } },
                                { label: "Yes", execute: function () { return Steps.StepNames.onlineClaimsUserIDRequestFormPortalLink; }, isPrimary: true }
                            ];
                        };
                        OnlineClaimsUserIDRequestFormQuestionStep.stepName = Steps.StepNames.onlineClaimsUserIDRequestFormQuestion;
                        return OnlineClaimsUserIDRequestFormQuestionStep;
                    }());
                    Steps.OnlineClaimsUserIDRequestFormQuestionStep = OnlineClaimsUserIDRequestFormQuestionStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var OnlineClaimsUserIDRequestFormSkipInfoStep = /** @class */ (function () {
                        function OnlineClaimsUserIDRequestFormSkipInfoStep() {
                            this.label = Steps.StepLabels.onlineClaimsUserIDRequest;
                        }
                        OnlineClaimsUserIDRequestFormSkipInfoStep.prototype.getNextActions = function () {
                            return [
                                { label: "Continue", execute: function () { return ProviderResponse.Wizard.GenericStepNames.next; }, isPrimary: true }
                            ];
                        };
                        OnlineClaimsUserIDRequestFormSkipInfoStep.stepName = Steps.StepNames.onlineClaimsUserIDRequestFormSkipInfo;
                        return OnlineClaimsUserIDRequestFormSkipInfoStep;
                    }());
                    Steps.OnlineClaimsUserIDRequestFormSkipInfoStep = OnlineClaimsUserIDRequestFormSkipInfoStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var OverviewStep = /** @class */ (function () {
                        function OverviewStep(userSession) {
                            this.userSession = userSession;
                            this.label = Steps.StepLabels.overview;
                            this.formHelp = {};
                            this.formHelp[ProviderResponse.FormNames.onlineClaimsUserIDRequestFormName] =
                                "Your SSN/TIN used for billing is required to request an online Claims account with EyeMed.";
                            this.formHelp[ProviderResponse.FormNames.salesAndUseTaxResaleCertificateFormName] =
                                "You will need a copy of your state’s sales tax resale certificate in order to complete this request.";
                            this.formHelp[ProviderResponse.FormNames.directDepositFormName] =
                                "A voided check and your checking account number and associated routing number will be required in order to complete this request.";
                        }
                        Object.defineProperty(OverviewStep.prototype, "contract", {
                            get: function () {
                                return this.userSession.contract;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        OverviewStep.prototype.getNextActions = function () {
                            var _this = this;
                            return [
                                { label: "Let's get started.", execute: function () { return _this.execute(); }, isPrimary: true }
                            ];
                        };
                        OverviewStep.prototype.execute = function () {
                            return ProviderResponse.Wizard.GenericStepNames.next;
                        };
                        OverviewStep.$inject = [
                            "userSession"
                        ];
                        OverviewStep.stepName = Steps.StepNames.overview;
                        return OverviewStep;
                    }());
                    Steps.OverviewStep = OverviewStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var PortalLinkStep = /** @class */ (function () {
                        function PortalLinkStep(formName, userSession, wizard, $q, $log) {
                            this.formName = formName;
                            this.userSession = userSession;
                            this.wizard = wizard;
                            this.$q = $q;
                            this.$log = $log;
                            this.form = new ProviderResponse.ContractForm(userSession, this.formName);
                        }
                        PortalLinkStep.prototype.execute = function () {
                            var _this = this;
                            this.wizard.clearErrors();
                            return this.form
                                .checkIfComplete()
                                .then(function (isComplete) {
                                if (isComplete)
                                    return ProviderResponse.Wizard.GenericStepNames.next;
                                _this.wizard.notifyError("The form must be completed to continue.");
                                return null;
                            }, function (response) {
                                var message = "Unable to verify the status of the form.  Please try again.";
                                _this.wizard.notifyError(message);
                                _this.$log.error(message, response);
                                return _this.$q.reject(message);
                            });
                        };
                        PortalLinkStep.$inject = [
                            "userSession",
                            "wizard",
                            "$q",
                            "$log"
                        ];
                        return PortalLinkStep;
                    }());
                    Steps.PortalLinkStep = PortalLinkStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var ReviewStep = /** @class */ (function () {
                        function ReviewStep(userSession) {
                            this.userSession = userSession;
                            this.label = Steps.StepLabels.review;
                        }
                        Object.defineProperty(ReviewStep.prototype, "contract", {
                            get: function () {
                                return this.userSession.contract;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        ReviewStep.prototype.getNextActions = function () {
                            return [
                                { label: "Continue", execute: function () { return Steps.StepNames.signature; }, isPrimary: true }
                            ];
                        };
                        ReviewStep.$inject = [
                            "userSession"
                        ];
                        ReviewStep.stepName = Steps.StepNames.review;
                        return ReviewStep;
                    }());
                    Steps.ReviewStep = ReviewStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var SalesAndUseTaxResaleCertificateFormStep = /** @class */ (function () {
                        function SalesAndUseTaxResaleCertificateFormStep(baseUrl, contract, wizard, $http, $q, $log) {
                            this.baseUrl = baseUrl;
                            this.contract = contract;
                            this.wizard = wizard;
                            this.$http = $http;
                            this.$q = $q;
                            this.$log = $log;
                            this.label = Steps.StepLabels.salesAndUseTaxResaleCertificate;
                        }
                        SalesAndUseTaxResaleCertificateFormStep.prototype.execute = function () {
                            var _this = this;
                            this.wizard.clearErrors();
                            if (this.file == null || this.file.size <= 0) {
                                this.wizard.notifyError("A file must be selected to continue.");
                                return null;
                            }
                            var formData = new FormData();
                            formData.append("file", this.file);
                            formData.append("formName", ProviderResponse.FormNames.salesAndUseTaxResaleCertificateFormName);
                            return this.$http
                                .post(this.baseUrl + ("/Contracts/Provider-Response/api/Contract/" + this.contract.id + "/FormFiles"), formData, {
                                transformRequest: angular.identity,
                                headers: {
                                    'Content-type': undefined
                                }
                            })
                                .then(function (response) {
                                return ProviderResponse.Wizard.GenericStepNames.next;
                            }, function (response) {
                                var genericMessage = "Unable to save form.";
                                var message = response.status === 400
                                    ? response.data.message || response.data || response.statusText || genericMessage
                                    : genericMessage;
                                _this.wizard.notifyError(message);
                                _this.$log.error(message, response);
                                return _this.$q.reject(message);
                            });
                        };
                        SalesAndUseTaxResaleCertificateFormStep.prototype.getNextActions = function () {
                            var _this = this;
                            return [
                                { label: "Continue", execute: function () { return _this.execute(); }, isPrimary: true },
                            ];
                        };
                        SalesAndUseTaxResaleCertificateFormStep.$inject = [
                            "baseUrl",
                            "contract",
                            "wizard",
                            "$http",
                            "$q",
                            "$log"
                        ];
                        SalesAndUseTaxResaleCertificateFormStep.stepName = Steps.StepNames.salesAndUseTaxResaleCertificateForm;
                        return SalesAndUseTaxResaleCertificateFormStep;
                    }());
                    Steps.SalesAndUseTaxResaleCertificateFormStep = SalesAndUseTaxResaleCertificateFormStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var SalesAndUseTaxResaleCertificateQuestionStep = /** @class */ (function () {
                        function SalesAndUseTaxResaleCertificateQuestionStep() {
                            this.label = Steps.StepLabels.salesAndUseTaxResaleCertificate;
                        }
                        SalesAndUseTaxResaleCertificateQuestionStep.prototype.getNextActions = function () {
                            return [
                                { label: "No", execute: function () { return Steps.StepNames.salesAndUseTaxResaleCertificateSkipInfo; } },
                                { label: "Yes", execute: function () { return Steps.StepNames.salesAndUseTaxResaleCertificateForm; }, isPrimary: true }
                            ];
                        };
                        SalesAndUseTaxResaleCertificateQuestionStep.stepName = Steps.StepNames.salesAndUseTaxResaleCertificateQuestion;
                        return SalesAndUseTaxResaleCertificateQuestionStep;
                    }());
                    Steps.SalesAndUseTaxResaleCertificateQuestionStep = SalesAndUseTaxResaleCertificateQuestionStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var SalesAndUseTaxResaleCertificateSkipInfoStep = /** @class */ (function () {
                        function SalesAndUseTaxResaleCertificateSkipInfoStep() {
                            this.label = Steps.StepLabels.salesAndUseTaxResaleCertificate;
                        }
                        SalesAndUseTaxResaleCertificateSkipInfoStep.prototype.getNextActions = function () {
                            return [
                                { label: "Continue", execute: function () { return ProviderResponse.Wizard.GenericStepNames.next; }, isPrimary: true },
                            ];
                        };
                        SalesAndUseTaxResaleCertificateSkipInfoStep.stepName = Steps.StepNames.salesAndUseTaxResaleCertificateSkipInfo;
                        return SalesAndUseTaxResaleCertificateSkipInfoStep;
                    }());
                    Steps.SalesAndUseTaxResaleCertificateSkipInfoStep = SalesAndUseTaxResaleCertificateSkipInfoStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Response;
            (function (Response) {
                var Steps;
                (function (Steps) {
                    var SignatureStep = /** @class */ (function () {
                        function SignatureStep(baseUrl, userSession, response, responseTypeConfig, wizard, declineReasons, $http) {
                            this.baseUrl = baseUrl;
                            this.userSession = userSession;
                            this.response = response;
                            this.responseTypeConfig = responseTypeConfig;
                            this.wizard = wizard;
                            this.$http = $http;
                            this.label = Steps.StepLabels.signature;
                            this.otherDeclineReason = "Other";
                            this.declineReasons = angular.copy(declineReasons);
                            this.declineReasons.push(this.otherDeclineReason);
                        }
                        Object.defineProperty(SignatureStep.prototype, "contract", {
                            get: function () {
                                return this.userSession.contract;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        SignatureStep.prototype.execute = function () {
                            var _this = this;
                            this.wizard.clearErrors();
                            this.response.ipAddressEncrypted = this.contract.ipAddressEncrypted;
                            var url = (this.baseUrl + this.responseTypeConfig.completeUrl)
                                .replace("{contractId}", this.contract.id);
                            return this.$http
                                .post(url, this.response)
                                .then(function (response) { return ProviderResponse.Wizard.GenericStepNames.end; })
                                .catch(function (response) {
                                var message = response.data.message ||
                                    response.data ||
                                    response.statusText ||
                                    "Unable to complete the requested operation.  Please try again.";
                                _this.wizard.notifyError(message);
                            });
                        };
                        SignatureStep.prototype.getNextActions = function () {
                            var _this = this;
                            return [
                                {
                                    label: this.responseTypeConfig.completeActionLabel,
                                    execute: function () { return _this.execute(); },
                                    isPrimary: true
                                }
                            ];
                        };
                        SignatureStep.prototype.selectedDeclineReasonChanged = function () {
                            this.response.declineReason = (this.selectedDeclineReason !== this.otherDeclineReason)
                                ? this.selectedDeclineReason
                                : "";
                        };
                        SignatureStep.$inject = [
                            "baseUrl",
                            "userSession",
                            "response",
                            "responseTypeConfig",
                            "wizard",
                            "declineReasons",
                            "$http"
                        ];
                        SignatureStep.stepName = Steps.StepNames.signature;
                        return SignatureStep;
                    }());
                    Steps.SignatureStep = SignatureStep;
                })(Steps = Response.Steps || (Response.Steps = {}));
            })(Response = ProviderResponse.Response || (ProviderResponse.Response = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Wizard;
            (function (Wizard) {
                var GenericStepNames = /** @class */ (function () {
                    function GenericStepNames() {
                    }
                    GenericStepNames.previous = "[Wizard.Previous]";
                    GenericStepNames.next = "[Wizard.Next]";
                    GenericStepNames.end = "[Wizard.End]";
                    return GenericStepNames;
                }());
                Wizard.GenericStepNames = GenericStepNames;
            })(Wizard = ProviderResponse.Wizard || (ProviderResponse.Wizard = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
;
;
;
;
;
;
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Wizard;
            (function (Wizard) {
                function registerWizardComponent(module) {
                    var WizardComponent = /** @class */ (function () {
                        function WizardComponent() {
                            this.bindings = {
                                onLoad: "&",
                                onEnd: "&",
                                onError: "&",
                                onClearErrors: "&"
                            };
                            this.controller = WizardController;
                            this.controllerAs = "vm";
                            this.template = "<ng-include src=\"vm.stepTemplateUrl\"></ng-include>";
                        }
                        return WizardComponent;
                    }());
                    var WizardController = /** @class */ (function () {
                        function WizardController($injector, $q) {
                            this.$injector = $injector;
                            this.$q = $q;
                            this.stepConfigs = [];
                            this.previousStepInstances = [];
                            this.innerCreateStepTemplateUrl = function (stepName) { return stepName + ".html"; };
                            this.innerTryMapNextStepName = function (step, nextStepName) { return nextStepName; };
                            this.innerCanMovePreviousStep = function (step, nextStepName) { return true; };
                        }
                        WizardController.prototype.$onInit = function () {
                            this.onLoad = this.onLoad || new Function();
                            this.onEnd = this.onEnd || new Function();
                            this.onError = this.onError || new Function();
                            this.onClearErrors = this.onClearErrors || new Function();
                            this.onLoad({ wizard: this });
                        };
                        Object.defineProperty(WizardController.prototype, "createStepTemplateUrl", {
                            set: function (value) {
                                if (!value)
                                    throw new Error("A null step template URL factory is not valid.");
                                this.innerCreateStepTemplateUrl = value;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "tryMapNextStepName", {
                            set: function (value) {
                                if (!value)
                                    throw new Error("A next step name filter cannot be null.");
                                if (value && !angular.isFunction(value))
                                    throw new Error("A next step name filter must be a function.");
                                this.innerTryMapNextStepName = value;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "canMovePreviousStep", {
                            set: function (value) {
                                if (!value)
                                    throw new Error("A previous step name filter cannot be null.");
                                if (value && !angular.isFunction(value))
                                    throw new Error("A previous step name filter must be a function.");
                                this.innerCanMovePreviousStep = value;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "createStepContext", {
                            set: function (value) {
                                if (value && !angular.isFunction(value))
                                    throw new Error("A context factory must be a function.");
                                this.innerCreateStepContext = value;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "currentStep", {
                            get: function () {
                                return this.currentStepInstance.step;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "nextStepActions", {
                            get: function () {
                                return this.innerNextStepActions;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        Object.defineProperty(WizardController.prototype, "previousStepAction", {
                            get: function () {
                                return this.innerPreviousStepAction;
                            },
                            enumerable: true,
                            configurable: true
                        });
                        WizardController.prototype.addStepConfig = function (constructor, contextFactory) {
                            if (!constructor)
                                throw new Error("A null step cannot be added.");
                            if (!constructor.stepName)
                                throw new Error("A step's name must be set.");
                            var otherStepConstructor = this.getStepConfig(constructor.stepName);
                            if (otherStepConstructor)
                                throw new Error("A step named '" + constructor.stepName + "' has already been added.");
                            this.stepConfigs.push({
                                constructor: constructor,
                                createContext: contextFactory
                            });
                        };
                        WizardController.prototype.setFirstStep = function (stepName) {
                            var _this = this;
                            var stepInstance = this.createStep(stepName);
                            this.previousStepInstances = [];
                            this.innerPreviousStepAction = null;
                            this.currentStepInstance = stepInstance;
                            this.stepTemplateUrl = this.innerCreateStepTemplateUrl(stepName);
                            this.innerNextStepActions = stepInstance.step
                                .getNextActions()
                                .map(function (x) { return _this.getNextStepAction(x); });
                        };
                        WizardController.prototype.notifyError = function (message) {
                            this.onError({ message: message });
                        };
                        WizardController.prototype.clearErrors = function () {
                            this.onClearErrors();
                        };
                        WizardController.prototype.createStep = function (stepName) {
                            var stepConfig = this.getStepConfig(stepName);
                            if (!stepConfig)
                                throw new Error("A step named '" + stepName + "' has not been added.");
                            var wizardContextFactory = this.innerCreateStepContext || (function () { return null; });
                            var wizardContext = wizardContextFactory();
                            var stepContextFactory = stepConfig.createContext || (function () { return null; });
                            var stepContext = stepContextFactory();
                            var context = angular.extend(wizardContext, stepContext, { wizard: this });
                            var step = this.$injector
                                .instantiate(stepConfig.constructor, context);
                            return {
                                step: step,
                                stepConfig: stepConfig
                            };
                        };
                        WizardController.prototype.moveNextStep = function (action) {
                            var _this = this;
                            var executeResult = action.execute();
                            return this.$q.when(executeResult, function (nextStepName) {
                                if (!nextStepName) {
                                    // This is how an action signals that it failed.
                                    // We don't change the current step in this case.
                                    return null;
                                }
                                var altNextStepName = _this.innerTryMapNextStepName(angular.copy(_this.currentStepInstance), nextStepName);
                                nextStepName = altNextStepName || nextStepName;
                                if (nextStepName === Contracts.ProviderResponse.Wizard.GenericStepNames.previous)
                                    return _this.movePreviousStep();
                                if (nextStepName === Contracts.ProviderResponse.Wizard.GenericStepNames.end) {
                                    _this.onEnd();
                                    return Contracts.ProviderResponse.Wizard.GenericStepNames.end;
                                }
                                var nextStepInstance = _this.createStep(nextStepName);
                                if (_this.currentStep) {
                                    _this.previousStepInstances.push(_this.currentStepInstance);
                                    _this.innerPreviousStepAction = _this.getPreviousStepAction();
                                }
                                _this.currentStepInstance = nextStepInstance;
                                _this.stepTemplateUrl = _this.innerCreateStepTemplateUrl(nextStepName);
                                _this.innerNextStepActions = nextStepInstance.step
                                    .getNextActions()
                                    .map(function (x) { return _this.getNextStepAction(x); });
                                return nextStepName;
                            }, function (reason) {
                                var reasonMessage = angular.isString(reason)
                                    ? reason
                                    : angular.isObject(reason)
                                        ? angular.toJson(reason)
                                        : "Reason not specified.";
                                _this.$q.reject("Error occured while moving to next step: " + reasonMessage + ".");
                            });
                        };
                        WizardController.prototype.movePreviousStep = function () {
                            var _this = this;
                            var previousStepInstanceCount = this.previousStepInstances.length;
                            this.innerPreviousStepAction = null;
                            if (previousStepInstanceCount === 0)
                                return null;
                            var previousStepName = "";
                            var previousStepInstance;
                            var canMovePreviousStep = false;
                            while ((previousStepInstance = this.previousStepInstances.pop())) {
                                previousStepName = previousStepInstance.stepConfig.constructor.stepName;
                                canMovePreviousStep = this.innerCanMovePreviousStep(this.currentStepInstance, previousStepName);
                                if (canMovePreviousStep)
                                    break;
                            }
                            this.currentStepInstance = previousStepInstance;
                            if (this.previousStepInstances.length >= 1)
                                this.innerPreviousStepAction = this.getPreviousStepAction();
                            var currentStepName = this.currentStepInstance.stepConfig.constructor.stepName;
                            this.stepTemplateUrl = this.innerCreateStepTemplateUrl(currentStepName);
                            this.innerNextStepActions = this.currentStepInstance.step
                                .getNextActions()
                                .map(function (x) { return _this.getNextStepAction(x); });
                            return currentStepName;
                        };
                        WizardController.prototype.getPreviousStepAction = function () {
                            var _this = this;
                            return {
                                execute: function () { return _this.movePreviousStep(); },
                                isPrimary: false,
                                label: null
                            };
                        };
                        WizardController.prototype.getNextStepAction = function (action) {
                            var _this = this;
                            return {
                                execute: function () { return _this.moveNextStep(action); },
                                isPrimary: action.isPrimary,
                                label: action.label
                            };
                        };
                        WizardController.prototype.getStepConfig = function (stepName) {
                            var steps = this.stepConfigs.filter(function (x) { return x.constructor.stepName === stepName; });
                            if (steps.length > 0)
                                return steps[0];
                            return null;
                        };
                        WizardController.$inject = [
                            "$injector",
                            "$q"
                        ];
                        return WizardController;
                    }());
                    module
                        .component("appContractResponseWizard", new WizardComponent());
                }
                Wizard.registerWizardComponent = registerWizardComponent;
            })(Wizard = ProviderResponse.Wizard || (ProviderResponse.Wizard = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            ((function () {
                var lodash;
                angular
                    .module("lodash", [])
                    .factory("_", [
                    "$window", function ($window) {
                        //We use the approach below primarily because this factory will 
                        //be run multiple times when the unit tests are run.  If we rely 
                        //solely on $windows._ then the second time this runs it will 
                        //fail since the first through we delete $windows._.
                        lodash = lodash || $window._;
                        delete ($window._);
                        return lodash;
                    }
                ]);
                var module = angular.module("eyemed.contracts.providerresponse", [
                    "eyemed.shared",
                    "ngCookies"
                ]);
                ProviderResponse.Wizard.registerWizardComponent(module);
            })());
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var ContractForm = /** @class */ (function () {
                function ContractForm(userSession, formName) {
                    this.userSession = userSession;
                    this.formName = formName;
                }
                Object.defineProperty(ContractForm.prototype, "form", {
                    get: function () {
                        var _this = this;
                        var form = this.userSession.contract.forms
                            .filter(function (x) { return x.name === _this.formName; })
                            .shift();
                        return form || {};
                    },
                    enumerable: true,
                    configurable: true
                });
                Object.defineProperty(ContractForm.prototype, "name", {
                    get: function () {
                        return this.form.name;
                    },
                    enumerable: true,
                    configurable: true
                });
                Object.defineProperty(ContractForm.prototype, "label", {
                    get: function () {
                        return this.form.label;
                    },
                    enumerable: true,
                    configurable: true
                });
                Object.defineProperty(ContractForm.prototype, "isComplete", {
                    get: function () {
                        return this.form.isComplete;
                    },
                    enumerable: true,
                    configurable: true
                });
                Object.defineProperty(ContractForm.prototype, "webPortalUrl", {
                    get: function () {
                        return this.form.type !== ProviderResponse.ContractFormType.WebPortal
                            ? null
                            : this.form.webPortalUrl;
                    },
                    enumerable: true,
                    configurable: true
                });
                ContractForm.prototype.checkIfComplete = function () {
                    var _this = this;
                    return this.userSession
                        .loadContract()
                        .then(function () { return _this.form.isComplete; });
                };
                return ContractForm;
            }());
            ProviderResponse.ContractForm = ContractForm;
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var directiveName = "appFile";
            var onFileChangedAttrName = "onFileChanged";
            (function (module) {
                module
                    .directive(directiveName, [
                    "$parse",
                    function ($parse) { return ({
                        restrict: "A",
                        link: function (scope, element, attributes) {
                            element.bind("change", function () {
                                $parse(attributes[directiveName])
                                    .assign(scope, element[0].files[0]);
                                var onFileChanged = scope.$eval(attributes[onFileChangedAttrName]);
                                if (onFileChanged)
                                    onFileChanged();
                                scope.$apply();
                            });
                        }
                    }); }
                ]);
            })(angular.module("eyemed.contracts.providerresponse"));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
;
(function (module) {

    module
        .factory('authHttpInterceptor', ['$injector', '$q', authHttpInterceptor])
        .config(['$httpProvider', configureAuthHttpInterceptor]);

    function configureAuthHttpInterceptor($httpProvider) {
        $httpProvider.interceptors.push('authHttpInterceptor');
    }

    function authHttpInterceptor($injector, $q) {
        return {
            response: function (response) {
                if (response.status === 401) {
                    $injector.get('userSession').goToSignIn();
                }
                return response || $q.when(response);
            },
            responseError: function (rejection) {
                if (rejection.status === 401) {
                    $injector.get('userSession').goToSignIn();
                }
                return $q.reject(rejection);
            }
        }
    }
    
    //http://stackoverflow.com/questions/22537311/angular-ui-router-login-authentication

    module.run([
        "$rootScope",
        "$state",
        "userSession",
        configureRouteSecurity
    ]);

    function configureRouteSecurity($rootScope, $state, userSession) {
        $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
            if (toState.authenticate && !userSession.isSignedIn()) {
                $state.transitionTo("unavailable");
                event.preventDefault();
            }
        });
    }

}(angular.module("eyemed.contracts.providerresponse")));
(function (module) {
    'use strict';
    module.factory('requestTokenInjector', ['requestTokenHeader', "$injector", function (requestTokenHeader, $injector) {
        var sessionInjector = {
            request: function (config) {
                config.headers[requestTokenHeader] = $injector.get("userSession").getRequestToken();
                return config;
            }
        };
        return sessionInjector;
    }]);

    module.config(['$httpProvider', function($httpProvider) {
        $httpProvider.interceptors.push('requestTokenInjector');
    }]);
}(angular.module("eyemed.contracts.providerresponse")));
(function (module) {
    'use strict';

    module.config([
        "$stateProvider",
        "$urlRouterProvider",
        "$urlMatcherFactoryProvider",
        configureRoutes
    ]);

    function configureRoutes($stateProvider, $urlRouterProvider, $urlMatcherFactoryProvider) {

        addGuidRouterType($urlMatcherFactoryProvider);

        $stateProvider
            .state('login', {
                url: '/{contractId:guid}/login',
                templateUrl: 'Areas/Contracts/ProviderResponse/Login/login.template.html'
            })
            .state('instructions', {
                url: '/{contractId:guid}/instructions',
                templateUrl: 'Areas/Contracts/ProviderResponse/Instructions/instructions.template.html',
                authenticate: true
            })
            .state('acceptedMessage', {
                url: '/{contractId:guid}/accepted',
                templateUrl: 'Areas/Contracts/ProviderResponse/AcceptedMessage/acceptedMessage.template.html',
                authenticate: true
            })
            .state('declinedMessage', {
                url: '/{contractId:guid}/declined',
                templateUrl: 'Areas/Contracts/ProviderResponse/DeclinedMessage/declinedMessage.template.html',
                authenticate: true
            })
            .state('closedMessage', {
                url: '/{contractId:guid}/closed',
                templateUrl: 'Areas/Contracts/ProviderResponse/ClosedMessage/closedMessage.template.html',
                authenticate: true
            })
            .state('unknown', {
                url: '/unknown',
                template: '<h2>We couldn\'t find what you were looking for.</h2>'
            })
            .state('unavailable', {
                url: '/unavailable',
                template: '<h2>We\'re sorry, the content you requested is unavailable.</h2>'
            });

        $urlRouterProvider.otherwise('/unknown');
    }

    function addGuidRouterType($urlMatcherFactoryProvider) {
        var GUID_REGEXP = /^[a-f\d]{8}-([a-f\d]{4}-){3}[a-f\d]{12}$/i;
        $urlMatcherFactoryProvider.type('guid', {
            encode: angular.identity,
            decode: angular.identity,
            is: function(item) {
                return GUID_REGEXP.test(item);
            }
        });
    }

} (angular.module("eyemed.contracts.providerresponse")));
(function (module) {
    'use strict';

    module.controller("shellController", [
        "userSession",
        shellController
    ]);

    function shellController(userSession) {
        var vm = this;
        vm.isSignedIn = userSession.isSignedIn;
        vm.signOut = signOut;

        function signOut() {
            var contractId = userSession.getContractId();
            userSession
                .signOut()
                .finally(function () {
                    userSession.goToSignIn(contractId);
                });
        }
    }
})(angular.module("eyemed.contracts.providerresponse"));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var FormNames = /** @class */ (function () {
                function FormNames() {
                }
                FormNames.salesAndUseTaxResaleCertificateFormName = "SalesAndUseTaxResaleCertificate";
                FormNames.onlineClaimsUserIDRequestFormName = "OnlineRequest";
                FormNames.directDepositFormName = "DirectDeposit";
                return FormNames;
            }());
            ProviderResponse.FormNames = FormNames;
            // Source Type: EyeMedOnline.Website.Areas.Contracts.Logic.ContractFormType
            var ContractFormType;
            (function (ContractFormType) {
                ContractFormType["File"] = "File";
                ContractFormType["WebPortal"] = "WebPortal";
            })(ContractFormType = ProviderResponse.ContractFormType || (ProviderResponse.ContractFormType = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            (function (module) {
                "use strict";
                var CONTRACT_ID_KEY = "provider-relations.portal.contracts.provider-response.contractId", REQUEST_TOKEN_KEY = "provider-relations.portal.contracts.provider-response.requestToken";
                module.factory("userSession", [
                    "baseUrl",
                    "$http",
                    "$cookies",
                    "$state",
                    "$log",
                    "$q",
                    userSession
                ]);
                function userSession(baseUrl, $http, $cookies, $state, $log, $q) {
                    var me = this;
                    var contractIdStore = new ValueStore(CONTRACT_ID_KEY, function (value) { return value || ""; });
                    var requestTokenStore = new ValueStore(REQUEST_TOKEN_KEY, function (value) { return value || ""; });
                    me.getContractId = contractIdStore.get;
                    me.getRequestToken = requestTokenStore.get;
                    me.contract = {};
                    me.goToSignIn = goToSignIn;
                    me.isSignedIn = isSignedIn;
                    me.signIn = signIn;
                    me.signOut = signOut;
                    me.loadContract = loadContract;
                    me.ensureValidState = ensureValidState;
                    return me;
                    function updateContract(contract) {
                        angular.copy(contract, me.contract);
                        ensureValidState();
                    }
                    function ensureValidState() {
                        var curState = $state.current.name;
                        if (me.contract.isAccepted === true && curState !== "acceptedMessage") {
                            $state.go("acceptedMessage", { contractId: me.getContractId() });
                        }
                        if (me.contract.isDeclined === true && curState !== "declinedMessage") {
                            $state.go("declinedMessage", { contractId: me.getContractId() });
                        }
                        if (me.contract.canAccept === true && curState !== "instructions") {
                            $state.go("instructions", { contractId: me.getContractId() });
                        }
                        if (me.contract.canDecline === true && curState !== "instructions") {
                            $state.go("instructions", { contractId: me.getContractId() });
                        }
                        if (me.contract.isClosed === true && curState !== "closedMessage") {
                            $state.go("closedMessage", { contractId: me.getContractId() });
                        }
                    }
                    function loadContract() {
                        return $http.get(baseUrl + "/Contracts/Provider-Response/api/Contract/" + contractIdStore.get() + "?format=json")
                            .then(function (response) {
                            updateContract(response.data);
                        });
                    }
                    function goToSignIn(contractId) {
                        $state.go("login", { contractId: contractIdStore.get() || contractId });
                    }
                    function signOut() {
                        return $http
                            .delete(baseUrl + "/Contracts/Provider-Response/api/UserSession")
                            .finally(deleteState);
                    }
                    function signIn(contractId, taxId) {
                        return $http
                            .post(baseUrl + "/Contracts/Provider-Response/api/UserSession", {
                            contractId: contractId,
                            taxId: taxId
                        })
                            .then(function (response) {
                            contractIdStore.put(contractId);
                            requestTokenStore.put(response.data.requestToken);
                            updateContract(response.data.contract);
                        })
                            .catch(deleteState);
                    }
                    function isSignedIn() {
                        return contractIdStore.get() !== "";
                    }
                    function deleteState() {
                        contractIdStore.remove();
                        requestTokenStore.remove();
                        me.contract = {};
                        return $q.reject();
                    }
                    function ValueStore(key, getter) {
                        var me = this;
                        me["get"] = function () { return getter($cookies.get(key)); };
                        me["put"] = function (value) {
                            $cookies.put(key, value, { path: "/" });
                        };
                        me["remove"] = function () {
                            $cookies.remove(key, { path: "/" });
                        };
                    }
                }
            })(angular.module("eyemed.contracts.providerresponse"));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
(function (module) {
    'use strict';

    module.controller("acceptedMessageController", ["userSession", "messageBox", "$state", "baseUrl", acceptedMessageController]);

    function acceptedMessageController(userSession, messageBox, $state, baseUrl) {

        var vm = this;

        vm.contract = userSession.contract;

        userSession.loadContract()
            .then(function () {
                vm.downloadUrl = baseUrl + "/Contracts/Provider-Response/api/Contract/" + vm.contract.id + "/Pdf";
            });

    }

})(angular.module("eyemed.contracts.providerresponse"));
(function (module) {
    'use strict';

    module.controller("closedMessageController", ["userSession", closedMessageController]);

    function closedMessageController(userSession) {
        var vm = this;

        vm.contract = userSession.contract;

        userSession.loadContract();
    }
})(angular.module("eyemed.contracts.providerresponse"));
(function (module) {
    'use strict';

    module.controller("declinedMessageController", ["userSession", declinedMessageController]);

    function declinedMessageController(userSession) {
        var vm = this;

        vm.contract = userSession.contract;

        userSession.loadContract();
    }
})(angular.module("eyemed.contracts.providerresponse"));
var App;
(function (App) {
    var Contracts;
    (function (Contracts) {
        var ProviderResponse;
        (function (ProviderResponse) {
            var Instructions;
            (function (Instructions) {
                (function (module) {
                    "use strict";
                    module.controller("instructionsController", [
                        "userSession",
                        "messageBox",
                        "$state",
                        "$uibModal",
                        "$window",
                        "baseUrl",
                        instructionsController
                    ]);
                    function instructionsController(userSession, messageBox, $state, $uibModal, $window, baseUrl) {
                        var vm = this, stepHelpState = [], contractId = userSession.getContractId();
                        vm.toggleHelpCollapsed = toggleHelpCollapsed;
                        vm.isHelpCollapsed = isHelpCollapsed;
                        vm.downloadContract = downloadContract;
                        vm.updateContract = updateContract;
                        vm.contract = userSession.contract;
                        //init, make sure to get latest contract.
                        userSession.loadContract();
                        function toggleHelpCollapsed(step) {
                            stepHelpState[step] = !isHelpCollapsed(step);
                        }
                        function downloadContract() {
                            $window.open(baseUrl + "/Contracts/Provider-Response/api/Contract/" + contractId + "/Pdf");
                            if (vm.contract.canAcceptStatus == "VIEW_REQUIRED") {
                                vm.contract.canAcceptStatus = "";
                            }
                        }
                        function updateContract(acceptOrDecline) {
                            //it's possible they are required to re-download the contract, but that does not stop
                            // them from opening the update dialog, because they could decline it.
                            if (userSession.contract.canAccept === false && userSession.contract.canDecline === false) {
                                messageBox.open("Please download and review your contract before you attempt to accept or decline.", "Oops!");
                                return;
                            }
                            if (acceptOrDecline == "accept" && userSession.contract.canAcceptStatus == "VIEW_REQUIRED") {
                                messageBox.open("You must download the contract before you can accept it. ", "Oops!");
                                return;
                            }
                            ProviderResponse.Response.ResponseController
                                .open($uibModal, acceptOrDecline)
                                .then(function (state) {
                                $state.go(state, { contractId: userSession.getContractId() });
                            });
                        }
                        function isHelpCollapsed(step) {
                            return angular.isDefined(stepHelpState[step])
                                ? stepHelpState[step]
                                : true;
                        }
                    }
                })(angular.module("eyemed.contracts.providerresponse"));
            })(Instructions = ProviderResponse.Instructions || (ProviderResponse.Instructions = {}));
        })(ProviderResponse = Contracts.ProviderResponse || (Contracts.ProviderResponse = {}));
    })(Contracts = App.Contracts || (App.Contracts = {}));
})(App || (App = {}));
(function (module) {
    'use strict';

    module.controller("loginController", [
        "userSession",
        "$stateParams",
        "$state",
        loginController
    ]);

    function loginController(userSession, $stateParams, $state) {

        var vm = this;
        vm.signIn = signIn;
        vm.taxId = "";
        vm.enableInput = true;
        vm.loggingIn = false;
        vm.invalidTaxId = false;
        vm.taxIdRegexPattern = /^[0-9]{9}$/;
        function signIn() {

            vm.loggingIn = true;
            userSession
                .signIn($stateParams.contractId, vm.taxId)
                .then(function () {

                    if (userSession.contract.canAccept === true || userSession.contract.canDecline === true) {
                        $state.go("instructions", {contractId: userSession.getContractId()});
                        return;
                    }

                    if (userSession.contract.isAccepted === true) {
                        $state.go('acceptedMessage', {contractId: userSession.getContractId()});
                        return;
                    }

                    if (userSession.contract.isDeclined === true) {
                        $state.go('declinedMessage', {contractId: userSession.getContractId()});
                        return;
                    }

                    if (userSession.contract.isClosed === true) {
                        $state.go('closedMessage', { contractId: userSession.getContractId() });
                        return;
                    }

                    $state.go("unavailable", { contractId: userSession.getContractId() });
                    return;

                })
                .catch(function () {

                    vm.invalidTaxId = true;

                })
                .finally(function () {
                    vm.loggingIn = false;
                });


        }

    }
})(angular.module("eyemed.contracts.providerresponse"));