/* Minification failed. Returning unminified contents.
(6360,75-76): run-time error JS1195: Expected expression: >
(6360,38-74): run-time error JS5017: Syntax error in regular expression: /[\w\s~`!@#$%^&*()-_\[\]\\{}|;':",./
 */
function manageAgenciesSelectAll(checked) {
    $("input.manage-agencies-select-item").each(function (index, item) {
        var checkBoxItem = item;
        checkBoxItem.checked = checked;
    });
}
function manageAgenciesToggleOffSelectAll(checked) {
    if (!checked) {
        var selectAll = $("#select-all")[0];
        selectAll.checked = false;
    }
}
function confirmUpdateStatusSubmission(submitButton) {
    var endpointButton = $("#update-endpoint-submit")[0];
    return confirmUpdateSubmission(submitButton, endpointButton);
}
function confirmUpdateEndpointSubmission(submitButton) {
    var statusButton = $("#update-status-submit")[0];
    return confirmUpdateSubmission(submitButton, statusButton);
}
function confirmUpdateSubmission(submitButton, alternateSubmit) {
    var filtersSubmit = $("#Filters-apply")[0];
    if (filtersSubmit && !filtersSubmit.disabled) {
        var proceed = confirm('There are unapplied filters. Submitting updates will not take unapplied filter values into account. Are you sure you want to continue?');
        if (!proceed)
            return false;
    }
    setElementSubmittingState(submitButton, true);
    alternateSubmit.disabled = true;
    filtersSubmit.disabled = true;
    var form = submitButton.form;
    form.action = submitButton.formAction;
    form.submit();
    return true;
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(function () {
    if (isAtUrl('/secure/admin/agency/ivr')) {
        function enableSaveButton() {
            setButtonStateBySelector('#save-button', ElementState.Enabled);
        }
        ;
        subscribeToOnInput(enableSaveButton);
    }
    else if (isAtUrl('/secure/admin/agency/setup')) {
        var paymentProviderElement = document.getElementById('payment-provider');
        paymentProviderElement.addEventListener("change", function (e) {
            toggleSetupControls();
        }, false);
        var orgEnabledElement = document.getElementById('org-enabled-yes');
        orgEnabledElement.addEventListener("change", function (e) {
            if (!confirm('Are you sure you want to enable this organization?')) {
                $('#org-enabled-no').prop('checked', true);
                $('#org-enabled-yes').prop('checked', false);
            }
        }, false);
        var orgDisabledElement = document.getElementById('org-enabled-no');
        orgDisabledElement.addEventListener("change", function (e) {
            if (!confirm('Are you sure you want to disable this organization? ' +
                'Disabling will remove Springbrook connection and Merchant Account ' +
                'information and may result in permanent loss of that data.')) {
                $('#org-enabled-yes').prop('checked', true);
                $('#org-enabled-no').prop('checked', false);
            }
        }, false);
    }
});
function setFeatureState(id, state) {
    var input = $("#" + id);
    var valueChanged = input.val() !== state;
    input.val(state);
    var enableButton = $("#enable-feature-" + id);
    var disableButton = $("#disable-feature-" + id);
    if (state === 'true') {
        enableButton.removeClass(['text-dark']);
        enableButton.addClass(['text-primary', 'cp-button-outlined']);
        enableButton.text('Enabled');
        disableButton.removeClass(['text-danger', 'cp-button-outlined']);
        disableButton.addClass(['text-dark']);
        disableButton.text('Disable');
    }
    else {
        enableButton.removeClass(['text-primary', 'cp-button-outlined']);
        enableButton.addClass(['text-dark']);
        enableButton.text('Enable');
        disableButton.removeClass(['text-dark']);
        disableButton.addClass(['text-danger', 'cp-button-outlined']);
        disableButton.text('Disabled');
    }
    if (valueChanged) {
        $('#save-button').removeClass('disabled');
    }
}
function saveFeatures(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var data, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    data = {
                        features: []
                    };
                    $('input[hidden]').each(function (index, input) {
                        data.features.push({
                            featureId: input.name,
                            isEnabled: input.value === 'true' ? true : false
                        });
                    });
                    return [4 /*yield*/, apiPut(url, data)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        createToast(response.errorMessage);
                    }
                    setElementSubmittingState(button, false);
                    setButtonStateBySelector("#" + button.id, ElementState.Disabled);
                    return [2 /*return*/];
            }
        });
    });
}
function saveIvrSettings(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var data, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    if (!url || url === "") {
                        setElementSubmittingState(button, false);
                        createToast("Failed to update. Please refresh the page and try again.");
                        return [2 /*return*/];
                    }
                    data = {
                        requireCVV2: $('#prompt-cvv2-yes').prop('checked'),
                        requireAVSDwelling: $('#prompt-dwelling-yes').prop('checked'),
                        requireAVSZipCode: $('#prompt-zip-yes').prop('checked'),
                    };
                    return [4 /*yield*/, apiPost(url, data)];
                case 1:
                    result = _a.sent();
                    if (result.isError) {
                        createToast(result.errorMessage);
                    }
                    setElementSubmittingState(button, false);
                    setButtonStateBySelector('#save-button', ElementState.Disabled);
                    return [2 /*return*/];
            }
        });
    });
}
/* Connection */
var RemoteServiceType;
(function (RemoteServiceType) {
    RemoteServiceType["BoomerangWindowsService"] = "BoomerangWindowsService";
    RemoteServiceType["V7IISService"] = "V7IISService";
})(RemoteServiceType || (RemoteServiceType = {}));
function agencyConnectionSettingsChanged(input) {
    var form = getFormForInput(input);
    if (form) {
        form.onFieldChanged();
    }
    showHideSelector('#connection-type-validation-message', false);
    var showApiFields = false;
    switch (input.value) {
        case RemoteServiceType.BoomerangWindowsService:
            showApiFields = false;
            $('input[name="InstanceName"]').val('');
            $('input[name="SlotNumber"]').val('');
            $('input[name="ApiKey"]').val('');
            break;
        case RemoteServiceType.V7IISService:
            showApiFields = true;
            break;
    }
    showHideSelector('#instance-container', showApiFields);
    showHideSelector('#api-key-container', showApiFields);
    showHideSelector('#connection-test', showApiFields);
    showHideSelector('#connection-success', false);
    showHideSelector('#connection-error', false);
}
/* Setup */
function toggleSetupControls() {
    var option = $("#payment-provider option:selected").text();
    // Display or hide provider key.
    if (option !== "CivicPay") {
        showHideSelector('#provider-key', true);
    }
    else {
        showHideSelector('#provider-key', false);
    }
    // display or hide the civicpay org id and payFactory toggle.
    if (option === "CivicPay" || option === "Transitional") {
        showHideSelector('#civicpay-org-id', true);
        showHideSelector('#payfactory-enabled', true);
    }
    else {
        showHideSelector('#civicpay-org-id', false);
        showHideSelector('#payfactory-enabled', false);
    }
}
function testConnection(input, url) {
    return __awaiter(this, void 0, void 0, function () {
        var serverAddress, serverPort, connectionType, instanceName, slotNumber, apiKey, emptyFields, emptyFieldsString, i, message, model, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(input, true);
                    showHideSelector('#saved-connection-error', false);
                    showHideSelector('#connection-error', false);
                    showHideSelector('#connection-success', false);
                    serverAddress = $("#ServerAddress").val().toString();
                    serverPort = parseInt($("#ServerPort").val().toString());
                    connectionType = $('input[name="ConnectionType"]:checked').val().toString();
                    instanceName = $("#InstanceName").val().toString();
                    slotNumber = parseInt($("#SlotNumber").val().toString());
                    apiKey = $("#ApiKey").val().toString();
                    emptyFields = [];
                    if (serverAddress === null || serverAddress.length === 0)
                        emptyFields.push('Server Address');
                    if (isNaN(serverPort))
                        emptyFields.push('Server Port');
                    if (connectionType === null || connectionType.length === 0)
                        emptyFields.push('Connection Type');
                    if (isNaN(slotNumber))
                        emptyFields.push('Slot Number');
                    emptyFieldsString = '';
                    for (i = 0; i < emptyFields.length; ++i) {
                        emptyFieldsString += emptyFields[i] + ', ';
                    }
                    if (emptyFieldsString.length > 0) {
                        showHideSelector('#connection-error', true);
                        message = "The following fields are required to run a connection test: " + emptyFieldsString;
                        message = message.slice(0, message.length - 2);
                        $('#connection-error-message').text(message);
                        setElementSubmittingState(input, false);
                        return [2 /*return*/];
                    }
                    model = {
                        ServerAddress: serverAddress,
                        ServerPort: serverPort,
                        ConnectionType: connectionType,
                        InstanceName: instanceName,
                        SlotNumber: slotNumber,
                        ApiKey: apiKey,
                        TestConnectionWithApiKey: false
                    };
                    return [4 /*yield*/, apiPost(url, model)];
                case 1:
                    result = _a.sent();
                    if (result.isError) {
                        showHideSelector('#connection-error', true);
                        $('#connection-error-message').text(result.errorMessage);
                    }
                    else {
                        showHideSelector('#connection-success', true);
                    }
                    setElementSubmittingState(input, false);
                    return [2 /*return*/];
            }
        });
    });
}
function addRow() {
    var counter = $('#bluefin-account-table tr').length - 1;
    $('#bluefin-account-table').append("\n        <tr>\n            <td>\n                <input autocomplete=\"off\" class=\"text-box single-line\" data-cpo-field=\"true\" id=\"BluefinAccounts_" + counter + "__BluefinAccountId\" \n                    name=\"BluefinAccounts[" + counter + "].BluefinAccountId\" type=\"text\">\n            </td>\n            <td>\n                <input autocomplete=\"off\" class=\"text-box single-line\" data-cpo-field=\"true\" \n                    id=\"BluefinAccounts_" + counter + "__BluefinApiKey\" name=\"BluefinAccounts[" + counter + "].BluefinApiKey\" type=\"password\">\n            </td>\n            <td>\n                <input autocomplete=\"off\" class=\"text-box single-line\" data-cpo-field=\"true\" id=\"BluefinAccounts_" + counter + "__ProcessorId\" \n                    name=\"BluefinAccounts[" + counter + "].ProcessorId\" type=\"text\">\n            </td>\n            <td>\n                <div class=\"cp-input-field w-100\">\n                    <select id=\"BluefinAccounts_" + counter + "__AccountType\" name=\"BluefinAccounts[" + counter + "].AccountType\" data-cpo-field=\"true\">\n                        <option selected value=\"0\">Utility</option>\n                        <option value=\"1\">PayPad</option>\n                        <option value=\"2\">Municipal</option>\n                    </select>\n                    <i class=\"fas fa-caret-down cp-dropdown-icon mb-2\"></i>\n                </div>\n            </td>\n            <td>\n                <span class=\"cp-button text-danger\" title=\"Delete\" onclick=\"deleteRow(this)\" style=\"cursor:pointer;\">\n                    <span class=\"fas fa-times pr-md-2\"></span>\n                    <span class=\"d-none d-md-inline\">Delete</span>\n                </span>\n            </td>\n        </tr>");
    cpoForms[0].onFieldChanged();
}
function deleteRow(button) {
    if (!confirm('Are you sure you want to delete this Bluefin account?'))
        return;
    $(button).closest('tr').remove();
    if ($('#bluefin-account-table tr').length > 1) {
        $('#bluefin-account-table tr').not(":first").each(function (counter, this_row) {
            var row = $(this_row);
            row.find('input[name$=".BluefinAccountId"]').attr('name', "BluefinAccounts[" + counter + "].BluefinAccountId");
            row.find('input[name$=".BluefinAccountId"]').attr('id', "BluefinAccounts_" + counter + "__BluefinAccountId");
            row.find('input[name$=".BluefinApiKey"]').attr('name', "BluefinAccounts[" + counter + "].BluefinApiKey");
            row.find('input[name$=".BluefinApiKey"]').attr('id', "BluefinAccounts_" + counter + "__BluefinApiKey");
            row.find('input[name$=".ProcessorId"]').attr('name', "BluefinAccounts[" + counter + "].ProcessorId");
            row.find('input[name$=".ProcessorId"]').attr('id', "BluefinAccounts_" + counter + "__ProcessorId");
            row.find('select[name$=".AccountType"]').attr('name', "BluefinAccounts[" + counter + "].AccountType");
            row.find('select[name$=".AccountType"]').attr('id', "BluefinAccounts_" + counter + "__AccountType");
        });
    }
    cpoForms[0].onFieldChanged();
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function copyPromoHtmlButtonClicked(element, text) {
    var textarea = $(element).siblings('textarea');
    if (textarea) {
        $(textarea).select();
        document.execCommand('copy');
        createToast("Copied '" + text + "' button HTML");
    }
}
function setAgencyBannerLogo(event, form, url) {
    return __awaiter(this, void 0, void 0, function () {
        var response, image, imageUrl;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, submitAjaxFileUpload(event, form, url, 'PUT')];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        image = $('#logo-image');
                        imageUrl = image.attr('src');
                        if (imageUrl.indexOf('?') > 0) {
                            imageUrl = imageUrl.substr(0, imageUrl.indexOf('?'));
                        }
                        image.attr('src', imageUrl + "?v=" + new Date().valueOf());
                        showHideElement(image, true);
                        showHideSelector('#logo-placeholder', false);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
;
$(document).ready(function () {
    if (isAtUrl('secure/admin/agency/maintenancewindows')) {
        var emailFailedPattern = new RegExp('(&*emailFailed=)true|false|True|False', 'g');
        var searchMatches = window.location.search.match(emailFailedPattern);
        var emailFailed = (searchMatches !== null && searchMatches.length > 0) ? searchMatches[0].trim() : null;
        if (emailFailed) {
            if (emailFailed.match('true|True')) {
                createToast("Failed to send email after creating maintenance window");
            }
            var newUrl = window.location.href.split('?')[0] + window.location.search.replace("emailFailed=" + searchMatches, '');
            history.replaceState({}, "CivicPay Online - Maintenance", newUrl);
        }
        // Default the Start Time to midnight if one isn't provided
        var startTime = $("#create-window-start-time");
        var startNowtoggle = document.getElementById('SetStartOnSave');
        if (startNowtoggle != null && startTime.length) {
            if (startTime.val() == "" &&
                !startNowtoggle.checked) {
                startTime.val("00:00");
            }
        }
    }
});
function onStartNowToggle() {
    var toggle = document.getElementById('SetStartOnSave').checked;
    var startDate = $('#create-window-start-date');
    var startTime = $('#create-window-start-time');
    if (toggle === true) {
        startDate.prop("disabled", true);
        startDate.val("");
        startTime.prop("disabled", true);
        startTime.val("");
    }
    else {
        startDate.prop("disabled", false);
        startTime.prop("disabled", false);
    }
}
function onOpenDurationToggle() {
    var toggle = document.getElementById('AllowOpenEndedTimeSpan').checked;
    var duration = $("#duration-hours");
    if (toggle === true) {
        duration.val("");
        duration.parent().removeClass("active");
        duration.prop("disabled", true);
    }
    else {
        duration.prop("disabled", false);
    }
}
/* Agency Maintenance Window Modal Population */
/**
 * Populates the confirmation for both the Complete and Cancel modals
 * on the Maintenance Window page based on the given target element.
 * Looks for IDs that are specific to the Modal.
 * @param {any} target the data row to be used for populating the modal
 * */
function populateMaintenanceConfirm(target) {
    var status = target.dataset.status;
    if (status === "Scheduled") {
        updateInnerIfExists("cancel-modal-start", target.dataset.start);
        $('#modal-cancel-form').attr('action', target.dataset.url);
        $('#cancel-void-input').val('true');
        $('#cancel-stop-input').val(null);
        $('#cancel-cancellation-token-input').val(target.dataset.cancellationToken);
    }
    if (status === "In Progress") {
        updateInnerIfExists("complete-modal-start", target.dataset.start);
        $('#modal-complete-form').attr('action', target.dataset.url);
        $('#complete-void-input').val('false');
        $('#complete-stop-input').val(new Date(Date.now()).toISOString());
        $('#complete-cancellation-token-input').val(target.dataset.cancellationToken);
    }
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(function () {
    if (isAtUrl('/secure/admin/agency/payer')) {
        updateSecurityRating();
    }
    if (isAtUrl('/secure/admin/agency/billtypes')) {
        setAvailableBillTypes();
    }
    if (!isAtUrl('secure/admin/transition')) {
        var oldValue_1 = $("#max-days").val();
        $(document).on('change', "#max-days", function () {
            if (confirmation('max-days', false)) {
                oldValue_1 = $("#max-days").val();
            }
            else {
                $("#max-days").val(oldValue_1);
            }
        });
    }
});
function setActiveSecurityRating(active) {
    var selector = '#rating-' + active;
    showHideSelector('#rating-too-few', false);
    showHideSelector('#rating-strong', false);
    showHideSelector('#rating-medium', false);
    showHideSelector('#rating-weak', false);
    showHideSelector('#rating-too-many', false);
    showHideSelector(selector, true);
}
;
function updateSecurityRating() {
    var requirementCount = $('#registration-requirements input:radio:checked[id$="-yes"]').length;
    if (requirementCount > 3) {
        setActiveSecurityRating('too-many');
        return false;
    }
    else if (requirementCount > 2) {
        setActiveSecurityRating('strong');
    }
    else if (requirementCount > 1) {
        setActiveSecurityRating('medium');
    }
    else if (requirementCount > 0) {
        setActiveSecurityRating('weak');
    }
    else {
        setActiveSecurityRating('too-few');
        return false;
    }
    return true;
}
;
function agencyPayerSettingsChanged(input) {
    var valid = updateSecurityRating();
    var quickPayReq = $('#QuickPayReq').val();
    // Validation
    if (!valid || quickPayReq > 2 || quickPayReq < 1) {
        setButtonStateBySelector('#submit-button', ElementState.Disabled);
        return;
    }
    var form = getFormForInput(input);
    if (form) {
        form.onFieldChanged();
    }
}
function saveAgencyBillTypes(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var model, defaultServiceNumber, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    model = {
                        billTypes: Array(),
                        defaultServiceNumber: String()
                    };
                    defaultServiceNumber = "0";
                    if ($('#dropdown-default-service').val() != null) {
                        defaultServiceNumber = $('#dropdown-default-service').val().toString();
                    }
                    ;
                    $('#services-container input').each(function (_, element) {
                        var jElement = $(element);
                        var currentService = jElement.attr('name').toString();
                        if (currentService === defaultServiceNumber) {
                            model.defaultServiceNumber = currentService;
                        }
                        model.billTypes.push({
                            serviceNumber: jElement.attr('name'),
                            selected: jElement.prop('checked')
                        });
                    });
                    return [4 /*yield*/, apiPost(url, model)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        createToast(response.errorMessage);
                    }
                    setElementSubmittingState(button, false);
                    setButtonStateBySelector("#" + button.id, ElementState.Disabled);
                    return [2 /*return*/];
            }
        });
    });
}
function setAvailableBillTypes() {
    var options = $('#dropdown-default-service option[disabled]');
    $(options).each(function () {
        $(this).prop('hidden', true);
    });
}
function updateUsageServiceInputs(input) {
    var thisServiceNumber = $(input).attr('id');
    var serviceDropdown = $("#dropdown-default-service option[value=\"" + thisServiceNumber + "\"]");
    if ($(input).attr('checked') === 'checked') {
        $(input).removeAttr('checked');
        serviceDropdown.attr('disabled', '');
        serviceDropdown.prop('hidden', true);
        if ($('#dropdown-default-service :selected').val() === thisServiceNumber) {
            var dropdown = $('#dropdown-default-service');
            $(serviceDropdown).prop('selected', false);
            $(dropdown).find(':not([disabled])').prop('selected', true);
        }
    }
    else {
        $(input).attr('checked', '');
        serviceDropdown.removeAttr('disabled');
        serviceDropdown.prop('hidden', false);
        if ($('#dropdown-default-service :selected').val() == null) {
            $(serviceDropdown).prop('selected', true);
            $('#dropdown-default-service').parent().addClass('active');
        }
    }
    ;
}
function addAgencyBillAttachment(event, form, url) {
    return __awaiter(this, void 0, void 0, function () {
        var response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, submitAjaxFileUpload(event, form, url)];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        createAgencyBillAttachmentRow(response.value, url);
                        updateBillAttachmentDisplay();
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function createAgencyBillAttachmentRow(attachment, url) {
    var row = document.createElement('tr');
    row.id = "bill-attachment-row-" + attachment.attachmentName;
    var name = document.createElement('td');
    name.classList.add('text-break');
    name.innerText = attachment.attachmentName;
    row.appendChild(name);
    var date = document.createElement('td');
    date.innerText = new Date(attachment.dateChanged).toLocaleString().replace(',', '');
    row.appendChild(date);
    var type = document.createElement('td');
    type.innerText = attachment.type;
    row.appendChild(type);
    var attachmentUrl = url + "/" + attachment.attachmentName;
    var actions = document.createElement('td');
    var downloadButton = document.createElement('button');
    downloadButton.className = 'cp-button text-primary';
    downloadButton.title = 'Download';
    downloadButton.onclick = function () { return downloadPdf(downloadButton, attachment.attachmentName, attachmentUrl); };
    var downloadIcon = document.createElement('span');
    downloadIcon.className = 'fas fa-download pr-md-2';
    downloadButton.appendChild(downloadIcon);
    var downloadSpinner = document.createElement('span');
    downloadSpinner.className = 'd-none spinner-border spinner-border-sm mr-md-2';
    downloadButton.appendChild(downloadSpinner);
    var downloadSpan = document.createElement('Span');
    downloadSpan.className = 'd-none d-md-inline';
    downloadSpan.textContent = 'Download';
    downloadButton.appendChild(downloadSpan);
    actions.appendChild(downloadButton);
    downloadButton.insertAdjacentHTML('afterend', ' ');
    var deleteButton = document.createElement('button');
    deleteButton.className = 'cp-button text-danger';
    deleteButton.title = 'Delete';
    deleteButton.onclick = function () { return deleteAgencyBillAttachment(deleteButton, attachmentUrl); };
    var deleteIcon = document.createElement('span');
    deleteIcon.className = 'fas fa-times pr-md-2';
    deleteButton.appendChild(deleteIcon);
    var deleteSpinner = document.createElement('span');
    deleteSpinner.className = 'd-none spinner-border spinner-border-sm mr-md-2';
    deleteButton.appendChild(deleteSpinner);
    var deleteSpan = document.createElement('Span');
    deleteSpan.className = 'd-none d-md-inline';
    deleteSpan.textContent = 'Delete';
    deleteButton.appendChild(deleteSpan);
    actions.appendChild(deleteButton);
    row.appendChild(actions);
    $('#bill-attachments-table').append(row);
}
function deleteAgencyBillAttachment(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    return [4 /*yield*/, apiDelete(url)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        if (response.status === 404) {
                            $(button.parentElement.parentElement).remove();
                            updateBillAttachmentDisplay();
                        }
                        createToast(response.errorMessage);
                    }
                    else {
                        $(button.parentElement.parentElement).remove();
                        createToast('Attachment deleted');
                        updateBillAttachmentDisplay();
                    }
                    setElementSubmittingState(button, false);
                    return [2 /*return*/];
            }
        });
    });
}
function updateBillAttachmentDisplay() {
    var attachmentCount = $('#bill-attachments-table tr').length;
    var attachmentsExist = attachmentCount > 0;
    showHideSelector('#bill-attachments-noresults-container', !attachmentsExist);
    var selectFile = $('#add-bill-attachment').parent().parent().find('.cp-file-open');
    if (attachmentCount >= 5) {
        selectFile.addClass('disabled');
    }
    else {
        selectFile.removeClass('disabled');
    }
}
function setAgencyBillExample(event, form, url) {
    return __awaiter(this, void 0, void 0, function () {
        var response, image, imageUrl;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, submitAjaxFileUpload(event, form, url, 'PUT')];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        image = $('#example-image');
                        imageUrl = image.attr('src');
                        if (imageUrl.indexOf('?') > 0) {
                            imageUrl = imageUrl.substr(0, imageUrl.indexOf('?'));
                        }
                        image.attr('src', imageUrl + "?v=" + new Date().valueOf());
                        showHideElement(image, true);
                        showHideSelector('#example-placeholder', false);
                        showHideSelector('#remove-button', true);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function removeAgencyBillExample(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    return [4 /*yield*/, apiDelete(url)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        createToast(response.errorMessage);
                    }
                    else {
                        showHideSelector('#example-image', false);
                        showHideSelector('#example-placeholder', true);
                        showHideElement(button, false);
                        createToast('Bill Example removed');
                    }
                    setElementSubmittingState(button, false);
                    return [2 /*return*/];
            }
        });
    });
}
/* Fees */
function acceptServiceFeeTermsChanged(input) {
    var utilityServiceFee = $('#UtilityServiceFee');
    var municipalServiceFee = $('#MunicipalServiceFee');
    var achUtilityServiceFee = $('#AchUtilityServiceFee');
    if (input.checked) {
        InitializeNumberInput(utilityServiceFee);
        if (municipalServiceFee) {
            InitializeNumberInput(municipalServiceFee);
        }
        if (achUtilityServiceFee) {
            InitializeNumberInput(achUtilityServiceFee);
        }
    }
    else {
        DisableNumberInput(utilityServiceFee);
        if (municipalServiceFee) {
            DisableNumberInput(municipalServiceFee);
        }
        if (achUtilityServiceFee) {
            DisableNumberInput(achUtilityServiceFee);
        }
    }
    var form = cpoForms.filter(function (f) { return f.form === input.form; });
    if (form.length > 0) {
        form[0].onFieldChanged();
    }
}
function DisableNumberInput(input) {
    input.val('');
    input.parent().removeClass('active');
    input.attr('disabled', 'disabled');
}
function InitializeNumberInput(input) {
    input.val('0.00');
    input.parent().addClass('active');
    input.removeAttr('disabled');
}
/* Payment Settings */
function enableAutoPayOptions(checked) {
    if (typeof (checked) == "string" || checked) {
        $("#auto-payment-header").removeClass("text-secondary");
        $("#BalanceAfterCommitting").removeAttr("disabled");
        $("#LesserOfBalanceForwardOrCurrent").removeAttr("disabled");
        $("#auto-pay-message").removeAttr("disabled");
    }
    else {
        $("#auto-payment-header").addClass("text-secondary");
        $("#BalanceAfterCommitting").attr("disabled", "disabled");
        $("#LesserOfBalanceForwardOrCurrent").attr("disabled", "disabled");
        $("#auto-pay-message").attr("disabled", "disabled");
    }
}
function enableDateOptions(checked, doNotPrompt) {
    if (doNotPrompt === void 0) { doNotPrompt = false; }
    if (typeof (checked) == "string" || checked) {
        $("#max-days").removeAttr("disabled");
    }
    else if (doNotPrompt || confirmation('DaysPrior', true)) {
        $("#max-days").attr("disabled", "disabled");
    }
}
function setUnenrollmentConfirmation(checked, id, isToggle) {
    if (typeof (checked) != "string" && !checked) {
        confirmation(id, isToggle);
    }
}
function confirmation(id, isToggle) {
    var warning = "The removal of an Auto Pay configuration will trigger un-enrollment for associated payment profiles. The process will run at 7 PM Pacific and will do the following:\nPayment profiles will be un-enrolled from auto pay.\nScheduled Payments will be canceled.\nMembers will be sent an email communication.";
    if (!confirm(warning)) {
        if (isToggle) {
            $("#" + id).prop('checked', true);
        }
        return false;
    }
    return true;
}
/* municipal */
function deleteItem(button, item) {
    if (!confirm("Are you sure you want to delete grouping \"" + item + "\"?"))
        return;
    $(button).closest('li').remove();
    if ($('#group-list li').length > 0) {
        $('#group-list li').each(function (counter, this_row) {
            var row = $(this_row);
            row.find('input[name*="Groupings"]').attr('name', "Groupings[" + counter + "]");
            row.find('input[name*="Groupings"]').attr('id', "Groupings_" + counter + "_");
        });
    }
    cpoForms[0].onFieldChanged();
}
function addGrouping() {
    var groupList = $('#group-list');
    var newGroup = $('#grouping-name').val().toString().replace(/"/g, '&quot;').trim();
    var ampGroup = newGroup.replace(/'/g, '&apos;'); // used for the title and value fields
    var encodedGroup = newGroup.replace(/'/g, '\\\''); // used as a parameter for the delete function cuz of course it's different
    var counter = $('#group-list li').length;
    if (newGroup === '') {
        alert('Please enter a valid group name.');
        return;
    }
    groupList.append("<li class=\"white-background col-lg-4 col-md-6 p-0\">\n                        <div class=\"white-background d-flex justify-content-between align-items-center border-secondary border p-2 m-1\" style=\"border-radius: .25rem;\">\n                            <span data-toggle=\"tooltip\" data-html=\"true\" data-container=\"body\" title='" + ampGroup + "'>\n                                <input autocomplete=\"off\" class=\"border-0 white-background text-dark text-box single-line w-100 text-truncate\" data-cpo-field=\"true\"\n                                    style=\"pointer-events: none\" id=\"Groupings_" + counter + "_\" name=\"Groupings[" + counter + "]\" type=\"text\" value='" + ampGroup + "'>\n                            </span>\n                            <span class=\"cp-button text-danger\" style=\"cursor:pointer; min-width: 89px;\" onclick=\"deleteItem(this, '" + encodedGroup + "')\" title=\"Delete\">\n                                <span class=\"fas fa-times pr-sm-2\"></span>\n                                <span class=\"d-none d-sm-inline\">Delete</span>\n                            </span>\n                        </div>\n                     </li>\n            \n            ");
    $('#grouping-name').prop('value', '');
    cpoForms[0].onFieldChanged();
}
function setTypeCodeProperty(inputElement) {
    var form = getFormForInput(inputElement);
    if (form) {
        form.onFieldChanged();
    }
    if (inputElement) {
        var groupingId = $(inputElement).attr('id');
        var enabledId = groupingId.substr(0, groupingId.indexOf('MunicipalPaymentGrouping')).concat('Enabled');
        var allowAmountEditId = groupingId.substr(0, groupingId.indexOf('MunicipalPaymentGrouping')).concat('AllowAmountEdit');
        var parentRow = $(inputElement).closest('tr');
        var enabledElement = parentRow.find('#'.concat(enabledId));
        var allowAmountEditElement = parentRow.find('#'.concat(allowAmountEditId));
        if (inputElement.value) {
            enabledElement.removeAttr('disabled');
            allowAmountEditElement.removeAttr('disabled');
        }
        else {
            enabledElement.prop('checked', false);
            enabledElement.attr('disabled', 'disabled');
            allowAmountEditElement.prop('checked', false);
            allowAmountEditElement.attr('disabled', 'disabled');
        }
    }
}
function syncTypeCodes(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    // Fire up the submit button swirly balls
                    setElementSubmittingState(button, true);
                    return [4 /*yield*/, apiGet(url)];
                case 1:
                    result = _a.sent();
                    if (result.isError) {
                        $('#last-synced').text(result.errorMessage);
                        $('#last-synced').addClass('text-danger font-weight-bold');
                    }
                    else {
                        location.reload();
                    }
                    setElementSubmittingState(button, false);
                    return [2 /*return*/];
            }
        });
    });
}
function setMiscPayRowState(isCheckedElement) {
    var reqAttachmentsElement = $('#' + isCheckedElement.id.replace('Enabled', 'RequireAttachments'));
    var emailElement = $('#' + isCheckedElement.id.replace('Enabled', 'EmailNotifications'));
    if (isCheckedElement.checked) {
        setInputState(reqAttachmentsElement, ElementState.Enabled);
        setInputState(emailElement, ElementState.Enabled);
    }
    else {
        setInputState(reqAttachmentsElement, ElementState.Disabled);
        setInputState(emailElement, ElementState.Disabled);
        reqAttachmentsElement.prop('checked', false);
        emailElement.val('');
    }
}
function enableOtherAmountToggle(checked) {
    if (typeof (checked) == "string" || checked) {
        $("#DisableOtherPayment-label").addClass("text-secondary");
        var checkBox = $("#DisableOtherPayment");
        checkBox.attr("disabled", "disabled");
        checkBox.prop("checked", "true");
    }
    else {
        $("#DisableOtherPayment-label").removeClass("text-secondary");
        $("#DisableOtherPayment").removeAttr("disabled");
    }
}
;
// Shared functionality for the MPC and Misc Payment flows
function validateEditableAmount(element) {
    var value = element.value;
    var maxAmount = Number(element.max);
    var parent = element.parentElement;
    var errorMessage = parent.parentElement.parentElement.getElementsByClassName('cp-input-error-message')[0];
    // Number fields allow the chacter 'e' for scentific notation but we don't want that.
    if (value.toLowerCase().indexOf('e') >= 0) {
        parent.classList.add('invalid');
        errorMessage.textContent = 'Please enter a numeric value';
        errorMessage.classList.remove('d-none');
        return false;
    }
    if ((value.split('.')[1] || []).length > 2) {
        parent.classList.add('invalid');
        errorMessage.textContent = 'Only 2 decimal places are allowed';
        errorMessage.classList.remove('d-none');
        return false;
    }
    var amount = Number(value);
    if (amount <= 0) {
        parent.classList.add('invalid');
        errorMessage.textContent = 'Minimum of $0.01';
        errorMessage.classList.remove('d-none');
        return false;
    }
    if (maxAmount > 0 && amount > maxAmount) {
        parent.classList.add('invalid');
        errorMessage.textContent = "Maximum of " + CurrencyFormatter.toString(maxAmount);
        errorMessage.classList.remove('d-none');
        return false;
    }
    parent.classList.remove('invalid');
    errorMessage.textContent = '';
    errorMessage.classList.add('d-none');
    return true;
}
function applyFormatting(element) {
    var value = element.value;
    var isValid = !element.parentElement.classList.contains('invalid');
    if (isValid) {
        var amount = Number(value);
        element.value = amount.toFixed(2);
    }
}
function updateTotal(updateAmount, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee, taxAmount) {
    if (taxAmount === void 0) { taxAmount = 0; }
    var subtotal = $('#subtotal')[0];
    var total = $('#total')[0];
    var taxTotal = $('#tax-total')[0];
    var oldTaxes = 0;
    // remove currency string formatting to get back to a parsable number
    var oldSubtotal = CurrencyFormatter.toNumber(subtotal.innerText);
    if (taxTotal) {
        oldTaxes = CurrencyFormatter.toNumber(taxTotal.innerText);
    }
    // recalculate new subtotal / taxes / fees / total
    var newSubtotal = oldSubtotal + updateAmount;
    var newTaxTotal = oldTaxes + taxAmount;
    var newTotal = newSubtotal + flatFee + newTaxTotal;
    if (percentFee > 0) {
        var serviceFee = $('#service-fee')[0];
        var percentAddition = bankersRound(newSubtotal * percentFee);
        var newServiceFee = Number(percentAddition.toFixed(2));
        // If there is any amount and the service fee calculated to 0, set it to the minimum.
        if (newServiceFee == 0 && newSubtotal > 0) {
            newServiceFee = minimumServiceFee;
        }
        serviceFee.innerText = CurrencyFormatter.toString(newServiceFee);
        newTotal += newServiceFee;
    }
    subtotal.innerText = CurrencyFormatter.toString(newSubtotal);
    total.innerText = CurrencyFormatter.toString(newTotal);
    if (taxTotal)
        taxTotal.innerText = CurrencyFormatter.toString(newTaxTotal);
    // validate minimumTotal is hit and max is not exceeded
    if (newSubtotal <= 0 ||
        (minimumTotal > 0 && newSubtotal < minimumTotal) ||
        (maximumTotal > 0 && newSubtotal > maximumTotal)) {
        $('#payment-button').addClass('disabled');
        return false;
    }
    else {
        $('#payment-button').removeClass('disabled');
        return true;
    }
}
function reorderTableRows(table) {
    var remainingRows = table.tBodies[0].getElementsByTagName("tr");
    var _loop_1 = function (i) {
        Array.from(remainingRows[i].getElementsByTagName("input"))
            .forEach(function (e) {
            // The regex values below pull out the prefix and postfix values on either side of the numeric index
            // so we can set a new index value with the same pre/post values.
            e.id = e.id.replace(/(.+_)[0-9]+(__.+)/, function (_, pre, post) { return "" + pre + i + post; });
            e.name = e.name.replace(/(.+\[)[0-9]+(\].+)/, function (_, pre, post) { return "" + pre + i + post; });
        });
    };
    for (var i = 0; i < remainingRows.length; i++) {
        _loop_1(i);
    }
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var INT_MAX_VALUE = 2147483647;
var INT_MIN_VALUE = -2147483647;
var BLUEFIN_AMOUNT_MAX_VALUE = 99999999.99;
var BLUEFIN_AMOUNT_MIN_VALUE = 0;
var MEGABYTE = 1048576;
// This subscribes all buttons with the ID "save-button" to
// the interrupt when navigating away with unsaved changes
window.onbeforeunload = function () {
    var buttonToCheck = '#save-button';
    if ($(buttonToCheck).length && !$(buttonToCheck).hasClass("disabled")) {
        return 'Are you sure you want to leave? Any unsaved changes will be lost.';
    }
};
window.onresize = updateHeightForFooter;
$(function () {
    // Add a refresh upon back button press for agency maintenance pages so unsaved data
    // is not populated in chromium-based browsers
    if (isAtUrl('/secure/admin/agency')) {
        window.onpageshow = function () {
            var perfEntries = performance.getEntriesByType("navigation");
            if (perfEntries &&
                perfEntries.length > 0 &&
                perfEntries[0].toJSON().type === "back_forward") {
                window.location.reload();
            }
        };
    }
    if (isAtUrl('recurring/processingstatus')) {
        var savedRefresh = Number(sessionStorage.getItem("refreshRate"));
        if (!isNaN(savedRefresh) && savedRefresh !== 0) {
            var refreshRate = 5;
            // Only allow the values we've designated
            if (savedRefresh === 15)
                refreshRate = 15;
            $("#time-dropdown").val(refreshRate);
            window.setTimeout(function () { location.reload(true); }, Number(refreshRate) * 60 * 1000);
        }
        else
            $("#time-dropdown").val(0);
    }
    // Reset when navigating away from the page
    else
        sessionStorage.removeItem("refreshRate");
    tryDisplayInternetExplorerBanner();
    // Watch scrolling so pages with a back to top link can show up after passing anchor point 
    var backToTopLink = $('.back-to-top');
    var backToTopAnchor = $('.back-to-top-anchor');
    if (backToTopLink.length && backToTopAnchor.length) {
        $('main').on('scroll', function () {
            if (backToTopAnchor.offset().top <= 0) {
                backToTopLink.fadeIn();
            }
            else
                backToTopLink.fadeOut();
        });
    }
});
function tryDisplayInternetExplorerBanner() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE '); // IE 10 or older
    var trident = ua.indexOf('Trident/'); //IE 11
    if (msie > 0 || trident > 0) {
        toggleElement(".cp-ie-banner", null);
    }
    updateHeightForFooter();
}
var ValidationResult = /** @class */ (function () {
    function ValidationResult(isValid, errorMessage) {
        this.isValid = isValid;
        this.errorMessage = errorMessage;
    }
    ValidationResult.Ok = function () {
        return new ValidationResult(true, "");
    };
    ValidationResult.Err = function (message) {
        return new ValidationResult(false, message);
    };
    return ValidationResult;
}());
function subscribeToOnInput(action) {
    $('input,select,textarea').each(function (_, input) {
        input.oninput = action;
        input.onchange = action;
    });
}
// Allows Popper.js tooltips to be used on any page that uses
// _Layout.cshtml as its Layout and initialize onputs
$(function () {
    var options = {
        sanitize: false,
        sanitizeFn: function (c) { return c; }
    };
    $('[data-toggle="popover"]').popover(options);
    $('[data-copy-id]').each(function (_, element) {
        element.onclick = function (x) {
            var id = $(x.currentTarget).data('copy-id');
            copyElementById(new HtmlId(id));
        };
    });
    //autohides popover after 3 seconds
    $('[data-copy-id]').popover(options).click(function () {
        setTimeout(function () {
            $('[data-copy-id]').popover('hide');
        }, 3000);
    });
    // For browsers (IE) that don't support date types, use
    // the jquery-ui datepicker instead
    var element = document.createElement('input');
    element.setAttribute('type', 'date');
    if (element.type === 'text') {
        $('input[type="date"]').datepicker({ dateFormat: 'yy-mm-dd' });
    }
    // Initialize input labels
    $('input, select, textarea').each(function (_, input) {
        if (input instanceof HTMLInputElement ||
            input instanceof HTMLSelectElement ||
            input instanceof HTMLTextAreaElement) {
            initializeInput(input);
        }
    });
    buildFilters();
});
// Calculates tooltip placement last, after the scroll bar 
// does / does not appear so placement is correct
$(function () {
    $(document.body).tooltip({
        selector: '[data-toggle="tooltip"]',
        container: 'body',
        sanitize: false,
        sanitizeFn: function (content) { return content; }
    });
});
/**
 * Disables a control by ID when the given value is empty.
 * @param {string | HtmlId} id control to disable
 * @param {string} val search filter value
 */
function disableControlWhenEmpty(id, val) {
    HtmlId.coalesce(id).getElement().prop('disabled', (val == ''));
}
function submitFormById(id) {
    var element = HtmlId.coalesce(id).getElement();
    element.submit();
}
/**
 * Calculates the difference in days between two dates.
 * @param {Date} start Start date
 * @param {Date} end End date
 */
function getDateDifferenceInDays(start, end) {
    return (end.getTime() - start.getTime()) / 1000 / 60 / 60 / 24;
}
function setErrorStateById(targetId, message, hideMessage) {
    var wrapperSelector = new HtmlId(targetId + "-wrapper");
    var tooltipSelector = new HtmlId(targetId + "-error-tooltip");
    var messageSelector = new HtmlId(targetId + "-error-message");
    wrapperSelector.getElement().addClass('invalid');
    tooltipSelector.getElement().text(message);
    messageSelector.getElement().text(message);
    if (hideMessage)
        messageSelector.getElement().removeClass('d-none');
}
function setErrorState(target, message, hideMessage) {
    setErrorStateById(new HtmlId(target.id), message, hideMessage);
}
function removeErrorStateById(targetId, hideMessage) {
    var wrapperSelector = new HtmlId(targetId + "-wrapper");
    var tooltipSelector = new HtmlId(targetId + "-error-tooltip");
    var messageSelector = new HtmlId(targetId + "-error-message");
    wrapperSelector.getElement().removeClass('invalid');
    tooltipSelector.getElement().text('');
    messageSelector.getElement().text('');
    if (hideMessage)
        messageSelector.getElement().addClass('d-none');
}
function removeErrorState(target, hideMessage) {
    removeErrorStateById(new HtmlId(target.id), hideMessage);
}
function showHideSelector(selector, show) {
    showHideElement($(selector), show);
}
function showHideElement(element, show) {
    var jElement = $(element);
    if (show) {
        jElement.removeClass('d-none');
    }
    else {
        jElement.addClass('d-none');
    }
}
function updateInput(input) {
    var activeTypes = ['date', 'time'];
    if (input.value || activeTypes.indexOf(input.type) >= 0) {
        input.parentElement.classList.add('active');
    }
    else {
        input.parentElement.classList.remove('active');
    }
}
function initializeInput(input) {
    input.onfocus = function () {
        input.parentElement.classList.add('focus-within');
    };
    // Subscribe to blur to update the input's label
    input.onblur = function (e) {
        if (e.target instanceof HTMLInputElement ||
            e.target instanceof HTMLSelectElement ||
            e.target instanceof HTMLTextAreaElement) {
            updateInput(e.target);
        }
        input.parentElement.classList.remove('focus-within');
    };
    // Ensure initial position is correct
    updateInput(input);
    if (input.type === 'select-one') {
        // Prevent the select from closing
        input.onclick = function (e) { e.stopPropagation(); };
    }
}
function copyElementById(id) {
    var text = HtmlId.coalesce(id).getElement().text();
    var textArea = document.createElement('textarea');
    textArea.value = text;
    document.body.appendChild(textArea);
    try {
        textArea.select();
        document.execCommand('copy');
    }
    finally {
        textArea.remove();
    }
}
function valueIsInteger(stringValue) {
    var value = +stringValue;
    return typeof value === 'number' &&
        isFinite(value) &&
        Math.floor(value) === value;
}
function valueIsPositiveDollarAmount(value) {
    return /^[0-9]*\.?[0-9]{0,2}$/.test(value);
}
function valueIsPositiveNumber(value) {
    return /^[0-9]*\.?[0-9]+$/.test(value);
}
function valueIsSpecified(value) {
    return !!value && value.length > 0;
}
function valueIsValidDate(value) {
    var date = new Date(value);
    return !!date && !!date.valueOf();
}
function valueIsValidDateInRange(value, min, max, dateCanBeNull) {
    if (dateCanBeNull === void 0) { dateCanBeNull = false; }
    // If the date is allowed to be empty and it is, this is acceptable
    if (value === "" && dateCanBeNull)
        return true;
    var date = new Date(value);
    if (!date || !date.valueOf()) {
        return false;
    }
    return date >= min && date <= max;
}
function formatDate(date) {
    return date.getFullYear() + "-" + (date.getMonth() + 1).toString().padStart(2, '0') + "-" + date.getDate().toString().padStart(2, '0');
}
function normalizeTime(inputValue) {
    var timeValue = inputValue.split(':');
    var hoursValue = parseInt(timeValue[0]);
    var minutesValue = parseInt(timeValue[1]);
    if (isNaN(hoursValue) || isNaN(minutesValue)) {
        return undefined;
    }
    return new Date(0, 0, 0, hoursValue, minutesValue);
}
function redirectToLogin() {
    // Encode the current path and query so it can be used as a return URL after login
    var returnUrl = encodeURIComponent("" + window.location.pathname + window.location.search);
    // Remove any prompts before redirecting to the login page to
    // prevent prompting users and allowing them to Cancel the login
    // redirect.  Doing so generally leaves the page in a broken state
    if (window.onbeforeunload) {
        window.onbeforeunload = null;
    }
    // Send the user to login with the return URL
    window.location.href = window.location.origin + "/Login?url=" + returnUrl;
}
function setButtonSubmittingState(buttonId, isSubmitting) {
    var button = HtmlId.coalesce(buttonId).getElement();
    setElementSubmittingState(button, isSubmitting);
}
function setElementSubmittingState(element, isSubmitting) {
    var jElement = $(element);
    var icon = jElement.find('.fas');
    var spinner = jElement.find('.spinner-border');
    if (isSubmitting) {
        jElement.attr('disabled', 'disabled');
        icon.addClass('d-none');
        spinner.removeClass('d-none');
    }
    else {
        jElement.removeAttr('disabled');
        icon.removeClass('d-none');
        spinner.addClass('d-none');
    }
}
var contentTypes = Object.freeze({
    excelSpreadsheetContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    pdfContentType: 'application/pdf',
    csv: 'text/csv'
});
function exportExcelDoc(button, filename, url) {
    downloadFile(button, filename, url, contentTypes.excelSpreadsheetContentType, 'Export failed.  Please refresh the page and try again.');
}
function exportCsvDoc(button, filename, url) {
    downloadFile(button, filename, url, contentTypes.csv, 'Export failed.  Please refresh the page and try again.');
}
function downloadPdf(button, filename, url) {
    downloadFile(button, filename, url, contentTypes.pdfContentType, 'Download failed.  Please refresh the page and try again.');
}
function downloadFile(button, filename, url, expectedContentType, errorMessage) {
    // Fire up the submit button swirly balls
    setElementSubmittingState(button, true);
    // Use fetch if available (most non-IE browsers)
    if (window.fetch) {
        fetch(url, { credentials: 'include' })
            .then(function (response) {
            if (response.status === 403) {
                redirectToLogin();
                return Promise.reject();
            }
            var contentType = response.headers.get("content-type");
            if (response.ok &&
                contentType &&
                contentType.indexOf(expectedContentType) !== -1) {
                return response.blob();
            }
            else {
                return Promise.reject();
            }
        })
            .then(function (blob) { return downloadBlobLocally(button, blob, filename, errorMessage); })
            .catch(function (e) { return handleDownloadError(button, errorMessage); });
    }
    else {
        try {
            var request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                try {
                    if (request.readyState !== 4) {
                        return;
                    }
                    if (request.status === 403) {
                        redirectToLogin();
                    }
                    if (request.status === 200 &&
                        request.response.type === expectedContentType) {
                        downloadBlobLocally(button, request.response, filename, errorMessage);
                    }
                    else {
                        handleDownloadError(button, errorMessage);
                    }
                }
                catch (_a) {
                    handleDownloadError(button, errorMessage);
                }
            };
            request.open('GET', url);
            request.responseType = 'blob';
            request.send();
        }
        catch (_a) {
            handleDownloadError(button, errorMessage);
        }
    }
}
function downloadBlobLocally(submitButton, blob, filename, errorMessage) {
    // Use ms blob handling for IE and Edge
    if (navigator.msSaveOrOpenBlob) {
        var success = navigator.msSaveOrOpenBlob(blob, filename);
        if (!success) {
            handleDownloadError(submitButton, errorMessage);
        }
    }
    else {
        // Create an element for the browser
        var objectUrl = URL.createObjectURL(blob);
        var element = document.createElement('a');
        element.setAttribute('href', objectUrl);
        element.setAttribute('download', filename);
        element.style.display = 'none';
        // Add it to the body to ensure browsers allow it to be clicked
        document.body.appendChild(element);
        element.click();
        document.body.removeChild(element);
        // Clean up
        URL.revokeObjectURL(objectUrl);
    }
    // Reset submit button swirly balls
    setElementSubmittingState(submitButton, false);
}
function handleDownloadError(submitButton, errorMessage) {
    // Display error message
    createToast(errorMessage);
    // Reset submit button swirly balls
    setElementSubmittingState(submitButton, false);
}
function createToast(message) {
    $('#toast').toast('dispose');
    updateInnerHtmlIfExists('toast-message', message);
    $('#toast').toast('show');
}
function updateInnerHtmlIfExists(id, val) {
    var element = document.getElementById(id);
    if (element != null) {
        element.innerText = val;
        if (val === "N/A")
            element.classList.add("text-muted");
        else
            element.classList.remove("text-muted");
    }
}
var ElementState;
(function (ElementState) {
    ElementState[ElementState["Disabled"] = 0] = "Disabled";
    ElementState[ElementState["Enabled"] = 1] = "Enabled";
})(ElementState || (ElementState = {}));
function setButtonStateBySelector(selector, buttonState) {
    setButtonState($(selector), buttonState);
}
function setButtonState(element, buttonState) {
    var jElement = $(element);
    if (buttonState === ElementState.Enabled) {
        jElement.removeClass('disabled');
    }
    else {
        jElement.addClass('disabled');
    }
}
function setInputState(element, inputState) {
    var jElement = $(element);
    if (inputState === ElementState.Enabled) {
        jElement.removeAttr('disabled');
    }
    else {
        jElement.attr('disabled', 'disabled');
    }
}
var AjaxSuccessResponse = /** @class */ (function () {
    function AjaxSuccessResponse(status, value) {
        this.status = status;
        this.value = value;
        this.isError = false;
        this.errorMessage = '';
    }
    return AjaxSuccessResponse;
}());
var AjaxErrorResponse = /** @class */ (function () {
    function AjaxErrorResponse(status, errorMessage) {
        this.status = status;
        this.errorMessage = errorMessage;
        this.isError = true;
        this.value = null;
    }
    return AjaxErrorResponse;
}());
function addAntiForgeryToken(data) {
    if (!data) {
        data = new Object;
    }
    Object.defineProperty(data, "__RequestVerificationToken", {
        value: $('input[name=__RequestVerificationToken]').val(),
        writable: true,
        enumerable: true,
        configurable: true
    });
    return data;
}
function callApi(url, method, data, settings) {
    if (settings === void 0) { settings = {}; }
    return __awaiter(this, void 0, void 0, function () {
        var result, e_1;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    _a.trys.push([0, 2, , 3]);
                    // Override the core properties with the specific values given
                    settings.url = url;
                    settings.method = method;
                    settings.data = (method === POST || method === PUT || method === DELETE)
                        ? addAntiForgeryToken(data)
                        : data;
                    // Handle success response codes
                    settings.success = function (returnedData, _textStatus, response) {
                        if (responseIsHtml(response)) {
                            result = new AjaxErrorResponse(500, unexpectedErrorMessage);
                        }
                        else if (returnedData.result == 'Redirect') {
                            result = new AjaxSuccessResponse(response.status, null);
                            window.location.href = returnedData.url;
                        }
                        else {
                            result = new AjaxSuccessResponse(response.status, response.responseJSON);
                        }
                    };
                    // Handle error response codes
                    settings.error = function (response) {
                        if (response.status === 403) {
                            result = new AjaxErrorResponse(response.status, 'Not authorized');
                            redirectToLogin();
                        }
                        var errorMessage = unexpectedErrorMessage;
                        if (!responseIsHtml(response) &&
                            response.responseJSON &&
                            response.responseJSON.errors &&
                            response.responseJSON.errors.length) {
                            errorMessage = response.responseJSON.errors.toString();
                        }
                        result = new AjaxErrorResponse(response.status, errorMessage);
                    };
                    // Submit the request
                    return [4 /*yield*/, $.ajax(settings)];
                case 1:
                    // Submit the request
                    _a.sent();
                    return [3 /*break*/, 3];
                case 2:
                    e_1 = _a.sent();
                    result = callApiExceptionHandler(e_1);
                    return [3 /*break*/, 3];
                case 3: return [2 /*return*/, result];
            }
        });
    });
}
function callApiExceptionHandler(e) {
    var errorMessage = unexpectedErrorMessage;
    if (e && e.responseJSON && e.responseJSON.errors && e.responseJSON.errors.length) {
        errorMessage = e.responseJSON.errors.toString();
    }
    var status = 500;
    if (e && e.status) {
        status = e.status;
    }
    return new AjaxErrorResponse(status, errorMessage);
}
function getPartialView(url) {
    return __awaiter(this, void 0, void 0, function () {
        var settings, result, e_2, status_1;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    settings = {};
                    _a.label = 1;
                case 1:
                    _a.trys.push([1, 3, , 4]);
                    // Override the core properties with the specific values given
                    settings.url = url;
                    settings.method = GET;
                    // Handle success response codes
                    settings.success = function (response) {
                        result = new AjaxSuccessResponse(response.status, response);
                    };
                    // Handle error response codes
                    settings.error = function (response) {
                        if (response.status === 403) {
                            result = new AjaxErrorResponse(response.status, 'Not authorized');
                            redirectToLogin();
                        }
                        result = new AjaxErrorResponse(response.status, unexpectedErrorMessage);
                    };
                    // Submit the request
                    return [4 /*yield*/, $.ajax(settings)];
                case 2:
                    // Submit the request
                    _a.sent();
                    return [3 /*break*/, 4];
                case 3:
                    e_2 = _a.sent();
                    status_1 = 500;
                    if (e_2 && e_2.status) {
                        status_1 = e_2.status;
                    }
                    result = new AjaxErrorResponse(status_1, unexpectedErrorMessage);
                    return [3 /*break*/, 4];
                case 4: return [2 /*return*/, result];
            }
        });
    });
}
var unexpectedErrorMessage = 'An unexpected error has occurred. Please refresh the page or try again.';
var PUT = "PUT";
var GET = "GET";
var POST = "POST";
var DELETE = "DELETE";
function apiDelete(url, settings) {
    if (settings === void 0) { settings = {}; }
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            return [2 /*return*/, callApi(url, DELETE, null, settings)];
        });
    });
}
function apiGet(url, settings) {
    if (settings === void 0) { settings = {}; }
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            return [2 /*return*/, callApi(url, GET, null, settings)];
        });
    });
}
function apiPost(url, data, settings) {
    if (settings === void 0) { settings = {}; }
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            return [2 /*return*/, callApi(url, POST, data, settings)];
        });
    });
}
function apiPut(url, data, settings) {
    if (settings === void 0) { settings = {}; }
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            return [2 /*return*/, callApi(url, PUT, data, settings)];
        });
    });
}
var htmlResponse = '<!DOCTYPE html';
function responseIsHtml(response) {
    return (typeof response === 'string' && response.trim().substr(0, htmlResponse.length) === htmlResponse) ||
        (response.responseText && typeof response.responseText === 'string' &&
            response.responseText.trim().substr(0, htmlResponse.length) === htmlResponse);
}
function loadPartialView(url, id) {
    return __awaiter(this, void 0, void 0, function () {
        var result, element;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, getPartialView(url)];
                case 1:
                    result = _a.sent();
                    if (result.isError) {
                        createToast(result.errorMessage);
                    }
                    else {
                        element = HtmlId.coalesce(id).getElement()[0];
                        element.innerHTML = result.value;
                    }
                    return [2 /*return*/];
            }
        });
    });
}
var DatabaseResponse;
(function (DatabaseResponse) {
    DatabaseResponse[DatabaseResponse["UpsertSuccess"] = 0] = "UpsertSuccess";
    DatabaseResponse[DatabaseResponse["RemoveSuccess"] = 1] = "RemoveSuccess";
    DatabaseResponse[DatabaseResponse["NothingToDelete"] = 2] = "NothingToDelete";
})(DatabaseResponse || (DatabaseResponse = {}));
function ajaxFileUpload(url, data, method) {
    if (method === void 0) { method = 'POST'; }
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            return [2 /*return*/, callApi(url, method, data, {
                    cache: false,
                    contentType: false,
                    processData: false
                })];
        });
    });
}
function submitAjaxFileUpload(event, form, url, method) {
    if (method === void 0) { method = 'POST'; }
    return __awaiter(this, void 0, void 0, function () {
        var container, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    event.preventDefault();
                    container = $(form).find('.cp-file-select');
                    updateFileSelectDisplay(container, FileSelectState.Submitting);
                    return [4 /*yield*/, ajaxFileUpload(url, new FormData(form), method)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        updateFileSelectDisplay(container, FileSelectState.ValidationError, false, response.errorMessage);
                    }
                    else {
                        updateFileSelectDisplay(container, FileSelectState.FileUploaded);
                    }
                    return [2 /*return*/, response];
            }
        });
    });
}
var filetypeIconImage = 'fa-image';
var filetypeIconFile = 'fa-file';
var filetypeIcons = [filetypeIconFile, filetypeIconImage];
function onFileDialogFileChanged(input, validate, maxFileSize, maxNumber, required, enableButtonNoFiles) {
    if (validate === void 0) { validate = null; }
    if (maxFileSize === void 0) { maxFileSize = 4 * MEGABYTE; }
    if (maxNumber === void 0) { maxNumber = -1; }
    if (required === void 0) { required = false; }
    if (enableButtonNoFiles === void 0) { enableButtonNoFiles = false; }
    var fileSelectContainer = $(input).parent().parent();
    if (validate) {
        var validateResult = validate(input.files, input.accept, maxFileSize, maxNumber, required);
        if (!validateResult.isValid) {
            updateFileSelectDisplay(fileSelectContainer, FileSelectState.ValidationError, enableButtonNoFiles, validateResult.errorMessage);
            return;
        }
    }
    if (input.files.length) {
        updateFileSelectDisplay(fileSelectContainer, FileSelectState.FileSelected, enableButtonNoFiles, null, input.files);
    }
    else {
        updateFileSelectDisplay(fileSelectContainer, FileSelectState.NoFileSelected, enableButtonNoFiles);
    }
}
function getIconForFiletype(filetype) {
    if (filetype.startsWith('image/')) {
        return filetypeIconImage;
    }
    else {
        return filetypeIconFile;
    }
}
var FileSelectState;
(function (FileSelectState) {
    FileSelectState[FileSelectState["NoFileSelected"] = 0] = "NoFileSelected";
    FileSelectState[FileSelectState["ValidationError"] = 1] = "ValidationError";
    FileSelectState[FileSelectState["FileSelected"] = 2] = "FileSelected";
    FileSelectState[FileSelectState["Submitting"] = 3] = "Submitting";
    FileSelectState[FileSelectState["FileUploaded"] = 4] = "FileUploaded";
})(FileSelectState || (FileSelectState = {}));
function updateFileSelectDisplay(container, newState, enableButtonNoFiles, validationMessage, files) {
    if (enableButtonNoFiles === void 0) { enableButtonNoFiles = false; }
    if (validationMessage === void 0) { validationMessage = null; }
    if (files === void 0) { files = null; }
    var fileSelectContainer = $(container);
    var fileError = fileSelectContainer.find('.cp-file-error');
    var fileNoneSelected = fileSelectContainer.find('.cp-file-none');
    var fileSelected = fileSelectContainer.find('.cp-file-selected');
    var fileUploaded = fileSelectContainer.find('.cp-file-uploaded');
    var selectButton = fileSelectContainer.find('.cp-file-open');
    var submitButton = fileSelectContainer.find('button[type="submit"]');
    switch (newState) {
        case FileSelectState.NoFileSelected:
            showHideElement(fileNoneSelected, true);
            [fileError, fileSelected, fileUploaded].forEach(function (jel) {
                showHideElement(jel, false);
            });
            var enabled = enableButtonNoFiles ? ElementState.Enabled : ElementState.Disabled;
            setButtonState(selectButton, ElementState.Enabled);
            setButtonState(submitButton, enabled);
            setElementSubmittingState(submitButton, false);
            break;
        case FileSelectState.ValidationError:
            fileError.find('.cp-file-error-text')
                .text(validationMessage);
            showHideElement(fileError, true);
            [fileNoneSelected, fileSelected, fileUploaded].forEach(function (jel) {
                showHideElement(jel, false);
            });
            setButtonState(selectButton, ElementState.Enabled);
            setButtonState(submitButton, ElementState.Disabled);
            setElementSubmittingState(submitButton, false);
            createToast(validationMessage);
            break;
        case FileSelectState.FileSelected:
            fileSelected.html('');
            var linebreak_1 = files.length === 1 ? '' : '<br />';
            var _loop_1 = function (i) {
                var file = files.item(i);
                fileSelected.html(function (_, oldHtml) {
                    return oldHtml + linebreak_1 +
                        ("<span class=\"fas " + getIconForFiletype(file.type) + " pr-1\"></span>") +
                        ("<span class=\"cp-file-selected-name\">" + file.name + "</span>");
                });
            };
            for (var i = 0; i < files.length; ++i) {
                _loop_1(i);
            }
            showHideElement(fileSelected, true);
            [fileNoneSelected, fileError, fileUploaded].forEach(function (jel) {
                showHideElement(jel, false);
            });
            setButtonState(selectButton, ElementState.Enabled);
            setButtonState(submitButton, ElementState.Enabled);
            setElementSubmittingState(submitButton, false);
            break;
        case FileSelectState.Submitting:
            setButtonState(selectButton, ElementState.Disabled);
            setButtonState(submitButton, ElementState.Disabled);
            setElementSubmittingState(submitButton, true);
            break;
        case FileSelectState.FileUploaded:
            showHideElement(fileUploaded, true);
            [fileError, fileSelected, fileNoneSelected].forEach(function (jel) {
                showHideElement(jel, false);
            });
            setButtonState(selectButton, ElementState.Enabled);
            setButtonState(submitButton, ElementState.Disabled);
            setElementSubmittingState(submitButton, false);
            break;
    }
}
function validateSelectedFiles(files, accept, maxSize, maxNumber, required) {
    var validateAcceptedTypes = !!accept;
    var acceptedTypes = [];
    var acceptedTypesDisplay = '';
    if (validateAcceptedTypes) {
        acceptedTypes = accept.split(',');
        for (var i = 0; i < acceptedTypes.length; i++) {
            acceptedTypes[i] = acceptedTypes[i].trim();
            var display = getAcceptedFiletypeDisplay(acceptedTypes[i]);
            if (acceptedTypesDisplay.length) {
                acceptedTypesDisplay = acceptedTypesDisplay + ", " + display;
            }
            else {
                acceptedTypesDisplay = display;
            }
        }
    }
    if (files.length) {
        if (maxNumber > 0 && files.length > maxNumber)
            return ValidationResult
                .Err("Number of files cannot exceed " + maxNumber);
        for (var i = 0; i < files.length; i++) {
            var file = files.item(i);
            if (file.size > maxSize) {
                return ValidationResult
                    .Err("File cannot be larger than " + maxSize / MEGABYTE + " MB");
            }
            if (validateAcceptedTypes && !validateFiletype(file, acceptedTypes)) {
                if (acceptedTypes.length === 1) {
                    return ValidationResult
                        .Err("File must be a " + acceptedTypesDisplay);
                }
                else {
                    return ValidationResult
                        .Err("File must be one of the following types: " + acceptedTypesDisplay);
                }
            }
        }
    }
    else if (required) {
        return ValidationResult
            .Err("At least one file is required");
    }
    return ValidationResult
        .Ok();
}
function validateFiletype(file, acceptedTypes) {
    // Do not attempt to validate files with no type. Some files represented
    // this way, including GIFs in IE and PS1s in Chrome
    if (!file.type) {
        return true;
    }
    for (var i = 0; i < acceptedTypes.length; i++) {
        var type = acceptedTypes[i];
        // Validate based on extension if specified
        if (type[0] === '.') {
            if (file.name.toLowerCase().endsWith(type)) {
                return true;
            }
        }
        else if (file.type === type) {
            return true;
        }
    }
    return false;
}
function getAcceptedFiletypeDisplay(filetype) {
    if (filetype[0] === '.') {
        return filetype;
    }
    else {
        var parts = filetype.split('/');
        return parts[parts.length - 1].toUpperCase();
    }
}
function toggleElement(element, toggleClass) {
    if (!toggleClass) {
        toggleClass = 'toggled';
    }
    if ($(element).hasClass(toggleClass)) {
        $(element).removeClass(toggleClass);
    }
    else {
        $(element).addClass(toggleClass);
    }
}
function updateHeightForFooter() {
    // The footer is hidden on mobile anonymous screens
    // so here we ensure that it is being displayed
    var footerVisible = $('.fixed-footer').length > 0
        ? getComputedStyle($('.fixed-footer')[0]).display !== "none"
        : false;
    var maintBannerVisible = $('.cp-sitewide-message.toggled').length > 0;
    var ieBannerVisible = $('.cp-ie-banner.toggled').length > 0;
    var anyBannerVisible = maintBannerVisible || ieBannerVisible;
    var mainElement = $('main');
    var mainContentElement = $('#main-content');
    var main = mainElement.length === 0 ? mainContentElement[0] : mainElement[0];
    main.classList.remove("has-banner-and-footer", "has-two-banners-and-footer", "has-banner-only", "has-footer-only");
    if (footerVisible && maintBannerVisible && ieBannerVisible) {
        main.classList.add("has-two-banners-and-footer");
    }
    else if (footerVisible && anyBannerVisible) {
        main.classList.add("has-banner-and-footer");
    }
    else if (footerVisible) {
        main.classList.add("has-footer-only");
    }
    else if (maintBannerVisible && ieBannerVisible) {
        main.classList.add("has-two-banners");
    }
    else if (anyBannerVisible) {
        main.classList.add("has-banner-only");
    }
}
var CurrencyFormatter = /** @class */ (function () {
    function CurrencyFormatter() {
    }
    CurrencyFormatter.toNumber = function (currencyString) {
        if (!currencyString)
            return 0;
        var strippedString = currencyString
            .replace(RegExp(/[^0-9.-]/g), '');
        if (strippedString && strippedString.length > 0) {
            return Number(strippedString);
        }
        return 0;
    };
    CurrencyFormatter.toString = function (currency) {
        var currencyFormatter = new Intl.NumberFormat('en-US', {
            style: 'currency',
            currency: 'USD'
        });
        return currencyFormatter.format(currency);
    };
    return CurrencyFormatter;
}());
function bankersRound(num) {
    var scaledNum = num * 100;
    var scaledRound = Math.round(scaledNum);
    // needs banker's round if has 0.5 remainder and is odd
    var needsBankersRound = (Math.abs(scaledNum) % 1 === 0.5) && (scaledRound % 2 !== 0);
    var bankersRoundNum = needsBankersRound ? scaledRound - 1 : scaledRound;
    return bankersRoundNum / 100;
}
function expandAll() {
    $('.expand-item').each(function (index, item) {
        if ($(item).attr('aria-expanded') === "false") {
            $(item).trigger('click');
        }
    });
}
function preventFormSubmissionOnEnter(event) {
    if (event.key === 'Enter') {
        event.preventDefault();
        return false;
    }
}
function minuteRefreshInterval(select) {
    var selectedValue = select.options[select.selectedIndex].value;
    if (selectedValue === '0') {
        sessionStorage.removeItem("refreshRate");
        return;
    }
    sessionStorage.setItem("refreshRate", selectedValue);
    window.setTimeout(function () { location.reload(true); }, MinutesToMilliseconds(Number(selectedValue)));
}
function MinutesToMilliseconds(minutes) {
    return minutes * 60 * 1000;
}
function isAtUrl(url) {
    return window.location.pathname.toLowerCase().indexOf(url) >= 0;
}
;
$(document).ready(function () {
    var parentLogos = $('#credit-card-logos-container');
    if (parentLogos != null) {
        var creditCardNumberField_1 = $('#CreditCardInfo_CreditCardNumber').get(0);
        var patterns_1 = new Map();
        patterns_1.set('visa', /^(?:4[0-9]{12}(?:[0-9]{3})?)$/);
        patterns_1.set('masterCard', /^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/);
        patterns_1.set('americanExpress', /^(?:3[47][0-9]{13})$/);
        patterns_1.set('discover', /^(?:6(?:011|5[0-9][0-9])[0-9]{12})$/);
        if (creditCardNumberField_1) {
            ['keyup', 'change'].forEach(function (eventName) {
                creditCardNumberField_1.addEventListener(eventName, function (e) {
                    validateCreditCard(creditCardNumberField_1.value, parentLogos, patterns_1);
                });
            });
            validateCreditCard(creditCardNumberField_1.value, parentLogos, patterns_1);
        }
    }
    if (isAtUrl('municipalpayments/purchase')) {
        // Adding callback for recaptcha response
        var recaptchaWidget = $('.g-recaptcha');
        if (recaptchaWidget) {
            recaptchaWidget.attr('data-callback', 'setCreditCardProperty');
        }
    }
});
function validateCreditCard(target, parentLogos, patterns) {
    parentLogos.find('img').removeClass('logo-selected');
    if (target) {
        var ccNum = target.replace(/\s/g, '');
        var visaPattern = patterns.get('visa');
        var mastPattern = patterns.get('masterCard');
        var amexPattern = patterns.get('americanExpress');
        var discPattern = patterns.get('discover');
        var isVisa = visaPattern.test(ccNum);
        var isMast = mastPattern.test(ccNum);
        var isAmex = amexPattern.test(ccNum);
        var isDisc = discPattern.test(ccNum);
        if (isVisa || isMast || isAmex || isDisc) {
            // at least one regex matches, so the card number is valid.
            $(target).removeClass('is-invalid');
            if (isVisa) {
                parentLogos.find('img[title="Visa"]').addClass('logo-selected');
            }
            else if (isMast) {
                parentLogos.find('img[title="Mastercard"]').addClass('logo-selected');
            }
            else if (isAmex) {
                parentLogos.find('img[title="American Express"]').addClass('logo-selected');
            }
            else if (isDisc) {
                parentLogos.find('img[title="Discover"]').addClass('logo-selected');
            }
        }
        else {
            parentLogos.find('img').removeClass('logo-selected');
        }
    }
}
function setCreditCardProperty(inputElement) {
    if (inputElement.type) {
        var form = getFormForInput(inputElement);
        if (form) {
            form.onFieldChanged();
        }
    }
    else {
        var element = document.getElementById('RecaptchaInput');
        if (element) {
            getFormForInput(element).onFieldChanged();
        }
    }
}
;
$(window).on('resize load', function () {
    if ($(this).width() < 768) {
        $("#billDetailsHeader").addClass("collapsed");
        $("#billDetailsHeader").removeAttr("aria-expanded");
        $("#billDetailsCollapse").removeClass("show");
        $("#accountInfoHeader").addClass("collapsed");
        $("#accountInfoHeader").removeAttr("aria-expanded");
        $("#accountInfoCollapse").removeClass("show");
        $("#agencyInfoHeader").addClass("collapsed");
        $("#agencyInfoHeader").removeAttr("aria-expanded");
        $("#agencyInfoCollapse").removeClass("show");
    }
    else {
        $("#billDetailsHeader").removeClass("collapsed");
        $("#billDetailsHeader").attr("aria-expanded", "true");
        $("#billDetailsCollapse").addClass("show");
        $("#accountInfoHeader").removeClass("collapsed");
        $("#accountInfoHeader").attr("aria-expanded", "true");
        $("#accountInfoCollapse").addClass("show");
        $("#agencyInfoHeader").removeClass("collapsed");
        $("#agencyInfoHeader").attr("aria-expanded", "true");
        $("#agencyInfoCollapse").addClass("show");
    }
});
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(function () {
    // Set email verification modal to reload the page on close if it exists.
    var emailVerificationModal = $('#email-verification-sent-modal');
    if (emailVerificationModal.length > 0) {
        emailVerificationModal.on('hidden.bs.modal', function () {
            location.reload();
        });
    }
});
/**
 * Populates the Scheduled Payment confirmation modal with information
 * about the upcoming payment.
 * Looks for IDs that are specific to the modal.
 * @param {HTMLElement} target the element used to populate the modal.
 */
function populateScheduledPaymentModal(target) {
    $('#sp-cancel-date').text(target.dataset.paymentDate);
    $('#sp-cancel-amount').text(target.dataset.amount);
    $('#sp-cancel-payment-id-input').val(target.dataset.paymentId);
}
/**
 * Populates the Payment Confirmation modal with information
 * about the upcoming payment.
 * Looks for IDs that are specific to the modal.
 * @param {HTMLElement} target the element used to populate the modal.
 */
function populateAutoPayConfirmModal(target) {
    $('#auto-pay-date').text(target.dataset.paymentDate);
    $('#auto-pay-amount').text(target.dataset.amount);
    // If the agency does not use PayFactory this message
    // will be empty, ensure we only add it when appropriate.
    if (target.dataset.feeMessage) {
        $('#auto-pay-fee-message').text(" - " + target.dataset.feeMessage);
    }
}
function populateEmailVerificationConfirmationModal(target) {
    $('#verification-email-address').text(target.dataset.verificationEmailAddress);
}
function sendEmailVerification(url, target) {
    return __awaiter(this, void 0, void 0, function () {
        var response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0: return [4 /*yield*/, apiPost(url, null)];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        populateEmailVerificationConfirmationModal(target);
                        $("#email-verification-sent-modal").modal("show");
                    }
                    else {
                        createToast(response.errorMessage);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function confirmDeletePaymentMethod(formId, prompt) {
    return __awaiter(this, void 0, void 0, function () {
        var form;
        return __generator(this, function (_a) {
            if (confirm(prompt)) {
                form = $("#" + formId);
                form.trigger('submit');
            }
            return [2 /*return*/];
        });
    });
}
function confirmRemoveAccount(formId, target) {
    return __awaiter(this, void 0, void 0, function () {
        var row, accountNumber, form;
        return __generator(this, function (_a) {
            row = target.closest('tr');
            accountNumber = row.cells[0].innerText;
            if (confirm("Are you sure you want to remove account " + accountNumber + "?")) {
                form = $("#" + formId);
                form.trigger('submit');
            }
            return [2 /*return*/];
        });
    });
}
function showOptions(showAutoPay) {
    if (showAutoPay) {
        $('#auto-pay-options').removeClass('d-none');
        window.scrollTo(0, $('#autopay').offset().top);
    }
    else {
        $('#auto-pay-options').addClass('d-none');
    }
}
function changeAccountType() {
    resetAutoPay();
    if ($('#credit').prop('checked')) {
        $('#checking-account-information').addClass("d-none");
        $('#credit-information').removeClass("d-none");
    }
    else {
        $('#checking-account-information').removeClass("d-none");
        $('#credit-information').addClass("d-none");
    }
}
function changePaymentType(useExisting) {
    var savePaymentInput = $('#save-payment')[0];
    resetAutoPay();
    if (useExisting) {
        $('#new-method').addClass('d-none');
        $('#new-method-type').addClass('d-none');
        $('#existing-method').removeClass('d-none');
        savePaymentInput.checked = false;
        savePaymentInput.disabled = true;
    }
    else {
        $('#new-method').removeClass('d-none');
        $('#new-method-type').removeClass('d-none');
        $('#existing-method').addClass('d-none');
        savePaymentInput.disabled = false;
    }
    displayDescription();
}
function displayDescription() {
    if ($('#save-payment').prop('checked')) {
        $('#description').removeClass('d-none');
    }
    else {
        $('#description').addClass('d-none');
    }
}
function enableDateDays(checked) {
    if (typeof (checked) == "string" || checked) {
        $("#DaysBeforeDueDate").removeAttr("disabled");
    }
    else {
        $("#DaysBeforeDueDate").attr("disabled", "disabled");
    }
}
function changeAccount(url, value) {
    return __awaiter(this, void 0, void 0, function () {
        var data, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    data = { identityId: value.value };
                    return [4 /*yield*/, apiPost(url, data)];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        window.location.href = '/secure/Home';
                    }
                    else {
                        createToast(response.errorMessage);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function dismissSuccessErrorBanner(element) {
    $(element).closest('div').remove();
}
function useSafetyLimitChanged(input) {
    var safetyLimit = $('#SafetyLimit');
    if (input.checked) {
        InitializeNumberInput(safetyLimit);
    }
    else {
        DisableNumberInput(safetyLimit);
    }
    var form = cpoForms.filter(function (f) { return f.form === input.form; });
    if (form.length > 0) {
        form[0].onFieldChanged();
    }
}
;
/* Detail Modal Population */
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var notApplicable = 'N/A';
/**
 * Populates the Details Modal on the Payments List and
 * Settlements List pages based on the given target element.
 * Looks for IDs that are specific to the Modal.
 * @param {any} target the data row to be used for populating the modal
 * */
function populateDetailsModal(target, tranTypeLabel) {
    if (tranTypeLabel === void 0) { tranTypeLabel = "Payment"; }
    var refundType = "Refund";
    // Populate data
    updateInnerIfExists("ModalPaymentId", target.dataset.paymentId);
    updateInnerIfExists("ModalName", target.dataset.name);
    updateInnerIfExists("ModalAmount", target.dataset.amount);
    updateInnerIfExists("ModalLast4", target.dataset.last4);
    updateInnerIfExists("ModalPaymentDate", target.dataset.paymentDate);
    updateInnerIfExists("ModalCardExpirationDate", target.dataset.cardExpirationDate);
    updateInnerIfExists("ModalStatus", target.dataset.status);
    updateInnerIfExists("ModalReference", target.dataset.reference);
    updateInnerIfExists("ModalLogin", target.dataset.login);
    $('#ModalLogin').attr('title', target.dataset.login ? target.dataset.login : notApplicable);
    updateInnerIfExists("ModalSource", target.dataset.source);
    updateInnerIfExists("ModalSBLookup", target.dataset.sbLookup);
    updateInnerIfExists("ModalRefundDate", target.dataset.refundDate);
    updateInnerIfExists("ModalRefundSettlement", target.dataset.refundSettlement);
    updateInnerIfExists("ModalAccountType", target.dataset.accountType);
    updateInnerIfExists("ModalAuthNetworkResponse", target.dataset.authNetworkResponse);
    updateInnerIfExists("ModalSettlementDate", target.dataset.paymentSettlementDate);
    updateInnerIfExists("ModalSubmissionSource", target.dataset.submissionSource);
    // populate reversal button
    $('#reversal-button').attr('data-reversal-payment-id', target.dataset.paymentId);
    $('#reversal-button').attr('data-reversal-account-type', target.dataset.accountType);
    $('#reversal-button').attr('data-reversal-amount', target.dataset.amount);
    $('#reversal-button').attr('data-reversal-customer-name', target.dataset.name);
    setReversalButtonState(target.dataset.reversibleStatus);
    // populate email receipt button
    $('#email-receipt-button').attr('data-email-payment-id', target.dataset.paymentId);
    $('#email-receipt-button').attr('data-email-account-type', target.dataset.accountType);
    $('#email-receipt-button').attr('data-email-login', target.dataset.login);
    setAmountsVisibility(target.dataset.accountType, target.dataset.showFees.toLowerCase() === 'true', target.dataset.feeAmount, target.dataset.billAmount);
    if (target.dataset.paymentTypeMessage === "ACH") {
        setAchDetailsControls();
        updateInnerIfExists("ModalAchReturnCode", target.dataset.achReturnCode);
        updateInnerIfExists("ModalAchReturnDate", target.dataset.achReturnDate);
    }
    else {
        setCardDetailsControls();
        updateInnerIfExists("ModalAvsResponse", target.dataset.avsResponse);
        updateInnerIfExists("ModalAvsAddress", target.dataset.avsAddress);
        updateInnerIfExists("ModalAvsZip", target.dataset.avsZip);
    }
    var status = target.dataset.status.toLowerCase();
    if (status !== "failed" && status !== "ach declined" && status !== "unknown" && tranTypeLabel !== refundType) {
        $("#receipt-button").attr("href", target.dataset.receiptLink);
        $("#receipt-button").removeClass("disabled");
        $("#email-receipt-button").removeClass("disabled");
    }
    else {
        $("#receipt-button").addClass("disabled");
        $("#email-receipt-button").addClass("disabled");
    }
    applyBadgeColoring(target.dataset.status, [], ["Settled"], ["Failed", "Canceled", "Returned", "Late Returned"]);
    updatePaymentTypeImage(target.dataset.paymentTypeMessage, target.dataset.paymentTypeIcon);
    updateInnerIfExists("modal-title-activity-type", tranTypeLabel);
    if (tranTypeLabel === refundType) {
        updateInnerIfExists("modal-refund-date-label", "Payment Date");
        updateInnerIfExists("modal-refund-settlement-label", "Payment Settlement");
        updateInnerIfExists("modal-settlement-date-label", "Refund Settlement Date:");
    }
    else {
        updateInnerIfExists("modal-refund-date-label", "Refund Date");
        updateInnerIfExists("modal-refund-settlement-label", "Refund Settlement");
        updateInnerIfExists("modal-settlement-date-label", "Settlement Date:");
    }
}
/**
 * Populates the Details Modal on the Recurring Batch page
 * based on the given target element.
 * Looks for IDs that are specific to the Modal.
 * @param {any} target the data row to be used for populating the modal
 * */
function populateRecurringDetailsModal(target) {
    // Populate data
    updateInnerIfExists("ModalBatch", target.dataset.batch);
    updateInnerIfExists("ModalCreatedDate", target.dataset.createdDate);
    updateInnerIfExists("ModalType", target.dataset.type);
    updateInnerIfExists("ModalPaymentCount", target.dataset.paymentCount);
    updateInnerIfExists("ModalAmountDue", target.dataset.amountDue);
    updateInnerIfExists("ModalAmountToPay", target.dataset.amountToPay);
    updateInnerIfExists("ModalApproved", target.dataset.approved);
    updateInnerIfExists("ModalDeclined", target.dataset.declined);
    updateInnerIfExists("ModalErrored", target.dataset.errored);
    updateInnerIfExists("ModalCreatedBy", target.dataset.createdBy);
    updateInnerIfExists("ModalQueuedTime", target.dataset.queuedTime);
    updateInnerIfExists("ModalProcessingTime", target.dataset.processingTime);
    updateInnerIfExists("ModalStatus", target.dataset.status);
    if (target.dataset.statusError !== "") {
        updateInnerIfExists("ModalStatusError", target.dataset.statusError);
        $('#ModalStatusError').parent().removeClass('d-none');
    }
    else {
        updateInnerIfExists("ModalStatusError", '');
        $('#ModalStatusError').parent().addClass('d-none');
    }
    applyBadgeColoring(target.dataset.status, ["Processing"], ["New", "Done", "Closed"], ["Error"]);
    // Display correct buttons
    var processButton = $('#ProcessButton');
    var finishButton = $('#FinishButton');
    var editButton = $('#EditButton');
    var exportDiv = $('#ExportButtons');
    var deleteButton = $('#DeleteButton');
    if (target.dataset.process === 'True') {
        processButton.removeAttr('disabled');
        processButton.removeClass('d-none');
        $('#process-batch-id').val(target.dataset.batchId);
    }
    else {
        processButton.attr('disabled', "true");
        processButton.addClass('d-none');
        processButton.removeAttr('onclick');
        $('#process-batch-id').val(0);
    }
    if (target.dataset.finish === 'True') {
        finishButton.removeAttr('disabled');
        finishButton.removeClass('d-none');
        $('#batchId').val(target.dataset.batchId);
    }
    else {
        finishButton.attr('disabled', "true");
        finishButton.addClass('d-none');
        $('#batchId').val(0);
    }
    if (target.dataset.edit === 'True') {
        editButton.removeAttr('disabled');
        editButton.removeClass('d-none');
        editButton.attr('href', "" + target.dataset.editLink);
    }
    else {
        editButton.attr('disabled', "true");
        editButton.addClass('d-none');
        editButton.removeAttr('href');
    }
    if (target.dataset.delete === 'True') {
        deleteButton.removeAttr('disabled');
        deleteButton.removeClass('d-none');
        $('#delete-batch-id').val(target.dataset.batchId);
    }
    else {
        deleteButton.attr('disabled', "true");
        deleteButton.addClass('d-none');
        $('#delete-batch-id').val(0);
    }
    if (target.dataset.exports === 'True') {
        exportDiv.removeClass('d-none');
        $('#springbrook-export-button').attr('href', target.dataset.exportLink);
        $('#payment-report-link').attr('href', target.dataset.reportLink);
    }
    else {
        exportDiv.addClass('d-none');
        $('#springbrook-export-button').attr('href', '#');
        $('#payment-report-link').removeAttr('href');
    }
}
function setAchDetailsControls() {
    hideElementIfExists("ModalAvsResponse");
    hideElementIfExists("ModalAvsResponseLabel");
    hideElementIfExists("ModalAvsAddress");
    hideElementIfExists("ModalAvsAddressLabel");
    hideElementIfExists("ModalAvsZip");
    hideElementIfExists("ModalAvsZipLabel");
    hideElementIfExists("ModalCardExpirationDate");
    hideElementIfExists("ModalCardExpirationDateLabel", true);
    showElementIfExists("ModalAchReturnCode");
    showElementIfExists("ModalAchReturnCodeLabel");
    showElementIfExists("ModalAchReturnDate");
    showElementIfExists("ModalAchReturnDateLabel");
}
function setCardDetailsControls() {
    hideElementIfExists("ModalAchReturnCode");
    hideElementIfExists("ModalAchReturnCodeLabel");
    hideElementIfExists("ModalAchReturnDate");
    hideElementIfExists("ModalAchReturnDateLabel");
    showElementIfExists("ModalCardExpirationDate");
    showElementIfExists("ModalCardExpirationDateLabel");
    showElementIfExists("ModalAvsResponse");
    showElementIfExists("ModalAvsResponseLabel");
    showElementIfExists("ModalAvsAddress");
    showElementIfExists("ModalAvsAddressLabel");
    showElementIfExists("ModalAvsZip");
    showElementIfExists("ModalAvsZipLabel");
}
function updateInnerIfExists(id, val) {
    var element = document.getElementById(id);
    if (element != null) {
        element.innerText = val;
        if (val === "N/A")
            element.classList.add("text-muted");
        else
            element.classList.remove("text-muted");
    }
}
function hideElementIfExists(id, makeInvisible) {
    if (makeInvisible === void 0) { makeInvisible = false; }
    var element = document.getElementById(id);
    if (element != null) {
        if (makeInvisible) {
            element.classList.add('invisible');
        }
        else {
            element.hidden = true;
        }
    }
}
function showElementIfExists(id) {
    var element = document.getElementById(id);
    if (element != null) {
        element.hidden = false;
        element.classList.remove('invisible');
    }
}
function createCreditCardImg(src, alt) {
    var ret = document.createElement('img');
    if (!ret)
        return;
    ret.classList.add('logo');
    ret.src = src;
    ret.alt = alt;
    return ret;
}
function createAchSpan(src) {
    var ret = document.createElement('span');
    ret.setAttribute('aria-hidden', 'true');
    ret.className = src;
    return ret;
}
function setReversalButtonState(status) {
    var pendingAchClass = "PendingAch";
    if (status !== "Reversible") {
        $('#reversal-button').attr('disabled', "true");
        $('#reversal-button').removeAttr('onclick');
        // Add a class to the Auth Message if this is a pending ACH tran that has been issued/batched.
        if (status === "AchBatched") {
            $("#ModalAuthNetworkResponse").addClass(pendingAchClass);
        }
        else {
            $("#ModalAuthNetworkResponse").removeClass(pendingAchClass);
        }
    }
    else {
        $('#reversal-button').removeAttr('disabled');
        $('#reversal-button').attr('onclick', "populateReversalConfirmModal(this);");
        $("#ModalAuthNetworkResponse").removeClass(pendingAchClass);
    }
}
function applyBadgeColoring(status, primaryStatuses, successStatuses, dangerStatuses) {
    // Apply correct badge coloring
    $('#ModalStatus').removeClass();
    $('#ModalStatus').addClass("badge badge-pill text-uppercase");
    if (primaryStatuses.includes(status)) {
        $('#ModalStatus').addClass("badge-primary");
    }
    else if (successStatuses.includes(status)) {
        $('#ModalStatus').addClass("badge-success");
    }
    else if (dangerStatuses.includes(status)) {
        $('#ModalStatus').addClass("badge-danger");
    }
    else {
        $('#ModalStatus').addClass("badge-secondary");
    }
}
function setAmountsVisibility(accountType, showFees, feeAmount, billAmount) {
    if (accountType === 'PayPad') {
        hideElementIfExists("BillAmount");
        hideElementIfExists("FeeAmount");
    }
    else {
        if (showFees) {
            showElementIfExists("FeeAmount");
            updateInnerIfExists("ModalFeeAmount", feeAmount);
        }
        else {
            hideElementIfExists("FeeAmount");
        }
        showElementIfExists("BillAmount");
        updateInnerIfExists("ModalBillAmount", billAmount);
    }
}
function updatePaymentTypeImage(message, icon) {
    var modalLogoSpan = document.getElementById('modal-payment-logo');
    while (modalLogoSpan.firstChild) {
        modalLogoSpan.removeChild(modalLogoSpan.firstChild);
    }
    if (message !== 'ACH' && message !== 'Unknown') {
        var ccImg = createCreditCardImg(icon, message);
        modalLogoSpan.appendChild(ccImg);
    }
    else {
        var achSpan = createAchSpan(icon);
        modalLogoSpan.appendChild(achSpan);
    }
}
function populateEmailReceiptModal(target) {
    $('#email-receipt-confirm-button').attr('disabled', 'disabled');
    $("#recipient-container").removeClass('invalid');
    var login = target.dataset.emailLogin;
    var emailInput = $("#email-receipt-recipient")[0];
    if (login && login != notApplicable) {
        emailInput.value = login;
        $("#recipient-container").addClass('active');
        if (!login.match(emailPattern)) {
            $("#recipient-container").addClass('invalid');
        }
        else {
            $('#email-receipt-confirm-button').removeAttr('disabled');
        }
    }
    else {
        emailInput.value = '';
        $("#recipient-container").removeClass('active');
    }
    $('#email-receipt-confirm-button').attr('data-email-payment-id', target.dataset.emailPaymentId);
    $('#email-receipt-confirm-button').attr('data-email-account-type', target.dataset.emailAccountType);
}
function emailUpdated(target) {
    if (target.value) {
        if (target.value.match(emailPattern)) {
            $('#email-receipt-confirm-button').removeAttr('disabled');
            $("#recipient-container").removeClass('invalid');
        }
        else {
            $("#recipient-container").addClass('invalid');
            $('#email-receipt-confirm-button').attr('disabled', 'disabled');
        }
    }
    else {
        $('#email-receipt-confirm-button').attr('disabled', 'disabled');
    }
}
function sendEmailReceipt(target, url) {
    return __awaiter(this, void 0, void 0, function () {
        var email, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    $('#email-receipt-spinner').removeAttr('hidden');
                    $('#email-receipt-cancel-button').attr('disabled', 'disabled');
                    $('#email-receipt-close-modal-button').attr('disabled', 'disabled');
                    $('#email-receipt-modal').data('bs.modal')._config.backdrop = 'static';
                    $('#email-receipt-modal').data('bs.modal')._config.keyboard = false;
                    url = url.replace('__paymentId__', target.dataset.emailPaymentId.slice(1));
                    url = url.replace('__accountType__', target.dataset.emailAccountType);
                    email = $('#email-receipt-recipient')[0].value;
                    url = url.replace('__email__', encodeURIComponent(email));
                    return [4 /*yield*/, apiPost(url, {})];
                case 1:
                    result = _a.sent();
                    if (!result.isError) {
                        createToast("Successfully emailed receipt to '" + email + "'");
                    }
                    else {
                        createToast(result.errorMessage);
                    }
                    $('#email-receipt-modal').modal('hide');
                    $('#email-receipt-cancel-button').removeAttr('disabled');
                    $('#email-receipt-close-modal-button').removeAttr('disabled');
                    $('#email-receipt-modal').data('bs.modal')._config.backdrop = true;
                    $('#email-receipt-modal').data('bs.modal')._config.keyboard = true;
                    $('#email-receipt-spinner').attr('hidden', 'hidden');
                    return [2 /*return*/];
            }
        });
    });
}
;
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var HtmlId = /** @class */ (function () {
    function HtmlId(value) {
        if (!value || !value.length) {
            throw new Error('value must be provided');
        }
        // Normalize the ID value to prevent mismatches between ID vs selectors.
        this.value = value[0] == '#' ? value.substr(1) : value;
    }
    HtmlId.prototype.getId = function () {
        return this.value;
    };
    HtmlId.prototype.getElement = function () {
        return $("#" + this.value);
    };
    HtmlId.prototype.toString = function () {
        return this.value;
    };
    HtmlId.coalesce = function (value) {
        if (typeof value === 'string') {
            return new HtmlId(value);
        }
        else {
            return value;
        }
    };
    return HtmlId;
}());
var HtmlInput = /** @class */ (function () {
    function HtmlInput(input) {
        this.internalChanged = false;
        this.internalHidden = false;
        this.input = input;
    }
    Object.defineProperty(HtmlInput.prototype, "inputElement", {
        get: function () {
            return this.input;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(HtmlInput.prototype, "isChanged", {
        get: function () {
            return this.internalChanged;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(HtmlInput.prototype, "isHidden", {
        get: function () {
            return this.internalHidden;
        },
        enumerable: true,
        configurable: true
    });
    HtmlInput.prototype.setChanged = function (value) {
        this.internalChanged = value;
    };
    HtmlInput.prototype.hide = function () {
        this.internalHidden = true;
    };
    HtmlInput.prototype.getValue = function () {
        if (this.input instanceof HTMLSelectElement) {
            return this.input.value;
        }
        if (this.input.type === 'checkbox') {
            return this.input.checked
                ? 'checked'
                : '';
        }
        if (this.input.type === 'time') {
            var timeValues = this.input.value.split(':');
            if (timeValues.length < 3) {
                return this.input.value + ':00';
            }
        }
        return this.input.value;
    };
    HtmlInput.prototype.setValue = function (value) {
        if (this.input instanceof HTMLSelectElement) {
            this.input.value = typeof value === 'boolean'
                ? value.toString()
                : value;
        }
        else {
            if (this.input.type === 'checkbox') {
                if (typeof value === 'boolean') {
                    this.input.checked = value;
                }
                else {
                    this.input.checked = (value === 'checked');
                }
            }
            else {
                this.input.value = typeof value === 'boolean'
                    ? value.toString()
                    : value;
            }
        }
    };
    HtmlInput.prototype.setError = function (message) {
        setErrorState(this.input, message, false);
    };
    HtmlInput.prototype.removeError = function () {
        removeErrorState(this.input, false);
    };
    return HtmlInput;
}());
var HtmlMirrorInput = /** @class */ (function (_super) {
    __extends(HtmlMirrorInput, _super);
    function HtmlMirrorInput(input, mirror) {
        var _this = _super.call(this, input) || this;
        _this.mirror = new HtmlInput(mirror);
        return _this;
    }
    HtmlMirrorInput.prototype.setValue = function (value) {
        _super.prototype.setValue.call(this, value);
        this.updateMirrorValue();
    };
    HtmlMirrorInput.prototype.setError = function (message) {
        _super.prototype.setError.call(this, message);
        this.mirror.setError(message);
    };
    HtmlMirrorInput.prototype.removeError = function () {
        _super.prototype.removeError.call(this);
        this.mirror.removeError();
    };
    HtmlMirrorInput.prototype.updateMirrorValue = function () {
        var newValue = this.getValue();
        if (this.mirror.getValue() !== newValue) {
            this.mirror.setValue(newValue);
        }
    };
    HtmlMirrorInput.prototype.disableMirror = function () {
        this.mirror.inputElement.setAttribute('disabled', 'disabled');
    };
    HtmlMirrorInput.prototype.enableMirror = function () {
        this.mirror.inputElement.removeAttribute('disabled');
    };
    return HtmlMirrorInput;
}(HtmlInput));
var SingleInputFilter = /** @class */ (function () {
    function SingleInputFilter(input, defaultValue) {
        if (defaultValue === void 0) { defaultValue = ''; }
        this.input = input;
        this.defaultValue = defaultValue;
        this.internalIsValid = true;
        this.initialValue = input.getValue();
        this.resetChanged();
    }
    Object.defineProperty(SingleInputFilter.prototype, "changed", {
        get: function () {
            return this.input.isChanged ? 1 : 0;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(SingleInputFilter.prototype, "visibleChanged", {
        get: function () {
            return !this.input.isHidden && this.input.isChanged ? 1 : 0;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(SingleInputFilter.prototype, "isValid", {
        get: function () {
            return this.internalIsValid;
        },
        enumerable: true,
        configurable: true
    });
    SingleInputFilter.prototype.allInputs = function () {
        return [this.input];
    };
    SingleInputFilter.prototype.clear = function () {
        if (!this.input.isHidden) {
            this.onBoundValueChanged(this.input, this.defaultValue);
        }
    };
    SingleInputFilter.prototype.onInputChanged = function (input) {
        this.updateFlags();
        if (input instanceof HtmlMirrorInput) {
            input.updateMirrorValue();
        }
    };
    SingleInputFilter.prototype.onBoundValueChanged = function (input, newValue) {
        input.setValue(newValue);
        this.updateFlags();
    };
    SingleInputFilter.prototype.resetChanged = function () {
        this.input.setChanged(false);
    };
    SingleInputFilter.prototype.hide = function () {
        this.input.hide();
    };
    SingleInputFilter.prototype.setValidationError = function (isError, message) {
        if (message === void 0) { message = null; }
        this.internalIsValid = !isError;
        if (isError) {
            this.input.setError(message);
        }
        else {
            this.input.removeError();
        }
    };
    SingleInputFilter.prototype.updateFlags = function () {
        this.input.setChanged(this.input.getValue() !== this.initialValue);
        this.validate();
    };
    SingleInputFilter.prototype.validate = function () {
        return true;
    };
    SingleInputFilter.prototype.registerEvents = function () {
    };
    SingleInputFilter.prototype.getValue = function () {
        return this.input.getValue();
    };
    return SingleInputFilter;
}());
var TextValueFilter = /** @class */ (function (_super) {
    __extends(TextValueFilter, _super);
    function TextValueFilter(input, maximumLength, defaultValue) {
        if (maximumLength === void 0) { maximumLength = 100; }
        if (defaultValue === void 0) { defaultValue = ''; }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.maximumLength = maximumLength;
        return _this;
    }
    TextValueFilter.prototype.validate = function () {
        this.setValidationError(false);
        var value = this.input.getValue();
        if (!valueIsSpecified(value)) {
            return true;
        }
        if (value.length > this.maximumLength) {
            this.setValidationError(true, 'Max length is ' + this.maximumLength);
            return false;
        }
        return true;
    };
    return TextValueFilter;
}(SingleInputFilter));
var IntegerValueFilter = /** @class */ (function (_super) {
    __extends(IntegerValueFilter, _super);
    function IntegerValueFilter(input, minimumValue, maximumValue, defaultValue) {
        if (minimumValue === void 0) { minimumValue = INT_MIN_VALUE; }
        if (maximumValue === void 0) { maximumValue = INT_MAX_VALUE; }
        if (defaultValue === void 0) { defaultValue = ''; }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.minimumValue = minimumValue;
        _this.maximumValue = maximumValue;
        return _this;
    }
    IntegerValueFilter.prototype.validate = function () {
        this.setValidationError(false);
        var value = this.input.getValue();
        if (!valueIsSpecified(value)) {
            return true;
        }
        if (!valueIsInteger(value)) {
            this.setValidationError(true, 'Must be a whole number');
            return false;
        }
        var numberValue = +value;
        if (numberValue < this.minimumValue) {
            this.setValidationError(true, 'Must be >= ' + this.minimumValue);
            return false;
        }
        if (numberValue > this.maximumValue) {
            this.setValidationError(true, 'Must be <= ' + this.maximumValue);
            return false;
        }
        return true;
    };
    return IntegerValueFilter;
}(SingleInputFilter));
var DateFilter = /** @class */ (function (_super) {
    __extends(DateFilter, _super);
    function DateFilter(input, defaultValue, required) {
        if (defaultValue === void 0) { defaultValue = formatDate(new Date(Date.now() - (24 * 60 * 60 * 1000))); }
        if (required === void 0) { required = true; }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.minDate = new Date(Date.UTC(1900, 0, 1));
        // 2 days less than DateTime.MaxValue, because the Payment APIs add +/- 2 days
        _this.maxDate = new Date(Date.UTC(9999, 11, 29));
        _this.required = required;
        return _this;
    }
    DateFilter.prototype.validate = function () {
        this.setValidationError(false);
        var dateValue = this.input.getValue();
        if (this.required || dateValue) {
            var dateIsValidDate = valueIsValidDateInRange(dateValue, this.minDate, this.maxDate);
            if (!dateIsValidDate) {
                this.setValidationError(true, 'Enter a valid date');
                return false;
            }
        }
        return true;
    };
    return DateFilter;
}(SingleInputFilter));
var TimeFilter = /** @class */ (function (_super) {
    __extends(TimeFilter, _super);
    function TimeFilter(input, defaultValue, minimumValue, maximumValue) {
        if (defaultValue === void 0) { defaultValue = '00:00:00'; }
        if (minimumValue === void 0) { minimumValue = new Date(0, 0, 0, 0, 0); }
        if (maximumValue === void 0) { maximumValue = new Date(0, 0, 0, 23, 59); }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.minimumValue = minimumValue;
        _this.maximumValue = maximumValue;
        return _this;
    }
    TimeFilter.prototype.validate = function () {
        this.setValidationError(false);
        var inputValue = this.input.getValue();
        var result = this.validateExistingInputVal(inputValue);
        if (!result.isValid) {
            this.setValidationError(true, result.errorMessage);
            return false;
        }
        return true;
    };
    TimeFilter.prototype.validateExistingInputVal = function (inputValue) {
        var newDate = normalizeTime(inputValue);
        if (newDate === undefined) {
            return ValidationResult.Err("Must be a valid time");
        }
        if (newDate < this.minimumValue || newDate > this.maximumValue) {
            var min = this.minimumValue.toLocaleTimeString().substring(0, 5);
            var max = this.maximumValue.toLocaleTimeString().substring(0, 5);
            return ValidationResult.Err("Must be between " + min + " and " + max);
        }
        return ValidationResult.Ok();
    };
    return TimeFilter;
}(SingleInputFilter));
var Last4Filter = /** @class */ (function (_super) {
    __extends(Last4Filter, _super);
    function Last4Filter(input, defaultValue) {
        if (defaultValue === void 0) { defaultValue = ''; }
        return _super.call(this, input, defaultValue) || this;
    }
    Last4Filter.prototype.validate = function () {
        this.setValidationError(false);
        var value = this.input.getValue();
        // Allow not specifying a value
        if (!valueIsSpecified(value)) {
            return true;
        }
        // Ensure the value is exactly 4 digits
        if (!/^\d{4}$/.test(value)) {
            this.setValidationError(true, 'Must be 4 digits');
            return false;
        }
        return true;
    };
    return Last4Filter;
}(SingleInputFilter));
var AmountFilter = /** @class */ (function (_super) {
    __extends(AmountFilter, _super);
    function AmountFilter(input, 
    // Should reflect the same range as indicated in 
    // [Range(0d, 99999999.99)] in file SettlementListFilters.cs 
    // on item MaxAmount
    minimumValue, maximumValue, defaultValue) {
        if (minimumValue === void 0) { minimumValue = BLUEFIN_AMOUNT_MIN_VALUE; }
        if (maximumValue === void 0) { maximumValue = BLUEFIN_AMOUNT_MAX_VALUE; }
        if (defaultValue === void 0) { defaultValue = ''; }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.minimumValue = minimumValue;
        _this.maximumValue = maximumValue;
        return _this;
    }
    AmountFilter.prototype.validate = function () {
        this.setValidationError(false);
        var inputValue = this.input.getValue();
        var hasValue = valueIsSpecified(inputValue);
        if (!hasValue) {
            return true;
        }
        var result = this.validateExistingInputVal(inputValue);
        if (!result.isValid) {
            this.setValidationError(true, result.errorMessage);
            return false;
        }
        return true;
    };
    AmountFilter.prototype.validateExistingInputVal = function (inputValue) {
        if (!valueIsPositiveNumber(inputValue)) {
            return ValidationResult.Err('Must be a number >= 0');
        }
        if (!valueIsPositiveDollarAmount(inputValue)) {
            return ValidationResult.Err('Must be a dollar amount');
        }
        if (+inputValue > this.maximumValue) {
            return ValidationResult.Err('Exceeds allowed value');
        }
        if (+inputValue < this.minimumValue) {
            return ValidationResult.Err('Less than allowed value');
        }
        return ValidationResult.Ok();
    };
    return AmountFilter;
}(SingleInputFilter));
var MinimumAmountFilter = /** @class */ (function (_super) {
    __extends(MinimumAmountFilter, _super);
    function MinimumAmountFilter(input, maxAmountInput, 
    // Should reflect the same range as indicated in 
    // [Range(0d, 99999999.99)] in file SettlementListFilters.cs 
    // on item MinAmount
    minimumValue, maximumValue, defaultValue) {
        if (minimumValue === void 0) { minimumValue = BLUEFIN_AMOUNT_MIN_VALUE; }
        if (maximumValue === void 0) { maximumValue = BLUEFIN_AMOUNT_MAX_VALUE; }
        if (defaultValue === void 0) { defaultValue = ''; }
        var _this = _super.call(this, input, minimumValue, maximumValue, defaultValue) || this;
        _this.maxAmountInput = maxAmountInput;
        return _this;
    }
    MinimumAmountFilter.prototype.validate = function () {
        this.setValidationError(false);
        var inputValue = this.input.getValue();
        if (!valueIsSpecified(inputValue)) {
            return true;
        }
        var result = this.validateExistingInputVal(inputValue);
        if (!result.isValid) {
            this.setValidationError(true, result.errorMessage);
            return false;
        }
        var maxAmountValue = this.maxAmountInput.getValue();
        if (!valueIsSpecified(maxAmountValue)) {
            // the max amount is not valid so don't validate against max amount.
            return true;
        }
        var maxValidateResult = this.validateExistingInputVal(maxAmountValue);
        if (!maxValidateResult.isValid) {
            // the max amount is not valid so don't validate against max amount.
            return true;
        }
        if (+inputValue > +maxAmountValue) {
            this.setValidationError(true, 'Cannot exceed max');
            return false;
        }
        return true;
    };
    MinimumAmountFilter.prototype.registerEvents = function () {
        var _this = this;
        this.maxAmountInput.inputElement.oninput = function (e) {
            _this.validate();
        };
    };
    return MinimumAmountFilter;
}(AmountFilter));
var LinkedControlFilter = /** @class */ (function (_super) {
    __extends(LinkedControlFilter, _super);
    function LinkedControlFilter(input, secondaryFilter, defaultValue) {
        if (secondaryFilter === void 0) { secondaryFilter = null; }
        if (defaultValue === void 0) { defaultValue = ''; }
        var _this = _super.call(this, input, defaultValue) || this;
        _this.secondaryFilter = secondaryFilter;
        return _this;
    }
    LinkedControlFilter.prototype.setSecondaryFilter = function (filter) {
        this.secondaryFilter = filter;
    };
    return LinkedControlFilter;
}(SingleInputFilter));
var CutoffTimeFilter = /** @class */ (function (_super) {
    __extends(CutoffTimeFilter, _super);
    function CutoffTimeFilter(cutoffInput, accountTypeFilter, defaultValue) {
        if (accountTypeFilter === void 0) { accountTypeFilter = null; }
        if (defaultValue === void 0) { defaultValue = ''; }
        return _super.call(this, cutoffInput, accountTypeFilter, defaultValue) || this;
    }
    CutoffTimeFilter.prototype.onInputChanged = function (input) {
        _super.prototype.onInputChanged.call(this, input);
        if (this.secondaryFilter !== null) {
            // If we switch to "Batch" cutoff and a now invalid value is selected, change the 
            // Merchant Account Type to "Utility".
            if (this.input.getValue() === "1" &&
                (this.secondaryFilter.getValue() === "0" || this.secondaryFilter.getValue() === "2")) {
                this.secondaryFilter.onBoundValueChanged(this.secondaryFilter.input, "1");
            }
            else {
                this.secondaryFilter.validate();
            }
        }
    };
    return CutoffTimeFilter;
}(LinkedControlFilter));
var MerchantAccountTypeFilter = /** @class */ (function (_super) {
    __extends(MerchantAccountTypeFilter, _super);
    function MerchantAccountTypeFilter(accountTypeInput, cutoffFilter, defaultValue) {
        if (cutoffFilter === void 0) { cutoffFilter = null; }
        if (defaultValue === void 0) { defaultValue = ''; }
        return _super.call(this, accountTypeInput, cutoffFilter, defaultValue) || this;
    }
    MerchantAccountTypeFilter.prototype.validate = function () {
        this.setValidationError(false);
        var select = this.input.inputElement;
        var currentValue = this.input.getValue();
        // If we haven't yet removed the "UtilityAndMunicipal" option, do some validation
        // and update options.
        if (select.options.length === 5) {
            // Flag the control with an error if someone passed in the value directly in the url and 
            // we are set to "Midnight" cutoff time.We would never run into this during normal usage though.
            if (currentValue === "4" &&
                (this.secondaryFilter === null ||
                    this.secondaryFilter.input.getValue() === "0")) {
                this.setValidationError(true, "Invalid selection");
                return false;
            }
            // Otherwise remove the option
            select.remove(4);
        }
        // If we're set to Batch cutoff, remove values that aren't applicable and add a "Both" option.
        if (this.secondaryFilter !== null && this.secondaryFilter.input.getValue() === "1") {
            // Flag the control with an error if someone passed in a bogus value directly in the url
            if (currentValue === "0" || currentValue === "2") {
                this.setValidationError(true, "Invalid selection");
                return false;
            }
            // If we haven't already updated the options, do it now.
            if (select.options.length !== 3) {
                select.remove(0); // Remove "Any"
                select.remove(1); // Remove "PayPad"
                var bothOption = new Option('Both', '4'); // 4 corresponds to AccountType.UtilityAndMunicipal so it will be bound correctly.
                select.add(bothOption, 2);
                // Make sure that if "Both" was selected for the POST that we reselect it after the updates.
                if (currentValue === "4") {
                    select.selectedIndex = 2;
                }
            }
        }
        // If we're on "Midnight" cutoff and we haven't yet added back the options, 
        // add them back into the select control and remove "Both"
        else if (select.options.length !== 4) {
            select.remove(2); // Remove "Both"
            var anyOption = new Option('Any', '0');
            var payPadOption = new Option('PayPad', '2');
            select.add(anyOption, 0);
            select.add(payPadOption, 2);
            // If "Both" was previously selected, set the selection back to "Any"
            if (currentValue === "4") {
                select.selectedIndex = 0;
            }
        }
        return true;
    };
    return MerchantAccountTypeFilter;
}(LinkedControlFilter));
var MultiInputFilter = /** @class */ (function () {
    function MultiInputFilter(inputs, defaultValues) {
        this.inputs = inputs;
        this.defaultValues = defaultValues;
        this.initialValues = [];
        this.internalIsValid = true;
        this.initialValues = new Array(inputs.length);
        for (var i = 0; i < inputs.length; i++) {
            this.initialValues[i] = this.inputs[i].getValue();
        }
        this.resetChanged();
    }
    Object.defineProperty(MultiInputFilter.prototype, "changed", {
        get: function () {
            return this.inputs.filter(function (i) { return i.isChanged; }).length;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(MultiInputFilter.prototype, "visibleChanged", {
        get: function () {
            return this.inputs.filter(function (i) { return !i.isHidden && i.isChanged; }).length;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(MultiInputFilter.prototype, "isValid", {
        get: function () {
            return this.internalIsValid;
        },
        enumerable: true,
        configurable: true
    });
    MultiInputFilter.prototype.allInputs = function () {
        return this.inputs;
    };
    MultiInputFilter.prototype.clear = function () {
        for (var i = 0; i < this.inputs.length; i++) {
            if (!this.inputs[i].isHidden) {
                this.onBoundValueChanged(this.inputs[i], this.defaultValues[i]);
            }
        }
    };
    MultiInputFilter.prototype.onInputChanged = function (input) {
        var index = this.inputs.indexOf(input);
        if (index >= 0) {
            this.updateFlags();
            if (input instanceof HtmlMirrorInput) {
                input.updateMirrorValue();
            }
        }
    };
    MultiInputFilter.prototype.onBoundValueChanged = function (input, newValue) {
        input.setValue(newValue);
        this.updateFlags();
    };
    MultiInputFilter.prototype.resetChanged = function () {
        for (var i = 0; i < this.inputs.length; i++) {
            this.inputs[i].setChanged(false);
        }
    };
    MultiInputFilter.prototype.hide = function () {
        for (var i = 0; i < this.inputs.length; i++) {
            this.inputs[i].hide();
        }
    };
    MultiInputFilter.prototype.resetValidationErrors = function () {
        this.internalIsValid = true;
        this.allInputs().forEach(function (input) {
            input.removeError();
        });
    };
    MultiInputFilter.prototype.setValidationError = function (input, message) {
        this.internalIsValid = false;
        input.inputElement.parentElement.classList.add('active'); // for IE
        input.setError(message);
    };
    MultiInputFilter.prototype.updateFlags = function () {
        for (var i = 0; i < this.inputs.length; i++) {
            this.inputs[i].setChanged(this.inputs[i].getValue() !== this.initialValues[i]);
        }
        this.validate();
    };
    MultiInputFilter.prototype.validate = function () {
        return true;
    };
    MultiInputFilter.prototype.registerEvents = function () {
    };
    MultiInputFilter.prototype.getValue = function () {
        return this.inputs.map(function (i) { return i.getValue(); }).join(" | ");
    };
    return MultiInputFilter;
}());
var DateRangeFilter = /** @class */ (function (_super) {
    __extends(DateRangeFilter, _super);
    function DateRangeFilter(startDateInput, endDateInput, maxRangeInDays, defaultValue, dateCanBeNull) {
        if (defaultValue === void 0) { defaultValue = formatDate(new Date()); }
        if (dateCanBeNull === void 0) { dateCanBeNull = false; }
        var _this = _super.call(this, [startDateInput, endDateInput], [defaultValue, defaultValue]) || this;
        _this.startDateInput = startDateInput;
        _this.endDateInput = endDateInput;
        _this.maxRangeInDays = maxRangeInDays;
        _this.dateCanBeNull = dateCanBeNull;
        _this.minDate = new Date(Date.UTC(1900, 0, 1));
        // 2 days less than DateTime.MaxValue, because the Payment APIs add +/- 2 days
        _this.maxDate = new Date(Date.UTC(9999, 11, 29));
        return _this;
    }
    DateRangeFilter.prototype.validate = function () {
        this.resetValidationErrors();
        var startValue = this.startDateInput.getValue();
        var startDateIsValidDate = valueIsValidDateInRange(startValue, this.minDate, this.maxDate, this.dateCanBeNull);
        if (!startDateIsValidDate) {
            this.setValidationError(this.startDateInput, 'Enter a valid date');
        }
        var endValue = this.endDateInput.getValue();
        var endDateIsValidDate = valueIsValidDateInRange(endValue, this.minDate, this.maxDate, this.dateCanBeNull);
        if (!endDateIsValidDate) {
            this.setValidationError(this.endDateInput, 'Enter a valid date');
        }
        if (!startDateIsValidDate || !endDateIsValidDate) {
            return false;
        }
        var startDate = new Date(startValue);
        var endDate = new Date(endValue);
        // for IE
        if (startDate)
            this.startDateInput.inputElement.parentElement.classList.add('active');
        if (endDate)
            this.endDateInput.inputElement.parentElement.classList.add('active');
        if (startDate > endDate) {
            this.setValidationError(this.startDateInput, 'Cannot exceed end date');
            return false;
        }
        if (this.maxRangeInDays && getDateDifferenceInDays(startDate, endDate) > this.maxRangeInDays) {
            this.setValidationError(this.endDateInput, "Max range is " + this.maxRangeInDays + " days");
            return false;
        }
        return true;
    };
    return DateRangeFilter;
}(MultiInputFilter));
var DateAndTimeRangeFilter = /** @class */ (function (_super) {
    __extends(DateAndTimeRangeFilter, _super);
    function DateAndTimeRangeFilter(startDateInput, startTimeInput, endDateInput, endTimeInput, maxRangeInDays, dateCanBeNull, defaultStartDateValue, defaultStartTimeValue, defaultEndDateValue, defaultEndTimeValue) {
        if (dateCanBeNull === void 0) { dateCanBeNull = false; }
        if (defaultStartDateValue === void 0) { defaultStartDateValue = formatDate(new Date()); }
        if (defaultStartTimeValue === void 0) { defaultStartTimeValue = '00:00:00'; }
        if (defaultEndDateValue === void 0) { defaultEndDateValue = formatDate(new Date()); }
        if (defaultEndTimeValue === void 0) { defaultEndTimeValue = '00:00:00'; }
        var _this = _super.call(this, [startDateInput, startTimeInput, endDateInput, endTimeInput], [defaultStartDateValue, defaultStartTimeValue, defaultEndDateValue, defaultEndTimeValue]) || this;
        _this.startDateInput = startDateInput;
        _this.startTimeInput = startTimeInput;
        _this.endDateInput = endDateInput;
        _this.endTimeInput = endTimeInput;
        _this.maxRangeInDays = maxRangeInDays;
        _this.dateCanBeNull = dateCanBeNull;
        _this.minDate = new Date(Date.UTC(1900, 0, 1));
        // 2 days less than DateTime.MaxValue, because the Payment APIs add +/- 2 days
        _this.maxDate = new Date(Date.UTC(9999, 11, 29));
        _this.minTimeValue = new Date(0, 0, 0, 0, 0);
        _this.maxTimeValue = new Date(0, 0, 0, 23, 59);
        return _this;
    }
    DateAndTimeRangeFilter.prototype.validate = function () {
        this.resetValidationErrors();
        var startValue = this.startDateInput.getValue();
        var startDateIsValidDate = valueIsValidDateInRange(startValue, this.minDate, this.maxDate, this.dateCanBeNull);
        if (!startDateIsValidDate) {
            this.setValidationError(this.startDateInput, 'Enter a valid date');
        }
        var endValue = this.endDateInput.getValue();
        var endDateIsValidDate = valueIsValidDateInRange(endValue, this.minDate, this.maxDate, this.dateCanBeNull);
        if (!endDateIsValidDate) {
            this.setValidationError(this.endDateInput, 'Enter a valid date');
        }
        var startTimeValue = this.startTimeInput.getValue();
        var startTimeResult = this.validateExistingTimeInputVal(startTimeValue);
        if (!startTimeResult.isValid) {
            this.setValidationError(this.startTimeInput, startTimeResult.errorMessage);
        }
        var endTimeValue = this.endTimeInput.getValue();
        var endTimeResult = this.validateExistingTimeInputVal(endTimeValue);
        if (!endTimeResult.isValid) {
            this.setValidationError(this.endTimeInput, endTimeResult.errorMessage);
        }
        if (!startDateIsValidDate || !endDateIsValidDate || !startTimeResult.isValid || !endTimeResult.isValid) {
            return false;
        }
        var startDate = new Date(startValue);
        var startTime = normalizeTime(startTimeValue);
        var endDate = new Date(endValue);
        var endTime = normalizeTime(endTimeValue);
        // for IE
        if (startDate)
            this.startDateInput.inputElement.parentElement.classList.add('active');
        if (endDate)
            this.endDateInput.inputElement.parentElement.classList.add('active');
        if (startTime)
            this.startTimeInput.inputElement.parentElement.classList.add('active');
        if (endTime)
            this.endTimeInput.inputElement.parentElement.classList.add('active');
        if (startDate > endDate || (startDate.getTime() === endDate.getTime() && startTime > endTime)) {
            this.setValidationError(this.startDateInput, 'Cannot exceed end Date/Time');
            return false;
        }
        if (this.maxRangeInDays && getDateDifferenceInDays(startDate, endDate) > this.maxRangeInDays) {
            this.setValidationError(this.endDateInput, "Max range is " + this.maxRangeInDays + " days");
            return false;
        }
        return true;
    };
    DateAndTimeRangeFilter.prototype.validateExistingTimeInputVal = function (inputValue) {
        var newDate = normalizeTime(inputValue);
        if (!newDate)
            return ValidationResult.Err("Must be a valid time");
        if (newDate < this.minTimeValue || newDate > this.maxTimeValue) {
            var min = this.minTimeValue.toLocaleTimeString().substring(0, 5);
            var max = this.maxTimeValue.toLocaleTimeString().substring(0, 5);
            return ValidationResult.Err("Must be between " + min + " and " + max);
        }
        return ValidationResult.Ok();
    };
    return DateAndTimeRangeFilter;
}(MultiInputFilter));
;
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __spreadArrays = (this && this.__spreadArrays) || function () {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
};
var paymentFilterSet;
var settlementSummaryFilterSet;
var settlementListFilterSet;
var scheduledPaymentsFilterSet;
var profileReportFilterSet;
var auditTrailReportFilterSet;
var transactionReportFilterSet;
var adoptionRatesFilterSet;
var eBillDeliveryFilterSet;
var payFactoryFeesReportFilterSet;
var manageAgenciesFilterSet;
var usersFilterSet;
var FilterSet = /** @class */ (function () {
    function FilterSet(formId, filters, submitElements, filtersButton, enableSubmit) {
        var _this = this;
        if (filtersButton === void 0) { filtersButton = null; }
        if (enableSubmit === void 0) { enableSubmit = false; }
        this.formId = formId;
        this.filters = filters;
        this.submitElements = submitElements;
        this.filtersButton = filtersButton;
        this.enableSubmit = enableSubmit;
        this.isSubmitting = false;
        this.alwaysEnableSubmit = false;
        this.registerEvents(filters);
        this.alwaysEnableSubmit = enableSubmit;
        formId.getElement().each(function (index, form) {
            form.onsubmit = function (e) { return _this.onSubmit(); };
        });
        this.validate();
        this.updateFiltersDisplay();
    }
    FilterSet.prototype.registerEvents = function (filters) {
        var _this = this;
        filters.forEach(function (filter) {
            filter.allInputs().forEach(function (input) {
                // Use oninput and onchange to catch input updates in
                // all the browsers
                input.inputElement.oninput = function (e) {
                    _this.onFilterInputChanged(filter, input);
                };
                input.inputElement.onchange = function (e) {
                    _this.onFilterInputChanged(filter, input);
                };
            });
        });
        //Combining the following loop with the one above isn't possible
        //because the loop above must be completed first. The FilterSet 
        //needs to subscribe to all of the input updates so it can properly 
        //set up the bindings as part of its inner workings.
        //The loop below is to subscribe to being notified when the target 
        //input has updated, this must be done after all bindings have been 
        //processed.        
        filters.forEach(function (filter) {
            filter.registerEvents();
        });
    };
    Object.defineProperty(FilterSet.prototype, "fullChangedCount", {
        get: function () {
            return this.filters.map(function (f) { return f.changed; }).reduce(function (a, c) { return a + c; });
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(FilterSet.prototype, "visibleChangedCount", {
        get: function () {
            return this.filters.map(function (f) { return f.visibleChanged; }).reduce(function (a, c) { return a + c; });
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(FilterSet.prototype, "isValid", {
        get: function () {
            return this.filters.filter(function (f) { return !f.isValid; }).length === 0;
        },
        enumerable: true,
        configurable: true
    });
    FilterSet.prototype.clear = function () {
        this.filters.forEach(function (filter) {
            filter.clear();
        });
        this.updateFiltersDisplay();
    };
    FilterSet.prototype.onFilterInputChanged = function (filter, input) {
        filter.onInputChanged(input);
        this.updateFiltersDisplay();
    };
    FilterSet.prototype.onSubmit = function () {
        this.isSubmitting = true;
        this.submitElements.forEach(function (element) {
            setButtonSubmittingState(element.id, true);
        });
    };
    FilterSet.prototype.submit = function () {
        if (this.submitElements.length > 0)
            this.submitElements[0].click();
    };
    FilterSet.prototype.updateFiltersDisplay = function () {
        var hasChanges = this.fullChangedCount > 0;
        var hasVisibleChanges = this.visibleChangedCount > 0;
        if (this.filtersButton) {
            var filterError = 'filters-error';
            var filterChanged = 'filters-changed';
            this.filtersButton.classList.remove(filterError);
            this.filtersButton.classList.remove(filterChanged);
            if (this.isValid) {
                if (hasVisibleChanges) {
                    $("#" + this.filtersButton.id + " .cp-filter-count").text(this.visibleChangedCount);
                    this.filtersButton.classList.add(filterChanged);
                }
            }
            else {
                this.filtersButton.classList.add(filterError);
            }
        }
        var enable = !this.isSubmitting && this.isValid && (hasChanges || this.alwaysEnableSubmit);
        this.submitElements.forEach(function (element) {
            if (enable) {
                element.removeAttribute('disabled');
            }
            else {
                element.setAttribute('disabled', 'disabled');
            }
        });
    };
    FilterSet.prototype.validate = function () {
        this.filters.forEach(function (filter) {
            filter.validate();
        });
    };
    return FilterSet;
}());
var PaymentFilterSet = /** @class */ (function (_super) {
    __extends(PaymentFilterSet, _super);
    function PaymentFilterSet(formId, dateRangeFilter, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        var _this = _super.call(this, formId, __spreadArrays([dateRangeFilter], filters), submitElements, filtersButton) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    PaymentFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    PaymentFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    PaymentFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButtons = $('#Filters-sm-apply').length
            ? [$('#Filters-sm-apply').get(0), $('#Filters-apply').get(0)]
            : [$('#Filters-apply').get(0)];
        var dateRangeFilter;
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        if (startDate && endDate) {
            var startMirrorInput = $('#Filters_StartDate').get(0);
            var endMirrorInput = $('#Filters_EndDate').get(0);
            var startInput = startMirrorInput && startMirrorInput !== startDate
                ? new HtmlMirrorInput(startDate, startMirrorInput)
                : new HtmlInput(startDate);
            var endInput = endMirrorInput && endMirrorInput !== endDate
                ? new HtmlMirrorInput(endDate, endMirrorInput)
                : new HtmlInput(endDate);
            var maxRange = window.location.pathname.toLowerCase().endsWith('/payments')
                ? 31
                : 0;
            dateRangeFilter = new DateRangeFilter(startInput, endInput, maxRange);
            dateRangeFilter.hide();
            var onInputKeyUp = function (event) {
                if (event.keyCode === 13) {
                    applyButtons[0].click();
                    event.preventDefault();
                }
            };
            if (startMirrorInput) {
                startMirrorInput.onkeyup = onInputKeyUp;
            }
            if (endMirrorInput) {
                endMirrorInput.onkeyup = onInputKeyUp;
            }
        }
        var cutoffTime = $(formSelector + " select[name='CutoffTime']").get(0);
        var cutoffTimeFilter;
        if (cutoffTime) {
            cutoffTimeFilter = new CutoffTimeFilter(new HtmlInput(cutoffTime), null, '0');
        }
        var merchantAccount = $(formSelector + " select[name='MerchantAccount']").get(0);
        var merchantAccountFilter;
        if (merchantAccount) {
            merchantAccountFilter = new MerchantAccountTypeFilter(new HtmlInput(merchantAccount), null, '0');
        }
        if (cutoffTimeFilter && merchantAccountFilter) {
            cutoffTimeFilter.setSecondaryFilter(merchantAccountFilter);
            merchantAccountFilter.setSecondaryFilter(cutoffTimeFilter);
            filters.push(cutoffTimeFilter);
            filters.push(merchantAccountFilter);
        }
        var paymentId = $(formSelector + " input[name='PaymentId']").get(0);
        if (paymentId) {
            filters.push(new IntegerValueFilter(new HtmlInput(paymentId), 0, 999999999999));
        }
        var name = $(formSelector + " input[name='Name']").get(0);
        if (name) {
            filters.push(new TextValueFilter(new HtmlInput(name), 100));
        }
        var last4 = $(formSelector + " input[name='Last4']").get(0);
        if (last4) {
            filters.push(new Last4Filter(new HtmlInput(last4)));
        }
        var appReference = $(formSelector + " input[name='ApplicationReference']").get(0);
        if (appReference) {
            filters.push(new TextValueFilter(new HtmlInput(appReference), 100));
        }
        var maxAmount = $(formSelector + " input[name='MaxAmount']").get(0);
        var minAmountFilter;
        if (maxAmount) {
            var minAmount = $(formSelector + " input[name='MinAmount']").get(0);
            var maxAmountFilter = new AmountFilter(new HtmlInput(maxAmount), BLUEFIN_AMOUNT_MIN_VALUE, BLUEFIN_AMOUNT_MAX_VALUE);
            if (minAmount) {
                minAmountFilter = new MinimumAmountFilter(new HtmlInput(minAmount), maxAmountFilter.input, BLUEFIN_AMOUNT_MIN_VALUE, BLUEFIN_AMOUNT_MAX_VALUE);
                filters.push(minAmountFilter);
            }
            filters.push(maxAmountFilter);
        }
        //Sources
        var sourcesElements = [];
        $(formSelector + " input[name^='Sources.']").each(function (index, element) {
            sourcesElements.push(new HtmlInput(element));
        });
        if (sourcesElements.length) {
            var defaultSourcesValues = sourcesElements.map(function (_) { return ''; });
            filters.push(new MultiInputFilter(sourcesElements, defaultSourcesValues));
        }
        // Statuses
        var statusElements = [];
        $(formSelector + " input[name^='Statuses.']").each(function (index, element) {
            statusElements.push(new HtmlInput(element));
        });
        if (statusElements.length) {
            var defaultStatusValues = statusElements.map(function (_) { return ''; });
            filters.push(new MultiInputFilter(statusElements, defaultStatusValues));
        }
        // PaymentTypes
        var payTypeElements = [];
        $(formSelector + " input[name^='PaymentTypes.']").each(function (index, element) {
            payTypeElements.push(new HtmlInput(element));
        });
        if (payTypeElements.length > 0) {
            var defaultPayTypeValues = payTypeElements.map(function (_) { return ''; });
            filters.push(new MultiInputFilter(payTypeElements, defaultPayTypeValues));
        }
        var filtersButton = $('#filters-button').get(0);
        return new PaymentFilterSet(HtmlId.coalesce(formId), dateRangeFilter, filters, applyButtons, filtersButton);
    };
    return PaymentFilterSet;
}(FilterSet));
var SettlementListFilterSet = /** @class */ (function (_super) {
    __extends(SettlementListFilterSet, _super);
    function SettlementListFilterSet(formId, dateRangeFilter, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        var _this = _super.call(this, formId, __spreadArrays([dateRangeFilter], filters), submitElements, filtersButton) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    SettlementListFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    SettlementListFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    SettlementListFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButtons = [$('#Filters-sm-apply').get(0), $('#Filters-apply').get(0)];
        var dateRangeFilter;
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        if (startDate && endDate) {
            var startMirrorInput = $('#Filters_StartDate').get(0);
            var endMirrorInput = $('#Filters_EndDate').get(0);
            var startInput = startMirrorInput && startMirrorInput !== startDate
                ? new HtmlMirrorInput(startDate, startMirrorInput)
                : new HtmlInput(startDate);
            var endInput = endMirrorInput && endMirrorInput !== endDate
                ? new HtmlMirrorInput(endDate, endMirrorInput)
                : new HtmlInput(endDate);
            dateRangeFilter = new DateRangeFilter(startInput, endInput, 31);
            dateRangeFilter.hide();
            var onInputKeyUp = function (event) {
                if (event.keyCode === 13) {
                    applyButtons[0].click();
                    event.preventDefault();
                }
            };
            if (startMirrorInput) {
                startMirrorInput.onkeyup = onInputKeyUp;
            }
            if (endMirrorInput) {
                endMirrorInput.onkeyup = onInputKeyUp;
            }
        }
        var maxAmount = $(formSelector + " input[name='MaxAmount']").get(0);
        var minAmountFilter;
        if (maxAmount) {
            var minAmount = $(formSelector + " input[name='MinAmount']").get(0);
            var maxAmountFilter = new AmountFilter(new HtmlInput(maxAmount), BLUEFIN_AMOUNT_MIN_VALUE, BLUEFIN_AMOUNT_MAX_VALUE);
            if (minAmount) {
                minAmountFilter = new MinimumAmountFilter(new HtmlInput(minAmount), maxAmountFilter.input, BLUEFIN_AMOUNT_MIN_VALUE, BLUEFIN_AMOUNT_MAX_VALUE);
                filters.push(minAmountFilter);
            }
            filters.push(maxAmountFilter);
        }
        var paymentType = $(formSelector + " select[name='PaymentType']").get(0);
        if (paymentType) {
            filters.push(new SingleInputFilter(new HtmlInput(paymentType), '0'));
        }
        var merchantAccount = $(formSelector + " select[name='MerchantAccount']").get(0);
        if (merchantAccount) {
            filters.push(new MerchantAccountTypeFilter(new HtmlInput(merchantAccount), null, '0'));
        }
        var activityElements = [];
        $(formSelector + " input[name^='Activity.']").each(function (index, element) {
            activityElements.push(new HtmlInput(element));
        });
        if (activityElements.length) {
            var defaultActivityValues = [];
            for (var i = 0; i < activityElements.length; i++) {
                defaultActivityValues.push('');
            }
            filters.push(new MultiInputFilter(activityElements, defaultActivityValues));
        }
        var filtersButton = $('#filters-button').get(0);
        return new SettlementListFilterSet(HtmlId.coalesce(formId), dateRangeFilter, filters, applyButtons, filtersButton);
    };
    return SettlementListFilterSet;
}(FilterSet));
var SettlementSummaryFilterSet = /** @class */ (function (_super) {
    __extends(SettlementSummaryFilterSet, _super);
    function SettlementSummaryFilterSet(formId, dateRangeFilter, merchantAccountFilter, submitElements) {
        var _this = _super.call(this, formId, [dateRangeFilter, merchantAccountFilter], submitElements) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    SettlementSummaryFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    SettlementSummaryFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    SettlementSummaryFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        var startInput = new HtmlInput(startDate);
        var endInput = new HtmlInput(endDate);
        var maxRange = window.location.pathname.toLowerCase().endsWith('/settlements')
            ? 31
            : 0;
        var dateRangeFilter = new DateRangeFilter(startInput, endInput, maxRange);
        var merchantAccount = $(formSelector + " select[name='MerchantAccount']").get(0);
        var merchantAccountFilter = new MerchantAccountTypeFilter(new HtmlInput(merchantAccount), null, '0');
        var applyButton = [$('#Filters-apply').get(0)];
        return new SettlementSummaryFilterSet(HtmlId.coalesce(formId), dateRangeFilter, merchantAccountFilter, applyButton);
    };
    return SettlementSummaryFilterSet;
}(FilterSet));
var ScheduledPaymentsFilterSet = /** @class */ (function (_super) {
    __extends(ScheduledPaymentsFilterSet, _super);
    function ScheduledPaymentsFilterSet(formId, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        return _super.call(this, formId, filters, submitElements, filtersButton) || this;
    }
    ScheduledPaymentsFilterSet.prototype.updateDateFilter = function () {
        this.updateFiltersDisplay();
    };
    ScheduledPaymentsFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButton = [$('#Filters-sm-apply').get(0)];
        // UB Account Number
        var accountNumber = $(formSelector + " input[name='AccountNumber']").get(0);
        if (accountNumber) {
            filters.push(new TextValueFilter(new HtmlInput(accountNumber), 100));
        }
        // Member Login Email
        var memberLogin = $(formSelector + " input[name='MemberLogin']").get(0);
        if (memberLogin) {
            filters.push(new TextValueFilter(new HtmlInput(memberLogin), 50));
        }
        // Amount to Pay
        var amountToPay = $(formSelector + " select[name='AmountToPay']").get(0);
        if (amountToPay) {
            filters.push(new SingleInputFilter(new HtmlInput(amountToPay), '0'));
        }
        // Agency Url Code
        var urlCode = $(formSelector + " input[name='AgencyUrlCode']").get(0);
        if (urlCode) {
            filters.push(new TextValueFilter(new HtmlInput(urlCode), 50));
        }
        // Target Date Filters
        var targetDateFrom = $(formSelector + " input[name='TargetDateFrom']").get(0);
        var targetDateTo = $(formSelector + " input[name='TargetDateTo']").get(0);
        if (targetDateFrom && targetDateTo) {
            filters.push(new DateRangeFilter(new HtmlInput(targetDateFrom), new HtmlInput(targetDateTo), null, null, true));
        }
        // Created Date Filters
        var createdDateFrom = $(formSelector + " input[name='CreatedDateFrom']").get(0);
        var createdDateTo = $(formSelector + " input[name='CreatedDateTo']").get(0);
        if (createdDateFrom && createdDateTo) {
            filters.push(new DateRangeFilter(new HtmlInput(createdDateFrom), new HtmlInput(createdDateTo), null, null, true));
        }
        var filtersButton = $('#filters-button').get(0);
        return new ScheduledPaymentsFilterSet(HtmlId.coalesce(formId), filters, applyButton, filtersButton);
    };
    return ScheduledPaymentsFilterSet;
}(FilterSet));
var ProfileReportFilterSet = /** @class */ (function (_super) {
    __extends(ProfileReportFilterSet, _super);
    function ProfileReportFilterSet(formId, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        return _super.call(this, formId, filters, submitElements, filtersButton) || this;
    }
    ProfileReportFilterSet.prototype.updateDateFilter = function () {
        this.updateFiltersDisplay();
    };
    ProfileReportFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButton = [$('#Filters-sm-apply').get(0)];
        // UB Account Number
        var customerAccount = $(formSelector + " input[name='CustomerAccount']").get(0);
        if (customerAccount) {
            filters.push(new TextValueFilter(new HtmlInput(customerAccount), 100));
        }
        // Member Login Email
        var login = $(formSelector + " input[name='Login']").get(0);
        if (login) {
            filters.push(new TextValueFilter(new HtmlInput(login), 50));
        }
        // Primary Account Holder Filter
        var primaryAccountHolder = $(formSelector + " select[name='PrimaryAccountHolder']").get(0);
        if (primaryAccountHolder) {
            filters.push(new SingleInputFilter(new HtmlInput(primaryAccountHolder), "Any"));
        }
        // Paper Bill Filter
        var paperBill = $(formSelector + " select[name='PaperBill']").get(0);
        if (paperBill) {
            filters.push(new SingleInputFilter(new HtmlInput(paperBill), "Any"));
        }
        // Electronic Bill Filter
        var electonicBill = $(formSelector + " select[name='ElectronicBill']").get(0);
        if (electonicBill) {
            filters.push(new SingleInputFilter(new HtmlInput(electonicBill), "Any"));
        }
        // AutoPay Filter
        var autoPay = $(formSelector + " select[name='AutoPay']").get(0);
        if (autoPay) {
            filters.push(new SingleInputFilter(new HtmlInput(autoPay), "Any"));
        }
        // Last Login Date Filters
        var lastLoginDateFrom = $(formSelector + " input[name='LastLoginDateFrom']").get(0);
        var lastLoginDateTo = $(formSelector + " input[name='LastLoginDateTo']").get(0);
        if (lastLoginDateFrom && lastLoginDateTo) {
            filters.push(new DateRangeFilter(new HtmlInput(lastLoginDateFrom), new HtmlInput(lastLoginDateTo), null, null, true));
        }
        // Created Date Filters
        var createdDateFrom = $(formSelector + " input[name='CreatedDateFrom']").get(0);
        var createdDateTo = $(formSelector + " input[name='CreatedDateTo']").get(0);
        if (createdDateFrom && createdDateTo) {
            filters.push(new DateRangeFilter(new HtmlInput(createdDateFrom), new HtmlInput(createdDateTo), null, null, true));
        }
        var filtersButton = $('#filters-button').get(0);
        return new ProfileReportFilterSet(HtmlId.coalesce(formId), filters, applyButton, filtersButton);
    };
    return ProfileReportFilterSet;
}(FilterSet));
var AuditTrailReportFilterSet = /** @class */ (function (_super) {
    __extends(AuditTrailReportFilterSet, _super);
    function AuditTrailReportFilterSet(formId, dateRangeFilter, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        var _this = _super.call(this, formId, __spreadArrays([dateRangeFilter], filters), submitElements, filtersButton) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    AuditTrailReportFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    AuditTrailReportFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    AuditTrailReportFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButtons = $('#Filters-sm-apply').length
            ? [$('#Filters-sm-apply').get(0), $('#Filters-apply').get(0)]
            : [$('#Filters-apply').get(0)];
        var dateAndTimeRangeFilter;
        var startDate = $(formSelector + " input[name='DateFrom']").get(0);
        var startTime = $(formSelector + " input[name='TimeFrom']").get(0);
        var endDate = $(formSelector + " input[name='DateTo']").get(0);
        var endTime = $(formSelector + " input[name='TimeTo']").get(0);
        if (startDate && endDate && startTime && endTime) {
            var startMirrorInput = $('#Filters_DateFrom').get(0);
            var endMirrorInput = $('#Filters_DateTo').get(0);
            var startDateInput = startMirrorInput && startMirrorInput !== startDate
                ? new HtmlMirrorInput(startDate, startMirrorInput)
                : new HtmlInput(startDate);
            startDateInput.hide();
            var endDateInput = endMirrorInput && endMirrorInput !== endDate
                ? new HtmlMirrorInput(endDate, endMirrorInput)
                : new HtmlInput(endDate);
            endDateInput.hide();
            var startTimeInput = new HtmlInput(startTime);
            var endTimeInput = new HtmlInput(endTime);
            // Audit Trail report doesn't currently have any range limitation
            var maxRange = 0;
            dateAndTimeRangeFilter = new DateAndTimeRangeFilter(startDateInput, startTimeInput, endDateInput, endTimeInput, maxRange, false, formatDate(new Date()), '00:00:00', formatDate(new Date()), '23:59:00');
            var onInputKeyUp = function (event) {
                if (event.keyCode === 13) {
                    applyButtons[0].click();
                    event.preventDefault();
                }
            };
            if (startMirrorInput) {
                startMirrorInput.onkeyup = onInputKeyUp;
            }
            if (endMirrorInput) {
                endMirrorInput.onkeyup = onInputKeyUp;
            }
        }
        var auditCategory = $(formSelector + " select[name='AuditCategory']").get(0);
        if (auditCategory) {
            filters.push(new SingleInputFilter(new HtmlInput(auditCategory), "Any"));
        }
        var accountNumber = $(formSelector + " input[name='AccountNumber']").get(0);
        if (accountNumber) {
            filters.push(new TextValueFilter(new HtmlInput(accountNumber), 100));
        }
        var affectedMember = $(formSelector + " input[name='AffectedMember']").get(0);
        if (affectedMember) {
            filters.push(new TextValueFilter(new HtmlInput(affectedMember), 50));
        }
        var changedBy = $(formSelector + " input[name='ChangedBy']").get(0);
        if (changedBy) {
            filters.push(new TextValueFilter(new HtmlInput(changedBy), 50));
        }
        var auditTarget = $(formSelector + " input[name='AuditTarget']").get(0);
        if (auditTarget) {
            filters.push(new TextValueFilter(new HtmlInput(auditTarget), 255));
        }
        var agencyUrlCode = $(formSelector + " input[name='AgencyUrlCode']").get(0);
        if (agencyUrlCode) {
            filters.push(new TextValueFilter(new HtmlInput(agencyUrlCode), 50));
        }
        var filtersButton = $('#filters-button').get(0);
        return new AuditTrailReportFilterSet(HtmlId.coalesce(formId), dateAndTimeRangeFilter, filters, applyButtons, filtersButton);
    };
    return AuditTrailReportFilterSet;
}(FilterSet));
var TransactionReportFilterSet = /** @class */ (function (_super) {
    __extends(TransactionReportFilterSet, _super);
    function TransactionReportFilterSet(formId, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        return _super.call(this, formId, filters, submitElements, filtersButton, true) || this;
    }
    TransactionReportFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var applyButton = [$('#Filters-sm-apply').get(0)];
        // Payment Date Filters
        var paymentDateStart = $(formSelector + " input[name='PaymentStartDate']").get(0);
        var paymentDateEnd = $(formSelector + " input[name='PaymentEndDate']").get(0);
        if (paymentDateStart && paymentDateEnd) {
            filters.push(new DateRangeFilter(new HtmlInput(paymentDateStart), new HtmlInput(paymentDateEnd), null, null, true));
        }
        // Settlement Date Filters
        var settlementDateStart = $(formSelector + " input[name='SettlementStartDate']").get(0);
        var settlementDateEnd = $(formSelector + " input[name='SettlementEndDate']").get(0);
        if (settlementDateStart && settlementDateEnd) {
            filters.push(new DateRangeFilter(new HtmlInput(settlementDateStart), new HtmlInput(settlementDateEnd), null, null, true));
        }
        // Check Return Date Filters
        var checkReturnDateStart = $(formSelector + " input[name='CheckReturnStartDate']").get(0);
        var checkReturnDateEnd = $(formSelector + " input[name='CheckReturnEndDate']").get(0);
        if (checkReturnDateStart && checkReturnDateEnd) {
            filters.push(new DateRangeFilter(new HtmlInput(checkReturnDateStart), new HtmlInput(checkReturnDateEnd), null, null, true));
        }
        // Batch Date Filters
        var batchStartDate = $(formSelector + " input[name='BatchStartDate']").get(0);
        var batchEndDate = $(formSelector + " input[name='BatchEndDate']").get(0);
        if (batchStartDate && batchEndDate) {
            filters.push(new DateRangeFilter(new HtmlInput(batchStartDate), new HtmlInput(batchEndDate), null, null, true));
        }
        // Account Number
        var accountNumber = $(formSelector + " input[name='AccountNumber']").get(0);
        if (accountNumber) {
            filters.push(new TextValueFilter(new HtmlInput(accountNumber), 50));
        }
        // SBLookup
        var sbLookup = $(formSelector + " input[name='SBLookup']").get(0);
        if (sbLookup) {
            filters.push(new TextValueFilter(new HtmlInput(sbLookup), 50));
        }
        // Member Login
        var login = $(formSelector + " input[name='Member']").get(0);
        if (login) {
            filters.push(new TextValueFilter(new HtmlInput(login), 100));
        }
        // Provider Key
        var providerKey = $(formSelector + " input[name='ProviderKey']").get(0);
        if (providerKey) {
            filters.push(new TextValueFilter(new HtmlInput(providerKey), 50));
        }
        // Source
        var sourcesElements = [];
        $(formSelector + " input[name^='Sources.']").each(function (_, element) {
            sourcesElements.push(new HtmlInput(element));
        });
        if (sourcesElements.length) {
            var defaultSourcesValues = sourcesElements.map(function (_) { return ''; });
            filters.push(new MultiInputFilter(sourcesElements, defaultSourcesValues));
        }
        // Payment Type
        var payTypeElements = [];
        $(formSelector + " input[name^='PaymentTypes.']").each(function (_, element) {
            payTypeElements.push(new HtmlInput(element));
        });
        if (payTypeElements.length > 0) {
            var defaultPayTypeValues = payTypeElements.map(function (_) { return ''; });
            filters.push(new MultiInputFilter(payTypeElements, defaultPayTypeValues));
        }
        var filtersButton = $('#filters-button').get(0);
        return new TransactionReportFilterSet(HtmlId.coalesce(formId), filters, applyButton, filtersButton);
    };
    return TransactionReportFilterSet;
}(FilterSet));
var AdoptionRatesFilterSet = /** @class */ (function (_super) {
    __extends(AdoptionRatesFilterSet, _super);
    function AdoptionRatesFilterSet(formId, dateRangeFilter, submitElements) {
        var _this = _super.call(this, formId, [dateRangeFilter], submitElements) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    AdoptionRatesFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    AdoptionRatesFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    AdoptionRatesFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        var startInput = new HtmlInput(startDate);
        var endInput = new HtmlInput(endDate);
        var maxRange = window.location.pathname.toLowerCase().endsWith('/adoptionrates')
            ? 120
            : 0;
        var dateRangeFilter = new DateRangeFilter(startInput, endInput, maxRange);
        var applyButton = [$('#Filters-apply').get(0)];
        return new AdoptionRatesFilterSet(HtmlId.coalesce(formId), dateRangeFilter, applyButton);
    };
    return AdoptionRatesFilterSet;
}(FilterSet));
var EBillDeliveryFilterSet = /** @class */ (function (_super) {
    __extends(EBillDeliveryFilterSet, _super);
    function EBillDeliveryFilterSet(formId, dateRangeFilter, filters, submitElements) {
        var _this = _super.call(this, formId, __spreadArrays([dateRangeFilter], filters), submitElements) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    EBillDeliveryFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    EBillDeliveryFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    EBillDeliveryFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        var startInput = new HtmlInput(startDate);
        var endInput = new HtmlInput(endDate);
        var dateRangeFilter = new DateRangeFilter(startInput, endInput, 0);
        var agencyNameOrUrlCode = $(formSelector + " input[name='NameOrUrlCode']").get(0);
        if (agencyNameOrUrlCode) {
            filters.push(new TextValueFilter(new HtmlInput(agencyNameOrUrlCode), 50));
        }
        var applyButton = [$('#Filters-apply').get(0)];
        return new EBillDeliveryFilterSet(HtmlId.coalesce(formId), dateRangeFilter, filters, applyButton);
    };
    return EBillDeliveryFilterSet;
}(FilterSet));
var PayFactoryFeesReportFilterSet = /** @class */ (function (_super) {
    __extends(PayFactoryFeesReportFilterSet, _super);
    function PayFactoryFeesReportFilterSet(formId, dateRangeFilter, filters, submitElements) {
        var _this = _super.call(this, formId, __spreadArrays([dateRangeFilter], filters), submitElements) || this;
        _this.dateRangeFilter = dateRangeFilter;
        return _this;
    }
    PayFactoryFeesReportFilterSet.prototype.updateStartDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.startDateInput, value);
        this.updateFiltersDisplay();
    };
    PayFactoryFeesReportFilterSet.prototype.updateEndDateFilter = function (value) {
        this.dateRangeFilter.onBoundValueChanged(this.dateRangeFilter.endDateInput, value);
        this.updateFiltersDisplay();
    };
    PayFactoryFeesReportFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var startDate = $(formSelector + " input[name='StartDate']").get(0);
        var endDate = $(formSelector + " input[name='EndDate']").get(0);
        var startInput = new HtmlInput(startDate);
        var endInput = new HtmlInput(endDate);
        var dateRangeFilter = new DateRangeFilter(startInput, endInput, 0);
        var agencyName = $(formSelector + " input[name='AgencyName']").get(0);
        if (agencyName) {
            filters.push(new TextValueFilter(new HtmlInput(agencyName), 50));
        }
        var applyButton = [$('#Filters-apply').get(0)];
        return new PayFactoryFeesReportFilterSet(HtmlId.coalesce(formId), dateRangeFilter, filters, applyButton);
    };
    return PayFactoryFeesReportFilterSet;
}(FilterSet));
var ManageAgenciesFilterSet = /** @class */ (function (_super) {
    __extends(ManageAgenciesFilterSet, _super);
    function ManageAgenciesFilterSet(formId, filters, submitElements) {
        return _super.call(this, formId, filters, submitElements) || this;
    }
    ManageAgenciesFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var endpoint = $(formSelector + " input[name='Endpoint']").get(0);
        if (endpoint) {
            filters.push(new TextValueFilter(new HtmlInput(endpoint), 100));
        }
        var name = $(formSelector + " input[name='Name']").get(0);
        if (name) {
            filters.push(new TextValueFilter(new HtmlInput(name), 255));
        }
        var slot = $(formSelector + " input[name='Slot']").get(0);
        if (slot) {
            filters.push(new IntegerValueFilter(new HtmlInput(slot), 0, 9999999));
        }
        var status = $(formSelector + " select[name='Status']").get(0);
        if (status) {
            filters.push(new SingleInputFilter(new HtmlInput(status), '0'));
        }
        var applyButton = [$('#Filters-apply').get(0)];
        return new ManageAgenciesFilterSet(HtmlId.coalesce(formId), filters, applyButton);
    };
    return ManageAgenciesFilterSet;
}(FilterSet));
var UsersFilterSet = /** @class */ (function (_super) {
    __extends(UsersFilterSet, _super);
    function UsersFilterSet(formId, filters, submitElements, filtersButton) {
        if (filtersButton === void 0) { filtersButton = null; }
        return _super.call(this, formId, filters, submitElements, filtersButton, true) || this;
    }
    UsersFilterSet.build = function (formId) {
        var formSelector = "#" + formId;
        var filters = [];
        var login = $(formSelector + " input[name='Login']").get(0);
        if (login) {
            filters.push(new TextValueFilter(new HtmlInput(login), 100));
        }
        var accountNumber = $(formSelector + " input[name='AccountNumber']").get(0);
        if (accountNumber) {
            filters.push(new TextValueFilter(new HtmlInput(accountNumber), 255));
        }
        var status = $(formSelector + " select[name='Status']").get(0);
        if (status) {
            filters.push(new SingleInputFilter(new HtmlInput(status), '0'));
        }
        var emailVerified = $(formSelector + " select[name='EmailVerified']").get(0);
        if (emailVerified) {
            filters.push(new SingleInputFilter(new HtmlInput(emailVerified), '0'));
        }
        var isAdmin = $(formSelector + " select[name='IsAdmin']").get(0);
        if (isAdmin) {
            filters.push(new SingleInputFilter(new HtmlInput(isAdmin), '0'));
        }
        var filtersButton = $('#filters-button').get(0);
        var applyButton = [$('#Filters-sm-apply').get(0)];
        return new UsersFilterSet(HtmlId.coalesce(formId), filters, applyButton, filtersButton);
    };
    return UsersFilterSet;
}(FilterSet));
function buildFilters() {
    $('form[data-filter-set]').each(function (_, form) {
        var filterSetType = form.dataset.filterSet;
        if (filterSetType === 'payment') {
            paymentFilterSet = PaymentFilterSet.build(form.id);
        }
        else if (filterSetType === 'settlement') {
            settlementSummaryFilterSet = SettlementSummaryFilterSet.build(form.id);
        }
        else if (filterSetType === 'settlementList') {
            settlementListFilterSet = SettlementListFilterSet.build(form.id);
        }
        else if (filterSetType === 'scheduled-payments') {
            scheduledPaymentsFilterSet = ScheduledPaymentsFilterSet.build(form.id);
        }
        else if (filterSetType === 'profile-report') {
            profileReportFilterSet = ProfileReportFilterSet.build(form.id);
        }
        else if (filterSetType === 'audit-trail-report') {
            auditTrailReportFilterSet = AuditTrailReportFilterSet.build(form.id);
        }
        else if (filterSetType === 'transaction-report') {
            transactionReportFilterSet = TransactionReportFilterSet.build(form.id);
        }
        else if (filterSetType === 'adoption-rates') {
            adoptionRatesFilterSet = AdoptionRatesFilterSet.build(form.id);
        }
        else if (filterSetType === 'e-bill-delivery') {
            eBillDeliveryFilterSet = EBillDeliveryFilterSet.build(form.id);
        }
        else if (filterSetType === 'payfactory-fees') {
            payFactoryFeesReportFilterSet = PayFactoryFeesReportFilterSet.build(form.id);
        }
        else if (filterSetType === 'manage-agencies') {
            manageAgenciesFilterSet = ManageAgenciesFilterSet.build(form.id);
        }
        else if (filterSetType === 'users') {
            usersFilterSet = UsersFilterSet.build(form.id);
        }
    });
}
;
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var cpoForms = [];
// The below regex was found at http://www.regular-expressions.info/email.html
// see there for a full explanation.
// This regex accepts either an empty string or a valid email to facilitate optional fields.
// If the email is required, then the 'email' type input should have the 'required' attribute added.
// The provided flags are:
//   m - multiline, the ^ and $ characters in the regex ensure the start and end of the line are matched, respectively.
//   i - case insensitive
var emailPattern = new RegExp(/^$|^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/, 'mi');
$(function () {
    initializeForms();
    var input = $(".no-new-lines");
    input.on("input", function (e) {
        var target = e.target;
        target.value = target.value.replace(/[\n\r]+/g, " ");
    });
});
function initializeForms() {
    $('form[data-cpo-form]').each(function (index, form) {
        var submitId = $(form).find('button[type="submit"]').get(0).id;
        var fields = [];
        $(form).find('input[data-cpo-field],textarea[data-cpo-field],select[data-cpo-field]')
            .each(function (_, input) {
            var htmlInput = new HtmlInput(input);
            var field;
            if (input.type === 'number') {
                field = new CpoNumberFormField(htmlInput);
            }
            else if (input.type === 'date') {
                field = new CpoDateFormField(htmlInput);
            }
            else if (input.type === 'time') {
                field = new CpoTimeFormField(htmlInput);
            }
            else if (input.type === 'email') {
                field = new CpoEmailFormField(htmlInput);
            }
            else {
                field = new CpoFormField(htmlInput);
            }
            fields.push(field);
        });
        cpoForms.push(new CpoForm(form, fields, new HtmlId(submitId)));
    });
    if (cpoForms.length > 0) {
        window.onbeforeunload = function () {
            if (cpoForms.filter(function (f) { return f.hasChanges && !f.isSubmitting; }).length > 0) {
                return 'Are you sure you want to leave? Any unsaved changes will be lost.';
            }
        };
        // If any forms are suppressing on before load then remove it
        if (cpoForms.filter(function (f) { return f.isSuppressingBeforeUnload; }).length > 0) {
            window.onbeforeunload = null;
        }
    }
}
var CpoForm = /** @class */ (function () {
    function CpoForm(form, fields, submitId) {
        var _this = this;
        this.form = form;
        this.fields = fields;
        this.submitId = submitId;
        this.changed = false;
        this.submitting = false;
        this.submitButton = this.submitId.getElement();
        this.fields.forEach(function (field) {
            // If there is more action beyond the standard form event handlers
            if (field.input.inputElement.dataset['input']) {
                var additionalMethod_1 = new Function(field.input.inputElement.dataset['input'].toString());
                field.input.inputElement.oninput = function () { _this.onFieldChanged(); additionalMethod_1(); };
                field.input.inputElement.onchange = function () { _this.onFieldChanged(); additionalMethod_1(); };
            }
            else {
                field.input.inputElement.oninput = function () { return _this.onFieldChanged(); };
                field.input.inputElement.onchange = function () { return _this.onFieldChanged(); };
            }
        });
        this.form.onsubmit = function () {
            return _this.submit();
        };
        this.form.noValidate = true;
        this.suppressBeforeUnload = AttributeValue.forBoolean(form, "suppressBeforeUnload");
    }
    Object.defineProperty(CpoForm.prototype, "hasChanges", {
        get: function () { return this.changed; },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(CpoForm.prototype, "isSubmitting", {
        get: function () { return this.submitting; },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(CpoForm.prototype, "isSuppressingBeforeUnload", {
        get: function () { return this.suppressBeforeUnload.hasValue; },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(CpoForm.prototype, "isValid", {
        get: function () {
            return this.fields.filter(function (f) { return !f.isValid; }).length === 0;
        },
        enumerable: true,
        configurable: true
    });
    CpoForm.prototype.onFieldChanged = function () {
        this.changed = true;
        this.validate();
    };
    CpoForm.prototype.submit = function () {
        this.validate();
        if (this.isValid) {
            this.submitting = true;
            setButtonSubmittingState(this.submitId, true);
        }
        return this.isValid;
    };
    CpoForm.prototype.validate = function () {
        setButtonState(this.submitButton, ElementState.Disabled);
        this.fields.forEach(function (field) {
            field.validate();
        });
        if (this.isValid) {
            setButtonState(this.submitButton, ElementState.Enabled);
        }
    };
    return CpoForm;
}());
var CpoFormField = /** @class */ (function () {
    function CpoFormField(input) {
        this.input = input;
        this.isRequired = AttributeValue.forBoolean(input.inputElement, "required");
    }
    Object.defineProperty(CpoFormField.prototype, "isValid", {
        get: function () { return this.valid; },
        enumerable: true,
        configurable: true
    });
    CpoFormField.prototype.clearError = function () {
        var el = $(this.input.inputElement);
        // Preserve server side error messages
        if (!el.hasClass("input-validation-error")) {
            el.parent().removeClass('invalid');
        }
    };
    CpoFormField.prototype.setError = function (message) {
        var parent = $(this.input.inputElement).parent();
        parent.addClass('invalid');
        parent.parent().find('.cp-input-error-message').text(message);
        parent.parent().find('.cp-input-error-message').parent().removeClass('d-none');
    };
    CpoFormField.prototype.validate = function () {
        this.clearError();
        var result = this.validateValue();
        if (result.isValid) {
            this.valid = true;
        }
        else {
            this.valid = false;
            this.setError(result.errorMessage);
        }
    };
    CpoFormField.prototype.validateValue = function () {
        var value = this.input.getValue();
        if (this.isRequired.hasValue && (value === null || value.length === 0)) {
            return ValidationResult.Err("This field is required");
        }
        return ValidationResult.Ok();
    };
    return CpoFormField;
}());
var CpoNumberFormField = /** @class */ (function (_super) {
    __extends(CpoNumberFormField, _super);
    function CpoNumberFormField(input) {
        var _this = _super.call(this, input) || this;
        _this.input = input;
        _this.minimum = AttributeValue.forNumeric(input.inputElement, "minimum");
        _this.maximum = AttributeValue.forNumeric(input.inputElement, "maximum");
        _this.precision = AttributeValue.forNumeric(input.inputElement, "precision");
        // Assign corresponding max input if it is a minimum
        if (input.inputElement.id.indexOf("minimum") >= 0) {
            _this.maxInputId = input.inputElement.id.replace("min", "max");
        }
        return _this;
    }
    CpoNumberFormField.prototype.validateValue = function () {
        var value = this.input.getValue();
        var numberValue = +value;
        if (value !== "") {
            if (this.maxInputId) {
                var maxInput = $('#' + this.maxInputId);
                if (maxInput) {
                    var maxAmount = maxInput.val();
                    if (maxAmount !== "" && +maxAmount < numberValue) {
                        return ValidationResult.Err("Minimum must be less than the maximum");
                    }
                }
            }
            if (this.minimum.hasValue && numberValue < this.minimum.value) {
                return ValidationResult.Err("Must be greater than or equal to " + this.minimum.displayValue);
            }
            if (this.maximum.hasValue && numberValue > this.maximum.value) {
                return ValidationResult.Err("Must be less than or equal to " + this.maximum.displayValue);
            }
            if (this.precision.hasValue && (value.split('.')[1] || []).length > this.precision.value) {
                if (this.precision.value === 0) {
                    return ValidationResult.Err('Must be an integer');
                }
                return ValidationResult.Err("Only " + this.precision.displayValue + " decimal places are allowed");
            }
        }
        return _super.prototype.validateValue.call(this);
    };
    return CpoNumberFormField;
}(CpoFormField));
var CpoDateFormField = /** @class */ (function (_super) {
    __extends(CpoDateFormField, _super);
    function CpoDateFormField(input) {
        var _this = _super.call(this, input) || this;
        _this.input = input;
        _this.minimum = AttributeValue.forDate(input.inputElement, "minimum");
        _this.maximum = AttributeValue.forDate(input.inputElement, "maximum");
        return _this;
    }
    CpoDateFormField.prototype.validateValue = function () {
        if (this.input.inputElement.disabled) {
            return ValidationResult.Ok();
        }
        var value = this.input.getValue();
        var dateParts = value.split('-');
        var year = parseInt(dateParts[0]);
        var month = parseInt(dateParts[1]) - 1;
        var day = parseInt(dateParts[2]);
        var dateValue = new Date(year, month, day);
        if (isNaN(dateValue.getMilliseconds())) {
            return ValidationResult.Err("Must be a valid date");
        }
        if (this.minimum.hasValue && dateValue < this.minimum.value) {
            return ValidationResult.Err("Must be greater than or equal to " + this.minimum.displayValue);
        }
        if (this.maximum.hasValue && dateValue > this.maximum.value) {
            return ValidationResult.Err("Must be less than or equal to " + this.maximum.displayValue);
        }
        return _super.prototype.validateValue.call(this);
    };
    return CpoDateFormField;
}(CpoFormField));
var CpoTimeFormField = /** @class */ (function (_super) {
    __extends(CpoTimeFormField, _super);
    function CpoTimeFormField(input) {
        var _this = _super.call(this, input) || this;
        _this.input = input;
        _this.minimum = AttributeValue.forTime(input.inputElement, "minimum");
        _this.maximum = AttributeValue.forTime(input.inputElement, "maximum");
        return _this;
    }
    CpoTimeFormField.prototype.validateValue = function () {
        if (this.input.inputElement.disabled) {
            return ValidationResult.Ok();
        }
        var newDate = normalizeTime(this.input.getValue());
        if (newDate === undefined) {
            return ValidationResult.Err("Must be a valid time");
        }
        if ((this.minimum.hasValue && newDate < this.minimum.value) ||
            (this.maximum.hasValue && newDate > this.maximum.value)) {
            return ValidationResult.Err("Must be between " + this.minimum.displayValue + " and " + this.maximum.displayValue);
        }
        return _super.prototype.validateValue.call(this);
    };
    return CpoTimeFormField;
}(CpoFormField));
var CpoEmailFormField = /** @class */ (function (_super) {
    __extends(CpoEmailFormField, _super);
    function CpoEmailFormField(input) {
        var _this = _super.call(this, input) || this;
        _this.input = input;
        return _this;
    }
    // Override this function so that server side error messages are cleared
    // from controls when valid emails are entered.
    CpoEmailFormField.prototype.clearError = function () {
        var el = $(this.input.inputElement);
        el.parent().removeClass('invalid');
    };
    CpoEmailFormField.prototype.validateValue = function () {
        if (this.input.inputElement.disabled) {
            return ValidationResult.Ok();
        }
        var value = this.input.getValue();
        if (!value.match(emailPattern)) {
            return ValidationResult.Err('Must be a valid email');
        }
        return _super.prototype.validateValue.call(this);
    };
    return CpoEmailFormField;
}(CpoFormField));
var AttributeValue = /** @class */ (function () {
    function AttributeValue(attribute, value, displayValue, hasValue) {
        this.attribute = attribute;
        this.value = value;
        this.displayValue = displayValue;
        this.hasValue = hasValue;
    }
    AttributeValue.withValue = function (attribute, value, displayValue) {
        return new AttributeValue(attribute, value, displayValue, true);
    };
    AttributeValue.noValue = function (attribute) {
        return new AttributeValue(attribute, null, '', false);
    };
    AttributeValue.forNumeric = function (element, attribute) {
        if (element.dataset[attribute]) {
            return AttributeValue.withValue(attribute, +element.dataset[attribute], element.dataset[attribute]);
        }
        return AttributeValue.noValue(attribute);
    };
    AttributeValue.forDate = function (element, attribute) {
        if (element.dataset[attribute]) {
            var date = new Date(element.dataset[attribute]);
            return AttributeValue.withValue(attribute, date, date.getMonth() + 1 + "-" + date.getDate() + "-" + date.getFullYear());
        }
        return AttributeValue.noValue(attribute);
    };
    AttributeValue.forTime = function (element, attribute) {
        if (element.dataset[attribute]) {
            var time = element.dataset[attribute].split(':');
            var hours = parseInt(time[0]);
            var minutes = parseInt(time[1]);
            var date = new Date(0, 0, 0, hours, minutes);
            return AttributeValue.withValue(attribute, date, (hours <= 12 ? hours : hours - 12) + ":" + time[1] + " " + (hours < 12 ? "AM" : "PM"));
        }
        return AttributeValue.noValue(attribute);
    };
    AttributeValue.forBoolean = function (element, attribute) {
        if (element.dataset[attribute]) {
            return AttributeValue.withValue(attribute, true, element.dataset[attribute]);
        }
        return AttributeValue.noValue(attribute);
    };
    return AttributeValue;
}());
function getFormForInput(input) {
    var matches = cpoForms.filter(function (f) { return f.form === input.form; });
    if (matches.length) {
        return matches[0];
    }
    return undefined;
}
function setElementFocusOnForm(formId, elementId) {
    HtmlId.coalesce(formId).getElement().attr('action', "#" + elementId);
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function executeLogicWithUrlCode(logic) {
    var urlCode = $('#OrganizationUrlCode').val().toString();
    if (urlCode === '') {
        createToast('Please fill in an Organization Url Code and try again.');
        return;
    }
    logic(urlCode);
}
function removeStaleProfiles(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var testMode = $('#StalePaymentProfileFilters_TestMode').prop('checked');
        var months = $('#StalePaymentProfileFilters_Months').val().toString();
        var newUrl = url + "?OrganizationUrlCode=" + urlCode + "&StalePaymentProfileFilters.TestMode=" + testMode + "&StalePaymentProfileFilters.Months=" + months;
        downloadTransitionFile(button, 'StaleProfiles.xlsx', newUrl, 'POST');
    });
}
function transitionOrganization(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var bluefinAccount = $('#UpdateOrganizationPutModel_BluefinAccountId').val().toString();
        var bluefinApiKey = $('#UpdateOrganizationPutModel_BluefinApiKey').val().toString();
        var batchCutoff = $('#UpdateOrganizationPutModel_BatchCutoffTime').val().toString();
        var sendEmails = $('#UpdateOrganizationPutModel_SendEmails').prop('checked');
        if (bluefinAccount === "" || bluefinApiKey === "" || batchCutoff === "") {
            createToast('All fields must be filled out to transition an organization.');
            return;
        }
        var newUrl = url + "?OrganizationUrlCode=" + urlCode + "&UpdateOrganizationPutModel.BluefinAccountId=" + bluefinAccount + "&UpdateOrganizationPutModel.BluefinApiKey=" + bluefinApiKey;
        newUrl += "&UpdateOrganizationPutModel.BatchCutoffTime=" + batchCutoff + "&UpdateOrganizationPutModel.SendEmails=" + sendEmails;
        downloadTransitionFile(button, 'ExpiredMemberProfiles.xlsx', newUrl, 'POST');
    });
}
function downloadReport(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var lastPaymentDate = $('#TransitionReportFilters_LastPaymentDate').val().toString();
        var lastLoginDate = $('#TransitionReportFilters_LastLoginDate').val().toString();
        var checkboxValues = $("input[id^='TransitionReportFilters_Exclude']");
        var newUrl = url + "?OrganizationUrlCode=" + urlCode + "&TransitionReportFilters.LastPaymentDate=" + lastPaymentDate + "&TransitionReportFilters.LastLoginDate=" + lastLoginDate;
        var allChecked = true;
        checkboxValues.each(function (i) {
            var checked = checkboxValues[i].checked;
            if (!checked)
                allChecked = false;
            newUrl += "&" + checkboxValues[i].id.replace('_', '.') + "=" + checked;
        });
        if (allChecked) {
            createToast('You cannot exclude all columns. Please include at least one column and try again.');
            return;
        }
        downloadTransitionFile(button, 'TransitionReport.xlsx', newUrl, 'GET');
    });
}
function expireProfiles(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var sbSync = $('#DeactivateProfileFilters_SyncToSpringbrook').prop('checked');
        var newUrl = url + "?OrganizationUrlCode=" + urlCode + "&DeactivateProfileFilters.SyncToSpringbrook=" + sbSync;
        downloadTransitionFile(button, 'ExpiredPaymentProfiles.csv', newUrl, 'POST', contentTypes.csv);
    });
}
function removePaperlessAutopay(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var newUrl = url + "?OrganizationUrlCode=" + urlCode;
        downloadTransitionFile(button, 'ProfileReportExport.csv', newUrl, 'POST', contentTypes.csv);
    });
}
function enableScheduledPayments(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var allowDaysPrior = $('#DaysPrior').prop('checked');
        var daysBeforeString = $('#max-days').val();
        var daysBefore = daysBeforeString ? +daysBeforeString : 0;
        var newUrl = url + "?OrganizationUrlCode=" + urlCode + "&EnableScheduledPaymentsFilters.DaysPrior=" + allowDaysPrior + "&EnableScheduledPaymentsFilters.MaxDaysBeforeDueDate=" + daysBefore;
        var batchSettings = $('#batch-settings-table tr');
        batchSettings.not(":first").each(function (counter, this_row) {
            var row = $(this_row);
            var billingBatchIdInput = row.find('input[name$=".BillingBatchId"]')[0];
            var targetDateInput = row.find('input[name$=".TargetDate"]')[0];
            newUrl += "&" + billingBatchIdInput.name + "=" + billingBatchIdInput.value;
            newUrl += "&" + targetDateInput.name + "=" + targetDateInput.value;
        });
        downloadTransitionFile(button, 'UpdatedAutoPayMemberships.xlsx', newUrl, 'POST');
    });
}
function executeXbpTransition(button, url) {
    executeLogicWithUrlCode(function (urlCode) {
        var newUrl = url + "?OrganizationUrlCode=" + urlCode;
        downloadTransitionFile(button, 'DeactivatedMemberships.xlsx', newUrl, 'POST');
    });
}
function downloadTransitionFile(button, filename, url, verb, expectedContentType) {
    if (expectedContentType === void 0) { expectedContentType = contentTypes.excelSpreadsheetContentType; }
    return __awaiter(this, void 0, void 0, function () {
        var errorMessage, token, shouldAddToken, requestConfig, headers, response, contentType, blob, responseJson, e_1, request_1;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    // Fire up the submit button swirly balls
                    setElementSubmittingState(button, true);
                    errorMessage = 'Export failed.  Please refresh the page and try again.';
                    token = $('input[name="__RequestVerificationToken"]').val();
                    shouldAddToken = (verb === POST || verb === PUT || verb === DELETE);
                    if (!window.fetch) return [3 /*break*/, 9];
                    _a.label = 1;
                case 1:
                    _a.trys.push([1, 7, , 8]);
                    requestConfig = {
                        method: verb,
                        credentials: 'include'
                    };
                    if (shouldAddToken) {
                        headers = new Headers();
                        headers.append('__RequestVerificationToken', token);
                        requestConfig.headers = headers;
                    }
                    return [4 /*yield*/, fetch(url, requestConfig)];
                case 2:
                    response = _a.sent();
                    // if unauthorized exit early and kick to the login page
                    if (response.status === 403) {
                        redirectToLogin();
                        return [2 /*return*/];
                    }
                    contentType = response.headers.get("content-type");
                    if (!(response.ok &&
                        contentType &&
                        contentType.indexOf(expectedContentType) !== -1)) return [3 /*break*/, 4];
                    return [4 /*yield*/, response.blob()];
                case 3:
                    blob = _a.sent();
                    downloadBlobLocally(button, blob, filename, errorMessage);
                    return [3 /*break*/, 6];
                case 4: return [4 /*yield*/, response.json()];
                case 5:
                    responseJson = _a.sent();
                    errorMessage = responseJson.errors[0].toString();
                    handleDownloadError(button, errorMessage);
                    _a.label = 6;
                case 6: return [3 /*break*/, 8];
                case 7:
                    e_1 = _a.sent();
                    handleDownloadError(button, errorMessage);
                    return [3 /*break*/, 8];
                case 8: return [3 /*break*/, 10];
                case 9:
                    try {
                        request_1 = new XMLHttpRequest();
                        if (shouldAddToken) {
                            request_1.setRequestHeader('__RequestVerificationToken', token);
                        }
                        request_1.onreadystatechange = function () {
                            try {
                                if (request_1.readyState !== 4) {
                                    return;
                                }
                                if (request_1.status === 403) {
                                    redirectToLogin();
                                }
                                if (request_1.status === 200 &&
                                    request_1.response.type === expectedContentType) {
                                    downloadBlobLocally(button, request_1.response, filename, errorMessage);
                                }
                                else {
                                    handleDownloadError(button, errorMessage);
                                }
                            }
                            catch (_a) {
                                handleDownloadError(button, errorMessage);
                            }
                        };
                        request_1.open(verb, url);
                        request_1.responseType = 'blob';
                        request_1.send();
                    }
                    catch (_b) {
                        handleDownloadError(button, errorMessage);
                    }
                    _a.label = 10;
                case 10: return [2 /*return*/];
            }
        });
    });
}
function addBatchSettingsRow() {
    var counter = $('#batch-settings-table tr').length - 1;
    $('#batch-settings-table').append("\n        <tr>\n            <td>\n                <input class=\"text-box single-line\" id=\"EnableScheduledPaymentsFilters_BatchSettings_" + counter + "__BillingBatchId\"\n                    name=\"EnableScheduledPaymentsFilters.BatchSettings[" + counter + "].BillingBatchId\" type=\"number\" value=\"\">\n            </td>\n            <td>\n                <input class=\"text-box single-line\" id=\"EnableScheduledPaymentsFilters_BatchSettings_" + counter + "__TargetDate\"\n                name=\"EnableScheduledPaymentsFilters.BatchSettings[" + counter + "].TargetDate\" type=\"date\" value=\"\">\n            </td>\n            <td>\n                <span class=\"cp-button text-danger\" title=\"Delete\" onclick=\"deleteBatchSettingsRow(this)\" style=\"cursor:pointer;\">\n                    <span class=\"fas fa-times pr-md-2\"></span>\n                    <span class=\"d-none d-md-inline\">Delete</span>\n                </span>\n            </td>\n        </tr>");
}
function deleteBatchSettingsRow(button) {
    $(button).closest('tr').remove();
    if ($('#batch-settings-table tr').length > 1) {
        $('#batch-settings-table tr').not(":first").each(function (counter, this_row) {
            var row = $(this_row);
            row.find('input[name$=".BillingBatchId"]').attr('name', "EnableScheduledPaymentsFilters.BatchSettings[" + counter + "].BillingBatchId");
            row.find('input[name$=".BillingBatchId"]').attr('id', "EnableScheduledPaymentsFilters_BatchSettings_" + counter + "__BillingBatchId");
            row.find('input[name$=".TargetDate"]').attr('name', "EnableScheduledPaymentsFilters.BatchSettings[" + counter + "].TargetDate");
            row.find('input[name$=".TargetDate"]').attr('id', "EnableScheduledPaymentsFilters_BatchSettings_" + counter + "__TargetDate");
        });
    }
}
;
$(function () {
    // Disable nav tooltips by default. They are enabled when the nav is expanded
    $('.left-nav [data-toggle="tooltip"]').tooltip('disable');
    initializeSubMenus();
});
function initializeSubMenus() {
    // whenever we hover over a menu item that has a submenu
    $('.nav-group-item,.nav-item').on('mouseover', function () {
        var menuItem = $(this);
        var submenuWrapper = $('> .dropdown-menu:visible,' +
            ' > .nav-item-header > .dropdown-menu:visible,' +
            ' > .nav-group-item-header > .dropdown-menu:visible', menuItem);
        var menuItemPos = submenuPosition(menuItem, submenuWrapper);
        // place the submenu in the correct position relevant to the menu item
        submenuWrapper.css({
            top: menuItemPos.top,
            left: menuItemPos.left
        });
    });
}
function submenuPosition(menuItem, submenuItem) {
    var windowHeight = $('main').height();
    var menuItemHeight = submenuItem.height();
    // grab the menu item's position relative to its positioned parent
    var menuItemPosition = menuItem.position();
    var scrolledMenuPosition = {
        top: menuItemPosition.top,
        left: menuItemPosition.left + Math.round(menuItem.outerWidth())
    };
    if (scrolledMenuPosition.top + menuItemHeight > windowHeight) {
        scrolledMenuPosition.top = windowHeight - menuItemHeight;
    }
    if (scrolledMenuPosition.top < 0) {
        scrolledMenuPosition.top = 0;
    }
    return scrolledMenuPosition;
}
// Check if the nav is currently open - if it is the nav is
// collapsing and tooltips should be enabled, because only
// the icons show while collapsed
function toggleNav() {
    var tooltipFunction = 'disable';
    var navCollapsing = $('.left-nav').hasClass('show');
    if (navCollapsing) {
        tooltipFunction = 'enable';
    }
    $('.left-nav [data-toggle="tooltip"]').tooltip(tooltipFunction);
    $('#collapse-nav-btn').tooltip('hide');
    setNavState(navCollapsing);
}
;
function setNavState(navCollapsing) {
    var currentState = navCollapsing
        ? 'collapsed'
        : 'expanded';
    document.cookie = "__Host-NavState=" + currentState + ";path=/;secure;SameSite=strict;";
}
;
$(function () {
    if (isAtUrl('legacyredirect')) {
        var link_1 = $('#redirect-url')[0];
        window.setTimeout(function () {
            window.location.href = link_1.href;
        }, 20000);
    }
});
;
function makePaymentOptionChanged(option, serviceFeeRate, minimumServiceFee) {
    // if the user is updating the amount in other but
    // didn't select it, don't update the total values
    if (option.id === 'other-payment') {
        var otherSelect = $('#other')[0];
        var otherAmountHiddenInput = $('#other-amount-input')[0];
        otherAmountHiddenInput.value = option.value;
        if (!otherSelect.checked) {
            return;
        }
    }
    var totalElement = $('#total-payment')[0];
    var serviceFeeElement = $('#service-fee')[0];
    var convenienceFeeElement = $('#convenience-fee')[0];
    var subtotal = calculateSubtotal(option);
    var serviceFeeAmount = 0;
    if (serviceFeeRate > 0 && subtotal > 0) {
        serviceFeeAmount = Math.max(bankersRound(subtotal * serviceFeeRate), minimumServiceFee);
    }
    var convenienceFeeAmount = convenienceFeeElement
        ? CurrencyFormatter.toNumber(convenienceFeeElement.innerText)
        : 0;
    var newTotal = subtotal + convenienceFeeAmount;
    if (serviceFeeElement) {
        serviceFeeElement.innerText = CurrencyFormatter.toString(serviceFeeAmount);
        newTotal += serviceFeeAmount;
    }
    var serviceFeeContainerElement = $('#service-fee-container')[0];
    if (serviceFeeContainerElement) {
        if (serviceFeeRate === 0) {
            serviceFeeContainerElement.hidden = true;
        }
        else {
            serviceFeeContainerElement.hidden = false;
        }
    }
    totalElement.innerText = CurrencyFormatter.toString(newTotal);
}
function takePaymentOptionChanged(option, usesAchOverride, allFeeRate, creditFeeRate, achFeeRate, minimumServiceFee) {
    var rateToUse = allFeeRate;
    if (usesAchOverride) {
        // Determine which percent fee rate to use based on which form is showing
        // It is either the credit card or ACH
        var creditRadio = $('#credit')[0];
        var achRadio = $('#electronic-check')[0];
        rateToUse = $('#credit-information')[0] !== undefined
            ? creditFeeRate
            : achFeeRate;
        if (creditRadio !== undefined && achRadio !== undefined) {
            rateToUse = creditRadio.checked
                ? creditFeeRate
                : achFeeRate;
        }
    }
    makePaymentOptionChanged(option, rateToUse, minimumServiceFee);
}
function validateAmount(amount) {
    if (amount <= 0)
        return 'Value must be greater than 0.01';
    if (amount > 999999999.99)
        return 'Value must be less than 999999999.99';
    var value = CurrencyFormatter.toNumber(amount.toFixed(2));
    if (amount !== value)
        return 'Value must have a maximum of two decimal places';
    return null;
}
function setAmountValidity(validityMessage, input, shouldRemoveError) {
    var isValid = validityMessage === null;
    if (!isValid) {
        setErrorState(input, validityMessage, true);
    }
    else if (shouldRemoveError) {
        var hideMessage = input.id !== 'credit-amount';
        removeErrorState(input, hideMessage);
    }
    var submitButton = $('#payment-button')[0];
    if (isValid)
        setButtonState(submitButton, ElementState.Enabled);
    else
        setButtonState(submitButton, ElementState.Disabled);
}
function calculateSubtotal(input, validate) {
    if (validate === void 0) { validate = true; }
    var otherPayment = $('#other-payment');
    var value = 0;
    if (input.id === 'other' || input.id === 'other-payment') {
        value = CurrencyFormatter.toNumber(otherPayment.val());
    }
    else if (input.id === 'credit-amount') {
        value = CurrencyFormatter.toNumber(input.value);
    }
    else {
        var amountCell = $('#' + input.id).closest('tr').find('td');
        value = CurrencyFormatter.toNumber(amountCell[1].innerText);
    }
    if (!validate) {
        return value;
    }
    var amountValidMessage = validateAmount(value);
    if (input.id === 'other') {
        setInputState(otherPayment[0], ElementState.Enabled);
        setAmountValidity(amountValidMessage, input, false);
        return value;
    }
    if (input.id !== 'other-payment' && input.id !== 'credit-amount') {
        setInputState(otherPayment[0], ElementState.Disabled);
    }
    setAmountValidity(amountValidMessage, input, true);
    return value;
}
function autopaySave(input) {
    if (input.checked) {
        $('#auto-pay-options').removeClass('d-none');
        var newMethod = $('#new');
        var newMethodChosen = newMethod.length === 0 || newMethod.is(':checked');
        var savePayment = $('#save-payment');
        if (newMethodChosen && !savePayment.is(':checked'))
            $('#save-payment').trigger("click");
    }
    else {
        $('#auto-pay-options').addClass('d-none');
    }
}
function profileSave(input) {
    if (!input.checked) {
        var newMethod = $('#new');
        var newMethodChosen = newMethod.length === 0 || newMethod.is(':checked');
        if (newMethodChosen)
            resetAutoPay();
    }
    displayDescription();
}
function resetAutoPay() {
    var autopayEnroll = $('#autopay-enroll');
    if (autopayEnroll.is(':checked'))
        $('#autopay-enroll').trigger("click");
}
var FeeMode;
(function (FeeMode) {
    FeeMode["Card"] = "Card";
    FeeMode["Ach"] = "ACH";
    FeeMode["Undefined"] = "Undefined";
})(FeeMode || (FeeMode = {}));
function updateAmountsForPayMethodChange(useExisting, cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, minimumServiceFee, takePayment) {
    if (takePayment === void 0) { takePayment = false; }
    changePaymentType(useExisting);
    var baseAmount = getBaseAmountForPaymentTypeChange(takePayment);
    // Find selected item and if one exists, trigger it's onclick event.
    if (useExisting) {
        // Find if there is a selected profile and trigger its click event if there is.
        var selectedProfile = $("[id^=profile-]:checked")[0];
        if (selectedProfile) {
            selectedProfile.click();
        }
        else {
            updateCompletePaymentAmounts(0, 0, 0, 0, FeeMode.Undefined, 0, baseAmount);
        }
    }
    else {
        // Find the selected payment type and trigger its click event.
        var eCheck = $("#electronic-check:checked")[0];
        var card = $("#credit:checked")[0];
        if (eCheck) {
            eCheck.click();
        }
        else if (card) {
            card.click();
        }
        else if ($("#ach-header")[0]) {
            // If the method selection input isn't present, either ACH or Card isn't supported.
            // We need to manually update based on the accepted payment method.
            updateCompletePaymentAmounts(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, FeeMode.Ach, minimumServiceFee, baseAmount);
        }
        else {
            updateCompletePaymentAmounts(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, FeeMode.Card, minimumServiceFee, baseAmount);
        }
    }
}
function updateAmountsForProfileChange(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, feeMode, minimumServiceFee, takePayment) {
    if (takePayment === void 0) { takePayment = false; }
    resetAutoPay();
    updateCompletePaymentAmounts(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, feeMode, minimumServiceFee, getBaseAmountForPaymentTypeChange(takePayment));
}
function updateAmountsForPaymentTypeChange(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, feeMode, minimumServiceFee, takePayment) {
    if (takePayment === void 0) { takePayment = false; }
    changeAccountType();
    updateCompletePaymentAmounts(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, feeMode, minimumServiceFee, getBaseAmountForPaymentTypeChange(takePayment, false));
}
function getBaseAmountForPaymentTypeChange(takePayment, validate) {
    if (validate === void 0) { validate = true; }
    if (takePayment) {
        var selectedAmount = $('#amount-due-table input[type="radio"]:checked')[0];
        if (selectedAmount !== undefined) {
            return calculateSubtotal(selectedAmount, validate);
        }
        // Accounts in credit status the amount-due-table will not show, so return the credit-amount
        var creditAmount = $('#credit-amount')[0];
        if (creditAmount !== undefined) {
            return calculateSubtotal(creditAmount, validate);
        }
        return 0;
    }
    else {
        return CurrencyFormatter.toNumber($('#base-amount')[0].innerText);
    }
}
function updateCompletePaymentAmounts(cardPercentFee, achPercentFee, cardFlatFee, achFlatFee, feeMode, minimumServiceFee, baseAmount) {
    var totalElement = $('#total-payment')[0];
    var serviceFeeElement = $('#service-fee')[0];
    var serviceFeeContainerElement = $('#service-fee-container')[0];
    var convenienceFeeElement = $('#convenience-fee')[0];
    var convenienceFeeContainerElement = $('#convenience-fee-container')[0];
    // If there isn't a payment method selected, reset the fee and total amounts.
    if (feeMode == FeeMode.Undefined) {
        serviceFeeElement.innerText = "-";
        convenienceFeeElement.innerText = "-";
        totalElement.innerText = CurrencyFormatter.toString(baseAmount);
        return;
    }
    var newServiceFeeAmount;
    var newConvenienceFeeAmount;
    var serviceFeeRate;
    var flatRate;
    if (feeMode == FeeMode.Ach) {
        serviceFeeRate = achPercentFee;
        flatRate = achFlatFee;
    }
    else {
        serviceFeeRate = cardPercentFee;
        flatRate = cardFlatFee;
    }
    newServiceFeeAmount = bankersRound(serviceFeeRate * baseAmount);
    newConvenienceFeeAmount = flatRate;
    if (baseAmount > 0)
        newServiceFeeAmount = Math.max(newServiceFeeAmount, minimumServiceFee);
    var newTotal = baseAmount + newServiceFeeAmount + newConvenienceFeeAmount;
    // Update the Service Fee and Total Amount values.
    if (serviceFeeElement) {
        serviceFeeElement.innerText = CurrencyFormatter.toString(newServiceFeeAmount);
    }
    if (convenienceFeeElement) {
        convenienceFeeElement.innerText = CurrencyFormatter.toString(newConvenienceFeeAmount);
    }
    totalElement.innerText = CurrencyFormatter.toString(newTotal);
    // Finally, hide or show the elements based on if there are fees.
    if (convenienceFeeContainerElement) {
        if (flatRate === 0) {
            convenienceFeeContainerElement.hidden = true;
        }
        else {
            convenienceFeeContainerElement.hidden = false;
        }
    }
    if (serviceFeeContainerElement) {
        if (serviceFeeRate === 0) {
            serviceFeeContainerElement.hidden = true;
        }
        else {
            serviceFeeContainerElement.hidden = false;
        }
    }
}
;
function addItemToTotals(target, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee) {
    setElementSubmittingState(target, true);
    var itemRow = target.parentElement.parentElement;
    var reference = itemRow.cells[0].innerText;
    var description = itemRow.cells[1].innerText;
    var amount = CurrencyFormatter.toNumber(itemRow.cells[2].innerText);
    var costElement = itemRow.getElementsByClassName('item-selection-cost')[0];
    if (!validateEditableAmount(costElement)) {
        setElementSubmittingState(target, false);
        return;
    }
    amount = Number(costElement.value);
    setInputState(costElement, ElementState.Disabled);
    var table = $('#subtotal-table')[0];
    var tbody = table.getElementsByTagName('tbody')[0];
    var newRow = tbody.insertRow(-1);
    $(newRow).attr('data-cy', 'selected-item-row');
    var index = newRow.rowIndex - 1;
    newRow.innerHTML =
        "<input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"ItemsToPurchase_" + index + "__ReferenceNumber\" name=\"ItemsToPurchase[" + index + "].ReferenceNumber\" value=\"" + reference + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"ItemsToPurchase_" + index + "__Description\" name=\"ItemsToPurchase[" + index + "].Description\" value=\"" + description + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"ItemsToPurchase_" + index + "__Amount\" name=\"ItemsToPurchase[" + index + "].Amount\" value=\"" + amount + "\">\n         \n         <td class=\"text-break\">" + reference + " " + (description ? '-' : '') + " " + description + "</td>\n         <td class=\"item-cost\" data-cy=\"selected-item-amount\">\n             " + CurrencyFormatter.toString(amount) + "\n         </td>\n         <td class=\"misc-pay-add-button\">\n             <button id=\"" + reference + "\" class=\"cp-button text-danger float-right\" data-cy=\"remove-item\"\n                     title=\"Remove\" onclick=\"removeItemFromTotals(this, " + minimumTotal + ", " + maximumTotal + ", " + flatFee + ", " + percentFee + ", " + minimumServiceFee + ")\">\n                 <span class=\"fas fa-minus text-danger align-text-center fa-lg\" aria-hidden=\"true\"></span>\n             </button>\n         </td>";
    if (updateTotal(amount, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee))
        cpoForms[0].onFieldChanged();
    setElementSubmittingState(target, false);
    setButtonState(target, ElementState.Disabled);
}
function removeItemFromTotals(target, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee) {
    var row = target.parentElement.parentElement;
    var table = $('#subtotal-table')[0];
    var rowCostCell = row.getElementsByClassName('item-cost')[0];
    var rowCost = CurrencyFormatter.toNumber(rowCostCell.innerText);
    updateTotal(-rowCost, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee);
    table.deleteRow(row.rowIndex);
    reorderTableRows(table);
    setButtonState($("#" + target.id + "-add"), ElementState.Enabled);
    setInputState($("#" + target.id + "-edit"), ElementState.Enabled);
}
function selectAllMiscItems(target, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee) {
    setElementSubmittingState(target, true);
    $("#items-table tr a").each(function () {
        if (!this.classList.contains('disabled')) {
            addItemToTotals(this, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee);
        }
    });
    setElementSubmittingState(target, false);
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function addPaymentToTotals(target, taxUrl, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee) {
    return __awaiter(this, void 0, void 0, function () {
        var typeCodeRow, typeCode, description, amount, isTaxable, taxAmount, costElement, data, result, table, tbody, newRow, index;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(target, true);
                    typeCodeRow = target.parentElement.parentElement;
                    typeCode = typeCodeRow.cells[0].innerText;
                    description = typeCodeRow.cells[1].innerText;
                    amount = CurrencyFormatter.toNumber(typeCodeRow.cells[2].innerText);
                    isTaxable = typeCodeRow.cells[3].innerText.toLowerCase() === 'true';
                    taxAmount = CurrencyFormatter.toNumber(typeCodeRow.cells[4].innerText);
                    costElement = typeCodeRow.getElementsByClassName('item-selection-cost')[0];
                    if (!costElement) return [3 /*break*/, 2];
                    if (!validateEditableAmount(costElement)) {
                        setElementSubmittingState(target, false);
                        return [2 /*return*/];
                    }
                    amount = Number(costElement.value);
                    if (!isTaxable) return [3 /*break*/, 2];
                    data = {
                        types: [new CRType(unescape(typeCode), amount)]
                    };
                    return [4 /*yield*/, apiPost(taxUrl, data)];
                case 1:
                    result = _a.sent();
                    if (result.isError) {
                        createToast('A problem occurred adding the selected item for payment. Please try again later.');
                        setElementSubmittingState(target, false);
                        return [2 /*return*/];
                    }
                    taxAmount = result.value[0].taxAmount;
                    _a.label = 2;
                case 2:
                    table = $('#selected-items-table')[0];
                    tbody = table.getElementsByTagName('tbody')[0];
                    newRow = tbody.insertRow(-1);
                    $(newRow).attr('data-cy', 'selected-type-code-row');
                    index = newRow.rowIndex - 1;
                    newRow.innerHTML =
                        "<input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"PaymentTotalsTable_ItemsToPurchase_" + index + "__TypeCode\" name=\"PaymentTotalsTable.ItemsToPurchase[" + index + "].TypeCode\" value=\"" + typeCode + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"PaymentTotalsTable_ItemsToPurchase_" + index + "__Description\" name=\"PaymentTotalsTable.ItemsToPurchase[" + index + "].Description\" value=\"" + description + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"PaymentTotalsTable_ItemsToPurchase_" + index + "__Amount\" name=\"PaymentTotalsTable.ItemsToPurchase[" + index + "].Amount\" value=\"" + amount + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"PaymentTotalsTable_ItemsToPurchase_" + index + "__IsTaxable\" name=\"PaymentTotalsTable.ItemsToPurchase[" + index + "].IsTaxable\" value=\"" + isTaxable + "\">\n         <input type=\"hidden\" data-cpo-field=\"true\"\n             id=\"PaymentTotalsTable_ItemsToPurchase_" + index + "__TaxAmount\" name=\"PaymentTotalsTable.ItemsToPurchase[" + index + "].TaxAmount\" value=\"" + taxAmount + "\">\n         \n         <td class=\"text-break\">" + description + "</td>\n         <td class=\"item-cost\" data-cy=\"selected-type-code-amount\">\n             " + CurrencyFormatter.toString(amount) + "\n         </td>\n         <td hidden class=\"item-tax-amount\">\n             " + CurrencyFormatter.toString(taxAmount) + "\n         </td>\n         <td class=\"misc-pay-add-button\">\n             <button class=\"cp-button text-danger float-right\" data-cy=\"remove-type-code\"\n                     title=\"Remove\" onclick=\"removePaymentFromTotals(this, " + minimumTotal + ", " + maximumTotal + ", " + flatFee + ", " + percentFee + ", " + minimumServiceFee + ")\">\n                 <span class=\"fas fa-minus text-danger align-text-center fa-lg\" aria-hidden=\"true\"></span>\n             </button>\n         </td>";
                    if (updateTotal(amount, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee, taxAmount))
                        cpoForms[0].onFieldChanged();
                    setElementSubmittingState(target, false);
                    return [2 /*return*/];
            }
        });
    });
}
function removePaymentFromTotals(target, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee) {
    var row = target.parentElement.parentElement;
    var table = $('#selected-items-table')[0];
    var rowCostCell = row.getElementsByClassName('item-cost')[0];
    var rowCost = CurrencyFormatter.toNumber(rowCostCell.innerText);
    var taxAmountCell = row.getElementsByClassName('item-tax-amount')[0];
    var taxAmount = CurrencyFormatter.toNumber(taxAmountCell.innerText);
    updateTotal(-rowCost, minimumTotal, maximumTotal, flatFee, percentFee, minimumServiceFee, -taxAmount);
    table.deleteRow(row.rowIndex);
    reorderTableRows(table);
}
$(window).resize(updateEmailMessageStyles);
$(document).ready(updateEmailMessageStyles);
function updateEmailMessageStyles() {
    var $window = $(window);
    var $emailFieldMessage = $("#email-input-message");
    $emailFieldMessage.removeClass('cp-input-spaceless-message h-auto mb-1');
    if ($window.width() < 576) {
        return $emailFieldMessage.addClass('mb-1');
    }
    else {
        return $emailFieldMessage.addClass('cp-input-spaceless-message h-auto');
    }
}
var CRType = /** @class */ (function () {
    function CRType(typeCode, baseAmount) {
        this.typeCode = typeCode;
        this.baseAmount = baseAmount;
        this.taxAmount = 0;
    }
    return CRType;
}());
;
$(document).ready(function () {
    var element = document.getElementById('input-source-side');
    if (element instanceof HTMLInputElement) {
        element.defaultValue = element.value;
    }
});
;
$(function () {
    // Show the Tran Report and Users filters side sheet if there are no filters selected yet.
    if ((isAtUrl('/secure/admin/agency/reports/transaction') ||
        isAtUrl('/secure/admin/users')) &&
        window.location.search === '') {
        $('#filtersModal').modal("show");
    }
});
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(document).ready(function () {
    var reversalPattern = new RegExp('(&*reversalId=)[^&#]*', 'g');
    var searchMatches = window.location.search.match(reversalPattern);
    var reversalId = (searchMatches !== null && searchMatches.length > 0) ? searchMatches[0].split('=')[1].trim() : null;
    if (reversalId) {
        var idPattern = new RegExp('[0-9]{12}');
        if (reversalId.match(idPattern)) {
            createToast("Successfully reversed payment #" + reversalId);
        }
        var newHistoryUrl = window.location.href.split('?')[0] + window.location.search.replace(reversalPattern, '');
        history.replaceState({}, "CivicPay Online - Payments List", newHistoryUrl);
        $("#payment-list-actions").find('a').each(function () {
            var currentUrl = $(this).attr('href');
            if (currentUrl) {
                var newUrl = currentUrl.replace(reversalPattern, '');
                $(this).attr('href', newUrl);
            }
        });
        $("#settlement-list-actions").find('a').each(function () {
            var currentUrl = $(this).attr('href');
            if (currentUrl) {
                var newUrl = currentUrl.replace(reversalPattern, '');
                $(this).attr('href', newUrl);
            }
        });
    }
});
function populateReversalConfirmModal(target) {
    updateInnerIfExists('reversal-merchant-account', target.dataset.reversalAccountType);
    updateInnerIfExists('reversal-payment-id', target.dataset.reversalPaymentId);
    updateInnerIfExists('reversal-amount', target.dataset.reversalAmount);
    updateInnerIfExists('reversal-name', target.dataset.reversalCustomerName);
    $('#reversal-confirm-button').attr('data-reversal-payment-id', target.dataset.reversalPaymentId);
    $('#reversal-confirm-button').attr('data-reversal-account-type', target.dataset.reversalAccountType);
}
function reversePayment(target, url) {
    return __awaiter(this, void 0, void 0, function () {
        var result, queryStrings, index;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    $('#reversal-spinner').removeAttr('hidden');
                    $('#reversal-cancel-button').attr('disabled', 'disabled');
                    $('#reversal-close-modal-button').attr('disabled', 'disabled');
                    $('#reversalConfirmModal').data('bs.modal')._config.backdrop = 'static';
                    $('#reversalConfirmModal').data('bs.modal')._config.keyboard = false;
                    if (!(target.dataset.reversalPaymentId && target.dataset.reversalAccountType)) return [3 /*break*/, 2];
                    url = url.replace('__paymentId__', target.dataset.reversalPaymentId.slice(1));
                    url = url.replace('__accountType__', target.dataset.reversalAccountType);
                    return [4 /*yield*/, apiPost(url, {})];
                case 1:
                    result = _a.sent();
                    _a.label = 2;
                case 2:
                    if (!result.isError) {
                        queryStrings = window.location.search;
                        index = queryStrings.search('reversalId');
                        if (index > -1) {
                            window.location.search = queryStrings.slice(0, index) + ("reversalId=" + result.value) + queryStrings.slice(index + 23);
                        }
                        else if (window.location.search.startsWith('?')) {
                            window.location.search = window.location.search + ("&reversalId=" + result.value);
                        }
                        else {
                            window.location.search = "?reversalId=" + result.value;
                        }
                    }
                    else {
                        $('#reversalConfirmModal').modal('hide');
                        createToast(result.errorMessage);
                        $('#reversal-cancel-button').removeAttr('disabled');
                        $('#reversal-close-modal-button').removeAttr('disabled');
                        $('#reversalConfirmModal').data('bs.modal')._config.backdrop = true;
                        $('#reversalConfirmModal').data('bs.modal')._config.keyboard = true;
                        $('#reversal-spinner').attr('hidden', 'hidden');
                    }
                    return [2 /*return*/];
            }
        });
    });
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(function () {
    if (isAtUrl('/secure/servicerequests')) {
        if ($(this).width() < 768) {
            $("[id^=sr-header-]").addClass("collapsed");
            $("[id^=sr-header-]").removeAttr("aria-expanded");
            $("[id^=sr-collapse-]").removeClass("show");
        }
        else {
            $("[id^=sr-header-]").removeClass("collapsed");
            $("[id^=sr-header-]").attr("aria-expanded", "true");
            $("[id^=sr-collapse-]").addClass("show");
        }
        loadPartialView('/api/ServiceRequests/Cards', 'service-request-cards');
    }
});
function populateCompletedRequestModal(target) {
    $('#modal-request-number').text(target.dataset.requestNumber);
    $('#modal-name').text(target.dataset.name);
    $('#modal-email').text(target.dataset.email);
    $('#modal-address1').text(target.dataset.address1);
    if (target.dataset.address2) {
        var element = $('#modal-address2');
        element.text(target.dataset.address2);
        element.removeClass('d-none');
    }
    else {
        $('#modal-address2').addClass('d-none');
    }
    $('#modal-city-state-zip').text(target.dataset.cityStateZip);
    $('#modal-date').text(target.dataset.date);
    $('#modal-status').text(target.dataset.status);
    $('#modal-description').text(target.dataset.description);
    if (target.dataset.comments) {
        var element = $('#modal-comments');
        element[0].innerHTML = '';
        element.text(target.dataset.comments);
    }
    else {
        // If there isn't a value entered, include a br so that the
        // element isn't collapsed because it's empty.
        $('#modal-comments')[0].innerHTML = '<br />';
    }
}
function createSR(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var model, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    model = {
                        SelectedType: $('#CreateServiceRequestModel_SelectedType').val(),
                        Comments: $('#CreateServiceRequestModel_Comments').val()
                    };
                    return [4 /*yield*/, apiPost(url, model)];
                case 1:
                    response = _a.sent();
                    if (response.isError) {
                        $('#sr-creation-error').removeClass('d-none');
                        $('#sr-creation-error-text').text(response.errorMessage);
                        setElementSubmittingState(button, false);
                        setButtonStateBySelector("#" + button.id, ElementState.Enabled);
                    }
                    else {
                        location.reload();
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function srCancel() {
    if (confirm("Are you sure you want to clear the entered information and cancel your request?")) {
        $('#sr-creation-error').addClass('d-none');
        $('#CreateServiceRequestModel_SelectedType').val($("#CreateServiceRequestModel_SelectedType option:first").val());
        updateCommentsHelperText();
        $('#CreateServiceRequestModel_Comments').val("");
        $('#submitRequestModal').modal('hide');
    }
}
function updateCommentsHelperText() {
    var helperTextElement = $("#comment-helper-text");
    helperTextElement.removeClass("cp-input-help-message");
    helperTextElement.removeClass("cp-input-help-message-bold");
    var selectedCode = $("#CreateServiceRequestModel_SelectedType")[0];
    var requestCodeHelperText = $("#" + selectedCode.value + "-comment-helper-text");
    helperTextElement.html(requestCodeHelperText.html());
    if (requestCodeHelperText.hasClass("default-helper-text")) {
        helperTextElement.addClass("cp-input-help-message");
    }
    else {
        helperTextElement.addClass("cp-input-help-message-bold");
    }
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function toggleSwitch(isChecked) {
    if (isChecked)
        $('.custom-control-input').prop('checked', true);
    else
        $('.custom-control-input').removeProp('checked');
}
function updateDailyEmailAjax(url, toggleValue) {
    return __awaiter(this, void 0, void 0, function () {
        var data, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    if (!url || url === "") {
                        createToast("Email opt in setting failed to update. Please refresh the page and try again.");
                        return [2 /*return*/];
                    }
                    data = { receiveSummaryEmailDaily: toggleValue };
                    return [4 /*yield*/, apiPost(url, data)];
                case 1:
                    response = _a.sent();
                    if (!response.isError) {
                        toggleSwitch(toggleValue);
                    }
                    else {
                        createToast(unexpectedErrorMessage);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function isLoginPage(response) {
    var element = $(response.trim());
    var isTitleWelcome = $(element).filter('title').text().trim() === 'Welcome';
    return isTitleWelcome;
}
;
$(function () {
    var newPasswordInput = $('#new-password-input').get(0);
    var confirmedPasswordInput = $('#new-confirmed-password-input').get(0);
    var saveButton = $('#submit-button').get(0);
    if (newPasswordInput && confirmedPasswordInput) {
        ['keyup', 'change', 'focusout'].forEach(function (eventName) {
            [newPasswordInput, confirmedPasswordInput].forEach(function (input) {
                input.addEventListener(eventName, function (e) {
                    if (validatePasswordInputs(newPasswordInput, confirmedPasswordInput)) {
                        saveButton.classList.remove('disabled');
                    }
                    else {
                        saveButton.classList.add('disabled');
                    }
                });
            });
        });
    }
});
/*
 * Validates that the two new password inputs have non-empty, identical values.
 */
function validatePasswordInputs(passwordInput, confirmPasswordInput) {
    var emailValue = passwordInput.value;
    var confirmValue = confirmPasswordInput.value;
    var emailParent = passwordInput.parentElement;
    var confirmParent = confirmPasswordInput.parentElement;
    var passwordErrorMessage = emailParent.parentElement.getElementsByClassName('cp-input-error-message')[0];
    var confirmErrorMessage = confirmParent.parentElement.getElementsByClassName('cp-input-error-message')[0];
    if (emailValue === '') {
        emailParent.classList.add('invalid');
        passwordErrorMessage.textContent = 'New Password is required';
        passwordErrorMessage.classList.remove('d-none');
        return false;
    }
    if (confirmValue === '') {
        confirmParent.classList.add('invalid');
        confirmErrorMessage.textContent = 'Confirm New Password is required';
        confirmErrorMessage.classList.remove('d-none');
        return false;
    }
    if (emailValue !== confirmValue) {
        emailParent.classList.add('invalid');
        confirmParent.classList.add('invalid');
        confirmErrorMessage.textContent = 'New Password and Confirm New Password must match';
        confirmErrorMessage.classList.remove('d-none');
        return false;
    }
    emailParent.classList.remove('invalid');
    passwordErrorMessage.textContent = '';
    passwordErrorMessage.classList.add('d-none');
    confirmParent.classList.remove('invalid');
    confirmErrorMessage.textContent = '';
    confirmErrorMessage.classList.add('d-none');
    return true;
}
;
// Use vanilla javascript approach so that jQuery doesn't break the legacy page.
window.addEventListener('DOMContentLoaded', function (event) {
    prepareUsageChart();
});
// The colors used for different years of the usage graph.
var graphBorderColors = [
    'rgb(64,0,75)',
    'rgb(118,42,131)',
    'rgb(153,112,171)',
    'rgb(166,219,160)',
    'rgb(90,174,97)',
    'rgb(27,120,55)',
    'rgb(0,68,27)',
    'rgb(85,0,0)',
    'rgb(135,12,37)',
    'rgb(207,0,15)',
    'rgb(170,85,53)'
];
// Required in order to save a reference to the Chart object so that it can be cleared in between requests
var usageChart = null;
// Create URI to retrieve citizen usage given desired years and service ID.
function getCitizenUsageUri(years, selectedServiceId) {
    var yearParams = new URLSearchParams();
    for (var _i = 0, years_1 = years; _i < years_1.length; _i++) {
        var year = years_1[_i];
        yearParams.append('years', year);
    }
    return window.location.origin + "/api/Citizen/GetUsage/" + selectedServiceId + "?" + yearParams.toString();
}
// Retrieve the initial configurations for the chart
function getInitialChartConfigSettings(title) {
    var settings = {
        type: 'line',
        data: {
            labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
            datasets: []
        },
        options: {
            title: {
                display: true,
                text: title
            },
            legend: {
                display: true
            }
        }
    };
    return settings;
}
/*
 * Send a request to the given uri to retrieve the citizen's usage.
 */
function sendUsageRequest(uri, canvasId, settings, successContinuation, errorContinuation) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', uri);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            var response = JSON.parse(xhr.responseText);
            if (xhr.status == 200) {
                // Prepare the settings' data for the Chart below to display
                settings.data.datasets = response.items.map(function (item, idx) {
                    // for each year returned spin up an array with a slot for each of the 12 months
                    // and fill in with values received from server. Any undefined array slot
                    // will not be rendered on the graph
                    var data = new Array(12);
                    for (var i = 0; i < item.usage.length; ++i) {
                        data[item.usage[i].month - 1] = item.usage[i].consumption;
                    }
                    return {
                        label: item.year.toString(),
                        data: data,
                        borderColor: graphBorderColors[idx],
                        fill: false,
                        spanGaps: true
                    };
                });
                var ctx = document.getElementById(canvasId).getContext('2d');
                // Clear the chart in between refreshes
                // this is necessary since the modern page does not perform a full reload on year selections
                if (usageChart !== null) {
                    usageChart.destroy();
                }
                usageChart = new Chart(ctx, settings);
                successContinuation(response);
            }
            else {
                errorContinuation(response);
            }
        }
    };
    xhr.send();
}
/*
 * Prepares the Usage Chart for display on the modern MVC pages.
 */
function prepareUsageChart() {
    setTimeout(function () {
        // grab the currently selected service name for the chart title
        var services = document.getElementById('service-dropdown');
        // Return early if the services dropdown was not found
        // this indicates that the legacy page is executing this on load
        if (services == null)
            return;
        var selectedService = services[services.selectedIndex];
        var title = selectedService.text + ' Usage';
        var settings = getInitialChartConfigSettings(title);
        // grab all currently selected year checkboxes then spin through them to grab the label text
        var years = [];
        var checkedYears = $('input[type="checkbox"]:checked');
        for (var i = 0; i < checkedYears.length; ++i) {
            years.push(checkedYears[i].nextElementSibling.textContent.trim());
        }
        var uri = getCitizenUsageUri(years, selectedService.value);
        var usageChartErrorId = 'usage-chart-error';
        var successContinuation = function (response) {
            document.getElementById('usage-chart-wrapper').classList.remove('d-none');
            document.getElementById(usageChartErrorId).classList.add('d-none');
        };
        var errorContinuation = function (response) {
            if (response.errors) {
                var errorList = 'Unable to display graph due to the following errors:<ul>';
                for (var _i = 0, _a = response.errors; _i < _a.length; _i++) {
                    var error = _a[_i];
                    errorList += '<li>' + error + '</li>';
                }
                document.getElementById(usageChartErrorId).innerHTML = errorList;
            }
            document.getElementById('usage-chart-wrapper').classList.add('d-none');
            // Only display errors specific to the graph if there was meter history
            if (document.getElementById('no-meter-history').classList.contains('d-none')) {
                document.getElementById(usageChartErrorId).classList.remove('d-none');
            }
        };
        sendUsageRequest(uri, 'usage-chart-canvas', settings, successContinuation, errorContinuation);
    }, 500);
}
/*
 * Method used to retrieve and display chart data for the legacy Usage.aspx page.
 */
function generateUsageChart() {
    setTimeout(function () {
        // if only table is visible, exit early since there's no graph to spin up
        var onlyTableVisible = document.getElementById('ctl00_ContentPlaceHolder1_RadioView_1').checked;
        if (onlyTableVisible)
            return;
        // grab the currently selected service name for the chart title
        var services = document.getElementById('ctl00_ContentPlaceHolder1_RadioService');
        var selectedService = services[services.selectedIndex];
        var title = selectedService.text + ' Usage';
        var settings = getInitialChartConfigSettings(title);
        // grab all currently selected year checkboxes then spin through them to grab the label text
        var years = [];
        var checkedYears = document.querySelectorAll('#ctl00_ContentPlaceHolder1_RadioYears input:checked');
        for (var i = 0; i < checkedYears.length; ++i) {
            years.push(checkedYears[i].nextSibling.textContent);
        }
        var uri = getCitizenUsageUri(years, services.value);
        var successContinuation = function (response) {
            document.getElementById('usage-chart-container').removeAttribute('hidden');
        };
        var errorContinuation = function (response) {
            // don't display error messages if no usage present
            var noUsage = document.getElementById('ctl00_ContentPlaceHolder1_PanelNoUsage');
            if (noUsage)
                return;
            if (response.errors) {
                var errorList = 'Unable to display graph due to the following errors:<ul>';
                for (var _i = 0, _a = response.errors; _i < _a.length; _i++) {
                    var error = _a[_i];
                    errorList += '<li>' + error + '</li>';
                }
                document.getElementById('usage-chart-error').innerHTML = errorList;
            }
            document.getElementById('usage-chart-error').removeAttribute('hidden');
        };
        sendUsageRequest(uri, 'usage-chart', settings, successContinuation, errorContinuation);
    }, 500);
}
;
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
function showAccounts(target) {
    var jElement = $(target);
    jElement.addClass('d-none');
    jElement.next().removeClass('d-none');
}
function addAccountRow() {
    if (isAtUrl('secure/admin/users/edituser')) {
        addAccountRowToEditUser();
    }
    else if (isAtUrl('secure/admin/users/adduser')) {
        addAccountRowToNewUser();
    }
}
function addAccountRowToEditUser() {
    var counter = $('#accounts-table tr').length - 1;
    var acctNo = $('#new-account').val().toString().trim();
    if (validateAccount(acctNo)) {
        $('#account-error').text('');
        $('#account-help').removeClass('d-none');
        $('#accounts-table').append("\n        <tr class=\"active\">\n            <input id=\"AccountsTable_Accounts_" + counter + "__AccountId\" name=\"AccountsTable.Accounts[" + counter + "].AccountId\" type=\"hidden\" value=\"0\">\n            <input id=\"AccountsTable_Accounts_" + counter + "__AccountNumber\" name=\"AccountsTable.Accounts[" + counter + "].AccountNumber\" type=\"hidden\" value=\"" + acctNo + "\">\n            <td>" + acctNo + "</td>\n                <td></td>\n                <td></td>\n                <td></td>\n            <td class=\"d-flex\">\n                <a class=\"cp-button text-danger mb-sm-2 cursor-pointer\" title=\"Remove\" onclick=\"deleteAccountRowFromEditUser(this)\">\n                    <span class=\"fas fa-times pr-md-2\" aria-hidden=\"true\"></span>\n                    <span class=\"d-none d-md-inline\">Remove</span>\n                </a>\n            </td>\n        </tr>");
        cpoForms[0].onFieldChanged();
        $('#new-account').val('');
    }
}
function addAccountRowToNewUser() {
    var accountNumber = $('#new-account').val().toString().trim();
    if (validateAccount(accountNumber.toString())) {
        var table = $('#accounts-table')[0];
        var tbody = table.getElementsByTagName('tbody')[0];
        var newRow = tbody.insertRow(-1);
        var index = newRow.rowIndex - 1;
        newRow.innerHTML = "\n            <tr>\n                <td>" + accountNumber + "</td>\n                <td>\n                    <a class=\"cp-button text-danger cursor-pointer\" data-cy=\"remove-account\" title=\"Remove\" onclick=\"deleteAccountRowFromAddUser(this)\">\n                        <span class=\"fas fa-times pr-md-2\" aria-hidden=\"true\"></span>\n                        <span class=\"d-none d-md-inline\">Remove</span>\n                    </a>\n                </td>\n            </tr>\n            <input type=\"hidden\" data-cpo-field=\"true\"\n                id=\"RelatedAccounts_" + index + "\" name=\"RelatedAccounts[" + index + "]\" value=\"" + accountNumber + "\">";
        $('#new-account').val('');
    }
}
function validateAccount(acctNo) {
    var regex = /^\d{6}-\d{3}$/;
    if (acctNo == null || acctNo == '')
        return false;
    if (!acctNo.match(regex)) {
        $('#account-error').text('Invalid Account Number format.');
        $('#account-help').addClass('d-none');
        $('#account-error').removeClass('d-none');
        return false;
    }
    // Validate acct no
    var hasDuplicate = false;
    $('#accounts-table tr').not(":first").each(function () {
        var existingAcct = $(this).find('td:first').text().trim();
        if (existingAcct == acctNo) {
            $('#account-error').text('This account has already been added.');
            $('#account-help').addClass('d-none');
            $('#account-error').removeClass('d-none');
            hasDuplicate = true;
            return false;
        }
    });
    if (hasDuplicate)
        return false;
    $('#account-help').removeClass('d-none');
    $('#account-error').addClass('d-none');
    return true;
}
function deleteAccountRowFromEditUser(button) {
    var rowToRemove = button.closest('tr');
    var accountNumber = rowToRemove.cells[0].innerText;
    if (!confirm("Are you sure you want to remove account " + accountNumber + "?"))
        return;
    $(button).closest('tr').remove();
    if ($('#accounts-table tr').length > 1) {
        $('#accounts-table tr').not(":first").each(function (counter, this_row) {
            var row = $(this_row);
            row.find('input[name$=".AccountId"]').attr('name', "AccountsTable.Accounts[" + counter + "].AccountId");
            row.find('input[name$=".AccountId"]').attr('id', "AccountsTable_Accounts_" + counter + "__AccountId");
            row.find('input[name$=".AccountNumber"]').attr('name', "AccountsTable.Accounts[" + counter + "].AccountNumber");
            row.find('input[name$=".AccountNumber"]').attr('id', "AccountsTable_Accounts_" + counter + "__AccountNumber");
        });
    }
    cpoForms[0].onFieldChanged();
}
function deleteAccountRowFromAddUser(button) {
    $(button).closest('tr').remove();
    if ($('#accounts-table tr').length > 1) {
        $('#accounts-table tr').not(":first").each(function (counter, this_row) {
            var row = $(this_row);
            row.find('input[name^="RelatedAccounts"]').attr('name', "RelatedAccounts[" + counter + "]");
            row.find('input[name^="RelatedAccounts"]').attr('id', "RelatedAccounts_" + counter);
        });
    }
    cpoForms[0].onFieldChanged();
}
function VerifyEmail(element, url, email) {
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            SetMessageBanner(element, url, "An e-mail has been sent to " + email);
            return [2 /*return*/];
        });
    });
}
function ExecuteUserAction(element, url) {
    return __awaiter(this, void 0, void 0, function () {
        return __generator(this, function (_a) {
            SetMessageBanner(element, url);
            return [2 /*return*/];
        });
    });
}
function SetMessageBanner(element, url, overrideSuccess) {
    if (overrideSuccess === void 0) { overrideSuccess = null; }
    return __awaiter(this, void 0, void 0, function () {
        var response, id;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(element, true);
                    return [4 /*yield*/, apiPost(url, null)];
                case 1:
                    response = _a.sent();
                    id = '#ajax-result';
                    if (response.value != null) {
                        // show success banner
                        $(id).removeClass('d-none');
                        $(id).removeClass('alert-danger');
                        $(id).addClass('alert-success');
                        $("" + id).children(":first").text(overrideSuccess != null ? overrideSuccess : response.value);
                        setElementSubmittingState(element, false);
                    }
                    else if (response.isError) {
                        // show error banner
                        $(id).removeClass('d-none');
                        $(id).removeClass('alert-success');
                        $(id).addClass('alert-danger');
                        $("" + id).children(":first").text(response.errorMessage);
                        setElementSubmittingState(element, false);
                    }
                    return [2 /*return*/];
            }
        });
    });
}
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
$(function () {
    if (isAtUrl('/secure/admin/agency/custommessages') ||
        isAtUrl('/secure/admin/messages.aspx') ||
        isAtUrl('/secure/admin/agencynotification') ||
        isAtUrl('/secure/admin/payments/upcoming')) {
        function initializeWysiwyg(wysiwygId) {
            var printableCharRegex = /[\w\s~`!@#$%^&*()-_\[\]\\{}|;':",./<>?]/;
            var editorSelector = '#' + wysiwygId + '-editor';
            $(editorSelector).on('keydown paste', function (event) {
                // If the key pressed was non-printable or was one of the arrow keys, don't enable save.
                if (event.type === 'keydown' &&
                    ((event.keyCode >= 37 && event.keyCode <= 40) ||
                        (!printableCharRegex.test(String.fromCharCode(event.keyCode)) &&
                            event.keyCode != 13 && event.keyCode != 8))) {
                    return;
                }
                setButtonStateBySelector("#save-button", ElementState.Enabled);
            });
        }
        $('.wysiwyg-container[data-initialized!=true]').each(function (index, wysiwyg) {
            initializeWysiwyg(wysiwyg.id);
            wysiwyg.dataset.initialized = "true";
        });
    }
});
var AgencyNotificationViewModel = /** @class */ (function () {
    function AgencyNotificationViewModel(notification) {
        this.AgencyNotification = notification;
    }
    return AgencyNotificationViewModel;
}());
var CustomMessagesBuilder = /** @class */ (function () {
    function CustomMessagesBuilder() {
        this.i = 0;
        this.messages = {};
    }
    CustomMessagesBuilder.prototype.isMessageEmpty = function (messageId) {
        if ($(messageId).text().trim() === "")
            return true;
        return false;
    };
    CustomMessagesBuilder.prototype.addMessage = function (messageType, id) {
        this.messages["Messages[" + this.i + "].key"] = messageType.toString();
        if (this.isMessageEmpty(id)) {
            this.messages["Messages[" + this.i + "].value"] = null;
        }
        else {
            this.messages["Messages[" + this.i + "].value"] = btoa(encodeURIComponent($(id).html()));
        }
        ++this.i;
    };
    CustomMessagesBuilder.prototype.getMessages = function () { return this.messages; };
    return CustomMessagesBuilder;
}());
var MessageType;
(function (MessageType) {
    MessageType[MessageType["AutoPay"] = 1] = "AutoPay";
    MessageType[MessageType["LoginPage"] = 2] = "LoginPage";
    MessageType[MessageType["ParcelId"] = 3] = "ParcelId";
    MessageType[MessageType["ReturnCheck"] = 4] = "ReturnCheck";
    MessageType[MessageType["CitizenHomePage"] = 5] = "CitizenHomePage";
    MessageType[MessageType["OutOfService"] = 6] = "OutOfService";
    MessageType[MessageType["Municipal"] = 7] = "Municipal";
    MessageType[MessageType["AccountsReceivable"] = 9] = "AccountsReceivable";
    MessageType[MessageType["BuildingPermits"] = 10] = "BuildingPermits";
    MessageType[MessageType["LicensesAndPermits"] = 11] = "LicensesAndPermits";
    MessageType[MessageType["SpecialAssessments"] = 12] = "SpecialAssessments";
})(MessageType || (MessageType = {}));
function saveAgencyNotification(button) {
    return __awaiter(this, void 0, void 0, function () {
        var message, messageObject, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    // mark the save button as submitting
                    setElementSubmittingState(button, true);
                    message = '';
                    if (($("#AgencyNotification-editor").text().trim() !== "")) {
                        message = btoa(encodeURIComponent($("#AgencyNotification-editor").html()));
                    }
                    messageObject = new AgencyNotificationViewModel(message);
                    return [4 /*yield*/, apiPost("AgencyNotification", messageObject)];
                case 1:
                    response = _a.sent();
                    setElementSubmittingState(button, false);
                    setButtonStateBySelector("#" + button.id, ElementState.Disabled);
                    // Finally - display either an error toast, or a 'success' toast.
                    if (response.isError) {
                        createToast(response.errorMessage);
                    }
                    else {
                        createToast('Agency Notification Updated Successfully');
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function saveCustomMessages(button, url) {
    return __awaiter(this, void 0, void 0, function () {
        var hasUtility, customMessages, response;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    setElementSubmittingState(button, true);
                    if (!url || url === "") {
                        setElementSubmittingState(button, false);
                        createToast("Failed to update. Please refresh the page and try again.");
                        return [2 /*return*/];
                    }
                    hasUtility = $("#CitizenHomePageMessage-editor") != null;
                    customMessages = new CustomMessagesBuilder();
                    customMessages.addMessage(MessageType.LoginPage, "#LoginPageMessage-editor");
                    if (hasUtility) {
                        customMessages.addMessage(MessageType.CitizenHomePage, "#CitizenHomePageMessage-editor");
                        customMessages.addMessage(MessageType.AutoPay, "#AutoPayMessage-editor");
                        customMessages.addMessage(MessageType.ReturnCheck, "#PaymentScreenMessage-editor");
                        customMessages.addMessage(MessageType.ParcelId, "#ParcelIdMessage-editor");
                    }
                    customMessages.addMessage(MessageType.OutOfService, "#OutofServiceMessage-editor");
                    customMessages.addMessage(MessageType.Municipal, "#MunicipalPaymentScreenMessage-editor");
                    customMessages.addMessage(MessageType.AccountsReceivable, "#AccountsReceivableMessage-editor");
                    customMessages.addMessage(MessageType.BuildingPermits, "#BuildingPermitsMessage-editor");
                    customMessages.addMessage(MessageType.LicensesAndPermits, "#LicensesAndPermitsMessage-editor");
                    customMessages.addMessage(MessageType.SpecialAssessments, "#SpecialAssessmentsMessage-editor");
                    return [4 /*yield*/, apiPost(url, customMessages.getMessages())];
                case 1:
                    response = _a.sent();
                    setElementSubmittingState(button, false);
                    setButtonStateBySelector("#" + button.id, ElementState.Disabled);
                    if (response.isError) {
                        createToast(response.errorMessage);
                    }
                    else {
                        location.reload();
                    }
                    return [2 /*return*/];
            }
        });
    });
}
function executeWysiwygToolbarCommand(e) {
    var command = $(e).data('command');
    switch (command) {
        case 'h1':
        case 'h2':
        case 'p':
        case 'div':
            document.execCommand('formatBlock', false, "<" + command + ">");
            break;
        case 'removeFormat':
            document.execCommand(command, false, null);
            break;
        case 'createlink':
        case 'insertimage':
            var url = prompt('Enter the link here: ', 'https://');
            if (url) {
                url = url.startsWith('https://') || url.startsWith('http://') ? url : 'https://' + url;
                document.execCommand(command, false, url);
            }
            break;
        case 'foreColor':
            document.execCommand(command, false, $(e).data('color'));
            break;
        default:
            document.execCommand(command, false, null);
            break;
    }
    setButtonStateBySelector("#save-button", ElementState.Enabled);
}
;
