{"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: `
${errorMessage}
`,\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(`${Resources.VIEW_ALL}`).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: `
${error}
`,\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 = `

${[\n Resources.PLEASE_CONFIRM_PAYMENT,\n `${Resources.PAYMENT_AMOUNT}$${paymentAmount}`,\n Resources.CANNOT_CHANGE_AMOUNT,\n ].join('

')}

`;\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 $('').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(`

${Resources.SERVER_ERROR}

`);\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":""}