{"version":3,"file":"js/chunks/account.js","sources":["webpack:///./org_colony/cartridge/js/pages/account.js"],"sourcesContent":["const TPromise = require('promise');\nconst giftcert = require('../giftcert');\nconst tooltip = require('../tooltip');\nconst util = require('../util');\nconst dialog = require('../dialog');\nconst page = require('../page');\nconst login = require('../login');\nconst progress = require('../progress');\nconst validator = require('../validator');\nconst addToCart = require('./product/addToCart');\nconst paymentutils = require('../paymentutils');\nconst qas = require('../../../../int_QASc/cartridge/js/qas');\n\nfunction initializePaymentForm() {\n    $('#CreditCardForm').on('click', '.cancel-button', (e) => {\n        e.preventDefault();\n        dialog.close();\n    });\n}\n\nfunction submitDelete(targetUrl) {\n    const promise = new TPromise((resolve, reject) => {\n        $.ajax({\n            url: targetUrl,\n            dataType: 'json',\n        }).done((data) => {\n            if (data.status.toLowerCase() === 'ok') {\n                resolve(Urls.addressesList);\n            } else if (data.message.length > 0) {\n                reject(data.message);\n            } else {\n                reject();\n            }\n        });\n    });\n    return promise;\n}\n\n/**\n * @private\n * @function\n * @description Triggers dialog for address deletion\n */\nfunction initAddressDelete(el, targetUrl) {\n    const dialogTitle = ($(el).attr('title')) ? $(el).attr('title') : Resources.DELETE_TITLE;\n    const message = String.format(Resources.CONFIRM_DELETE, Resources.TITLE_ADDRESS);\n    let confirmDelete = false;\n\n    dialog.open({\n        html: message,\n        options: {\n            height: 'auto',\n            width: 500,\n            title: dialogTitle,\n            dialogClass: 'ui-dialog-delete-confirmation',\n            buttons: [\n                {\n                    text: Resources.REMOVE,\n                    class: 'button primary',\n                    click() {\n                        confirmDelete = true;\n                        $(this).dialog('close');\n                    },\n                },\n                {\n                    text: Resources.NO_THANKS,\n                    class: 'button tertiary',\n                    click() {\n                        $(this).dialog('close');\n                    },\n                },\n            ],\n            close() {\n                if (confirmDelete) {\n                    submitDelete(targetUrl).then(\n                        (data) => {\n                            page.refresh(data);\n                        },\n                        (errorMessage) => {\n                            dialog.open({\n                                html: `<div class=\"has-error\">${errorMessage}</div>`,\n                                options: {\n                                    dialogClass: 'ui-dialog-delete-conflict ui-dialog-error',\n                                    title: Resources.CANNOT_DELETE,\n                                    buttons: [{\n                                        text: Resources.OK,\n                                        class: 'button primary',\n                                        click() {\n                                            // confirmDelete = false;\n                                            dialog.updateOption('buttons', []);\n                                            $(this).dialog('close');\n                                        },\n                                    }],\n                                },\n                            });\n                        },\n                    );\n                }\n            },\n        },\n    });\n}\n\n/**\n * @function\n * @description Initializes the events on the address form (apply, cancel, delete)\n * @param {Element} form The form which will be initialized\n */\nfunction initializeAddressForm() {\n    const $form = $('#edit-address-form');\n\n    $form.find('input[name=\"format\"]').remove();\n    tooltip.init();\n\n    $form.on('click', '.apply-button', (e) => {\n        if (!$form.valid()) {\n            e.preventDefault();\n            return;\n        }\n        dialog.close();\n    }).on('click', '.cancel-button, .close-button', (e) => {\n        e.preventDefault();\n        dialog.close();\n    }).on('click', '.delete-button', (e) => {\n        e.preventDefault();\n        const targetUrl = util.appendParamsToUrl(Urls.deleteAddress, {\n            AddressID: $form.find('#addressid').val(),\n            format: 'ajax',\n        });\n        initAddressDelete(e.currentTarget, targetUrl);\n    });\n\n    validator.init();\n    qas.init();\n}\n/**\n * @private\n * @function\n * @description Toggles the list of Orders\n */\nfunction toggleFullOrder() {\n    $('.order-items').find('li.hidden:first').prev('li').append(`<a class=\"toggle\">${Resources.VIEW_ALL}</a>`).children('.toggle').click((e) => {\n        $(e.currentTarget).parent().siblings('li.hidden').show();\n        $(e.currentTarget).remove();\n    });\n}\n\n/**\n * @private\n * @function\n * @description Binds the events on the address form (edit, create, delete)\n */\nfunction initAddressEvents() {\n    const addresses = $('#addresses');\n    if (addresses.length === 0) { return; }\n\n    addresses.on('click', '.address-edit, .address-create', (e) => {\n        e.preventDefault();\n        dialog.open({\n            url: e.currentTarget.href,\n            options: {\n                open: initializeAddressForm,\n                title: $(e.currentTarget).data('dlg-title'),\n                width: '550',\n                buttons: [],\n            },\n        });\n    }).on('click', '.delete', (e) => {\n        e.preventDefault();\n        const targetUrl = util.appendParamToURL($(e.currentTarget).attr('href'), 'format', 'ajax');\n        initAddressDelete(e.currentTarget, targetUrl);\n    });\n}\n\n/**\n * @private\n * @function\n * @description Sets the pagination view for order history\n */\nfunction setOrderHistoryPage(pageNum, pageSize, pageStart, pageTotal) {\n    // show page\n    $('.svc-result-items > li').addClass('visually-hidden').filter(`.page${pageNum}`).removeClass('visually-hidden');\n\n    // set paging bar\n    $('.search-result-options').load(Urls.orderHistoryPaging, {\n        sz: pageSize,\n        total: pageTotal,\n        start: pageStart,\n    });\n}\n/**\n * @private\n * @function\n * @description Binds the events of the order history page\n */\nfunction initOrderHistoryEvents() {\n    const resultItems = $('.svc-result-items');\n    const pageSize = parseInt(resultItems.data('pagesize'), 10);\n    const pageTotal = resultItems.data('total');\n\n    /*\n     * This listens for paging bar link clicks and adjusts the page accordingly\n     */\n    $('.search-result-options').on('click', '.page-link', (e) => {\n        e.preventDefault();\n\n        const pageNum = parseInt($(e.currentTarget).data('page'), 10);\n        const pageStart = (pageNum - 1) * pageSize;\n\n        setOrderHistoryPage(pageNum, pageSize, pageStart, pageTotal);\n\n        // push state to browser history\n        window.history.pushState({\n            pageNum, pageSize, pageTotal, pageStart,\n        }, undefined, `?sz=${pageSize}&start=${pageStart}`);\n\n        // scroll back to top\n        util.scrollBrowser($('.account-module').offset().top);\n    });\n\n    /*\n     * Loads or hides order details when a 'View/Hide Order Details' link is clicked\n     * var $orderHistoryItem keeps this event from loading on the guest order search since it is a shared template with MyAccount Order History\n     */\n    const $orderHistoryItem = $('.svc-result-items').not('.order-status-guest').find('.order-history-item-summary');\n    $orderHistoryItem.click((e) => {\n        e.preventDefault();\n\n        const toggleLink = $(e.currentTarget).find('.order-detail-toggle');\n        const orderDetailContainer = toggleLink.parents('.order-history-item').find('.order-details');\n\n        if (orderDetailContainer.hasClass('progress')) {\n            return;\n        }\n        if (orderDetailContainer.hasClass('loaded')) {\n            orderDetailContainer.removeClass('loaded').addClass('visually-hidden');\n            toggleLink.text(Resources.VIEW_ORDER_DETAILS).removeClass('expanded').closest('li').removeClass('expanded');\n        } else {\n            // Close all previously open order details\n            $('.order-details').removeClass('loaded expanded').addClass('visually-hidden');\n            $('.order-detail-toggle').text(Resources.VIEW_ORDER_DETAILS).removeClass('expanded').closest('li')\n                .removeClass('expanded');\n\n            orderDetailContainer.removeClass('visually-hidden').addClass('progress');\n            progress.show(orderDetailContainer);\n            orderDetailContainer.load(util.ajaxUrl(toggleLink.attr('href')), () => {\n                orderDetailContainer.removeClass('progress').addClass('loaded');\n                toggleLink.text(Resources.HIDE_ORDER_DETAILS).addClass('expanded').closest('li').addClass('expanded');\n            });\n            // Keep browser viewport on clicked order details\n            $('html, body').animate({\n                scrollTop: $(toggleLink).parents('li').offset().top,\n            }, 200);\n        }\n    });\n    /*\n     * this keeps this stores a searched order# in session so if a guest clicks on View order details in gues Order Search it will maintain the order number with MyAccount Order History\n     */\n    const orderNumber = window.SessionAttributes.ORDERHISTORYNUMBER;\n    const orderHistoryEntry = $(`[data-orderid=${orderNumber}]`);\n    orderHistoryEntry.find('.order-history-item-summary').click();\n    /*\n     * Attempts to update an order - Cancel or Accept Item\n     */\n    $('.svc-result-items').on('click', '.item-action', (e) => {\n        e.preventDefault();\n\n        const actionLink = $(e.currentTarget);\n        const orderHistoryItem = actionLink.parents('.order-history-item');\n        let confirm = false;\n        let message;\n\n        // Display a confirmation dialog when canceling anything\n        if (actionLink.hasClass('confirm-item')) {\n            message = `${actionLink.parents('.line-item').find('.name').data('name')},\\n\\n${Resources.CANCEL_ITEM_CONFIRM}`;\n        } else if (actionLink.hasClass('accept-item')) {\n            message = Resources.YOU_ACCEPT_ITEM;\n        } else if (actionLink.hasClass('wait-item')) {\n            message = Resources.WAIT_ITEM;\n        } else if (actionLink.hasClass('cancel-order')) {\n            message = Resources.CANCEL_ORDER_CONFIRM;\n        }\n\n        const submitModal = () => {\n            const promise = new TPromise((resolve, reject) => {\n                const data = {\n                    lastName: actionLink.data('lastname'),\n                    postalCode: actionLink.data('postalcode'),\n                };\n                const $csrfToken = $('#token');\n                data[$csrfToken.prop('name')] = $csrfToken.val();\n                const options = {\n                    url: util.ajaxUrl(actionLink.attr('href')),\n                    method: 'POST',\n                    cache: false,\n                    data,\n                };\n                $.ajax(options).done((response) => {\n                    if (response.success) {\n                        resolve(response.success);\n                    } else {\n                        reject(Resources.ERROR_ORDER_DETAILS);\n                    }\n                }).fail(() => {\n                    reject(Resources.ERROR_ORDER_DETAILS);\n                });\n            });\n            return promise;\n        };\n\n        dialog.open({\n            html: message,\n            options: {\n                height: 'auto',\n                width: 500,\n                dialogClass: 'ui-dialog-cancel-confirm',\n                buttons: [\n                    {\n                        text: Resources.OK,\n                        class: 'button primary',\n                        click() {\n                            confirm = true;\n                            progress.hide();\n                            $(this).dialog('close');\n                        },\n                    },\n                    {\n                        text: Resources.NO_THANKS,\n                        class: 'button tertiary',\n                        click() {\n                            progress.hide();\n                            $(this).dialog('close');\n                        },\n                    },\n                ],\n                open() {\n                    progress.show(orderHistoryItem);\n                },\n                close() {\n                    progress.hide();\n\n                    if (confirm) {\n                        submitModal().then(\n                            () => {\n                                // Refresh the order details\n                                if (orderHistoryItem.find('.order-detail-toggle').length) {\n                                    orderHistoryItem.find('.order-details').load(util.ajaxUrl(orderHistoryItem.find('.order-detail-toggle').attr('href')), () => {\n                                        progress.hide();\n                                    });\n                                } else {\n                                    const data = {\n                                        orderNumber: actionLink.data('orderid'),\n                                        lastName: actionLink.data('lastname'),\n                                        postalCode: actionLink.data('postalcode'),\n                                    };\n                                    const $csrfToken = $('#token');\n                                    data[$csrfToken.prop('name')] = $csrfToken.val();\n                                    // Refresh order details for guests\n                                    orderHistoryItem.find('.order-details').load(Urls.orderStatusGuest, data, () => {\n                                        progress.hide();\n                                    });\n                                }\n                            },\n                            (error) => {\n                                dialog.open({\n                                    html: `<div class=\"has-error\">${error}</div>`,\n                                    options: {\n                                        dialogClass: 'ui-dialog-delete-conflict ui-dialog-error',\n                                        title: Resources.ERROR,\n                                        buttons: [{\n                                            text: Resources.OK,\n                                            class: 'button primary',\n                                            click() {\n                                                progress.hide();\n                                                $(this).dialog('close');\n                                            },\n                                        }],\n                                    },\n                                });\n                            },\n                        );\n                    }\n                },\n            },\n        });\n    });\n\n    /*\n     * Load page state when navigating back to an order history page\n     */\n    window.onpopstate = (event) => {\n        const {state} = event;\n        if (state && state.pageNum) {\n            setOrderHistoryPage(state.pageNum, state.pageSize, state.pageStart, state.pageTotal);\n        } else {\n            setOrderHistoryPage(1, pageSize, 0, pageTotal);\n        }\n    };\n\n    // Initialize add to cart for buy again\n    addToCart();\n\n    // If an order ID was passed as a parameter, open it initially\n    $('.search-result-items li .focused-order').addClass('expanded').trigger('click');\n}\n\n/**\n * @private\n * @function\n * @description Binds the events of the payment methods list (delete card)\n */\nfunction initPaymentEvents() {\n    $('.add-card').on('click', (e) => {\n        e.preventDefault();\n        dialog.open({\n            url: $(e.target).attr('href'),\n            options: {\n                open: initializePaymentForm,\n            },\n        });\n    });\n\n    /** Begin Other Payment Amount Custom Formatter* */\n    let timeout = null;\n    $('#dwfrm_accountpayment_otherAmount').on('keyup', () => {\n        // Clear current timeout\n        clearTimeout(timeout);\n        // Reset timeout to 1.5 seconds on keyup\n        timeout = setTimeout(() => {\n            const $currentFieldValue = $('#dwfrm_accountpayment_otherAmount').val();\n            const isValueDecimal = $currentFieldValue.indexOf('.');\n            let newDecimalString;\n            // If user did not enter a decimal value\n            if (isValueDecimal === -1) {\n                const lengthOfValue = $currentFieldValue.length;\n                /**\n                 * If only 2 characters or less we assume this was meant to be a base dollar amount and add the trailing 0's\n                 * If more than 2 where added we format the number assuming this was a whole dollar amount and make the last 2 digits follow the decimal\n                 * */\n                if (lengthOfValue <= 2) {\n                    newDecimalString = `${$currentFieldValue}.00`;\n                } else {\n                    newDecimalString = `${$currentFieldValue.substr(0, lengthOfValue - 2)}.${$currentFieldValue.substr(lengthOfValue - 2)}`;\n                }\n                const newNumber = parseFloat(newDecimalString).toFixed('2');\n                $('#dwfrm_accountpayment_otherAmount').val(newNumber);\n            }\n        }, 1500);\n    });\n    /** End Other Payment Amount Custom Formatter* */\n\n    let confirmPayment = false;\n\n    /**\n     * @function\n     * @description Confirms the payment amount with the customer before submitting the form.\n     * @param {Element} form The payment form to be submitted\n     * @param {String} paymentAmount The formatted dollar amount of the payment\n     */\n    function displayConfirmPaymentDialog($form, paymentAmount) {\n        const message = `<p>${[\n            Resources.PLEASE_CONFIRM_PAYMENT,\n            `${Resources.PAYMENT_AMOUNT}<span class=\"payment-amount\">$${paymentAmount}</span>`,\n            Resources.CANNOT_CHANGE_AMOUNT,\n        ].join('</p><p>')}</p>`;\n\n        dialog.open({\n            html: message,\n            options: {\n                height: 'auto',\n                width: 'auto',\n                title: Resources.PAYMENT_AMOUNT_VERIFICATION,\n                dialogClass: 'ui-dialog-payment-confirmation',\n                buttons: [\n                    {\n                        text: Resources.SUBMIT_PAYMENT,\n                        class: 'button primary',\n                        click() {\n                            confirmPayment = true;\n                            $(this).dialog('close');\n                        },\n                    },\n                    {\n                        text: Resources.GO_BACK,\n                        class: 'button tertiary payment-go-back',\n                        click() {\n                            $(this).dialog('close');\n                        },\n                    },\n                ],\n                close() {\n                    if (confirmPayment) {\n                        $form.find('button[type=submit]').click();\n                    } else {\n                        $('button[name=dwfrm_accountpayment_submitPayment]').removeClass('disabled');\n                    }\n                },\n            },\n        });\n    }\n\n    /** Start Payment Events * */\n    // Payment Form Submit Event\n    $('#dwfrm_accountpayment').on('submit', (e) => {\n        // If the user has already confirmed the payment, submit the form\n        if (confirmPayment === true) {\n            return true;\n        }\n\n        $('.payment-routing.error, .payment.error').hide();\n        $('button[name=dwfrm_accountpayment_submitPayment]').addClass('disabled');\n        const CCError = $('#dwfrm_accountpayment_paymentMethods_creditCard_number').hasClass('error');\n        const CVNError = $('#dwfrm_accountpayment_paymentMethods_creditCard_cvn').hasClass('error');\n        const isValidPaymentAmount = paymentutils.validateOtherPaymentAmount();\n        const routingNumberResults = paymentutils.validateRoutingNumber();\n        let formHasErrors = false;\n        // Loop through  the routingNumberResults which contains any visible routing number field with it associated validation results\n        Object.keys(routingNumberResults).forEach((field) => {\n            if (!routingNumberResults[field]) {\n                // Retrieve the current routingNumberResults field associated error mesage and display it\n                $(`input[name=${field}]`).closest('#routing-container').siblings('.payment-routing.error').show();\n                formHasErrors = true;\n            }\n        });\n\n        // If payment amount is not valid display error\n        if (!isValidPaymentAmount) {\n            $('.payment.error').show();\n            formHasErrors = true;\n        }\n        // If form has payment, routing number, orr cc number or cvn error cancel form submit and remove the disabled property and disabled class\n        if (formHasErrors || CCError || CVNError) {\n            $('button[name=dwfrm_accountpayment_submitPayment]').removeClass('disabled');\n            return false;\n        }\n\n        // If the customer has selected the minimum payment amount, do not show the confirmation dialog.\n        if ($('#dwfrm_accountpayment_amountChoice_minimumPayment').is(':checked')) {\n            return true;\n        }\n\n        // If the customer is simply enrolling in autopay without making a payment, submit the form\n        if ($('.no-payment-required').length > 0) {\n            return true;\n        }\n\n        // If the customer entered a different amount, use that value, otherwise pay the full balance.\n        let paymentAmount;\n        if ($('#dwfrm_accountpayment_amountChoice_other').is(':checked')) {\n            paymentAmount = $('#dwfrm_accountpayment_otherAmount').val();\n        } else {\n            paymentAmount = $('.payment-row.other-payment label').first().data('currentbalance');\n        }\n\n        paymentAmount = parseFloat(paymentAmount);\n        // The following condition should never happen, but check for paymentAmount is NaN using\n        // the fact that only NaN !== NaN.  In this event, something went seriously wrong.  Submit\n        // the form, handle the error on the back-end, and refresh the page.\n        if (Number.isNaN(paymentAmount)) {\n            return true;\n        }\n\n        displayConfirmPaymentDialog($(e.currentTarget), paymentAmount.toFixed(2));\n\n        // Do not submit the form at this point; it will be submitted if the customer confirms the amount.\n        return false;\n    });\n    /** End Payment Events * */\n\n    const paymentList = $('.payment-list');\n    if (paymentList.length === 0) { return; }\n\n    const deleteCard = (url, formData) => {\n        const promise = new TPromise((resolve) => {\n            $.ajax({\n                type: 'POST',\n                url,\n                data: formData,\n            }).done(() => {\n                resolve(util.appendParamToURL(Urls.paymentsList, 'del', 'success'));\n            });\n        });\n        return promise;\n    };\n\n    $('form[name=\"payment-remove\"]').on('submit', (e) => {\n        e.preventDefault();\n        // override form submission in order to prevent refresh issues\n        const button = $(e.currentTarget).find('.delete');\n        $('<input/>').attr({\n            type: 'hidden',\n            name: button.attr('name'),\n            value: button.attr('value') || 'delete card',\n        }).appendTo($(e.currentTarget));\n\n        const formData = $(e.currentTarget).serialize();\n        const formAction = $(e.currentTarget).attr('action');\n        const message = String.format(Resources.CONFIRM_DELETE, Resources.TITLE_CREDITCARD);\n        const dialogTitle = Resources.DELETE_TITLE;\n        let confirmDelete = false;\n\n        dialog.open({\n            html: message,\n            options: {\n                height: 'auto',\n                title: dialogTitle,\n                dialogClass: 'ui-dialog-delete-confirmation',\n                buttons: [\n                    {\n                        text: Resources.REMOVE,\n                        class: 'button primary',\n                        click() {\n                            confirmDelete = true;\n                            $(this).dialog('close');\n                        },\n                    },\n                    {\n                        text: Resources.NO_THANKS,\n                        class: 'button tertiary',\n                        click() {\n                            $(this).dialog('close');\n                        },\n                    },\n                ],\n                close() {\n                    if (confirmDelete) {\n                        deleteCard(formAction, formData).then((data) => {\n                            page.redirect(data);\n                        });\n                    }\n                },\n            },\n        });\n    });\n\n    // Updates expiration update submit button text when interacting with expiration month/year dropdowns\n    paymentList.on('change', 'select', (e) => {\n        const updateForm = $(e.currentTarget).parents('form');\n        if (updateForm.length > 0 && updateForm.find('button').length > 0) {\n            const updateBtn = updateForm.find('button');\n            updateBtn.text(updateBtn.attr('value')).removeClass('error-icon');\n        }\n    });\n}\n\n/**\n * @private\n * @function\n * @description Updates payment method for make a payment form\n */\nfunction updatePaymentMethod(element) {\n    element.parents('.payment-methods').find('.payment-method-type').hide();\n    element.parents('.payment-row').find('.payment-method-type').show();\n}\n\n/**\n * @private\n * @function\n * @description Binds the events for make a payment form\n */\nfunction initializeAccountPaymentForm() {\n    const $selectPaymentAmount = $('input[name$=\"_accountpayment_amountChoice\"]');\n    const $otherAmount = $('input[name$=\"_accountpayment_otherAmount\"]');\n\n    $selectPaymentAmount.on('change', (e) => {\n        $otherAmount.toggleClass('required', $(e.currentTarget).val() === 'other' && $(e.currentTarget).is(':checked'));\n    }).trigger('change');\n\n    // Auto-select 'other' radio when customer starts entering an amount in the other amount input field\n    $otherAmount.on('keydown', () => {\n        $('input[id$=\"_amountChoice_other\"]').click();\n    });\n\n    $('input[name$=\"_accountpayment_paymentMethods_selectedPaymentMethodID\"]').on('click', (e) => {\n        updatePaymentMethod($(e.currentTarget));\n    }).filter(':checked').each((index, element) => {\n        updatePaymentMethod($(element));\n    });\n\n    $('input[name$=\"_accountpayment_paymentMethods_ach_newOrRecent\"]').on('change', (e) => {\n        $('.ach-form-container').toggleClass('hide', $(e.currentTarget).val() !== 'new');\n    });\n}\n\n/**\n * @function\n * @description Clears the Credit Card form by setting fields back to their initial values.\n */\nfunction clearPaymentCreditCardFields(container) {\n    const $creditCard = container.find('[data-method=\"CREDIT_CARD\"]');\n    $creditCard.find('input[name$=\"creditCard_owner\"]').val('').trigger('change');\n    $creditCard.find('select[name$=\"_type\"]').val($creditCard.find('select[name$=\"_type\"] option:first').val()).trigger('change');\n    $creditCard.find('input[name*=\"_creditCard_number\"]').val('').trigger('change');\n    $creditCard.find('[name$=\"_month\"]').val($creditCard.find('[name$=\"_month\"] option:first').val()).trigger('change');\n    $creditCard.find('[name$=\"_year\"]').val($creditCard.find('[name$=\"_year\"] option:first').val()).trigger('change');\n    $creditCard.find('input[name$=\"_cvn\"]').val('').trigger('change');\n}\n\n/**\n * @private\n * @function\n * @description Binds the events for the credit card fields on the make a payment form\n */\nfunction initializePaymentCreditCard() {\n    $('input[name$=\"_accountpayment_paymentMethods_creditCardList\"]').on('change', (e) => {\n        const cardUUID = $(e.currentTarget).val();\n        const isSavedCard = cardUUID && cardUUID.length > 0;\n        const $container = $(e.currentTarget).parents('.payment-method-type');\n        const $creditCardFields = $container.find('.credit-card-fields');\n        const $saveCard = $container.find('input[name$=\"_accountpayment_paymentMethods_creditCard_saveCard\"]');\n\n        $saveCard.prop('checked', !isSavedCard);\n        $creditCardFields.toggle(!isSavedCard);\n        clearPaymentCreditCardFields($container);\n    }).filter(':checked').trigger('change');\n}\n\n/**\n * @private\n * @function\n * @description Initializes the change account and change plan dialog forms\n */\nfunction initializeAccountDialog() {\n    validator.init();\n\n    $('.cancel').click((e) => {\n        e.preventDefault();\n        dialog.close();\n    });\n\n    const $form = $('#ChangeAccountDialog, #ChangePlanDialog');\n    const $submit = $form.find('button');\n\n    $($submit).on('click', (e) => {\n        const $triggeredSubmit = $(e.currentTarget);\n        const $triggeredForm = $triggeredSubmit.parents('form');\n        if (!$triggeredForm.valid()) {\n            return;\n        }\n        e.preventDefault();\n        let data = $triggeredForm.serialize();\n        // add form action to data\n        data += `&${$triggeredSubmit.attr('name')}=`;\n        // make sure the server knows this is an ajax request\n        if (data.indexOf('ajax') === -1) {\n            data += '&format=ajax';\n        }\n        $.ajax({\n            type: 'POST',\n            url: $triggeredForm.attr('action'),\n            data,\n            success(response) {\n                if (typeof response === 'object' && !response.success && response.error === 'CSRF Token Mismatch') {\n                    page.redirect(Urls.csrffailed);\n                } else if (typeof response === 'object') {\n                    // Object response either means the request succeeded or the customer is no longer authenticated\n                    page.refresh();\n                } else if (typeof response === 'string') {\n                    dialog.$container.html(response);\n                    initializeAccountDialog();\n                }\n            },\n            failure() {\n                dialog.$container.html(`<h1>${Resources.SERVER_ERROR}</h1>`);\n            },\n        });\n    });\n}\n\n/**\n * @private\n * @function\n * @description Initializes the Email Sign-On & Settings events\n */\nfunction initEmailUpdateEvents() {\n    // Handle email form submissions\n    $('.account-email-preferences').on('submit', 'form', (e) => {\n        e.preventDefault();\n\n        const $form = $(e.currentTarget);\n        const module = $form.parents('.account-module');\n        const url = util.appendParamToURL($form.attr('action'), 'format', 'ajax');\n        const applyName = $form.find('.apply-button').attr('name');\n\n        progress.show(module);\n\n        const options = {\n            url,\n            data: `${$form.serialize()}&${applyName}=x`,\n            type: 'POST',\n        };\n        $.ajax(options).done((data) => {\n            module.html(data);\n            validator.init();\n            progress.hide();\n        });\n    }).on('click', '.account-module-actions', (e) => {\n        e.preventDefault();\n        $(e.currentTarget).parents('.account-module').toggleClass('active');\n    }).on('click', '.cancel', (e) => {\n        e.preventDefault();\n        $(e.currentTarget).parents('.account-module').removeClass('active').find('form').trigger('reset');\n    }).on('click', '.subscription-update', (e) => {\n        e.preventDefault();\n\n        const module = $(e.currentTarget).parents('.account-module');\n\n        progress.show(module);\n\n        const url = $(e.currentTarget).prop('href');\n        const csrf = module.find('.csrf');\n        const csrfName = csrf.prop('name');\n        const csrfValue = csrf.prop('value');\n\n        const options = {\n            url: util.appendParamToURL(url, csrfName, csrfValue),\n            type: 'POST',\n        };\n        $.ajax(options).done((data) => {\n            module.html(data);\n            validator.init();\n            progress.hide();\n        });\n    });\n    window.onload = function onload() {\n        if (window.location.hash) {\n            const target = $(window.location.hash);\n            if (target.length > 0) {\n                target.find('.edit-link').trigger('click');\n                $('html, body').animate({scrollTop: target.offset().top}, 400);\n            }\n        }\n    };\n}\n\nfunction initDueDateSelect() {\n    const dateCurrent = $('#plan-due-date').attr('value');\n    $('select[id$=\"_account_changeduedate_newDate\"] option').each((index, element) => {\n        if ($(element).val() === dateCurrent) {\n            $(element).remove();\n        }\n    });\n}\n\nfunction initStatementsList() {\n    $('.statements-link').on('click', (e) => {\n        e.preventDefault();\n        const statementClosing = $(e.currentTarget).data('closing');\n        let url = util.appendParamToURL(Urls.openStatement, 'url', statementClosing);\n        url = util.ajaxUrl(url);\n        $.ajax({\n            url,\n        }).done((response) => {\n            if (!response.success) {\n                console.log('eStatement call failure');\n            }\n            window.open(response.url);\n        });\n    });\n}\n\n/**\n * @private\n * @function\n * @description Binds the events for the date of birth field on the prequalification form\n */\nfunction initPrequalification() {\n    $('input[id$=\"_prequalification_birthdate\"]').datepicker({\n        changeMonth: true,\n        changeYear: true,\n        yearRange: '-120:+0',\n        minDate: '-120y',\n        maxDate: '+0d',\n        onClose() {\n            $(this).valid();\n        },\n    });\n}\n\n/**\n * @function\n * @description Checks for and removes duplicate addresses in the address book\n*/\nfunction checkForDuplicateAddresses(addressBook) {\n    const duplicates = addressBook.filter((addr) => {\n        const addrBook = addressBook.toArray().map((a) => {\n            const name = $(a).find('.mini-address-name').text();\n            const location = $(a).find('.mini-address-location').text();\n            return `${name}${location}`;\n        });\n        return addrBook.indexOf(addrBook[addr]) !== addr;\n    });\n    if (duplicates.length) {\n        const deleteDuplicates = new TPromise(() => {\n            const duplicateTitles = duplicates.map((i) => $(duplicates[i]).find('.mini-address-title').text());\n            duplicateTitles.each((i) => {\n                const targetUrl = util.appendParamsToUrl(Urls.deleteAddress, {\n                    AddressID: duplicateTitles[i],\n                    format: 'ajax',\n                });\n                submitDelete(targetUrl);\n            });\n        });\n        deleteDuplicates.then((data) => {\n            page.refresh(data);\n        });\n    }\n}\n\n/**\n * @private\n * @function\n * @description Binds the events of the order, address and payment pages\n */\nfunction initializeEvents() {\n    toggleFullOrder();\n    initAddressEvents();\n    initPaymentEvents();\n    initOrderHistoryEvents();\n    initEmailUpdateEvents();\n    login.init();\n    initializeAccountPaymentForm();\n    initializePaymentCreditCard();\n    initDueDateSelect();\n    initStatementsList();\n    initPrequalification();\n\n    // Listener to activate change account and plan modals\n    $('.change-account, .change-plan').on('click', (e) => {\n        e.preventDefault();\n\n        const link = $(e.currentTarget);\n        const options = {\n            url: util.ajaxUrl($(e.target).attr('href')),\n        };\n        // Use ajax and check response first in case customer's authenticated session has expired\n        $.ajax(options).done((data) => {\n            if (typeof (data) === 'object') {\n                // If an object is return, customer is logged out\n                // Refresh page to send back to login\n                page.refresh();\n            } else {\n                dialog.create({\n                    target: $(`#${link.data('dialog')}`),\n                    options: {\n                        title: link.data('title'),\n                        open: initializeAccountDialog,\n                    },\n                });\n                dialog.openWithContent({\n                    content: data,\n                });\n            }\n        });\n    });\n\n    if ($('div.account-overview').length > 0 && ($('div.account-overview').attr('data-wsc505-return-code') === '02' || $('div.account-overview').attr('data-wsc505-return-code') === '03')) {\n        $.ajax({\n            url: util.appendParamsToUrl(util.ajaxUrl(Urls.verifyAccountForm), {wsc505ReturnCode: $('div.account-overview').attr('data-wsc505-return-code'), ts: Date.now()}),\n        }).done((data) => {\n            if (data && $(data).length > 0) {\n                dialog.create({\n                    options: {\n                        title: $('div.account-overview').attr('data-welcome-text'),\n                        open() {\n                            validator.init();\n\n                            $('#verify-account a.cancel').click((e) => {\n                                e.preventDefault();\n                                dialog.close();\n                            });\n                        },\n                    },\n                });\n                dialog.openWithContent({\n                    content: data,\n                });\n            }\n        });\n    }\n\n    $('#emailsignup-birthday-form #dwfrm_emailsignup__birthday_birthday').datepicker({\n        changeMonth: true,\n        changeYear: false,\n        dateFormat: 'mm/dd',\n        yearRange: '2000:2000',\n    }).focus(() => {\n        $('.ui-datepicker-year').hide();\n    });\n\n    // Prevent double-submit on emailsignup forms\n    $('#emailsignup-birthday-form input').bind('change', () => {\n        $('#emailsignup-birthday-form button[name=\"dwfrm_emailsignup__birthday_send\"]').removeClass('disabled');\n    });\n    $('#emailsignup-birthday-form').bind('submit', () => {\n        if ($('#emailsignup-birthday-form button[name=\"dwfrm_emailsignup__birthday_send\"]').hasClass('disabled')) {\n            return false;\n        }\n        $('#emailsignup-birthday-form button[name=\"dwfrm_emailsignup__birthday_send\"]').addClass('disabled');\n        return true;\n    });\n\n    util.smartResize(() => {\n        if (util.mediaBreakpointUp('md') && $('.account-menu').attr('style')) {\n            $('.account-menu').removeAttr('style');\n        }\n    });\n\n    // Listener for print links\n    $('.print-link').on('click', (e) => {\n        e.preventDefault();\n        window.print();\n    });\n\n    const $addressBook = $('#addresses').find('.address-tile');\n    checkForDuplicateAddresses($addressBook);\n    $addressBook.on('change', () => checkForDuplicateAddresses($addressBook));\n}\n\nconst account = {\n    init() {\n        initializeEvents();\n        giftcert.init();\n    },\n    initCartLogin() {\n        login.init();\n    },\n};\n\nmodule.exports = account;\n"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;A","sourceRoot":""}