{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./assets/src/js/utils/cart-utils.js","webpack:///./assets/src/js/utils/ga-ecommerce-utils.js","webpack:///./assets/src/js/accessories.js","webpack:///./assets/src/js/utils/sst-utils.js","webpack:///./assets/src/js/utils/cookie-utils.js","webpack:///./assets/src/js/modules/mini-cart.js","webpack:///./assets/src/js/utils/form-validation-utils.js","webpack:///./assets/src/js/utils/scrolling-utils.js","webpack:///./assets/src/js/modules/site-toaster.js","webpack:///./assets/src/js/modules/site-popup.js","webpack:///./assets/src/js/modules/site-modal.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","getEpiCartItems","url","window","location","protocol","hostname","Promise","resolve","reject","fetch","then","json","catch","addToEpiCart","code","method","headers","accept","ok","removeFromEpiCart","pushToDataLayer","data","console","log","dataLayer","push","ecommerce","getEventData","response","error","checkout","event","addPaymentInfo","paymentType","addShippingInfo","gaAddToCart","type","init","document","addEventListener","href","target","indexOf","viewCart","viewItem","viewItemList","category","Accessories","that","this","getDetailModalUrl","getSwapAccessoryUrl","modalId","modelListSelector","getElementById","sizeListSelector","mountListSelector","maxAccessoriesForInitialDisplay","accessoryGrid","hiddenSelector","toaster","addStatus","removeStatus","getAvailableSizesForSelectedModel","getAvailableMountTypesForSelectedModel","form","querySelector","submitBtn","preventDefault","classList","add","setAttribute","validate","getAccessoriesForAwning","showMoreBtn","showAdditionalAccessories","showLessBtn","hideAdditionalAccessories","closest","reset","btn","getAttribute","epiCode","optionsId","optionsElmt","contains","e","addToOrderLine","Qty","updateCartBtnLabel","updateCartQty","getMiniCartHtml","displayToaster","unitPrice","itemQty","optionName","alert","parseFloat","removeOrderLine","removeAttribute","itemNoFrom","itemNoTo","swapAccessory","orderHoodMsg","hoodAddedToOrderMsg","remove","removeExistingDetailModal","getAccessoryDetailModal","initModal","text","status","textContent","qty","qtyWrapper","parentNode","qtyIpt","msg","SiteToaster","id","message","open","setTimeout","close","accessoryItems","querySelectorAll","a","length","focus","accessoriesShown","map","item","setAccessoryGridFocus","hideAfter","sizeOptions","option","mountOptions","innerHTML","detailModal","modalHtml","body","div","createElement","trim","appendChild","firstChild","modal","SitePopup","updateHeight","request","XMLHttpRequest","onload","responseText","send","model","size","mount","addOutdoorProductToOrderLine","itemNo","group","_group","_unitPrice","_itemQty","captureScreenDimensions","navigator","screen","height","width","userAgent","getCookie","screenDims","replace","setCookie","cookies","cookie","split","forEach","str","substring","days","date","Date","setTime","getTime","toGMTString","setCookieToExpireOnDate","initMiniCart","cart","icon","items","updateMiniCartHtml","html","miniCartDiv","formSelectors","validateByType","val","RegExp","test","addRequiredAttrs","inputList","clearInputValues","fieldList","fieldErrorList","field","isValid","required","isFormValid","fieldError","errorMsg","element","scrollToElement","addFocusToErrorMessage","formatPhone","match","arr","join","removeAllErrors","removeRequiredAttrs","resetSelectValues","selectList","firstOption","options","offset","position","y","offsetTop","scrollTo","top","behavior","openToasters","callbacks","onOpen","onClose","render","update","style","SiteModal","modalDiv","isOpen","previousElementInFocus","onResize","closeSelectors","disableOverlayClick","onDocumentModalKeyUp","toggleBtn","keyCode","contentDiv","altContentDiv","offsetHeight","resetFocus","setPreviousElementInFocus","activeElement"],"mappings":"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","file":"accessories.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","const getEpiCartItems = () => { // getCartItems()\n const url = `${window.location.protocol}//${window.location.hostname}/api/v1/cart`;\n return new Promise((resolve, reject) => {\n fetch(url)\n .then(r => r.json())\n .then(resolve)\n .catch(reject);\n });\n};\n\nconst addToEpiCart = code => ( // addToCart()\n new Promise((resolve, reject) => {\n fetch(`${window.location.protocol}//${window.location.hostname}/api/v1/cart/items/${code}`, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((r) => {\n if (r.ok) {\n r.json().then(resolve);\n } else {\n r.json().then(reject);\n }\n })\n .catch(reject);\n })\n);\n\n\nconst removeFromEpiCart = (code) => { // removeFromCart()\n const url = `${window.location.protocol}//${window.location.hostname}/api/v1/cart/items/${code}`;\n return new Promise((resolve, reject) => {\n fetch(url, { method: 'DELETE' })\n .then((r) => {\n if (r.ok) {\n resolve();\n } else {\n r.json().then(reject);\n }\n })\n .catch(reject);\n });\n};\n\nexport {\n getEpiCartItems,\n addToEpiCart,\n removeFromEpiCart,\n};\n","/* eslint-disable no-console */\nconst pushToDataLayer = (data) => {\n console.log(data);\n const { dataLayer } = window;\n if (dataLayer === null || data === null) return;\n dataLayer.push({ ecommerce: null });\n dataLayer.push(data);\n};\n\nconst getEventData = url => (\n new Promise((resolve, reject) => {\n fetch(url, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((response) => {\n if (response.ok) {\n response.json().then(resolve);\n } else {\n response.json().then(reject);\n }\n })\n .catch(console.error);\n })\n);\n\nconst addPaymentInfo = (paymentType) => {\n const url = `/ga/AddPaymentInfoFormatter?paymentType=${paymentType}`;\n getEventData(url)\n .then(ecommerce => (\n pushToDataLayer({\n event: 'add_payment_info',\n ecommerce,\n })\n ));\n};\n\nconst addShippingInfo = () => {\n const url = '/ga/AddShippingInfoFormatter';\n getEventData(url)\n .then(ecommerce => (\n pushToDataLayer({\n event: 'add_shipping_info',\n ecommerce,\n })\n ));\n};\n\nconst checkout = () => {\n const url = '/ga/CheckoutFormatter';\n getEventData(url)\n .then(ecommerce => (\n pushToDataLayer({\n event: 'begin_checkout',\n ecommerce,\n })\n ));\n};\n\nconst gaAddToCart = (code, type) => {\n const url = `/ga/AddToCartFormatter?code=${code}&type=${type}`;\n return new Promise((resolve, reject) => {\n fetch(url, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((response) => {\n if (response.ok) {\n response.json()\n .then((ecommerce) => {\n pushToDataLayer({\n event: 'add_to_cart',\n ecommerce,\n });\n })\n .then(resolve);\n } else {\n response.json().then(reject);\n }\n })\n .catch(console.error);\n });\n};\n\nconst init = () => {\n // Add in catch for all checkout buttons\n document.addEventListener('click', (event) => {\n const { target } = event;\n const { href } = target;\n if (href) {\n if (href.indexOf('checkout') !== -1) {\n checkout();\n }\n }\n });\n};\n\nconst viewCart = () => {\n const url = '/ga/ViewCartFormatter';\n getEventData(url)\n .then(ecommerce => (\n pushToDataLayer({\n event: 'view_cart',\n ecommerce,\n })\n ));\n};\n\nconst viewItem = (code, type) => {\n const url = `/ga/ViewItemFormatter?code=${code}&type=${type}`;\n getEventData(url)\n .then(ecommerce => (\n pushToDataLayer({\n event: 'view_item',\n ecommerce,\n })\n ));\n};\n\nconst viewItemList = (category) => {\n const url = `/ga/ViewItemListFormatter?name=${category}`;\n getEventData(url)\n .then((ecommerce) => {\n if (ecommerce === null) return;\n pushToDataLayer({\n event: 'view_item_list',\n ecommerce,\n });\n });\n};\n\nexport {\n addPaymentInfo,\n addShippingInfo,\n checkout,\n gaAddToCart,\n init,\n pushToDataLayer,\n viewCart,\n viewItem,\n viewItemList,\n};\n/* eslint-enable no-console */\n","/* eslint-disable no-console */\nimport { addToEpiCart, removeFromEpiCart } from './utils/cart-utils';\nimport { addToOrderLine, removeOrderLine } from './utils/sst-utils';\nimport { gaAddToCart } from './utils/ga-ecommerce-utils';\nimport { getMiniCartHtml } from './modules/mini-cart';\nimport { validate } from './utils/form-validation-utils';\nimport SiteToaster from './modules/site-toaster';\n\nimport SitePopup from './modules/site-popup';\n\nexport default class Accessories {\n constructor() {\n const that = this;\n this.getDetailModalUrl = 'GetAccessoryDetailModal';\n this.getSwapAccessoryUrl = 'SwapAccessory';\n this.modalId = 'accessory-detail-modal';\n this.modelListSelector = document.getElementById('Model');\n this.sizeListSelector = document.getElementById('Size');\n this.mountListSelector = document.getElementById('Mount');\n this.maxAccessoriesForInitialDisplay = 0;\n this.accessoryGrid = document.getElementById('accessoryGrid');\n this.hiddenSelector = 'hidden';\n this.toaster = null;\n this.addStatus = 'add';\n this.removeStatus = 'remove';\n // Add events to model selector, if exsits in this state\n if (this.modelListSelector !== null) {\n this.modelListSelector.addEventListener('change', (event) => {\n that.getAvailableSizesForSelectedModel(event);\n that.getAvailableMountTypesForSelectedModel(event);\n });\n }\n // Add events to accessory search form, if exsits in this state\n this.form = document.querySelector('.site-form');\n if (this.form !== null) {\n this.submitBtn = this.form.querySelector('.submit-btn');\n this.submitBtn.addEventListener('click', (event) => {\n event.preventDefault();\n that.submitBtn.classList.add('updating');\n that.submitBtn.setAttribute('disabled', 'disabled');\n const isValid = validate(this.form);\n if (isValid) {\n that.getAccessoriesForAwning();\n }\n });\n }\n // Add events to \"Show More/Less\" buttons, if exists in this state\n this.showMoreBtn = document.querySelector('.show-more-btn');\n if (this.showMoreBtn !== null) {\n this.showMoreBtn.addEventListener('click', () => {\n this.showAdditionalAccessories();\n });\n }\n this.showLessBtn = document.querySelector('.show-less-btn');\n if (this.showLessBtn !== null) {\n this.showLessBtn.addEventListener('click', () => {\n this.hideAdditionalAccessories();\n });\n }\n // Reset button\n document.addEventListener('click', (event) => {\n if (event.target.closest('.reset-results-btn')) {\n this.reset();\n }\n });\n // Grid/Accessory events\n document.addEventListener('click', (event) => {\n const btn = event.target;\n const code = btn.getAttribute('data-product-code');\n const epiCode = btn.getAttribute('data-episerver-product-code');\n // Check for options form element\n // Add validation for Install Fee and Roof Brackets (FSR)\n const optionsId = btn.getAttribute('data-options-id');\n const optionsElmt = document.getElementById(optionsId);\n // Add to cart\n if (btn.classList.contains('add-to-cart-btn')) {\n // Check to see if accessory exists in catalog\n if (epiCode !== '') {\n addToOrderLine(code)\n .then((data) => {\n // Update btn state\n if (data.Qty > 0 && btn.classList.contains('co-btn')) {\n this.updateCartBtnLabel(btn, this.removeStatus);\n } else {\n this.updateCartBtnLabel(btn, this.addStatus);\n }\n // Update quantity state\n this.updateCartQty(btn, data.Qty);\n addToEpiCart(code);\n })\n .then(() => {\n getMiniCartHtml();\n this.displayToaster('Item has been added to your cart.');\n })\n .catch(console.error);\n } else {\n let unitPrice = '';\n let itemQty = '1';\n if (optionsElmt !== null) {\n const optionName = optionsElmt.getAttribute('data-option-name');\n const { alert } = window;\n if (optionName === 'currency') {\n unitPrice = optionsElmt.value;\n const isPrice = parseFloat(unitPrice) > 0;\n // Validation\n if (!isPrice) {\n alert('Please enter a valid price before adding to cart.');\n return;\n }\n } else if (optionName === 'quantity') {\n itemQty = optionsElmt.value;\n // Validation\n if (itemQty === '') {\n alert('Please select a value before adding to cart.');\n return;\n }\n }\n }\n addToOrderLine(code, '', unitPrice, itemQty)\n .then((data) => {\n // Update btn state\n if (data.Qty > 0 && btn.classList.contains('co-btn')) {\n this.updateCartBtnLabel(btn, this.removeStatus);\n } else {\n this.updateCartBtnLabel(btn, this.addStatus);\n }\n // Update quantity state\n this.updateCartQty(btn, data.Qty);\n // Disable options form element\n if (optionsElmt !== null) {\n optionsElmt.setAttribute('disabled', 'disabled');\n }\n this.displayToaster('Item has been added to your cart.');\n })\n .catch(console.error);\n }\n return;\n }\n // Remove from cart\n if (btn.classList.contains('remove-from-cart-btn')) {\n removeOrderLine(code)\n .then((data) => {\n // Update btn state\n this.updateCartBtnLabel(btn, this.addStatus);\n this.updateCartQty(btn, data.Qty);\n removeFromEpiCart(code);\n })\n .then(() => {\n getMiniCartHtml();\n // Enable options form element\n if (optionsElmt !== null) {\n optionsElmt.removeAttribute('disabled');\n }\n this.displayToaster('Item has been removed from your cart.');\n })\n .catch(console.error);\n return;\n }\n // Swap Accessory\n if (btn.classList.contains('swap-accessory-btn')) {\n const itemNoFrom = btn.getAttribute('data-itemno-from');\n const itemNoTo = btn.getAttribute('data-itemno');\n this.swapAccessory(itemNoFrom)\n .then(gaAddToCart(itemNoTo))\n .then(() => {\n getMiniCartHtml();\n this.displayToaster('Item has been added to your cart.');\n // Display hood added to order message\n const orderHoodMsg = document.getElementById('orderHoodMsg');\n const hoodAddedToOrderMsg = document.getElementById('hoodAddedToOrderMsg');\n orderHoodMsg.classList.add('hidden');\n hoodAddedToOrderMsg.classList.remove('hidden');\n });\n return;\n }\n // Launch detail modal\n const modalBtn = btn.closest('.product-detail-modal-btn');\n if (modalBtn != null) {\n event.preventDefault();\n this.removeExistingDetailModal();\n this.getAccessoryDetailModal(code)\n .then((data) => {\n if (data !== '~error~') {\n this.initModal(data);\n }\n })\n .catch(console.error);\n }\n });\n }\n\n swapAccessory(itemNoFrom) {\n const url = `${this.getSwapAccessoryUrl}?itemNoFrom=${itemNoFrom}`;\n return new Promise((resolve, reject) => {\n fetch(url, {\n method: 'POST',\n })\n .then((response) => {\n if (response.ok) {\n response.text().then(resolve);\n } else {\n response.text().then(reject);\n }\n })\n .catch(console.error);\n });\n }\n\n updateCartBtnLabel(btn, status) {\n if (status === this.addStatus) {\n btn.textContent = 'Add to Cart';\n btn.classList.add('add-to-cart-btn');\n btn.classList.remove('remove-from-cart-btn');\n } else if (status === this.removeStatus) {\n btn.textContent = 'Remove from Cart';\n btn.classList.remove('add-to-cart-btn');\n btn.classList.add('remove-from-cart-btn');\n }\n }\n\n updateCartQty(btn, qty) {\n const qtyWrapper = btn.parentNode.querySelector('.cart-qty');\n const qtyIpt = btn.parentNode.querySelector('.form-control-qty');\n if (qty === 0) {\n qtyWrapper.classList.add(this.hiddenSelector);\n } else {\n qtyWrapper.classList.remove(this.hiddenSelector);\n }\n qtyIpt.value = qty;\n }\n\n displayToaster(msg) {\n if (this.toaster) {\n this.toaster.remove();\n }\n this.toaster = new SiteToaster({\n id: 'status-toaster',\n message: `${msg}`,\n });\n this.toaster.open();\n setTimeout(() => {\n if (this.toaster) {\n this.toaster.close();\n }\n }, 3000);\n setTimeout(() => {\n if (this.toaster) {\n this.toaster.remove();\n }\n }, 3300);\n }\n\n setAccessoryGridFocus() {\n // Set focus to first button in grid\n const accessoryItems = this.accessoryGrid.querySelectorAll('.accessory-card button');\n if (accessoryItems.length > 0) {\n accessoryItems[0].focus();\n }\n }\n\n showAdditionalAccessories() {\n const accessoryItems = this.accessoryGrid.querySelectorAll('.col');\n const accessoriesShown = this.accessoryGrid.querySelectorAll('.col:not(.d-none)').length;\n this.maxAccessoriesForInitialDisplay = accessoriesShown;\n [].map.call(accessoryItems, (item) => {\n item.classList.remove('d-none');\n item.classList.add('d-flex');\n });\n this.showMoreBtn.classList.add(this.hiddenSelector);\n this.showLessBtn.classList.remove(this.hiddenSelector);\n this.setAccessoryGridFocus();\n }\n\n hideAdditionalAccessories() {\n const hideAfter = this.maxAccessoriesForInitialDisplay;\n const accessoryItems = this.accessoryGrid.querySelectorAll(`.col:nth-child(n + ${hideAfter})`);\n [].map.call(accessoryItems, (item) => {\n item.classList.remove('d-flex');\n item.classList.add('d-none');\n });\n this.showMoreBtn.classList.remove(this.hiddenSelector);\n this.showLessBtn.classList.add(this.hiddenSelector);\n this.setAccessoryGridFocus();\n }\n\n reset() {\n // Reset selects\n this.modelListSelector.value = '';\n this.sizeListSelector.value = '';\n this.mountListSelector.value = '';\n // Disable selects\n this.sizeListSelector.classList.add('disabled');\n this.sizeListSelector.setAttribute('disabled', 'disabled');\n this.mountListSelector.classList.add('disabled');\n this.mountListSelector.setAttribute('disabled', 'disabled');\n // Remove additional options from sizes sand mount\n const sizeOptions = this.sizeListSelector.querySelectorAll('option:nth-child(n + 2)');\n [].map.call(sizeOptions, (option) => {\n option.remove();\n });\n const mountOptions = this.mountListSelector.querySelectorAll('option:nth-child(n + 2)');\n [].map.call(mountOptions, (option) => {\n option.remove();\n });\n // Remove results\n this.accessoryGrid.innerHTML = '';\n }\n\n getAccessoryDetailModal(code) {\n const url = `${this.getDetailModalUrl}?code=${code}`;\n return new Promise((resolve, reject) => {\n fetch(url, {\n method: 'POST',\n })\n .then((response) => {\n if (response.ok) {\n response.text().then(resolve);\n } else {\n response.text().then(reject);\n }\n })\n .catch(console.error);\n });\n }\n\n removeExistingDetailModal() {\n const detailModal = document.getElementById(this.modalId);\n if (detailModal != null) {\n detailModal.remove();\n }\n }\n\n initModal(modalHtml) {\n // Append html to the end of the DOM\n const body = document.querySelector('body');\n const div = document.createElement('div');\n div.innerHTML = modalHtml.trim();\n body.appendChild(div.firstChild);\n // Define div references\n const modal = new SitePopup({\n id: this.modalId,\n });\n modal.updateHeight();\n modal.open();\n }\n\n getAvailableSizesForSelectedModel(event) {\n const code = event.target.value;\n const request = new XMLHttpRequest();\n request.open('POST', `GetModelSizes/?code=${code}`);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n this.sizeListSelector.innerHTML = request.responseText;\n this.sizeListSelector.removeAttribute('disabled');\n this.sizeListSelector.classList.remove('disabled');\n }\n };\n request.send();\n }\n\n getAvailableMountTypesForSelectedModel(event) {\n const code = event.target.value;\n const request = new XMLHttpRequest();\n request.open('POST', `GetModelMountTypes/?code=${code}`);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n this.mountListSelector.innerHTML = request.responseText;\n if (this.mountListSelector.querySelectorAll('option').length > 1) {\n this.mountListSelector.removeAttribute('disabled');\n this.mountListSelector.classList.remove('disabled');\n } else {\n this.mountListSelector.setAttribute('disabled', 'disabled');\n this.mountListSelector.classList.add('disabled');\n }\n }\n };\n request.send();\n }\n\n getAccessoriesForAwning() {\n const { submitBtn } = this;\n const model = this.modelListSelector.value;\n const size = this.sizeListSelector.value;\n const mount = this.mountListSelector.value;\n const request = new XMLHttpRequest();\n request.open('POST', `GetAccessoriesForAwning/?model=${model}&size=${size}&mount=${mount}`);\n request.onload = () => {\n submitBtn.classList.remove('updating');\n submitBtn.removeAttribute('disabled');\n if (request.status >= 200 && request.status < 400) {\n const wrapper = document.getElementById('accessoryGrid');\n wrapper.innerHTML = request.responseText;\n }\n };\n request.send();\n }\n}\nwindow.Accessories = Accessories;\n/* eslint-enable no-console */\n","/* eslint-disable no-console, no-underscore-dangle */\nimport { gaAddToCart } from './ga-ecommerce-utils';\nimport { getCookie, setCookie } from './cookie-utils';\n\nconst addToOrderLine = (itemNo, group, unitPrice, itemQty) => (\n new Promise((resolve, reject) => {\n const _group = !group ? '' : group;\n const _unitPrice = !unitPrice ? '' : unitPrice;\n const _itemQty = !itemQty ? '1' : itemQty;\n fetch(`${window.location.protocol}//${window.location.hostname}/RouteOrderLine?itemNo=${itemNo}&group=${_group}&unitPrice=${_unitPrice}&itemQty=${_itemQty}`, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((r) => {\n gaAddToCart(itemNo)\n .then(() => {\n if (r.ok) {\n r.json().then(resolve);\n } else {\n r.json().then(reject);\n }\n });\n })\n .catch(console.error);\n })\n);\n\nconst removeOrderLine = itemNo => (\n new Promise((resolve, reject) => {\n fetch(`${window.location.protocol}//${window.location.hostname}/RemoveOrderLine?itemNo=${itemNo}`, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((r) => {\n if (r.ok) {\n r.json().then(resolve);\n } else {\n r.json().then(reject);\n }\n })\n .catch(console.error);\n })\n);\n\nconst addOutdoorProductToOrderLine = (itemNo, group) => (\n new Promise((resolve, reject) => {\n fetch(`${window.location.protocol}//${window.location.hostname}/RouteOrderLine?itemNo=${itemNo}&group=${group}`, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((r) => {\n gaAddToCart(itemNo, group)\n .then(() => {\n if (r.ok) {\n r.json().then(resolve);\n } else {\n r.json().then(reject);\n }\n });\n })\n .catch(console.error);\n })\n);\n\nconst captureScreenDimensions = () => {\n const { navigator, screen } = window;\n const { height, width } = screen;\n const { userAgent } = navigator;\n const COOKIE_NAME = 'sst-ss';\n // Only run if cookie has w/ dimensions has not been set\n if (getCookie(COOKIE_NAME) === '') {\n const screenDims = `${height}x${width}`;\n const url = `${window.location.protocol}//${window.location.hostname}/api/SaveScreenSize/?ss=${screenDims}&ua=${userAgent.replace(/\\s/g, '')}`;\n fetch(url, {\n method: 'POST',\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n },\n })\n .then((response) => {\n if (response.ok) {\n // Only storing the screen dimensions in the cookie\n setCookie(COOKIE_NAME, screenDims, 200);\n }\n })\n .catch(console.error);\n }\n};\n\nexport {\n addOutdoorProductToOrderLine,\n addToOrderLine,\n captureScreenDimensions,\n removeOrderLine,\n};\n/* eslint-enable no-console, no-underscore-dangle */\n","const getCookie = (name) => {\n const cookies = document.cookie.split(';');\n let value = '';\n cookies.forEach((str) => {\n const cookie = str.trim();\n if (cookie.indexOf(name) !== -1) {\n value = cookie.substring(name.length + 1, cookie.length);\n }\n });\n return value;\n};\n\nconst setCookie = (name, value, days) => {\n const date = new Date();\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n document.cookie = `${name}=${value}; expires=${date.toGMTString()}; path=/`;\n};\n\nconst setCookieToExpireOnDate = (name, value, date) => {\n document.cookie = `${name}=${value}; expires=${date.toGMTString()}; path=/`;\n};\n\nexport {\n getCookie,\n setCookie,\n setCookieToExpireOnDate,\n};\n","/* eslint-disable no-use-before-define */\nimport { getEpiCartItems } from '../utils/cart-utils';\n\nconst getMiniCartHtml = () => {\n const url = `${window.location.protocol}//${window.location.hostname}/cart/MiniCartDetails`;\n fetch(url)\n .then(r => r.text())\n .then(updateMiniCartHtml)\n .catch(console.error);\n};\n\n/* const onRemoveItemClick = (e) => {\n const code = e.target.getAttribute('data-code');\n removeFromEpiCart(code)\n .then(getMiniCartHtml)\n .catch(console.error);\n}; */\n\nconst initMiniCart = () => {\n getEpiCartItems()\n .then((cart) => {\n const icon = document.querySelector('.icon-item-cart');\n if (!icon) {\n return;\n }\n if (cart.items.length) {\n icon.classList.add('items-added-to-cart');\n } else {\n icon.classList.remove('items-added-to-cart');\n }\n })\n .catch(console.error);\n // const itemList = document.getElementById('mini-cart-items-list');\n /* if (!itemList) {\n return;\n } */\n /* Array.from(itemList.children).forEach((li) => {\n const btn = li.querySelector('.mini-cart-rm');\n btn.onclick = onRemoveItemClick;\n }); */\n};\n\nconst updateMiniCartHtml = (html) => {\n const miniCartDiv = document.querySelector('.cart-content-wrap');\n if (!miniCartDiv) {\n return;\n }\n\n miniCartDiv.innerHTML = html;\n initMiniCart();\n};\n\nexport {\n getMiniCartHtml,\n initMiniCart,\n};\n/* eslint-enable no-use-before-define */\n","/* eslint-disable no-console, eslint-disable-line no-plusplus */\nimport { scrollToElement } from './scrolling-utils';\n\nconst formSelectors = 'input[type=\"text\"], input[type=\"password\"], textarea';\n\nconst validateByType = (type, val) => {\n // console.log(`${type}, ${val}`);\n let status;\n switch (type) {\n case 'text':\n status = val !== '';\n break;\n case 'phone':\n status = new RegExp(/^(\\+\\d{1,2}\\s)?\\(?\\d{3}\\)?[\\s.-]?\\d{3}[\\s.-]?\\d{4}$/).test(val);\n break;\n case 'zipcode':\n status = new RegExp(/(^\\d{5}(-\\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$)/).test(val);\n break;\n case 'email':\n /* eslint-disable no-useless-escape */\n status = new RegExp(/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/).test(val);\n /* eslint-enable no-useless-escape */\n break;\n case 'password':\n status = new RegExp(/^(?=.*[a-z])(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\\$%\\^&\\*])(?=.{8,})/).test(val); /* eslint-disable-line no-useless-escape */\n break;\n case 'productcode':\n // status = new RegExp(/^\\d{7,8}[\\.]\\d{3}$/).test(val); /* eslint-disable-line no-useless-escape */\n // status = new RegExp(/^(\\d{7,8}[\\.]\\d{3}$)|(^\\d{7,8}$)/).test(val); /* eslint-disable-line no-useless-escape */\n status = new RegExp(/^(\\d{1,}$)/).test(val); /* eslint-disable-line no-useless-escape */\n break;\n default:\n break;\n }\n return status;\n};\n\n// Format phone as xxx xxx xxxx\nconst formatPhone = (s) => {\n if (s !== null && s !== undefined && s !== '') {\n if (s.match(new RegExp(/\\d/g) || []) !== null) {\n const arr = s.match(new RegExp(/\\d/g) || []).join('');\n return `${arr.substring(0, 3)}-${arr.substring(3, 6)}-${arr.substring(6)}`;\n }\n return s;\n }\n return s;\n};\n\nconst addFocusToErrorMessage = (element) => {\n // Scroll to message\n scrollToElement({\n element,\n });\n // Add focus\n element.focus();\n};\n\nconst validate = (form) => {\n // Identify all fields with a validate attribute in form (will be on the label for the input/submit)\n const fieldList = form.querySelectorAll('[validate]');\n const fieldErrorList = [];\n let field;\n let isValid;\n let required;\n let isFormValid = true;\n for (let i = 0; i < fieldList.length; i++) { /* eslint-disable-line no-plusplus */\n field = fieldList[i];\n isValid = true;\n required = field.getAttribute('required') !== null;\n // If value is required, run against validation OR\n if (required) {\n isValid = validateByType(field.getAttribute('validate'), field.value);\n }\n // If value isn't required but value has been entered that requires validation, then run\n if (!required && field.value !== '' && field.getAttribute('validate') !== 'text') {\n isValid = validateByType(field.getAttribute('validate'), field.value);\n }\n // Mark field as invalid\n const fieldError = field.parentNode.querySelector('.text-danger');\n if (!isValid) {\n isFormValid = isValid;\n // Toggle error class on element label\n field.classList.add('input-validation-error');\n if (fieldError) {\n fieldError.classList.add('field-validation-error');\n fieldError.classList.remove('field-validation-valid');\n // Get error msg from input data attribute\n const errorMsg = field.getAttribute('data-val-required');\n fieldError.innerHTML = errorMsg;\n }\n fieldErrorList.push(field);\n } else {\n field.classList.remove('input-validation-error');\n if (fieldError) {\n fieldError.classList.remove('field-validation-error');\n fieldError.classList.add('field-validation-valid');\n fieldError.innerHTML = '';\n }\n }\n }\n // Form error message\n const errorMsg = form.querySelector('.form-error-message');\n if (isFormValid && errorMsg !== null) {\n errorMsg.classList.add('hidden');\n } else if (!isFormValid && errorMsg !== null) {\n errorMsg.classList.remove('hidden');\n // Add focus to error message, if form is invalid\n addFocusToErrorMessage(errorMsg);\n }\n return isFormValid;\n};\n\nconst removeAllErrors = (form) => {\n const fieldList = form.querySelectorAll('[validate]');\n for (let i = 0; i < fieldList.length; i++) { /* eslint-disable-line no-plusplus */\n const field = fieldList[i];\n const fieldError = field.parentNode.querySelector('.text-danger');\n field.classList.remove('input-validation-error');\n if (fieldError) {\n fieldError.classList.remove('field-validation-error');\n fieldError.classList.add('field-validation-valid');\n fieldError.innerHTML = '';\n }\n }\n};\n\nconst addRequiredAttrs = (form) => {\n const inputList = form.querySelectorAll(formSelectors);\n for (let i = 0; i < inputList.length; i++) { /* eslint-disable-line no-plusplus */\n inputList[i].setAttribute('required', 'required');\n }\n};\n\nconst removeRequiredAttrs = (form) => {\n const inputList = form.querySelectorAll(formSelectors);\n for (let i = 0; i < inputList.length; i++) { /* eslint-disable-line no-plusplus */\n inputList[i].removeAttribute('required');\n }\n};\n\nconst clearInputValues = (form) => {\n const inputList = form.querySelectorAll(formSelectors);\n for (let i = 0; i < inputList.length; i++) { /* eslint-disable-line no-plusplus */\n inputList[i].value = '';\n }\n};\n\nconst resetSelectValues = (form) => {\n const selectList = form.querySelectorAll('select');\n for (let i = 0; i < selectList.length; i++) { /* eslint-disable-line no-plusplus */\n const select = selectList[i];\n const firstOption = select.querySelector('option:first-child');\n if (firstOption) {\n selectList[i].value = firstOption.value;\n }\n }\n};\n\nexport {\n addRequiredAttrs,\n clearInputValues,\n validate,\n formatPhone,\n removeAllErrors,\n removeRequiredAttrs,\n resetSelectValues,\n validateByType,\n};\n/* eslint-enable no-console, eslint-disable-line no-plusplus */\n","/* eslint-disable import/prefer-default-export */\nconst scrollToElement = (options) => {\n const { element, offset, position } = options;\n let y = 0;\n if (element) {\n // console.log(`scrolling-utils.js, scrollToElement, ${element.offsetTop}`);\n y = element.offsetTop;\n }\n if (position) {\n y = position;\n }\n if (offset) {\n y += offset;\n }\n window.scrollTo({\n top: y,\n behavior: 'smooth',\n });\n};\n\nexport {\n scrollToElement,\n};\n/* eslint-enable import/prefer-default-export */\n","/* eslint-disable no-console */\nexport default class SiteToaster {\n constructor(options) {\n // If there are any other toasters open, remove\n const openToasters = document.querySelectorAll('.site-toaster');\n for (let i = 0; i < openToasters.length; i++) { /* eslint-disable-line no-plusplus */\n openToasters[i].remove();\n }\n if (!options.callbacks) {\n options.callbacks = {};\n }\n this.onOpen = options.callbacks.onOpen;\n this.onClose = options.callbacks.onClose;\n this.message = options.message;\n this.id = options.id;\n // Create toaster html\n this.render();\n // Toaster events\n window.addEventListener('resize', this.update.bind(this));\n window.addEventListener('scroll', this.update.bind(this));\n const toaster = document.getElementById(this.id);\n [].map.call(toaster.querySelectorAll('.close-btn'), btn => btn.addEventListener('click', this.close.bind(this)));\n }\n\n update() {\n const toaster = document.getElementById(this.id);\n if (toaster === null) {\n return;\n }\n toaster.style.top = 0;\n }\n\n render() {\n const body = document.querySelector('body');\n const div = document.createElement('div');\n div.id = this.id;\n div.classList.add('site-toaster');\n div.setAttribute('tabindex', '0');\n div.innerHTML = `
${this.message}
`;\n body.appendChild(div);\n }\n\n close() {\n const toaster = document.getElementById(this.id);\n if (toaster) {\n toaster.classList.remove('toaster-visible');\n if (this.onClose) {\n this.onClose();\n }\n }\n }\n\n open() {\n const toaster = document.getElementById(this.id);\n // toaster.classList.remove('hidden');\n setTimeout(() => {\n toaster.classList.add('toaster-visible');\n toaster.focus();\n }, 500);\n this.update();\n }\n\n remove() {\n const toaster = document.getElementById(this.id);\n if (toaster) {\n toaster.remove();\n }\n }\n}\n/* eslint-enable no-console */\n","/* eslint-disable no-console */\nimport SiteModal from './site-modal';\n\nexport default class SitePopup extends SiteModal {\n open() {\n // If any type of modal is open, do not continue\n const isModalOpen = document.querySelectorAll('.modal.modal-visible').length > 0;\n if (isModalOpen) {\n return;\n }\n super.open();\n }\n}\n/* eslint-enable no-console */\n","/* eslint-disable no-console */\nexport default class SiteModal {\n constructor(options) {\n if (!options.callbacks) {\n options.callbacks = {};\n }\n this.onOpen = options.callbacks.onOpen;\n this.onClose = options.callbacks.onClose;\n this.modalDiv = document.querySelector(`#${options.id}`);\n this.isOpen = false;\n this.previousElementInFocus = null;\n // Modal events\n window.addEventListener('resize', this.onResize.bind(this));\n const closeSelectors = `.close-btn, #modal-refine-btn, .close-modal-btn${options.disableOverlayClick ? '' : ', .modal-overlay'}`;\n [].map.call(this.modalDiv.querySelectorAll(closeSelectors), btn => btn.addEventListener('click', this.close.bind(this)));\n document.addEventListener('keyup', this.onDocumentModalKeyUp.bind(this));\n // Add open to toggleBtn\n if (options.toggleBtn) {\n options.toggleBtn.addEventListener('click', this.open.bind(this));\n }\n }\n\n onDocumentModalKeyUp(event) {\n if (event.keyCode === 27 && this.isOpen) {\n this.close(); /* eslint-disable-line no-use-before-define */\n }\n }\n\n setPreviousElementInFocus(element) {\n this.previousElementInFocus = element;\n }\n\n resetFocus() {\n if (this.previousElementInFocus) {\n this.previousElementInFocus.focus();\n }\n }\n\n updateHeight() {\n if (!this.isOpen) {\n return;\n }\n // Check both .modal-content and .modal-alternate-content\n const contentDiv = this.modalDiv.querySelector('.modal-content:not(.hidden)');\n const altContentDiv = this.modalDiv.querySelector('.modal-alternate-content:not(.hidden)');\n const div = contentDiv !== null ? contentDiv : altContentDiv;\n if (div) {\n this.modalDiv.querySelector('.modal-panel').style.height = `${div.offsetHeight + 30}px`;\n }\n }\n\n onResize() {\n if (!this.isOpen) {\n return;\n }\n this.updateHeight();\n }\n\n close() {\n this.isOpen = false;\n if (this.onClose) {\n this.onClose();\n }\n this.modalDiv.classList.remove('modal-visible');\n this.resetFocus();\n }\n\n open(event) {\n if (event) {\n event.preventDefault();\n }\n this.isOpen = true;\n this.modalDiv.classList.add('modal-visible');\n if (this.onOpen) {\n this.onOpen();\n }\n this.setPreviousElementInFocus(document.activeElement);\n this.modalDiv.focus();\n this.updateHeight();\n }\n}\n/* eslint-enable no-console */\n"],"sourceRoot":""}