{"version":3,"file":"default/js/productDetail.js","mappings":"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","sources":["webpack://app_custom_jw/../link_bolt/cartridges/int_bolt_sfra_oxford/cartridge/client/default/js/bolt/constants.js","webpack://app_custom_jw/../link_bolt/cartridges/int_bolt_sfra_oxford/cartridge/client/default/js/bolt/domUtil.js","webpack://app_custom_jw/../link_bolt/cartridges/int_bolt_sfra_oxford/cartridge/client/default/js/bolt/util.js","webpack://app_custom_jw/../link_secretsauce/cartridges/link_secretsauce_ext/cartridge/client/default/js/product/secretsauce.js","webpack://app_custom_jw/../node_modules/.pnpm/cleave.js@1.6.0/node_modules/cleave.js/dist/cleave-esm.js","webpack://app_custom_jw/../node_modules/.pnpm/hammerjs@2.0.8/node_modules/hammerjs/hammer.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/afterpay.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/amazonPay/amazonPay.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/clientSideValidation.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/carousel.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/etmc.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/imageSlider.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/modal.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/pdpEdd.js","webpack://app_custom_jw/../link_bolt/cartridges/int_bolt_sfra_oxford/cartridge/client/default/js/bolt/account.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/cart/cart.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/pickUpInStore/ispuHelper.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/pickUpInStore.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/constants.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/inventoryMessaging.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/ispuDeliveryMessaging.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/messagingUtil.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/shippingPreferenceHelper.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/shippingPreference/storeDetailHelper.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/constants.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/domUtil.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/googleMaps.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/login/login.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/loyalty/loyaltyDrawer.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/base.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/detail.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/helper.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/monogram.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/quickView.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/quickView/quickViewHelpers.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/templates.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/util.js","webpack://app_custom_jw/../plugin_instorepickup/cartridges/plugin_instorepickup/cartridge/client/default/js/product/pdpInstoreInventory.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/checkout/formErrors.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/errorNotification.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/formValidation.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/scrollAnimate.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/login/login.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/storeLocator/storeLocator.js","webpack://app_custom_jw/../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack://app_custom_jw/webpack/bootstrap","webpack://app_custom_jw/webpack/runtime/compat get default export","webpack://app_custom_jw/webpack/runtime/define property getters","webpack://app_custom_jw/webpack/runtime/global","webpack://app_custom_jw/webpack/runtime/hasOwnProperty shorthand","webpack://app_custom_jw/webpack/runtime/make namespace object","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/stickyCTA.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/product/pdpQuickView.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/components/notifyMe.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/productDetail.js"],"sourcesContent":["module.exports = {\n breakpoints: {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 1024,\n xl: 1362\n }\n};\n","/**\n * DOM utilities to use native browser capabilities and avoid dependencies.\n *\n * @module dom.dom-util\n * @version 1.0.0\n * @since Sept 26 2019\n *\n * @typedef {Object} ProductData\n * @property {string} colorCode - The product color code (E.g. 002)\n * @property {string} masterId - The product master ID (E.g. 003168)\n * @property {string} originalPrice - The product original price (E.g. 148.00)\n * @property {string} productColor - The product color name (E.g. Onyx)\n * @property {string} productId - The product SKU (E.g. 889069580469)\n * @property {string} productName - The product name (E.g. Keegan Lace Top)\n * @property {string} productPrice - The product sale price (E.g. 98.00)\n * @property {string} productSize - The product size (E.g. M)\n * @property {string} variationGroupId - The product variation group ID (E.g. 003168-onyx)\n */\n\nconst { breakpoints } = require('./constants');\n\n/**\n * Native querySelector to find first element in the dom with given selector\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {Object} returns the target as a DOM node\n */\nconst queryFirst = exports.queryFirst = (selector, parent = document) => {\n if (!parent) return null;\n return parent.querySelector(selector);\n};\n/**\n * loadScript to asynchronously load a script tag in DOM\n *\n * @param {string} source Script tag src value\n * @param {boolean} isAsync Set script to async true or false\n */\nexports.loadScript = (source, isAsync = false) => {\n return new Promise((resolve) => {\n const script = document.createElement('script');\n script.src = source;\n script.async = isAsync;\n script.onload = () => {\n resolve();\n }\n document.body.append(script);\n });\n};\n/**\n * loadInput to load an input tag in DOM\n *\n * @param {string} referrerID Referrer ID value\n * @param {Array} formElement Form element\n */\nexports.loadInput = (referrerID, formElement) => {\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'referrerID');\n input.setAttribute('class', 'referrerID');\n input.setAttribute('value', referrerID);\n formElement.appendChild(input);\n};\n/**\n * Native querySelectorAll to find all the dom element with given selector.\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {nodeList | Array} Returns the target as a DOM node.\n */\nconst queryAll = exports.queryAll = (selector, parent = document) => {\n if (!parent) return null;\n return [].slice.call(parent.querySelectorAll(selector), 0);\n};\n\n/**\n * Returns the value(s) for the specified CSS rule(s), or all computed styles if no rule is specified\n *\n * @param {Element} element Target element\n * @param {string} rule CSS rule name (E.g. padding-top)\n * @return {string | Array | Object} Returns a string value, array of values, or styles object\n */\nconst getStyles = exports.getStyles = (element, ...rules) => {\n const styles = getComputedStyle(element);\n\n if (!rules.length) {\n return styles;\n } else if (rules.length === 1) {\n return styles[rules[0]];\n }\n return rules.map(rule => styles[rule]);\n};\n\n/**\n * Remove DOM element\n *\n * @param {string | Object} el Target element.\n */\nexports.remove = el => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.parentElement.removeChild(node);\n }\n } else {\n el.parentElement.removeChild(el);\n }\n};\n\n/**\n * Set attribute to single or multiple elements\n *\n * @param {string | Object} el Target element.\n * @param {string} attr attribute that need to be added.\n * @param {string | boolean} val value that need to be set for an attribute.\n */\nexports.setAttribute = (el, attr, val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.setAttribute(attr, val);\n }\n } else {\n el.setAttribute(attr, val);\n }\n};\n\n/**\n * Remove attribute to single or multiple elements\n *\n * @param {string | Object} el Target element.\n * @param {string} attr attribute that need to be removed.\n */\nexports.removeAttribute = (el, attr) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.removeAttribute(attr);\n }\n } else {\n el.removeAttribute(attr);\n }\n};\n\n/**\n * Adds class or classes to the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.addClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.add(...val);\n }\n } else {\n el.classList.add(...val);\n }\n};\n\n/**\n * Removes class or classes from the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.removeClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.remove(...val);\n }\n } else {\n el.classList.remove(...val);\n }\n};\n\n/**\n * Toggles class or classes to the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.toggleClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.toggle(...val);\n }\n } else {\n el.classList.toggle(...val);\n }\n};\n\n/**\n * Looks for availability of class or classes in the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n * @return {boolean} Returns availability of class in the target element.\n */\nexports.hasClass = (el, ...classes) => {\n if (!el) return false;\n\n const { classList } = el;\n\n return !!classList && classes.every(className => classList.contains(className));\n};\n\n/**\n * Throttle util to prevent repeatative callbacks\n *\n * @param {function} callback Callback function.\n * @param {number} limit Timeout upon which throttle callback need to be called.\n * fallback to document.\n * @param {function} waitCallback The callback to fire while the function is being throttled.\n * @return {function} Throttle closure function.\n */\nexports.throttle = (callback, limit = 250, waitCallback = function () { }) => {\n let isThrottling = false;\n\n return (...args) => {\n if (isThrottling) return waitCallback(...args);\n\n const returnValue = callback.apply(this, args);\n isThrottling = true;\n\n setTimeout(() => {\n isThrottling = false;\n }, limit);\n\n return returnValue;\n };\n};\n\n/**\n * Throttle util to prevent repeatative callbacks\n *\n * @param {function} callback - Callback function.\n * @param {number} minimumDelay - Delay upon which debounce callback need to be called.\n * @param {object} [options] - Additional options to control debouncing behavior\n * @param {function} [options.condition] - A function that will cause debouncing to be ignored for one cycle if it returns true\n * @param {function} [options.callback] - A function that will run without restriction, each time the debounced method is called\n * @return {function} Debounce closure function.\n */\nexports.debounce = (callback, minimumDelay = 250, options = {}) => {\n const { condition, callback: unrestrictedCallback } = options;\n let timer;\n\n return (...args) => {\n clearTimeout(timer);\n\n if (typeof unrestrictedCallback === 'function') unrestrictedCallback(...args);\n\n if (typeof condition === 'function' && condition(...args)) {\n callback(...args);\n } else {\n timer = setTimeout(() => {\n callback(...args);\n }, minimumDelay);\n }\n };\n};\n\nexports.toArray = (...args) => {\n const makeArray = target => {\n let newTarget;\n if (!Array.isArray(target)) {\n const array = [].slice.call(target);\n newTarget = array.length ? array : [target];\n }\n return newTarget;\n };\n return args.reduce((results, arg) => {\n return results.concat(makeArray(arg));\n }, []);\n};\n\n/**\n * Height util to get outer height of element including margins\n *\n * @param {string | Object} el target element\n * @return {string} height of element\n */\nexports.outerHeight = el => {\n const styles = getStyles(el);\n\n return el.offsetHeight + parseInt(styles.marginTop, 0) + parseInt(styles.marginBottom, 0);\n};\n\n/**\n * Determine if an element is in the viewport\n * (c) 2017 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} el The element\n * @return {boolean} Returns true if element is in the viewport\n */\nexports.isInViewportCheck = el => {\n const scroll = window.scrollY || window.pageYOffset;\n const boundsTop = el.getBoundingClientRect().top + scroll;\n\n const numberOfViewportToCheck = el.dataset.nextViewportLazyLoad ? 2 : 1;\n\n const viewport = {\n top: scroll,\n bottom: scroll + window.innerHeight * numberOfViewportToCheck\n };\n\n const bounds = {\n top: boundsTop,\n bottom: boundsTop + el.clientHeight\n };\n\n return (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) || (bounds.top <= viewport.bottom && bounds.top >= viewport.top);\n};\n\n/**\n * Determine if an element is in the viewport\n * (c) 2017 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} el The element\n * @return {boolean} Returns true if element is in the viewport\n */\nexports.isInViewport = el => {\n var rect = el.getBoundingClientRect();\n\n return rect.bottom > 0 &&\n rect.right > 0 &&\n rect.left < (window.innerWidth || document.documentElement.clientWidth) &&\n rect.top < (window.innerHeight || document.documentElement.clientHeight);\n};\n\n/**\n * Displays empty cart message\n * @param {string} message - Error message to display\n */\nexports.emptyCart = message => {\n const cartElements = queryAll('.cart');\n cartElements.forEach(cartElement => {\n cartElement.innerHTML = `

${message}

Continue Shopping
`;\n });\n};\n\n/**\n * Animates scrolling the page to the specified Y coordinate\n * @param {number} y - The Y coordinate to scroll to\n * @param {number} duration - The duration of the animation in milliseconds\n * @param {function} callback - The callback to run when the animation is complete\n * @returns {JQuery}\n */\nexports.scrollTo = (y, duration = 600, callback = function () { }) => $('html, body').scrollTo(y, duration, callback);\n\n/**\n * Finds the last element sibling on the same line as the specified element\n * @param {Element} element - The element to reference when looking for siblings\n * @returns {Element} - returns last element in the row\n */\nexports.getLastElementInRow = element => {\n if (!element.nextElementSibling) return element;\n\n const bottom = element.offsetTop + element.scrollHeight;\n let sibling;\n\n while ((sibling = element.nextElementSibling)) {\n if (sibling.offsetTop >= bottom) return sibling.previousElementSibling;\n element = sibling;\n }\n\n return element;\n};\n\n/**\n * Update url with query parameter to handle remember placement\n *\n * @param {DocumentFragment} fragment - A DocumentFragment object\n * @return {undefined}\n */\nexports.updateUrlQueryParam = fragment => {\n const queryParamsElement = queryFirst('.append-params', fragment);\n const permaLink = queryFirst('.permalink', fragment);\n\n if (permaLink) {\n window.history.pushState({ path: permaLink.value }, '', permaLink.value);\n } else if (queryParamsElement) {\n const newUrl = window.location.href.split('?')[0] + '?' + queryParamsElement.value;\n window.history.pushState({ path: newUrl }, '', newUrl);\n }\n};\n\n/**\n * This method returns character count\n * @param {HTMLElement} element - current element for which count has to be calculated\n * @return {number} character count\n */\nexports.getCharacterCount = function (element) {\n if (!element) {\n return 0;\n }\n return element.value.length;\n};\n\n/**\n * Waits for a specified element to exist.\n * @param {string} selector - The selector to match\n * @param {element} scope - The containing element to search within (default: document)\n * @param {number} timeout - How long (in milliseconds) to wait before rejecting the promise\n * @returns a Promise containing all matched elements\n */\nexports.waitForElement = (selector, scope = document, timeout = 0) =>\n new Promise((resolve, reject) => {\n const elements = queryAll(selector, scope);\n\n if (elements.length) return resolve(elements);\n\n const observer = new MutationObserver((mutations, self) => {\n const elements = queryAll(selector, scope);\n\n if (elements.length) {\n self.disconnect();\n resolve(elements);\n }\n });\n\n observer.observe(scope, { childList: true, subtree: true });\n\n if (timeout) {\n setTimeout(() => {\n observer.disconnect();\n reject('Timed out');\n }, timeout);\n }\n });\n\n/**\n * Binds an event listener to a callback using native methods and selector matching.\n * @param {element} element - The element to attach the listener to\n * @param {string|array} eventTypes - The type of events to listen for\n * @param {function} callback - The method to run when the event is fired\n * @param {object} [options={}] - Additional options to configure the event binding\n * @param {function} [options.eventCondition] - A function that returns a boolean indicating whether to proceed with the callback when the event is triggered\n * @param {string} [options.bindEngine='native'] - The engine to use when binding the event (native or jQuery)\n * @param {boolean} [options.once=false] - Whether to fire the event callback only once and then unbind\n */\nexports.bind = (element, eventTypes, callback, options = {}) => {\n const {\n eventCondition,\n bindEngine = 'native',\n once = false\n } = options;\n\n if (!Array.isArray(eventTypes)) eventTypes = eventTypes.split(',').map(type => type.trim());\n\n const useJQuery = (String(bindEngine).toLowerCase() === 'jquery');\n let { targetSelectors = [] } = options;\n\n if (typeof targetSelectors === 'string') {\n targetSelectors = [targetSelectors];\n }\n\n const handler = (e, extraData) => {\n let { target } = e;\n\n if (extraData instanceof Element || extraData === document) {\n target = extraData;\n } else if (extraData instanceof jQuery.Event) {\n target = extraData.target;\n } else {\n e.data = extraData;\n }\n\n let targetElement = target;\n\n if (Array.isArray(targetSelectors) && targetSelectors.length) {\n // If an array of selectors is provided, store a reference to the closest element that is matched\n targetElement = targetSelectors.reduce((result, selector) => {\n if (result) return result;\n const node = target.closest(selector);\n if (node) result = { node, selector };\n return result;\n }, false);\n }\n\n // We need a target element as context or we don't execute our callback\n if (!targetElement) return;\n\n const { node, selector } = targetElement;\n\n // Only execute the callback if the eventCondition allows\n if (typeof eventCondition === 'function' && !eventCondition(e, node || targetElement)) {\n return;\n }\n\n if (once) {\n if (useJQuery) {\n const $element = $(element);\n\n eventTypes.forEach(eventType => {\n $element.off(eventType, handler);\n });\n } else {\n eventTypes.forEach(eventType => {\n element.removeEventListener(eventType, handler, true);\n });\n }\n }\n\n if (node && selector) {\n callback(e, node, selector);\n } else {\n callback(e, targetElement);\n }\n };\n\n if (useJQuery) {\n const $element = $(element);\n\n eventTypes.forEach(eventType => {\n $element.on(eventType, handler);\n });\n } else {\n eventTypes.forEach(eventType => {\n element.addEventListener(eventType, handler, true);\n });\n }\n};\n\n/**\n * Function to get product data\n * @param {HTMLElement} element - Product container element or srcElement\n * @returns {ProductData} - Product data\n */\nexports.getProductData = element => {\n const { getNestedValue } = require('./util');\n const PREORDER_STATUS = 'PREORDER';\n\n element = element.closest('.color-attribute, .product-tile-swatch, .tile-img-link') || element;\n\n const container = element.closest('.product, .product-detail') || element.closest('.product-info') || element.closest('.cart-product-line-item') || element;\n const { dataset } = element;\n const { dataset: containerData } = container;\n const { monetatePid } = containerData;\n const isQuickview = !!container.closest('.product-quickview');\n\n let { productInfo, productInventory } = window;\n\n // Update the product data where possible\n let pid = containerData.wishlistId || containerData.pid || dataset.pid;\n let masterId = dataset.masterid || containerData.masterid;\n let productName = dataset.productName || containerData.productName;\n let productSize = dataset.productSize || containerData.productSize;\n let swatchName = dataset.swatchName || containerData.swatchName;\n let colorCode = dataset.attrValue;\n\n let variationGroupId;\n let originalPrice;\n let productPrice;\n let isPreorder;\n\n let productId = [dataset.productId, containerData.productId, pid].find(id => {\n if (id && ~id.indexOf('-')) {\n if (!variationGroupId) variationGroupId = id;\n\n return false;\n }\n\n return id;\n }) || '';\n\n // We need the color code, which is only available on the swatch\n if (!swatchName || !element.closest('.color-attribute, .product-tile-swatch')) {\n const colorEl = queryFirst('.color-attribute .swatch-circle.selected, .product-tile-swatch.selected', container) || queryFirst('.selected-swatch-name', container) || queryFirst('.tile-img-link', container);\n const swatchButton = (colorEl && colorEl.closest('.color-attribute'));\n\n swatchName = (colorEl && (colorEl.dataset.attrDisplayvalue || colorEl.dataset.swatchName || colorEl.textContent.trim())) || '';\n colorCode = (colorEl && colorEl.dataset.attrValue) || '';\n variationGroupId = variationGroupId || (swatchButton && swatchButton.dataset.productId) || '';\n }\n\n // Use the PID if the productId is missing or set to master\n if (!productId || (productId.length <= 6 && pid)) productId = pid;\n\n // We need the master ID to look up the product\n if (!masterId && monetatePid) {\n masterId = monetatePid.split('-')[0] || '';\n }\n\n if (!masterId) {\n if (pid && (~pid.indexOf('-') || pid.length <= 6)) {\n masterId = pid.split('-')[0];\n } else if (productId && ~productId.indexOf('-')) {\n masterId = productId.split('-')[0];\n } else {\n const tileEl = element.closest('.product-tile');\n masterId = ((tileEl && tileEl.dataset.monetatePid) || '').split('-')[0];\n }\n }\n\n // QuickView productInfo\n if (isQuickview) {\n productInfo = getNestedValue(window, 'quickviewProductInfo.productInfo');\n productInventory = getNestedValue(window, 'quickviewProductInfo.productInventory');\n }\n\n // Now we can check the productInfo\n if (productInfo && masterId && colorCode) {\n let productData;\n if (isQuickview) {\n productData = getNestedValue(productInfo, 'variants.{0}', colorCode);\n } else {\n productData = getNestedValue(productInfo, '{0}.variants.{1}', masterId, colorCode);\n }\n\n if (productData) {\n originalPrice = productData.standardPrice + '.00';\n productPrice = productData.price + '.00';\n variationGroupId = productData.groupId;\n isPreorder = productData.isPreorder;\n }\n }\n\n if (!productName) {\n const productNameEl = queryFirst('.product-name, .line-item-name', container);\n productName = (productNameEl && productNameEl.textContent.trim()) || '';\n }\n\n if (!productSize) {\n const productSizeEl = queryFirst('.size-btn.selected, .wishlist-item-attribute-size .wishlist-detail-value', container);\n productSize = (productSizeEl && (productSizeEl.dataset.valueId || productSizeEl.textContent.trim())) || '';\n }\n\n if (productSize && pid) {\n isPreorder = getNestedValue(productInventory, 'variants[{0}].availabilityStatus', pid) === PREORDER_STATUS;\n }\n\n if (!originalPrice) {\n const originalPriceEl = queryFirst('.price-section .ssPrice', container);\n originalPrice = ((originalPriceEl && originalPriceEl.value) || '').split('$').pop();\n }\n\n if (originalPrice && !~originalPrice.indexOf('.')) {\n originalPrice += '.00';\n }\n\n if (!productPrice) {\n const productPriceEl = queryFirst('.price-section .sales .ssSalesPrice', container);\n productPrice = ((productPriceEl && productPriceEl.value) || '').split('$').pop();\n }\n\n if (productPrice && !~productPrice.indexOf('.')) {\n productPrice += '.00';\n }\n\n if (!swatchName) {\n const productColorEl = queryFirst('.wishlist-item-attribute-color .wishlist-detail-value', container);\n swatchName = (productColorEl && productColorEl.textContent.trim()) || '';\n }\n\n // Sanity check\n if (masterId && masterId.length > 6) masterId = '';\n if (productId && (~productId.indexOf('-') || productId.length <= 6)) productId = '';\n if (variationGroupId && !~variationGroupId.indexOf('-')) variationGroupId = '';\n\n return {\n colorCode,\n masterId,\n originalPrice,\n productColor: swatchName,\n productId,\n productName,\n productPrice,\n productSize,\n variationGroupId,\n isPreorder\n };\n};\n\n/**\n * Check whether the device matches the specified breakpoint at a minimum (i.e. min-width)\n * @param {string} breakpoint - The breakpoint to match against (xs; sm; md; lg; xl)\n * @returns {boolean} - Whether the device matches the breakpoint\n */\nexports.matchesBreakpoint = breakpoint => breakpoint in breakpoints && window.matchMedia(`(min-width: ${breakpoints[breakpoint]}px)`).matches;\n\nexports.getCSRFToken = (scope = document.body) => {\n const token = scope.querySelector('.csrf-token');\n return (token && token.value) || '';\n};\n\n/**\n * Renders a string into a template and returns the DOM Fragment.\n * @param {string} html - the html content.\n * @returns {DocumentFragment} - The input string as a document fragment\n */\nexports.renderFragment = html => {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template.content;\n};\n\n/**\n * Gets all accessible cookies and creates a plain key/value object\n * @returns {Object} Plain object containing cookie names and values\n */\nexports.getCookieMap = () => document.cookie.split(';').reduce((result, keyValue) => {\n const [key, value] = keyValue.trim().split('=');\n result[key] = decodeURIComponent(value);\n return result;\n}, {});\n\n/**\n * Validating the date as per month\n */\nexports.validateDate = () => {\n let monthSelector = document.getElementById('birthdaymonth');\n let dateSelector = document.getElementById('birthdaydate');\n const { message } = dateSelector.dataset;\n /**\n * Validating date\n */\n function validateDateOption() {\n let m = monthSelector.value;\n let d = dateSelector.value;\n const mlength = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m];\n dateSelector.length = 0;\n const labelOption = new Option();\n labelOption.text = message;\n labelOption.value = '';\n dateSelector.add(labelOption);\n for (let i = 1; i <= mlength; i++) {\n let option = new Option();\n option.value = i;\n option.text = i;\n if (i.toString() === d) option.selected = true;\n dateSelector.add(option);\n }\n }\n monthSelector.addEventListener('change', validateDateOption);\n};\n\nexports.getStyles = getStyles;\nexports.queryAll = queryAll;\n","/**\n * Return the iso language code based on local of the site\n * @param {string} locale - current locale\n * @returns {string} - ISO code\n */\nexport function getISOCodeByLocale(locale) {\n return locale.replace('_', '-').toLowerCase();\n}\n\n/**\n * Checks if the email value entered is correct format\n * @param {string} email - email string to check if valid\n * @returns {boolean} Whether email is valid\n */\nexport function validateEmail(email) {\n var regex = /^[\\w.%+-]+@[\\w.-]+\\.[\\w]{2,6}$/;\n return regex.test(email);\n}\n\n/**\n * Safely gets nested object properties. Returns the value if found, undefined if not found.\n * @param {*} obj The parent object in which the property exists\n * @param {*} keyString String denoting where in the parent object your target property should exist\n * @param {...any} replaceValues Values in the keyString to replace -- reference in the keyString with a number encapsulated in {} (e.g. {0}, {1}, etc)\n * @return {Object} returns nested object properties\n */\nexport function getNestedValue(obj, keyString, ...replaceValues) {\n const keys = keyString.split(/\\[|\\]|\\./).filter(el => el !== '');\n return keys.reduce((o, i) => (o || {})[/\\{\\d+\\}/.test(i) ? replaceValues[i.split(/\\{|\\}/)[1]] : i], obj);\n}","'use strict';\n\nconst isFitPredictorEnabled = !!document.getElementById('fitPredictorEnabled');\nconst noop = function () { };\n\n/**\n * Native querySelector to find first element in the dom with given selector\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {Object} returns the target as a DOM node\n */\nconst queryFirst = (selector, parent = document) => {\n if (!parent) return null;\n return parent.querySelector(selector);\n};\n\n/**\n * Native querySelectorAll to find all the dom element with given selector.\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {nodeList | Array} Returns the target as a DOM node.\n */\nconst queryAll = (selector, parent = document) => {\n if (!parent) return null;\n return [].slice.call(parent.querySelectorAll(selector), 0);\n};\n\n/**\n * Looks for availability of class or classes in the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n * @return {boolean} Returns availability of class in the target element.\n */\nconst hasClass = (el, ...classes) => {\n const { classList } = el;\n for (let c = 0, n = classes.length; c < n; c++) {\n if (!classList.contains(classes[c])) return false;\n }\n return true;\n};\n\n/**\n * Wraps a method to set up feature flagging\n * \n * @param {function} method The method to run\n * @return {function} Returns the method passed in if the feature is enabled, otherwise returns a noop method\n */\nconst featureSwitch = method => (isFitPredictorEnabled && method) || noop;\n\n/**\n * This function sets the site context for Secret Sauce based on the channel type\n */\nfunction siteContext() {\n const deviceWidth = window.screen.width;\n let channelValue = 'desktop';\n if (deviceWidth >= 768 && deviceWidth < 1024) {\n channelValue = 'tablet';\n } else if (deviceWidth < 768) {\n channelValue = 'mobile';\n }\n ssp('set', 'site', {\n layout: channelValue,\n currency: 'USD',\n language: 'en',\n market: 'US',\n shippingCountry: 'US'\n });\n}\n\n/**\n * This function sets the customer context for Secret Sauce\n */\nfunction custContext() {\n const custID = document.getElementById('ssCustomer').value;\n const email = document.getElementById('ssEmail').value;\n if (custID && custID !== '') {\n ssp('set', 'user', {\n userId: custID,\n emailHash: email\n });\n }\n}\n\n/**\n * This function sets the page context for Secret Sauce based on the product page type\n * @param {string | Object} bc breadcrumb value.\n * @param {string | Object} pt product page type.\n */\nfunction pageContext(pt) {\n ssp('set', 'page', {\n type: pt // 'cat', 'pdp', 'pdp-set', 'quickview'\n });\n}\n\n/**\n * This function retrieves the price of the product from price container for Secret Sauce\n * @param {Object} container product container\n * @param {string | Object} priceContainerId price container Id.\n * @return {float} returns price\n */\nfunction getPriceFromContainer(priceContainerId, container) {\n const price = queryFirst(priceContainerId, container);\n if (price && price.value) {\n return parseFloat(price.value.replace('$', ''));\n }\n return 0.0;\n}\n\n/**\n * This function retrieves the standard price of the product for Secret Sauce\n * @param {Object} container product continer\n * @return {float} returns standard price\n */\nfunction getPrice(container) {\n return getPriceFromContainer('.ssPrice', container);\n}\n\n/**\n * This function sets the standard price of the product for Secret Sauce\n * @param {float} newPrice standard price\n * @param {Object} container product container\n */\nfunction setPrice(newPrice, container) {\n const priceElement = queryFirst('.ssPrice', container);\n if (priceElement) {\n priceElement.value = newPrice;\n }\n}\n\n/**\n * This function retrieves the sale price of the product for Secret Sauce\n * @param {Object} container product container\n * @return {float} returns sale price\n */\nfunction getSalePrice(container) {\n return getPriceFromContainer('.ssSalesPrice', container);\n}\n\n/**\n * This function sets the sale price of the product for Secret Sauce\n * @param {float} newSalePrice sale price\n * @param {Object} container product container\n */\nfunction setSalePrice(newSalePrice, container) {\n const salesPriceElement = queryFirst('.ssSalesPrice', container);\n if (salesPriceElement) {\n salesPriceElement.value = newSalePrice;\n }\n}\n\n/**\n * This function retrieves the selected color of the product for Secret Sauce\n * @param {Object} container product container\n * @return {string} returns selected product color\n */\nfunction getSelectedColor(container) {\n const colorElement = queryFirst('.ssColor', container);\n return (colorElement && colorElement.value) ? colorElement.value.replace(/\\s*\\n\\s*/g, '') : 'unknown';\n}\n\n/**\n * This function sets the selected color of the product for Secret Sauce\n * @param {string} newColor selected product color\n * @param {Object} container product container\n */\nfunction setSelectedColor(newColor, container) {\n const colorElement = queryFirst('.ssColor', container);\n if (colorElement) {\n colorElement.value = newColor;\n }\n}\n\n/**\n * This function retrieves the selected size of the product for Secret Sauce\n * @param {Object} container product container\n * @return {string} returns selected product size\n */\nfunction getSelectedSize(container) {\n const sizeElement = queryFirst('.ssSize', container);\n return (sizeElement && sizeElement.value != 'unknown') ? sizeElement.value : '';\n}\n\n/**\n * This function sets the selected size of the product for Secret Sauce\n * @param {string} newSize selected product size\n * @param {Object} container product container\n */\nfunction setSelectedSize(newSize, container) {\n const sizeElement = queryFirst('.ssSize', container);\n if (sizeElement) {\n sizeElement.value = newSize;\n }\n}\n\n/**\n * This function updates product data for Secret Sauce\n * @param {string} color selected product color\n * @param {string} size selected product size\n * @param {float} price selected product standard price\n * @param {float} salePrice selected product sale price\n * @param {Object} container product container\n */\nfunction updateProductData(color, size, price, salePrice, container) {\n if (getSelectedColor(container) !== color) setSelectedColor(color, container);\n if (getSelectedSize(container) !== size) setSelectedSize(size, container);\n if (getPrice(container) !== price) setPrice(price, container);\n if (getSalePrice(container) !== salePrice) setSalePrice(salePrice, container);\n}\n\n/**\n * This function retrieves the available sizes for the product swatch selected\n * @param {Object} container product container\n * @return {Array} returns sizes list of the product\n */\nfunction getSizes(container) {\n let sizeArray = [];\n if (hasClass(container, 'pdp-container')) {\n queryAll('.scrollable-product-item .size-container .size-list .size-btn', container).forEach((element) => {\n const size = element.dataset.attrValue;\n if (size !== '' && size !== undefined) {\n sizeArray.push(size);\n }\n });\n \n } else {\n queryAll('.size-container .size-list .size-btn', container).forEach((element) => {\n const size = element.dataset.attrValue;\n if (size !== '' && size !== undefined) {\n sizeArray.push(size);\n }\n });\n }\n \n return sizeArray;\n}\n\n/**\n * This function retrieves the variant ID of the selected product\n * @return {string} returns product ID\n */\nfunction getVariant() {\n return $('.product-detail').attr('data-masterid');\n}\n\n/**\n * This function enables the Fit Predictor link from Secret Sauce\n */\nfunction startFP() {\n ssp('start', 'fitpredictor');\n}\n\n/**\n * This function enables the Style Finder link from Secret Sauce\n */\nfunction startSF() {\n ssp('show', 'stylefinder');\n}\n\n/**\n * This function enables the Outfit Maker link from Secret Sauce\n */\nfunction startOM() {\n ssp('show', 'outfitmaker');\n}\n\n/**\n * This function retrieves the available sizes that are in stock for the product swatch selected\n * @param {Object} container product container\n * @return {Array} returns sizes list of the product\n */\nfunction getAvailableSizes(container) {\n let sizeArray = [];\n if (hasClass(container, 'pdp-container')) {\n queryAll('.scrollable-product-item .size-container .size-list .size-btn', container).forEach((element) => {\n let size = element.dataset.attrValue;\n if (size !== '') {\n if (!hasClass(element, 'not-available')) {\n sizeArray.push(size);\n }\n }\n }); \n } else {\n queryAll('.size-container .size-list .size-btn', container).forEach((element) => {\n let size = element.dataset.attrValue;\n if (size !== '') {\n if (!hasClass(element, 'not-available')) {\n sizeArray.push(size);\n }\n }\n });\n }\n return sizeArray;\n}\n\n\n/**\n * This function extracts the selected Fit\n */\nfunction getFitName() {\n const selectedFitElement = document.querySelector('.non-color-container .non-color-list.fitsize-swatches .fit-product-type.selected');\n let fitName = '';\n if (selectedFitElement && selectedFitElement.hasAttribute('data-fitsizeswatch-name')) {\n const fitSwatchName = selectedFitElement.getAttribute('data-fitsizeswatch-name');\n // Get the data attribute value\n if (fitSwatchName === 'Standard') {\n fitName = 'regular';\n } else if (fitSwatchName === 'Plus') {\n fitName = 'plus';\n } else if (fitSwatchName === 'Petite') {\n fitName = 'petite';\n }\n }\n return fitName;\n}\n\n/**\n * This function updates the product context for Secret Sauce\n * @param {Object} $container product container\n * @param {string} context secret sauce initiation context\n */\nfunction updateProductSetData($container, context) {\n if ($container && $container.length > 0) {\n let sizes = [];\n let availableSizes = [];\n $container.find('.scrollable-product-item .size-container .size-list .size-btn').each(function () {\n let size = $(this).attr('data-attr-value');\n if (size && size !== '') {\n sizes.push(size);\n if (!$(this).hasClass('not-available')) {\n availableSizes.push(size);\n }\n }\n });\n const productId = $container.data('masterid').toString();\n const price = $container.find('.ssPrice').first().val();\n const salePrice = $container.find('.ssSalesPrice').first().val();\n const color = $container.find('.ssColor').first().val();\n const size = $container.find('.ssSize').first().val();\n const selectedFitName = getFitName();\n ssp('set', 'product', {\n productId,\n sizeType: selectedFitName,\n price,\n salePrice,\n color,\n sizes: sizes,\n availableSizes: availableSizes,\n size\n });\n if (context && context === 'variationUpdate') {\n startFP();\n }\n }\n}\n\n\n/**\n * This function sets the product context for Secret Sauce\n * @param {string} context secret sauce initiation context\n */\nfunction productContext(context, container) {\n // skip call for gift cards\n const $giftCardAmount = $('input[name=\"giftcert_amount\"]');\n if ($giftCardAmount && $giftCardAmount.length > 0) {\n // If we are on gift card, do not fire secretsauce\n return;\n }\n\n const isMaster = 'true';\n const selectedFitName = getFitName();\n if (context === 'load') {\n const pid = container[0].dataset.masterid;\n const price = getPrice(container[0]);\n const salePrice = getSalePrice(container[0]);\n let useSale = true;\n if (price === salePrice) {\n useSale = false;\n }\n if (container[0].closest('.set-items')) {\n $('.set-items .product-detail.product-wrapper').each(function () {\n let $container = $(this);\n updateProductSetData($container, context);\n });\n return;\n }\n\n if (isMaster === 'true') {\n if (useSale) {\n ssp('set', 'product', {\n productId: pid,\n sizeType: selectedFitName,\n price,\n salePrice,\n color: getSelectedColor(container[0]),\n sizes: getSizes(container[0]),\n availableSizes: getAvailableSizes(container[0])\n });\n } else {\n ssp('set', 'product', {\n productId: pid,\n sizeType: selectedFitName,\n price,\n color: getSelectedColor(container[0]),\n sizes: getSizes(container[0]),\n availableSizes: getAvailableSizes(container[0])\n });\n }\n } else if (useSale) {\n ssp('set', 'product', {\n productId: $('#ssMasterPID').val(),\n variantId: getVariant(),\n sizeType: selectedFitName,\n price,\n salePrice,\n color: getSelectedColor(container[0]),\n sizes: getSizes(container[0]),\n availableSizes: getAvailableSizes(container[0]),\n size: getSelectedSize(container[0])\n });\n } else {\n ssp('set', 'product', {\n productId: $('#ssMasterPID').val(),\n variantId: getVariant(),\n sizeType: selectedFitName,\n price,\n color: getSelectedColor(container[0]),\n sizes: getSizes(container[0]),\n availableSizes: getAvailableSizes(container[0]),\n size: getSelectedSize(container[0])\n });\n }\n }\n if (context === 'color') {\n const pid = container.dataset.masterid;\n const price = getPrice(container);\n const salePrice = getSalePrice(container);\n let useSale = true;\n if (price === salePrice) {\n useSale = false;\n }\n if (isMaster === 'true') {\n if (useSale) {\n ssp('set', 'product', {\n productId: pid,\n color: getSelectedColor(container),\n sizes: getSizes(container),\n sizeType: selectedFitName,\n availableSizes: getAvailableSizes(container),\n price,\n salePrice\n });\n } else {\n ssp('set', 'product', {\n productId: pid,\n color: getSelectedColor(container),\n sizes: getSizes(container),\n sizeType: selectedFitName,\n availableSizes: getAvailableSizes(container),\n price\n });\n }\n } else if (useSale) {\n ssp('set', 'product', {\n productId: $('#ssMasterPID').val(),\n variantId: getVariant(),\n color: getSelectedColor(container),\n sizes: getSizes(container),\n availableSizes: getAvailableSizes(container),\n price,\n salePrice\n });\n } else {\n ssp('set', 'product', {\n productId: $('#ssMasterPID').val(),\n variantId: getVariant(),\n color: getSelectedColor(container),\n sizes: getSizes(container),\n availableSizes: getAvailableSizes(container),\n price\n });\n }\n }\n if (context === 'size') {\n const pid = container.dataset.masterid;\n const price = getPrice(container);\n if (isMaster === 'true') {\n ssp('set', 'product', {\n productId: pid,\n color: getSelectedColor(container),\n sizes: getSizes(container),\n availableSizes: getAvailableSizes(container),\n size: getSelectedSize(container),\n price\n });\n } else {\n ssp('set', 'product', {\n productId: $('#ssMasterPID').val(),\n variantId: getVariant(),\n color: getSelectedColor(container),\n sizes: getSizes(container),\n availableSizes: getAvailableSizes(container),\n size: getSelectedSize(container),\n price\n });\n }\n }\n}\n\n/**\n * This function initiates Secret Sauce based on product's color change\n * @param {Object} container product container\n */\nfunction handleColor(container) {\n const attribute = queryFirst('.ssColor', container);\n if (attribute && attribute.value !== null || 'unknown') {\n productContext('color', container);\n }\n}\n\n/**\n * This function initiates Secret Sauce based on product's size change\n * @param {Object} container product container\n */\nfunction handleSize(container) {\n const attribute = queryFirst('.ssSize', container);\n if (attribute && attribute.value !== 'unknown' || null) {\n productContext('size', container);\n }\n}\n\n/**\n * This function returns page bread crumb\n * @return {string} returns page bread crumb\n */\nfunction getCrumbs() {\n let crumb = '';\n $('.breadcrumb .breadcrumb-item').each(function () {\n if (crumb === '') {\n crumb = $(this).html;\n } else {\n crumb = crumb + ' > ' + $(this).html;\n }\n });\n return crumb;\n}\n\n/**\n * This function fires at the beginning\n * To prevent looping of the change event, which fires an ajax call which reloads everything, then concludes\n * with calling the predictor again, we need to setup some way to track, hence the use of a trigger.\n * @param {Object} container product container\n */\nfunction prediction(container) {\n // The subscription seems to only allow itself to be set once.\n // i.e. future subscription handlers are discarded.\n // References to container will revert to the initial subscription,\n // which won't always be what we were looking for.\n // So I'm attaching the container to the function itself.\n prediction.container = container;\n\n ssp('subscribe', 'prediction', function (event) {\n queryAll('.product-detail.product-wrapper[data-masterid=\"' + event.productId + '\"]').forEach(productContainer => {\n //check for an instance of the trigger\n const trigger = productContainer.getAttribute('data-sstrigger-first-time');\n if (trigger === 'true' && event.service === 'fitpredictor' && event.size) {\n const sizeOption = $('.size-container .size-list .size-btn[data-attr-value=\"' + event.size + '\"]', productContainer);\n if (sizeOption) {\n sizeOption.trigger('click');\n }\n productContainer.setAttribute('data-sstrigger-first-time', 'false');\n $('body').trigger('fitPredictorSizeSelected', productContainer);\n }\n });\n });\n}\n\n/**\n * This function sets Add to Cart context for Secret Sauce\n * @param {Object} container product container\n * @return {boolean} returns status if or not add to cart context is set for secret sauce\n */\nfunction ssAddToCart(container) {\n if (ssp) {\n const { pid, masterid } = container.dataset;\n ssp('track', 'addVariantToCart', {\n variantId: pid,\n productId: masterid,\n quantity: 1\n });\n return true;\n }\n return false;\n}\n\n/**\n * This function sets flag for Secret Sauce initiation\n * @param {Object} container product's container\n */\nfunction setupTrigger(container) {\n container.attr('data-sstrigger-first-time', 'true');\n}\n\n/**\n * This function sets all the context for Secret Sauce initiation and triggers Secret Sauce services\n * @param {Object} container product's container\n */\nfunction initializeDom(container) {\n siteContext();\n custContext();\n let pt = 'pdp';\n if (container[0].closest('.search-results-container')) {\n pt = 'cat';\n } else if (container[0].closest('.product-set-detail')) {\n pt = 'pdp-set';\n } else if (hasClass(container[0], 'product-quickview')) {\n pt = 'quickview';\n }\n pageContext(pt);\n productContext('load', container);\n startFP();\n setupTrigger(container);\n prediction(container);\n}\n\n/**\n * This function initiates Secret Sauce\n * @param {Object} container product's container\n */\nfunction sauce(container) {\n initializeDom(container);\n}\n\nmodule.exports = Object.entries({\n handleColor,\n handleSize,\n prediction,\n sauce,\n ssAddToCart,\n startFP,\n startOM,\n startSF,\n updateProductData,\n updateProductSetData\n}).reduce((exported, [alias, method]) => {\n exported[alias] = featureSwitch(method);\n return exported;\n}, {});\n","var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar NumeralFormatter = function (numeralDecimalMark,\n numeralIntegerScale,\n numeralDecimalScale,\n numeralThousandsGroupStyle,\n numeralPositiveOnly,\n stripLeadingZeroes,\n prefix,\n signBeforePrefix,\n tailPrefix,\n delimiter) {\n var owner = this;\n\n owner.numeralDecimalMark = numeralDecimalMark || '.';\n owner.numeralIntegerScale = numeralIntegerScale > 0 ? numeralIntegerScale : 0;\n owner.numeralDecimalScale = numeralDecimalScale >= 0 ? numeralDecimalScale : 2;\n owner.numeralThousandsGroupStyle = numeralThousandsGroupStyle || NumeralFormatter.groupStyle.thousand;\n owner.numeralPositiveOnly = !!numeralPositiveOnly;\n owner.stripLeadingZeroes = stripLeadingZeroes !== false;\n owner.prefix = (prefix || prefix === '') ? prefix : '';\n owner.signBeforePrefix = !!signBeforePrefix;\n owner.tailPrefix = !!tailPrefix;\n owner.delimiter = (delimiter || delimiter === '') ? delimiter : ',';\n owner.delimiterRE = delimiter ? new RegExp('\\\\' + delimiter, 'g') : '';\n};\n\nNumeralFormatter.groupStyle = {\n thousand: 'thousand',\n lakh: 'lakh',\n wan: 'wan',\n none: 'none' \n};\n\nNumeralFormatter.prototype = {\n getRawValue: function (value) {\n return value.replace(this.delimiterRE, '').replace(this.numeralDecimalMark, '.');\n },\n\n format: function (value) {\n var owner = this, parts, partSign, partSignAndPrefix, partInteger, partDecimal = '';\n\n // strip alphabet letters\n value = value.replace(/[A-Za-z]/g, '')\n // replace the first decimal mark with reserved placeholder\n .replace(owner.numeralDecimalMark, 'M')\n\n // strip non numeric letters except minus and \"M\"\n // this is to ensure prefix has been stripped\n .replace(/[^\\dM-]/g, '')\n\n // replace the leading minus with reserved placeholder\n .replace(/^\\-/, 'N')\n\n // strip the other minus sign (if present)\n .replace(/\\-/g, '')\n\n // replace the minus sign (if present)\n .replace('N', owner.numeralPositiveOnly ? '' : '-')\n\n // replace decimal mark\n .replace('M', owner.numeralDecimalMark);\n\n // strip any leading zeros\n if (owner.stripLeadingZeroes) {\n value = value.replace(/^(-)?0+(?=\\d)/, '$1');\n }\n\n partSign = value.slice(0, 1) === '-' ? '-' : '';\n if (typeof owner.prefix != 'undefined') {\n if (owner.signBeforePrefix) {\n partSignAndPrefix = partSign + owner.prefix;\n } else {\n partSignAndPrefix = owner.prefix + partSign;\n }\n } else {\n partSignAndPrefix = partSign;\n }\n \n partInteger = value;\n\n if (value.indexOf(owner.numeralDecimalMark) >= 0) {\n parts = value.split(owner.numeralDecimalMark);\n partInteger = parts[0];\n partDecimal = owner.numeralDecimalMark + parts[1].slice(0, owner.numeralDecimalScale);\n }\n\n if(partSign === '-') {\n partInteger = partInteger.slice(1);\n }\n\n if (owner.numeralIntegerScale > 0) {\n partInteger = partInteger.slice(0, owner.numeralIntegerScale);\n }\n\n switch (owner.numeralThousandsGroupStyle) {\n case NumeralFormatter.groupStyle.lakh:\n partInteger = partInteger.replace(/(\\d)(?=(\\d\\d)+\\d$)/g, '$1' + owner.delimiter);\n\n break;\n\n case NumeralFormatter.groupStyle.wan:\n partInteger = partInteger.replace(/(\\d)(?=(\\d{4})+$)/g, '$1' + owner.delimiter);\n\n break;\n\n case NumeralFormatter.groupStyle.thousand:\n partInteger = partInteger.replace(/(\\d)(?=(\\d{3})+$)/g, '$1' + owner.delimiter);\n\n break;\n }\n\n if (owner.tailPrefix) {\n return partSign + partInteger.toString() + (owner.numeralDecimalScale > 0 ? partDecimal.toString() : '') + owner.prefix;\n }\n\n return partSignAndPrefix + partInteger.toString() + (owner.numeralDecimalScale > 0 ? partDecimal.toString() : '');\n }\n};\n\nvar NumeralFormatter_1 = NumeralFormatter;\n\nvar DateFormatter = function (datePattern, dateMin, dateMax) {\n var owner = this;\n\n owner.date = [];\n owner.blocks = [];\n owner.datePattern = datePattern;\n owner.dateMin = dateMin\n .split('-')\n .reverse()\n .map(function(x) {\n return parseInt(x, 10);\n });\n if (owner.dateMin.length === 2) owner.dateMin.unshift(0);\n\n owner.dateMax = dateMax\n .split('-')\n .reverse()\n .map(function(x) {\n return parseInt(x, 10);\n });\n if (owner.dateMax.length === 2) owner.dateMax.unshift(0);\n \n owner.initBlocks();\n};\n\nDateFormatter.prototype = {\n initBlocks: function () {\n var owner = this;\n owner.datePattern.forEach(function (value) {\n if (value === 'Y') {\n owner.blocks.push(4);\n } else {\n owner.blocks.push(2);\n }\n });\n },\n\n getISOFormatDate: function () {\n var owner = this,\n date = owner.date;\n\n return date[2] ? (\n date[2] + '-' + owner.addLeadingZero(date[1]) + '-' + owner.addLeadingZero(date[0])\n ) : '';\n },\n\n getBlocks: function () {\n return this.blocks;\n },\n\n getValidatedDate: function (value) {\n var owner = this, result = '';\n\n value = value.replace(/[^\\d]/g, '');\n\n owner.blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n sub0 = sub.slice(0, 1),\n rest = value.slice(length);\n\n switch (owner.datePattern[index]) {\n case 'd':\n if (sub === '00') {\n sub = '01';\n } else if (parseInt(sub0, 10) > 3) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > 31) {\n sub = '31';\n }\n\n break;\n\n case 'm':\n if (sub === '00') {\n sub = '01';\n } else if (parseInt(sub0, 10) > 1) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > 12) {\n sub = '12';\n }\n\n break;\n }\n\n result += sub;\n\n // update remaining string\n value = rest;\n }\n });\n\n return this.getFixedDateString(result);\n },\n\n getFixedDateString: function (value) {\n var owner = this, datePattern = owner.datePattern, date = [],\n dayIndex = 0, monthIndex = 0, yearIndex = 0,\n dayStartIndex = 0, monthStartIndex = 0, yearStartIndex = 0,\n day, month, year, fullYearDone = false;\n\n // mm-dd || dd-mm\n if (value.length === 4 && datePattern[0].toLowerCase() !== 'y' && datePattern[1].toLowerCase() !== 'y') {\n dayStartIndex = datePattern[0] === 'd' ? 0 : 2;\n monthStartIndex = 2 - dayStartIndex;\n day = parseInt(value.slice(dayStartIndex, dayStartIndex + 2), 10);\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n\n date = this.getFixedDate(day, month, 0);\n }\n\n // yyyy-mm-dd || yyyy-dd-mm || mm-dd-yyyy || dd-mm-yyyy || dd-yyyy-mm || mm-yyyy-dd\n if (value.length === 8) {\n datePattern.forEach(function (type, index) {\n switch (type) {\n case 'd':\n dayIndex = index;\n break;\n case 'm':\n monthIndex = index;\n break;\n default:\n yearIndex = index;\n break;\n }\n });\n\n yearStartIndex = yearIndex * 2;\n dayStartIndex = (dayIndex <= yearIndex) ? dayIndex * 2 : (dayIndex * 2 + 2);\n monthStartIndex = (monthIndex <= yearIndex) ? monthIndex * 2 : (monthIndex * 2 + 2);\n\n day = parseInt(value.slice(dayStartIndex, dayStartIndex + 2), 10);\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 4), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 4).length === 4;\n\n date = this.getFixedDate(day, month, year);\n }\n\n // mm-yy || yy-mm\n if (value.length === 4 && (datePattern[0] === 'y' || datePattern[1] === 'y')) {\n monthStartIndex = datePattern[0] === 'm' ? 0 : 2;\n yearStartIndex = 2 - monthStartIndex;\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 2), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 2).length === 2;\n\n date = [0, month, year];\n }\n\n // mm-yyyy || yyyy-mm\n if (value.length === 6 && (datePattern[0] === 'Y' || datePattern[1] === 'Y')) {\n monthStartIndex = datePattern[0] === 'm' ? 0 : 4;\n yearStartIndex = 2 - 0.5 * monthStartIndex;\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 4), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 4).length === 4;\n\n date = [0, month, year];\n }\n\n date = owner.getRangeFixedDate(date);\n owner.date = date;\n\n var result = date.length === 0 ? value : datePattern.reduce(function (previous, current) {\n switch (current) {\n case 'd':\n return previous + (date[0] === 0 ? '' : owner.addLeadingZero(date[0]));\n case 'm':\n return previous + (date[1] === 0 ? '' : owner.addLeadingZero(date[1]));\n case 'y':\n return previous + (fullYearDone ? owner.addLeadingZeroForYear(date[2], false) : '');\n case 'Y':\n return previous + (fullYearDone ? owner.addLeadingZeroForYear(date[2], true) : '');\n }\n }, '');\n\n return result;\n },\n\n getRangeFixedDate: function (date) {\n var owner = this,\n datePattern = owner.datePattern,\n dateMin = owner.dateMin || [],\n dateMax = owner.dateMax || [];\n\n if (!date.length || (dateMin.length < 3 && dateMax.length < 3)) return date;\n\n if (\n datePattern.find(function(x) {\n return x.toLowerCase() === 'y';\n }) &&\n date[2] === 0\n ) return date;\n\n if (dateMax.length && (dateMax[2] < date[2] || (\n dateMax[2] === date[2] && (dateMax[1] < date[1] || (\n dateMax[1] === date[1] && dateMax[0] < date[0]\n ))\n ))) return dateMax;\n\n if (dateMin.length && (dateMin[2] > date[2] || (\n dateMin[2] === date[2] && (dateMin[1] > date[1] || (\n dateMin[1] === date[1] && dateMin[0] > date[0]\n ))\n ))) return dateMin;\n\n return date;\n },\n\n getFixedDate: function (day, month, year) {\n day = Math.min(day, 31);\n month = Math.min(month, 12);\n year = parseInt((year || 0), 10);\n\n if ((month < 7 && month % 2 === 0) || (month > 8 && month % 2 === 1)) {\n day = Math.min(day, month === 2 ? (this.isLeapYear(year) ? 29 : 28) : 30);\n }\n\n return [day, month, year];\n },\n\n isLeapYear: function (year) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n },\n\n addLeadingZero: function (number) {\n return (number < 10 ? '0' : '') + number;\n },\n\n addLeadingZeroForYear: function (number, fullYearMode) {\n if (fullYearMode) {\n return (number < 10 ? '000' : (number < 100 ? '00' : (number < 1000 ? '0' : ''))) + number;\n }\n\n return (number < 10 ? '0' : '') + number;\n }\n};\n\nvar DateFormatter_1 = DateFormatter;\n\nvar TimeFormatter = function (timePattern, timeFormat) {\n var owner = this;\n\n owner.time = [];\n owner.blocks = [];\n owner.timePattern = timePattern;\n owner.timeFormat = timeFormat;\n owner.initBlocks();\n};\n\nTimeFormatter.prototype = {\n initBlocks: function () {\n var owner = this;\n owner.timePattern.forEach(function () {\n owner.blocks.push(2);\n });\n },\n\n getISOFormatTime: function () {\n var owner = this,\n time = owner.time;\n\n return time[2] ? (\n owner.addLeadingZero(time[0]) + ':' + owner.addLeadingZero(time[1]) + ':' + owner.addLeadingZero(time[2])\n ) : '';\n },\n\n getBlocks: function () {\n return this.blocks;\n },\n\n getTimeFormatOptions: function () {\n var owner = this;\n if (String(owner.timeFormat) === '12') {\n return {\n maxHourFirstDigit: 1,\n maxHours: 12,\n maxMinutesFirstDigit: 5,\n maxMinutes: 60\n };\n }\n\n return {\n maxHourFirstDigit: 2,\n maxHours: 23,\n maxMinutesFirstDigit: 5,\n maxMinutes: 60\n };\n },\n\n getValidatedTime: function (value) {\n var owner = this, result = '';\n\n value = value.replace(/[^\\d]/g, '');\n\n var timeFormatOptions = owner.getTimeFormatOptions();\n\n owner.blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n sub0 = sub.slice(0, 1),\n rest = value.slice(length);\n\n switch (owner.timePattern[index]) {\n\n case 'h':\n if (parseInt(sub0, 10) > timeFormatOptions.maxHourFirstDigit) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > timeFormatOptions.maxHours) {\n sub = timeFormatOptions.maxHours + '';\n }\n\n break;\n\n case 'm':\n case 's':\n if (parseInt(sub0, 10) > timeFormatOptions.maxMinutesFirstDigit) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > timeFormatOptions.maxMinutes) {\n sub = timeFormatOptions.maxMinutes + '';\n }\n break;\n }\n\n result += sub;\n\n // update remaining string\n value = rest;\n }\n });\n\n return this.getFixedTimeString(result);\n },\n\n getFixedTimeString: function (value) {\n var owner = this, timePattern = owner.timePattern, time = [],\n secondIndex = 0, minuteIndex = 0, hourIndex = 0,\n secondStartIndex = 0, minuteStartIndex = 0, hourStartIndex = 0,\n second, minute, hour;\n\n if (value.length === 6) {\n timePattern.forEach(function (type, index) {\n switch (type) {\n case 's':\n secondIndex = index * 2;\n break;\n case 'm':\n minuteIndex = index * 2;\n break;\n case 'h':\n hourIndex = index * 2;\n break;\n }\n });\n\n hourStartIndex = hourIndex;\n minuteStartIndex = minuteIndex;\n secondStartIndex = secondIndex;\n\n second = parseInt(value.slice(secondStartIndex, secondStartIndex + 2), 10);\n minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);\n hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);\n\n time = this.getFixedTime(hour, minute, second);\n }\n\n if (value.length === 4 && owner.timePattern.indexOf('s') < 0) {\n timePattern.forEach(function (type, index) {\n switch (type) {\n case 'm':\n minuteIndex = index * 2;\n break;\n case 'h':\n hourIndex = index * 2;\n break;\n }\n });\n\n hourStartIndex = hourIndex;\n minuteStartIndex = minuteIndex;\n\n second = 0;\n minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);\n hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);\n\n time = this.getFixedTime(hour, minute, second);\n }\n\n owner.time = time;\n\n return time.length === 0 ? value : timePattern.reduce(function (previous, current) {\n switch (current) {\n case 's':\n return previous + owner.addLeadingZero(time[2]);\n case 'm':\n return previous + owner.addLeadingZero(time[1]);\n case 'h':\n return previous + owner.addLeadingZero(time[0]);\n }\n }, '');\n },\n\n getFixedTime: function (hour, minute, second) {\n second = Math.min(parseInt(second || 0, 10), 60);\n minute = Math.min(minute, 60);\n hour = Math.min(hour, 60);\n\n return [hour, minute, second];\n },\n\n addLeadingZero: function (number) {\n return (number < 10 ? '0' : '') + number;\n }\n};\n\nvar TimeFormatter_1 = TimeFormatter;\n\nvar PhoneFormatter = function (formatter, delimiter) {\n var owner = this;\n\n owner.delimiter = (delimiter || delimiter === '') ? delimiter : ' ';\n owner.delimiterRE = delimiter ? new RegExp('\\\\' + delimiter, 'g') : '';\n\n owner.formatter = formatter;\n};\n\nPhoneFormatter.prototype = {\n setFormatter: function (formatter) {\n this.formatter = formatter;\n },\n\n format: function (phoneNumber) {\n var owner = this;\n\n owner.formatter.clear();\n\n // only keep number and +\n phoneNumber = phoneNumber.replace(/[^\\d+]/g, '');\n\n // strip non-leading +\n phoneNumber = phoneNumber.replace(/^\\+/, 'B').replace(/\\+/g, '').replace('B', '+');\n\n // strip delimiter\n phoneNumber = phoneNumber.replace(owner.delimiterRE, '');\n\n var result = '', current, validated = false;\n\n for (var i = 0, iMax = phoneNumber.length; i < iMax; i++) {\n current = owner.formatter.inputDigit(phoneNumber.charAt(i));\n\n // has ()- or space inside\n if (/[\\s()-]/g.test(current)) {\n result = current;\n\n validated = true;\n } else {\n if (!validated) {\n result = current;\n }\n // else: over length input\n // it turns to invalid number again\n }\n }\n\n // strip ()\n // e.g. US: 7161234567 returns (716) 123-4567\n result = result.replace(/[()]/g, '');\n // replace library delimiter with user customized delimiter\n result = result.replace(/[\\s-]/g, owner.delimiter);\n\n return result;\n }\n};\n\nvar PhoneFormatter_1 = PhoneFormatter;\n\nvar CreditCardDetector = {\n blocks: {\n uatp: [4, 5, 6],\n amex: [4, 6, 5],\n diners: [4, 6, 4],\n discover: [4, 4, 4, 4],\n mastercard: [4, 4, 4, 4],\n dankort: [4, 4, 4, 4],\n instapayment: [4, 4, 4, 4],\n jcb15: [4, 6, 5],\n jcb: [4, 4, 4, 4],\n maestro: [4, 4, 4, 4],\n visa: [4, 4, 4, 4],\n mir: [4, 4, 4, 4],\n unionPay: [4, 4, 4, 4],\n general: [4, 4, 4, 4]\n },\n\n re: {\n // starts with 1; 15 digits, not starts with 1800 (jcb card)\n uatp: /^(?!1800)1\\d{0,14}/,\n\n // starts with 34/37; 15 digits\n amex: /^3[47]\\d{0,13}/,\n\n // starts with 6011/65/644-649; 16 digits\n discover: /^(?:6011|65\\d{0,2}|64[4-9]\\d?)\\d{0,12}/,\n\n // starts with 300-305/309 or 36/38/39; 14 digits\n diners: /^3(?:0([0-5]|9)|[689]\\d?)\\d{0,11}/,\n\n // starts with 51-55/2221–2720; 16 digits\n mastercard: /^(5[1-5]\\d{0,2}|22[2-9]\\d{0,1}|2[3-7]\\d{0,2})\\d{0,12}/,\n\n // starts with 5019/4175/4571; 16 digits\n dankort: /^(5019|4175|4571)\\d{0,12}/,\n\n // starts with 637-639; 16 digits\n instapayment: /^63[7-9]\\d{0,13}/,\n\n // starts with 2131/1800; 15 digits\n jcb15: /^(?:2131|1800)\\d{0,11}/,\n\n // starts with 2131/1800/35; 16 digits\n jcb: /^(?:35\\d{0,2})\\d{0,12}/,\n\n // starts with 50/56-58/6304/67; 16 digits\n maestro: /^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}/,\n\n // starts with 22; 16 digits\n mir: /^220[0-4]\\d{0,12}/,\n\n // starts with 4; 16 digits\n visa: /^4\\d{0,15}/,\n\n // starts with 62/81; 16 digits\n unionPay: /^(62|81)\\d{0,14}/\n },\n\n getStrictBlocks: function (block) {\n var total = block.reduce(function (prev, current) {\n return prev + current;\n }, 0);\n\n return block.concat(19 - total);\n },\n\n getInfo: function (value, strictMode) {\n var blocks = CreditCardDetector.blocks,\n re = CreditCardDetector.re;\n\n // Some credit card can have up to 19 digits number.\n // Set strictMode to true will remove the 16 max-length restrain,\n // however, I never found any website validate card number like\n // this, hence probably you don't want to enable this option.\n strictMode = !!strictMode;\n\n for (var key in re) {\n if (re[key].test(value)) {\n var matchedBlocks = blocks[key];\n return {\n type: key,\n blocks: strictMode ? this.getStrictBlocks(matchedBlocks) : matchedBlocks\n };\n }\n }\n\n return {\n type: 'unknown',\n blocks: strictMode ? this.getStrictBlocks(blocks.general) : blocks.general\n };\n }\n};\n\nvar CreditCardDetector_1 = CreditCardDetector;\n\nvar Util = {\n noop: function () {\n },\n\n strip: function (value, re) {\n return value.replace(re, '');\n },\n\n getPostDelimiter: function (value, delimiter, delimiters) {\n // single delimiter\n if (delimiters.length === 0) {\n return value.slice(-delimiter.length) === delimiter ? delimiter : '';\n }\n\n // multiple delimiters\n var matchedDelimiter = '';\n delimiters.forEach(function (current) {\n if (value.slice(-current.length) === current) {\n matchedDelimiter = current;\n }\n });\n\n return matchedDelimiter;\n },\n\n getDelimiterREByDelimiter: function (delimiter) {\n return new RegExp(delimiter.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1'), 'g');\n },\n\n getNextCursorPosition: function (prevPos, oldValue, newValue, delimiter, delimiters) {\n // If cursor was at the end of value, just place it back.\n // Because new value could contain additional chars.\n if (oldValue.length === prevPos) {\n return newValue.length;\n }\n\n return prevPos + this.getPositionOffset(prevPos, oldValue, newValue, delimiter ,delimiters);\n },\n\n getPositionOffset: function (prevPos, oldValue, newValue, delimiter, delimiters) {\n var oldRawValue, newRawValue, lengthOffset;\n\n oldRawValue = this.stripDelimiters(oldValue.slice(0, prevPos), delimiter, delimiters);\n newRawValue = this.stripDelimiters(newValue.slice(0, prevPos), delimiter, delimiters);\n lengthOffset = oldRawValue.length - newRawValue.length;\n\n return (lengthOffset !== 0) ? (lengthOffset / Math.abs(lengthOffset)) : 0;\n },\n\n stripDelimiters: function (value, delimiter, delimiters) {\n var owner = this;\n\n // single delimiter\n if (delimiters.length === 0) {\n var delimiterRE = delimiter ? owner.getDelimiterREByDelimiter(delimiter) : '';\n\n return value.replace(delimiterRE, '');\n }\n\n // multiple delimiters\n delimiters.forEach(function (current) {\n current.split('').forEach(function (letter) {\n value = value.replace(owner.getDelimiterREByDelimiter(letter), '');\n });\n });\n\n return value;\n },\n\n headStr: function (str, length) {\n return str.slice(0, length);\n },\n\n getMaxLength: function (blocks) {\n return blocks.reduce(function (previous, current) {\n return previous + current;\n }, 0);\n },\n\n // strip prefix\n // Before type | After type | Return value\n // PEFIX-... | PEFIX-... | ''\n // PREFIX-123 | PEFIX-123 | 123\n // PREFIX-123 | PREFIX-23 | 23\n // PREFIX-123 | PREFIX-1234 | 1234\n getPrefixStrippedValue: function (value, prefix, prefixLength, prevResult, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix) {\n // No prefix\n if (prefixLength === 0) {\n return value;\n }\n\n // Value is prefix\n if (value === prefix && value !== '') {\n return '';\n }\n\n if (signBeforePrefix && (value.slice(0, 1) == '-')) {\n var prev = (prevResult.slice(0, 1) == '-') ? prevResult.slice(1) : prevResult;\n return '-' + this.getPrefixStrippedValue(value.slice(1), prefix, prefixLength, prev, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix);\n }\n\n // Pre result prefix string does not match pre-defined prefix\n if (prevResult.slice(0, prefixLength) !== prefix && !tailPrefix) {\n // Check if the first time user entered something\n if (noImmediatePrefix && !prevResult && value) return value;\n return '';\n } else if (prevResult.slice(-prefixLength) !== prefix && tailPrefix) {\n // Check if the first time user entered something\n if (noImmediatePrefix && !prevResult && value) return value;\n return '';\n }\n\n var prevValue = this.stripDelimiters(prevResult, delimiter, delimiters);\n\n // New value has issue, someone typed in between prefix letters\n // Revert to pre value\n if (value.slice(0, prefixLength) !== prefix && !tailPrefix) {\n return prevValue.slice(prefixLength);\n } else if (value.slice(-prefixLength) !== prefix && tailPrefix) {\n return prevValue.slice(0, -prefixLength - 1);\n }\n\n // No issue, strip prefix for new value\n return tailPrefix ? value.slice(0, -prefixLength) : value.slice(prefixLength);\n },\n\n getFirstDiffIndex: function (prev, current) {\n var index = 0;\n\n while (prev.charAt(index) === current.charAt(index)) {\n if (prev.charAt(index++) === '') {\n return -1;\n }\n }\n\n return index;\n },\n\n getFormattedValue: function (value, blocks, blocksLength, delimiter, delimiters, delimiterLazyShow) {\n var result = '',\n multipleDelimiters = delimiters.length > 0,\n currentDelimiter = '';\n\n // no options, normal input\n if (blocksLength === 0) {\n return value;\n }\n\n blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n rest = value.slice(length);\n\n if (multipleDelimiters) {\n currentDelimiter = delimiters[delimiterLazyShow ? (index - 1) : index] || currentDelimiter;\n } else {\n currentDelimiter = delimiter;\n }\n\n if (delimiterLazyShow) {\n if (index > 0) {\n result += currentDelimiter;\n }\n\n result += sub;\n } else {\n result += sub;\n\n if (sub.length === length && index < blocksLength - 1) {\n result += currentDelimiter;\n }\n }\n\n // update remaining string\n value = rest;\n }\n });\n\n return result;\n },\n\n // move cursor to the end\n // the first time user focuses on an input with prefix\n fixPrefixCursor: function (el, prefix, delimiter, delimiters) {\n if (!el) {\n return;\n }\n\n var val = el.value,\n appendix = delimiter || (delimiters[0] || ' ');\n\n if (!el.setSelectionRange || !prefix || (prefix.length + appendix.length) <= val.length) {\n return;\n }\n\n var len = val.length * 2;\n\n // set timeout to avoid blink\n setTimeout(function () {\n el.setSelectionRange(len, len);\n }, 1);\n },\n\n // Check if input field is fully selected\n checkFullSelection: function(value) {\n try {\n var selection = window.getSelection() || document.getSelection() || {};\n return selection.toString().length === value.length;\n } catch (ex) {\n // Ignore\n }\n\n return false;\n },\n\n setSelection: function (element, position, doc) {\n if (element !== this.getActiveElement(doc)) {\n return;\n }\n\n // cursor is already in the end\n if (element && element.value.length <= position) {\n return;\n }\n\n if (element.createTextRange) {\n var range = element.createTextRange();\n\n range.move('character', position);\n range.select();\n } else {\n try {\n element.setSelectionRange(position, position);\n } catch (e) {\n // eslint-disable-next-line\n console.warn('The input element type does not support selection');\n }\n }\n },\n\n getActiveElement: function(parent) {\n var activeElement = parent.activeElement;\n if (activeElement && activeElement.shadowRoot) {\n return this.getActiveElement(activeElement.shadowRoot);\n }\n return activeElement;\n },\n\n isAndroid: function () {\n return navigator && /android/i.test(navigator.userAgent);\n },\n\n // On Android chrome, the keyup and keydown events\n // always return key code 229 as a composition that\n // buffers the user’s keystrokes\n // see https://github.com/nosir/cleave.js/issues/147\n isAndroidBackspaceKeydown: function (lastInputValue, currentInputValue) {\n if (!this.isAndroid() || !lastInputValue || !currentInputValue) {\n return false;\n }\n\n return currentInputValue === lastInputValue.slice(0, -1);\n }\n};\n\nvar Util_1 = Util;\n\n/**\n * Props Assignment\n *\n * Separate this, so react module can share the usage\n */\nvar DefaultProperties = {\n // Maybe change to object-assign\n // for now just keep it as simple\n assign: function (target, opts) {\n target = target || {};\n opts = opts || {};\n\n // credit card\n target.creditCard = !!opts.creditCard;\n target.creditCardStrictMode = !!opts.creditCardStrictMode;\n target.creditCardType = '';\n target.onCreditCardTypeChanged = opts.onCreditCardTypeChanged || (function () {});\n\n // phone\n target.phone = !!opts.phone;\n target.phoneRegionCode = opts.phoneRegionCode || 'AU';\n target.phoneFormatter = {};\n\n // time\n target.time = !!opts.time;\n target.timePattern = opts.timePattern || ['h', 'm', 's'];\n target.timeFormat = opts.timeFormat || '24';\n target.timeFormatter = {};\n\n // date\n target.date = !!opts.date;\n target.datePattern = opts.datePattern || ['d', 'm', 'Y'];\n target.dateMin = opts.dateMin || '';\n target.dateMax = opts.dateMax || '';\n target.dateFormatter = {};\n\n // numeral\n target.numeral = !!opts.numeral;\n target.numeralIntegerScale = opts.numeralIntegerScale > 0 ? opts.numeralIntegerScale : 0;\n target.numeralDecimalScale = opts.numeralDecimalScale >= 0 ? opts.numeralDecimalScale : 2;\n target.numeralDecimalMark = opts.numeralDecimalMark || '.';\n target.numeralThousandsGroupStyle = opts.numeralThousandsGroupStyle || 'thousand';\n target.numeralPositiveOnly = !!opts.numeralPositiveOnly;\n target.stripLeadingZeroes = opts.stripLeadingZeroes !== false;\n target.signBeforePrefix = !!opts.signBeforePrefix;\n target.tailPrefix = !!opts.tailPrefix;\n\n // others\n target.swapHiddenInput = !!opts.swapHiddenInput;\n \n target.numericOnly = target.creditCard || target.date || !!opts.numericOnly;\n\n target.uppercase = !!opts.uppercase;\n target.lowercase = !!opts.lowercase;\n\n target.prefix = (target.creditCard || target.date) ? '' : (opts.prefix || '');\n target.noImmediatePrefix = !!opts.noImmediatePrefix;\n target.prefixLength = target.prefix.length;\n target.rawValueTrimPrefix = !!opts.rawValueTrimPrefix;\n target.copyDelimiter = !!opts.copyDelimiter;\n\n target.initValue = (opts.initValue !== undefined && opts.initValue !== null) ? opts.initValue.toString() : '';\n\n target.delimiter =\n (opts.delimiter || opts.delimiter === '') ? opts.delimiter :\n (opts.date ? '/' :\n (opts.time ? ':' :\n (opts.numeral ? ',' :\n (opts.phone ? ' ' :\n ' '))));\n target.delimiterLength = target.delimiter.length;\n target.delimiterLazyShow = !!opts.delimiterLazyShow;\n target.delimiters = opts.delimiters || [];\n\n target.blocks = opts.blocks || [];\n target.blocksLength = target.blocks.length;\n\n target.root = (typeof commonjsGlobal === 'object' && commonjsGlobal) ? commonjsGlobal : window;\n target.document = opts.document || target.root.document;\n\n target.maxLength = 0;\n\n target.backspace = false;\n target.result = '';\n\n target.onValueChanged = opts.onValueChanged || (function () {});\n\n return target;\n }\n};\n\nvar DefaultProperties_1 = DefaultProperties;\n\n/**\n * Construct a new Cleave instance by passing the configuration object\n *\n * @param {String | HTMLElement} element\n * @param {Object} opts\n */\nvar Cleave = function (element, opts) {\n var owner = this;\n var hasMultipleElements = false;\n\n if (typeof element === 'string') {\n owner.element = document.querySelector(element);\n hasMultipleElements = document.querySelectorAll(element).length > 1;\n } else {\n if (typeof element.length !== 'undefined' && element.length > 0) {\n owner.element = element[0];\n hasMultipleElements = element.length > 1;\n } else {\n owner.element = element;\n }\n }\n\n if (!owner.element) {\n throw new Error('[cleave.js] Please check the element');\n }\n\n if (hasMultipleElements) {\n try {\n // eslint-disable-next-line\n console.warn('[cleave.js] Multiple input fields matched, cleave.js will only take the first one.');\n } catch (e) {\n // Old IE\n }\n }\n\n opts.initValue = owner.element.value;\n\n owner.properties = Cleave.DefaultProperties.assign({}, opts);\n\n owner.init();\n};\n\nCleave.prototype = {\n init: function () {\n var owner = this, pps = owner.properties;\n\n // no need to use this lib\n if (!pps.numeral && !pps.phone && !pps.creditCard && !pps.time && !pps.date && (pps.blocksLength === 0 && !pps.prefix)) {\n owner.onInput(pps.initValue);\n\n return;\n }\n\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n\n owner.isAndroid = Cleave.Util.isAndroid();\n owner.lastInputValue = '';\n owner.isBackward = '';\n\n owner.onChangeListener = owner.onChange.bind(owner);\n owner.onKeyDownListener = owner.onKeyDown.bind(owner);\n owner.onFocusListener = owner.onFocus.bind(owner);\n owner.onCutListener = owner.onCut.bind(owner);\n owner.onCopyListener = owner.onCopy.bind(owner);\n\n owner.initSwapHiddenInput();\n\n owner.element.addEventListener('input', owner.onChangeListener);\n owner.element.addEventListener('keydown', owner.onKeyDownListener);\n owner.element.addEventListener('focus', owner.onFocusListener);\n owner.element.addEventListener('cut', owner.onCutListener);\n owner.element.addEventListener('copy', owner.onCopyListener);\n\n\n owner.initPhoneFormatter();\n owner.initDateFormatter();\n owner.initTimeFormatter();\n owner.initNumeralFormatter();\n\n // avoid touch input field if value is null\n // otherwise Firefox will add red box-shadow for \n if (pps.initValue || (pps.prefix && !pps.noImmediatePrefix)) {\n owner.onInput(pps.initValue);\n }\n },\n\n initSwapHiddenInput: function () {\n var owner = this, pps = owner.properties;\n if (!pps.swapHiddenInput) return;\n\n var inputFormatter = owner.element.cloneNode(true);\n owner.element.parentNode.insertBefore(inputFormatter, owner.element);\n\n owner.elementSwapHidden = owner.element;\n owner.elementSwapHidden.type = 'hidden';\n\n owner.element = inputFormatter;\n owner.element.id = '';\n },\n\n initNumeralFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.numeral) {\n return;\n }\n\n pps.numeralFormatter = new Cleave.NumeralFormatter(\n pps.numeralDecimalMark,\n pps.numeralIntegerScale,\n pps.numeralDecimalScale,\n pps.numeralThousandsGroupStyle,\n pps.numeralPositiveOnly,\n pps.stripLeadingZeroes,\n pps.prefix,\n pps.signBeforePrefix,\n pps.tailPrefix,\n pps.delimiter\n );\n },\n\n initTimeFormatter: function() {\n var owner = this, pps = owner.properties;\n\n if (!pps.time) {\n return;\n }\n\n pps.timeFormatter = new Cleave.TimeFormatter(pps.timePattern, pps.timeFormat);\n pps.blocks = pps.timeFormatter.getBlocks();\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n },\n\n initDateFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.date) {\n return;\n }\n\n pps.dateFormatter = new Cleave.DateFormatter(pps.datePattern, pps.dateMin, pps.dateMax);\n pps.blocks = pps.dateFormatter.getBlocks();\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n },\n\n initPhoneFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.phone) {\n return;\n }\n\n // Cleave.AsYouTypeFormatter should be provided by\n // external google closure lib\n try {\n pps.phoneFormatter = new Cleave.PhoneFormatter(\n new pps.root.Cleave.AsYouTypeFormatter(pps.phoneRegionCode),\n pps.delimiter\n );\n } catch (ex) {\n throw new Error('[cleave.js] Please include phone-type-formatter.{country}.js lib');\n }\n },\n\n onKeyDown: function (event) {\n var owner = this,\n charCode = event.which || event.keyCode;\n\n owner.lastInputValue = owner.element.value;\n owner.isBackward = charCode === 8;\n },\n\n onChange: function (event) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util;\n\n owner.isBackward = owner.isBackward || event.inputType === 'deleteContentBackward';\n\n var postDelimiter = Util.getPostDelimiter(owner.lastInputValue, pps.delimiter, pps.delimiters);\n\n if (owner.isBackward && postDelimiter) {\n pps.postDelimiterBackspace = postDelimiter;\n } else {\n pps.postDelimiterBackspace = false;\n }\n\n this.onInput(this.element.value);\n },\n\n onFocus: function () {\n var owner = this,\n pps = owner.properties;\n owner.lastInputValue = owner.element.value;\n\n if (pps.prefix && pps.noImmediatePrefix && !owner.element.value) {\n this.onInput(pps.prefix);\n }\n\n Cleave.Util.fixPrefixCursor(owner.element, pps.prefix, pps.delimiter, pps.delimiters);\n },\n\n onCut: function (e) {\n if (!Cleave.Util.checkFullSelection(this.element.value)) return;\n this.copyClipboardData(e);\n this.onInput('');\n },\n\n onCopy: function (e) {\n if (!Cleave.Util.checkFullSelection(this.element.value)) return;\n this.copyClipboardData(e);\n },\n\n copyClipboardData: function (e) {\n var owner = this,\n pps = owner.properties,\n Util = Cleave.Util,\n inputValue = owner.element.value,\n textToCopy = '';\n\n if (!pps.copyDelimiter) {\n textToCopy = Util.stripDelimiters(inputValue, pps.delimiter, pps.delimiters);\n } else {\n textToCopy = inputValue;\n }\n\n try {\n if (e.clipboardData) {\n e.clipboardData.setData('Text', textToCopy);\n } else {\n window.clipboardData.setData('Text', textToCopy);\n }\n\n e.preventDefault();\n } catch (ex) {\n // empty\n }\n },\n\n onInput: function (value) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util;\n\n // case 1: delete one more character \"4\"\n // 1234*| -> hit backspace -> 123|\n // case 2: last character is not delimiter which is:\n // 12|34* -> hit backspace -> 1|34*\n // note: no need to apply this for numeral mode\n var postDelimiterAfter = Util.getPostDelimiter(value, pps.delimiter, pps.delimiters);\n if (!pps.numeral && pps.postDelimiterBackspace && !postDelimiterAfter) {\n value = Util.headStr(value, value.length - pps.postDelimiterBackspace.length);\n }\n\n // phone formatter\n if (pps.phone) {\n if (pps.prefix && (!pps.noImmediatePrefix || value.length)) {\n pps.result = pps.prefix + pps.phoneFormatter.format(value).slice(pps.prefix.length);\n } else {\n pps.result = pps.phoneFormatter.format(value);\n }\n owner.updateValueState();\n\n return;\n }\n\n // numeral formatter\n if (pps.numeral) {\n // Do not show prefix when noImmediatePrefix is specified\n // This mostly because we need to show user the native input placeholder\n if (pps.prefix && pps.noImmediatePrefix && value.length === 0) {\n pps.result = '';\n } else {\n pps.result = pps.numeralFormatter.format(value);\n }\n owner.updateValueState();\n\n return;\n }\n\n // date\n if (pps.date) {\n value = pps.dateFormatter.getValidatedDate(value);\n }\n\n // time\n if (pps.time) {\n value = pps.timeFormatter.getValidatedTime(value);\n }\n\n // strip delimiters\n value = Util.stripDelimiters(value, pps.delimiter, pps.delimiters);\n\n // strip prefix\n value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix);\n\n // strip non-numeric characters\n value = pps.numericOnly ? Util.strip(value, /[^\\d]/g) : value;\n\n // convert case\n value = pps.uppercase ? value.toUpperCase() : value;\n value = pps.lowercase ? value.toLowerCase() : value;\n\n // prevent from showing prefix when no immediate option enabled with empty input value\n if (pps.prefix) {\n if (pps.tailPrefix) {\n value = value + pps.prefix;\n } else {\n value = pps.prefix + value;\n }\n\n\n // no blocks specified, no need to do formatting\n if (pps.blocksLength === 0) {\n pps.result = value;\n owner.updateValueState();\n\n return;\n }\n }\n\n // update credit card props\n if (pps.creditCard) {\n owner.updateCreditCardPropsByValue(value);\n }\n\n // strip over length characters\n value = Util.headStr(value, pps.maxLength);\n\n // apply blocks\n pps.result = Util.getFormattedValue(\n value,\n pps.blocks, pps.blocksLength,\n pps.delimiter, pps.delimiters, pps.delimiterLazyShow\n );\n\n owner.updateValueState();\n },\n\n updateCreditCardPropsByValue: function (value) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util,\n creditCardInfo;\n\n // At least one of the first 4 characters has changed\n if (Util.headStr(pps.result, 4) === Util.headStr(value, 4)) {\n return;\n }\n\n creditCardInfo = Cleave.CreditCardDetector.getInfo(value, pps.creditCardStrictMode);\n\n pps.blocks = creditCardInfo.blocks;\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Util.getMaxLength(pps.blocks);\n\n // credit card type changed\n if (pps.creditCardType !== creditCardInfo.type) {\n pps.creditCardType = creditCardInfo.type;\n\n pps.onCreditCardTypeChanged.call(owner, pps.creditCardType);\n }\n },\n\n updateValueState: function () {\n var owner = this,\n Util = Cleave.Util,\n pps = owner.properties;\n\n if (!owner.element) {\n return;\n }\n\n var endPos = owner.element.selectionEnd;\n var oldValue = owner.element.value;\n var newValue = pps.result;\n\n endPos = Util.getNextCursorPosition(endPos, oldValue, newValue, pps.delimiter, pps.delimiters);\n\n // fix Android browser type=\"text\" input field\n // cursor not jumping issue\n if (owner.isAndroid) {\n window.setTimeout(function () {\n owner.element.value = newValue;\n Util.setSelection(owner.element, endPos, pps.document, false);\n owner.callOnValueChanged();\n }, 1);\n\n return;\n }\n\n owner.element.value = newValue;\n if (pps.swapHiddenInput) owner.elementSwapHidden.value = owner.getRawValue();\n\n Util.setSelection(owner.element, endPos, pps.document, false);\n owner.callOnValueChanged();\n },\n\n callOnValueChanged: function () {\n var owner = this,\n pps = owner.properties;\n\n pps.onValueChanged.call(owner, {\n target: {\n name: owner.element.name,\n value: pps.result,\n rawValue: owner.getRawValue()\n }\n });\n },\n\n setPhoneRegionCode: function (phoneRegionCode) {\n var owner = this, pps = owner.properties;\n\n pps.phoneRegionCode = phoneRegionCode;\n owner.initPhoneFormatter();\n owner.onChange();\n },\n\n setRawValue: function (value) {\n var owner = this, pps = owner.properties;\n\n value = value !== undefined && value !== null ? value.toString() : '';\n\n if (pps.numeral) {\n value = value.replace('.', pps.numeralDecimalMark);\n }\n\n pps.postDelimiterBackspace = false;\n\n owner.element.value = value;\n owner.onInput(value);\n },\n\n getRawValue: function () {\n var owner = this,\n pps = owner.properties,\n Util = Cleave.Util,\n rawValue = owner.element.value;\n\n if (pps.rawValueTrimPrefix) {\n rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix);\n }\n\n if (pps.numeral) {\n rawValue = pps.numeralFormatter.getRawValue(rawValue);\n } else {\n rawValue = Util.stripDelimiters(rawValue, pps.delimiter, pps.delimiters);\n }\n\n return rawValue;\n },\n\n getISOFormatDate: function () {\n var owner = this,\n pps = owner.properties;\n\n return pps.date ? pps.dateFormatter.getISOFormatDate() : '';\n },\n\n getISOFormatTime: function () {\n var owner = this,\n pps = owner.properties;\n\n return pps.time ? pps.timeFormatter.getISOFormatTime() : '';\n },\n\n getFormattedValue: function () {\n return this.element.value;\n },\n\n destroy: function () {\n var owner = this;\n\n owner.element.removeEventListener('input', owner.onChangeListener);\n owner.element.removeEventListener('keydown', owner.onKeyDownListener);\n owner.element.removeEventListener('focus', owner.onFocusListener);\n owner.element.removeEventListener('cut', owner.onCutListener);\n owner.element.removeEventListener('copy', owner.onCopyListener);\n },\n\n toString: function () {\n return '[Cleave Object]';\n }\n};\n\nCleave.NumeralFormatter = NumeralFormatter_1;\nCleave.DateFormatter = DateFormatter_1;\nCleave.TimeFormatter = TimeFormatter_1;\nCleave.PhoneFormatter = PhoneFormatter_1;\nCleave.CreditCardDetector = CreditCardDetector_1;\nCleave.Util = Util_1;\nCleave.DefaultProperties = DefaultProperties_1;\n\n// for angular directive\n((typeof commonjsGlobal === 'object' && commonjsGlobal) ? commonjsGlobal : window)['Cleave'] = Cleave;\n\n// CommonJS\nvar Cleave_1 = Cleave;\n\nexport default Cleave_1;\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","'use strict';\n\nconst { getProductData, queryFirst, queryAll } = require('./domUtil');\nconst { formatMessage } = require('./util');\nconst afterpayTimeout = Date.now() + 5000;\n\n/**\n * Converts an array of selectors/elements to an array of elements (Uses queryAll to query selector strings)\n * @param {string|element|array} items A selector, element, or array of selectors/elements\n * @param {element|array} [scope] The scope(s) in which to search for elements\n * @returns {array} An array of elements\n */\nconst elementArray = (items, scope) => {\n if (!Array.isArray(items)) items = [items];\n if (!Array.isArray(scope)) scope = [scope || document];\n\n return items.reduce((results, item) => {\n if (typeof item === 'string') {\n scope.forEach(parent => {\n if (!!parent.matches && parent.matches(item)) {\n results.push(parent);\n } else {\n results = results.concat(queryAll(item, parent));\n }\n });\n } else {\n results.push(item);\n }\n\n return results;\n }, []);\n};\n\n/**\n * Initializes Afterpay messaging\n * @param {object} options Afterpay configuration options\n * @param {boolean} [options.alwaysShow] Whether the Afterpay messaging should always show, even when outside the threshold range (Default: true)\n * @param {string|element|array|NodeList} options.anchors The anchor element(s) referenced when rendering Afterpay messaging\n * @param {number} [options.price] The static price of the product in any format (if possible, use a priceTarget instead)\n * @param {string|element|array} options.observerTargets A selector, element or array of selectors/elements to observe for price changes and trigger Afterpay messaging updates (if a selector is passed, it will be queried relative to the anchor)\n * @param {string|element|array} options.priceTargets A selector, element or array of selectors/elements to use for price values. The \"value\" will be used if possible, or the innerText as a fallback\n * @param {string} [options.renderMode] The mode to use when rendering Afterpay messaging (E.g. adjacent, append, before, replace [Default: append])\n * @param {string|element} [options.renderTarget] The selector or element to use in conjunction with the renderMode (Defaults to the anchor)\n * @param {boolean} [options.showExcluded] Whether to show Afterpay messaging when a product is excluded\n * @param {object} [options.thresholds] The min/max thresholds to determine when Afterpay messaging shows (E.g. { min: 100, max: 1000 })\n * @param {string} [options.logoPosition] How to position the logo in Afterpay messaging (E.g. before, after [Default: after])\n */\nmodule.exports = function afterpay(options = {}) {\n let { alwaysShow = true, anchors, observerTargets, price, priceTargets, renderMode, renderTarget, showExcluded = true, thresholds = {}, logoPosition = 'after' } = options;\n\n // No anchors OR no observerTargets OR (no price AND no price targets)\n if (!anchors || !anchors.length || !observerTargets || !observerTargets.length || (!price && (!priceTargets || !priceTargets.length))) return false;\n\n // Waiting for Afterpay API\n if (!window.presentAfterpay) return (Date.now() >= afterpayTimeout) ? false : setTimeout(function (args) { afterpay.apply(this, args); }.bind(this, arguments), 250);\n\n // Anchors to array\n anchors = elementArray(anchors);\n\n // Missing anchor(s)\n if (!anchors.length) return false;\n\n // Afterpay preferences element\n const afterpayPrefsEl = document.getElementById('afterpayEnabled');\n\n // Afterpay is disabled\n if (!afterpayPrefsEl || afterpayPrefsEl.value !== 'true') return false;\n\n // Afterpay preferences data\n const afterpayPrefs = afterpayPrefsEl.dataset;\n\n // Base config\n const apConfig = {\n afterpayLogoColor: 'black',\n currency: 'USD',\n locale: 'en_US'\n };\n\n // Get product exclusions\n const exclusions = JSON.parse(afterpayPrefs.exclusions || '[]');\n\n // Threshold mixin\n if (thresholds) {\n const apThresholds = apConfig.minMaxThreshold = {};\n let { min, max } = thresholds;\n\n // Threshold fallbacks\n if (!min) min = afterpayPrefs.min;\n if (!max) max = afterpayPrefs.max;\n\n // Afterpay wants cents\n if (min) apThresholds.min = min * 100;\n if (max) apThresholds.max = max * 100;\n }\n\n /**\n * Updates the product price in an Afterpay config object\n * @param {object} config Afterpay config object\n * @param {*} price Price in any format\n */\n const updateAmount = (config, price) => {\n const stringValue = String(price);\n const isDecimalValue = ~stringValue.indexOf('.');\n const intValue = parseInt(stringValue.replace(/[^0-9]/g, '').trim(), 10);\n const amount = config.amount = intValue * (isDecimalValue ? 1 : 100);\n\n return amount;\n };\n\n /**\n * Gets the price target value for the given observer target\n * @param {element} observerTarget The observer target to search within\n * @returns {*} Returns the price, the price target's text content, or an empty string\n */\n const getPrice = observerTarget => {\n return (priceTargets ? elementArray(priceTargets, observerTarget) : [observerTarget]).reduce((value, element) => {\n if (value) return value;\n return element.value || element.innerText || '';\n }, '');\n };\n\n /**\n * Renders Afterpay messaging\n * @param {object} instance Afterpay instance\n * @param {element} anchor Anchor element\n * @param {string} [mode] Render mode (E.g. adjacent, append, before, replace [Default: append]) \n */\n const renderAfterpay = (instance, anchor, mode) => {\n const { config } = instance;\n const { amount, minMaxThreshold = {} } = config;\n const { min, max } = minMaxThreshold;\n const notWithinThreshold = (min && min > amount) || (max && max < amount);\n const excluded = [];\n const hidden = 'hide';\n\n let excludedMessageKey = 'defaultExcludedMessage';\n let productElements = [anchor];\n\n // If this is the cart, we're displaying with the context of all products\n excludedMessageKey = 'excludedMessage';\n productElements = queryAll('#myTote .cart-product-line-item');\n\n // Look for any exclusions\n productElements.forEach(element => {\n const { masterId, productName } = getProductData(element);\n\n if (~exclusions.indexOf(masterId) && !~excluded.indexOf(productName)) {\n excluded.push(productName);\n }\n });\n\n let renderMode = (!alwaysShow && notWithinThreshold) ? hidden : mode.toLowerCase();\n\n if (excluded.length && !showExcluded) {\n renderMode = hidden;\n }\n\n const afterpayNode = renderMode === hidden ? document.createElement('p') : instance.renderAfterpay();\n const afterpayMessage = queryFirst('span[class^=\"afterpay-text\"]', afterpayNode);\n\n if (afterpayMessage) {\n if (logoPosition === 'after') {\n const { parentElement } = afterpayMessage;\n\n parentElement.insertBefore(afterpayMessage, parentElement.firstChild);\n }\n\n if (excluded.length) {\n if (showExcluded) {\n const lastToken = excluded.pop();\n const tokenText = excluded.length ? `${excluded.join(', ')}${afterpayPrefs.excludedMultiSuffix} ${lastToken}` : lastToken;\n\n afterpayMessage.textContent = formatMessage(afterpayPrefs[excludedMessageKey], `${tokenText} `);\n }\n } else if (notWithinThreshold) {\n afterpayMessage.textContent = `${afterpayPrefs.notWithinThresholdMessage} `;\n }\n }\n\n const instanceNode = instance.afterpayNode;\n const target = (typeof renderTarget === 'string' ? queryFirst(renderTarget, anchor) : renderTarget) || anchor;\n\n instance.afterpayNode = afterpayNode;\n\n // hide afteray messaging for pre-order products\n if ($('.size-btn.pre-order.selected').length || $('.cart-products .product-info.pre-order-product').length) {\n afterpayNode.classList.add('d-none');\n }\n\n switch (renderMode) {\n case 'adjacent':\n return target.insertAdjacentElement('afterend', afterpayNode);\n\n case 'before':\n return target.parentElement.insertBefore(afterpayNode, target);\n\n case hidden:\n case 'replace':\n return instanceNode && instanceNode.parentElement && instanceNode.parentElement.replaceChild(afterpayNode, instanceNode);\n\n default:\n return target.appendChild(afterpayNode);\n }\n };\n\n [].slice.call(anchors, 0).forEach(anchor => {\n const instanceConfig = Object.assign({}, apConfig);\n const anchorObserverTargets = elementArray(observerTargets, anchor);\n\n if (price) {\n updateAmount(instanceConfig, price);\n } else {\n const priceValue = anchorObserverTargets.reduce((result, target) => {\n if (result) return result;\n return getPrice(target);\n }, 0);\n\n updateAmount(instanceConfig, priceValue);\n }\n\n if (isNaN(instanceConfig.amount)) return;\n\n const apInstance = new presentAfterpay(instanceConfig);\n const observer = new MutationObserver(mutations => {\n const { afterpayNode } = apInstance;\n\n if (!afterpayNode) return;\n\n updateAmount(apInstance.config, getPrice(mutations[0].target));\n renderAfterpay(apInstance, afterpayNode, 'replace');\n });\n\n anchorObserverTargets.forEach(target => {\n observer.observe(target, { childList: true, subtree: true });\n });\n\n renderAfterpay(apInstance, anchor, renderMode);\n });\n};\n","'use strict';\n\n/**\n * Ovverides Amazon Pay Button Styles on cart\n * @param {boolean} isCartPage Checks if request is coming from cart page\n */\nconst updateAmazonPayButton = (isCartPage) => {\n const $amazonPayWrapper = isCartPage ? $('div[amazonpay-type=\"cart\"]') : $('div[amazonpay-type=\"additionalPayButton\"]');\n const shadowRoot = $amazonPayWrapper[0].shadowRoot;\n const style = document.createElement('style');\n style.innerHTML = `\n .amazonpay-button-view1-gold {\n background: none!important;\n border-color: #19183e!important;\n text-align: center;\n height: 48px;\n border-radius: 0;\n }\n\n .amazonpay-button-view1-gold .amazonpay-button-logo {\n display: inline-block;\n }\n\n .amazonpay-button-chevrons,\n .amazonpay-button-sandbox-logo,\n .amazonpay-button-view2,\n .amazonpay-button-view3 {\n display: none!important\n }`;\n shadowRoot.appendChild(style);\n}\n\nmodule.exports = {\n updateAmazonPayButton\n};","// OOTB Code\n'use strict';\nconst { queryFirst, addClass, queryAll, isInViewport, removeClass, hasClass, scrollTo } = require('./domUtil');\nconst { errorTextTemplate } = require('./templates');\nconst checkoutContainerEl = document.getElementById('checkout-main');\nconst checkoutContainer = queryFirst('.data-checkout-stage');\nconst showClass = 'show';\n\n/**\n * Function to scroll to th first invalid input if it is not in view port\n * @param {HTMLElement} formEl - Form to be validated\n */\nfunction scrollToError(formEl) {\n const headerEl = queryFirst('.main-header');\n const headerHeight = headerEl ? headerEl.offsetHeight : 0;\n const invalidEl = $(formEl)\n .find('.is-invalid')\n .first();\n\n if (invalidEl[0] && !isInViewport(invalidEl[0])) {\n scrollTo(invalidEl.offset().top - headerHeight);\n }\n}\n\n/**\n * Validate whole form. Requires `this` to be set to form object\n * @param {jQuery.event} event - Event to be canceled if form is invalid.\n * @returns {boolean} - Flag to indicate if form is valid\n */\nfunction validateForm(event) {\n var valid = true;\n if (checkoutContainer) {\n const billingForm = queryFirst('.billing-address-form', checkoutContainer);\n if (this === billingForm) {\n return valid;\n }\n }\n if (this.checkValidity && !this.checkValidity()) {\n // safari\n valid = false;\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }\n scrollToError(this);\n $(this)\n .find('input, select')\n .each(function () {\n if (!this.validity.valid) {\n $(this).trigger('invalid', this.validity);\n }\n });\n }\n return valid;\n}\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearForm(form) {\n $(form)\n .find('.form-control.is-invalid')\n .removeClass('is-invalid');\n}\n\n// LP custom changes start\n/**\n * Enable or disable button based on form validity status\n * @param {Object} formElement - form to be validated\n */\nfunction enableOrDisableButton(form) {\n const button = queryFirst('.enable-button-onvalidate', form);\n const isValid = queryAll('.is-invalid', form).length === 0;\n\n button.disabled = !isValid;\n}\n\n// LP custom changes end\n\n/**\n * function returns validation message basedd on fields invalid state\n * @returns {string} Validation message\n */\nfunction getValidationMessage() {\n let { validationMessage } = this;\n const $this = $(this);\n const patternMismatchValue = $this.data('pattern-mismatch');\n const rangeErrorValue = $this.data('range-error');\n const missingErrorValue = $this.data('missing-error');\n const badInputErrorValue = $this.data('bad-input-error');\n const stepMismatchErrorValue = $this.data('step-mismatch-error');\n const { patternMismatch, rangeOverflow, rangeUnderflow, tooLong, tooShort, valueMissing, badInput, stepMismatch } = this.validity;\n\n addClass(this, 'is-invalid');\n enableOrDisableButton(this.closest('form'));\n\n if (patternMismatch && patternMismatchValue) {\n validationMessage = patternMismatchValue;\n } else if ((rangeOverflow || rangeUnderflow) && rangeErrorValue) {\n validationMessage = rangeErrorValue;\n } else if ((tooLong || tooShort) && rangeErrorValue) {\n validationMessage = rangeErrorValue;\n } else if (valueMissing && missingErrorValue) {\n validationMessage = missingErrorValue;\n } else if (badInput && badInputErrorValue) {\n validationMessage = badInputErrorValue;\n } else if (stepMismatch && stepMismatchErrorValue) {\n validationMessage = stepMismatchErrorValue;\n }\n return validationMessage;\n}\n\n/**\n * Displays invalid forms error messages\n * @param {jQuery.event} e - Form invalid event object\n */\nfunction onFormInvalidHandler(e) {\n e.preventDefault();\n this.setCustomValidity('');\n if (!this.validity.valid) {\n $('.btn-show-details').trigger('click');\n $(this)\n .parents('.form-group, .input-group')\n .find('.invalid-feedback')\n .text(getValidationMessage.apply(this));\n if (!checkoutContainerEl) {\n scrollToError(this.form);\n }\n }\n}\n\n/**\n * Form submission event handler\n * @param {jQuery.event} e - Form submit event object\n * @returns {boolean} true if the form is valid\n */\nfunction onFormSubmit(e) {\n return validateForm.call(this, e);\n}\n\n\n/**\n * Function to check if the password/email and confirm password/email matches in form\n * @param {string} fieldId - ID of the form field\n * @param {boolean} isFieldsMatched - describes if fields matched\n * @param {Object} thisEl - this element\n * @return {Object} - updated form validity and password/email match\n */\nfunction checkFieldsMatch(fieldId, isFieldsMatched, thisEl) {\n const newFieldValue = queryFirst(fieldId).value;\n const confirmFieldValue = thisEl.value;\n\n if (confirmFieldValue && newFieldValue && confirmFieldValue !== newFieldValue) {\n isFieldsMatched = false;\n }\n\n return isFieldsMatched;\n}\n\n/**\n * Runs validation on all INPUT elements within the specified containing element.\n * @param {element} container - The containing element to validate all inputs within\n */\nfunction validateInputs(container) {\n if (!container) return;\n\n container.querySelectorAll('input').forEach(element => element.checkValidity());\n}\n\n/**\n * @description Returns function that checks address length, display error and cut input value\n * @param {number} addressLengthLimit - max address length from site preference\n * @param {element} addressForm - address form element\n * @returns {function} - function that checks address length, display error and cut input value\n */\nconst getAddressValidationHandler = (addressLengthLimit, addressForm) => {\n const formHelpers = require('base/checkout/formErrors');\n let timeoutID;\n\n return function (event) {\n if (timeoutID) {\n clearTimeout(timeoutID);\n }\n\n const addressEl = event.target;\n timeoutID = setTimeout(() => {\n if (addressEl.value.length > addressLengthLimit) {\n formHelpers.loadFormErrors(addressForm, {\n [addressEl.getAttribute('name')]: addressEl.getAttribute('data-config-limit-error')\n });\n addressEl.value = addressEl.value.slice(0, addressLengthLimit);\n }\n }, 500);\n };\n};\n\nmodule.exports = {\n invalid: function () {\n $('form input, form textarea, form select').on('invalid', onFormInvalidHandler);\n },\n\n ajaxFormInvalid: function (formElSelector) {\n if (!formElSelector) return;\n $(`${formElSelector} input, ${formElSelector} textarea, ${formElSelector} select`).on('invalid', onFormInvalidHandler);\n },\n\n submit: function () {\n $('form').on('submit', onFormSubmit);\n },\n\n ajaxFormSubmit: function (formElSelector) {\n if (!formElSelector) return;\n $(`${formElSelector}`).on('submit', onFormSubmit);\n },\n\n validateAddressForm: function () {\n const addressForm = queryFirst('.address-form');\n if (addressForm) {\n const address1 = queryFirst('#address1', addressForm);\n const address2 = queryFirst('#address2', addressForm);\n const addressLimit = address1.getAttribute('data-address-lengt-limit');\n if (addressLimit) {\n const addressValidationHandler = getAddressValidationHandler(addressLimit, addressForm);\n address1.addEventListener('keyup', addressValidationHandler);\n address2.addEventListener('keyup', addressValidationHandler);\n }\n }\n },\n\n validateCheckoutForm: function () {\n // LP custom changes start\n if (checkoutContainer) {\n const guestCustomerForm = queryFirst('.guest-form', checkoutContainer);\n const registeredCustomerForm = queryFirst('.registered-form', checkoutContainer);\n const shippingForm = queryFirst('.shipping-form', checkoutContainer);\n const billingForm = queryFirst('.billing-address-form', checkoutContainer);\n const submitShippingBtn = queryFirst('.submit-shipping', checkoutContainer);\n const billingAddress = queryFirst('.billing-address', billingForm);\n const reauthForm = queryFirst('.reauth-payment-form', checkoutContainer);\n\n if (submitShippingBtn !== null) {\n submitShippingBtn.disabled = false;\n }\n // LP custom changes end\n\n $('.guest-form, .registered-form, .shipping-form, .billing-address-form, .gift-card-container')\n .find('input, textarea')\n .on('blur', function () {\n if (this.validity.valid) {\n removeClass(this, 'is-invalid');\n } else {\n $(this)\n .parents('.form-group, .input-group')\n .find('.invalid-feedback')\n .text(getValidationMessage.apply(this));\n }\n });\n $('.shipping-form, .billing-address-form')\n .find('select, input[type=\"radio\"], input[type=\"checkbox\"]')\n .on('change', function () {\n if (this.validity.valid) {\n removeClass(this, 'is-invalid');\n } else {\n $(this)\n .parents('.form-group')\n .find('.invalid-feedback')\n .text(getValidationMessage.apply(this));\n }\n });\n if (!reauthForm) {\n const submitCustomerBtn = queryFirst('.submit-customer', checkoutContainer);\n const submitCustomerLoginBtn = queryFirst('.submit-customer-login', checkoutContainer);\n if (submitCustomerBtn) {\n submitCustomerBtn.addEventListener('click', function (event) {\n if (guestCustomerForm.checkValidity && !guestCustomerForm.checkValidity()) {\n event.stopPropagation();\n scrollToError(guestCustomerForm);\n }\n });\n }\n if (submitCustomerLoginBtn) {\n submitCustomerLoginBtn.addEventListener('click', function (event) {\n if (registeredCustomerForm.checkValidity && !registeredCustomerForm.checkValidity()) {\n event.stopPropagation();\n scrollToError(registeredCustomerForm);\n }\n });\n }\n\n const shippingAddress1 = queryFirst('.shippingAddressOne', shippingForm);\n const shippingAddress2 = queryFirst('.shippingAddressTwo', shippingForm);\n const shippingAddressLimit = shippingAddress1.getAttribute('data-address-lengt-limit');\n if (shippingAddressLimit) {\n const shippingAddressValidationHandler = getAddressValidationHandler(shippingAddressLimit, shippingForm);\n shippingAddress1.addEventListener('keyup', shippingAddressValidationHandler);\n shippingAddress2.addEventListener('keyup', shippingAddressValidationHandler);\n }\n\n const billingAddress1 = queryFirst('.billingAddressOne', billingForm);\n const billingAddress2 = queryFirst('.billingAddressTwo', billingForm);\n const billingAddressLimit = billingAddress1.getAttribute('data-address-lengt-limit');\n const billingAddressValidationHandler = getAddressValidationHandler(billingAddressLimit, billingForm);\n if (billingAddressLimit) {\n billingAddress1.addEventListener('keyup', billingAddressValidationHandler);\n billingAddress2.addEventListener('keyup', billingAddressValidationHandler);\n }\n\n shippingForm.addEventListener('submit', function (event) {\n event.preventDefault();\n setTimeout(function () {\n submitShippingBtn.click();\n }, 0);\n });\n\n submitShippingBtn.addEventListener('click', function (event) {\n const shippingForm = queryFirst('.shipping-form');\n const errorElement = queryFirst('.error-message');\n const { shippingError } = this.dataset;\n const { addressMode } = shippingForm.dataset;\n const { customerType } = checkoutContainer.dataset;\n\n removeClass(errorElement, showClass);\n\n if (customerType === 'registered') {\n if (addressMode === 'new' || addressMode === 'details') {\n if (shippingForm.checkValidity && !shippingForm.checkValidity()) {\n event.stopPropagation();\n errorElement.innerHTML = errorTextTemplate(shippingError);\n addClass(errorElement, showClass);\n scrollTo(0);\n }\n } else {\n const giftMessageEl = document.getElementById('giftMessage');\n if (giftMessageEl && !giftMessageEl.validity.valid) {\n addClass(giftMessageEl, 'is-invalid');\n event.stopPropagation();\n } else {\n removeClass(giftMessageEl, 'is-invalid');\n }\n }\n } else if (shippingForm.checkValidity && !shippingForm.checkValidity()) {\n event.stopPropagation();\n errorElement.innerHTML = errorTextTemplate(shippingError);\n addClass(errorElement, showClass);\n scrollTo(0);\n }\n });\n\n const submitPaymentBtn = queryFirst('.submit-payment', checkoutContainer);\n\n submitPaymentBtn.addEventListener('click', function (event) {\n const { customerType } = checkoutContainer.dataset;\n const isPaymentDisabled = hasClass(queryFirst('.payment-information'), 'disabled-section');\n const isCreditTabActive = hasClass(queryFirst('.credit-card-tab', checkoutContainer), 'active');\n const isNewPayment = $('.payment-information').data('is-new-payment');\n const isRequired = !isPaymentDisabled && isCreditTabActive;\n\n if (customerType === 'registered') {\n const savedPaymentCvv = queryFirst('.saved-payment-security-code');\n if (savedPaymentCvv) {\n savedPaymentCvv.required = isRequired && !isNewPayment;\n }\n }\n if (billingForm.checkValidity && !billingForm.checkValidity()) {\n scrollToError(billingForm);\n event.stopPropagation();\n }\n });\n\n billingForm.addEventListener('submit', function (event) {\n event.preventDefault();\n setTimeout(function () {\n // if the payment button is hidden, it's because CC is not active\n // and therefore we shouldn't click it\n if (!hasClass(submitPaymentBtn, 'd-none')) {\n submitPaymentBtn.click();\n }\n }, 0);\n });\n\n queryFirst('#billingAddressSelector').addEventListener('change', () => {\n if (checkoutContainer.dataset.checkoutStage === 'payment') {\n clearForm(billingAddress.closest('form'));\n validateInputs(billingAddress);\n }\n });\n\n const addressLinks = queryAll('.billing-address-block .address-links a');\n\n addressLinks.forEach(link => {\n link.addEventListener('click', () => {\n clearForm(billingAddress.closest('form'));\n });\n });\n\n if (checkoutContainer.dataset.checkoutStage === 'payment') {\n $(() => {\n validateInputs(billingAddress);\n });\n }\n } else {\n const submitReauthBtn = queryFirst('.submit-payment-button', checkoutContainer);\n submitReauthBtn.addEventListener('click', function (event) {\n event.preventDefault();\n $.spinner().start();\n submitReauthBtn.disabled = true;\n if (billingForm.checkValidity && !billingForm.checkValidity()) {\n scrollToError(billingForm);\n submitReauthBtn.disabled = false;\n $.spinner().stop();\n event.stopPropagation();\n } else {\n billingForm.submit();\n }\n });\n }\n }\n },\n\n enableFormSubmitButton: function () {\n const formElements = queryAll('.enable-form-validate');\n\n formElements.forEach(form => {\n const button = queryFirst('.enable-button-onvalidate', form);\n\n const callback = function () {\n if (this.validity.valid) {\n removeClass(this, 'is-invalid');\n } else {\n addClass(this, 'is-invalid');\n queryFirst('.invalid-feedback', this.closest('.form-group')).textContent = getValidationMessage.apply(this);\n }\n\n enableOrDisableButton(form);\n };\n\n const checkMatchedFields = function () {\n const { matchId } = this.dataset;\n const confirmEl = queryFirst(`.js-matched-confirm-field[type=${this.type}]`, form);\n let isFieldMatched = checkFieldsMatch(matchId, true, this);\n\n if (confirmEl && this.validity.valid) {\n if (isFieldMatched) {\n removeClass(confirmEl, 'is-invalid');\n } else {\n addClass(confirmEl, 'is-invalid');\n queryFirst('.invalid-feedback', confirmEl.closest('.form-group')).textContent = confirmEl.dataset.mismatchError;\n }\n }\n\n enableOrDisableButton(form);\n };\n\n const checkPasswordFields = function () {\n const selectorContainer = $('.valid-password-info li');\n const notMatchedClass = 'pwd-criteria-not-matched';\n const matchedClass = 'pwd-criteria-matched';\n\n if (this.validity.valid) {\n removeClass(this, 'is-invalid');\n selectorContainer.removeClass(notMatchedClass);\n selectorContainer.addClass(matchedClass);\n } else {\n const $this = $(this);\n const thisValue = $this.val();\n\n if (hasClass(form, 'change-password-form') && thisValue) {\n selectorContainer.each(function (i) {\n const item = selectorContainer[i];\n const regexPattern = item.dataset.regexpattern;\n const regexValue = new RegExp(regexPattern);\n if (regexValue.test(thisValue)) {\n removeClass(item, notMatchedClass);\n addClass(item, matchedClass);\n } else {\n removeClass(item, matchedClass);\n addClass(item, notMatchedClass);\n }\n });\n\n selectorContainer.closest('ul').addClass('padding-none');\n queryFirst('.invalid-feedback', this.closest('.form-group')).textContent = '';\n }\n }\n };\n\n if (form && button) {\n const $form = $(form);\n\n $form.find('input, textarea').on('blur', callback);\n $form.find('.js-matched-field').on('blur', checkMatchedFields);\n $form.find('#newPassword, #registration-form-password').on('keyup', checkPasswordFields);\n $form.find('select, input[type=\"radio\"], input[type=\"checkbox\"]').on('change', callback);\n $form.on('change', '.g-recaptcha-response', callback);\n }\n });\n },\n\n buttonClick: function () {\n $('form button[type=\"submit\"], form input[type=\"submit\"]').on('click', function () {\n // clear all errors when trying to submit the form\n if (!$('.reauth-payment-form').length) {\n clearForm($(this).parents('form'));\n }\n });\n },\n\n functions: {\n validateForm: function (form, event) {\n validateForm.call($(form), event || null);\n },\n validateInputs,\n clearForm,\n enableOrDisableButton,\n getValidationMessage\n }\n};\n","'use strict';\n\nconst { queryFirst, queryAll, addClass, removeClass, hasClass, debounce } = require('../domUtil');\n\nconst SCROLLABLE_CONTENT_SELECTOR = queryAll('.scrollable-content');\nconst LEFT_ARROW_SELECTOR = '.scroll-left-arrow';\nconst RIGHT_ARROW_SELECTOR = '.scroll-right-arrow';\n\n/**\n * Initialize the carousel.\n * @param {HTMLElement} scrollableContainerEl - The scrollable container element.\n */\nfunction initSpecificCarousel(scrollableContainerEl) {\n const parentEl = scrollableContainerEl.parentElement;\n\n // Attaching events on Left arrow click\n const leftArrowEl = queryFirst(LEFT_ARROW_SELECTOR, parentEl);\n if (leftArrowEl) {\n leftArrowEl.addEventListener('click', () => {\n scrollableContainerEl.scrollTo({\n left: Math.max(0, scrollableContainerEl.scrollLeft - scrollableContainerEl.offsetWidth),\n behavior: 'smooth'\n });\n });\n }\n\n // Attaching events on Right arrow click\n const rightArrowEl = queryFirst(RIGHT_ARROW_SELECTOR, parentEl);\n if (rightArrowEl) {\n rightArrowEl.addEventListener('click', () => {\n scrollableContainerEl.scrollTo({\n left: Math.min(scrollableContainerEl.scrollWidth, scrollableContainerEl.scrollLeft + scrollableContainerEl.offsetWidth),\n behavior: 'smooth'\n });\n });\n }\n\n // Hide left arrow on carousel initialization.\n addClass(leftArrowEl, 'hide');\n\n // Hide both the arrows, if the items are not scrollable.\n if (scrollableContainerEl.scrollWidth <= scrollableContainerEl.offsetWidth) {\n addClass(rightArrowEl, 'hide');\n } else {\n removeClass(rightArrowEl, 'hide');\n const callback = () => {\n const { scrollWidth, scrollLeft, offsetWidth } = scrollableContainerEl;\n const offsetValue = 5;\n if (scrollWidth - scrollLeft - offsetWidth < offsetValue) {\n // Hide the right arrow, if content is scrolled to right end.\n if (hasClass(leftArrowEl, 'hide')) {\n removeClass(leftArrowEl, 'hide');\n }\n if (!hasClass(rightArrowEl, 'hide')) {\n addClass(rightArrowEl, 'hide');\n }\n } else if (scrollLeft === 0) {\n // Hide the left arrow, if content is scrolled to left end.\n if (!hasClass(leftArrowEl, 'hide')) {\n addClass(leftArrowEl, 'hide');\n }\n if (hasClass(rightArrowEl, 'hide')) {\n removeClass(rightArrowEl, 'hide');\n }\n } else {\n // Display both the arrows, if content is scrolled neither of the ends.\n if (hasClass(leftArrowEl, 'hide')) {\n removeClass(leftArrowEl, 'hide');\n }\n if (hasClass(rightArrowEl, 'hide')) {\n removeClass(rightArrowEl, 'hide');\n }\n }\n };\n scrollableContainerEl.addEventListener('scroll', debounce(callback, 300));\n }\n}\n\nmodule.exports = {\n initCarousel: function() {\n SCROLLABLE_CONTENT_SELECTOR.forEach(scrollableContainerEl => {\n initSpecificCarousel(scrollableContainerEl);\n });\n },\n initSpecificCarousel: initSpecificCarousel\n};\n","/* global _etmc */\n'use strict';\n\nconst hasEtmc = typeof _etmc !== 'undefined';\n\n/**\n * Send trackCart event to SFMC\n * @param {Object} data data to send to SFMC\n */\nexport function trackCart(data) {\n if (hasEtmc && 'trackCart' in _etmc) {\n _etmc.trackCart(data);\n }\n}\n\n/**\n * Send trackPageView event to SFMC\n * @param {Object} data data to send to SFMC\n */\nexport function trackPageView(data) {\n if (hasEtmc && 'trackPageView' in _etmc) {\n _etmc.trackPageView(data);\n }\n}\n\n/**\n * Send trackWishlist event to SFMC\n * @param {Object} data data to send to SFMC\n */\nexport function trackWishlist(data) {\n if (hasEtmc && 'trackWishlist' in _etmc) {\n _etmc.trackWishlist(data);\n }\n}\n\n/**\n * Send setUserInfo event to SFMC\n * @param {Object} data data to send to SFMC\n */\nexport function setUserInfo(data) {\n if (hasEtmc && 'setUserInfo' in _etmc) {\n _etmc.setUserInfo(data);\n }\n}\n","'use strict';\n\nimport { queryFirst, queryAll, addClass, removeClass, remove, scrollTo, throttle } from '../domUtil';\n\nimport { initOnce, getNestedValue } from '../util';\n\nconst $window = $(window);\nconst $document = $(document);\nconst $body = $('body');\nconst activeClass = 'active';\n\nconst getOffsetTop = element => {\n let offsetTop = 0;\n while (element) {\n offsetTop += element.offsetTop;\n element = element.offsetParent;\n }\n return offsetTop;\n};\n\nconst handleDesktopCarousel = carousel => {\n let indicators = queryFirst('.image-slide-indicators', carousel);\n\n if (window.matchMedia('(min-width: 768px)').matches) {\n removeClass(carousel, 'slide');\n\n let slideItem = queryFirst('.slider-inner .slider-item:first-of-type', carousel);\n\n if (slideItem && indicators) {\n if (!slideItem.offsetHeight) {\n setTimeout(() => {\n slideItem = queryFirst('.slider-inner .slider-item:first-of-type', carousel);\n\n if (slideItem) {\n const slideIndicatorPosition = slideItem.offsetTop + (slideItem.offsetHeight - indicators.offsetHeight) / 2;\n\n indicators.style.top = slideIndicatorPosition + 'px';\n }\n }, 2400);\n } else {\n const slideIndicatorPosition = slideItem.offsetTop + (slideItem.offsetHeight - indicators.offsetHeight) / 2;\n\n indicators.style.top = slideIndicatorPosition + 'px';\n }\n }\n\n $(carousel).on('slide.bs.carousel', function (e) {\n e.preventDefault();\n\n const headerHeight = queryFirst('header.main-header').offsetHeight;\n\n scrollTo($(e.relatedTarget).offset().top - headerHeight);\n });\n } else {\n addClass(carousel, 'slide');\n\n if (indicators) {\n removeClass(indicators, 'position-fixed');\n indicators.style.top = '';\n }\n }\n};\n\nconst handleCarouselOnScroll = carousel => {\n let currentScrollPos = window.scrollY || window.pageYOffset;\n let ticking = false;\n\n const carouselIndicatorScroll = () => {\n ticking = false;\n if (window.matchMedia('(min-width: 768px)').matches) {\n const indicators = queryFirst('.image-slide-indicators', carousel);\n const sliderContainer = carousel.closest('.scrollable-product-item');\n const sliderContainerOffsetTop = getOffsetTop(sliderContainer);\n const sliderContainerOffsetEnd = sliderContainerOffsetTop + sliderContainer.offsetHeight - queryFirst('.slider-item', carousel).offsetHeight + indicators.offsetHeight / 2;\n if (sliderContainerOffsetTop < currentScrollPos && sliderContainerOffsetEnd >= currentScrollPos) {\n addClass(indicators, 'position-fixed');\n } else {\n removeClass(indicators, 'position-fixed');\n }\n\n const scrollDistance = -sliderContainer.getBoundingClientRect().top + 200;\n\n let activeIndex = 1;\n queryAll('.slider-item', carousel).some((el, i) => {\n if (el.offsetTop < scrollDistance && scrollDistance < el.offsetTop + el.offsetHeight) {\n activeIndex = i + 1;\n return true;\n }\n return false;\n });\n removeClass(queryAll('.slider-item', carousel), activeClass);\n removeClass(queryAll('.image-slide-indicators li', carousel), activeClass);\n addClass(queryFirst('.image-slide-indicators li:nth-child(' + activeIndex + ')', carousel), activeClass);\n addClass(queryFirst('.slider-item:nth-child(' + activeIndex + ')', carousel), activeClass);\n }\n };\n const requestTick = () => {\n if (!ticking) {\n requestAnimationFrame(carouselIndicatorScroll);\n }\n ticking = true;\n };\n const onScroll = () => {\n currentScrollPos = window.scrollY || window.pageYOffset;\n requestTick(carousel);\n };\n $window.scroll(onScroll);\n};\n\nconst initScrollSlider = carousels => {\n if (!Array.isArray(carousels)) {\n const array = [].slice.call(carousels, 0);\n carousels = array.length ? array : [carousels];\n }\n\n carousels.forEach(carousel => {\n if (queryFirst('.carousel-indicators:not(.jw-pdp)', carousel)) {\n handleDesktopCarousel(carousel);\n }\n\n initOnce(\n carousel,\n undefined,\n () => {\n if (queryFirst('.carousel-indicators:not(.jw-pdp)', carousel)) {\n handleCarouselOnScroll(carousel);\n }\n },\n 'scrollSlider'\n );\n });\n};\n\n$document.ready(function () {\n $('.carousel').each(function () {\n // Initilize carousel and stop swipe propagations only if slides count is more than 1\n if ($(this).find('.carousel-inner').length > 1) {\n $(this).carousel();\n }\n\n });\n if (window.matchMedia('(min-width: 768px)').matches) {\n $('.scrollable-product-item:not(.grid-product) .primary-images .carousel').carousel('dispose');\n }\n initScrollSlider(queryAll('.scrollable-product-item:not(.grid-product) .carousel'));\n\n $body.on('product:imageLoad', (e, response) => {\n let carousel = queryFirst('.carousel', response.container);\n const isScrollableProductItem = carousel && $(carousel).closest('.scrollable-product-item:not(.grid-product)').length;\n\n if (isScrollableProductItem) {\n let carouselIndicatorsElement = queryFirst('.carousel-indicators:not(.jw-pdp)', carousel);\n if (carouselIndicatorsElement) {\n addClass(carouselIndicatorsElement, 'image-slide-indicators');\n addClass(queryFirst('.carousel-inner', carousel), 'slider-inner');\n addClass(queryAll('.carousel-item', carousel), 'slider-item');\n remove(queryAll('.carousel > a'));\n initScrollSlider(carousel);\n }\n }\n });\n});\n\n$window.resize(\n throttle(() => {\n initScrollSlider(queryAll('.scrollable-product-item:not(.grid-product) .carousel'));\n const pdpCarouselEl = queryFirst('.pdp-container .carousel.image-slider');\n if (pdpCarouselEl) {\n pdpCarouselEl.style.minHeight = '';\n }\n })\n);\n\n/**\n * Fixes a bug in Safari 15 where swiping on images is very difficult\n * due to safari being overly sensitive to diagonal scrolling\n * Solution adapted from: http://web.archive.org/web/20220415194859/https://wpdevdesign.com/fixing-flickitys-issue-with-ios15-safari/\n */\nfunction initCarouselSwipeListener() {\n let isTouchingCarousel = false;\n let startCoord;\n\n document.addEventListener('touchstart', e => {\n isTouchingCarousel = !!e.target.closest('.carousel.image-slider');\n startCoord = getNestedValue(e, 'touches[0].pageX');\n });\n\n document.addEventListener('touchmove', e => {\n const currentCoord = getNestedValue(e, 'touches[0].pageX');\n const coordsAreNumbers = typeof startCoord === 'number' && typeof currentCoord === 'number';\n\n // don't do anything if the user isn't touching the carousel,\n // if the event isn't cancelable,\n // or if the user didn't scroll enough in the x direction (i.e. is scrolling vertically)\n if (!isTouchingCarousel || !e.cancelable || (coordsAreNumbers && Math.abs(currentCoord - startCoord) < 16)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }, { passive: false });\n}\n\ninitCarouselSwipeListener();","'use strict';\nconst { queryFirst, queryAll } = require('../domUtil');\nconst $body = $('body');\n\n// Code to close the nearest boostrap modal\n$(document).on('click', '.lp-slideout-modal .close-current-modal', function (event) {\n const currentModal = $(event.target).closest('.lp-slideout-modal');\n\n if (currentModal.length) {\n currentModal.modal('hide');\n }\n});\n\n// Code to stop scrolling behind the modal and modal moving issue in nested modal scenario\n$body.on('hidden.bs.modal', function () {\n if (queryFirst('.modal.show')) {\n $body.addClass('modal-open');\n } else {\n queryAll('.modal-backdrop').forEach(element => element.remove());\n $('html, body').css({ overflow: 'visible' });\n }\n});","'use strict';\n\nconst { queryFirst } = require('../domUtil');\nconst { NOT_AVAILABLE_STATUS, PREORDER_STATUS } = require('../constants');\nconst { PDPNarvarEDD } = window.johnnyWasUtils;\nconst isEDDEnabled = !!PDPNarvarEDD;\n\nconst EDD_INFO_SELECTOR = '.narvar-edd-info';\n\n/**\n * Function to inject Estimated delivery date message into its container\n * @param {HTMLElement} productContainerEl - Product container element\n */\nfunction injectEDDInfo(productContainerEl) {\n if (!isEDDEnabled || !productContainerEl) return;\n\n const eddEl = queryFirst(EDD_INFO_SELECTOR, productContainerEl);\n if (eddEl) eddEl.innerHTML = PDPNarvarEDD.estimatedDeliveryTime;\n}\n\n/**\n * Function to remove Estimated delivery date message from its container\n * @param {HTMLElement} productContainerEl - Product container element\n */\nfunction removeEDDInfo(productContainerEl) {\n if (!isEDDEnabled || !productContainerEl) return;\n\n const eddEl = queryFirst(EDD_INFO_SELECTOR, productContainerEl);\n if (eddEl) eddEl.textContent = '';\n}\n\n/**\n * Function to check if Estimated delivery messages to be displayed or not for that variant\n * @param {string} availabilityStatus - Product container element\n * @return {boolean} - if EDD is applicable for a variant, it returns true, else returns false\n */\nfunction isEDDApplicable(availabilityStatus) {\n return (availabilityStatus !== PREORDER_STATUS && availabilityStatus !== NOT_AVAILABLE_STATUS);\n}\n\nmodule.exports = {\n isEDDApplicable,\n injectEDDInfo,\n removeEDDInfo\n};\n","import { EventAccountRecognitionCheckPerformed } from './constant.js';\nimport { getISOCodeByLocale } from './util.js';\nconst { removeClass, queryFirst, addClass } = require('./domUtil');\nconst hiddenClass = 'd-none';\n\n/**\n * This function creates the Bolt component from embed.js,\n * mount it on the page and renders the OTP modal to do authentication & authorization with Bolt\n * @param {string} customerEmail - input email\n * @returns {Promise} - the returned promise waits for the user to enter the 6 digis OTP code\n */\nasync function authorize(customerEmail) {\n const boltPublishableKey = $('.bolt-publishable-key').val();\n const locale = $('.bolt-locale').val();\n\n const boltEmbedded = Bolt(boltPublishableKey, {\n language: getISOCodeByLocale(locale)\n });\n\n const authorizationComponent = boltEmbedded.create('authorization_component', { style: { position: 'right' } });\n if (customerEmail != null) {\n const containerToMount = $('#email-guest').parent().get(0); // there is only 1 occurance of $('#email-guest')\n containerToMount.classList.add('containerToMount');\n await authorizationComponent.mount('.containerToMount'); // mount on the div container otherwise the iframe won't render\n return authorizationComponent.authorize({ email: customerEmail });\n }\n // LP customization - Removing detect bolt auto login\n return false;\n}\n\n/**\n * Log the user into their bolt account\n * @param {string} email - input email\n * @returns {Promise} The returned promise to fetch account details\n */\nasync function login(email) {\n const authorizeResp = await authorize(email);\n $('.submit-customer').removeAttr('disabled'); // enable checkout button after OTP modal is rendered\n if (!authorizeResp) {\n // If the user closed the OTP modal then change the payment method to CREDIT_CARD if it is BOLT_PAY \n const checkoutContainer = queryFirst('.data-checkout-stage');\n if (checkoutContainer && ($('.payment-information').attr('data-payment-method-id') === 'BOLT_PAY')) {\n const creditCardContent = queryFirst('.credit-card-content');\n creditCardContent.id = 'credit-card-content';\n queryFirst('[data-method-id=\"CREDIT_CARD\"] a').click();\n removeClass(queryFirst('.credit-card-tab-list'), 'payment-options-hide');\n addClass(queryFirst('.bolt-pay-tab-list'), hiddenClass);\n }\n $('body').trigger('bolt:closeOtpModal');\n return;\n }\n const OAuthResp = await authenticateUserWithCode(\n authorizeResp.authorizationCode,\n authorizeResp.scope\n );\n return getAccountDetails(OAuthResp.accessToken); // eslint-disable-line consistent-return\n}\n\n/**\n * This function uses the authCode and scope returned from authorizeWithEmail\n * after the user enters the 6 digits OTP code\n * It makes a call to Bolt-FetchOAuthToken controller to fetch Oauth token & refresh token\n * @param {string} authCode - auth Code\n * @param {string} scope - scope, both params are returned from authorizeWithEmail\n * @returns {Object} - an Ajax call to fetch oAuth token\n */\nfunction authenticateUserWithCode(authCode, scope) {\n const authenticateUserUrl = $('.authenticate-bolt-user').val();\n const reqBody = {\n code: authCode,\n scope: scope\n };\n return $.ajax({\n url: authenticateUserUrl,\n method: 'GET',\n data: reqBody,\n error: function (jqXHR, error) {\n console.log(error);\n }\n });\n}\n\n/**\n * Get Account Details.\n * This function passes the Oauth token to bolt and retrieve the account details of a shopper\n * @param {string} oAuthToken - oAuth Token\n * @returns {Object} - an ajax call to fetch account details\n */\nfunction getAccountDetails(oAuthToken) {\n const accountDetailUrl = $('.get-bolt-account-details').val();\n const reqBody = {\n bearerToken: oAuthToken\n };\n $.spinner().start();\n return $.ajax({\n url: accountDetailUrl,\n method: 'GET',\n data: reqBody,\n success: function (data) {\n $('body').trigger('bolt:proceedOtpModal');\n // Remove the bolt logout cookie\n document.cookie = $('.bolt-cookie-name').val();\n window.location.href = data.redirectUrl;\n },\n error: function (jqXHR, error) {\n $.spinner().stop();\n console.log(error);\n }\n });\n}\n\n/**\n * Check Account And Fetch Detail\n * This function makes a call to bolt backend with the user email,\n * and log the user into their bolt account if the user has one\n * at the end of the login flow we redirect the user to the final page\n * where they can click place order so this function\n * doesn't return anything\n * @returns {void}\n */\nexport function checkAccountAndFetchDetail() {\n const emailInput = $('#email-guest');\n const customerEmail = emailInput.val();\n const checkBoltAccountUrl = $('.check-bolt-account-exist').val() + '=' + encodeURIComponent(customerEmail);\n const $accountCheckbox = $('#acct-checkbox');\n if ($accountCheckbox) {\n $accountCheckbox.show();\n }\n $.spinner().start();\n $.ajax({\n url: checkBoltAccountUrl,\n method: 'GET',\n success(data) {\n if (!data) return;\n if (data.has_bolt_account) {\n login(customerEmail);\n if ($accountCheckbox) {\n $('#acct-checkbox').hide();\n }\n } else {\n const boltCheckboxContainer = queryFirst('#acct-checkbox');\n if (boltCheckboxContainer) {\n $('body').trigger('bolt:createAccountCheckbox');\n }\n $('.submit-customer').removeAttr('disabled'); // enable checkout button for non Bolt shopper\n }\n $.spinner().stop();\n window.BoltAnalytics.checkoutStepComplete(EventAccountRecognitionCheckPerformed, { hasBoltAccount: data.has_bolt_account, detectionMethod: 'email' });\n },\n error: function (jqXHR, error) {\n $.spinner().stop();\n console.log(error);\n }\n });\n}\n\n/**\n * making an ajax call to sfcc backend to clear bolt account data\n */\nexport function logout() {\n const url = $('.data-bolt-platform-side-logout-url').val();\n $.ajax({\n url: url,\n method: 'POST',\n success: function (data) {\n if (data.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n },\n error: function (err) {\n if (err.responseJSON.message) {\n $('.error-message').show();\n $('.error-message-text').text(err.responseJSON.message);\n }\n }\n });\n}\n\n/**\n * LP customisation - Removing detect bolt auto login\n */\n// exports.detectAutoLogin = function () {\n// login(null);\n// };\n\n/**\n * Get cookie from browser\n * @param {string} cookieName - cookie name\n * @returns {string} cookie value\n */\nexport function getCookie(cookieName) {\n let name = cookieName + '=';\n let decodedCookie = decodeURIComponent(document.cookie);\n let ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i++) { // eslint-disable-line no-plusplus\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\n}\n","/**\n * OOTB SFRA JS code\n */\n\nimport base from '../product/base';\nimport { queryFirst, addClass, removeClass, queryAll, remove, emptyCart, hasClass, scrollTo, throttle } from '../domUtil';\nimport { appendToUrl, getJSON, formatMessage, getNestedValue } from '../util';\nimport { HIDDEN_CLASS, INVALID_CLASS } from '../constants';\nimport { trackCart } from '../components/etmc';\nconst { cart: cartTemplates, approachingDiscounts: approachingDiscountsTemplates, promo: promoTemplates, emptySFL: emptySFLTemplates } = require('../templates');\nconst checkoutContainer = queryFirst('.data-checkout-stage');\nconst formValidation = require('base/components/formValidation');\nconst displayFlex = 'd-flex';\nconst selectedTabClass = 'sfl-tabs-selected';\nconst $body = $('body');\nconst loyaltyVoucherApplied = 'applied-reward-bg';\nconst isMcEnable = $('#mcEnableAnalytics').val();\nimport { checkAccountAndFetchDetail } from 'bolt/bolt/account';\nconst registeredUserEmailEl = queryFirst('.registered-user-email');\nconst registeredUserEmail = registeredUserEmailEl ? registeredUserEmailEl.value : '';\nconst boltCheckoutAccountExistEl = queryFirst('.check-bolt-account-exist');\nconst invisible = 'invisible';\n\n/**\n * Displays cart error message\n * @param {string} message - Error message to display\n */\nfunction createErrorNotification(message) {\n const errorHtml = formatMessage(cartTemplates.errorMessage, message);\n $('.cart-container .cart-error')\n .empty()\n .append(errorHtml);\n}\n\n/**\n * Update the GWP HTML if contained in an ajax response\n * @param {Object} data The response data from an ajax call containing a 'gwpProductsHtml' attribute\n * @param {string} data.gwpProductsHtml The GWP HTML to insert\n */\nfunction updateGWP(data) {\n if ('gwpProductsHtml' in data) {\n $('.gwp-container-js, #checkout-main .gwp-container').html(data.gwpProductsHtml);\n }\n}\n\n/**\n * enable or disables the checkout button\n */\nfunction enableOrDisableCheckoutButton() {\n const checkoutButtonElement = queryFirst('.checkout-btn');\n if (!checkoutButtonElement) {\n return;\n }\n const expressCheckoutSection = queryFirst('.express-checkout-actions');\n const gwpProductsLength = queryAll('.gwp-option-bonus.product-info').length;\n const errorMessage = queryFirst('.cart-container .cart-error .cart-error-message');\n const chooseGwpMessage = queryFirst('.gwp-message');\n\n if (gwpProductsLength || errorMessage) {\n addClass(checkoutButtonElement, 'disabled');\n checkoutButtonElement.removeAttribute('href');\n addClass(expressCheckoutSection, HIDDEN_CLASS);\n } else {\n removeClass(checkoutButtonElement, 'disabled');\n checkoutButtonElement.setAttribute('href', checkoutButtonElement.dataset.href);\n const grandTotalVal = queryFirst('.grand-total-value.grand-total');\n const cartPage = queryFirst('.cart-page');\n if (grandTotalVal && cartPage && grandTotalVal.textContent === cartPage.dataset.zeroTotal) {\n addClass(expressCheckoutSection, HIDDEN_CLASS);\n } else {\n removeClass(expressCheckoutSection, HIDDEN_CLASS);\n }\n }\n\n if (chooseGwpMessage) {\n if (gwpProductsLength && !errorMessage) {\n removeClass(chooseGwpMessage, HIDDEN_CLASS);\n } else {\n addClass(chooseGwpMessage, HIDDEN_CLASS);\n }\n }\n\n if (checkoutButtonElement && !hasClass(checkoutButtonElement, 'disabled')) {\n const boltCheckoutCtaEl = queryFirst('.bolt-checkout-wrapper');\n const { isBoltEnable, isBoltUserLoggedIn } = checkoutButtonElement.dataset;\n addClass(boltCheckoutCtaEl, invisible);\n addClass(boltCheckoutCtaEl, HIDDEN_CLASS);\n if (isBoltEnable === 'true' && isBoltUserLoggedIn !== 'true' && registeredUserEmail && boltCheckoutAccountExistEl) {\n const checkBoltAccountUrl = boltCheckoutAccountExistEl.value + '=' + encodeURIComponent(registeredUserEmail);\n $.ajax({\n url: checkBoltAccountUrl,\n method: 'GET',\n success(data) {\n if (data && data.has_bolt_account) {\n removeClass(boltCheckoutCtaEl, HIDDEN_CLASS);\n removeClass(boltCheckoutCtaEl, invisible);\n }\n },\n error: function () { }\n });\n }\n }\n if (queryFirst('.line-item-availability .restricted-product-in-cart')) {\n addClass(checkoutButtonElement, 'disabled');\n }\n}\n\n/**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n if (data.valid.error) {\n if (data.valid.message) {\n createErrorNotification(data.valid.message);\n } else {\n emptyCart(data.resources.emptyCartMsg);\n $('.number-of-items').empty();\n $('.minicart-quantity')\n .empty()\n .append(data.numItems);\n $('.minicart .popover').empty();\n $('.minicart .popover').removeClass('show');\n }\n } else {\n const cartErrors = queryFirst('.cart-container .cart-error');\n if (cartErrors) {\n cartErrors.textContent = '';\n }\n }\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n\n const couponErrorMessage = queryFirst('.coupon-error-message');\n if (couponErrorMessage) {\n couponErrorMessage.textContent = '';\n }\n enableOrDisableCheckoutButton();\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n const { giftWrapQuantity, giftWrapTotalPrice, totals, giftWrapISPUTotalPrice, giftWrapISPUQuantity, numItems } = data;\n const giftWrapContainer = queryFirst('.gift-wrap-container');\n const giftWrapISPUContainer = queryFirst('.gift-wrap-ispu-container');\n const nonCouponContainer = queryFirst('.non-coupon-price-container');\n if (giftWrapContainer) {\n if (giftWrapQuantity > 0) {\n queryFirst('.gift-wrap-quantity', giftWrapContainer).textContent = giftWrapQuantity.toString();\n queryFirst('.gift-wrap-price', giftWrapContainer).textContent = giftWrapTotalPrice.toString();\n if (!hasClass(giftWrapContainer, displayFlex)) {\n removeClass(giftWrapContainer, HIDDEN_CLASS);\n addClass(giftWrapContainer, displayFlex);\n }\n } else {\n removeClass(giftWrapContainer, displayFlex);\n addClass(giftWrapContainer, HIDDEN_CLASS);\n }\n }\n if (giftWrapISPUContainer) {\n if (giftWrapISPUQuantity > 0) {\n const { freeprice } = giftWrapISPUContainer.dataset;\n queryFirst('.gift-wrap-ispu-quantity', giftWrapISPUContainer).textContent = giftWrapISPUQuantity.toString();\n queryFirst('.gift-wrap-ispu-price', giftWrapISPUContainer).textContent = giftWrapISPUTotalPrice.totalPrice == 0 ? freeprice : giftWrapISPUTotalPrice.formattedPrice.toString();\n if (!hasClass(giftWrapISPUContainer, displayFlex)) {\n removeClass(giftWrapISPUContainer, HIDDEN_CLASS);\n addClass(giftWrapISPUContainer, displayFlex);\n }\n } else {\n removeClass(giftWrapISPUContainer, displayFlex);\n addClass(giftWrapISPUContainer, HIDDEN_CLASS);\n }\n }\n const cartWithSFLCountTotal = queryFirst('.cart-items-count .item-count-tote');\n if (cartWithSFLCountTotal) {\n cartWithSFLCountTotal.textContent = numItems;\n }\n $('.number-of-items')\n .empty()\n .append(data.resources.numberOfItems);\n $('.grand-total')\n .empty()\n .append(data.totals.subTotal);\n $('.sub-total')\n .empty()\n .append(data.totals.totalAmount);\n $('.tax-total')\n .empty()\n .append(data.totals.totalTax);\n $('.minicart-quantity')\n .empty()\n .append(data.numItems);\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $('.order-discount').removeClass('hide-order-discount');\n $('.order-discount-total')\n .empty()\n .append('- ' + data.totals.orderLevelDiscountTotal.formatted);\n } else {\n $('.order-discount').addClass('hide-order-discount');\n }\n\n const cartErrors = queryAll('.cart-error');\n if (!data.valid.error) {\n addClass(cartErrors, HIDDEN_CLASS);\n } else {\n removeClass(cartErrors, HIDDEN_CLASS);\n }\n\n if (nonCouponContainer) {\n let nonCouponPromotionsHTML = '';\n if (totals.nonCouponBasedAdjustments && totals.nonCouponBasedAdjustments.length) {\n totals.nonCouponBasedAdjustments.forEach(function (couponItem) {\n nonCouponPromotionsHTML += formatMessage(approachingDiscountsTemplates.nonCouponBasedAdjustmentTemplate, couponItem.promoTitle, couponItem.discountPrice, couponItem.callOutMsg);\n });\n }\n nonCouponContainer.innerHTML = nonCouponPromotionsHTML;\n }\n\n data.items.forEach(function (item) {\n if (item.renderedPromotions) {\n $('.item-' + item.UUID)\n .empty()\n .append(item.renderedPromotions);\n }\n if (item.priceTotal && item.priceTotal.renderedPrice) {\n $('.item-total-' + item.UUID)\n .empty()\n .append(item.priceTotal.renderedPrice);\n $('.item-promo-total-' + item.UUID)\n .empty()\n .append(item.priceTotal.renderedPromoPrice);\n if (item.appliedPromotions) {\n $('.item-promo-total-' + item.UUID + ' .coupon-applied-price').removeClass('d-none');\n $('.item-promo-total-' + item.UUID + '.display-promotion-details .total-pricing').removeClass('d-none');\n $('.item-promo-total-' + item.UUID + '.display-promotion-details').addClass('d-flex');\n let promoMsg = ''\n let count = 0;\n item.appliedPromotions.forEach((promo) => {\n promoMsg += promo.callOutMsg;\n count++;\n });\n $('.item-promo-total-' + item.UUID + ' .coupon-applied-price .promo-call-out-msg')\n .empty()\n .append(promoMsg);\n } else {\n $('.item-promo-total-' + item.UUID + '.display-promotion-details .total-pricing').addClass('d-none');\n }\n }\n let finalSaleMessageContainer = queryAll('.sale-callout-msg-' + item.UUID);\n if (finalSaleMessageContainer && finalSaleMessageContainer.length > 0) {\n finalSaleMessageContainer.forEach((saleMsg) => {\n let finalSaleMsg = saleMsg.dataset.finalsalemsg;\n if (!hasClass(saleMsg, 'monogram-message')) {\n saleMsg.innerHTML = item.isFinalSale ? finalSaleMsg : '';\n }\n });\n\n }\n });\n}\n\n/**\n * re-renders the approaching discount messages\n * @param {Object} approachingDiscounts - updated approaching discounts for the cart\n * @param {Object} approachingDiscountsLabels - Approaching discount label description (contains show more / show less)\n */\nfunction updateApproachingDiscounts(approachingDiscounts, approachingDiscountsLabels) {\n let $approachingDiscountsEl = $('.approaching-discounts');\n if ((approachingDiscounts || []).length) {\n let html = '';\n let item = null;\n if (!$approachingDiscountsEl.length) {\n $('.discounts-section').append(approachingDiscountsTemplates.discountContainerTemplate);\n $approachingDiscountsEl = $('.approaching-discounts');\n } else {\n $approachingDiscountsEl.empty();\n }\n if (approachingDiscounts.length === 1) {\n item = approachingDiscounts[0].discountMsg;\n html += formatMessage(approachingDiscountsTemplates.singleDiscountTemplate, item);\n $approachingDiscountsEl.removeClass('multiple-approaching-discounts');\n } else if (approachingDiscounts.length > 1 && approachingDiscountsLabels) {\n item = approachingDiscounts[0].discountMsg;\n html += formatMessage(approachingDiscountsTemplates.singleDiscountTemplate, item);\n const remainingDiscounts = approachingDiscounts.slice(1, approachingDiscounts.length);\n let remainingDiscountsHtml = '';\n remainingDiscounts.forEach(function (discount) {\n remainingDiscountsHtml += formatMessage(approachingDiscountsTemplates.singleDiscountTemplate, discount.discountMsg);\n });\n html += formatMessage(approachingDiscountsTemplates.multipleDiscountsTemplate, remainingDiscountsHtml, approachingDiscountsLabels.showMore, approachingDiscountsLabels.showLess);\n $approachingDiscountsEl.addClass('multiple-approaching-discounts');\n }\n $approachingDiscountsEl.append(html);\n } else {\n $approachingDiscountsEl.remove();\n }\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n */\nfunction updateAvailability(data, uuid) {\n var lineItem;\n var messages = '';\n\n for (var i = 0; i < data.items.length; i++) {\n if (data.items[i].UUID === uuid) {\n lineItem = data.items[i];\n break;\n }\n }\n\n $('.availability-' + lineItem.UUID).empty();\n\n if (lineItem.availability) {\n if (lineItem.availability.messages) {\n lineItem.availability.messages.forEach(function (message) {\n messages += `

${message}

`;\n });\n }\n }\n\n $('.availability-' + lineItem.UUID).html(messages);\n}\n\n/**\n * Finds an element in the array that matches search parameter\n * @param {array} array - array of items to search\n * @param {function} match - function that takes an element and returns a boolean indicating if the match is made\n * @returns {Object|null} - returns an element of the array that matched the query.\n */\nfunction findItem(array, match) {\n for (var i = 0, l = array.length; i < l; i++) {\n if (match.call(this, array[i])) {\n return array[i];\n }\n }\n return null;\n}\n\n/**\n * Updates details of a product line item\n * @param {Object} data - AJAX response from the server\n * @param {string} uuid - The uuid of the product line item to update\n * @param {boolean} giftWrapAvailable - flag to check gift wrap applicability\n */\nfunction updateProductDetails(data, uuid, giftWrapAvailable) {\n var lineItem = findItem(data.cartModel.items, function (item) {\n return item.UUID === uuid;\n });\n\n if (lineItem.variationAttributes) {\n var colorAttr = findItem(lineItem.variationAttributes, function (attr) {\n return attr.attributeId === 'color';\n });\n\n if (colorAttr) {\n var colorSelector = '.Color-' + uuid;\n $(colorSelector)\n .find('.line-item-text')\n .text(colorAttr.displayValue);\n }\n\n var sizeAttr = findItem(lineItem.variationAttributes, function (attr) {\n return attr.attributeId === 'size';\n });\n\n if (sizeAttr) {\n var sizeSelector = '.Size-' + uuid;\n $(sizeSelector)\n .find('.line-item-text')\n .text(sizeAttr.displayValue);\n }\n\n const { newProductId } = data || {};\n if (newProductId) {\n const skuElement = queryFirst(`.sku-${uuid}`);\n const skuLabel = skuElement && skuElement.dataset.skuLabel;\n\n if (skuElement && skuLabel) {\n skuElement.textContent = `${skuLabel} ${newProductId}`;\n }\n }\n\n var imageSelector = '.card.product-info.uuid-' + uuid + ' .item-image > img';\n $(imageSelector).attr('src', lineItem.images.small[0].url);\n $(imageSelector).attr('srcset', lineItem.images.small[0].srcset);\n $(imageSelector).attr('alt', lineItem.images.small[0].alt);\n $(imageSelector).attr('title', lineItem.images.small[0].title);\n }\n\n if (lineItem.options && lineItem.options.length) {\n var option = lineItem.options[0];\n var optSelector = '.lineItem-options-values[data-option-id=\"' + option.optionId + '\"]';\n $(optSelector).attr('data-value-id', option.selectedValueId);\n $(optSelector + ' .line-item-attributes').text(option.displayName);\n }\n\n var qtySelector = '.quantity[data-uuid=\"' + uuid + '\"]';\n $(qtySelector).val(lineItem.quantity);\n $(qtySelector).data('pid', data.newProductId);\n\n $('.remove-product[data-uuid=\"' + uuid + '\"], .move-to-wishlist-' + uuid + ' a, .gift-wrap-input[data-uuid=\"' + uuid + '\"], .btn-in-store-pickup[data-uuid=\"' + uuid + '\"], .home-delivery-link[data-uuid=\"' + uuid + '\"], .quantity[data-uuid=\"' + uuid + '\"], .cart-product-line-item[data-uuid=\"' + uuid + '\"]').attr(\n 'data-pid',\n data.newProductId\n );\n const cartStoreLinksSelector = '.product-info.uuid-' + uuid + ' .cart-store-links';\n if (giftWrapAvailable === 'false') {\n $('.gift-wrap-input[data-uuid=\"' + uuid + '\"]').prop('checked', false);\n $(cartStoreLinksSelector + ' form').addClass(HIDDEN_CLASS);\n $(cartStoreLinksSelector + ' .seperator').addClass(HIDDEN_CLASS);\n } else if ($(cartStoreLinksSelector).closest('.cart-pickup-products').length === 0) {\n $(cartStoreLinksSelector + ' form').removeClass(HIDDEN_CLASS);\n $(cartStoreLinksSelector + ' .seperator').removeClass(HIDDEN_CLASS);\n }\n\n var priceSelector = '.line-item-price-' + uuid + ' .sales .value';\n\n if (lineItem.price && lineItem.price.sales) {\n $(priceSelector).text(lineItem.price.sales.formatted);\n $(priceSelector).attr('content', lineItem.price.sales.decimalPrice);\n }\n if (lineItem.price.list) {\n var listPriceSelector = '.line-item-price-' + uuid + ' .list .value';\n $(listPriceSelector).text(lineItem.price.list.formatted);\n $(listPriceSelector).attr('content', lineItem.price.list.decimalPrice);\n }\n\n if (lineItem.isGiftCard) {\n const { giftCardAmount } = lineItem;\n\n const giftCardHiddenAmountField = queryFirst(`.product-info.uuid-${uuid} .gift-card-amount`);\n if (giftCardHiddenAmountField) {\n giftCardHiddenAmountField.value = giftCardAmount;\n }\n\n queryAll(`.move-to-wishlist-${uuid} .move`).forEach(el => {\n el.dataset.giftCardAmount = giftCardAmount;\n });\n queryFirst(`.remove-product-${uuid}`).dataset.giftCardAmount = giftCardAmount;\n }\n}\n\n/**\n * This method sets the data of line item to be deleted in the delete confirmation modal\n * @param {string} actionUrl - url to be used to remove product\n * @param {string} productID - pid\n * @param {string} productName - product name\n * @param {string} uuid - uuid\n */\nfunction confirmDelete(actionUrl, productID, productName, uuid, tealium = '{}') {\n const deleteConfirmBtn = queryFirst('.cart-page .cart-delete-confirmation-btn');\n deleteConfirmBtn.dataset.pid = productID;\n deleteConfirmBtn.dataset.action = actionUrl;\n deleteConfirmBtn.dataset.uuid = uuid;\n deleteConfirmBtn.dataset.name = productName;\n deleteConfirmBtn.dataset.tealium = tealium;\n}\n\n/**\n * Lilly Customization changes start\n */\n\n/**\n * Update promo code details\n * @param {array} discounts - updated discounts data\n * @param {Object} shippingMethod - Shipping method detail object\n */\nfunction updatePromoCodeDetails(discounts, shippingMethod) {\n const promotionsListContainer = queryFirst('.promo-code-section');\n const cartShippingMethodContainer = queryFirst('.cart-shipping-method');\n const checkoutShippingMethodContainer = queryFirst('.shipping-method-price-container');\n const checkoutShippingMethodTitle = queryFirst('.shipping-method-title');\n let promotionsHtml = '';\n if (discounts && discounts.length) {\n const promoTemplate = document.getElementById('promo-code-details-template').cloneNode(true);\n const promoContainer = queryFirst('.price-container', promoTemplate);\n const promoText = queryFirst('.price-text', promoContainer);\n const promoTitle = promoText.dataset.promoTitle;\n const promoValue = queryFirst('.price-value', promoContainer);\n const description = queryFirst('.promo-description', promoContainer);\n discounts.forEach(eachDiscount => {\n if (eachDiscount.type === 'coupon' && eachDiscount.applied) {\n const couponData = eachDiscount.relationship;\n promoText.textContent = `${promoTitle} ${eachDiscount.couponCode}`;\n if (couponData && couponData.length) {\n promoValue.textContent = eachDiscount.totalPrice;\n description.textContent = couponData[0].callOutMsg;\n } else {\n promoValue.textContent = '';\n description.textContent = '';\n }\n promotionsHtml += promoTemplate.innerHTML;\n }\n });\n if (cartShippingMethodContainer) {\n if (shippingMethod && shippingMethod.isDiscounted) {\n cartShippingMethodContainer.innerHTML = formatMessage(promoTemplates.shippingMethod, shippingMethod.shippingLabel, shippingMethod.displayName, shippingMethod.shippingCost, shippingMethod.estimatedArrivalTime);\n } else {\n cartShippingMethodContainer.innerHTML = '';\n }\n }\n\n if (checkoutShippingMethodContainer) {\n if (shippingMethod && shippingMethod.isDiscounted) {\n checkoutShippingMethodContainer.innerHTML = formatMessage(promoTemplates.checkoutDiscountShipping, shippingMethod.shippingCost, shippingMethod.adjustedShippingCost);\n } else {\n checkoutShippingMethodContainer.innerHTML = formatMessage(promoTemplates.checkoutNormalShipping, shippingMethod.shippingCost);\n }\n }\n } else if (cartShippingMethodContainer) {\n cartShippingMethodContainer.innerHTML = '';\n } else if (checkoutShippingMethodContainer) {\n checkoutShippingMethodContainer.innerHTML = formatMessage(promoTemplates.checkoutNormalShipping, shippingMethod.shippingCost);\n }\n if (promotionsListContainer) {\n promotionsListContainer.innerHTML = promotionsHtml;\n }\n}\n\n/**\n * This function updates Form Object for Gift card values\n * @param {Object} formObject - object to edit to add gift card amount\n * @param {HTMLElement} formEl - form node to fetch gift card amount\n */\nfunction updateFormObjectForGiftCard(formObject, formEl) {\n const amountField = queryFirst('.gift-card-amount', formEl);\n\n if (amountField) {\n formObject.giftCardAmount = amountField.value;\n }\n}\n\n/**\n * updates the monogram elements on cart page\n * @param {Object} data - update quantity and remove from cart ajax response\n */\nfunction updateMonogramDetails(data) {\n const { monogramPrice, monogramQuantity } = data;\n const monogramContainer = queryFirst('.cart-totals .monogram-container');\n if (monogramContainer) {\n queryFirst('.price-value', monogramContainer).textContent = monogramPrice;\n\n queryFirst('.monogram-quantity', monogramContainer).textContent = monogramQuantity;\n if (!monogramQuantity) {\n addClass(monogramContainer, 'd-none');\n } else {\n removeClass(monogramContainer, 'd-none');\n }\n }\n}\n\n/**\n * toggle cart summary section in mobile and when tab switched from SFL to MY Tote and vice-versa\n */\nfunction hideShowSummarySection() {\n const sflTabElement = queryFirst('.save-for-later-tab');\n const sflCartElement = queryFirst('.cart-sfl-summary');\n const isCartEmpty = queryFirst('.js-cart-empty');\n const isSFLSelected = hasClass(sflTabElement, selectedTabClass);\n if (window.matchMedia('(max-width: 768px)').matches) {\n if (isSFLSelected) {\n addClass(sflCartElement, HIDDEN_CLASS);\n } else if (!isCartEmpty || hasClass(isCartEmpty, HIDDEN_CLASS)) {\n removeClass(sflCartElement, HIDDEN_CLASS);\n }\n }\n else if (!isCartEmpty || hasClass(isCartEmpty, HIDDEN_CLASS)) {\n removeClass(sflCartElement, HIDDEN_CLASS);\n }\n}\n/**\n * updates the Save for later on cart page\n * @param {Object} data - add product to tote from SFL cart ajax response\n */\nfunction updateSaveForLaterDetails(data) {\n const { saveForLaterHtml, sflCountMsg, count, isLoggedIn } = data;\n const sflProductElement = queryFirst('.sfl-cart-products');\n const sflTitleCount = queryFirst('.number-of-items-sfl');\n const signInSFLBottomEl = queryFirst('.sfl-login-wrapper');\n const moveAllToCartCTA = queryFirst('.move-all-items-to-tote');\n\n if (sflProductElement) {\n sflProductElement.innerHTML = saveForLaterHtml;\n }\n\n if (sflTitleCount) {\n sflTitleCount.textContent = sflCountMsg;\n }\n if (count === 0) {\n addClass([signInSFLBottomEl, moveAllToCartCTA], HIDDEN_CLASS);\n hideShowSummarySection();\n if (isLoggedIn) {\n const loginSFL = queryFirst('.sfl-login-btn');\n addClass(loginSFL, HIDDEN_CLASS);\n }\n }\n}\n/**\n * Updates the loyalty rewards and offers in cart and checkout page\n * @param {Object} summarySection - Rewards or Offers Section\n * @param {Object} couponData - data of the rewards or offers\n * @param {number} couponCount - count of redeemed rewards/offers\n * @param {string} couponPrice - total price of redeemed rewards/offers\n * @param {string} ctaClass - wrapper class for apply and remove CTAs in offers and rewards\n */\nfunction updateLoyaltyRewardsOffers(summarySection, couponData, couponCount, couponPrice, ctaClass) {\n if (couponCount) {\n removeClass(summarySection, HIDDEN_CLASS);\n const redeemedCouponCountEl = queryFirst('.loyalty-cart-reward-quantity', summarySection);\n const redeemedCouponPriceEl = queryFirst('.loyalty-cart-reward-price', summarySection);\n redeemedCouponCountEl.textContent = couponCount;\n redeemedCouponPriceEl.textContent = couponPrice;\n queryAll(ctaClass).forEach((el) => {\n const { voucherCode } = el.dataset;\n const removeCouponCta = queryFirst('.remove-voucher-tote-cta', el);\n const applyCouponCta = queryFirst('.apply-voucher-tote-cta', el);\n const couponCardEl = el.closest('.voucher-card-content');\n const matchingCoupon = couponData.find(voucher => voucher.code === voucherCode);\n if (matchingCoupon) {\n const { applied, UUID } = matchingCoupon;\n if (applied) {\n removeClass(removeCouponCta, HIDDEN_CLASS);\n addClass(applyCouponCta, HIDDEN_CLASS);\n addClass(couponCardEl, loyaltyVoucherApplied);\n el.dataset.uuid = UUID;\n } else {\n addClass(removeCouponCta, HIDDEN_CLASS);\n removeClass(applyCouponCta, HIDDEN_CLASS);\n removeClass(couponCardEl, loyaltyVoucherApplied);\n }\n }\n });\n } else {\n addClass(queryAll(`${ctaClass} .remove-voucher-tote-cta`), HIDDEN_CLASS);\n removeClass(queryAll(`${ctaClass} .apply-voucher-tote-cta`), HIDDEN_CLASS);\n addClass(summarySection, HIDDEN_CLASS);\n }\n}\n\n/**\n * updates the loyalty vouchers on cart page\n * @param {Object} data - add product to tote from SFL cart ajax response\n */\nfunction updateLoyaltyVouchers(data) {\n const { loyalty, subTotal } = data.totals;\n if (loyalty) {\n const { memberVouchers, memberOffers, redeemedVouchersCount, redeemedVoucherPrice, redeemedOffersCount, redeemedOffersPrice } = loyalty;\n const loyaltyVouchersSummarySection = queryFirst('.loyalty-cart-reward-section');\n const loyaltyOffersSummarySection = queryFirst('.loyalty-cart-offer-section');\n const applyVoucherCtas = queryAll('.apply-voucher-tote-cta');\n if (loyaltyVouchersSummarySection) {\n updateLoyaltyRewardsOffers(loyaltyVouchersSummarySection, memberVouchers, redeemedVouchersCount, redeemedVoucherPrice, '.js-vouchers-cta');\n }\n if (loyaltyOffersSummarySection) {\n updateLoyaltyRewardsOffers(loyaltyOffersSummarySection, memberOffers, redeemedOffersCount, redeemedOffersPrice, '.js-offers-cta');\n }\n applyVoucherCtas.forEach((applyCta) => {\n const voucherCardContentEl = applyCta.closest('.voucher-card-content');\n const voucherCardDisabledClass = 'voucher-card-disabled';\n if (subTotal === '$0' && !hasClass(applyCta, HIDDEN_CLASS)) {\n applyCta.disabled = true;\n addClass(voucherCardContentEl, voucherCardDisabledClass);\n } else {\n applyCta.disabled = false;\n removeClass(voucherCardContentEl, voucherCardDisabledClass);\n }\n });\n }\n}\n/**\n * Handle the spacing in Promo Section\n */\nfunction couponsAndPromotionSpacingHandle() {\n const promoAccordionEl = queryFirst('.promo-accordion-container');\n if (promoAccordionEl) {\n const couponsAndPromos = queryFirst('.coupons-and-promos', promoAccordionEl);\n const couponItems = queryFirst('.coupon-price-adjustment', couponsAndPromos);\n const couponCodeField = queryFirst('.coupon-code-field');\n const couponError = queryFirst('.coupon-error');\n if (!couponItems) {\n addClass(couponsAndPromos, 'mt-0');\n addClass(couponCodeField, 'mb-2');\n removeClass(couponError, 'mt-2');\n } else {\n const couponErrorMessageEl = queryFirst('.coupon-error-message');\n const couponMissingErrorEl = queryFirst('.coupon-missing-error');\n addClass(couponError, 'mt-2');\n removeClass(couponsAndPromos, 'mt-0');\n if (couponErrorMessageEl && !couponErrorMessageEl.textContent && couponMissingErrorEl && couponMissingErrorEl.style.display === 'none') {\n removeClass(couponCodeField, 'is-invalid');\n }\n removeClass(couponCodeField, 'mb-2');\n }\n }\n}\n\n/**\n * Get the account details for Bolt User\n * @param {string} checkoutUrl - URL to redirect to Checkout page if error comes from the API call\n */\nfunction fetchBoltAccountDetails(checkoutUrl) {\n const accountDetailUrl = queryFirst('.get-bolt-account-details').value;\n $.ajax({\n url: accountDetailUrl,\n method: 'GET',\n success: function ({ success, redirectUrl }) {\n //Remove the bolt logout cookie\n document.cookie = $('.bolt-cookie-name').val();\n window.location.href = (success && redirectUrl) || checkoutUrl;\n },\n error: function () {\n window.location.href = checkoutUrl;\n }\n });\n}\n/**\n * Lilly Customization changes end\n */\n\n/**\n * Initializes the event handlers\n */\nfunction init() {\n $(document).on('click', '.cart-nav-list.save-for-later-tab, .see-items-sfl', function (e) {\n const sflTab = queryFirst('.cart-nav-list.save-for-later-tab');\n if (!hasClass(sflTab, selectedTabClass)) {\n const myToteTab = queryFirst('.cart-nav-list.my-tote-tab');\n let toTab = 'saved for later';\n removeClass(myToteTab, selectedTabClass);\n addClass(sflTab, selectedTabClass);\n hideShowSummarySection();\n const queryParam = { view: 'saved' };\n const cartUrl = location.href;\n const urlWithParam = appendToUrl(cartUrl, queryParam);\n if (hasClass(this, 'js-see-items-sfl')) {\n const selectSFLTab = queryFirst('.js-save-for-later-select');\n const selectSFLContent = queryFirst('#saveForLater');\n const selectedMyToteTab = queryFirst('.js-my-tote-selected');\n const selectedMyToteContent = queryFirst('#myTote');\n removeClass([selectedMyToteTab, selectedMyToteContent], 'active');\n addClass([selectSFLTab, selectSFLContent], 'active');\n scrollTo($body.offset().top, 0);\n toTab += ': see items';\n }\n history.replaceState({}, '', urlWithParam);\n $(document).trigger('tote:selectTab', { fromTab: 'my tote', toTab });\n }\n });\n\n $(document).on('click', '.cart-nav-list.my-tote-tab', function (e) {\n if (!hasClass(this, selectedTabClass)) {\n const safeForLaterTab = queryFirst('.cart-nav-list.save-for-later-tab');\n removeClass(safeForLaterTab, selectedTabClass);\n addClass(this, selectedTabClass);\n hideShowSummarySection();\n history.replaceState({}, '', location.href.split('?')[0]);\n $body.trigger('tote:selectTab', { fromTab: 'saved for later', toTab: 'my tote' });\n }\n });\n\n $(document).on('click', '.move-to-sfl', function (e) {\n e.preventDefault();\n $.spinner().start();\n const { href, actionUrl, pid, quantity, name, uuid, isGiftCard, isMonogram, giftCardAmount, monogramColor, monogramLocation, monogramStyle,\n monogramLetter1, monogramLetter2, monogramLetter3, monogramInitials, giftCardRecipientEmail, giftCardRecipientName, giftCardSenderName, giftCardEmailMessage } = this.dataset;\n const monogramOptions = {\n itemPersonalizationColor: monogramColor,\n itemPersonalizationLocation: monogramLocation,\n itemPersonalizationLetterStyle: monogramStyle,\n itemPersonalizationLetter1: monogramLetter1,\n itemPersonalizationLetter2: monogramLetter2,\n itemPersonalizationLetter3: monogramLetter3,\n itemPersonalizationLetters: monogramInitials\n }\n\n const form = {\n pid,\n qty: quantity,\n isGiftCard,\n isMonogram,\n giftCardAmount,\n monogramOptions: JSON.stringify(monogramOptions),\n giftCardRecipientEmail,\n giftCardRecipientName,\n giftCardSenderName,\n giftCardEmailMessage\n };\n $.ajax({\n url: href,\n type: 'post',\n data: form,\n dataType: 'json',\n success: function (data) {\n if (data.success) {\n const { count, isLoggedIn } = data;\n const sflTitle = queryFirst('.sfl-title');\n const signInSFLBottomWrapperEl = queryFirst('.sfl-login-wrapper');\n const signInSFLBottomEl = queryFirst('.sfl-sign-in');\n const sflsubheader = queryFirst('.save-for-later-subheader');\n const moveAllToCartCTA = queryFirst('.move-all-items-to-tote');\n const lineItemDivider = queryFirst('.line-item-divider');\n confirmDelete(actionUrl, pid, name, uuid);\n $('.cart-page .cart-delete-confirmation-btn').trigger('click');\n if (count !== 0) {\n if (!isLoggedIn) {\n removeClass([signInSFLBottomEl, signInSFLBottomWrapperEl], HIDDEN_CLASS);\n }\n }\n }\n else {\n $.spinner().stop();\n }\n },\n error: function (err) {\n $.spinner().stop();\n }\n });\n });\n\n $(document).on('click', '.remove-sfl-product', function (e) {\n e.preventDefault();\n const { action, pid, name, uuid, quantity } = this.dataset;\n const url = appendToUrl(action, { pid, uuid, qty: quantity });\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $.spinner().stop();\n if (data.success) {\n const { count, emptySFLMsg, continueShopURL, continueShopMsg, signInMsg, isLoggedIn, signInSFLURL } = data;\n const signInSFLBottomEl = queryFirst('.sfl-login-wrapper');\n const itemsCountSFL = queryFirst('.cart-items-count .item-count-sfl');\n const numberItemsSFL = queryFirst('.number-of-items-sfl');\n const removedSFLProductCard = queryFirst('.sfl-product-info.uuid-' + uuid);\n itemsCountSFL.textContent = count;\n numberItemsSFL.textContent = count;\n removedSFLProductCard.remove();\n if (count === 0) {\n const moveAllToCartCTA = queryFirst('.move-all-items-to-tote');\n const sflProductCardItems = queryFirst('.sfl-cart-products');\n addClass(moveAllToCartCTA, HIDDEN_CLASS);\n const emptySFLMarkup = emptySFLTemplates(emptySFLMsg, continueShopURL, continueShopMsg, signInMsg, signInSFLURL);\n sflProductCardItems.outerHTML = emptySFLMarkup;\n const loginSFLBtn = queryFirst('.sfl-empty .sfl-login-btn');\n if (isLoggedIn) {\n addClass(loginSFLBtn, HIDDEN_CLASS);\n }\n else {\n addClass(signInSFLBottomEl, HIDDEN_CLASS);\n removeClass(loginSFLBtn, HIDDEN_CLASS);\n }\n }\n }\n },\n error: function (err) {\n $.spinner().stop();\n }\n });\n confirmDelete(action, pid, name, uuid);\n });\n\n $(document).on('click', '.remove-product', function (e) {\n e.preventDefault();\n const { action, pid, name, uuid, tealium } = this.dataset;\n confirmDelete(action, pid, name, uuid, tealium);\n });\n\n $body.on('afterRemoveFromCart', function (e, data) {\n e.preventDefault();\n const { actionUrl, productID, productName, uuid } = data;\n confirmDelete(actionUrl, productID, productName, uuid);\n });\n\n $('.cart-container, .mini-cart-container').on('cart:updateTotals', function (e, data) {\n const { basket } = data;\n const { bonusProductLineItems } = basket;\n updateCartTotals(basket, true);\n if (bonusProductLineItems) {\n const { nonOptionBonusProducts = [], hasOptionBonusProducts } = bonusProductLineItems;\n\n const hasNonOptionsBonusProducts = !!nonOptionBonusProducts.length;\n const hasBonusProduct = hasNonOptionsBonusProducts || hasOptionBonusProducts;\n\n if (!hasNonOptionsBonusProducts) {\n remove(queryAll('.gwp-no-option-bonus'));\n }\n\n if (!hasOptionBonusProducts) {\n remove(queryAll('.gwp-option-bonus'));\n }\n\n if (!hasBonusProduct) {\n remove(queryAll('.gwp-container'));\n }\n }\n enableOrDisableCheckoutButton();\n });\n\n $(document).on('click', '.cart-page .cart-delete-confirmation-btn', function (e) {\n e.preventDefault();\n const { target } = e;\n const { pid, action, uuid } = target.dataset;\n const urlParams = { pid, uuid };\n const url = appendToUrl(action, urlParams);\n const cartProductCard = queryFirst('.card.product-info.uuid-' + uuid);\n const storePickupGroupElement = cartProductCard.closest('.store-pickup-group');\n const cartShipProductsEl = cartProductCard.closest('.cart-ship-products');\n $('body > .modal-backdrop').remove();\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n updateGWP(data);\n const { saveForLater, isSFLEnabled, basket, saveForLaterHtml } = data;\n if (isSFLEnabled) {\n const productCountSFL = saveForLater.count || 0;\n const cartSummaryEl = queryFirst('.cart-sfl-summary');\n const cartWithSFLItemsTotal = queryFirst('.cart-items-count .item-count-tote');\n if (cartWithSFLItemsTotal) {\n cartWithSFLItemsTotal.textContent = basket.numItems;\n }\n $('.cart-items-count .item-count-sfl')\n .empty()\n .append(productCountSFL);\n $('.number-of-items-sfl')\n .empty()\n .append(productCountSFL);\n if (basket.items.length === 0) {\n addClass(cartSummaryEl, HIDDEN_CLASS);\n }\n else {\n removeClass(cartSummaryEl, HIDDEN_CLASS);\n }\n\n if (saveForLater && getNestedValue(saveForLater, 'items.length')) {\n const sflCartProducts = queryFirst('.sfl-cart-products');\n if (sflCartProducts) {\n sflCartProducts.innerHTML = saveForLaterHtml;\n }\n }\n }\n if (basket.items.length === 0) {\n if (isSFLEnabled) {\n const emptyCartWithSFLElement = queryFirst('.js-cart-container .js-cart-empty');\n const cartWithSFLElement = queryFirst('.js-cart-container .js-cart-with-items');\n removeClass(emptyCartWithSFLElement, HIDDEN_CLASS);\n addClass(cartWithSFLElement, HIDDEN_CLASS);\n }\n else {\n emptyCart(basket.resources.emptyCartMsg);\n }\n $('.number-of-items').empty();\n $('.minicart-quantity')\n .empty()\n .append(data.basket.numItems);\n $('.minicart-link').attr({\n 'aria-label': data.basket.resources.minicartCountOfItems,\n title: data.basket.resources.minicartCountOfItems\n });\n } else {\n if (data.toBeDeletedUUIDs && data.toBeDeletedUUIDs.length > 0) {\n for (var i = 0; i < data.toBeDeletedUUIDs.length; i++) {\n $('.uuid-' + data.toBeDeletedUUIDs[i]).remove();\n }\n }\n $('.uuid-' + uuid).remove();\n $('.coupons-and-promos')\n .empty()\n .append(data.basket.totals.discountsHtml);\n updatePromoCodeDetails(data.basket.totals.discounts, data.basket.selectedShippingMethod);\n updateCartTotals(data.basket);\n updateLoyaltyVouchers(data.basket);\n updateApproachingDiscounts(data.basket.approachingDiscounts, data.basket.approachingDiscountsLabels);\n const { updatedStoreQuantity, storeGroupMessage, enablePayPal } = data.basket;\n if (cartShipProductsEl && !queryFirst('.cart-product-line-item', cartShipProductsEl)) {\n cartShipProductsEl.remove();\n }\n\n const paypalContainerEl = queryFirst('.checkout-continue');\n if (paypalContainerEl) {\n if (enablePayPal) {\n removeClass(paypalContainerEl, HIDDEN_CLASS);\n } else {\n addClass(paypalContainerEl, HIDDEN_CLASS);\n }\n }\n\n if (storePickupGroupElement && updatedStoreQuantity && storeGroupMessage) {\n const storeGroupMessageElement = queryFirst('.store-product-items-message', storePickupGroupElement);\n if (storeGroupMessageElement) {\n storeGroupMessageElement.textContent = storeGroupMessage;\n }\n } else if (storePickupGroupElement) {\n storePickupGroupElement.remove();\n }\n\n if (data.basket.inStoreProductLineItems && !data.basket.inStoreProductLineItems.length) {\n addClass(queryFirst('.cart-pickup-products'), HIDDEN_CLASS);\n addClass(queryFirst('.mini-cart-store-title'), HIDDEN_CLASS);\n }\n $body.trigger('setShippingMethodSelection', data.basket);\n\n $('.cart-container, .mini-cart-container').trigger('cart:updateTotals', data);\n validateBasket(data.basket);\n updateMonogramDetails(data.basket);\n }\n\n $body.trigger('cart:update');\n const applePayButton = queryFirst('.dw-apple-pay-button');\n if (data.basket.enableApplePay) {\n removeClass(applePayButton, HIDDEN_CLASS);\n } else {\n addClass(applePayButton, HIDDEN_CLASS);\n }\n\n if (isMcEnable === 'true') {\n // update Marketing Cloud Analytics trackCart event\n trackCart(data.mcAnalyticsArray);\n }\n\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n\n $(document).on('change', '.quantity-form > .quantity', function () {\n const self = this;\n const $this = $(self);\n var preSelectQty = $this.data('pre-select-qty');\n var quantity = $this.val();\n var productID = $this.data('pid');\n var url = $this.data('action');\n var uuid = $this.data('uuid');\n const storeId = $this.data('store-id');\n const cartProductCard = queryFirst('.card.product-info.uuid-' + uuid);\n const storePickupGroupElement = cartProductCard.closest('.store-pickup-group');\n var urlParams = {\n pid: productID,\n quantity: quantity,\n uuid: uuid,\n storeId\n };\n url = appendToUrl(url, urlParams);\n const origPositionY = document.defaultView.scrollY;\n $this\n .parents('.card')\n .spinner()\n .start();\n\n $.ajax({\n url: url,\n type: 'get',\n context: this,\n dataType: 'json',\n success: function (data) {\n if (data.error) {\n const { lineItemErrorMessage } = data;\n const availabilityFlashMessageEl = queryFirst('.availability-flash-message', cartProductCard);\n if (lineItemErrorMessage && availabilityFlashMessageEl) {\n removeClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n availabilityFlashMessageEl.textContent = lineItemErrorMessage;\n setTimeout(() => {\n addClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n }, 10000);\n $(this).val(parseInt(preSelectQty, 10));\n }\n $.spinner().stop();\n } else {\n $('.quantity[data-uuid=\"' + uuid + '\"]').val(quantity);\n const { updatedStoreQuantity, storeGroupMessage, cartProductsHtml } = data;\n if (storePickupGroupElement && updatedStoreQuantity && storeGroupMessage) {\n const storeGroupMessageElement = queryFirst('.store-product-items-message', storePickupGroupElement);\n if (storeGroupMessageElement) {\n storeGroupMessageElement.textContent = storeGroupMessage;\n }\n }\n const lineItem = data.items.find(element => element.UUID === uuid);\n if (lineItem && !storePickupGroupElement) {\n const { giftWrapAvailableFlag, hasGiftWrap } = lineItem;\n const cartStoreLinksSelector = '.product-info.uuid-' + uuid + ' .cart-store-links';\n if (!giftWrapAvailableFlag) {\n $('.gift-wrap-input[data-uuid=\"' + uuid + '\"]').prop('checked', false);\n $(cartStoreLinksSelector + ' form').addClass(HIDDEN_CLASS);\n $(cartStoreLinksSelector + ' .seperator').addClass(HIDDEN_CLASS);\n } else {\n $('.gift-wrap-input[data-uuid=\"' + uuid + '\"]').prop('checked', hasGiftWrap);\n $(cartStoreLinksSelector + ' form').removeClass(HIDDEN_CLASS);\n $(cartStoreLinksSelector + ' .seperator').removeClass(HIDDEN_CLASS);\n }\n }\n $('.coupons-and-promos')\n .empty()\n .append(data.totals.discountsHtml);\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n updateCartTotals(data);\n updateLoyaltyVouchers(data);\n updateApproachingDiscounts(data.approachingDiscounts, data.approachingDiscountsLabels);\n queryFirst('.cart-products').innerHTML = cartProductsHtml;\n updateGWP(data);\n updateMonogramDetails(data);\n validateBasket(data);\n\n $body.trigger('cart:update');\n\n if (isMcEnable === 'true') {\n // update Marketing Cloud Analytics trackCart event\n trackCart(data.mcAnalyticsArray);\n }\n\n $.spinner().stop();\n document.defaultView.scrollTo(null, origPositionY);\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n const { errorMessage } = err.responseJSON;\n createErrorNotification(errorMessage);\n $(this).val(parseInt(preSelectQty, 10));\n $.spinner().stop();\n }\n }\n });\n });\n\n $(document).on('click', '.apply-voucher-tote-cta', function (e) {\n e.preventDefault();\n const applyRewardEl = this;\n const voucherCardEl = this.closest('.voucher-card-content');\n const removeRewardEl = queryFirst('.remove-voucher-tote-cta', voucherCardEl);\n const { couponCode } = voucherCardEl.dataset;\n const csrfTokenInput = queryFirst('.csrf-token', voucherCardEl);\n let csrfToken;\n if (csrfTokenInput) {\n csrfToken = csrfTokenInput.value;\n }\n $.spinner().start();\n $.ajax({\n url: this.dataset.action,\n type: 'POST',\n dataType: 'json',\n data: { csrf_token: csrfToken, couponCode },\n success: function (data) {\n if (data.error) {\n const promoCodeFormControlEl = queryFirst('.promo-code-form .form-control');\n addClass(promoCodeFormControlEl, INVALID_CLASS);\n promoCodeFormControlEl.setAttribute('aria-describedby', 'invalidCouponCode');\n $('.coupon-missing-error').hide();\n couponsAndPromotionSpacingHandle();\n $(queryFirst('.coupon-error-message'))\n .empty()\n .append(data.errorMessage);\n $.spinner().stop();\n } else {\n const { loyalty, discounts } = data.totals;\n if (loyalty && (loyalty.redeemedVouchersCount || loyalty.redeemedOffersCount)) {\n addClass(applyRewardEl, HIDDEN_CLASS);\n removeClass(removeRewardEl, HIDDEN_CLASS);\n addClass(voucherCardEl, loyaltyVoucherApplied);\n const { memberVouchers, memberOffers } = loyalty;\n const voucherCardCtaEl = applyRewardEl.closest('.js-vouchers-cta');\n const offerCardCtaEl = applyRewardEl.closest('.js-offers-cta');\n if (voucherCardCtaEl) {\n const { voucherCode } = voucherCardCtaEl.dataset;\n memberVouchers.forEach(voucher => {\n const { applied, code } = voucher;\n if (applied && code === voucherCode) {\n voucherCardCtaEl.dataset.uuid = voucher.UUID;\n }\n });\n }\n if (offerCardCtaEl) {\n const { voucherCode } = offerCardCtaEl.dataset;\n memberOffers.forEach(offer => {\n const { applied, code } = offer;\n if (applied && code === voucherCode) {\n offerCardCtaEl.dataset.uuid = offer.UUID;\n }\n });\n }\n updateLoyaltyVouchers(data);\n if (discounts) {\n updateGWP(data);\n updatePromoCodeDetails(discounts, data.selectedShippingMethod);\n }\n updateCartTotals(data);\n if (!checkoutContainer) {\n updateApproachingDiscounts(data.approachingDiscounts, data.approachingDiscountsLabels);\n validateBasket(data);\n } else {\n $(checkoutContainer).trigger('coupon-update', data).trigger('togglePaymentMethods', data);\n }\n }\n $.spinner().stop();\n }\n },\n error: function (err) {\n if (err.responseJSON && err.responseJSON.csrfError) {\n $body.trigger('csrf:error');\n } else {\n createErrorNotification(err.errorMessage);\n }\n $.spinner().stop();\n }\n });\n });\n\n $(document).on('click', '.remove-voucher-tote-cta', function (e) {\n e.preventDefault();\n const removeRewardEl = this;\n const voucherCardEl = this.closest('.voucher-card-content');\n const voucherCardCtaEl = queryFirst('.js-vouchers-cta', voucherCardEl);\n const offerCardCtaEl = queryFirst('.js-offers-cta', voucherCardEl);\n const applyRewardEl = queryFirst('.apply-voucher-tote-cta', voucherCardEl);\n const { action } = this.dataset;\n const { uuid, voucherCode } = voucherCardCtaEl ? voucherCardCtaEl.dataset : offerCardCtaEl.dataset;\n const url = appendToUrl(action, { code: voucherCode, uuid });\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n const { discounts } = data.totals;\n addClass(removeRewardEl, HIDDEN_CLASS);\n removeClass(applyRewardEl, HIDDEN_CLASS);\n removeClass(voucherCardEl, loyaltyVoucherApplied);\n updateLoyaltyVouchers(data);\n updateGWP(data);\n updateCartTotals(data);\n if (discounts) {\n updatePromoCodeDetails(discounts, data.selectedShippingMethod);\n if (!checkoutContainer) {\n updateApproachingDiscounts(data.approachingDiscounts, data.approachingDiscountsLabels);\n validateBasket(data);\n } else {\n $(checkoutContainer).trigger('coupon-update', data).trigger('togglePaymentMethods', data);\n }\n $('.coupons-and-promos')\n .empty()\n .append(data.totals.discountsHtml);\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n $.spinner().stop();\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n\n $('.promo-code-form').submit(function (e) {\n e.preventDefault();\n $.spinner().start();\n $('.coupon-missing-error').hide();\n $('.coupon-error-message').empty();\n if (!$('.coupon-code-field').val()) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'missingCouponCode');\n $('.coupon-missing-error').show();\n couponsAndPromotionSpacingHandle();\n $.spinner().stop();\n return false;\n }\n var $form = $('.promo-code-form');\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n\n $.ajax({\n url: $form.attr('action'),\n type: 'POST',\n dataType: 'json',\n data: $form.serialize(),\n success: function (data) {\n $('body').trigger('submitPromocode');\n queryFirst('.coupon-code-field').value = '';\n if (data.error) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message')\n .empty()\n .append(data.errorMessage);\n } else {\n updateGWP(data);\n $('.coupons-and-promos')\n .empty()\n .append(data.totals.discountsHtml);\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n updateCartTotals(data);\n updateLoyaltyVouchers(data);\n if (!checkoutContainer) {\n updateApproachingDiscounts(data.approachingDiscounts, data.approachingDiscountsLabels);\n validateBasket(data);\n } else {\n $(checkoutContainer).trigger('coupon-update', data).trigger('togglePaymentMethods', data);\n }\n }\n if (!checkoutContainer) {\n $('.cart-container').trigger('add-coupon', data);\n } else {\n $(checkoutContainer).trigger('add-coupon', data);\n }\n couponsAndPromotionSpacingHandle();\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON && err.responseJSON.csrfError) {\n $body.trigger('csrf:error');\n } else {\n createErrorNotification(err.errorMessage);\n }\n $.spinner().stop();\n }\n });\n return false;\n });\n\n $(document).on('click', '.delete-coupon-confirmation-btn', function (e) {\n e.preventDefault();\n\n var url = $(this).data('action');\n var uuid = $(this).data('uuid');\n var couponCode = $(this).data('code');\n var urlParams = {\n code: couponCode,\n uuid: uuid\n };\n\n url = appendToUrl(url, urlParams);\n\n $('body > .modal-backdrop').remove();\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n updateGWP(data);\n $('.coupon-uuid-' + uuid).remove();\n updateCartTotals(data);\n if (!checkoutContainer) {\n updateApproachingDiscounts(data.approachingDiscounts, data.approachingDiscountsLabels);\n validateBasket(data);\n } else {\n $(checkoutContainer).trigger('coupon-update', data).trigger('togglePaymentMethods', data);\n }\n $('.coupons-and-promos')\n .empty()\n .append(data.totals.discountsHtml);\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n updateLoyaltyVouchers(data);\n couponsAndPromotionSpacingHandle();\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n\n $(document).on('click', '.cart-page .bonus-product-button', function (event) {\n event.stopPropagation();\n $.spinner().start();\n $(this).addClass('launched-modal');\n $.ajax({\n url: $(this).data('url'),\n method: 'GET',\n dataType: 'json',\n success: function (data) {\n base.methods.editBonusProducts(data);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n\n $(document).on('click', '.move-product-to-tote .move-sfl, .move-all-to-tote', function (event) {\n event.preventDefault();\n const self = this;\n const $this = $(self);\n const {\n qtyValue: quantity,\n pid: productID,\n action: url,\n uuid,\n isGiftCard,\n isMonogram: hasMonogram\n } = self.dataset;\n const cartProductCard = queryFirst(`.card.product-info.uuid${uuid ? '-' + uuid : ''}`);\n const storePickupGroupElement = uuid ? cartProductCard.closest('.store-pickup-group') : queryFirst('.store-pickup-group');\n const urlParams = {};\n if (productID) {\n urlParams.pid = productID;\n }\n if (quantity) {\n urlParams.qty = parseInt(quantity);\n }\n if (uuid) {\n urlParams.uuid = uuid;\n }\n if (isGiftCard) {\n urlParams.isGiftCard = isGiftCard;\n }\n if (hasMonogram) {\n urlParams.isMonogram = hasMonogram;\n }\n const origPositionY = self.getBoundingClientRect().y;\n if (hasClass(self, 'move-sfl')) {\n $this\n .parents('.card')\n .spinner()\n .start();\n }\n else {\n $.spinner().start();\n }\n $.ajax({\n url: url,\n type: 'post',\n data: urlParams,\n dataType: 'json',\n success: function (data) {\n if (data.error) {\n const { lineItemErrorMessage } = data;\n const availabilityFlashMessageEl = queryFirst('.availability-flash-message', cartProductCard);\n if (lineItemErrorMessage && availabilityFlashMessageEl) {\n removeClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n availabilityFlashMessageEl.textContent = lineItemErrorMessage;\n }\n $.spinner().stop();\n } else {\n const emptyCartWithSFLElement = queryFirst('.js-cart-container .js-cart-empty');\n const cartWithSFLElement = queryFirst('.js-cart-container .js-cart-with-items');\n addClass(emptyCartWithSFLElement, HIDDEN_CLASS);\n removeClass(cartWithSFLElement, HIDDEN_CLASS);\n const { cartModel, count, toteCount } = data;\n const { updatedStoreQuantity, storeGroupMessage, cartProductsHtml } = cartModel;\n queryFirst('.cart-items-count .item-count-sfl').textContent = count;\n queryFirst('.cart-items-count .item-count-tote').textContent = toteCount;\n if (toteCount > 0) {\n hideShowSummarySection();\n }\n if (storePickupGroupElement && updatedStoreQuantity && storeGroupMessage) {\n const storeGroupMessageElement = queryFirst('.store-product-items-message', storePickupGroupElement);\n if (storeGroupMessageElement) {\n storeGroupMessageElement.textContent = storeGroupMessage;\n }\n }\n const couponsPromosEl = queryFirst('.coupons-and-promos');\n if (couponsPromosEl) {\n couponsPromosEl.innerHTML = cartModel.totals.discountsHtml;\n }\n updatePromoCodeDetails(cartModel.totals.discounts, cartModel.selectedShippingMethod);\n updateCartTotals(cartModel);\n updateLoyaltyVouchers(cartModel);\n updateApproachingDiscounts(cartModel.approachingDiscounts, cartModel.approachingDiscountsLabels);\n updateGWP(cartModel);\n const cartProductElement = queryFirst('.cart-products');\n if (cartProductElement) {\n cartProductElement.innerHTML = cartProductsHtml;\n const seeAllItemElement = queryFirst('.see-all-items-wrapper');\n removeClass(seeAllItemElement, HIDDEN_CLASS);\n }\n updateMonogramDetails(cartModel);\n updateSaveForLaterDetails(data);\n validateBasket(cartModel);\n $body.trigger('cart:update');\n\n if (isMcEnable === 'true') {\n // update Marketing Cloud Analytics trackCart event\n trackCart(data.mcAnalyticsArray);\n }\n\n $.spinner().stop();\n if (!hasClass(self, 'move-all-to-tote')) {\n const originalScroll = document.defaultView.scrollY;\n const newPositionY = self.getBoundingClientRect().y;\n scrollTo(originalScroll + newPositionY - origPositionY, 0);\n }\n else {\n scrollTo($body.offset().top, 0);\n }\n }\n },\n error: function (err) {\n const { responseJSON = {} } = err;\n const { errorMessage, redirectUrl } = responseJSON;\n if (redirectUrl) {\n window.location.href = redirectUrl;\n }\n else {\n createErrorNotification(errorMessage);\n $.spinner().stop();\n }\n }\n });\n });\n $(document).on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n if ($('.cart-page').length) {\n $('.launched-modal .btn-outline-primary').trigger('focus');\n $('.launched-modal').removeClass('launched-modal');\n } else {\n $('.product-detail .add-to-cart').focus();\n }\n });\n\n $body.on('product:afterAttributeSelect', function (_e, response) {\n const responseContainer = response.container[0];\n const { product } = response.data;\n const { categoryUrl, isCartPage } = responseContainer.dataset;\n const availabilityMessageEl = queryFirst('.product-availability .availability-message-text', responseContainer);\n\n if (!product.available && isCartPage && categoryUrl) {\n const message = availabilityMessageEl.innerText;\n availabilityMessageEl.innerHTML = cartTemplates.cartAvailabilityMessageOOS(message, categoryUrl);\n }\n\n const updateCartButton = queryFirst('.update-cart-product-global', responseContainer);\n if (updateCartButton) {\n updateCartButton.disabled = !product.readyToOrder || !product.available || product.isDirectlyPurchasable === false;\n }\n });\n\n $body.on('product:notifyMeHidden', function (_e, productContainer) {\n const updateCartButton = queryFirst('.update-cart-product-global', productContainer);\n removeClass(updateCartButton, 'd-none');\n });\n\n $body.on('product:notifyMeShown', function (_e, productContainer) {\n const updateCartButton = queryFirst('.update-cart-product-global', productContainer);\n addClass(updateCartButton, 'd-none');\n });\n\n $(document).on('change', '.quantity-select', function () {\n var selectedQuantity = $(this).val();\n $('.modal.show .update-cart-url').data('selected-quantity', selectedQuantity);\n });\n\n $(document).on('change', '.options-select', function () {\n var selectedOptionValueId = $(this)\n .children('option:selected')\n .data('value-id');\n $('.modal.show .update-cart-url').data('selected-option', selectedOptionValueId);\n });\n\n $(document).on('click', '.update-cart-product-global', function (e) {\n e.preventDefault();\n const { target } = e;\n const buttonContainer = target.closest('.cart-and-ipay');\n const updateCartHiddenField = queryFirst('.update-cart-url', buttonContainer);\n const updateProductUrl = updateCartHiddenField.value;\n const { selectedQuantity, selectedOption, uuid } = updateCartHiddenField.dataset;\n const { storeId } = target.dataset;\n const form = {\n uuid: uuid,\n pid: base.getPidValue($(this)),\n quantity: selectedQuantity,\n selectedOptionValueId: selectedOption,\n storeId\n };\n const cartProductCard = queryFirst('.card.product-info.uuid-' + uuid);\n $('#quickViewModal')\n .spinner()\n .start();\n\n const giftCardFormEl = buttonContainer.closest('.gift-card');\n if (giftCardFormEl) {\n updateFormObjectForGiftCard(form, giftCardFormEl);\n }\n\n $(this)\n .parents('.card')\n .spinner()\n .start();\n if (updateProductUrl) {\n $.ajax({\n url: updateProductUrl,\n type: 'post',\n context: this,\n data: form,\n dataType: 'json',\n success: function (data) {\n if (data.error) {\n const { lineItemErrorMessage } = data;\n const availabilityFlashMessageEl = queryFirst('.availability-flash-message', cartProductCard);\n if (lineItemErrorMessage && availabilityFlashMessageEl) {\n removeClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n availabilityFlashMessageEl.textContent = lineItemErrorMessage;\n setTimeout(() => {\n addClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n }, 10000);\n }\n $('#quickViewModal')\n .modal('hide')\n .spinner()\n .stop();\n } else if (data.success) {\n $('#quickViewModal')\n .modal('hide')\n .spinner()\n .stop();\n\n $('.coupons-and-promos')\n .empty()\n .append(data.cartModel.totals.discountsHtml);\n updatePromoCodeDetails(data.cartModel.totals.discounts, data.cartModel.selectedShippingMethod);\n updateCartTotals(data.cartModel);\n updateLoyaltyVouchers(data.cartModel);\n updateApproachingDiscounts(data.cartModel.approachingDiscounts, data.cartModel.approachingDiscountsLabels);\n updateAvailability(data.cartModel, uuid);\n updateProductDetails(data, uuid, target.dataset.giftWrapAvailable);\n updateGWP(data.cartModel);\n if (data.uuidToBeDeleted) {\n $('.uuid-' + data.uuidToBeDeleted).remove();\n }\n\n validateBasket(data.cartModel);\n\n const { enablePayPal, enableApplePay } = data.cartModel;\n\n const paypalContainerEl = queryFirst('.checkout-continue');\n if (paypalContainerEl) {\n if (enablePayPal) {\n removeClass(paypalContainerEl, HIDDEN_CLASS);\n } else {\n addClass(paypalContainerEl, HIDDEN_CLASS);\n }\n }\n\n const applePayButton = queryFirst('.dw-apple-pay-button');\n if (applePayButton) {\n if (enableApplePay) {\n removeClass(applePayButton, HIDDEN_CLASS);\n } else {\n addClass(applePayButton, HIDDEN_CLASS);\n }\n }\n\n $body.trigger('cart:update');\n } else {\n formValidation(giftCardFormEl, data);\n }\n $.spinner().stop();\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $.spinner().stop();\n }\n }\n });\n }\n });\n\n const cartPage = $('.cart-page');\n\n // Event listener for home delivery method link in cart page\n cartPage.on('click', '.home-delivery-link', event => {\n const { currentTarget } = event;\n const { uuid, pid, actionUrl } = currentTarget.dataset;\n const quantity = queryFirst('.quantity', currentTarget.closest('.cart-product-line-item')).value;\n const cartProductCard = queryFirst('.card.product-info.uuid-' + uuid);\n $.spinner().start();\n getJSON(\n actionUrl,\n 'POST',\n {\n uuid,\n pid,\n quantity\n },\n data => {\n if (data.error) {\n const { lineItemErrorMessage } = data;\n const availabilityFlashMessageEl = queryFirst('.availability-flash-message', cartProductCard);\n if (lineItemErrorMessage && availabilityFlashMessageEl) {\n removeClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n availabilityFlashMessageEl.textContent = lineItemErrorMessage;\n setTimeout(() => {\n addClass(availabilityFlashMessageEl, HIDDEN_CLASS);\n }, 10000);\n }\n $.spinner().stop();\n } else {\n const { cartProductsHtml, totals } = data;\n const { discountsHtml } = totals;\n const couponsEl = queryFirst('.coupons-and-promos');\n\n if (couponsEl && discountsHtml) {\n couponsEl.innerHTML = discountsHtml;\n }\n if (cartProductsHtml) {\n queryFirst('.cart-products').innerHTML = cartProductsHtml;\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n updateCartTotals(data);\n updateLoyaltyVouchers(data);\n validateBasket(data);\n $body.trigger('cart:update');\n $.spinner().stop();\n }\n }\n },\n () => {\n $.spinner().stop();\n }\n );\n });\n\n // Event listener for product gift wrap checkbox\n cartPage.on('click', '.gift-wrap-input', event => {\n const { target } = event;\n const { pid, uuid, actionUrl, ispu } = target.dataset;\n let isGiftWrap = target.checked;\n let isGiftwrapISPU = false;\n let removeGwpISPU = false;\n if (ispu === 'true') {\n if (isGiftWrap) {\n isGiftWrap = false;\n isGiftwrapISPU = true;\n } else {\n removeGwpISPU = true;\n }\n }\n const quantity = queryFirst('.quantity', target.closest('.cart-product-line-item')).value;\n $.spinner().start();\n getJSON(\n actionUrl,\n 'POST',\n {\n uuid,\n pid,\n quantity,\n isGiftWrap,\n isGiftwrapISPU,\n removeGwpISPU\n },\n data => {\n updateCartTotals(data);\n enableOrDisableCheckoutButton();\n $.spinner().stop();\n },\n () => {\n $.spinner().stop();\n }\n );\n });\n\n $body.on('checkout:updateCheckoutView', function (e, data) {\n const { totals, shipping } = data.order;\n const { discounts, discountsHtml } = totals;\n const couponsEl = queryFirst('.coupons-and-promos');\n\n if (couponsEl && discountsHtml) {\n couponsEl.innerHTML = discountsHtml;\n }\n if (discounts.length) {\n shipping.forEach(eachShipping => {\n const { selectedShippingMethod } = eachShipping;\n if (selectedShippingMethod && !selectedShippingMethod.storePickupEnabled) {\n updatePromoCodeDetails(discounts, selectedShippingMethod);\n }\n });\n }\n });\n\n $body.on('click', '.loyalty-cart-coupons-collapse', function (e) {\n const loyaltyCouponsAccordionBtn = this;\n const couponsAccordionContainerEl = queryFirst('#vouchers-accordion');\n const couponsCardBodyEl = queryFirst('.card-body', couponsAccordionContainerEl);\n const { totalCoupons } = loyaltyCouponsAccordionBtn.dataset;\n const totalCouponsNum = parseInt(totalCoupons, 10);\n const cardBodyMarginTop = 'mt-3';\n if (totalCouponsNum > 2 && !hasClass(loyaltyCouponsAccordionBtn, 'collapsed')) {\n if (couponsCardBodyEl) {\n removeClass(couponsCardBodyEl, cardBodyMarginTop);\n }\n addClass(loyaltyCouponsAccordionBtn, 'collapsed-voucher-padding');\n } else {\n removeClass(loyaltyCouponsAccordionBtn, 'collapsed-voucher-padding');\n if (couponsCardBodyEl) {\n addClass(couponsCardBodyEl, cardBodyMarginTop);\n }\n }\n });\n\n const checkoutContinueCta = queryFirst('.checkout-continue-section .checkout-btn');\n if (checkoutContinueCta) {\n checkoutContinueCta.addEventListener('click', e => {\n e.preventDefault();\n const { target } = e;\n const { href, isBoltUserLoggedIn } = target.dataset;\n if (isBoltUserLoggedIn === 'true' && boltCheckoutAccountExistEl) {\n if (registeredUserEmail) {\n const checkBoltAccountUrl = boltCheckoutAccountExistEl.value + '=' + encodeURIComponent(registeredUserEmail);\n $.ajax({\n url: checkBoltAccountUrl,\n method: 'GET',\n success(data) {\n if (data && data.has_bolt_account) {\n fetchBoltAccountDetails(href);\n } else {\n window.location.href = href;\n }\n },\n error: function () {\n window.location.href = href;\n }\n });\n } else {\n fetchBoltAccountDetails(href);\n }\n } else {\n window.location.href = href;\n }\n });\n }\n\n $(document).on('click', '.bolt-checkout-cta', function (e) {\n e.preventDefault();\n checkAccountAndFetchDetail();\n });\n\n enableOrDisableCheckoutButton();\n\n // Afterpay\n require('../afterpay')({\n anchors: '.grand-total-container',\n observerTargets: '.grand-total-container',\n priceTargets: '.grand-total-value',\n renderMode: 'adjacent'\n });\n\n base.selectAttribute();\n base.colorAttribute();\n base.removeBonusProduct();\n base.selectBonusProduct();\n base.enableBonusProductSelection();\n base.showMoreBonusProducts();\n base.addBonusProductsToCart();\n base.focusChooseBonusProductModal();\n base.trapChooseBonusProductModalFocus();\n base.onClosingChooseBonusProductModal();\n window.setTimeout(function () {\n base.revealRecommendations();\n $body.trigger('search:updateProducts');\n }, 2000);\n\n window.onpageshow = function (event) {\n if (event.persisted) {\n window.location.reload();\n }\n };\n window.addEventListener('resize', throttle(() => {\n hideShowSummarySection();\n }));\n\n // Update Amazon Pay Button Style if enabled\n let $amazonPayContainer = $('.cart-page .amazonpay-wrap');\n if ($amazonPayContainer.length) {\n var observer = new MutationObserver(function () {\n require('../amazonPay/amazonPay').updateAmazonPayButton(true);\n observer.disconnect();\n });\n observer.observe($('div[amazonpay-type=\"cart\"]')[0], { attributes: true });\n }\n\n // Enable Apple Pay\n if (\n window.ApplePaySession &&\n window.ApplePaySession.canMakePayments()\n ) {\n $('.js-dropin-cart-page-step').removeClass('d-none');\n }\n\n}\n\nexport { updateCartTotals, updatePromoCodeDetails, updateApproachingDiscounts, validateBasket };\nexport default init;\n","import { queryFirst, queryAll, addClass, removeClass } from '../../domUtil';\nimport { geolocate } from '../../util';\n\nconst hiddenClass = 'd-none';\n\n/**\n * This method toggles the location icon state in pick up in store drawer\n * @param {boolean} isGeolocationAllowed -geo location permission\n * @param {HTMLElement} container - ISPU container\n */\nfunction toggleLocationIcon(isGeolocationAllowed, container) {\n const locationInactiveIcon = queryFirst('.geolocation-not-activated', container);\n const locationActiveIcon = queryFirst('.geolocation-activated', container);\n if (isGeolocationAllowed) {\n removeClass(locationActiveIcon, hiddenClass);\n addClass(locationInactiveIcon, hiddenClass);\n } else {\n removeClass(locationInactiveIcon, hiddenClass);\n addClass(locationActiveIcon, hiddenClass);\n }\n}\n\n/**\n * This method handles event on clicking 'use my location' link\n * @param {Event} event - on click event object\n * @param {HTMLElement} ispuContainer - ISPU container\n * @param {Function} handleInStore - Success callback handler\n */\nfunction handleDetectLocation(event, ispuContainer, handleInStore) {\n const { target } = event;\n const { actionUrl } = target.dataset;\n const mixinData = { actionUrl, forceGeoLocation: true };\n const noStoresMessage = queryFirst('.store-locator-no-results', ispuContainer);\n const storeResults = queryFirst('.pick-up-in-stores', ispuContainer);\n queryFirst('.find-store-input', ispuContainer).value = '';\n queryFirst('.find-store-submit', ispuContainer).disabled = true;\n geolocate(handleInStore, mixinData, () => {\n removeClass(queryFirst('.geo-location-error', ispuContainer), hiddenClass);\n addClass([storeResults, noStoresMessage], hiddenClass);\n });\n}\n\n/**\n * This method cleans up the state on closing ISPU modal\n * @param {HTMLElement} ispuContainer - ISPU container\n */\nfunction handleISPUModalClose(ispuContainer) {\n queryFirst('.find-store-input', ispuContainer).value = '';\n removeClass(queryAll('.pickup-in-store-product, .find-stores-form', ispuContainer), hiddenClass);\n queryFirst('.pick-up-in-stores', ispuContainer).innerHTML = '';\n const noStoresMessage = queryFirst('.store-locator-no-results', ispuContainer);\n const confirmSection = queryFirst('.pick-up-confirm-section', ispuContainer);\n const geolocateError = queryFirst('.geo-location-error', ispuContainer);\n confirmSection.innerHTML = '';\n addClass([confirmSection, noStoresMessage, geolocateError], hiddenClass);\n queryFirst('.find-store-submit', ispuContainer).disabled = true;\n}\n\nexport {\n handleISPUModalClose,\n handleDetectLocation,\n toggleLocationIcon\n};\n","'use strict';\n\nimport { queryFirst, queryAll, addClass, removeClass } from '../domUtil';\nimport {\n getJSON,\n geolocate,\n setItemInLocalStorage,\n getItemFromLocalStorage\n} from '../util';\nimport { includeGoogleMaps, getLatLong } from '../googleMaps';\nimport { PREFERRED_STORE_ID } from '../constants';\nimport { updateCartTotals, updatePromoCodeDetails, validateBasket } from '../cart/cart';\nimport { toggleLocationIcon } from './pickUpInStore/ispuHelper';\n\nconst $body = $('body');\nconst isSetPage = $('.custom-set-detail');\nconst hiddenClass = 'd-none';\nlet ispuContainer = queryFirst('.pickup-in-store-container');\nlet ispuModalContainer = $('.lp-slideout-modal[id*=\"pick-up-in-store\"]');\nconst pickUpInStoreButton = queryFirst('.btn-in-store-pickup');\nconst isRecognizedUser = pickUpInStoreButton && pickUpInStoreButton.dataset.isRecognizedUser === 'true';\nlet ispuClosestParent = isSetPage.length > 0 ? $('.custom-set-detail-shop-by-item .product-detail') : $('.product-detail, .cart-page');\n\n/**\n * This method checks if the user is on cart page\n * @returns {boolean} is cart page or not\n */\nfunction isInCartPage() {\n const cartPage = queryFirst('.cart-page');\n return !!cartPage;\n}\n\n/**\n * This method checks if the user is on PDP page\n * @returns {boolean} is PDP page or not\n */\nfunction isInPdpPage() {\n const pdpPage = queryFirst('.pdp-container');\n return !!pdpPage;\n}\n\n/**\n * This method returns ISPU cart line items details\n * @returns {Object} ISPU cart line items details\n */\nfunction getIspuCartLineItemDetails() {\n const storePickupInfo = queryFirst('.cart-page .store-pickup-info');\n const ispuLineItems = queryAll('.cart-product-line-item', storePickupInfo);\n let ispuLineItemsData = [];\n if (ispuLineItems) {\n ispuLineItems.forEach(ispuLineItem => {\n const { pid, uuid } = ispuLineItem.dataset;\n const quantity = queryFirst('.quantity', ispuLineItem).value;\n ispuLineItemsData.push({\n pid,\n uuid,\n quantity\n });\n });\n }\n return ispuLineItemsData;\n}\n\n/**\n * This method handles the store results content\n * @param {Object} data store results\n */\nfunction handleStoreResults(data) {\n const noStoresMessage = queryFirst('.store-locator-no-results', ispuContainer);\n const storeResults = queryFirst('.pick-up-in-stores', ispuContainer);\n const productDetails = queryFirst('.pickup-in-store-product', ispuContainer);\n addClass(queryFirst('.geo-location-error', ispuContainer), hiddenClass);\n if (data.storesResultsHtml) {\n storeResults.innerHTML = data.storesResultsHtml;\n noStoresMessage.textContent = '';\n if (!data.isCartPage) {\n removeClass(productDetails, hiddenClass);\n }\n removeClass(storeResults, hiddenClass);\n addClass(noStoresMessage, hiddenClass);\n\n if (isRecognizedUser && data.preferredStore) {\n setItemInLocalStorage(PREFERRED_STORE_ID, data.preferredStore.ID);\n }\n } else if (data.noStoresErrorMessage) {\n noStoresMessage.innerHTML = data.noStoresErrorMessage;\n if (!data.isCartPage) {\n addClass(productDetails, hiddenClass);\n }\n addClass(storeResults, hiddenClass);\n removeClass(noStoresMessage, hiddenClass);\n }\n ispuModalContainer.spinner().stop();\n}\n\n/**\n * This method handles the store confirmation results content\n * @param {Object} data store results\n */\nfunction handleConfirmStoreResults(data) {\n const storeConfirm = queryFirst('.pick-up-confirm-section', ispuContainer);\n const storeResults = queryFirst('.pick-up-in-stores', ispuContainer);\n const storeForm = queryFirst('.find-stores-form', ispuContainer);\n storeConfirm.innerHTML = data.storesResultsHtml;\n if (data.storesResultsHtml) {\n removeClass(storeConfirm, hiddenClass);\n addClass([storeResults, storeForm], hiddenClass);\n }\n ispuModalContainer.spinner().stop();\n}\n\n/**\n * This method is an error handler of ajax call\n */\nfunction errorCallBack() {\n ispuModalContainer.spinner().stop();\n}\n\n// Event listener to retrieve store results on click of Pick up in store in PDP\n$('.pdp-in-store-inventory, .cart-page').on('click', '.btn-in-store-pickup', event => {\n const { currentTarget } = event;\n const { actionUrl, pid, googleKey, productName, swatchName, masterId } = currentTarget.dataset;\n const isCartPage = isInCartPage();\n const ispuContainerDataset = ispuContainer.dataset;\n const mixinData = {\n products: pid,\n isCartPage\n };\n includeGoogleMaps(googleKey);\n if (!isCartPage) {\n ispuModalContainer = $(currentTarget).closest('.product-detail').find('.lp-slideout-modal[id*=\"pick-up-in-store\"]');\n ispuContainer = queryFirst('.lp-slideout-modal .pickup-in-store-container', currentTarget.closest('.product-detail'));\n }\n ispuContainerDataset.pid = pid;\n ispuContainerDataset.productName = productName;\n ispuContainerDataset.swatchName = swatchName;\n ispuContainerDataset.masterId = masterId;\n if (isRecognizedUser) {\n const storeId = getItemFromLocalStorage(PREFERRED_STORE_ID);\n\n if (storeId) {\n mixinData.storeID = storeId;\n }\n }\n if (ispuContainerDataset.selectStoreView === 'true') {\n mixinData.selectStoreView = true;\n }\n if (isCartPage) {\n const quantity = queryFirst('.quantity', currentTarget.closest('.cart-product-line-item')).value;\n mixinData.quantity = quantity;\n const { uuid } = currentTarget.dataset;\n ispuContainerDataset.uuid = uuid;\n ispuContainerDataset.quantity = quantity;\n addClass(queryFirst('.pickup-in-store-product'), hiddenClass);\n }\n geolocate(data => {\n ispuModalContainer.spinner().start();\n toggleLocationIcon(true, ispuContainer);\n getJSON(actionUrl, 'GET', data, handleStoreResults, errorCallBack);\n }, mixinData, data => {\n toggleLocationIcon(false, ispuContainer);\n getJSON(actionUrl, 'GET', data, handleStoreResults, errorCallBack);\n });\n});\n\n// Event listener to select a store from ISPU drawer\nispuClosestParent.on('click', '.btn-select-store', event => {\n const { target } = event;\n const { storeId } = target.dataset;\n const productContainer = target.closest('.product-detail');\n\n $body.trigger('product:updateStoreInventory', { storeId, productContainer });\n\n $(target)\n .closest('.lp-slideout-modal')\n .modal('hide');\n});\n\n// Event Listener for edit pick up store link in cart page\n$('.cart-page').on('click', '.btn-edit-store-pickup', event => {\n ispuContainer.dataset.editStore = 'true';\n const products = null;\n const { actionUrl, googleKey } = event.currentTarget.dataset;\n includeGoogleMaps(googleKey);\n addClass(queryFirst('.pickup-in-store-product'), hiddenClass);\n const mixinData = {\n products,\n isCartPage: true\n };\n geolocate(data => {\n ispuModalContainer.spinner().start();\n toggleLocationIcon(true, ispuContainer);\n getJSON(actionUrl, 'GET', data, handleStoreResults, errorCallBack);\n }, mixinData, data => {\n toggleLocationIcon(false, ispuContainer);\n getJSON(actionUrl, 'GET', data, handleStoreResults, errorCallBack);\n });\n});\n\n/**\n * This method retrieves store results based on zipcode, city or state\n * @param {Object} locationData google location data based on input value\n */\nfunction handleInStore(locationData) {\n const { latitude, longitude, address, actionUrl, forceGeoLocation } = locationData;\n const ispuContainerDataset = ispuContainer.dataset;\n const isEditStore = JSON.parse(ispuContainerDataset.editStore || 'false');\n let products = null;\n if (!isEditStore) {\n products = ispuContainerDataset.pid + ':' + ispuContainerDataset.quantity;\n }\n const isCartPage = isInCartPage();\n const data = {\n products,\n latitude,\n longitude,\n inputSearchParameter: address,\n isCartPage,\n forceGeoLocation\n };\n if (ispuContainerDataset.selectStoreView === 'true') {\n data.selectStoreView = true;\n }\n if (isRecognizedUser) {\n const storeId = getItemFromLocalStorage(PREFERRED_STORE_ID);\n if (storeId) {\n data.storeID = storeId;\n }\n }\n ispuModalContainer.spinner().start();\n getJSON(actionUrl, 'GET', data, handleStoreResults, errorCallBack);\n}\n\n// Event listener to retrieve store results based on input search in pick up in store drawer\nispuClosestParent.on('submit', '.find-stores-form', event => {\n event.preventDefault();\n const { target } = event;\n const actionUrl = target.getAttribute('action');\n const address = queryFirst('.find-store-input', target.closest('.find-stores-form')).value;\n if (address) {\n getLatLong(handleInStore, {\n address,\n actionUrl\n });\n }\n});\n\n/**\n * This method retrieves store results based on zipcode, city or state after preferred store slection\n * @param {Object} locationData google location data based on input value\n */\nfunction handlePreferredStore(locationData) {\n const url = queryFirst('.preferred-store-input').dataset.actionUrl;\n const isCartPage = isInCartPage();\n const { latitude, longitude, address, storeID, products } = locationData;\n const data = {\n products,\n latitude,\n longitude,\n inputSearchParameter: address,\n storeID,\n isCartPage,\n selectStoreView: isInPdpPage()\n };\n ispuModalContainer.spinner().start();\n getJSON(url, 'POST', data, handleStoreResults, errorCallBack);\n}\n\n// Event listener to update preferred store and rerender store results\nispuClosestParent.on('click', '.preferred-store-input', event => {\n const { target } = event;\n const isEditStore = JSON.parse(ispuContainer.dataset.editStore);\n let products = null;\n if (!isEditStore) {\n products = ispuContainer.dataset.pid;\n }\n const address = queryFirst('.find-store-input').value;\n const { dataset } = target;\n const { actionUrl, storeId } = dataset;\n const isCartPage = isInCartPage();\n const mixinData = {\n products,\n storeID: storeId,\n isCartPage\n };\n if (isCartPage && !isEditStore) {\n mixinData.quantity = ispuContainer.dataset.quantity;\n }\n if (address) {\n mixinData.address = address;\n getLatLong(handlePreferredStore, mixinData);\n } else {\n const isCartPage = isInCartPage();\n geolocate(\n data => {\n ispuModalContainer.spinner().start();\n getJSON(actionUrl, 'POST', data, handleStoreResults);\n },\n {\n products,\n storeID: storeId,\n isCartPage,\n selectStoreView: isInPdpPage()\n },\n data => {\n getJSON(actionUrl, 'POST', data, handleStoreResults);\n }\n );\n }\n});\n\n// Event listener to render pick up in store confirmation template\nispuClosestParent.on('click', '.pick-up-confirm-button', event => {\n const { dataset } = event.target;\n const { actionUrl, storeId } = dataset;\n const isCartPage = isInCartPage();\n const data = {\n storeID: storeId,\n isCartPage\n };\n ispuModalContainer.spinner().start();\n getJSON(actionUrl, 'GET', data, handleConfirmStoreResults, errorCallBack);\n});\n\n// Event listener to ISPU store confirmation in cart\nispuClosestParent.on('click', '.store-confirm-button', event => {\n const { target } = event;\n const { actionUrl } = target.dataset;\n const storeID = target.closest('.store-details').dataset.storeId;\n const isEditStore = JSON.parse(ispuContainer.dataset.editStore);\n let data;\n if (isEditStore) {\n const productsInfo = JSON.stringify(getIspuCartLineItemDetails());\n data = {\n productsInfo,\n storeID\n };\n } else {\n const { pid, uuid, quantity } = ispuContainer.dataset;\n data = {\n pid,\n uuid,\n quantity,\n storeID\n };\n }\n ispuModalContainer.spinner().start();\n getJSON(\n actionUrl,\n 'POST',\n data,\n data => {\n if (data.error) {\n const { lineItemErrorMessage } = data;\n ispuModalContainer.spinner().stop();\n ispuModalContainer.modal('hide');\n $('.add-to-cart-messages').remove();\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
');\n }\n $('.add-to-cart-messages').append('
' + lineItemErrorMessage + '
');\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n } else {\n const { cartProductsHtml, totals } = data;\n const { discountsHtml } = totals;\n const couponsEl = queryFirst('.coupons-and-promos');\n\n if (couponsEl && discountsHtml) {\n couponsEl.innerHTML = discountsHtml;\n }\n if (cartProductsHtml) {\n queryFirst('.cart-products').innerHTML = cartProductsHtml;\n removeClass(queryFirst('.cart-pickup-products'), hiddenClass);\n updatePromoCodeDetails(data.totals.discounts, data.selectedShippingMethod);\n updateCartTotals(data);\n validateBasket(data);\n $('body').trigger('cart:update');\n ispuModalContainer.spinner().stop();\n ispuModalContainer.modal('hide');\n }\n }\n },\n () => {\n ispuModalContainer.spinner().stop();\n }\n );\n});\n\n// Event listener to toggle store details accordion label\nispuClosestParent.on('click', '.store-locator-container .store-btn-link', event => {\n const { target } = event;\n queryFirst('.collapsed', target).classList.toggle(hiddenClass);\n queryFirst('.expanded', target).classList.toggle(hiddenClass);\n});\n\n// Event listener to show stores to select on click of change location on pickup confirmation page\nispuClosestParent.on('click', '.change-location-link', () => {\n addClass(queryFirst('.pick-up-confirm-section'), hiddenClass);\n removeClass(queryAll('.pick-up-in-stores, .find-stores-form'), hiddenClass);\n});\n\n// Event listener to remove no stores error message on change of ISPU search input\nispuClosestParent.on('keyup', '.find-store-input', (event) => {\n queryFirst('.store-locator-no-results', ispuModalContainer[0]).textContent = '';\n queryFirst('.pick-up-in-stores', ispuContainer).innerHTML = '';\n addClass(queryFirst('.geo-location-error', ispuContainer), hiddenClass);\n const findStoreSubmit = queryFirst('.find-store-submit', ispuContainer);\n if (event.target.value) {\n findStoreSubmit.removeAttribute('disabled');\n } else {\n findStoreSubmit.disabled = true;\n }\n});\n\n$('.lp-slideout-modal[id*=\"pick-up-in-store\"]').on('hidden.bs.modal', () => {\n queryFirst('.find-store-input', ispuContainer).value = '';\n removeClass(queryAll('.pickup-in-store-product, .find-stores-form', ispuContainer), hiddenClass);\n queryFirst('.pick-up-in-stores', ispuContainer).innerHTML = '';\n const noStoresMessage = queryFirst('.store-locator-no-results', ispuContainer);\n const confirmSection = queryFirst('.pick-up-confirm-section', ispuContainer);\n const geolocateError = queryFirst('.geo-location-error', ispuContainer);\n confirmSection.innerHTML = '';\n addClass([confirmSection, noStoresMessage, geolocateError], hiddenClass);\n queryFirst('.find-store-submit', ispuContainer).disabled = true;\n if (isInCartPage()) {\n ispuContainer.dataset.editStore = 'false';\n }\n});\n\n// Event listener to retrieve geo location based store results on click of use current location\nispuClosestParent.on('click', '.detect-location', event => {\n const { target } = event;\n const { actionUrl } = target.dataset;\n const mixinData = { actionUrl, forceGeoLocation: true };\n const noStoresMessage = queryFirst('.store-locator-no-results', ispuContainer);\n const storeResults = queryFirst('.pick-up-in-stores', ispuContainer);\n queryFirst('.find-store-input', ispuContainer).value = '';\n queryFirst('.find-store-submit', ispuContainer).disabled = true;\n geolocate(handleInStore, mixinData, () => {\n removeClass(queryFirst('.geo-location-error', ispuContainer), hiddenClass);\n addClass([storeResults, noStoresMessage], hiddenClass);\n });\n});\n","'use strict';\n\nconst { queryFirst, addClass, removeClass, queryAll, setAttribute, removeAttribute, hasClass } = require('../domUtil');\nconst { getJSON, appendToUrl, getNestedValue, setItemInLocalStorage } = require('../util');\nconst { shippingPreferences } = require('../templates').shippingPreferenceTemplates;\nconst { ispuSelectStyleMessageTmpl } = require('../templates').productDetail;\nconst { isShippingPreferencesViewEnabled } = require('../product/helper');\nconst {\n getChangeStoreLinkEl, getSelectedPreferenceEl, getShippingPreferencesContainerEl, getISPUradioButtonEl, getSelectedSizeEl,\n getShipToAddressradioButtonEl, getISPUPreferenceContentEl, addStoreNameClass, removeStoreNameClass,\n selectISPURadioButton, selectShipToRadioButton, getPreferedShippingPreference, disableISPURadioButton, disableShipToRadioButton, getShipToAddressContentEl, updateVisibilityOfLowInventoryMsg, getAvailableForInStorePickup\n} = require('./shippingPreference/shippingPreferenceHelper');\nconst { updateShipToInventoryMessages, updateISPUInventoryMessages, clearAllInventoryMessages, updateServiceResponseMessage, clearServiceResponseMessage } = require('./shippingPreference/inventoryMessaging');\nconst { injectISPUDeliveryMessage, clearISPUDeliveryMessage, showISPUDeliveryMessage, hideISPUDeliveryMessage } = require('./shippingPreference/ispuDeliveryMessaging');\nconst { getStoreDetailEl, addStoreDetail } = require('./shippingPreference/storeDetailHelper');\nconst { isEDDApplicable, injectEDDInfo, removeEDDInfo } = require('./pdpEdd');\nconst { EMPTY_STRING, HIDDEN_CLASS, NOT_AVAILABLE_STATUS } = require('../constants');\nconst {\n DISABLED_CLASS, PRODUCT_DETAIL_CONTAINER_SELECTOR, SHIPPING_PREFERENCES_CONTAINER_SELECTOR, ISPU_SELECT_STYLE_MESSAGE_SELECTOR, ISPU_SERVICE_ERROR_ATTR_NAME,\n ISPU_RADIO_VALUE, SHIP_TO_RADIO_VALUE, SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR, CHANGE_STORE_LINK_SELECTOR, SHIPPING_PREFERENCE_KEY, RADIO_BUTTON_LABEL_SELECTOR, STORE_DETAIL_SELECTOR, ISPU_INFO_MESSAGE_SELECTOR,\n PDP_CONTAINER_SELECTOR, AVAILABILITY_MSG_SELECTOR, NOT_AVAILABLE_CLASS, ISPU_SERVICE_BLOCKED, PRE_ORDER_CLASS, SHIP_TO_LOW_INVENTORY_CLASS, PDP_SET_PAGE\n} = require('./shippingPreference/constants');\n\nconst $body = $('body');\nconst $shippingPreferenceContainer = $(SHIPPING_PREFERENCES_CONTAINER_SELECTOR); // jQuery version, Used only for spinner\n\nconst shippingPreferencesConfig = getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig') || {};\nconst { isEnabled, messages, reasonCodes } = shippingPreferencesConfig;\nconst inventoryCache = {};\n\n/**\n * Function to clear out any existing error/info messages\n * @param {HTMLElement} productContainer - Product container\n */\nfunction clearAllMessages(productContainer) {\n clearServiceResponseMessage(productContainer);\n clearAllInventoryMessages(productContainer);\n clearISPUDeliveryMessage(productContainer);\n}\n\n/**\n * Function to reset radio button view and state\n * @param {HTMLElement} productContainer - Product container\n */\nfunction resetPreferences(productContainer) {\n const shipToRadioButtonEl = getShipToAddressradioButtonEl(productContainer);\n shipToRadioButtonEl.disabled = false;\n removeClass(shipToRadioButtonEl.nextElementSibling, DISABLED_CLASS);\n const shipToAddressContentEl = getShipToAddressContentEl(productContainer);\n removeClass(shipToAddressContentEl, DISABLED_CLASS);\n\n const ispuRadioButtonEl = getISPUradioButtonEl(productContainer);\n ispuRadioButtonEl.disabled = false;\n removeClass(ispuRadioButtonEl.nextElementSibling, DISABLED_CLASS);\n const ispuPreferenceContentEl = getISPUPreferenceContentEl(productContainer);\n removeClass(ispuPreferenceContentEl, DISABLED_CLASS);\n}\n\n/**\n * Function to inject dynamically generated HTML into DOM\n * @param {HTMLElement} productContainerEl - Product container element\n * @param {boolean} preferISPU - A flag to select the ISPU radio on load\n * @param {Object} messages - map of messages\n */\nfunction injectShippingPreferences(productContainerEl, preferISPU, messages) {\n const shippingPreferencesContainerEl = getShippingPreferencesContainerEl(productContainerEl);\n if (shippingPreferencesContainerEl) {\n const { preferenceIspuLabel, preferenceShipToAddressLabel, changeStoreLabel } = messages || {};\n const shippingPreferencesHTML = shippingPreferences(preferenceIspuLabel, ISPU_RADIO_VALUE, preferenceShipToAddressLabel, SHIP_TO_RADIO_VALUE, changeStoreLabel, preferISPU);\n $(shippingPreferencesContainerEl).html(shippingPreferencesHTML);\n }\n}\n\n/**\n * Function to handle successful inventory api response\n * @param {Object} response - Service response\n * @param {HTMLElement} productContainer - Product container element\n */\nfunction handleISPUInventoryResponse(response, productContainer) {\n const { success } = response;\n let isPDPSetPage = false;\n const { masterid } = productContainer.dataset;\n if (hasClass(productContainer, PDP_SET_PAGE)) {\n isPDPSetPage = true;\n }\n\n clearAllMessages(productContainer);\n resetPreferences(productContainer);\n let storeDetailEl = getStoreDetailEl(productContainer);\n if (storeDetailEl) {\n storeDetailEl.textContent = EMPTY_STRING;\n }\n\n const ispuRadioButtonEl = getISPUradioButtonEl(productContainer);\n const shipToRadioButtonEl = getShipToAddressradioButtonEl(productContainer);\n const changeStoreLinkEl = getChangeStoreLinkEl(productContainer);\n const selectedSizeEl = getSelectedSizeEl(productContainer);\n removeClass(changeStoreLinkEl, ISPU_SERVICE_BLOCKED);\n window.ispuProductInventory = window.ispuProductInventory || {};\n if (success) {\n removeAttribute(ispuRadioButtonEl, ISPU_SERVICE_ERROR_ATTR_NAME);\n if (isPDPSetPage) {\n window.ispuProductInventory[masterid] = response;\n\n } else {\n window.ispuProductInventory = response;\n }\n const { store, instorePickupStoreMsg } = response;\n\n // Add store details to DOM\n addStoreDetail(store, productContainer);\n injectISPUDeliveryMessage(instorePickupStoreMsg, productContainer);\n hideISPUDeliveryMessage(productContainer);\n\n if (ispuRadioButtonEl.checked) {\n // On Add to cart button click\n // it takes store-id from DIV element having 'store-name' class, making it ISPU add to cart.\n addStoreNameClass(productContainer);\n }\n\n // Reset change store link\n removeClass(changeStoreLinkEl, HIDDEN_CLASS);\n\n // Show store details, if the size is selected\n if (selectedSizeEl) {\n $(selectedSizeEl).trigger('click');\n removeClass(storeDetailEl, HIDDEN_CLASS);\n if (getAvailableForInStorePickup(productContainer)) {\n removeClass(changeStoreLinkEl, DISABLED_CLASS);\n }\n } else {\n storeDetailEl = queryFirst(STORE_DETAIL_SELECTOR, productContainer);\n addClass(storeDetailEl, HIDDEN_CLASS);\n addClass(changeStoreLinkEl, DISABLED_CLASS);\n disableISPURadioButton(productContainer, null, true);\n\n // Displaying 'Select size message'\n const ispuAvailabilityMessageEl = queryFirst(ISPU_SELECT_STYLE_MESSAGE_SELECTOR, productContainer);\n const { selectStylesMessage } = messages;\n if (ispuAvailabilityMessageEl && selectStylesMessage) {\n ispuAvailabilityMessageEl.innerHTML = !selectedSizeEl ? ispuSelectStyleMessageTmpl(selectStylesMessage) : EMPTY_STRING;\n }\n }\n\n // Update the stock of sizes according to ISPU store, only if store is selected\n if (store && store.ID) {\n updateOutOfStockSizeForIspu(productContainer, isPDPSetPage);\n }\n } else {\n setAttribute(ispuRadioButtonEl, ISPU_SERVICE_ERROR_ATTR_NAME, true);\n let productISPUInventoryJSON = window.ispuProductInventory || {};\n if (isPDPSetPage) {\n productISPUInventoryJSON[masterid] = { varients: {} };\n } else {\n productISPUInventoryJSON = { varients: {} };\n }\n window.ispuProductInventory = productISPUInventoryJSON;\n let wrapErrorMessage = false;\n disableISPURadioButton(productContainer, ispuRadioButtonEl, true);\n\n // Switch to 'Ship to address' radio button\n selectShipToRadioButton(productContainer, shipToRadioButtonEl, true);\n\n const { message, reasonCode } = response;\n let ispuPreferenceContentEl;\n let store;\n switch (reasonCode) {\n case reasonCodes.NO_STORES_FOUND:\n // Show change store link to select a new store, if nearest store is not found.\n removeClass(changeStoreLinkEl, HIDDEN_CLASS);\n break;\n case reasonCodes.STORES_SERVICE_DOWN:\n wrapErrorMessage = true;\n // Hide change store link\n addClass(changeStoreLinkEl, HIDDEN_CLASS);\n\n // Disable the ISPU section\n ispuPreferenceContentEl = getISPUPreferenceContentEl(productContainer);\n addClass(ispuPreferenceContentEl, DISABLED_CLASS);\n break;\n case reasonCodes.STORE_UNAVAILABLE:\n store = response.store;\n if (store) {\n addStoreDetail(store, productContainer);\n }\n\n // Disable the ISPU section\n ispuPreferenceContentEl = getISPUPreferenceContentEl(productContainer);\n addClass(ispuPreferenceContentEl, DISABLED_CLASS);\n break;\n default: break;\n }\n\n // Show the info message why it got disabled\n if (message) {\n updateServiceResponseMessage(message, wrapErrorMessage, productContainer);\n }\n\n if (!selectedSizeEl) {\n addClass(changeStoreLinkEl, DISABLED_CLASS);\n }\n }\n}\n\n/**\n * Function to handle failure inventory api response\n * @param {Object} error - Service response\n * @param {HTMLElement} productContainer - Product container element\n */\nfunction handleISPUInventoryError(error, productContainer) {\n window.ispuProductInventory = { variants: {} };\n clearAllMessages(productContainer);\n resetPreferences(productContainer);\n\n // Disable ISPU radio button and display error message\n disableISPURadioButton(productContainer, null, true);\n const { errorMessage } = messages;\n updateServiceResponseMessage(errorMessage, true, productContainer);\n const changeStoreLinkEl = getChangeStoreLinkEl(productContainer);\n addClass(changeStoreLinkEl, ISPU_SERVICE_BLOCKED);\n\n // Fallback to ship to address radio button\n selectShipToRadioButton(productContainer);\n}\n\n/**\n * Function to updateOutOfStockSize to instock if pickup instore is available for the size\n */\nfunction updateOutOfStockSizeForIspu(productContainer, isPDPSetPage) {\n const { ispuProductInventory, productInfo } = window;\n const pdpContainer = isPDPSetPage ? productContainer : queryFirst(PDP_CONTAINER_SELECTOR);\n const productId = pdpContainer.dataset.masterid;\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainer);\n const selectedColorValue = selectedColorElement.dataset.attrValue;\n const variationGroup = getNestedValue(productInfo, '{0}.variants.{1}', productId, selectedColorValue);\n if (variationGroup) {\n queryAll('.size-container li', pdpContainer).forEach(el => {\n const sizeBtn = queryFirst('button', el);\n if (hasClass(sizeBtn, NOT_AVAILABLE_CLASS)) {\n const attributeValue = sizeBtn.dataset.attrValue;\n const getVariationJson = variationGroup.sizes[attributeValue];\n const storeAvailability = isPDPSetPage ? getNestedValue(ispuProductInventory, '{0}.variants.{1}.availabilityStatus', productId, getVariationJson ? getVariationJson.ID : '') : getNestedValue(ispuProductInventory, 'variants.{0}.availabilityStatus', getVariationJson ? getVariationJson.ID : '');\n if (storeAvailability !== undefined) {\n const checkStoreAvailability = (getVariationJson && storeAvailability);\n if (checkStoreAvailability !== NOT_AVAILABLE_STATUS) {\n removeClass(sizeBtn, NOT_AVAILABLE_CLASS);\n }\n }\n }\n });\n }\n}\n/**\n * Function to initialize events on shipping preferences section\n * @param {string?} storeId - storeId in from user session\n */\nfunction initializeEvents() {\n /*\n Gets triggered twice\n #1 On color swatch selection\n #2 On selecting a store from the drawer\n */\n $body.on('product:updateStoreInventory', (event, data) => {\n const { productContainer, storeId } = data;\n const shippingPreferencesContainerEl = getShippingPreferencesContainerEl(productContainer);\n\n // Fetching selected swatch product id from dataset\n const selectedSwatchButton = queryFirst('.swatch-circle.selected', productContainer).closest('.color-attribute');\n if (selectedSwatchButton) {\n const { productId } = selectedSwatchButton.dataset;\n const actionUrl = getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig.actionUrl') || EMPTY_STRING;\n if (!actionUrl) return;\n\n // Build params for API call\n const params = { pid: productId };\n let skipCall = false;\n if (storeId) {\n window.johnnyWasUtils.shippingPreferencesConfig.storeId = params.storeID = storeId;\n } else {\n const sessionStoreId = getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig.storeId') || EMPTY_STRING;\n if (sessionStoreId === 'null') {\n skipCall = true;\n } else if (sessionStoreId) {\n params.storeID = sessionStoreId;\n }\n }\n if (skipCall) {\n handleISPUInventoryResponse({\n success: false,\n reasonCode: reasonCodes.NO_STORES_FOUND,\n message: messages.selectStylesMessage\n }, productContainer);\n return;\n }\n const paramHash = productId + (params.storeID || '');\n if (inventoryCache[paramHash]) {\n handleISPUInventoryResponse(inventoryCache[paramHash], productContainer);\n return;\n }\n const urlWithParams = appendToUrl(actionUrl, params);\n\n // Spinner for shipping preferences element\n const $spinner = $(shippingPreferencesContainerEl).spinner();\n $spinner.start();\n\n // Service call\n getJSON(urlWithParams, 'GET', null,\n (response) => {\n inventoryCache[paramHash] = response;\n handleISPUInventoryResponse(response, productContainer);\n $spinner.stop();\n },\n (error) => {\n handleISPUInventoryError(error, productContainer);\n $spinner.stop();\n });\n }\n });\n\n $body.on('product:pdpSizeSelected', ($event, data) => {\n const { productContainer } = data;\n\n const storeDetailEl = getStoreDetailEl(productContainer);\n const changeStoreLinkEl = getChangeStoreLinkEl(productContainer);\n\n // If ISPU enabled, hiding the availability message for ship to address and\n // handling it from updateVisibilityOfLowInventoryMsg method\n const availabilityElement = queryFirst(AVAILABILITY_MSG_SELECTOR, productContainer);\n addClass(availabilityElement, HIDDEN_CLASS);\n\n if (storeDetailEl) {\n removeClass(storeDetailEl, HIDDEN_CLASS);\n removeClass(changeStoreLinkEl, DISABLED_CLASS);\n } else {\n const storeServiceResponse = queryFirst(ISPU_INFO_MESSAGE_SELECTOR, productContainer);\n addClass(storeServiceResponse, HIDDEN_CLASS);\n let ispuInfomessage = getAvailableForInStorePickup(productContainer) ? messages.noStoresFound : messages.notEligibleISPUMessage;\n updateServiceResponseMessage(ispuInfomessage, false, productContainer);\n }\n updateVisibilityOfLowInventoryMsg(productContainer);\n });\n $body.on('product:updateOOSSize', ($event, data) => {\n const { productContainer, isPDPSetPage } = data;\n updateOutOfStockSizeForIspu(productContainer, isPDPSetPage);\n });\n\n $body.on('product:inventoryStatus', function ($event, data) {\n const { shipToAddressAvailabilityStatus, inStorePickUpAvailabilityStatus, isStorePickUpLowInventory, inStorePickUpAvailabilityMessage, inStorePickUpLowStockMessage, availableForInStorePickup, productContainer } = data;\n\n const changeStoreLinkEl = getChangeStoreLinkEl(productContainer);\n const ispuRadioButtonEl = getISPUradioButtonEl(productContainer);\n const shipToRadioButtonEl = getShipToAddressradioButtonEl(productContainer);\n\n if (!ispuRadioButtonEl || !shipToRadioButtonEl) {\n return;\n }\n\n // Reset the radio button's state\n removeAttribute(ispuRadioButtonEl, 'disabled');\n removeAttribute(shipToRadioButtonEl, 'disabled');\n\n // Reset the change store link state\n removeClass(changeStoreLinkEl, HIDDEN_CLASS);\n\n if (availableForInStorePickup) {\n removeClass(changeStoreLinkEl, DISABLED_CLASS);\n } else {\n addClass(changeStoreLinkEl, DISABLED_CLASS);\n }\n\n // Updating inventory messages\n updateShipToInventoryMessages(shipToAddressAvailabilityStatus, messages, productContainer);\n const ispuAvailabilityMessageEl = queryFirst(ISPU_SELECT_STYLE_MESSAGE_SELECTOR, productContainer);\n ispuAvailabilityMessageEl.innerHTML = EMPTY_STRING;\n if (!ispuRadioButtonEl.hasAttribute(ISPU_SERVICE_ERROR_ATTR_NAME)) {\n updateISPUInventoryMessages(inStorePickUpAvailabilityStatus, isStorePickUpLowInventory, inStorePickUpAvailabilityMessage, inStorePickUpLowStockMessage, messages, productContainer, availableForInStorePickup);\n }\n\n const preferenceValue = getPreferedShippingPreference();\n if (availableForInStorePickup && inStorePickUpAvailabilityStatus !== NOT_AVAILABLE_STATUS) { // ISPU is available\n showISPUDeliveryMessage(productContainer);\n\n // Enable ISPU content\n const ispuContentEl = getISPUPreferenceContentEl(productContainer);\n const ispuLabelEl = queryFirst(RADIO_BUTTON_LABEL_SELECTOR, ispuRadioButtonEl.parentElement);\n removeClass([ispuContentEl, ispuLabelEl], DISABLED_CLASS);\n ispuRadioButtonEl.disabled = false;\n\n const selectedPreferenceEl = getSelectedPreferenceEl(productContainer);\n\n // If previously user preference is ISPU and (if there is no radio button selected or selected radio is not ISPU)\n if (preferenceValue === ISPU_RADIO_VALUE &&\n (!selectedPreferenceEl || (selectedPreferenceEl !== ispuRadioButtonEl))) {\n selectISPURadioButton(productContainer, ispuRadioButtonEl);\n }\n } else { // ISPU is not available\n disableISPURadioButton(productContainer, ispuRadioButtonEl, true);\n hideISPUDeliveryMessage(productContainer);\n }\n\n if (shipToAddressAvailabilityStatus !== NOT_AVAILABLE_STATUS) { // Ship to address is available\n // Enable ship To content\n const shipToContentEl = getShipToAddressContentEl(productContainer);\n const shipToLabelEl = queryFirst(RADIO_BUTTON_LABEL_SELECTOR, shipToRadioButtonEl.parentElement);\n removeClass([shipToContentEl, shipToLabelEl], DISABLED_CLASS);\n shipToRadioButtonEl.disabled = false;\n\n const selectedPreferenceEl = getSelectedPreferenceEl(productContainer);\n\n // Fallback to shipTo if no radio button is selected (If ISPU is unavailable)\n if (!selectedPreferenceEl) {\n selectShipToRadioButton(productContainer, shipToRadioButtonEl);\n }\n } else { // Ship to address is not available\n disableShipToRadioButton(productContainer, shipToRadioButtonEl, true);\n\n // If ISPU is available\n if (availableForInStorePickup && inStorePickUpAvailabilityStatus !== NOT_AVAILABLE_STATUS) {\n selectISPURadioButton(productContainer, ispuRadioButtonEl);\n }\n }\n // Displaying Ship To EDD information\n if (isEDDApplicable(shipToAddressAvailabilityStatus)) {\n injectEDDInfo(productContainer);\n } else {\n removeEDDInfo(productContainer);\n }\n });\n\n // On shipping preference radio button 'change'\n $shippingPreferenceContainer.on('change', SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR, (event) => {\n const radioButtonEl = event.target;\n const productContainer = radioButtonEl.closest(PRODUCT_DETAIL_CONTAINER_SELECTOR);\n\n // On Add to cart button click\n // it takes store-id from DIV element having 'store-name' class, making it ISPU add to cart.\n const availabilityElement = queryFirst(AVAILABILITY_MSG_SELECTOR, productContainer);\n if (radioButtonEl.checked &&\n radioButtonEl.value === ISPU_RADIO_VALUE) {\n setItemInLocalStorage(SHIPPING_PREFERENCE_KEY, ISPU_RADIO_VALUE);\n addStoreNameClass(productContainer);\n addClass(availabilityElement, HIDDEN_CLASS);\n } else {\n setItemInLocalStorage(SHIPPING_PREFERENCE_KEY, SHIP_TO_RADIO_VALUE);\n removeStoreNameClass(productContainer);\n removeClass(availabilityElement, HIDDEN_CLASS);\n }\n updateVisibilityOfLowInventoryMsg(productContainer);\n });\n\n // On change-store link 'click'\n $shippingPreferenceContainer.on('click', CHANGE_STORE_LINK_SELECTOR, (event) => {\n const productContainerEl = event.target.closest(PRODUCT_DETAIL_CONTAINER_SELECTOR);\n if (!getSelectedSizeEl(productContainerEl)) return;\n const inStorePickupCTA = queryFirst('.btn-in-store-pickup', productContainerEl);\n $(inStorePickupCTA).trigger('click');\n });\n}\n\n// Injecting radio button and content dynamically\nif (isShippingPreferencesViewEnabled()) {\n if (isEnabled && $shippingPreferenceContainer.length) {\n // Injects shipping preferences radio buttons\n const preferISPU = getPreferedShippingPreference() === ISPU_RADIO_VALUE;\n queryAll(PRODUCT_DETAIL_CONTAINER_SELECTOR).forEach(el => {\n injectShippingPreferences(el, preferISPU, messages);\n });\n\n // Updates data attribute on ISPU container to display select store view\n setAttribute(queryAll('.pickup-in-store-container'), 'data-select-store-view', true);\n\n // Hides Store Pick Up button exists below add to cart button\n addClass(queryAll('.pdp-in-store-inventory'), HIDDEN_CLASS);\n\n // Attaches events on radio button changes, color swatch changes, size changes, change store link\n initializeEvents();\n }\n}\n","// Classnames\nconst DISABLED_CLASS = 'disabled-section';\nconst NOT_AVAILABLE_CLASS = 'not-available';\nconst ISPU_STORE_NAME_CLASS = 'store-name';\nconst ISPU_SERVICE_ERROR_ATTR_NAME = 'data-ispu-service-down';\nconst ISPU_SERVICE_BLOCKED = 'service-blocked';\nconst PRE_ORDER_CLASS = 'pre-order';\nconst SHIP_TO_LOW_INVENTORY_CLASS = 'ship-to-low-inventory';\nconst CHECKOUT_HIDDEN_CLASS = 'checkout-hidden';\nconst PDP_SET_PAGE = 'product-set-item';\n\n// Container selectors\nconst PRODUCT_DETAIL_CONTAINER_SELECTOR = '.product-detail';\nconst PDP_CONTAINER_SELECTOR = '.pdp-container';\nconst SHIPPING_PREFERENCES_CONTAINER_SELECTOR = '.shipping-preferences';\nconst STORE_DETAIL_CONTAINER_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .store-detail-container';\n\n// Radio buttons classes\nconst PREFERENCE_SELECTOR = 'input[name=\"shipping-preference\"]:checked';\nconst ISPU_PREFERENCE_CONTAINER_SELECTOR = '.ispu-preference-container';\nconst ISPU_PREFERENCE_CONTENT_SELECTOR = ISPU_PREFERENCE_CONTAINER_SELECTOR + ' .content';\nconst SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR = 'input[name=shipping-preference]';\nconst ISPU_RADIO_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .preference-ispu';\nconst SHIP_TO_ADDRESS_RADIO_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .preference-ship-to-address';\nconst SHIP_TO_ADDRESS_CONTENT_SELECTOR = '.ship-to-address-preference-container .content';\nconst RADIO_BUTTON_LABEL_SELECTOR = '.form-check-label';\n\n// Radio button values\nconst SHIPPING_PREFERENCE_KEY = 'SHIPPING_PREFERENCE';\nconst ISPU_RADIO_VALUE = 'ISPU';\nconst SHIP_TO_RADIO_VALUE = 'SHIP_TO_ADDRESS';\nconst BOLT_PAY = 'BOLT_PAY';\n\n// Change Store link\nconst CHANGE_STORE_LINK_SELECTOR = '.change-store-link';\n\n// Store name and store address section\nconst STORE_DETAIL_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .store-detail';\n\n// Inventory and service messages\nconst STORE_SERVICE_INFO_MESSAGE_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .service-info-message';\nconst STORE_AVAILABILITY_MESSAGE_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .inventory-message';\n\nconst ISPU_INFO_MESSAGE_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .ispu-info-message';\nconst SHIP_TO_INFO_MESSAGE_SELECTOR = SHIPPING_PREFERENCES_CONTAINER_SELECTOR + ' .ship-to-info-message';\n\nconst ISPU_SELECT_STYLE_MESSAGE_SELECTOR = ISPU_PREFERENCE_CONTAINER_SELECTOR + ' .select-size-info-msg';\n\n//Availability Message Element\nconst AVAILABILITY_MSG_SELECTOR = '.product-availability .availability-message-text';\n//Inventory Message Element of ISPU\nconst INVENTORY_MSG_SELECTOR = '.inventory-message .availability-message-text';\n//Low Stock Message Element of ISPU\nconst LOW_STOCK_ISPU_SELECTOR = '.product-availability .ispu-low-stock-msg';\n//Regular Expression for Valid WishList Name\nconst WISHLIST_NAME_REGEX = /^[ A-Za-z0-9\\]\\.()[{},;:\"'?!\\u2026\\u2018\\u2019\\u201B\\u201C\\u201D\\u2014\\u2013-]*$/;\n//Regular Expression for Valid Postal Code for Loyalty\nconst LOYALTY_POSTAL_CODE_REGEX = /^\\d{5}$/;\n\nconst TRACKER_FUNCTIONAL_COOKIE = 'C0003';\nconst MY_ACCOUNT = 'myAccount';\nconst ORDER_CONFIRMATION = 'orderConfirmation';\n\nmodule.exports = {\n DISABLED_CLASS,\n NOT_AVAILABLE_CLASS,\n ISPU_STORE_NAME_CLASS,\n PRE_ORDER_CLASS,\n SHIP_TO_LOW_INVENTORY_CLASS,\n ISPU_SERVICE_ERROR_ATTR_NAME,\n ISPU_SERVICE_BLOCKED,\n CHECKOUT_HIDDEN_CLASS,\n PDP_SET_PAGE,\n\n PRODUCT_DETAIL_CONTAINER_SELECTOR,\n PDP_CONTAINER_SELECTOR,\n SHIPPING_PREFERENCES_CONTAINER_SELECTOR,\n STORE_DETAIL_CONTAINER_SELECTOR,\n\n PREFERENCE_SELECTOR,\n ISPU_PREFERENCE_CONTAINER_SELECTOR,\n ISPU_PREFERENCE_CONTENT_SELECTOR,\n SHIP_TO_ADDRESS_CONTENT_SELECTOR,\n SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR,\n ISPU_RADIO_SELECTOR,\n SHIP_TO_ADDRESS_RADIO_SELECTOR,\n RADIO_BUTTON_LABEL_SELECTOR,\n SHIPPING_PREFERENCE_KEY,\n ISPU_RADIO_VALUE,\n SHIP_TO_RADIO_VALUE,\n BOLT_PAY,\n\n CHANGE_STORE_LINK_SELECTOR,\n STORE_DETAIL_SELECTOR,\n STORE_SERVICE_INFO_MESSAGE_SELECTOR,\n STORE_AVAILABILITY_MESSAGE_SELECTOR,\n ISPU_INFO_MESSAGE_SELECTOR,\n SHIP_TO_INFO_MESSAGE_SELECTOR,\n ISPU_SELECT_STYLE_MESSAGE_SELECTOR,\n AVAILABILITY_MSG_SELECTOR,\n INVENTORY_MSG_SELECTOR,\n LOW_STOCK_ISPU_SELECTOR,\n WISHLIST_NAME_REGEX,\n TRACKER_FUNCTIONAL_COOKIE,\n LOYALTY_POSTAL_CODE_REGEX,\n MY_ACCOUNT,\n ORDER_CONFIRMATION\n};\n","'use strict';\n\nconst { EMPTY_STRING, NOT_AVAILABLE_STATUS } = require('../../constants');\nconst { ISPU_INFO_MESSAGE_SELECTOR, SHIP_TO_INFO_MESSAGE_SELECTOR, STORE_AVAILABILITY_MESSAGE_SELECTOR, STORE_SERVICE_INFO_MESSAGE_SELECTOR, LOW_STOCK_ISPU_SELECTOR } = require('./constants');\nconst { injectMessageAndUpdateElementState } = require('./messagingUtil');\nconst { queryFirst } = require('../../domUtil');\n\n/**\n * Function to get ISPU non-availability element\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} ISPU non-availability element\n */\nfunction getISPUNotAvailableMessageEl(productContainer) {\n return queryFirst(ISPU_INFO_MESSAGE_SELECTOR, productContainer);\n}\n\n/**\n * Function to get Ship-To address non-availability element\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} Ship-To non-availability element\n */\nfunction getShipToNotAvailableMessageEl(productContainer) {\n return queryFirst(SHIP_TO_INFO_MESSAGE_SELECTOR, productContainer);\n}\n\n/**\n * Function to get ISPU inventory level message element ('Low stock')\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} ISPU inventory level message element\n */\nfunction getISPUInventoryLevelMessageEl(productContainer) {\n return queryFirst(STORE_AVAILABILITY_MESSAGE_SELECTOR, productContainer);\n}\n\n/**\n * Function to get ISPU inventory level message element above Add To Tote ('Low stock')\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} ISPU low inventory level message element\n */\nfunction getISPULowInventoryMessageEl(productContainer) {\n return queryFirst(LOW_STOCK_ISPU_SELECTOR, productContainer);\n}\n\n/**\n * Function to get ISPU service response messaging element ('No stores found')\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} ISPU inventory level message element\n */\nfunction getStoreServiceResponseMessageEl(productContainer) {\n return queryFirst(STORE_SERVICE_INFO_MESSAGE_SELECTOR, productContainer);\n}\n\n/**\n * Function to inject Ship to address availability messages within shipping preferences section\n * @param {string} shipToAvailabilityStatus - Ship to address availability status\n * @param {Object} messages - global messages object\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction updateShipToInventoryMessages(shipToAvailabilityStatus, messages, productContainer) {\n // Updating ship to address inventory messages\n const shipToAvailableMessageEl = getShipToNotAvailableMessageEl(productContainer);\n if (shipToAvailableMessageEl) {\n injectMessageAndUpdateElementState(shipToAvailableMessageEl, shipToAvailabilityStatus === NOT_AVAILABLE_STATUS ? messages.notAvailableShipToMessage : EMPTY_STRING);\n }\n}\n\n/**\n * Function to inject ISPU availability messages within shipping preferences section\n * @param {string} ispuAvailabilityStatus - In store pick up inventory availability status\n * @param {boolean} isStorePickUpLowInventory - Is ISPU has low inventory\n * @param {string} ispuAvailabilityMessage - In store pick up inventory message\n * @param {Object} messages - global messages object\n * @param {HTMLElement} productContainer - Product container Element\n * @param {boolean} availableForInStorePickup - Is ISPU disabled for the product\n */\nfunction updateISPUInventoryMessages(ispuAvailabilityStatus, isStorePickUpLowInventory = false, ispuAvailabilityMessage = EMPTY_STRING, ispuLowInventoryMessage = EMPTY_STRING, messages, productContainer, availableForInStorePickup) {\n // Updating ISPU inventory messages\n const ispuNotAvailableMessageEl = getISPUNotAvailableMessageEl(productContainer);\n const ispuInventoryLevelMessageEl = getISPUInventoryLevelMessageEl(productContainer);\n const ispuLowInventoryMessageEl = getISPULowInventoryMessageEl(productContainer);\n if (availableForInStorePickup && ispuAvailabilityStatus !== NOT_AVAILABLE_STATUS) {\n injectMessageAndUpdateElementState(ispuNotAvailableMessageEl, EMPTY_STRING);\n injectMessageAndUpdateElementState(ispuInventoryLevelMessageEl, isStorePickUpLowInventory ? ispuAvailabilityMessage : EMPTY_STRING);\n injectMessageAndUpdateElementState(ispuLowInventoryMessageEl, isStorePickUpLowInventory ? ispuLowInventoryMessage : EMPTY_STRING);\n } else {\n injectMessageAndUpdateElementState(ispuNotAvailableMessageEl, availableForInStorePickup ? messages.notAvailableISPUMessage : messages.notEligibleISPUMessage);\n injectMessageAndUpdateElementState(ispuInventoryLevelMessageEl, EMPTY_STRING);\n injectMessageAndUpdateElementState(ispuLowInventoryMessageEl, EMPTY_STRING);\n }\n}\n\n/**\n * Function to inject service response messages\n * @param {Object} message - message to be injected\n * @param {boolean} wrapText - a flag to wrap the text conditionally\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction updateServiceResponseMessage(message, wrapText, productContainer) {\n const ispuServiceResponseEl = getStoreServiceResponseMessageEl(productContainer);\n message = wrapText ? `${message}` : message;\n injectMessageAndUpdateElementState(ispuServiceResponseEl, message);\n}\n\n/**\n * Function to clear availability messages within shipping preferences section\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction clearAllInventoryMessages(productContainer) {\n const ispuNotAvailableMessageEl = getISPUNotAvailableMessageEl(productContainer);\n injectMessageAndUpdateElementState(ispuNotAvailableMessageEl, EMPTY_STRING);\n\n const ispuInventoryLevelMessageEl = getISPUInventoryLevelMessageEl(productContainer);\n injectMessageAndUpdateElementState(ispuInventoryLevelMessageEl, EMPTY_STRING);\n\n const shipToAvailableMessageEl = getShipToNotAvailableMessageEl(productContainer);\n injectMessageAndUpdateElementState(shipToAvailableMessageEl, EMPTY_STRING);\n}\n\n/**\n * Function to clear service response messages\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction clearServiceResponseMessage(productContainer) {\n const ispuServiceResponseEl = getStoreServiceResponseMessageEl(productContainer);\n injectMessageAndUpdateElementState(ispuServiceResponseEl, EMPTY_STRING);\n}\n\nmodule.exports = {\n updateShipToInventoryMessages,\n updateISPUInventoryMessages,\n clearAllInventoryMessages,\n updateServiceResponseMessage,\n clearServiceResponseMessage\n};\n","'use strict';\n\nconst { HIDDEN_CLASS, EMPTY_STRING } = require('../../constants');\nconst { injectMessageAndUpdateElementState } = require('./messagingUtil');\nconst { queryFirst, addClass, removeClass } = require('../../domUtil');\n\nconst ISPU_DELIVERY_MESSAGE_SELECTOR = '.ispu-delivery-estimation-message';\n\n/**\n * Function to get ISPU delivery message element (e.g., Order by X pm Get it by Y pm)\n * @param {HTMLElement} productContainer - Product container Element\n * @returns {HTMLElement} ISPU non-availability element\n */\nfunction getISPUDeliveryMessageEl(productContainer) {\n return queryFirst(ISPU_DELIVERY_MESSAGE_SELECTOR, productContainer);\n}\n\n/**\n * Function to inject ISPU delivery estimation message in product container\n * @param {string} message - ISPU delivery estimation message\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction injectISPUDeliveryMessage(message, productContainer) {\n const ispuDeliveryMessageEl = getISPUDeliveryMessageEl(productContainer);\n injectMessageAndUpdateElementState(ispuDeliveryMessageEl, message);\n}\n\n/**\n * Function to remove ISPU delivery estimation message from product container\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction clearISPUDeliveryMessage(productContainer) {\n const ispuDeliveryMessageEl = getISPUDeliveryMessageEl(productContainer);\n injectMessageAndUpdateElementState(ispuDeliveryMessageEl, EMPTY_STRING);\n}\n\n/**\n * Function to show ISPU delivery estimation message from product container\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction showISPUDeliveryMessage(productContainer) {\n const ispuDeliveryMessageEl = getISPUDeliveryMessageEl(productContainer);\n removeClass(ispuDeliveryMessageEl, HIDDEN_CLASS);\n}\n\n/**\n * Function to hide ISPU delivery estimation message from product container\n * @param {HTMLElement} productContainer - Product container Element\n */\nfunction hideISPUDeliveryMessage(productContainer) {\n const ispuDeliveryMessageEl = getISPUDeliveryMessageEl(productContainer);\n addClass(ispuDeliveryMessageEl, HIDDEN_CLASS);\n}\n\nmodule.exports = {\n getISPUDeliveryMessageEl,\n injectISPUDeliveryMessage,\n clearISPUDeliveryMessage,\n showISPUDeliveryMessage,\n hideISPUDeliveryMessage\n};\n","const { removeClass, addClass } = require('../../domUtil');\nconst { HIDDEN_CLASS, EMPTY_STRING } = require('../../constants');\n\n/**\n * Function to add message safely and update its class\n * @param {HTMLElement} el - The source element\n * @param {string} message - store availability message\n * @param {string} selector - DOM element selector\n * @param {HTMLElement} container - Product container Element\n */\nfunction injectMessageAndUpdateElementState(el, message) {\n if (el) {\n if (message) {\n el.innerHTML = message;\n removeClass(el, HIDDEN_CLASS);\n } else {\n el.textContent = EMPTY_STRING;\n addClass(el, HIDDEN_CLASS);\n }\n }\n}\n\nmodule.exports = {\n injectMessageAndUpdateElementState\n};\n","'use strict';\n\nconst { queryFirst, addClass, removeClass, hasClass } = require('../../domUtil');\nconst { getNestedValue } = require('../../util');\nconst {\n PREFERENCE_SELECTOR, ISPU_STORE_NAME_CLASS, SHIPPING_PREFERENCES_CONTAINER_SELECTOR,\n ISPU_RADIO_SELECTOR, SHIP_TO_ADDRESS_RADIO_SELECTOR, CHANGE_STORE_LINK_SELECTOR,\n ISPU_PREFERENCE_CONTENT_SELECTOR, SHIP_TO_ADDRESS_CONTENT_SELECTOR, DISABLED_CLASS,\n SHIP_TO_RADIO_VALUE, RADIO_BUTTON_LABEL_SELECTOR, SHIP_TO_LOW_INVENTORY_CLASS,\n STORE_AVAILABILITY_MESSAGE_SELECTOR, INVENTORY_MSG_SELECTOR, ISPU_RADIO_VALUE, AVAILABILITY_MSG_SELECTOR, LOW_STOCK_ISPU_SELECTOR\n} = require('./constants');\nconst { HIDDEN_CLASS } = require('../../constants');\nconst { handleNotifyMe } = require('../../product/helper');\n\n/**\n * Function to get shipping preferences container within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getChangeStoreLinkEl(productContainerEl) {\n return queryFirst(CHANGE_STORE_LINK_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get shipping preferences container within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getShippingPreferencesContainerEl(productContainerEl) {\n return queryFirst(SHIPPING_PREFERENCES_CONTAINER_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get ISPU radio button within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getISPUradioButtonEl(productContainerEl) {\n return queryFirst(ISPU_RADIO_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get Ship To section's content within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getShipToAddressContentEl(productContainerEl) {\n return queryFirst(SHIP_TO_ADDRESS_CONTENT_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get ship to address radio button within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getShipToAddressradioButtonEl(productContainerEl) {\n return queryFirst(SHIP_TO_ADDRESS_RADIO_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get ISPU content radio button within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getISPUPreferenceContentEl(productContainerEl) {\n return queryFirst(ISPU_PREFERENCE_CONTENT_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get selected radio button preference within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getSelectedPreferenceEl(productContainerEl) {\n return queryFirst(PREFERENCE_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get add a ISPU required class to make ISPU - ADD TO CART work\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement?} storeNameEl - optional store name element\n */\nfunction addStoreNameClass(productContainerEl, storeNameEl) {\n storeNameEl = storeNameEl || queryFirst('.store-detail .name', productContainerEl);\n if (storeNameEl) {\n addClass(storeNameEl, ISPU_STORE_NAME_CLASS);\n }\n}\n\n/**\n * Function to get remove a ISPU required class to make SHIP TO - ADD TO CART work\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement?} storeNameEl - optional store name element\n */\nfunction removeStoreNameClass(productContainerEl, storeNameEl) {\n storeNameEl = storeNameEl || queryFirst('.store-detail .name', productContainerEl);\n if (storeNameEl) {\n removeClass(storeNameEl, ISPU_STORE_NAME_CLASS);\n }\n}\n\n/**\n * Function to check if a size is selected or not\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getSelectedSizeEl(productContainerEl) {\n return queryFirst('.size-btn.selected', productContainerEl);\n}\n\n/**\n * Function to update Visibility Of Low Inventory Msg for ISPU and Ship To an address\n * @param {HTMLElement} productContainerEl - Product container Element\n */\nfunction updateVisibilityOfLowInventoryMsg(productContainerEl) {\n const ispuLowStockEl = queryFirst(LOW_STOCK_ISPU_SELECTOR, productContainerEl);\n const availabilityElement = queryFirst(AVAILABILITY_MSG_SELECTOR, productContainerEl);\n const ispuLowInventory = queryFirst(STORE_AVAILABILITY_MESSAGE_SELECTOR);\n const ispuLowInventoryMsg = queryFirst(INVENTORY_MSG_SELECTOR, productContainerEl);\n const ispuRadioButtonEl = getISPUradioButtonEl(productContainerEl);\n const notifyMeButton = queryFirst('.notify-me-btn', productContainerEl);\n const notifyMeDesc = queryFirst('.notify-me-desc', productContainerEl);\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', productContainerEl);\n const selectedSizeElement = queryFirst('.size-btn.selected', productContainerEl);\n // If ISPU enabled, setting the message only after ispu inventory is created\n // one of the radio button is selected\n if (ispuRadioButtonEl && window.ispuProductInventory) {\n if (ispuRadioButtonEl.checked) {\n removeClass(addToCartSection, HIDDEN_CLASS);\n addClass([notifyMeDesc, notifyMeButton], HIDDEN_CLASS);\n removeClass(selectedSizeElement, 'not-available')\n addClass(availabilityElement, HIDDEN_CLASS);\n if (ispuLowInventoryMsg) {\n removeClass([ispuLowInventory, ispuLowStockEl], HIDDEN_CLASS);\n }\n else {\n addClass(ispuLowStockEl, HIDDEN_CLASS)\n }\n }\n else if (!ispuRadioButtonEl.disabled) {\n addClass([ispuLowInventory, ispuLowStockEl], HIDDEN_CLASS);\n removeClass(availabilityElement, HIDDEN_CLASS);\n if (selectedSizeElement) {\n const masterId = productContainerEl.dataset.masterid;\n const isSetPage = queryFirst('.custom-set-detail');\n const selectedSizeValue = selectedSizeElement ? selectedSizeElement.dataset.attrValue : '';\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainerEl);\n const selectedColorId = selectedColorElement.dataset.attrValue;\n const productInfo = window.productInfo[masterId];\n const variantGroupData = productInfo.variants[selectedColorId];\n const { sizes, images, formattedPrice } = variantGroupData;\n const selectedSizeData = sizes[selectedSizeValue];\n const { isNotifyMeEnabled, ID, forceOutOfStock } = selectedSizeData;\n const { variants } = isSetPage ? window.productInventory[masterId] : window.productInventory;\n const inventoryData = variants[ID];\n const { availabilityStatus } = inventoryData;\n if (availabilityStatus !== 'NOT_AVAILABLE') {\n removeClass(selectedSizeElement, 'not-available');\n } else {\n addClass(selectedSizeElement, 'not-available')\n }\n if (selectedSizeValue === '') {\n addClass(availabilityElement, HIDDEN_CLASS);\n }\n const productData = {\n available: !hasClass(selectedSizeElement, 'not-available'),\n isNotifyMeEnabled,\n id: ID,\n formattedPrice,\n forceOutOfStock,\n imageData: images && images.ispu ? images.ispu : ''\n };\n handleNotifyMe(productData, productContainerEl);\n }\n }\n }\n}\n/**\n * Function to select ISPU radio button\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement} ispuRadioButtonEl - ISPU radio button element\n * @param {boolean} enableISPUSection - flag to remove fade out style to ispu section's content\n */\nfunction selectISPURadioButton(productContainerEl, ispuRadioButtonEl, enableISPUSection) {\n ispuRadioButtonEl = ispuRadioButtonEl || getISPUradioButtonEl(productContainerEl);\n if (!ispuRadioButtonEl) return;\n\n ispuRadioButtonEl.disabled = false;\n removeClass(queryFirst(RADIO_BUTTON_LABEL_SELECTOR, ispuRadioButtonEl.parentElement), DISABLED_CLASS);\n\n ispuRadioButtonEl.checked = true;\n\n addStoreNameClass(productContainerEl);\n\n if (enableISPUSection) {\n const ispuContentEl = getISPUPreferenceContentEl(productContainerEl);\n removeClass(ispuContentEl, DISABLED_CLASS);\n }\n}\n\n/**\n * Function to disable & deselect Ship To radio button\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement} ispuRadioButtonEl - ISPU radio button element\n * @param {boolean} disableISPUSection - flag to add fade out style ispu section's content\n */\nfunction disableISPURadioButton(productContainerEl, ispuRadioButtonEl, disableISPUSection) {\n ispuRadioButtonEl = ispuRadioButtonEl || getISPUradioButtonEl(productContainerEl);\n if (!ispuRadioButtonEl) return;\n\n ispuRadioButtonEl.disabled = true;\n addClass(queryFirst(RADIO_BUTTON_LABEL_SELECTOR, ispuRadioButtonEl.parentElement), DISABLED_CLASS);\n\n ispuRadioButtonEl.checked = false;\n\n removeStoreNameClass(productContainerEl);\n\n if (disableISPUSection) {\n const ispuContentEl = getISPUPreferenceContentEl(productContainerEl);\n addClass(ispuContentEl, DISABLED_CLASS);\n }\n}\n\n/**\n * Function to select Ship To radio button\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement} shipToRadioButtonEl - Ship to address radio button element\n * @param {boolean} enableShipToContent - flag to add fade out style shipTo section's content\n */\nfunction selectShipToRadioButton(productContainerEl, shipToRadioButtonEl, enableShipToContent) {\n shipToRadioButtonEl = shipToRadioButtonEl || getShipToAddressradioButtonEl(productContainerEl);\n if (!shipToRadioButtonEl) return;\n\n shipToRadioButtonEl.disabled = false;\n removeClass(queryFirst(RADIO_BUTTON_LABEL_SELECTOR, shipToRadioButtonEl.parentElement), DISABLED_CLASS);\n\n shipToRadioButtonEl.checked = true;\n\n removeStoreNameClass(productContainerEl);\n\n if (enableShipToContent) {\n const shipToContentEl = getShipToAddressContentEl(productContainerEl);\n removeClass(shipToContentEl, DISABLED_CLASS);\n }\n}\n\n/**\n * Function to disable & deselect Ship To radio button\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement} shipToRadioButtonEl - Ship to address radio button element\n * @param {boolean} disableShipToContent - flag to remove fade out style from shipTo section's content\n */\nfunction disableShipToRadioButton(productContainerEl, shipToRadioButtonEl, disableShipToContent) {\n shipToRadioButtonEl = shipToRadioButtonEl || getISPUradioButtonEl(productContainerEl);\n if (!shipToRadioButtonEl) return;\n\n shipToRadioButtonEl.disabled = true;\n addClass(queryFirst(RADIO_BUTTON_LABEL_SELECTOR, shipToRadioButtonEl.parentElement), DISABLED_CLASS);\n\n shipToRadioButtonEl.checked = false;\n\n if (disableShipToContent) {\n const shipToContentEl = getShipToAddressContentEl(productContainerEl);\n addClass(shipToContentEl, DISABLED_CLASS);\n }\n}\n\n/**\n * Function to get preferred shipping preference\n * @returns {string} - Preferred shipping preference value\n */\nfunction getPreferedShippingPreference() {\n const shippingPreferencesConfig = getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig') || {};\n const { activeStoreFilter } = shippingPreferencesConfig;\n return activeStoreFilter ? ISPU_RADIO_VALUE : SHIP_TO_RADIO_VALUE;\n}\n\n/**\n * Function to check if selected size is available for in-store pickup\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {boolean} - ISPU availability for selected size\n */\nfunction getAvailableForInStorePickup(productContainerEl) {\n const selectedSizeElement = getSelectedSizeEl(productContainerEl);\n const masterId = productContainerEl.dataset.masterid;\n const selectedSizeValue = selectedSizeElement ? selectedSizeElement.dataset.attrValue : '';\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainerEl);\n const selectedColorId = selectedColorElement.dataset.attrValue;\n const productInfo = window.productInfo[masterId];\n const variantGroupData = productInfo.variants[selectedColorId];\n const { sizes } = variantGroupData;\n const selectedSizeData = sizes[selectedSizeValue];\n return selectedSizeData.availableForInStorePickup;\n}\n\nmodule.exports = {\n getChangeStoreLinkEl,\n getSelectedPreferenceEl,\n getShippingPreferencesContainerEl,\n getISPUradioButtonEl,\n getShipToAddressradioButtonEl,\n getShipToAddressContentEl,\n getISPUPreferenceContentEl,\n getSelectedSizeEl,\n addStoreNameClass,\n removeStoreNameClass,\n selectISPURadioButton,\n disableISPURadioButton,\n selectShipToRadioButton,\n disableShipToRadioButton,\n getPreferedShippingPreference,\n updateVisibilityOfLowInventoryMsg,\n getAvailableForInStorePickup\n};\n","'use strict';\n\nconst { queryFirst } = require('../../domUtil');\nconst { storeDetail } = require('../../templates').shippingPreferenceTemplates;\nconst { STORE_DETAIL_SELECTOR, STORE_DETAIL_CONTAINER_SELECTOR } = require('./constants');\n\n/**\n * Function to get store detail within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getStoreDetailEl(productContainerEl) {\n return queryFirst(STORE_DETAIL_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to get store detail container within product container\n * @param {HTMLElement} productContainerEl - Product container Element\n * @returns {Object} returns the target as a DOM node\n */\nfunction getStoreDetailContainerEl(productContainerEl) {\n return queryFirst(STORE_DETAIL_CONTAINER_SELECTOR, productContainerEl);\n}\n\n/**\n * Function to inject store details DOM elements within product container\n * @param {Object} store - Store object\n * @param {HTMLElement} productContainerEl - Product container Element\n * @param {HTMLElement?} storeDetailContainerEl - Store detail container element\n */\nfunction addStoreDetail(store, productContainerEl, storeDetailContainerEl) {\n storeDetailContainerEl = storeDetailContainerEl || getStoreDetailContainerEl(productContainerEl);\n const { ID, name, address1, city, stateCode, postalCode } = store;\n const storeDetailHTML = storeDetail(ID, name, address1, city, stateCode, postalCode);\n\n $(storeDetailContainerEl).html(storeDetailHTML);\n}\n\nmodule.exports = {\n getStoreDetailEl: getStoreDetailEl,\n getStoreDetailContainerEl: getStoreDetailContainerEl,\n addStoreDetail: addStoreDetail\n};\n","module.exports = {\n breakpoints: {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 1024,\n xl: 1362\n },\n\n // Stores\n PREFERRED_STORE_ID: 'PREFERRED_STORE_ID',\n\n // Constant values\n EMPTY_STRING: '',\n\n // DOM Class\n HIDDEN_CLASS: 'd-none',\n INVALID_CLASS: 'is-invalid',\n INVISIBLE_CLASS: 'invisible',\n NO_SCROLL_CLASS: 'no-scroll',\n IS_STICKY_CLASS: 'is-sticky',\n SELECTED_CLASS: 'selected',\n\n // Product status\n PREORDER_STATUS: 'PREORDER',\n IN_STOCK_STATUS: 'IN_STOCK',\n NOT_AVAILABLE_STATUS: 'NOT_AVAILABLE',\n\n // Custom DOM events\n\n // Control keys\n\n // Event KeyCodes\n KEYCODE_TAB: 9,\n KEYCODE_ESCAPE: 27,\n KEYCODE_UP: 38,\n KEYCODE_DOWN: 40\n};\n","/**\n * DOM utilities to use native browser capabilities and avoid dependencies.\n *\n * @module dom.dom-util\n * @version 1.0.0\n * @since Sept 26 2019\n *\n * @typedef {Object} ProductData\n * @property {string} colorCode - The product color code (E.g. 002)\n * @property {string} masterId - The product master ID (E.g. 003168)\n * @property {string} originalPrice - The product original price (E.g. 148.00)\n * @property {string} productColor - The product color name (E.g. Onyx)\n * @property {string} productId - The product SKU (E.g. 889069580469)\n * @property {string} productName - The product name (E.g. Keegan Lace Top)\n * @property {string} productPrice - The product sale price (E.g. 98.00)\n * @property {string} productSize - The product size (E.g. M)\n * @property {string} variationGroupId - The product variation group ID (E.g. 003168-onyx)\n */\n\nconst { breakpoints } = require('./constants');\n\n/**\n * Native querySelector to find first element in the dom with given selector\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {Object} returns the target as a DOM node\n */\nconst queryFirst = exports.queryFirst = (selector, parent = document) => {\n if (!parent) return null;\n return parent.querySelector(selector);\n};\n/**\n * loadScript to asynchronously load a script tag in DOM\n *\n * @param {string} source Script tag src value\n * @param {boolean} isAsync Set script to async true or false\n */\nexports.loadScript = (source, isAsync = false) => {\n return new Promise((resolve) => {\n const script = document.createElement('script');\n script.src = source;\n script.async = isAsync;\n script.onload = () => {\n resolve();\n }\n document.body.append(script);\n });\n};\n/**\n * loadInput to load an input tag in DOM\n *\n * @param {string} referrerID Referrer ID value\n * @param {Array} formElement Form element\n */\nexports.loadInput = (referrerID, formElement) => {\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'referrerID');\n input.setAttribute('class', 'referrerID');\n input.setAttribute('value', referrerID);\n formElement.appendChild(input);\n};\n/**\n * Native querySelectorAll to find all the dom element with given selector.\n *\n * @param {string | Object} selector Target selector element.\n * @param {string | Object} parent Parent element, if it not provided\n * fallback to document.\n * @return {nodeList | Array} Returns the target as a DOM node.\n */\nconst queryAll = exports.queryAll = (selector, parent = document) => {\n if (!parent) return null;\n return [].slice.call(parent.querySelectorAll(selector), 0);\n};\n\n/**\n * Returns the value(s) for the specified CSS rule(s), or all computed styles if no rule is specified\n *\n * @param {Element} element Target element\n * @param {string} rule CSS rule name (E.g. padding-top)\n * @return {string | Array | Object} Returns a string value, array of values, or styles object\n */\nconst getStyles = exports.getStyles = (element, ...rules) => {\n const styles = getComputedStyle(element);\n\n if (!rules.length) {\n return styles;\n } else if (rules.length === 1) {\n return styles[rules[0]];\n }\n return rules.map(rule => styles[rule]);\n};\n\n/**\n * Remove DOM element\n *\n * @param {string | Object} el Target element.\n */\nexports.remove = el => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.parentElement.removeChild(node);\n }\n } else {\n el.parentElement.removeChild(el);\n }\n};\n\n/**\n * Set attribute to single or multiple elements\n *\n * @param {string | Object} el Target element.\n * @param {string} attr attribute that need to be added.\n * @param {string | boolean} val value that need to be set for an attribute.\n */\nexports.setAttribute = (el, attr, val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.setAttribute(attr, val);\n }\n } else {\n el.setAttribute(attr, val);\n }\n};\n\n/**\n * Remove attribute to single or multiple elements\n *\n * @param {string | Object} el Target element.\n * @param {string} attr attribute that need to be removed.\n */\nexports.removeAttribute = (el, attr) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.removeAttribute(attr);\n }\n } else {\n el.removeAttribute(attr);\n }\n};\n\n/**\n * Adds class or classes to the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.addClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.add(...val);\n }\n } else {\n el.classList.add(...val);\n }\n};\n\n/**\n * Removes class or classes from the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.removeClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.remove(...val);\n }\n } else {\n el.classList.remove(...val);\n }\n};\n\n/**\n * Toggles class or classes to the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n */\nexports.toggleClass = (el, ...val) => {\n if (!el) return;\n if (Array.isArray(el) || el instanceof NodeList) {\n for (let i = 0, n = el.length; i < n; i++) {\n const node = el[i];\n if (node) node.classList.toggle(...val);\n }\n } else {\n el.classList.toggle(...val);\n }\n};\n\n/**\n * Looks for availability of class or classes in the classList of particular element.\n *\n * @param {string | Object} el Target element.\n * @param {string | Array} val class name or class names as list of arguments.\n * @return {boolean} Returns availability of class in the target element.\n */\nexports.hasClass = (el, ...classes) => {\n if (!el) return false;\n\n const { classList } = el;\n\n return !!classList && classes.every(className => classList.contains(className));\n};\n\n/**\n * Throttle util to prevent repeatative callbacks\n *\n * @param {function} callback Callback function.\n * @param {number} limit Timeout upon which throttle callback need to be called.\n * fallback to document.\n * @param {function} waitCallback The callback to fire while the function is being throttled.\n * @return {function} Throttle closure function.\n */\nexports.throttle = (callback, limit = 250, waitCallback = function () { }) => {\n let isThrottling = false;\n\n return (...args) => {\n if (isThrottling) return waitCallback(...args);\n\n const returnValue = callback.apply(this, args);\n isThrottling = true;\n\n setTimeout(() => {\n isThrottling = false;\n }, limit);\n\n return returnValue;\n };\n};\n\n/**\n * Throttle util to prevent repeatative callbacks\n *\n * @param {function} callback - Callback function.\n * @param {number} minimumDelay - Delay upon which debounce callback need to be called.\n * @param {object} [options] - Additional options to control debouncing behavior\n * @param {function} [options.condition] - A function that will cause debouncing to be ignored for one cycle if it returns true\n * @param {function} [options.callback] - A function that will run without restriction, each time the debounced method is called\n * @return {function} Debounce closure function.\n */\nexports.debounce = (callback, minimumDelay = 250, options = {}) => {\n const { condition, callback: unrestrictedCallback } = options;\n let timer;\n\n return (...args) => {\n clearTimeout(timer);\n\n if (typeof unrestrictedCallback === 'function') unrestrictedCallback(...args);\n\n if (typeof condition === 'function' && condition(...args)) {\n callback(...args);\n } else {\n timer = setTimeout(() => {\n callback(...args);\n }, minimumDelay);\n }\n };\n};\n\nexports.toArray = (...args) => {\n const makeArray = target => {\n let newTarget;\n if (!Array.isArray(target)) {\n const array = [].slice.call(target);\n newTarget = array.length ? array : [target];\n }\n return newTarget;\n };\n return args.reduce((results, arg) => {\n return results.concat(makeArray(arg));\n }, []);\n};\n\n/**\n * Height util to get outer height of element including margins\n *\n * @param {string | Object} el target element\n * @return {string} height of element\n */\nexports.outerHeight = el => {\n const styles = getStyles(el);\n\n return el.offsetHeight + parseInt(styles.marginTop, 0) + parseInt(styles.marginBottom, 0);\n};\n\n/**\n * Determine if an element is in the viewport\n * (c) 2017 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} el The element\n * @return {boolean} Returns true if element is in the viewport\n */\nexports.isInViewportCheck = el => {\n const scroll = window.scrollY || window.pageYOffset;\n const boundsTop = el.getBoundingClientRect().top + scroll;\n\n const numberOfViewportToCheck = el.dataset.nextViewportLazyLoad ? 2 : 1;\n\n const viewport = {\n top: scroll,\n bottom: scroll + window.innerHeight * numberOfViewportToCheck\n };\n\n const bounds = {\n top: boundsTop,\n bottom: boundsTop + el.clientHeight\n };\n\n return (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) || (bounds.top <= viewport.bottom && bounds.top >= viewport.top);\n};\n\n/**\n * Determine if an element is in the viewport\n * (c) 2017 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} el The element\n * @return {boolean} Returns true if element is in the viewport\n */\nexports.isInViewport = el => {\n var rect = el.getBoundingClientRect();\n\n return rect.bottom > 0 &&\n rect.right > 0 &&\n rect.left < (window.innerWidth || document.documentElement.clientWidth) &&\n rect.top < (window.innerHeight || document.documentElement.clientHeight);\n};\n\n/**\n * Displays empty cart message\n * @param {string} message - Error message to display\n */\nexports.emptyCart = message => {\n const cartElements = queryAll('.cart');\n cartElements.forEach(cartElement => {\n cartElement.innerHTML = `

${message}

Continue Shopping
`;\n });\n};\n\n/**\n * Animates scrolling the page to the specified Y coordinate\n * @param {number} y - The Y coordinate to scroll to\n * @param {number} duration - The duration of the animation in milliseconds\n * @param {function} callback - The callback to run when the animation is complete\n * @returns {JQuery}\n */\nexports.scrollTo = (y, duration = 600, callback = function () { }) => $('html, body').scrollTo(y, duration, callback);\n\n/**\n * Finds the last element sibling on the same line as the specified element\n * @param {Element} element - The element to reference when looking for siblings\n * @returns {Element} - returns last element in the row\n */\nexports.getLastElementInRow = element => {\n if (!element.nextElementSibling) return element;\n\n const bottom = element.offsetTop + element.scrollHeight;\n let sibling;\n\n while ((sibling = element.nextElementSibling)) {\n if (sibling.offsetTop >= bottom) return sibling.previousElementSibling;\n element = sibling;\n }\n\n return element;\n};\n\n/**\n * Update url with query parameter to handle remember placement\n *\n * @param {DocumentFragment} fragment - A DocumentFragment object\n * @return {undefined}\n */\nexports.updateUrlQueryParam = fragment => {\n const queryParamsElement = queryFirst('.append-params', fragment);\n const permaLink = queryFirst('.permalink', fragment);\n\n if (permaLink) {\n window.history.pushState({ path: permaLink.value }, '', permaLink.value);\n } else if (queryParamsElement) {\n const newUrl = window.location.href.split('?')[0] + '?' + queryParamsElement.value;\n window.history.pushState({ path: newUrl }, '', newUrl);\n }\n};\n\n/**\n * This method returns character count\n * @param {HTMLElement} element - current element for which count has to be calculated\n * @return {number} character count\n */\nexports.getCharacterCount = function (element) {\n if (!element) {\n return 0;\n }\n return element.value.length;\n};\n\n/**\n * Waits for a specified element to exist.\n * @param {string} selector - The selector to match\n * @param {element} scope - The containing element to search within (default: document)\n * @param {number} timeout - How long (in milliseconds) to wait before rejecting the promise\n * @returns a Promise containing all matched elements\n */\nexports.waitForElement = (selector, scope = document, timeout = 0) =>\n new Promise((resolve, reject) => {\n const elements = queryAll(selector, scope);\n\n if (elements.length) return resolve(elements);\n\n const observer = new MutationObserver((mutations, self) => {\n const elements = queryAll(selector, scope);\n\n if (elements.length) {\n self.disconnect();\n resolve(elements);\n }\n });\n\n observer.observe(scope, { childList: true, subtree: true });\n\n if (timeout) {\n setTimeout(() => {\n observer.disconnect();\n reject('Timed out');\n }, timeout);\n }\n });\n\n/**\n * Binds an event listener to a callback using native methods and selector matching.\n * @param {element} element - The element to attach the listener to\n * @param {string|array} eventTypes - The type of events to listen for\n * @param {function} callback - The method to run when the event is fired\n * @param {object} [options={}] - Additional options to configure the event binding\n * @param {function} [options.eventCondition] - A function that returns a boolean indicating whether to proceed with the callback when the event is triggered\n * @param {string} [options.bindEngine='native'] - The engine to use when binding the event (native or jQuery)\n * @param {boolean} [options.once=false] - Whether to fire the event callback only once and then unbind\n */\nexports.bind = (element, eventTypes, callback, options = {}) => {\n const {\n eventCondition,\n bindEngine = 'native',\n once = false\n } = options;\n\n if (!Array.isArray(eventTypes)) eventTypes = eventTypes.split(',').map(type => type.trim());\n\n const useJQuery = (String(bindEngine).toLowerCase() === 'jquery');\n let { targetSelectors = [] } = options;\n\n if (typeof targetSelectors === 'string') {\n targetSelectors = [targetSelectors];\n }\n\n const handler = (e, extraData) => {\n let { target } = e;\n\n if (extraData instanceof Element || extraData === document) {\n target = extraData;\n } else if (extraData instanceof jQuery.Event) {\n target = extraData.target;\n } else {\n e.data = extraData;\n }\n\n let targetElement = target;\n\n if (Array.isArray(targetSelectors) && targetSelectors.length) {\n // If an array of selectors is provided, store a reference to the closest element that is matched\n targetElement = targetSelectors.reduce((result, selector) => {\n if (result) return result;\n const node = target.closest(selector);\n if (node) result = { node, selector };\n return result;\n }, false);\n }\n\n // We need a target element as context or we don't execute our callback\n if (!targetElement) return;\n\n const { node, selector } = targetElement;\n\n // Only execute the callback if the eventCondition allows\n if (typeof eventCondition === 'function' && !eventCondition(e, node || targetElement)) {\n return;\n }\n\n if (once) {\n if (useJQuery) {\n const $element = $(element);\n\n eventTypes.forEach(eventType => {\n $element.off(eventType, handler);\n });\n } else {\n eventTypes.forEach(eventType => {\n element.removeEventListener(eventType, handler, true);\n });\n }\n }\n\n if (node && selector) {\n callback(e, node, selector);\n } else {\n callback(e, targetElement);\n }\n };\n\n if (useJQuery) {\n const $element = $(element);\n\n eventTypes.forEach(eventType => {\n $element.on(eventType, handler);\n });\n } else {\n eventTypes.forEach(eventType => {\n element.addEventListener(eventType, handler, true);\n });\n }\n};\n\n/**\n * Function to get product data\n * @param {HTMLElement} element - Product container element or srcElement\n * @returns {ProductData} - Product data\n */\nexports.getProductData = element => {\n const { getNestedValue } = require('./util');\n const PREORDER_STATUS = 'PREORDER';\n\n element = element.closest('.color-attribute, .product-tile-swatch, .tile-img-link') || element;\n\n const container = element.closest('.product, .product-detail') || element.closest('.product-info') || element.closest('.cart-product-line-item') || element;\n const { dataset } = element;\n const { dataset: containerData } = container;\n const { monetatePid } = containerData;\n const isQuickview = !!container.closest('.product-quickview');\n\n let { productInfo, productInventory } = window;\n\n // Update the product data where possible\n let pid = containerData.wishlistId || containerData.pid || dataset.pid;\n let masterId = dataset.masterid || containerData.masterid;\n let productName = dataset.productName || containerData.productName;\n let productSize = dataset.productSize || containerData.productSize;\n let swatchName = dataset.swatchName || containerData.swatchName;\n let colorCode = dataset.attrValue;\n\n let variationGroupId;\n let originalPrice;\n let productPrice;\n let isPreorder;\n\n let productId = [dataset.productId, containerData.productId, pid].find(id => {\n if (id && ~id.indexOf('-')) {\n if (!variationGroupId) variationGroupId = id;\n\n return false;\n }\n\n return id;\n }) || '';\n\n // We need the color code, which is only available on the swatch\n if (!swatchName || !element.closest('.color-attribute, .product-tile-swatch')) {\n const colorEl = queryFirst('.color-attribute .swatch-circle.selected, .product-tile-swatch.selected', container) || queryFirst('.selected-swatch-name', container) || queryFirst('.tile-img-link', container);\n const swatchButton = (colorEl && colorEl.closest('.color-attribute'));\n\n swatchName = (colorEl && (colorEl.dataset.attrDisplayvalue || colorEl.dataset.swatchName || colorEl.textContent.trim())) || '';\n colorCode = (colorEl && colorEl.dataset.attrValue) || '';\n variationGroupId = variationGroupId || (swatchButton && swatchButton.dataset.productId) || '';\n }\n\n // Use the PID if the productId is missing or set to master\n if (!productId || (productId.length <= 6 && pid)) productId = pid;\n\n // We need the master ID to look up the product\n if (!masterId && monetatePid) {\n masterId = monetatePid.split('-')[0] || '';\n }\n\n if (!masterId) {\n if (pid && (~pid.indexOf('-') || pid.length <= 6)) {\n masterId = pid.split('-')[0];\n } else if (productId && ~productId.indexOf('-')) {\n masterId = productId.split('-')[0];\n } else {\n const tileEl = element.closest('.product-tile');\n masterId = ((tileEl && tileEl.dataset.monetatePid) || '').split('-')[0];\n }\n }\n\n // QuickView productInfo\n if (isQuickview) {\n productInfo = getNestedValue(window, 'quickviewProductInfo.productInfo');\n productInventory = getNestedValue(window, 'quickviewProductInfo.productInventory');\n }\n\n // Now we can check the productInfo\n if (productInfo && masterId && colorCode) {\n let productData;\n if (isQuickview) {\n productData = getNestedValue(productInfo, 'variants.{0}', colorCode);\n } else {\n productData = getNestedValue(productInfo, '{0}.variants.{1}', masterId, colorCode);\n }\n\n if (productData) {\n originalPrice = productData.standardPrice + '.00';\n productPrice = productData.price + '.00';\n variationGroupId = productData.groupId;\n isPreorder = productData.isPreorder;\n }\n }\n\n if (!productName) {\n const productNameEl = queryFirst('.product-name, .line-item-name', container);\n productName = (productNameEl && productNameEl.textContent.trim()) || '';\n }\n\n if (!productSize) {\n const productSizeEl = queryFirst('.size-btn.selected, .wishlist-item-attribute-size .wishlist-detail-value', container);\n productSize = (productSizeEl && (productSizeEl.dataset.valueId || productSizeEl.textContent.trim())) || '';\n }\n\n if (productSize && pid) {\n isPreorder = getNestedValue(productInventory, 'variants[{0}].availabilityStatus', pid) === PREORDER_STATUS;\n }\n\n if (!originalPrice) {\n const originalPriceEl = queryFirst('.price-section .ssPrice', container);\n originalPrice = ((originalPriceEl && originalPriceEl.value) || '').split('$').pop();\n }\n\n if (originalPrice && !~originalPrice.indexOf('.')) {\n originalPrice += '.00';\n }\n\n if (!productPrice) {\n const productPriceEl = queryFirst('.price-section .sales .ssSalesPrice', container);\n productPrice = ((productPriceEl && productPriceEl.value) || '').split('$').pop();\n }\n\n if (productPrice && !~productPrice.indexOf('.')) {\n productPrice += '.00';\n }\n\n if (!swatchName) {\n const productColorEl = queryFirst('.wishlist-item-attribute-color .wishlist-detail-value', container);\n swatchName = (productColorEl && productColorEl.textContent.trim()) || '';\n }\n\n // Sanity check\n if (masterId && masterId.length > 6) masterId = '';\n if (productId && (~productId.indexOf('-') || productId.length <= 6)) productId = '';\n if (variationGroupId && !~variationGroupId.indexOf('-')) variationGroupId = '';\n\n return {\n colorCode,\n masterId,\n originalPrice,\n productColor: swatchName,\n productId,\n productName,\n productPrice,\n productSize,\n variationGroupId,\n isPreorder\n };\n};\n\n/**\n * Check whether the device matches the specified breakpoint at a minimum (i.e. min-width)\n * @param {string} breakpoint - The breakpoint to match against (xs; sm; md; lg; xl)\n * @returns {boolean} - Whether the device matches the breakpoint\n */\nexports.matchesBreakpoint = breakpoint => breakpoint in breakpoints && window.matchMedia(`(min-width: ${breakpoints[breakpoint]}px)`).matches;\n\nexports.getCSRFToken = (scope = document.body) => {\n const token = scope.querySelector('.csrf-token');\n return (token && token.value) || '';\n};\n\n/**\n * Renders a string into a template and returns the DOM Fragment.\n * @param {string} html - the html content.\n * @returns {DocumentFragment} - The input string as a document fragment\n */\nexports.renderFragment = html => {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template.content;\n};\n\n/**\n * Gets all accessible cookies and creates a plain key/value object\n * @returns {Object} Plain object containing cookie names and values\n */\nexports.getCookieMap = () => document.cookie.split(';').reduce((result, keyValue) => {\n const [key, value] = keyValue.trim().split('=');\n result[key] = decodeURIComponent(value);\n return result;\n}, {});\n\n/**\n * Validating the date as per month\n */\nexports.validateDate = () => {\n let monthSelector = document.getElementById('birthdaymonth');\n let dateSelector = document.getElementById('birthdaydate');\n const { message } = dateSelector.dataset;\n /**\n * Validating date\n */\n function validateDateOption() {\n let m = monthSelector.value;\n let d = dateSelector.value;\n const mlength = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m];\n dateSelector.length = 0;\n const labelOption = new Option();\n labelOption.text = message;\n labelOption.value = '';\n dateSelector.add(labelOption);\n for (let i = 1; i <= mlength; i++) {\n let option = new Option();\n option.value = i;\n option.text = i;\n if (i.toString() === d) option.selected = true;\n dateSelector.add(option);\n }\n }\n monthSelector.addEventListener('change', validateDateOption);\n validateDateOption();\n};\n\nexports.getStyles = getStyles;\nexports.queryAll = queryAll;\n","'use strict';\n\n// OOTB Code\nlet googleMapScript;\nlet geocoder;\n\n/**\n * This method includes google api for using google maps\n * @param {string} googleKey google api key\n */\nfunction includeGoogleMaps(googleKey) {\n if (!googleMapScript && googleKey) {\n googleMapScript = document.createElement('script');\n googleMapScript.src = `https://maps.googleapis.com/maps/api/js?key=${googleKey}`;\n document.head.append(googleMapScript);\n }\n}\n\n/**\n * This method renders location from google maps based on address\n * @param {function} callBack callback function\n * @param {Object} mixin additional parameters\n */\nfunction getLatLong(callBack, mixin = {}) {\n const { address } = mixin;\n geocoder = new google.maps.Geocoder();\n if (!(geocoder && address)) return;\n const data = Object.assign({}, mixin);\n geocoder.geocode({ address }, function (results, status) {\n if (status === google.maps.GeocoderStatus.OK) {\n const { location } = results[0].geometry;\n data.latitude = location.lat();\n data.longitude = location.lng();\n }\n callBack(data);\n });\n}\n\nexport { includeGoogleMaps, getLatLong };\n","'use strict';\n\nconst formValidation = require('base/components/formValidation');\nconst createErrorNotification = require('base/components/errorNotification');\nconst baseLogin = require('base/login/login');\n\nconst { queryFirst, addClass, removeClass, loadInput } = require('../domUtil');\nconst { formatPhoneNumber, getItemFromLocalStorage } = require('../util');\nconst registrationFormPhone = queryFirst('.registration-form-phone');\nconst loyaltyGuestReferralModal = queryFirst('#guest-friend-referral-popup');\nconst $body = $('body');\n\nwindow.addEventListener('load', (event) => {\n const formElement = queryFirst('.change-password-form');\n const referrerID = getItemFromLocalStorage('REFERRED_ID');\n if (referrerID && formElement) {\n loadInput(referrerID, formElement);\n }\n if (loyaltyGuestReferralModal) {\n $(loyaltyGuestReferralModal).modal('show');\n }\n});\n\nmodule.exports = {\n ...baseLogin,\n\n login: function () {\n /*\n This event finishes the form.login submission response processing with redirect\n */\n $(document).one('login:success:gtm', function(event, data) {\n if (data?.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n });\n $('form.login').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n form.spinner().start();\n $('form.login').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n formValidation(form, data);\n $('form.login').trigger('login:error', data);\n } else {\n $('form.login').trigger('login:success', data);\n // redirect moved to event \"login:success\" processor\n }\n },\n error: function (data) {\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('form.login').trigger('login:error', data);\n form.spinner().stop();\n }\n }\n });\n return false;\n });\n },\n\n register: function () {\n /*\n This event finishes the form.registration submission response processing with redirect\n */\n $(document).one('register:success:gtm', function(event, data) {\n if (data?.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n });\n $('form.registration').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n $body.spinner().start();\n form.trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n $body.spinner().stop();\n if (data.success) {\n form.trigger('register:success');\n // redirect moved to event \"register:success\" processor\n } else {\n formValidation(form, data);\n form.trigger('register:error');\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification($('.error-messaging'), err.responseJSON.errorMessage);\n }\n\n $body.spinner().stop();\n }\n });\n return false;\n });\n },\n\n resetPassword: function () {\n const resetPasswordDialog = $('#requestPasswordResetModal');\n\n resetPasswordDialog.on('hidden.bs.modal', function () {\n removeClass(queryFirst('.password-reset-section', this), 'request-success');\n const emailEl = document.getElementById('reset-password-email');\n emailEl.value = '';\n removeClass(emailEl, 'is-invalid');\n });\n\n $('.reset-password-form').on('submit', function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n form.spinner().start();\n $('.reset-password-form').trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n formValidation(form, data);\n } else {\n // LP Customization start\n addClass(queryFirst('.reset-password-request-modal .password-reset-section'), 'request-success');\n // LP Customization end\n }\n },\n error: function () {\n form.spinner().stop();\n resetPasswordDialog.modal('hide').one('hidden.bs.modal', () => {\n $body.trigger('csrf:error');\n });\n }\n });\n\n return false;\n });\n },\n handleLogin: function () {\n const loginBtnEl = queryFirst('.account-login-btn');\n const $loginFormEl = $('form.login');\n $loginFormEl.on('login:submit', function () {\n loginBtnEl.disabled = true;\n });\n\n $loginFormEl.on('login:error', function () {\n loginBtnEl.disabled = false;\n });\n }\n};\n\nformatPhoneNumber(registrationFormPhone);\n","'use strict';\nconst { queryFirst, addClass, removeClass, throttle, hasClass, setAttribute, queryAll, loadInput, validateDate } = require('../domUtil');\nconst formValidation = require('base/components/formValidation');\nconst { getTimeRemaining, getItemFromLocalStorage, formatPhoneNumber, getJSON } = require('../util');\nconst { resetPassword } = require('../login/login');\nconst { MY_ACCOUNT } = require('../components/shippingPreference/constants');\nconst $body = $('body');\nconst hiddenClass = 'd-none';\nconst loyaltyWelcomeDialog = queryFirst('.loyalty-welcome-popup');\nconst loyaltyEnrollNowDialog = queryFirst('#loyalty-enrollnow-modal');\nconst invalidClass = 'is-invalid';\nconst desktopShowClass = 'desktop-show';\nconst activeClass = 'active';\nconst exclusiveCarouselIdSelector = '#exclusive-experience-carousel';\nlet mobileImg, desktopImg;\nconst root = document.documentElement;\nconst { initSpecificCarousel } = require('../components/carousel');\nconst loyaltyEarlyAccessRegisterForm = queryFirst('#loyalty-early-access-register');\nconst earlyAccessPdpSignInRegistration = queryAll('.js-early-access-sign-in-cta');\nconst { ajaxFormInvalid, ajaxFormSubmit, enableFormSubmitButton, invalid } = require('../clientSideValidation');\nconst swatchImageDownload = queryFirst('.swatch-image-download');\nconst swatchImageDownloaded = queryFirst('.swatch-image-downloaded');\nconst downloadCtaDesktop = '.download-cta.desktop-show';\nconst downloadCtaMobile = '.download-cta.mobile-show';\n\n$body.on('hidden.bs.modal', function () {\n if (!queryFirst('.modal.show')) {\n $body.removeClass('referral-modal');\n }\n});\n\n/**\n * Handle the enroll now popup view\n */\nfunction handleEarlyAccessEnrollModal() {\n $(loyaltyEnrollNowDialog).modal('show').off('hidden.bs.modal').on('hidden.bs.modal', function () {\n const welcomeDialogEarlyAccessMsgEl = queryFirst('.js-loyalty-welcome-early-access-msg');\n const welcomeDialogMsgEl = queryFirst('.js-loyalty-welcome-msg');\n if (!hasClass(loyaltyWelcomeDialog, 'show')) {\n location.reload();\n } else {\n addClass(welcomeDialogMsgEl, hiddenClass);\n removeClass(welcomeDialogEarlyAccessMsgEl, hiddenClass);\n removeWelcomeModalShowSession();\n }\n });\n $(loyaltyWelcomeDialog).off('hidden.bs.modal').on('hidden.bs.modal', function (e) {\n location.reload();\n });\n}\n\n/**\n * Login form on PDP Early Access\n * @param {boolean} isLoyaltyMember - if the user is enrolled to loyalty or not\n * @param {string} postalCode - ZIP Code\n * @param {string} showWelcomeModal - When the enrollment is complete and the welcome modal needs to be displayed, it will be true\n */\nfunction handlePdpEarlyAccessLoginRegistration(isLoyaltyMember, postalCode, showWelcomeModal) {\n if (showWelcomeModal) {\n $(loyaltyWelcomeDialog).modal('show').off('hidden.bs.modal').on('hidden.bs.modal', function (e) {\n location.reload();\n });\n removeWelcomeModalShowSession();\n } else if (isLoyaltyMember) {\n location.reload();\n } else {\n const loyaltyEnrollModalForm = queryFirst('.loyalty-get-access');\n const loyaltyEnrollPostalCodeEl = queryFirst('.js-loyalty-access-postal-code', loyaltyEnrollModalForm);\n const loyaltyGuestEnrollment = queryFirst('.loyalty-getaccess-section .guest-enrollment');\n addClass(loyaltyGuestEnrollment, hiddenClass);\n removeClass(loyaltyEnrollModalForm, hiddenClass);\n if (!postalCode) {\n removeClass(loyaltyEnrollPostalCodeEl, hiddenClass);\n } else {\n queryFirst('.loyalty-access-form-postalcode', loyaltyEnrollPostalCodeEl).value = postalCode;\n }\n handleEarlyAccessEnrollModal();\n }\n}\n/**\n * Login form on PDP Early Access\n * @param {Object} form - form element\n */\nfunction earlyAccessSignIn(form) {\n const url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n $.spinner().stop();\n if (!data.success) {\n formValidation(form, data);\n form.trigger('login:error', data);\n } else {\n const { loyaltyProgramMemberId, postalCode } = data;\n $(loyaltyEarlyAccessRegisterForm).modal('hide');\n handlePdpEarlyAccessLoginRegistration(!!loyaltyProgramMemberId, postalCode);\n }\n },\n error: function () {\n $.spinner().stop();\n $(loyaltyEarlyAccessRegisterForm).modal('hide');\n }\n });\n}\n/**\n * Remove show modal session attribute on close of welcome modal\n */\nfunction removeWelcomeModalShowSession() {\n const closeButton = queryFirst('.loyalty-welcome-popup .close-welcome-modal');\n getJSON(closeButton.dataset.welcomeSessionUrl, 'get');\n}\n/**\n * Registration form on PDP Early Access\n * @param {Object} form - form element\n */\nfunction earlyAccessRegistration(form) {\n const url = form.attr('action');\n $.spinner().start();\n $.ajax({\n url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n $.spinner().stop();\n if (data.success) {\n const { optedInToLoyalty, postalCode } = data;\n const showWelcomeModal = optedInToLoyalty;\n $(loyaltyEarlyAccessRegisterForm).modal('hide');\n handlePdpEarlyAccessLoginRegistration(optedInToLoyalty, postalCode, showWelcomeModal);\n } else {\n formValidation(form, data);\n form.trigger('register:error');\n }\n },\n error: function () {\n $.spinner().stop();\n $(loyaltyEarlyAccessRegisterForm).modal('hide');\n }\n });\n}\n/**\n * Function to attach form validation events\n * @param {Object} form - form element\n */\nfunction attachLoginRegistrationFormEvents(form) {\n ajaxFormInvalid(form);\n ajaxFormSubmit(form);\n enableFormSubmitButton();\n}\n\n/**\n * Function to handle early access sign in or registration on PLP and PDP page\n * @param {Object} earlyAccessCta - element\n */\nfunction handleEarlyAccessLogin(earlyAccessCta) {\n if (earlyAccessCta) {\n const { actionUrl } = earlyAccessCta.dataset;\n $.spinner().start();\n $.ajax({\n url: actionUrl,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (data.success) {\n $(loyaltyEarlyAccessRegisterForm).modal('show');\n const { accountRegistrationForm, loginForm } = data;\n const signInForm = queryFirst('.early-access-login-form');\n const registerForm = queryFirst('.early-access-register-form');\n signInForm.innerHTML = loginForm;\n registerForm.innerHTML = accountRegistrationForm;\n const accountHelpEl = queryFirst('.account-need-help');\n const earlyAccessRegisterLeft = queryFirst('.registration-left');\n const earlyAccessRegisterRight = queryFirst('.registration-right');\n addClass(accountHelpEl, hiddenClass);\n addClass([earlyAccessRegisterLeft, earlyAccessRegisterRight], 'col-md-6');\n const loyaltyRegistrationForm = '.early-access-register-form form.registration';\n const loyaltyLoginForm = '.early-access-login-form form.login';\n resetPassword();\n invalid();\n attachLoginRegistrationFormEvents(loyaltyLoginForm);\n attachLoginRegistrationFormEvents(loyaltyRegistrationForm);\n const registrationFormPhone = queryFirst('.registration-form-phone', earlyAccessRegisterLeft);\n formatPhoneNumber(registrationFormPhone);\n validateDate();\n $(loyaltyLoginForm).off('submit').on('submit', function (e) {\n const form = $(this);\n e.preventDefault();\n earlyAccessSignIn(form);\n });\n $(loyaltyRegistrationForm).off('submit').on('submit', function (e) {\n const form = $(this);\n e.preventDefault();\n earlyAccessRegistration(form);\n });\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * hide or show drawer image in mobile and desktop view\n * @param {string} drawerMobileImg - image for mobile view\n * @param {string} drawerDesktopImg - image for desktop view\n */\nfunction hideShowDrawerImage(drawerMobileImg, drawerDesktopImg) {\n const desktopImageWrapper = queryFirst('.drawer-img-wrap-desktop');\n const mobileImageWrapper = queryFirst('.drawer-img-wrap-mobile');\n const drawerMobileImgEl = queryFirst('.drawer-image-mobile');\n const drawerDesktopImgEl = queryFirst('.drawer-image-desktop');\n\n // check if scene7 link is present for mobile or desktop or both\n if (drawerMobileImg !== 'null' && drawerMobileImgEl) {\n drawerMobileImgEl.src = drawerMobileImg;\n }\n\n loyaltyDrawerImageView(drawerMobileImg, mobileImageWrapper);\n\n if (drawerDesktopImg !== 'null' && drawerDesktopImgEl) {\n drawerDesktopImgEl.src = drawerDesktopImg;\n }\n\n loyaltyDrawerImageView(drawerDesktopImg, desktopImageWrapper);\n}\n\n/**\n * update the backgroud of referral section bassed on the configuration in content asset\n */\nfunction updateReferralBg() {\n const loyaltyReferralBg = queryFirst('.referral-section-bg-color');\n if (!loyaltyReferralBg) {\n return;\n }\n const { bgColor, bgImageDesktop, bgImageMobile } = loyaltyReferralBg.dataset;\n if (bgImageDesktop) {\n root.style.setProperty('--referral-bg-img-desktop', `url(${bgImageDesktop})`);\n }\n if (bgImageMobile) {\n root.style.setProperty('--referral-bg-img-mobile', `url(${bgImageMobile})`);\n }\n if (bgColor) {\n root.style.setProperty('--referral-bg-color', bgColor);\n }\n}\n\n\n/**\n * handling hide or show of drawer image and background color in mobile and desktop view\n * @param {string} image - image of mobile/desktop view\n * @param {string} el - wrapper element of desktop/mobile\n */\nfunction loyaltyDrawerImageView(drawerImage, el) {\n const loyaltyModalEl = queryFirst('#loyalty-program-modal .modal-content');\n const withImageEl = queryFirst('.drawer-with-img', el);\n const withoutImageEl = queryFirst('.drawer-without-img', el);\n const loyaltyDrawerBackground = 'loyalty-background';\n\n if (drawerImage && drawerImage !== 'null') {\n addClass(withoutImageEl, hiddenClass);\n removeClass(withImageEl, hiddenClass);\n addClass(loyaltyModalEl, loyaltyDrawerBackground);\n } else {\n removeClass(withoutImageEl, hiddenClass);\n addClass(withImageEl, hiddenClass);\n addClass(loyaltyModalEl, loyaltyDrawerBackground);\n }\n\n}\n\n/**\n * show how to earn drawer image in mobile and desktop view\n * @param {string} drawerMobileImg - image for mobile view\n * @param {string} drawerDesktopImg - image for desktop view\n * @param {string} drawerTitle - title for the drawer\n * @param {string} drawerCloseButtonLabel - close button label\n */\nfunction showHowToEarnDrawerImage(drawerMobileImg, drawerDesktopImg, drawerTitle, drawerCloseButtonLabel) {\n const drawerMobileImgEl = queryFirst('.drawer-image-mobile');\n const drawerDesktopImgEl = queryFirst('.drawer-image-desktop');\n const drawerTitleE1 = queryFirst('#loyalty-how-to-earn-modal-label');\n const drawerCloseButtonE1 = queryFirst('#loyalty-how-to-earn-modal .close-current-modal');\n\n if (drawerTitle && drawerTitleE1) {\n drawerTitleE1.innerHTML = drawerTitle;\n }\n if (drawerCloseButtonLabel && drawerCloseButtonE1) {\n drawerCloseButtonE1.ariaLabel = drawerCloseButtonLabel;\n }\n if (drawerMobileImg !== 'null' && drawerMobileImgEl) {\n drawerMobileImgEl.src = drawerMobileImg;\n }\n if (drawerDesktopImg !== 'null' && drawerDesktopImgEl) {\n drawerDesktopImgEl.src = drawerDesktopImg;\n }\n}\n/**\n * Add the image URL in download CTA on select of wallpaper swatch\n * @param {HTMLElement} selectedWallpaperId - selected swatch element Id\n */\nfunction updateImgURLOnDownloadCta(selectedWallpaperId) {\n const selectTab = selectedWallpaperId ? queryFirst(selectedWallpaperId) : queryFirst('.main-swatch-section .tab-pane.active');\n const imageElement = queryFirst('.wallpaper-main-image', selectTab);\n const swatchImageDownloadCtaDesktop = queryFirst(downloadCtaDesktop, swatchImageDownload);\n const swatchImageDownloadCtaMobile = queryFirst(downloadCtaMobile, swatchImageDownload);\n const swatchImageDownloadedCtaDesktop = queryFirst(downloadCtaDesktop, swatchImageDownloaded);\n const swatchImageDownloadedCtaMobile = queryFirst(downloadCtaMobile, swatchImageDownloaded);\n if (imageElement) {\n const { desktopDownloadedImage, mobileDownloadedImage } = imageElement.dataset;\n setAttribute(swatchImageDownloadCtaDesktop, 'href', desktopDownloadedImage);\n setAttribute(swatchImageDownloadCtaMobile, 'href', mobileDownloadedImage);\n setAttribute(swatchImageDownloadedCtaDesktop, 'href', desktopDownloadedImage);\n setAttribute(swatchImageDownloadedCtaMobile, 'href', mobileDownloadedImage);\n }\n}\n\n/**\n * Add click event listener on download cta to call the update image URL function\n */\nfunction loyaltySwatchImgDownload() {\n updateImgURLOnDownloadCta();\n $body.on('click', '.img-wallpaper', function (e) {\n const selectedWallpaperId = this.closest('a').hash;\n updateImgURLOnDownloadCta(selectedWallpaperId);\n addClass(swatchImageDownloaded, hiddenClass);\n removeClass(swatchImageDownload, hiddenClass);\n }); \n\n $body.on('click', '.download-cta.desktop-show, .download-cta.mobile-show', function () {\n addClass(swatchImageDownload, hiddenClass);\n removeClass(swatchImageDownloaded, hiddenClass);\n });\n}\n\n/**\n * Updated the counter timmer in every second\n * @param {string} countDataMsg - timmer string\n * @param {string} countDownTime - countDownTimmer\n * @param {HTMLElement} countDownEle - Html element where the timer needs to updated\n * @param {Object} timeinterval - OOS javascript function updated on every second\n */\nfunction updateClock(countDataMsg, countDownTime, countDownEle, timeinterval, countDataMsgNoDays) {\n const { tokenize } = require('../util');\n const timer = getTimeRemaining(countDownTime);\n const newCountDataMsg = (timer.days === 0) ? countDataMsgNoDays : countDataMsg;\n countDownEle.innerHTML = tokenize(newCountDataMsg, timer, '[', ']');\n if (timer.total <= 0) {\n clearInterval(timeinterval);\n }\n}\n\n\n/**\n * Updated voucher Expiry date to formatted string\n * @param {string} expiryDate - API response expiry date string\n * @param {string} formatString - format string of resource message\n * @return {string} formattedString - formatted expiry date string\n */\nfunction getFormatDateString(expiryDate, formatString) {\n if (!expiryDate) {\n return expiryDate;\n }\n const expiryDateStringArray = expiryDate.split(' ');\n const formattedString = expiryDateStringArray[0] + ' ' + formatString;\n return formattedString;\n}\n/**\n * Add click event listener on download cta to call the update image URL function\n */\nfunction exclusiveExperiencesCountDown() {\n const exclusiveExperiencesTile = queryAll('.exclusive-tile');\n if (exclusiveExperiencesTile.length > 0) {\n for (let i = 0, n = exclusiveExperiencesTile.length; i < n; i++) {\n const exclusiveModule = exclusiveExperiencesTile[i];\n const countDownTime = exclusiveModule.dataset.countDownTimer;\n const countDownEle = queryFirst('.count-down-timer', exclusiveModule);\n const countDownEleNoDays = queryFirst('.count-down-timer-nodays', exclusiveModule);\n const countDataMsg = countDownEle.dataset.counterMsg;\n const countDataMsgNoDays = countDownEleNoDays.dataset.counterMsg;\n if (countDownTime) {\n // update the counter\n const timeinterval = setInterval(function () { updateClock(countDataMsg, countDownTime, countDownEle, timeinterval, countDataMsgNoDays) }, 1000);\n } else {\n addClass(countDownEle, hiddenClass);\n }\n }\n }\n}\n\n/**\n * Hide show the right and left icon if carousel reaches to last or first position\n */\n$(exclusiveCarouselIdSelector).carousel({\n wrap: false\n});\n\nconst carouselControlsToggle = function () {\n const exclusiveCarousel = queryFirst(exclusiveCarouselIdSelector);\n\n if (exclusiveCarousel) {\n const parentElement = queryFirst('.image-slide-indicators', exclusiveCarousel);\n const carouselControl = queryFirst('.lp-icon-chevron', exclusiveCarousel);\n const { lastElementChild, firstElementChild } = parentElement;\n const previousControl = queryFirst('.carousel-control-prev', exclusiveCarousel);\n const nextControl = queryFirst('.carousel-control-next', exclusiveCarousel);\n if (hasClass(lastElementChild, activeClass)) {\n addClass(nextControl, hiddenClass);\n removeClass(previousControl, hiddenClass);\n } else if (hasClass(firstElementChild, activeClass)) {\n removeClass(nextControl, hiddenClass);\n addClass(previousControl, hiddenClass);\n } else {\n removeClass(carouselControl, hiddenClass);\n }\n }\n};\n\nwindow.addEventListener('load', (event) => {\n const formElement = queryFirst('.loyalty-get-access');\n const referrerID = getItemFromLocalStorage('REFERRED_ID');\n if (referrerID && formElement) {\n loadInput(referrerID, formElement);\n }\n});\n\nif (earlyAccessPdpSignInRegistration.length) {\n earlyAccessPdpSignInRegistration.forEach((earlyAccessBtn) => {\n earlyAccessBtn.addEventListener('click', e => {\n e.preventDefault();\n handleEarlyAccessLogin(earlyAccessBtn);\n });\n });\n}\n\n/**\n * Function to initialize events\n */\nfunction init() {\n loyaltySwatchImgDownload();\n exclusiveExperiencesCountDown();\n carouselControlsToggle();\n $(exclusiveCarouselIdSelector).on('slid.bs.carousel', '', carouselControlsToggle);\n}\n\nmodule.exports = {\n loyaltyDrawer: function () {\n const loyaltyAppImage = queryFirst('.is-drawer-img');\n if (loyaltyAppImage) {\n const loyaltyDrawerContent = queryFirst('.loyalty-drawer-content');\n const { isAppDrawer } = loyaltyAppImage.dataset;\n const drawerAppImgEl = queryFirst('.drawer-image-mobile');\n if (isAppDrawer === \"true\") {\n mobileImg = loyaltyAppImage.dataset.mobileImg;\n const appImageWrapper = queryFirst('.drawer-img-wrap-mobile');\n if (mobileImg && mobileImg !== 'null') {\n drawerAppImgEl.src = mobileImg;\n }\n const appMobileImgEl = queryFirst('body');\n addClass(appMobileImgEl, 'loyalty-background-ios');\n loyaltyDrawerImageView(mobileImg, appImageWrapper);\n }\n removeClass(loyaltyDrawerContent, hiddenClass);\n }\n\n $body.on('click', '.loyalty-program-drawer-link, .loyalty-program-terms-condition, .loyalty-how-to-earn-drawer-link', function (e) {\n e.preventDefault();\n const url = this.dataset.href;\n const isLoyaltyProgramDrawerClick = $(this).hasClass('loyalty-program-drawer-link');\n const isLoyaltyProgramOverviewFromHeader = $(this).hasClass('loyalty-program-overview-from-header');\n const isMobileSession = queryFirst('.mobile-session');\n if (isMobileSession) {\n return true;\n }\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'html',\n success: function (data) {\n if (data) {\n if (isLoyaltyProgramDrawerClick) {\n const loyaltyContainer = queryFirst('.loyalty-drawer-body');\n loyaltyContainer.innerHTML = data;\n const loyaltyDrawerContent = queryFirst('.loyalty-drawer-content');\n removeClass(loyaltyDrawerContent, hiddenClass);\n const guestEnrollment = queryFirst('.lilly-loyalty-container .guest-enrollment');\n const memberSignInEnrollment = queryFirst('.lilly-loyalty-container .already-registered-log-in');\n if (guestEnrollment && memberSignInEnrollment) {\n if (isLoyaltyProgramOverviewFromHeader) {\n removeClass([guestEnrollment, memberSignInEnrollment], hiddenClass);\n } else {\n addClass([guestEnrollment, memberSignInEnrollment], hiddenClass);\n }\n }\n const loyaltyIsImage = queryFirst('.is-drawer-img', loyaltyContainer);\n desktopImg = loyaltyIsImage.dataset.desktopImg;\n mobileImg = loyaltyIsImage.dataset.mobileImg;\n hideShowDrawerImage(mobileImg, desktopImg);\n } else {\n const loyaltyContainer = queryFirst('.loyalty-how-to-earn-drawer-body');\n loyaltyContainer.innerHTML = data;\n const loyaltyIsImage = queryFirst('.is-how-to-earn-drawer-img', loyaltyContainer);\n desktopImg = loyaltyIsImage.dataset.desktopImg;\n mobileImg = loyaltyIsImage.dataset.mobileImg;\n const title = loyaltyIsImage.dataset.title;\n const closeButtonLabel = loyaltyIsImage.dataset.closeButton;\n showHowToEarnDrawerImage(mobileImg, desktopImg, title, closeButtonLabel);\n }\n $.spinner().stop();\n }\n },\n error: function (err) {\n $.spinner().stop();\n }\n });\n })\n },\n loyaltyEnrollNowDialog: function () {\n $body.on('click', '.loyalty-enrollnow-cta', function (e) {\n e.preventDefault();\n $('#loyalty-enrollnow-modal').modal('show');\n const loyaltyEnrollPostalCodeContainer = queryFirst('.js-loyalty-access-postal-code');\n const loyaltyEnrollPostalEl = queryFirst('.loyalty-access-form-postalcode', loyaltyEnrollPostalCodeContainer);\n const loyaltyEnrollCheckboxEl = queryFirst('.optin-to-loyalty-program');\n const loyaltyEnrollNowEl = queryFirst('.loyalty-get-access');\n loyaltyEnrollNowEl.dataset.enrollNowSource = MY_ACCOUNT;\n const loyaltyRemoveClass = [];\n if (!hasClass(loyaltyEnrollPostalCodeContainer, hiddenClass)) {\n loyaltyRemoveClass.push(loyaltyEnrollPostalEl);\n loyaltyEnrollPostalEl.value = '';\n }\n if (loyaltyEnrollCheckboxEl) {\n loyaltyRemoveClass.push(loyaltyEnrollCheckboxEl);\n loyaltyEnrollCheckboxEl.checked = false;\n }\n removeClass(loyaltyRemoveClass, invalidClass);\n });\n $body.on('click', '.loyalty-early-access-welcome-cta', function (e) {\n location.reload();\n });\n },\n loyaltyEnrollNowSubmit: function () {\n $('form.loyalty-get-access').off('submit').on('submit', function (e) {\n e.preventDefault();\n const postalCodeEl = queryFirst('.loyalty-access-form-postalcode');\n const referrerIDEl = queryFirst('.referrerID');\n const postalCodeRegex = postalCodeEl ? new RegExp(postalCodeEl.dataset.regexp) : '';\n const postalCode = postalCodeEl ? postalCodeEl.value : '';\n const loyaltyEnrollNowEl = queryFirst('.loyalty-get-access');\n const source = loyaltyEnrollNowEl.dataset.enrollNowSource;\n const referrerID = referrerIDEl ? referrerIDEl.value : '';\n const invalidFeedback = queryFirst('#form-postalcode-error.invalid-feedback');\n if (postalCode && !postalCodeRegex.test(postalCode)) {\n if (invalidFeedback) {\n addClass(postalCodeEl, invalidClass);\n invalidFeedback.textContent = postalCodeEl.dataset.patternMismatch;\n }\n }\n else {\n $.spinner().start();\n let requestData = {\n postalCode,\n lillyLoyaltyProgram: true,\n source\n };\n if (referrerIDEl) {\n requestData = {\n postalCode,\n lillyLoyaltyProgram: true,\n referrerID\n };\n }\n const url = this.dataset.href;\n $.ajax({\n url: url,\n type: 'POST',\n data: requestData,\n dataType: 'html',\n success: function (data) {\n const responseData = JSON.parse(data);\n if (responseData.success) {\n $('#loyalty-enrollnow-modal').modal('hide');\n $('#loyalty-welcome-popup').modal('show');\n }\n $.spinner().stop();\n },\n error: function (err) {\n $.spinner().stop();\n }\n });\n }\n\n });\n const loyaltyUnenrollDashboard = queryFirst('.loyalty-dashboard-unenroll');\n $(loyaltyWelcomeDialog).on('hidden.bs.modal', function () {\n if (loyaltyUnenrollDashboard) {\n location.reload();\n }\n });\n const accountLoyaltyDashboard = queryFirst('.account-lilly-loyalty');\n if (accountLoyaltyDashboard && accountLoyaltyDashboard.dataset.showWelcomePopup === 'true') {\n $('#loyalty-welcome-popup').modal('show');\n removeWelcomeModalShowSession();\n }\n },\n loyaltyDashboardShow: function () {\n $('.loyalty-dashboard-link').off('click').on('click', function (e) {\n e.preventDefault();\n const url = this.dataset.checkLoyaltyAccess;\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (!data) {\n $.spinner().stop();\n return false;\n }\n if (data.showEnrollmentModel) {\n if (data.imageUrls) {\n const modelImages = data.imageUrls;\n const enrollmentModel = $('.loyalty-enroll-now-container');\n const welcomeModel = $('.loyalty-welcome-popup');\n enrollmentModel.find('.drawer-image-source').attr('srcset', modelImages.loyaltyaccesspopupmobile);\n enrollmentModel.find('.drawer-image').attr('src', modelImages.LoyaltyguestenrollmentnonloyaltyD2x);\n welcomeModel.find('.drawer-image-source').attr('srcset', modelImages.loyaltywelcomepopupmobile);\n welcomeModel.find('.drawer-image').attr('src', modelImages.LoyaltywelcomeloyaltyD2x);\n $('#loyalty-enrollnow-modal').modal('show');\n }\n } else {\n window.location.href = data.redirectUrl;\n }\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n loyaltyDashboardOffersTile: function () {\n const offerExpirationDateEl = queryAll('.offer-expiration-date');\n offerExpirationDateEl.forEach(el => {\n const expirationDateTime = el.textContent;\n el.textContent = expirationDateTime.split(' ')[0];\n });\n $body.on('click', '.flip-card-front', function (e) {\n e.preventDefault();\n const cardFlippedEl = this.closest('.offer-flip-card');\n const cardFront = queryFirst('.flip-card-front', cardFlippedEl);\n addClass(cardFlippedEl, 'offer-card-flipped');\n cardFront.style.pointerEvents = 'none';\n });\n $body.on('click', '.reveal-state-done', function (e) {\n e.preventDefault();\n const cardFlippedEl = this.closest('.offer-flip-card');\n const cardFront = queryFirst('.flip-card-front', cardFlippedEl);\n removeClass(cardFlippedEl, 'offer-card-flipped');\n cardFront.style.pointerEvents = 'unset';\n });\n $body.on('click', '.view-copy-code-cta', function (e) {\n e.preventDefault();\n const { target, expiryDate, couponCode, formatString } = e.target.dataset;\n const offerDiscountDialog = queryFirst(target);\n const offerDiscountTileData = queryFirst('.offer-tile-content', offerDiscountDialog);\n const offerDiscountModalData = queryFirst('.offer-code-modal-content', offerDiscountDialog);\n const copyCodeText = queryFirst('.copy-code-section .code-section', offerDiscountDialog);\n queryFirst('.coupon-expiry .expiry-date', offerDiscountDialog).textContent = getFormatDateString(expiryDate, formatString);\n copyCodeText.textContent = couponCode;\n addClass(offerDiscountTileData, hiddenClass);\n removeClass(offerDiscountModalData, hiddenClass);\n $(offerDiscountDialog).modal('show');\n copyCodeText.select();\n copyCodeText.setSelectionRange(0, 99999); /* For mobile devices */\n /* Copy the text */\n navigator.clipboard.writeText(copyCodeText.value);\n });\n },\n loyaltyReferralDrawer: function () {\n $body.on('click', '.loyalty-referral-drawer-link', function (e) {\n const referralUrlElement = queryFirst('.referral-drawer-link');\n $('.referral-link').val((referralUrlElement.dataset.referralUrl).replace('https://', ''));\n $body.addClass('referral-modal');\n });\n },\n loyaltyCopyReferralUrl: function () {\n $body.on('click', '.referral-cta-link', function (e) {\n const copyReferralUrl = queryFirst('.referral-link');\n const copyCta = queryFirst('.referral-cta-link');\n const copiedLinkCta = queryFirst('.copied-link');\n const referralUrlElement = queryFirst('.referral-drawer-link');\n copyReferralUrl.select();\n copyReferralUrl.setSelectionRange(0, 99999); /* For mobile devices */\n\n /* Copy the text */\n navigator.clipboard.writeText(referralUrlElement.dataset.referralUrl).then(function () {\n /* clipboard successfully set */\n addClass(copyCta, hiddenClass);\n removeClass(copiedLinkCta, hiddenClass);\n setTimeout(function () {\n removeClass(copyCta, hiddenClass);\n addClass(copiedLinkCta, hiddenClass);\n }, 3000);\n });\n });\n },\n loyaltyOopsRefreshSection: function (e) {\n $body.on('click', '.error-refresh-link', function (e) {\n e.preventDefault();\n const url = this.dataset.referralUrl;\n const successServiceResData = this.closest('.service-response-section');\n if (!successServiceResData) {\n location.reload();\n }\n const tooltipModule = queryFirst('.tool-tip-content', successServiceResData);\n const tooltipInnerData = queryFirst('.' + tooltipModule.id);\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (!data.error) {\n if (successServiceResData) {\n successServiceResData.innerHTML = data.serviceResHTMLData;\n const updatedToolTip = queryFirst('.tool-tip-content', successServiceResData);\n if (updatedToolTip && tooltipInnerData) {\n updatedToolTip.innerHTML = tooltipInnerData.innerHTML;\n const popContent = queryFirst('.loyalty-tooltip-popover', updatedToolTip);\n const tooltipIcon = queryFirst('.loyalty-tooltip-icon', updatedToolTip);\n $(tooltipIcon).popover({\n trigger: 'click',\n placement: 'auto',\n html: true,\n content: popContent\n });\n $('[data-toggle=\"popover\"]').on('shown.bs.popover', function (e) {\n const { target } = e;\n $body.one('click', function (clickEvent) {\n const clicked = clickEvent.target;\n if (clicked !== target && clicked.parentElement !== target && $('.popover.show').length) {\n $(target).trigger('click');\n }\n });\n });\n const scrollableContent = queryFirst('.scrollable-content', successServiceResData);\n if (scrollableContent) initSpecificCarousel(scrollableContent);\n }\n updateReferralBg();\n init();\n }\n }\n $.spinner().stop();\n },\n error: function (err) {\n $.spinner().stop();\n }\n });\n });\n },\n referralModuleBg: function (e) {\n updateReferralBg();\n const referralSection = queryFirst('.referral-section-bg-color');\n removeClass(referralSection, hiddenClass);\n },\n loyaltyEarlyAccessSignUp: function () {\n $body.on('click', '.early-access-registered .early-access-sign-up', function (e) {\n e.preventDefault();\n handleEarlyAccessEnrollModal();\n });\n\n $body.on('click', '.early-access-register-form-cancel', function (e) {\n e.preventDefault();\n $(loyaltyEarlyAccessRegisterForm).modal('hide');\n });\n },\n init: init,\n handleEarlyAccessLogin: handleEarlyAccessLogin\n};\n\nwindow.addEventListener('resize', throttle(() => {\n if (mobileImg || desktopImg) {\n hideShowDrawerImage(mobileImg, desktopImg);\n }\n updateReferralBg();\n}));\n","/**\n * OOTBS SFRA JS code\n * DRP-180 updated addToCart product set code on line 772 for custom designs\n */\n\n'use strict';\nvar focusHelper = require('base/components/focus');\nimport { queryFirst, queryAll, addClass, removeClass, hasClass, remove, renderFragment } from '../domUtil';\nimport { formatMessage, getJSON, getNestedValue, tokenize } from '../util';\nimport { updateProductData, handleColor, ssAddToCart } from 'fitpredictor/product/secretsauce';\nconst { trackPageView } = require('../components/etmc');\nconst { toggleSelectSizeInfo, isEarlyAccessElement } = require('./helper');\nconst { swatchNameTemplate, sizeOptionTemplate, sizeButtonTemplate, gwpSizeTemplate, dialogTemplate, loyalty: loyaltyTemplates, videoThumbnailTemplate } = require('../templates');\nconst $body = $('body');\nconst $gwpDialog = $('#chooseBonusProductModal');\nconst hiddenClass = 'd-none';\nconst readyClass = 'ready-to-add';\nconst selectedProductClass = 'selected-product';\nconst notAvailable = 'not-available';\nconst { updateVisibilityOfLowInventoryMsg, getSelectedSizeEl } = require('../components/shippingPreference/shippingPreferenceHelper');\nconst isFitPredictorEnabled = !!queryFirst('#fitPredictorEnabled');\nconst { PRODUCT_DETAIL_CONTAINER_SELECTOR } = require('../components/shippingPreference/constants');\nconst { HIDDEN_CLASS } = require('../constants');\nconst loyaltyProfile = getNestedValue(window, 'johnnyWasUtils.profile') || {};\nconst { isLoyaltyProgramMember, isLoyaltyAuthenticated, isLoyaltyEnabled } = loyaltyProfile;\nconst isMcEnable = $('#mcEnableAnalytics').val();\nlet selectedSizeCTA = '';\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el)\n .closest('.modal-content')\n .find('.product-quickview')\n .attr('data-pid');\n } else if ($('.quickview-container').length && !$('.product-set').length) {\n pid = $($el)\n .closest('.quickview-container')\n .find('.product-quickview')\n .attr('data-pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el)\n .closest('.product-detail')\n .find('.product-id')\n .first()\n .text();\n } else {\n pid = $($el)\n .closest('.product-detail')\n .find('.product-id')\n .first()\n .text();\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n return $el && $('.set-items').length ? $el.closest('.product-detail').find('.quantity-select') : $('.quantity-select');\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs, product) {\n if (attr.id === 'fitSize') {\n const fitSizes = attr.filteredValues ? attr.filteredValues : {};\n let selected = '';\n let fitSizeLi = '';\n let counter = 0;\n const elFitSizeContainer = queryFirst('ul.non-color-container', $productContainer[0]);\n if (Object.keys(fitSizes).length) {\n fitSizes.forEach((fitSize, i) => {\n elFitSizeContainer.innerHTML = '';\n selected = fitSize.selected;\n counter++\n fitSizeLi += `\n
  • \n \n \n
  • `;\n });\n fitSizeLi += ``\n elFitSizeContainer.innerHTML = fitSizeLi;\n if (fitSizes.length === 1) {\n $productContainer.find('ul.non-color-container').parent().hide();\n } else {\n $productContainer.find('ul.non-color-container').parent().show();\n }\n }\n } else {\n var isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n const { bonusVariationUrl, url } = attrValue;\n\n if (isChoiceOfBonusProducts) {\n if (bonusVariationUrl) {\n $swatchButton.attr('data-url', bonusVariationUrl);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n } else if (url) {\n $swatchButton.attr('data-url', url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n if (!$productContainer.hasClass('custom-set-product')) {\n $body.trigger('product:updateStoreInventory', {\n productContainer: $productContainer[0]\n });\n }\n }\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer, product) {\n const $bonusProductItem = $productContainer.parent('.bonus-product-item');\n if ($bonusProductItem.length) {\n const sizes = attr.values;\n const sizeContainer = queryFirst('.selected-size-container', $bonusProductItem[0]);\n if (!sizes.length || !sizeContainer) {\n return;\n }\n\n if (sizes.length === 1) {\n sizeContainer.innerHTML = formatMessage(gwpSizeTemplate.singleSize, sizes[0].displayValue);\n } else {\n const loopStatus = sizeContainer.dataset.loopStatus;\n const resetUrl = attr.resetUrl;\n const selectLabel = sizeContainer.dataset.selectLabel;\n const selectId = `bonus-size-${loopStatus.count || '1'}`;\n\n let sizeOptions = formatMessage(gwpSizeTemplate.multiDefaultSizeOption, resetUrl, selectLabel);\n sizeOptions += sizes\n .map(function (size) {\n const selected = size.selected ? ' selected ' : '';\n const className = !size.inStock || size.forceOutOfStock ? notAvailable : '';\n if (className) {\n const outOfStockMsg = sizeContainer.dataset.outOfStock;\n size.displayValue += ' - ' + outOfStockMsg;\n }\n return formatMessage(gwpSizeTemplate.multiSizeOption, size.url, size.value, selected, size.displayValue, className, className ? 'disabled' : '');\n })\n .join('');\n sizeContainer.innerHTML = formatMessage(gwpSizeTemplate.multiSize, selectId, sizeOptions);\n }\n } else {\n const productContainerEle = $productContainer[0];\n if (hasClass(productContainerEle, 'product-set-item')) {\n let isPDPSetPage = true;\n $body.trigger('product:updateOOSSize', {\n productContainer: productContainerEle,\n isPDPSetPage: isPDPSetPage\n });\n } else {\n const sizeContainer = queryFirst('ul.size-container', productContainerEle);\n $(sizeContainer).css('visibility', 'hidden');\n let li = '';\n let sizes = attr.filteredValues ? attr.filteredValues : {};\n if (Object.keys(sizes).length <= 0) {\n sizes = attr.values ? attr.values : {};\n }\n sizeContainer.innerHTML = '';\n let selectedSize = '';\n if (Object.keys(sizes).length) {\n sizes.forEach((size, i) => {\n if (size.selected) {\n selectedSize = size;\n }\n li += `\n
  • \n \n ${size.selected ? 'selected' : ''} ${!size.inStock || size.forceOutOfStock ? 'Out of Stock' : ''}\n
  • `;\n });\n\n let ssSize = ``\n sizeContainer.innerHTML = li;\n sizeContainer.insertAdjacentHTML('beforeend', ssSize);\n }\n const selectedSizeEle = queryFirst('.size-btn.selected', sizeContainer);\n setTimeout(function () {\n $(sizeContainer).css('visibility', 'visible');\n $(selectedSizeEle).trigger('click');\n }, 0);\n }\n }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs, product) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color', 'fitSize'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs, product);\n } else {\n processNonSwatchValues(attr, $productContainer, product);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n const { isDirectlyPurchasable } = response.product;\n const availabilityMsgEl = queryFirst('.availability-msg', $productContainer[0]);\n if (isDirectlyPurchasable === false && availabilityMsgEl) {\n availabilityValue = `
  • ${availabilityMsgEl.dataset.notPurchasable}

  • `;\n } else if (response.product.readyToOrder) {\n availabilityMessages.forEach(function (message) {\n availabilityValue += `
  • \n ${message}\n

  • `;\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': ' + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} options - Ajax response options from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(options, $productContainer) {\n options.forEach(function (option) {\n var $optionEl = $productContainer.find('.product-option[data-option-id*=\"' + option.id + '\"]');\n option.values.forEach(function (value) {\n var valueEl = $optionEl.find('option[data-value-id*=\"' + value.id + '\"]');\n valueEl.val(value.url);\n });\n });\n}\n\n/**\n * Handles the CTAs to be shown for Early Access Product\n * @param {jQuery} productContainer - DOM element for current product\n * @param {boolean} isEarlyAccessProduct - Is the product Early Access Product\n */\nfunction handleEarlyAccessCta(productContainer, isEarlyAccessProduct) {\n const earlyAccessLockIcon = queryFirst('.loyalty-early-access-lock-container', productContainer);\n const earlyAccessWishlistIcon = queryFirst('.add-to-wish-list-container', productContainer);\n const earlyAccessCta = queryFirst('.loyalty-early-access-restricted', productContainer);\n const addToCartCta = queryFirst('.add-to-cart', productContainer);\n const earlyAccessPdpEl = queryFirst('.loyalty-product-pdp-badge', productContainer);\n if (isLoyaltyEnabled && earlyAccessCta) {\n if (earlyAccessPdpEl) {\n addClass([earlyAccessPdpEl, earlyAccessCta], hiddenClass);\n }\n if (isEarlyAccessProduct) {\n if (isLoyaltyProgramMember) {\n addClass([earlyAccessLockIcon, earlyAccessCta], HIDDEN_CLASS);\n if (earlyAccessWishlistIcon && addToCartCta) {\n removeClass([earlyAccessWishlistIcon, addToCartCta], HIDDEN_CLASS);\n }\n } else {\n removeClass([earlyAccessLockIcon, earlyAccessCta], HIDDEN_CLASS);\n if (earlyAccessWishlistIcon && addToCartCta) {\n addClass([earlyAccessWishlistIcon, addToCartCta], HIDDEN_CLASS);\n }\n const earlyAccessGuest = queryFirst('.early-access-guest', earlyAccessCta);\n const earlyAccessRegistered = queryFirst('.early-access-registered', earlyAccessCta);\n if (isLoyaltyAuthenticated) {\n addClass(earlyAccessGuest, HIDDEN_CLASS);\n removeClass(earlyAccessRegistered, HIDDEN_CLASS);\n } else {\n removeClass(earlyAccessGuest, HIDDEN_CLASS);\n addClass(earlyAccessRegistered, HIDDEN_CLASS);\n }\n }\n if (earlyAccessPdpEl) {\n removeClass(earlyAccessPdpEl, hiddenClass);\n }\n } else {\n if (earlyAccessWishlistIcon && addToCartCta) {\n removeClass([earlyAccessWishlistIcon, addToCartCta], hiddenClass);\n }\n addClass([earlyAccessLockIcon, earlyAccessCta], hiddenClass);\n }\n }\n}\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {boolean} isEarlyAccess - Check if the product is early access product\n * @param {string} videoUrl - Selected variant group video url\n */\nfunction createCarousel(imgs, $productContainer, isEarlyAccess, videoUrl) {\n let carousel = $productContainer.find('.primary-images .carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n\n const displayCounter = $productContainer.hasClass('product-quickview');\n const pdpPageCarousels = queryFirst('.carousel', $productContainer[0]);\n const pId = $productContainer[0].dataset.pid;\n const EGCPage = queryFirst('.egc-product');\n const isSetPage = queryFirst('.pdp-set-page')\n let pdpCarouselClass = '';\n if (hasClass($productContainer[0], 'product-detail')) {\n pdpCarouselClass = 'pdp-carousel-arrow';\n }\n\n $(carousel)\n .empty()\n .append(\n '
      ' +\n $(carousel).data('prev') +\n '' +\n $(carousel).data('next') +\n ''\n );\n let i;\n for (i = 0; i < imgs.length; i++) {\n let counterHtml = '';\n if (displayCounter && imgs.length > 1) {\n counterHtml = `${i + 1} ${'/'} ${imgs.length}`;\n }\n\n const imageZoomUrl = carousel.data('image');\n const imagePresetUrl = carousel.data('preset');\n const enableCache = carousel.data('cache');\n\n let dataSrc = '';\n if (imgs[i].url.includes(imagePresetUrl)) {\n dataSrc = imgs[i].url.replace(imagePresetUrl, imageZoomUrl);\n } else {\n dataSrc = imgs[i].url + '?$' + imageZoomUrl + '$';\n }\n $(\n '
      ' +\n (EGCPage ? '' : '') +\n '\"'' + (EGCPage ? '' : '') +\n counterHtml +\n '
      '\n ).appendTo($(carousel).find('.carousel-inner'));\n $(\n '
    1. '\n ).appendTo($(carousel).find('.carousel-indicators'));\n if (pdpPageCarousels && !EGCPage) {\n $('
    2. \"'
    3. '\n ).appendTo($(carousel).find('.carousel-indicators-images'));\n }\n }\n const productContainer = $productContainer[0];\n const earlyAccessPdpEl = queryFirst('.loyalty-product-pdp-badge', productContainer);\n const addToWishlistIconPdp = queryFirst('.add-to-wish-list-container', productContainer);\n const loyaltyEarlyAccessEl = queryFirst('.loyalty-early-access-restricted', productContainer);\n const addToCartButtonPdp = queryFirst('.pdp-container .add-to-cart', productContainer);\n if (addToCartButtonPdp) {\n removeClass(addToCartButtonPdp, hiddenClass);\n }\n if (earlyAccessPdpEl && loyaltyEarlyAccessEl) {\n addClass([earlyAccessPdpEl, loyaltyEarlyAccessEl], hiddenClass);\n }\n removeClass(addToWishlistIconPdp, hiddenClass);\n if (isEarlyAccess) {\n const loyaltyEarlyAccessLockContainer = queryFirst('.primary-images .loyalty-early-access-lock-container', productContainer);\n if (loyaltyEarlyAccessLockContainer) {\n addClass(loyaltyEarlyAccessLockContainer, hiddenClass);\n }\n }\n handleEarlyAccessCta(productContainer, isEarlyAccess);\n\n const firstImageElement = queryFirst('.carousel-inner .carousel-item img.img-fluid', $productContainer[0]);\n if (firstImageElement) {\n firstImageElement.addEventListener('load', () => {\n $body.trigger('product:imageLoad', {\n container: $productContainer[0]\n });\n });\n }\n if (videoUrl) {\n // LP customizations start\n const productContainer = $productContainer[0];\n const videoTemplate = queryFirst('.product-video-template').cloneNode(true);\n const templateVideoElement = queryFirst('.carousel-item video', videoTemplate);\n if (templateVideoElement) {\n templateVideoElement.setAttribute('poster', imgs[0].url);\n queryAll('source', templateVideoElement).forEach(eachElement => {\n eachElement.setAttribute('src', videoUrl);\n });\n queryFirst('.carousel-inner', carousel[0]).appendChild(queryFirst('.carousel-item', videoTemplate));\n queryFirst('.carousel-item video', productContainer).load();\n }\n // LP customizations end\n\n $('
    4. ').appendTo(\n $(carousel).find('.carousel-indicators')\n );\n\n if (pdpPageCarousels && !EGCPage) {\n $(videoThumbnailTemplate(carouselId, imgs, videoUrl, pId)).appendTo($(carousel).find('.carousel-indicators-images'));\n\n replaceVideoThumbnailImage(productContainer);\n }\n }\n $($(carousel).find('.carousel-item'))\n .first()\n .addClass('active');\n $($(carousel).find('.carousel-indicators > li'))\n .first()\n .addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n if (!isSetPage) {\n MagicZoom.stop();\n }\n if (!EGCPage) {\n MagicZoom.start(\"mz_\" + pId);\n }\n\n $(carousel).on('slid.bs.carousel', function () {\n $(\".primary-images .carousel-item\").each(function () {\n if (!$(this).hasClass(\"active\")) {\n $(this).find('a').removeAttr('id');\n } else {\n $(this).find('a').attr('id', \"mz_\" + pId);\n }\n });\n MagicZoom.start(\"mz_\" + pId);\n })\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Update PDP URL based on selected swatch\n * @param {Object} masterId - product master id\n * @param {Object} variantGroupId - Variation Group Value\n */\nfunction updatePDPUrl(masterId, variantGroupId) {\n // Updated logic here\n const swatchParam = `?dwvar_${masterId}_color`;\n const queryParams = location.search;\n let UpdatedParams = `${swatchParam}=${variantGroupId}`;\n if (queryParams) {\n UpdatedParams = queryParams\n .split('&')\n .map(eachParam => {\n if (eachParam.indexOf(swatchParam) > -1) {\n return `${swatchParam}=${variantGroupId}`;\n }\n return eachParam;\n })\n .join('&');\n }\n history.replaceState({ variantGroupId }, document.title, UpdatedParams);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer, triggerColorAction) {\n var isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n const { variationAttributes, productType, readyToOrder, bonusVariationAtrributes, isFinalSale, isDirectlyPurchasable, earlyAccess, manufacturerSKU, videoFile } = response.product;\n const saleMessageEl = queryFirst('.on-sale-message', $productContainer[0]);\n if (saleMessageEl) {\n if (isFinalSale) {\n removeClass(saleMessageEl, hiddenClass);\n } else {\n addClass(saleMessageEl, hiddenClass);\n }\n }\n\n if (isChoiceOfBonusProducts) {\n if (bonusVariationAtrributes) {\n updateAttrs(bonusVariationAtrributes, $productContainer, response.resources, response.product);\n }\n if (productType === 'variant') {\n $productContainer.parent('.bonus-product-item').data('ready-to-order', readyToOrder);\n }\n } else if (variationAttributes) {\n updateAttrs(variationAttributes, $productContainer, response.resources, response.product);\n if (isDirectlyPurchasable === false) {\n const sizeElements = queryAll('.size-btn', $productContainer[0]);\n addClass(sizeElements, notAvailable);\n }\n }\n\n // Update primary images\n var primaryImageUrls = isChoiceOfBonusProducts ? response.product.images.checkout : response.product.images.large;\n\n const productContainer = $productContainer[0];\n if (isChoiceOfBonusProducts) {\n // LP customization changes start\n const { alt, url, srcset } = primaryImageUrls[0] || {};\n const productImageElement = queryFirst('.product-image', productContainer);\n productImageElement.setAttribute('src', url);\n productImageElement.setAttribute('srcset', srcset);\n productImageElement.setAttribute('alt', alt);\n // LP customization changes end\n } else if (hasClass(productContainer, 'custom-set-product')) {\n const setModalImages = response.product.images.ispu;\n if (setModalImages) {\n const { alt, url, srcset } = setModalImages[0] || {};\n const productImageElement = queryFirst('.custom-set-detail-modal-img img', productContainer);\n productImageElement.setAttribute('src', url);\n productImageElement.setAttribute('srcset', srcset);\n productImageElement.setAttribute('alt', alt);\n }\n } else {\n createCarousel(primaryImageUrls, $productContainer, earlyAccess && earlyAccess.isEarlyAccessProduct, videoFile);\n if (videoFile !== '') {\n $body.trigger('product:initVideos');\n }\n }\n\n // Updated logic here\n const swatchNameElement = queryFirst('.selected-swatch-name', productContainer);\n const selectedSwatch = queryFirst('.swatch-circle.selected', productContainer);\n let selectedSwatchName = '';\n if (selectedSwatch) {\n selectedSwatchName = selectedSwatch.dataset.swatchName;\n }\n if (swatchNameElement) {\n swatchNameElement.textContent = selectedSwatchName;\n } else {\n const swatchHtml = formatMessage(swatchNameTemplate.swatchNameHtml, selectedSwatchName);\n const selectedSwatchElement = queryFirst('.selected-swatch', productContainer);\n if (selectedSwatchElement) {\n selectedSwatchElement.innerHTML = swatchHtml;\n }\n }\n\n // Update product SKU in Product Details section\n if (manufacturerSKU) {\n const manufacturerID = queryFirst('.product-manufacturer-id', productContainer);\n if (manufacturerID) {\n manufacturerID.textContent = manufacturerSKU;\n }\n }\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n let $priceSelector = $('.prices .price', $productContainer);\n if (!$priceSelector.length) $priceSelector = $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n const promotionElement = queryFirst('.promotions', productContainer);\n if (promotionElement) {\n promotionElement.innerHTML = response.product.promotionsHtml;\n }\n\n const promotionsPopover = queryFirst('.promotions-info-popover .promotions-info-popover-content');\n $('.custom-set-detail')\n .find('.promotions-info')\n .popover({\n trigger: 'click',\n placement: 'bottom',\n html: true,\n content: promotionsPopover\n });\n $('[data-toggle=\"popover\"]').on('shown.bs.popover', function (e) {\n var target = e.target;\n $(document).one('click', function (clickEvent) {\n var clicked = clickEvent.target;\n if (clicked !== target && clicked.parentElement !== target) {\n $(target).trigger('click');\n }\n });\n });\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product,\n $productContainer: $productContainer\n });\n } else if ($productContainer.closest('#productSetModal').length > 0) {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart-global, button.update-cart-product-global')\n .trigger('product:updateAddToCart', {\n product: response.product,\n $productContainer: $productContainer\n })\n .trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer\n .find('.main-attributes')\n .empty()\n .html(getAttributesHtml(response.product.attributes));\n if (triggerColorAction && triggerColorAction.closest('button.clickable-color-swatch').length > 0) {\n const fitSizeEle = $productContainer.find('ul.non-color-container li');\n let requestedFitSize = response.queryString.split('&').find(param => param.includes('fitSize'))?.split('=')[1];\n let fitSizeIncluded = variationAttributes.find(attr => attr.attributeId === 'fitSize')?.filteredValues?.find(fitSize => fitSize.id === requestedFitSize);\n if (fitSizeEle.length && !fitSizeIncluded) {\n $(fitSizeEle).first().find('button.non-color-attribute').trigger('click');\n }\n updatePDPUrl($productContainer.attr('data-masterid'), triggerColorAction.attr('data-attr-value'));\n }\n}\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n const $bonusProductItem = $productContainer.parent('.bonus-product-item');\n if (!($bonusProductItem.length > 0)) {\n var optionsHtml = quantities\n .map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n })\n .join('');\n getQuantitySelector($productContainer)\n .empty()\n .html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {Object} selectedSizeElement - DOM element for selected size button\n */\nfunction attributeSelect(selectedValueUrl, $productContainer, selectedSizeElement) {\n if (selectedValueUrl) {\n $body.trigger('product:beforeAttributeSelect', {\n url: selectedValueUrl,\n container: $productContainer\n });\n\n // Updated logic here\n const $choiceOfBonusProductEl = $productContainer.closest('.choice-of-bonus-product');\n if ($choiceOfBonusProductEl.length) {\n $productContainer.spinner().start();\n }\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.options, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $body.trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer,\n selectedSizeElement\n });\n if ($choiceOfBonusProductEl.length) {\n $choiceOfBonusProductEl.trigger('bonus:afterAttributeSelect');\n }\n updatedimageSlideArrowPDP();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n/**\n * Added function to updated the carousel Arrows vertically align on PDP main image after zoom loaded\n * */\nconst updatedimageSlideArrowPDP = () => {\n let carouselArrows = $('.pdp-carousel-arrow');\n if (window.matchMedia('(max-width: 1023px)').matches) {\n setTimeout(function () {\n carouselArrows.css('top', ($('div[id^=\"pdpCarousel\"]').find('.carousel-item').height() - carouselArrows.height()) / 2).css('display', 'inline');\n }, 2000)\n }\n}\n/**\n * Added function to replace the video thumbnail image with the first frame on PDP main image\n * @param {Object} productContainer - DOM container for a given product\n * */\nconst replaceVideoThumbnailImage = (productContainer) => {\n const videoThumbnailEl = queryFirst('.js-video-thumbnail', productContainer);\n\n if (window.matchMedia('(min-width: 1024px)').matches && videoThumbnailEl) {\n const videoThumbnailImgEl = queryFirst('img', videoThumbnailEl);\n const videoComponentSourceEl = queryFirst('.video-component-main source', productContainer);\n const video = document.createElement('video');\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const img = new Image();\n let playPromise;\n\n // Set the canvas size to the video dimensions\n function initCanvas() {\n canvas.width = this.videoWidth;\n canvas.height = this.videoHeight;\n }\n\n // Draw the video frame to the canvas\n function drawFrame() {\n if (playPromise !== undefined) {\n playPromise.then(() => {\n video.pause();\n })\n .catch(error => {\n console.error('Error during video playback:', error);\n });\n }\n ctx.drawImage(this, 0, 0);\n canvas.toBlob((blob) => {\n img.onload = URL.revokeObjectURL(this.src);\n img.src = URL.createObjectURL(blob);\n videoThumbnailImgEl.src = img.src;\n removeClass(videoThumbnailEl, hiddenClass);\n }, 'image/jpeg');\n\n URL.revokeObjectURL(this.src);\n\n }\n // Fetch the video and play it\n function fetchAndPlayVideo() {\n if (videoComponentSourceEl?.dataset?.src) {\n const xhr = new XMLHttpRequest();\n xhr.open('get', videoComponentSourceEl.dataset.src, true);\n xhr.responseType = 'blob';\n xhr.onload = function () {\n if (this.status == 200) {\n video.muted = true;\n video.setAttribute('crossOrigin', 'anonymous');\n video.src = URL.createObjectURL(this.response);\n playPromise = video.play();\n } else {\n removeClass(videoThumbnailEl, hiddenClass);\n }\n };\n xhr.send();\n }\n }\n\n video.addEventListener('loadedmetadata', initCanvas, false);\n video.addEventListener('timeupdate', drawFrame, false);\n fetchAndPlayVideo();\n }\n};\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction selectColorAttribute(selectedValueUrl, $productContainer, triggerColorAction) {\n if (selectedValueUrl) {\n $body.trigger('product:beforeAttributeSelect', {\n url: selectedValueUrl,\n container: $productContainer\n });\n\n // Updated logic here\n const $choiceOfBonusProductEl = $productContainer.closest('.choice-of-bonus-product');\n if ($choiceOfBonusProductEl.length) {\n $productContainer.spinner().start();\n }\n\n getJSON(\n selectedValueUrl,\n 'GET',\n null,\n data => {\n const { options, quantities, uuid } = data.product;\n handleVariantResponse(data, $productContainer, triggerColorAction);\n updateOptions(options, $productContainer);\n updateQuantities(quantities, $productContainer, uuid);\n const selectedSizeElement = queryFirst('.size-btn.selected', $productContainer[0]);\n $body.trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer,\n selectedSizeElement\n });\n if ($choiceOfBonusProductEl.length) {\n const sizeEl = queryFirst('.select-size', $choiceOfBonusProductEl[0]);\n if (sizeEl) sizeEl.selectedIndex = 0;\n $choiceOfBonusProductEl.trigger('bonus:afterAttributeSelect');\n }\n const swatchContainer = queryFirst('.color-container', $productContainer[0]);\n const assistiveElements = queryAll('.selected-assistive-text', swatchContainer);\n const selectedSwatchElement = queryFirst('.swatch-circle.selected', $productContainer[0]);\n const assistiveTextElement = queryFirst('.selected-assistive-text', selectedSwatchElement.closest('.color-list'));\n $('.selected-size').addClass('d-none');\n $('.size-seperator').addClass('d-none');\n assistiveElements.forEach(eachElement => {\n eachElement.textContent = '';\n });\n assistiveTextElement.textContent = assistiveTextElement.dataset.selectedText;\n if (!getSelectedSizeEl($productContainer[0])) {\n $('.availability-message-text').addClass('d-none');\n $('.notify-me-desc').addClass('d-none');\n $('.select-size-info-msg .availability-message-text').removeClass('d-none');\n } else {\n $('.availability-message-text').removeClass('d-none');\n }\n updatedimageSlideArrowPDP();\n },\n () => {\n $.spinner().stop();\n }\n );\n }\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} data - Shop the print data\n * @param {Object} productContainer - DOM container for a given product\n */\nfunction updateShopThePrint(data, productContainer) {\n const shopThePrintElement = queryFirst('.shop-the-print', productContainer);\n if (shopThePrintElement) {\n if (data) {\n shopThePrintElement.outerHTML = data;\n } else {\n shopThePrintElement.outerHTML = '
      ';\n }\n }\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {int} price - product sale price\n * @param {int} standardPrice - product standard price\n * @param {Object} productContainer - DOM container for a given product\n */\nfunction updateProductPrice(price, standardPrice, productContainer) {\n const priceTemplate = document.getElementById('price-template').cloneNode(true);\n const priceSection = queryFirst('.prices .price', productContainer);\n const priceContainer = queryFirst('.price-section', priceTemplate);\n const strikeThroughContainer = queryFirst('.strike-through-section', priceContainer);\n const priceElement = queryFirst('.strike-through-price', strikeThroughContainer);\n const salesContainer = queryFirst('.sales', priceContainer);\n const salesPriceElement = queryFirst('.price-value', salesContainer);\n let fixedPrice = price;\n let fixedStandardPrice = standardPrice;\n\n // Fix decimal places for non-whole-number prices\n if (price % 1 !== 0) {\n fixedPrice = price.toFixed(2);\n }\n if (standardPrice % 1 !== 0) {\n fixedStandardPrice = standardPrice.toFixed(2);\n }\n\n removeClass(strikeThroughContainer, hiddenClass);\n priceElement.textContent = `$${fixedStandardPrice}`;\n salesPriceElement.textContent = `$${fixedPrice}`;\n if (price === standardPrice) {\n addClass(strikeThroughContainer, hiddenClass);\n }\n priceSection.innerHTML = priceTemplate.innerHTML;\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} sizes - sizes object\n * @param {Object} productContainer - DOM container for a given product\n * @param {Object} variantsList - Variations list data\n */\nfunction updateSizeElements(sizes, productContainer, variantsList) {\n const isQuickView = hasClass(productContainer, 'cached-quick-view');\n const { variants } = isQuickView ? window.quickviewProductInfo.productInventory : window.productInventory;\n const sizeContainer = queryFirst('.size-container', productContainer);\n\n if (!sizeContainer) return;\n\n const { selectedText, outOfStock, label, describedby, attrValue } = sizeContainer.dataset;\n let sizeButtonHtml = '';\n\n variantsList.forEach((eachVariant, index) => {\n const eachSize = sizes[eachVariant];\n const sizeElement = queryFirst('[data-attr=\"size\"] [data-attr-value=\"' + eachVariant + '\"]', productContainer);\n const sizeId = eachSize.ID;\n const { forceOutOfStock } = eachSize;\n const inventoryData = variants[sizeId];\n const variantData = {\n value: eachVariant,\n forceOutOfStock,\n selected: sizeElement ? hasClass(sizeElement, 'selected') : false,\n inStock: inventoryData.availabilityStatus !== 'NOT_AVAILABLE',\n sizeSwatchNotAvailable: sizeElement && sizeElement.dataset.sizeswatchnotavailable === 'true' ? true : false\n };\n const ariaLabelValue = label + ' ' + attrValue + ' ' + eachVariant;\n sizeButtonHtml += sizeButtonTemplate(variantData, ariaLabelValue, describedby + eachVariant + index, selectedText, outOfStock);\n });\n remove(queryAll('.size-list', sizeContainer));\n sizeButtonHtml += sizeContainer.innerHTML;\n sizeContainer.innerHTML = sizeButtonHtml;\n}\n\n/**\n * Function tto update ways to wear content based on the response\n * @param {string} groupId - selected variatiion group id\n * @param {*} variationUrl - url to fecth the content\n */\nfunction updateContentModules(groupId, variationUrl) {\n $.spinner().start();\n $.ajax({\n url: variationUrl,\n method: 'post',\n data: {\n variationGroup: groupId\n },\n success: function (response) {\n const waysToWearContainer = queryFirst('.ways-to-wear');\n if (response) {\n waysToWearContainer.innerHTML = response;\n } else {\n waysToWearContainer.innerHTML = '';\n }\n $.spinner().stop();\n $body.trigger('search:updateProducts');\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * updates image urls and presets by appending the scene7 url\n * @param {Object} images - images array to be updated\n * @returns {Object} - updated images array\n */\nfunction updateImageDetails(images) {\n const updatedImages = images.map(imageObj => {\n const srcsetPresets = JSON.parse(imageObj.srcset);\n let srcsetString = [];\n srcsetPresets.forEach(function (item) {\n srcsetString.push(imageObj.imageScene7 + '?' + item.preset + ' ' + item.breakpoint);\n });\n return {\n alt: imageObj.alt,\n url: imageObj.imageScene7 + imageObj.url,\n srcset: srcsetString.join(', '),\n title: imageObj.title\n };\n });\n return updatedImages;\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {Object} currentElement - selected color element\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateProductDetails(currentElement, $productContainer) {\n const elementData = currentElement.dataset;\n const variantGroupId = elementData.attrValue;\n const productContainer = $productContainer[0];\n const swatchNameElement = queryFirst('.selected-swatch-name', productContainer);\n const swatchContainer = queryFirst('.color-container', productContainer);\n const assistiveElements = queryAll('.selected-assistive-text', swatchContainer);\n const assistiveTextElement = queryFirst('.selected-assistive-text', currentElement.closest('.color-list'));\n const monogramBtn = queryFirst('.monogram-btn', productContainer);\n const masterId = productContainer.dataset.masterid;\n const productInfo = window.productInfo[masterId];\n const { groupId, sizes, images, shopThePrint, price, standardPrice, videoUrl, variantsList, mgFlag, mgLocs, hasWaysToWear, isFinalSale, isDirectlyPurchasable, earlyAccess } = productInfo.variants[variantGroupId];\n productContainer.dataset.wishlistId = groupId;\n const colorElements = queryAll('.color-attribute .swatch-circle', productContainer);\n const { attrDisplayvalue, customPageTitle, pageTitle, includeLillyColor, lillyColorName, customPageDescription, pageDescription } = elementData;\n const titleElement = queryFirst('.meta-page-title');\n const descriptionElement = queryFirst('.meta-page-description');\n const waysToWearEl = queryFirst('.ways-to-wear', productContainer);\n const variationGridUrl = waysToWearEl.dataset.variationGridUrl;\n if (isMcEnable === 'true') {\n // update Marketing Analytics trackWishlist event\n let marketingCloudPageAnalytics = [{ item: groupId }];\n trackPageView(marketingCloudPageAnalytics);\n }\n // Updated logic here\n if (swatchNameElement) {\n const selectedSwatchElement = queryFirst('.selected-swatch', productContainer);\n const colorlabel = selectedSwatchElement.dataset.colorLabel;\n swatchNameElement.textContent = colorlabel + attrDisplayvalue;\n } else {\n const swatchHtml = formatMessage(swatchNameTemplate.swatchNameHtml, attrDisplayvalue);\n queryFirst('.selected-swatch', productContainer).innerHTML = swatchHtml;\n }\n\n if (customPageTitle && titleElement) {\n titleElement.textContent = customPageTitle;\n } else if (pageTitle && titleElement) {\n titleElement.textContent = pageTitle;\n }\n const longDescriptionElement = queryFirst('.long-description-container .long-description', productContainer);\n if (longDescriptionElement) {\n const { longDescription } = longDescriptionElement.dataset;\n let description;\n if (includeLillyColor !== 'false' && lillyColorName) {\n description = tokenize(longDescription, { lillyColor: lillyColorName }, '{{', '}}');\n } else {\n description = tokenize(longDescription, { lillyColor: '' }, '
    5. {{', '}}
    6. ');\n }\n longDescriptionElement.innerHTML = description;\n }\n if (customPageDescription && descriptionElement) {\n descriptionElement.content = customPageDescription;\n } else if (pageDescription && descriptionElement) {\n descriptionElement.content = pageDescription;\n }\n\n removeClass(colorElements, 'selected');\n addClass(queryFirst('.swatch-circle', currentElement), 'selected');\n queryFirst('.product-id', productContainer).textContent = masterId;\n\n assistiveElements.forEach(eachElement => {\n eachElement.textContent = '';\n });\n\n assistiveTextElement.textContent = assistiveTextElement.dataset.selectedText;\n\n const productFinalSaleMessage = queryFirst('.on-sale-message', productContainer);\n const productFreeReturnsMessage = queryFirst('.pdp-header-promo');\n if (productFinalSaleMessage) {\n if (isFinalSale) {\n removeClass(productFinalSaleMessage, hiddenClass);\n addClass(productFreeReturnsMessage, 'd-none');\n } else {\n addClass([productFinalSaleMessage], hiddenClass);\n removeClass(productFreeReturnsMessage, 'd-none');\n }\n }\n\n if (mgFlag && mgLocs && mgLocs.length > 0) {\n removeClass(monogramBtn, hiddenClass);\n } else {\n addClass(monogramBtn, hiddenClass);\n }\n\n if (hasWaysToWear) {\n updateContentModules(groupId, variationGridUrl);\n } else {\n waysToWearEl.innerHTML = '';\n }\n updateSizeElements(sizes, productContainer, variantsList);\n $body.trigger('product:updateStoreInventory', {\n productContainer\n });\n if (!isDirectlyPurchasable) {\n const sizeElements = queryAll('.size-btn', productContainer);\n addClass(sizeElements, notAvailable);\n }\n updateShopThePrint(shopThePrint, productContainer);\n updateProductPrice(price, standardPrice, productContainer);\n const ssColor = currentElement.dataset.attrDisplayvalue;\n const ssSizeElement = queryFirst('.size-btn.selected', productContainer);\n const ssSize = ssSizeElement ? ssSizeElement.dataset.attrValue : 'unknown';\n\n if (isFitPredictorEnabled) {\n updateProductData(ssColor, ssSize, standardPrice, price, productContainer);\n handleColor(productContainer);\n }\n\n if (!ssSizeElement) {\n $('.availability-msg', $productContainer).empty();\n }\n // Update primary images\n var primaryImageUrls = updateImageDetails(images.large);\n\n if (window.matchMedia('(max-width: 767.98px)').matches) {\n const carouselContainerEl = queryFirst('.carousel.image-slider', productContainer);\n const carouselContainerHeight = carouselContainerEl.offsetHeight;\n carouselContainerEl.style.minHeight = carouselContainerHeight + 'px';\n }\n const isEarlyAccessItem = isEarlyAccessElement(earlyAccess);\n createCarousel(primaryImageUrls, $productContainer, isEarlyAccessItem, videoUrl);\n $body.trigger('product:afterAttributeChange', {\n container: $productContainer,\n variantGroupId,\n groupId\n });\n $body.trigger('product:handleImageZoom');\n const wishlistButton = queryFirst('.add-to-wish-list', productContainer);\n if (wishlistButton && hasClass(wishlistButton, 'added-to-wish-list')) {\n removeClass(wishlistButton, 'added-to-wish-list');\n wishlistButton.disabled = false;\n const assistiveText = wishlistButton.getAttribute('data-assistive-text');\n wishlistButton.setAttribute('aria-label', assistiveText);\n }\n // Updated logic here\n const swatchParam = `?dwvar_${masterId}_color`;\n const queryParams = location.search;\n let UpdatedParams = `${swatchParam}=${variantGroupId}`;\n if (queryParams) {\n UpdatedParams = queryParams\n .split('&')\n .map(eachParam => {\n if (eachParam.indexOf(swatchParam) > -1) {\n return `${swatchParam}=${variantGroupId}`;\n }\n return eachParam;\n })\n .join('&');\n }\n history.replaceState({ variantGroupId }, document.title, UpdatedParams);\n}\n\n/**\n * updates the quick view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {Object} currentElement - selected color element\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateQuickViewDetails(currentElement, $productContainer) {\n const elementData = currentElement.dataset;\n const variantGroupId = elementData.attrValue;\n const productContainer = $productContainer[0];\n const swatchNameElement = queryFirst('.selected-swatch-name', productContainer);\n const swatchContainer = queryFirst('.color-container', productContainer);\n const assistiveElements = queryAll('.selected-assistive-text', swatchContainer);\n const assistiveTextElement = queryFirst('.selected-assistive-text', currentElement.closest('.color-list'));\n const quickViewInfo = window.quickviewProductInfo;\n const { productInfo } = quickViewInfo;\n const { groupId, sizes, images, price, standardPrice, variantsList, isDirectlyPurchasable, pdpBreadCrumbs, earlyAccess } = productInfo.variants[variantGroupId];\n productContainer.dataset.wishlistId = groupId;\n handleEarlyAccessCta(productContainer, (earlyAccess && earlyAccess.isEarlyAccessProduct));\n const colorElements = queryAll('.color-attribute .swatch-circle', productContainer);\n const { attrDisplayvalue } = elementData;\n // Updated logic here\n if (swatchNameElement) {\n swatchNameElement.textContent = attrDisplayvalue;\n } else {\n const swatchHtml = formatMessage(swatchNameTemplate.swatchNameHtml, attrDisplayvalue);\n queryFirst('.selected-swatch', productContainer).innerHTML = swatchHtml;\n }\n removeClass(colorElements, 'selected');\n addClass(queryFirst('.swatch-circle', currentElement), 'selected');\n\n assistiveElements.forEach(eachElement => {\n eachElement.textContent = '';\n });\n\n assistiveTextElement.textContent = assistiveTextElement.dataset.selectedText;\n\n updateSizeElements(sizes, productContainer, variantsList);\n if (!isDirectlyPurchasable) {\n const sizeElements = queryAll('.size-btn', productContainer);\n addClass(sizeElements, notAvailable);\n }\n\n updateProductPrice(price, standardPrice, productContainer);\n const ssColor = currentElement.dataset.attrDisplayvalue;\n const ssSizeElement = queryFirst('.size-btn.selected', productContainer);\n const ssSize = ssSizeElement ? ssSizeElement.dataset.attrValue : 'unknown';\n\n if (isFitPredictorEnabled) {\n updateProductData(ssColor, ssSize, standardPrice, price, productContainer);\n handleColor(productContainer);\n }\n\n if (!ssSizeElement) {\n $('.availability-msg', $productContainer).empty();\n }\n // Update primary images\n var primaryImageUrls = updateImageDetails(images.large);\n if (window.matchMedia('(min-width: 1024px)').matches) {\n const carouselContainerEl = queryFirst('.carousel', productContainer);\n const carouselContainerHeight = carouselContainerEl.offsetHeight;\n carouselContainerEl.style.minHeight = carouselContainerHeight + 'px';\n }\n const isEarlyAccessItem = isEarlyAccessElement(earlyAccess);\n createCarousel(primaryImageUrls, $productContainer, isEarlyAccessItem);\n $body.trigger('product:quickViewAttributeChange', {\n container: $productContainer,\n variantGroupId,\n groupId,\n productContainer,\n monetateData: {\n pdpBreadCrumbs\n }\n });\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('
      ').append($.parseHTML(html));\n\n var body = $html.find('.bonus-acordion-container');\n var selectedProducts = $html.find('.selected-products-container');\n var footer = $html.find('.modal-footer');\n\n return {\n body,\n footer,\n selectedProducts\n };\n}\n\n/**\n * Function to update GWP elements on swatch or size change\n */\nfunction updateGwpElements() {\n $('.choice-of-bonus-product').on('bonus:afterAttributeSelect', function () {\n const productDialog = queryFirst('.choose-bonus-product-dialog');\n const accordionContainer = this.closest('.bonus-acordion-container', productDialog);\n const bonusAccordionElements = queryAll('.bonus-acordion-container', productDialog);\n const addToCart = queryFirst('.add-bonus-products', productDialog);\n const sizeEl = queryFirst('.select-size', this);\n const isSizeSelected = sizeEl ? !!sizeEl.selectedIndex : true;\n const selectedSwatch = queryFirst('.color-attribute .swatch-circle.selected', this);\n const isSelectedSizeUnavailable = sizeEl && hasClass($(sizeEl).children('option:selected')[0], notAvailable);\n\n if (sizeEl) {\n const firstOption = queryFirst('option', sizeEl);\n\n // Force this option's resetUrl to remove the size\n firstOption.value = firstOption.value.replace(/(_size=)[^&]+/, '$1');\n }\n\n if (isSelectedSizeUnavailable) {\n addClass(sizeEl, notAvailable);\n } else {\n removeClass(sizeEl, notAvailable);\n }\n\n let isEnabled = true;\n const maxItems = parseInt(accordionContainer.dataset.maxItems, 10);\n const selectedItemsCount = queryAll('.select-bonus-product:checked', accordionContainer).length;\n\n if (selectedItemsCount < maxItems) {\n isEnabled = false;\n }\n\n if (isEnabled && isSizeSelected && !!selectedSwatch && !isSelectedSizeUnavailable) {\n addClass(accordionContainer, readyClass);\n } else {\n isEnabled = false;\n removeClass(accordionContainer, readyClass);\n }\n\n const validProducts = queryAll('.bonus-acordion-container.ready-to-add', productDialog);\n\n addToCart.disabled = !isEnabled || hasClass(addToCart, notAvailable) || bonusAccordionElements.length !== validProducts.length;\n });\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body')\n .spinner()\n .start();\n\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n const { maxBonusItems, addToCartUrl, uuid, pliUUID, pageSize, showProductsUrlRuleBased, bonusChoiceRuleBased, bonusDiscountLineItems } = data;\n $('.choose-bonus-product-dialog').attr({\n 'data-total-qty': maxBonusItems,\n 'data-addToCartUrl': addToCartUrl,\n 'data-UUID': uuid,\n 'data-pliUUID': pliUUID,\n 'data-pageStart': 0,\n 'data-pageSize': pageSize,\n 'data-moreURL': showProductsUrlRuleBased,\n 'data-bonusChoiceRuleBased': bonusChoiceRuleBased,\n 'data-bonus-items': JSON.stringify(bonusDiscountLineItems)\n });\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $gwpDialog.find('.enter-message').text(response.enterDialogMessage);\n $gwpDialog.find('.modal-body').html(parsedHtml.body);\n $gwpDialog\n .find('.modal-footer, .selected-products-container')\n .remove();\n $gwpDialog.find('.modal-content').append(parsedHtml.footer);\n $(parsedHtml.selectedProducts).insertAfter($gwpDialog.find('.modal-header'));\n // LP custom changes start\n const { selectedBonusProducts } = response;\n if ((selectedBonusProducts || []).length) {\n const modalDialog = queryFirst('.choose-bonus-product-dialog');\n let selectedProductsCount = 0;\n selectedBonusProducts.forEach(eachProductList => {\n if (eachProductList.length) {\n const bonusAccordionContainer = queryFirst(`.bonus-acordion-container[data-uuid=\"${eachProductList[0].uuid}\"]`, modalDialog);\n const maxCount = parseInt(bonusAccordionContainer.dataset.maxItems, 10);\n const productListLength = eachProductList.length;\n if (maxCount === productListLength) {\n addClass(bonusAccordionContainer, 'selected');\n addClass(bonusAccordionContainer, readyClass);\n }\n const bonusItemCount = queryFirst('.bonus-item-count span', bonusAccordionContainer);\n bonusItemCount.textContent = productListLength;\n selectedProductsCount += productListLength;\n eachProductList.forEach(eachProduct => {\n const selectedProduct = queryFirst(`.choice-of-bonus-product[data-pid=\"${eachProduct.pid}\"][data-uuid=\"${eachProduct.uuid}\"]`);\n const selectBonusCheckbox = queryFirst('.select-bonus-product', selectedProduct);\n\n if (selectBonusCheckbox) {\n selectBonusCheckbox.checked = true;\n }\n\n addClass(selectedProduct, selectedProductClass);\n setControlsEnabled(selectedProduct, true);\n });\n }\n });\n const addToCart = queryFirst('.add-bonus-products', modalDialog);\n addToCart.disabled = maxBonusItems !== selectedProductsCount;\n }\n\n // Default all size dropdowns that aren't selected products\n $('.bonus-product-item:not(.selected-product) .select-size').each(function () {\n this.selectedIndex = 0;\n });\n\n updateGwpElements();\n // LP custom changes end\n $gwpDialog.modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n if (!response.error) {\n return;\n }\n\n if (response.displayModal) {\n let addToCartWarningDialog = queryFirst('#add-to-cart-warning-dialog');\n\n if (!addToCartWarningDialog) {\n const isOnCartPage = (window.location.pathname === '/cart/');\n const fragment = renderFragment(dialogTemplate({\n buttons: isOnCartPage ? [{ text: 'OK', primary: true }] : [{ text: 'Close' }, { text: 'Review Tote', primary: true, link: response.redirectLink }],\n modalContentHeading: response.messageHeading,\n modalContentBody: isOnCartPage ? response.messageBodyOnCart : response.messageBodyOffCart,\n id: 'add-to-cart-warning-dialog'\n }));\n\n document.body.appendChild(fragment);\n addToCartWarningDialog = queryFirst('#add-to-cart-warning-dialog');\n }\n\n $(addToCartWarningDialog).modal('show');\n } else {\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n $('.add-to-cart-messages').remove();\n if ($('.add-to-cart-messages').length === 0) {\n $body.append('
      ');\n }\n\n $('.add-to-cart-messages').append('
      ' + response.message + '
      ');\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this)\n .find('.product-id')\n .text(),\n quantity: parseInt(\n $(this)\n .find('label.quantity')\n .data('quantity'),\n 10\n )\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]').data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n })\n .toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Enables or disables the color/size controls in a container\n * @param {HTMLElement} container - The container element\n * @param {boolean} enable - Whether to enable the controls (false to disable)\n */\nfunction setControlsEnabled(container, enable) {\n const controls = queryAll('button, select', container);\n\n controls.forEach(control => {\n control.disabled = !enable;\n });\n}\n\nexport default {\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n attributeSelect,\n updateProductDetails,\n updateImageDetails,\n focusChooseBonusProductModal: function () {\n $gwpDialog.on('shown.bs.modal', () => {\n $gwpDialog.siblings().attr('aria-hidden', 'true');\n $gwpDialog.find('.close').trigger('focus');\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $gwpDialog.on('hidden.bs.modal', () => {\n $gwpDialog.siblings().attr('aria-hidden', 'false');\n removeClass(queryFirst('.choose-bonus-product-dialog'), 'selected');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $body.on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button.color-attribute, [data-attr=\"fitSize\"] button.non-color-attribute', function (e) {\n e.preventDefault();\n if (($('.size-container').length > 0) && !($('.size-container .size-list .size-btn.selected').length > 0)) {\n $('.pdp-details .notify-me-desc').addClass('d-none')\n }\n const productDetailContainer = this.closest(PRODUCT_DETAIL_CONTAINER_SELECTOR);\n if ($(this).hasClass('fit-product-type') || $(this).hasClass('color-attribute')) {\n const selectedSizeBtn = queryFirst('.size-btn.selected', productDetailContainer);\n const notifyMeCTA = queryFirst('.notify-me-btn', productDetailContainer);\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', productDetailContainer);\n const addToCartCTA = queryFirst('.prices-add-to-cart-actions .add-to-cart', productDetailContainer);\n removeClass(selectedSizeBtn, 'selected');\n addClass(notifyMeCTA, 'd-none');\n removeClass(addToCartSection, 'd-none');\n $(addToCartCTA).attr('disabled', false);\n selectedSizeCTA = selectedSizeBtn;\n }\n\n if ($(this).attr('disabled') || hasClass(queryFirst('.swatch-circle', this), 'selected')) {\n return;\n }\n var $productContainer = $(this).closest('.pdp-container.product-detail, .set-items .product-detail, .choose-bonus-product-modal .product-detail, .gift-card-main, .product-quickview');\n if ($productContainer.hasClass('cached-quick-view')) {\n updateQuickViewDetails(this, $productContainer);\n } else if ($productContainer.length) {\n selectColorAttribute($(this).attr('data-url'), $productContainer, $(this));\n }\n $body.trigger('swatchChangeEvent', this);\n $body.trigger('search:updateProducts');\n updateVisibilityOfLowInventoryMsg(productDetailContainer);\n });\n },\n\n renderSizeElements: function () {\n const swatchEl = queryFirst('.pdp-container:not(.gift-card-main) button.color-attribute .swatch-circle.selected');\n\n if (swatchEl) {\n const productContainer = queryFirst('.pdp-container');\n const selectedSizeEl = queryFirst('.size-btn.selected', productContainer);\n\n if (!selectedSizeEl) {\n const selectedSwtachBtn = swatchEl.parentElement;\n const variantGroupId = selectedSwtachBtn.dataset.attrValue;\n const masterId = productContainer.dataset.masterid;\n const productInfo = window.productInfo[masterId];\n const { sizes, variantsList, isDirectlyPurchasable } = productInfo.variants[variantGroupId];\n if (!isDirectlyPurchasable) {\n const sizeElements = queryAll('.size-btn', productContainer);\n addClass(sizeElements, notAvailable);\n }\n }\n\n $body.trigger('product:updateStoreInventory', {\n productContainer: productContainer\n });\n }\n updatedimageSlideArrowPDP();\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n if (!e.target.closest('.fp-root')) {\n e.preventDefault();\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n }\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this)\n .closest('.modal-content')\n .find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect(\n $(e.currentTarget)\n .find('option:selected')\n .data('url'),\n $productContainer\n );\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', '.prices-add-to-cart-actions button.add-to-cart, .prices-add-to-cart-actions button.add-to-cart-global, button.quick-buy-add-to-cart', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n var setMasterPid;\n const storeLocatoreContainer = queryFirst('.store-locator-container');\n const ispuAddToCart = storeLocatoreContainer && queryFirst('.add-to-cart', storeLocatoreContainer);\n const ispuModalContainer = $(this)\n .closest('.product-detail')\n .find('.lp-slideout-modal[id*=\"pick-up-in-store\"]');\n if (ispuAddToCart) {\n ispuAddToCart.disabled = true;\n }\n let isSet = false;\n let triggerSSAddToCart = true;\n var $productContainer = $(this).closest('.product-detail');\n const isAddAllToCart = hasClass(this, 'add-to-cart-global');\n if (isAddAllToCart) {\n const setModal = this.closest('.custom-set-detail-modal');\n const setProducts = queryAll('.custom-set-items.set-items .product-detail', setModal).filter(item => !hasClass(item.closest('.product-detail'), 'hidden-set'));\n const fillteredProducts = setProducts.filter(eachProduct => {\n toggleSelectSizeInfo(eachProduct);\n return !!queryFirst('.size-btn.selected', eachProduct);\n });\n if (fillteredProducts.length !== setProducts.length) {\n return;\n }\n } else {\n toggleSelectSizeInfo($productContainer[0]);\n if (!queryFirst('.size-btn.selected', $productContainer[0])) {\n return;\n }\n }\n\n $body.trigger('product:beforeAddToCart', this);\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n isSet = true;\n triggerSSAddToCart = false;\n setMasterPid = $('.product-detail.product-set-detail').data('pid');\n setPids = [];\n\n // DRP-180 updated class from \".product-detail\" to \".custom-set-items .custom-set-product\" to only check products within set modal for add all to tote\n $('.custom-set-items .custom-set-product').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this)\n .find('.product-id')\n .text(),\n qty: $(this)\n .find('.quantity-select')\n .val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n if ($(this).next('ul.size-container').find('li button.size-btn').hasClass('selected')) {\n pid = $(this).next('ul.size-container').find('li button.size-btn.selected').data('variation-id');\n } else {\n pid = getPidValue($(this));\n }\n\n if (!$productContainer.length) {\n $productContainer = $(this)\n .closest('.quick-view-dialog')\n .find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this)),\n setMasterPid: setMasterPid\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n if (isSet) {\n $('#productSetModal').modal('hide');\n }\n\n if (ispuAddToCart) {\n ispuAddToCart.disabled = false;\n ispuModalContainer.modal('hide');\n }\n\n handlePostCartAdd(data);\n\n if (triggerSSAddToCart && isFitPredictorEnabled) {\n ssAddToCart($productContainer[0]);\n }\n\n $.spinner().stop();\n $body.trigger('product:afterAddToCart', data);\n const productContainerPrice = queryFirst('.price-section .sales .value', $productContainer[0]);\n if (productContainerPrice) {\n // note, that this event will not function on PLP, because of DOM structure (price section in different place)\n $body.trigger('stylitics:main:addItem', {\n pid: pid,\n price: productContainerPrice.getAttribute('content')\n });\n }\n },\n error: function () {\n $.spinner().stop();\n if (ispuAddToCart) {\n ispuAddToCart.disabled = false;\n }\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $choiceOfBonusProduct.data('pid');\n var uuid = $choiceOfBonusProduct.data('uuid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = 1;\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n\n // LP customization changes start\n const { checked } = this;\n const productDialog = queryFirst('.choose-bonus-product-dialog');\n const choiceOfBonusProduct = $choiceOfBonusProduct[0];\n const addToCart = queryFirst('.add-bonus-products', productDialog);\n const selectedProductElement = queryFirst(`.selected-pid[data-pid=\"${pid}\"][data-uuid=\"${uuid}\"]`, productDialog);\n let bonusAccordionElements = queryAll('.bonus-acordion-container', productDialog);\n let accordionContainer = this.closest('.bonus-acordion-container', productDialog);\n const bonusCountElement = queryFirst('.bonus-item-count span', accordionContainer);\n const selectedCount = queryAll('.select-bonus-product:checked', accordionContainer).length;\n const maxCount = parseInt(accordionContainer.dataset.maxItems, 10);\n let sizeEl = queryFirst('.select-size', choiceOfBonusProduct);\n let selectedSwatch = queryFirst('.color-attribute .swatch-circle.selected', choiceOfBonusProduct);\n let isSizeSelected = sizeEl ? !!sizeEl.selectedIndex : true;\n\n if (selectedCount < maxCount) {\n removeClass(accordionContainer, 'selected');\n } else {\n addClass(accordionContainer, 'selected');\n }\n bonusCountElement.textContent = selectedCount;\n\n let enableAddTocart = true;\n const maxItems = parseInt(accordionContainer.dataset.maxItems, 10);\n const selectedItemsCount = queryAll('.select-bonus-product:checked', accordionContainer).length;\n if (selectedItemsCount < maxItems) {\n enableAddTocart = false;\n }\n enableAddTocart = isSizeSelected && !!selectedSwatch && enableAddTocart;\n\n if (enableAddTocart) {\n addClass(accordionContainer, readyClass);\n } else {\n removeClass(accordionContainer, readyClass);\n }\n\n let validProducts = queryAll('.bonus-acordion-container.ready-to-add', productDialog);\n\n if (!hasClass(addToCart, notAvailable)) {\n addToCart.disabled = bonusAccordionElements.length !== validProducts.length;\n }\n\n if (checked) {\n addClass(choiceOfBonusProduct, selectedProductClass);\n } else {\n removeClass(choiceOfBonusProduct, selectedProductClass);\n if (selectedProductElement) {\n selectedProductElement.click();\n }\n }\n if (selectedCount < maxCount) {\n $(accordionContainer)\n .find('.choice-of-bonus-product')\n .find('.select-bonus-product, .color-attribute, select')\n .removeAttr('tabindex').prop('disabled', false);\n } else {\n $(accordionContainer)\n .find('.choice-of-bonus-product:not(.selected-product)')\n .find('.select-bonus-product, .color-attribute, select')\n .attr('tabindex', -1).prop('disabled', true);\n }\n if (!checked) {\n return;\n }\n // LP customization changes end\n\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml =\n '' +\n '
      ' +\n '
      ' +\n $choiceOfBonusProduct.find('.product-name').html() +\n '
      ' +\n '
      ' +\n '
      ';\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $body.on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled', !response.product.readyToOrder || !response.product.available);\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n });\n\n const bonusProductDialog = queryFirst('.choose-bonus-product-dialog');\n\n if (bonusProductDialog) {\n bonusProductDialog.addEventListener('click', e => {\n const target = e.target.closest('.select-bonus-product');\n\n if (!target) return;\n\n setControlsEnabled(target.closest('.row'), target.checked);\n });\n }\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content')\n .spinner()\n .start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content')\n .spinner()\n .stop();\n },\n error: function () {\n $('.modal-content')\n .spinner()\n .stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption = parseInt($(this).data('qty'), 10);\n const pid = $(this).data('pid');\n const uuid = $(this).data('uuid');\n const productId = $(`.choice-of-bonus-product.selected-product[data-pid=\"${pid}\"][data-uuid=\"${uuid}\"] .product-detail`).attr('data-pid');\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = productId;\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n uuid: uuid,\n pid: productId,\n qty: qtyOption,\n options: option ? [option] : []\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&bonusItems=' + JSON.stringify($('.choose-bonus-product-dialog').data('bonusItems'));\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $body.append('
      ');\n }\n $('.add-to-cart-messages').append('
      ' + data.errorMessage + '
      ');\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n $('.minicart-quantity').html(data.totalQty);\n if ($('.cart-page').length) {\n location.reload();\n }\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n revealRecommendations: function () {\n const { initSpecificCarousel } = require('../components/carousel');\n queryAll('.recommendations:not(.product-listing-header)').forEach(eachRecommendation => {\n const titleEl = queryFirst('.title', eachRecommendation);\n const productEl = queryFirst('.grid-tile', eachRecommendation);\n const scrollableContent = queryFirst('.scrollable-content', eachRecommendation);\n\n if (titleEl && !productEl) {\n eachRecommendation.outerHTML = '';\n } else if (titleEl && productEl) {\n eachRecommendation.style.display = 'block';\n if (scrollableContent) initSpecificCarousel(scrollableContent);\n }\n });\n },\n handleEarlyAccessPLPLockIcon: function () {\n const earlyAccessPLPContainer = queryAll('.early-access-plp-container');\n if (earlyAccessPLPContainer.length) {\n earlyAccessPLPContainer.forEach(earlyAccessPlpIcon => {\n const lockIconContainer = queryFirst('.loyalty-early-access-lock-container', earlyAccessPlpIcon);\n const earlyAccessWishlistIcon = queryFirst('.product-tile .add-to-wish-list-container', earlyAccessPlpIcon);\n const earlyAccessPLPBadge = queryFirst('.loyalty-product-tile-badge', earlyAccessPlpIcon);\n const { earlyAccessDate } = lockIconContainer.dataset;\n const isEarlyAccessItem = isEarlyAccessElement(earlyAccessDate);\n if (isLoyaltyProgramMember || !isEarlyAccessItem) {\n removeClass(earlyAccessWishlistIcon, HIDDEN_CLASS);\n addClass(lockIconContainer, HIDDEN_CLASS);\n if (!isEarlyAccessItem) {\n addClass(earlyAccessPLPBadge, HIDDEN_CLASS);\n }\n } else {\n addClass(earlyAccessWishlistIcon, HIDDEN_CLASS);\n removeClass([lockIconContainer, earlyAccessPLPBadge], HIDDEN_CLASS);\n }\n });\n }\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n handleEarlyAccessCta: handleEarlyAccessCta,\n updatedimageSlideArrowPDP: updatedimageSlideArrowPDP,\n};\nwindow.onload = () => {\n updatedimageSlideArrowPDP();\n replaceVideoThumbnailImage(queryFirst('.pdp-container'));\n};\n","'use strict';\n\nimport { queryFirst, addClass, removeClass, hasClass, queryAll, scrollTo, setAttribute, throttle } from '../domUtil';\nimport base from './base';\nimport { updateProductData, handleColor, handleSize } from 'fitpredictor/product/secretsauce';\nconst { isShippingPreferencesViewEnabled, isEarlyAccessElement, handleNotifyMe } = require('./helper');\nconst { availabilityMessageTmpl, restrictedMessageTmpl, availabilityMessageOOS, availabilityMessagePreorder, ispuAvailabilityMessageTmpl, ispuLowStockMessageTmpl } = require('../templates').productDetail;\nconst $body = $('body');\nconst sizeChartClasses = 'no-scroll size-chart-visible';\nvar Hammer = require('hammerjs');\nconst KEYCODE_TAB = 9;\nconst TabKey = 'Tab';\nconst ACTIVE_CLASS = 'active';\nconst { IN_STOCK_STATUS: IN_STOCK, NOT_AVAILABLE_STATUS: NOT_AVAILABLE, PREORDER_STATUS: PREORDER, HIDDEN_CLASS } = require('../constants');\nconst { SHIP_TO_LOW_INVENTORY_CLASS } = require('../components/shippingPreference/constants');\n/**\n * Handling zoomin effect on product image slider\n */\nfunction handleProductImageZoom() {\n const pdpPageCarousels = queryFirst('.product-detail');\n const carousel = $('.primary-images .carousel:not(.tile-carousel)');\n const imageZoomUrl = carousel.data('image');\n const imagePresetUrl = carousel.data('preset');\n\n const imageObserver = new MutationObserver(function (mutationList) {\n for (let mutation of mutationList) {\n if (mutation.type === 'childList') {\n const { target, addedNodes } = mutation;\n const baseImg = queryFirst('.img-fluid', target);\n const zoomAlt = baseImg.getAttribute('alt') + ' Zoomed';\n setAttribute(addedNodes, 'alt', zoomAlt);\n }\n }\n });\n\n if (pdpPageCarousels && pdpPageCarousels.length > 0) {\n const pdpImages = queryAll('.primary-images .carousel-item');\n const pdpIndicators = queryAll('.primary-images .carousel-indicators li');\n\n pdpImages.forEach((img, index) => {\n const imageEl = queryFirst('img', img);\n if (!imageEl) {\n return;\n }\n imageEl.setAttribute('data-src-hires', imageEl.getAttribute('data-src').replace(imagePresetUrl, imageZoomUrl));\n let scale = 0.35;\n let zoomed = false;\n let mobileZoomed = false;\n /**\n * Handling zoomin effect logic\n * @param {jQuery} elm - DOM element for current image\n * @param {boolean} zoomed - boolean value if zoomed or not\n */\n function createTouchZoom(elm) {\n var thisHammer = new Hammer(elm, {});\n thisHammer.domEvents = true;\n thisHammer.get('pinch').set({ enable: true });\n\n let transform = '';\n let el = elm;\n let panSpeed = 1.1;\n let xPos = { current: 0, last: 0, max: 0 };\n let yPos = { current: 0, last: 0, max: 0 };\n let scale = { current: 2, last: 2, max: 4 };\n\n el.style.transform = `translate(${xPos.current}px,${yPos.current}px) scale(${scale.current},${scale.current})`;\n\n thisHammer.on('tap pan pinch panend pinchend', function (e) {\n // Prevent tap events from interfering\n e.srcEvent.stopPropagation();\n e.srcEvent.preventDefault();\n // If zoomed in, pan the image\n if (scale.current !== 1) {\n xPos.current = xPos.last + e.deltaX * panSpeed;\n yPos.current = yPos.last + e.deltaY * panSpeed;\n xPos.max = Math.ceil(((scale.current - 1) * el.clientWidth) / 2);\n yPos.max = Math.ceil(((scale.current - 1) * el.clientHeight) / 2);\n // Keep coordinates within image bounds\n if (xPos.current > xPos.max) {\n xPos.current = xPos.max;\n }\n if (xPos.current < -xPos.max) {\n xPos.current = -xPos.max;\n }\n if (yPos.current > yPos.max) {\n yPos.current = yPos.max;\n }\n if (yPos.current < -yPos.max) {\n yPos.current = -yPos.max;\n }\n }\n\n if (e.type === 'tap') {\n e.preventDefault();\n scale.current++;\n scale.last = scale.current;\n\n if (scale.current > scale.max) {\n scale.current = 1;\n xPos.current = 0;\n yPos.current = 0;\n xPos.last = xPos.current;\n yPos.last = yPos.current;\n scale.last = scale.current;\n transform = `translate(${xPos.current}px,${yPos.current}px) scale(${scale.current},${scale.current})`;\n mobileZoomed = true;\n } else mobileZoomed = false;\n }\n // Scale image with pinch\n if (e.type === 'pinch') {\n scale.current = Math.max(0.99, Math.min(scale.last * e.scale, scale.max));\n }\n // Finish scaling\n if (e.type === 'pinchend') {\n scale.last = scale.current;\n }\n // Finish panning\n if (e.type === 'panend') {\n xPos.last = xPos.current;\n yPos.last = yPos.current;\n }\n\n // Create scale/pan changes if zoomed in\n if (scale.current !== 1) {\n transform = `translate(${xPos.current}px,${yPos.current}px) scale(${scale.current},${scale.current})`;\n }\n // Apply transformation\n if (transform) {\n el.style.transform = transform;\n }\n });\n\n $(el).on('zoom:imageChange', () => {\n thisHammer.off('tap pan pinch panend pinchend');\n scale.current = 1;\n xPos.current = 0;\n yPos.current = 0;\n xPos.last = xPos.current;\n yPos.last = yPos.current;\n scale.last = scale.current;\n el.style.transform = `translate(${xPos.current}px,${yPos.current}px) scale(${scale.current},${scale.current})`;\n el.style['touch-action'] = 'initial';\n mobileZoomed = false;\n zoomed = false;\n });\n }\n\n /** function to create zoom effect on hover\n * @param {jQuery} el - DOM element for current product image\n * @param {number} scale - scale value for the zoom\n */\n function createHoverZoom(el, scale) {\n let hiresUrl = $(el).find('img').attr('data-src-hires');\n if (hiresUrl && hiresUrl !== 'null' && hiresUrl.indexOf('noimagelarge') === -1) {\n $(el).zoom({\n on: 'click',\n url: hiresUrl,\n touch: false,\n magnify: scale\n });\n }\n }\n\n const setZoomOffset = function () {\n if (!zoomed) {\n scale *= 1.5;\n if (scale === 1.18125) {\n zoomed = true;\n }\n createHoverZoom(img, scale);\n } else {\n $(img).trigger('zoom-destroy');\n $(img).find('.zoomImg').remove();\n zoomed = false;\n scale = 0.35;\n createHoverZoom(img, scale);\n }\n };\n\n const allMobileZoom = function (event) {\n const img = event.target;\n if (!zoomed) {\n img.src = img.getAttribute('data-src-hires');\n createTouchZoom(img);\n }\n zoomed = true;\n if (!mobileZoomed) {\n addClass(img.parentNode, 'touch-zoom');\n $('.primary-images .carousel').carousel('dispose');\n img.style['touch-action'] = 'none';\n }\n\n if (mobileZoomed) {\n removeClass(img.parentNode, 'touch-zoom');\n $('.primary-images .carousel.image-slider').carousel();\n $('.primary-images .carousel').on('slide.bs.carousel', () => {\n $('.primary-images .carousel-item img').trigger('zoom:imageChange');\n });\n img.style['touch-action'] = 'initial';\n }\n };\n\n if (window.matchMedia('(max-width: 1024px)').matches) {\n if (window.matchMedia('(max-width: 768px)').matches) {\n if (pdpIndicators) {\n $(pdpIndicators).on('click', () => {\n const touchZoom = queryFirst('.primary-images .carousel-item.touch-zoom');\n zoomed = false;\n mobileZoomed = false;\n if (touchZoom) {\n $('.primary-images .carousel-item.touch-zoom img').trigger('zoom:imageChange');\n removeClass(queryFirst('.primary-images .carousel-item.touch-zoom'), 'touch-zoom');\n }\n $('.primary-images .carousel.image-slider').carousel();\n $('.primary-images .carousel').on('slide.bs.carousel', () => {\n $('.primary-images .carousel-item img').trigger('zoom:imageChange');\n });\n });\n if (index === 0) {\n $('.primary-images .carousel').on('slide.bs.carousel', () => {\n $('.primary-images .carousel-item img').trigger('zoom:imageChange');\n });\n }\n }\n }\n img.addEventListener('click', allMobileZoom);\n } else {\n $(img).one('mouseenter', function () {\n createHoverZoom(img, scale);\n });\n img.addEventListener('click', () => {\n $(pdpImages).not($(img)).each(function () {\n if ($(this).find('.zoomImg').length > 1) {\n $(this).find('.zoomImg').remove();\n scale = 0.35;\n createHoverZoom($(this), scale);\n }\n });\n setZoomOffset();\n });\n\n imageObserver.observe(img, { childList: true });\n }\n });\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {Array} variationAttributes - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateSelectedSwatchProductName(variationAttributes, $productContainer) {\n if (Array.isArray(variationAttributes) && variationAttributes.length) {\n const colorVariationObject = variationAttributes.find(attribute => attribute.attributeId === 'color');\n\n if (colorVariationObject && Array.isArray(colorVariationObject.values) && colorVariationObject.values.length) {\n const selectedSwatchObject = colorVariationObject.values.find(eachValue => eachValue.selected);\n let $swatchSection = $productContainer.find('.selected-swatch');\n $swatchSection.find('.selected-swatch-name').text(selectedSwatchObject && $swatchSection.data('color-label') ? $swatchSection.data('color-label').toUpperCase() + selectedSwatchObject.displayValue : '');\n }\n }\n}\n\n/**\n * handles size change\n * @param {Object} productContainer - product container html element\n * @param {string} selectedSizeValue - Selected size value\n */\nfunction onSizeChangeHandler(productContainer, selectedSizeValue) {\n const sizeDetailsContainer = queryFirst('.details-text:not(.d-none)', productContainer);\n const selectedSize = queryFirst('.selected-size', sizeDetailsContainer);\n const selectedSizeErrMsg = queryFirst('.select-size-message', productContainer);\n\n removeClass(queryAll('.size-btn', productContainer), 'selected');\n addClass(this, 'selected');\n addClass(selectedSizeErrMsg, 'd-none');\n const sizeContainer = this.closest('.size-container');\n const assistiveElements = queryAll('.selected-assistive-text', sizeContainer);\n assistiveElements.forEach(eachElement => {\n if (eachElement.textContent.includes(eachElement.dataset.outOfStock)) {\n eachElement.textContent = eachElement.dataset.outOfStock;\n } else {\n eachElement.textContent = '';\n }\n });\n const assistiveElementOfSelected = queryFirst('.selected-assistive-text', this.closest('.size-list'));\n const { selectedText, outOfStock } = assistiveElementOfSelected.dataset;\n assistiveElementOfSelected.textContent = selectedText;\n if (hasClass(this, 'not-available')) {\n assistiveElementOfSelected.textContent += ' ' + outOfStock;\n }\n removeClass(queryFirst('.size-seperator', sizeDetailsContainer), 'd-none');\n selectedSize.textContent = selectedSizeValue;\n removeClass(selectedSize, 'd-none');\n}\n\n/**\n * update quickview product info on product variation change\n * @param {string} selectedSizeValue - Selected size value\n * @param {int} selectedColorId - selected color id\n * @param {Object} productContainer - product container html element\n * @param {Object} currentSizeElement - current active size element\n */\nfunction updateQuickViewProductInfo(selectedSizeValue, selectedColorId, productContainer, currentSizeElement) {\n const quickViewInfo = window.quickviewProductInfo;\n const { productInfo } = quickViewInfo;\n const variantGroupData = productInfo.variants[selectedColorId];\n const { sizes, images, formattedPrice, standardPrice, price, vgProductDetailsUrl, isDirectlyPurchasable } = variantGroupData;\n const ispu = base.updateImageDetails(images.ispu);\n const selectedSizeData = sizes[selectedSizeValue];\n const addToCartButton = queryFirst('.add-to-cart', productContainer);\n const hiddenClass = 'd-none';\n const notifyMeButton = queryFirst('.notify-me-btn', productContainer);\n const notifyMeDesc = queryFirst('.notify-me-desc', productContainer);\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', productContainer);\n const availabilityMsgEl = queryFirst('.availability-msg', productContainer);\n let availabilityValue = '';\n let productDetailsUrl = vgProductDetailsUrl;\n const fullPDPLink = queryFirst('.full-pdp-link', productContainer);\n const wishlistButton = queryFirst('.add-to-wish-list', productContainer);\n\n if (wishlistButton && hasClass(wishlistButton, 'added-to-wish-list')) {\n removeClass(wishlistButton, 'added-to-wish-list');\n wishlistButton.disabled = false;\n }\n\n if (!selectedSizeData || !currentSizeElement) {\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n fullPDPLink.href = productDetailsUrl;\n if (!isDirectlyPurchasable) {\n addToCartButton.disabled = true;\n availabilityValue = availabilityMessageTmpl(availabilityMsgEl.dataset.notPurchasable);\n availabilityMsgEl.innerHTML = availabilityValue;\n } else {\n addToCartButton.disabled = false;\n }\n return;\n }\n\n const { isNotifyMeEnabled, ID, forceOutOfStock, variantProductDetailsUrl } = selectedSizeData;\n productDetailsUrl = variantProductDetailsUrl;\n const { productInventory } = quickViewInfo;\n const { variants } = productInventory;\n const inventoryData = variants[ID];\n const { message, availabilityStatus, isLowInventory } = inventoryData;\n const selectedColorName = queryFirst('.selected-swatch-name').textContent;\n\n if (!isDirectlyPurchasable) {\n availabilityValue = availabilityMessageTmpl(availabilityMsgEl.dataset.notPurchasable);\n } else if (availabilityStatus !== IN_STOCK || isLowInventory) {\n availabilityValue = availabilityMessageTmpl(message);\n }\n fullPDPLink.href = productDetailsUrl;\n\n if (!isDirectlyPurchasable) {\n addToCartButton.disabled = true;\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n } else if (availabilityStatus !== NOT_AVAILABLE && !forceOutOfStock) {\n addToCartButton.disabled = false;\n removeClass(currentSizeElement, 'not-available');\n } else {\n addClass(currentSizeElement, 'not-available');\n addToCartButton.disabled = true;\n if (isNotifyMeEnabled) {\n addClass(addToCartSection, hiddenClass);\n removeClass([notifyMeDesc, notifyMeButton], hiddenClass);\n } else {\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n }\n }\n\n availabilityMsgEl.innerHTML = availabilityValue;\n productContainer.dataset.pid = ID;\n productContainer.dataset.wishlistId = ID;\n const productData = {\n available: !hasClass(currentSizeElement, 'not-available'),\n isNotifyMeEnabled,\n id: ID,\n formattedPrice,\n forceOutOfStock,\n imageData: ispu\n };\n handleNotifyMe(productData, productContainer);\n\n // secret sauce integration to update product data\n updateProductData(selectedColorName, selectedSizeValue, standardPrice, price, productContainer);\n handleSize(productContainer);\n $('body').trigger('product:afterQuickViewSizeChange', {\n ID,\n productContainer,\n monetateData: {\n pdpBreadCrumbs: variantGroupData.pdpBreadCrumbs\n }\n });\n}\n\n/**\n * Update Scarcity Message on product variation change\n * @param {string} message - Scarcity Message\n * @param {Object} productContainer - product container html element\n */\nfunction updateScarcityMessage(message, productContainer) {\n const fitSizeScarcityLabel = queryFirst('.js-size-scarcity-message', productContainer);\n const ctaScarcityLabel = queryFirst('.js-cta-scarcity-message', productContainer);\n\n if (fitSizeScarcityLabel) {\n fitSizeScarcityLabel.innerHTML = message\n ? ` - ${message}`\n : '';\n\n if (message === fitSizeScarcityLabel.dataset.oosMsg) {\n addClass(fitSizeScarcityLabel, 'accent');\n } else {\n removeClass(fitSizeScarcityLabel, 'accent');\n }\n }\n\n if (ctaScarcityLabel) {\n if (message && message !== ctaScarcityLabel.dataset.oosMsg) {\n ctaScarcityLabel.innerHTML = ` - ${message}`;\n } else {\n ctaScarcityLabel.innerHTML = '';\n }\n }\n}\n\n/**\n * update product info on product variation change\n * @param {string} selectedSizeValue - Selected size value\n * @param {int} selectedColorId - selected color id\n * @param {Object} productContainer - product container html element\n * @param {Object} currentSizeElement - current active size element\n * @param {boolean} isPDPSetPage - is PDP set page\n */\nfunction updateProductInfo(selectedSizeValue, selectedColorId, productContainer, currentSizeElement, isPDPSetPage) {\n const masterId = productContainer.dataset.masterid;\n const productInfo = window.productInfo[masterId];\n const variantGroupData = productInfo.variants[selectedColorId];\n const { sizes, images, formattedPrice, formattedStandardPrice, totalPrice, monogramProductPrice, standardPrice, price, mgFlag, mgLocs, isDirectlyPurchasable } = variantGroupData;\n const ispu = base.updateImageDetails(images.ispu);\n const selectedSizeData = sizes[selectedSizeValue];\n let addToCartButton = '';\n if (hasClass(productContainer, 'custom-set-product')) {\n addToCartButton = queryFirst('.add-to-cart-global');\n } else {\n addToCartButton = queryFirst('.add-to-cart', productContainer);\n }\n const ispuButton = queryFirst('.btn-in-store-pickup', productContainer);\n const hiddenClass = 'd-none';\n const notifyMeButton = queryFirst('.notify-me-btn', productContainer);\n const notifyMeDesc = queryFirst('.notify-me-desc', productContainer);\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', productContainer);\n const availabilityMsgEl = queryFirst('.availability-msg', productContainer);\n const ispuLowStockMsgEl = queryFirst('.ispu-low-stock-msg', productContainer);\n const restrictedMsg = availabilityMsgEl.dataset.restrictedItem;\n const isGlobaleSession = availabilityMsgEl.dataset.isGlobaleSession;\n let availabilityValue = '';\n\n if (!selectedSizeData || !currentSizeElement) {\n if (ispuButton) {\n ispuButton.disabled = true;\n }\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n if (!isDirectlyPurchasable) {\n addToCartButton.disabled = true;\n availabilityValue = availabilityMessageTmpl(availabilityMsgEl.dataset.notPurchasable);\n availabilityMsgEl.innerHTML = availabilityValue;\n if (ispuButton) {\n ispuButton.disabled = true;\n }\n } else {\n addToCartButton.disabled = false;\n }\n return;\n }\n\n const { isNotifyMeEnabled, ID, forceOutOfStock, manufacturerSKU, availableForInStorePickup } = selectedSizeData;\n const { variants } = isPDPSetPage ? window.productInventory[masterId] : window.productInventory;\n const inventoryData = variants[ID];\n const {\n message, availabilityStatus, isLowInventory, scarcityMessage\n } = inventoryData;\n\n updateScarcityMessage(scarcityMessage, productContainer);\n\n // Shipping preference view\n const shippingPreferencesEnabled = isShippingPreferencesViewEnabled();\n let ispuAvailabilityValue = '';\n let ispuLowStockValue = '';\n let ispuVariants;\n let ispuInventoryData;\n let ispuMessage;\n let ispuLowStockMessage;\n let ispuAvailabilityStatus;\n let isISPULowInventory;\n let isNotEligibleForISPU;\n if (shippingPreferencesEnabled && window.ispuProductInventory) {\n const { variants } = isPDPSetPage ? window.ispuProductInventory[masterId] : window.ispuProductInventory;\n if (variants) {\n ispuInventoryData = variants[ID];\n }\n if (ispuInventoryData) {\n ispuMessage = ispuInventoryData.message;\n ispuLowStockMessage = ispuInventoryData.lowStockAvailabilityMessage;\n ispuAvailabilityStatus = ispuInventoryData.availabilityStatus;\n isISPULowInventory = ispuInventoryData.isLowInventory;\n }\n }\n\n const selectedColorName = queryFirst('.selected-swatch-name', productContainer).textContent;\n if (!isDirectlyPurchasable) {\n availabilityValue = availabilityMessageTmpl(availabilityMsgEl.dataset.notPurchasable);\n } else {\n if (availabilityStatus !== IN_STOCK || isLowInventory) {\n const breadcrumbItems = queryAll('.breadcrumb-item');\n const categoryUrl = breadcrumbItems && breadcrumbItems.length > 1 && breadcrumbItems.pop().lastElementChild && breadcrumbItems.pop().lastElementChild.href;\n if (availabilityStatus === NOT_AVAILABLE && categoryUrl) {\n availabilityValue = availabilityMessageOOS(message, categoryUrl);\n } else if (availabilityStatus === PREORDER && categoryUrl) {\n availabilityValue = availabilityMessagePreorder(message, categoryUrl);\n }\n else {\n availabilityValue = availabilityMessageTmpl(message);\n }\n if (isLowInventory) addClass(currentSizeElement, SHIP_TO_LOW_INVENTORY_CLASS);\n }\n\n // Shipping preference view\n if (ispuAvailabilityStatus && (ispuAvailabilityStatus !== IN_STOCK || isISPULowInventory)) {\n ispuAvailabilityValue = ispuAvailabilityMessageTmpl(ispuMessage);\n ispuLowStockValue = ispuLowStockMessage ? ispuLowStockMessageTmpl(ispuLowStockMessage) : '';\n }\n }\n\n if (!isDirectlyPurchasable) {\n addToCartButton.disabled = true;\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n } else if (((availabilityStatus !== NOT_AVAILABLE || (ispuAvailabilityStatus && ispuAvailabilityStatus !== NOT_AVAILABLE)) &&\n !forceOutOfStock) && !(isGlobaleSession === 'true' && availabilityStatus === PREORDER)) {\n addToCartButton.disabled = false;\n removeClass(currentSizeElement, 'not-available');\n } else {\n addClass(currentSizeElement, 'not-available');\n addToCartButton.disabled = true;\n if (isNotifyMeEnabled) {\n addClass(addToCartSection, hiddenClass);\n removeClass([notifyMeDesc, notifyMeButton], hiddenClass);\n } else {\n removeClass(addToCartSection, hiddenClass);\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n }\n }\n availabilityMsgEl.innerHTML = availabilityValue;\n\n if (availabilityStatus === PREORDER) {\n addClass(currentSizeElement, 'pre-order');\n if (restrictedMsg !== '' && isGlobaleSession === 'true') {\n availabilityValue = restrictedMessageTmpl(restrictedMsg);\n availabilityMsgEl.innerHTML += availabilityValue;\n }\n addClass(queryFirst('.afterpay-paragraph', productContainer), hiddenClass)\n } else {\n removeClass(queryFirst('.afterpay-paragraph', productContainer), hiddenClass)\n }\n\n if (shippingPreferencesEnabled) {\n $body.trigger('product:inventoryStatus', {\n shipToAddressAvailabilityStatus: availabilityStatus,\n inStorePickUpAvailabilityStatus: ispuAvailabilityStatus || NOT_AVAILABLE,\n isStorePickUpLowInventory: isISPULowInventory,\n inStorePickUpAvailabilityMessage: ispuAvailabilityValue,\n inStorePickUpLowStockMessage: ispuLowStockValue,\n availableForInStorePickup: availableForInStorePickup,\n productContainer\n });\n }\n productContainer.dataset.pid = ID;\n queryFirst('.product-id', productContainer).textContent = ID;\n const manufacturerID = queryFirst('.product-manufacturer-id', productContainer);\n if (null != manufacturerID) {\n manufacturerID.textContent = manufacturerSKU;\n }\n productContainer.dataset.wishlistId = ID;\n const productData = {\n available: !hasClass(currentSizeElement, 'not-available'),\n isNotifyMeEnabled,\n id: ID,\n formattedPrice,\n forceOutOfStock,\n imageData: ispu\n };\n handleNotifyMe(productData, productContainer);\n if (!isDirectlyPurchasable) {\n if (ispuButton) {\n ispuButton.disabled = true;\n }\n } else if (ispuButton) {\n ispuButton.disabled = false;\n ispuButton.dataset.pid = ID;\n const pickupImageElement = queryFirst('.pickup-product-img img', productContainer);\n if (pickupImageElement && ispu) {\n const { alt, url, srcset } = ispu[0];\n const imageHasLoaded = hasClass(pickupImageElement, 'lz-loaded');\n\n pickupImageElement.setAttribute(imageHasLoaded ? 'src' : 'data-src', url);\n pickupImageElement.setAttribute(imageHasLoaded ? 'srcset' : 'data-srcset', srcset);\n pickupImageElement.setAttribute('alt', alt);\n }\n const pickupSalesPrice = queryFirst('.pickup-price .sale-price', productContainer);\n pickupSalesPrice.textContent = formattedPrice;\n const pickupStandardPrice = queryFirst('.pickup-price .standard-price', productContainer);\n if (formattedStandardPrice !== formattedPrice) {\n pickupStandardPrice.classList.add('mr-2');\n pickupStandardPrice.textContent = formattedStandardPrice;\n pickupSalesPrice.classList.add('has-marked-price');\n }\n queryFirst('.pickup-color .selected-color', productContainer).textContent = selectedColorName.split(':')[1];\n const pickupSize = queryFirst('.pickup-size', productContainer);\n queryFirst('.size-label', pickupSize).textContent = queryFirst('.size-display-name', productContainer).value;\n const sizeSelected = queryFirst('.size-card .size-btn.selected', productContainer);\n if (sizeSelected) {\n queryFirst('.selected-size', pickupSize).textContent = sizeSelected.dataset.attrValue;\n }\n }\n const ispuCheckBoxChecked = queryFirst('.shipping-preferences .preference-ispu', productContainer);\n const availabilityElement = queryFirst('.product-availability .availability-message-text', productContainer);\n if (ispuCheckBoxChecked && ispuCheckBoxChecked.checked) {\n addClass(availabilityElement, HIDDEN_CLASS);\n }\n const product = {};\n if (mgFlag && mgLocs && mgLocs.length > 0) {\n const monogramImages = images.monogram || [];\n let url = '';\n let srcset = '';\n if (monogramImages.length) {\n const updatedImageData = base.updateImageDetails(monogramImages)[0];\n url = updatedImageData.url;\n srcset = updatedImageData.srcset;\n }\n const monogramObject = {\n monogramProductID: ID,\n monogramImageURL: url,\n monogramImageSrcSetURL: srcset,\n monogramLocations: mgLocs,\n monogramSelectedColor: selectedColorName,\n monogramSelectedSize: selectedSizeValue,\n productPrice: formattedPrice,\n monogramProductPrice,\n totalPrice: totalPrice\n };\n product.monogramObject = monogramObject;\n }\n\n // secret sauce integration to update product data\n updateProductData(selectedColorName, selectedSizeValue, standardPrice, price, productContainer);\n handleSize(productContainer);\n}\n\nconst init = () => {\n $('body').on('product:handleImageZoom', handleProductImageZoom);\n $('.carousel.image-slider').carousel();\n $('.primary-images').on('click', '.carousel-indicators-images li,.carousel-indicators li ', function (e) {\n const clickedContainerEle = this.closest('.primary-images');\n const carouselIndicatorsActivedImages = queryFirst('.carousel-indicators-images li.active', clickedContainerEle);\n const carouselIndicatorsActivedPips = queryFirst('.carousel-indicators li.active', clickedContainerEle);\n removeClass(carouselIndicatorsActivedImages, ACTIVE_CLASS);\n removeClass(carouselIndicatorsActivedPips, ACTIVE_CLASS);\n let idx = $(this).index() + 1;\n const carouselIndicatorsToBeActivedImages = queryFirst('.carousel-indicators-images li:nth-child(' + idx + ')', clickedContainerEle);\n const carouselIndicatorsToBeActivedPips = queryFirst('.carousel-indicators li:nth-child(' + idx + ')', clickedContainerEle);\n addClass(carouselIndicatorsToBeActivedImages, ACTIVE_CLASS);\n addClass(carouselIndicatorsToBeActivedPips, ACTIVE_CLASS);\n const carouselMzThumbSelected = queryFirst('.carousel-indicators-images li:nth-child(' + idx + ') a.mz-thumb-selected', clickedContainerEle);\n const carouselInnerItem = queryFirst('.carousel-inner .carousel-item:nth-child(' + idx + ') a', clickedContainerEle);\n const carouselItemImage = queryAll('.carousel-inner .carousel-item:nth-child(' + idx + ') a img', clickedContainerEle);\n const carouselMzZoomWindow = queryAll('.mz-zoom-window img');\n const newImgSrc = carouselInnerItem?.getAttribute('href') ?? '';\n const newImgAlt = carouselItemImage.length > 0 ? carouselItemImage[0].getAttribute('alt') : '';\n $(carouselMzThumbSelected).triggerHandler('click');\n carouselItemImage.forEach((imgEle) => {\n imgEle.setAttribute('src', newImgSrc);\n });\n carouselMzZoomWindow.forEach((mzZoomImg) => {\n if (mzZoomImg.alt === newImgAlt) {\n mzZoomImg.setAttribute('src', newImgSrc);\n mzZoomImg.setAttribute('alt', newImgAlt);\n }\n });\n });\n\n setTimeout(() => {\n setDynamicHeight();\n }, 3000); // Adjust the debounce delay as needed\n updateFitSizeTab();\n const productName = queryFirst('.product-name-row .product-name');\n if (productName) {\n productName.innerHTML = productName.innerHTML.replace(/-/g, '‑');\n }\n let carouselIns = $('.product-detail .primary-images .carousel');\n carouselIns.carousel(0);\n};\n\n/**\n * Show the Fit Size Tab if fit size selectable count is greater than one\n */\nfunction updateFitSizeTab() {\n const fitSizeSelectableCountEle = queryAll('.selectableCount');\n fitSizeSelectableCountEle.forEach(fitSizeSelectableCount => {\n const fitSizeSelectableConatiner = fitSizeSelectableCount.closest('.fit-size-tab');\n const sizeAccordionEle = fitSizeSelectableCount.closest('.size-card');\n const fitSizeText = queryFirst('.fitsize-detail-text', sizeAccordionEle);\n const sizeText = queryFirst('.size-detail-text', sizeAccordionEle);\n if (fitSizeSelectableCount) {\n const fitSizeCount = fitSizeSelectableCount.dataset.selectableCount;\n const fitSizes = queryAll('.non-color-attribute.fit-product-type', fitSizeSelectableConatiner);\n if (fitSizes && fitSizes.length > 0) {\n let selectedFit = queryFirst('.non-color-attribute.fit-product-type.selected', fitSizeSelectableConatiner);\n if (!selectedFit) {\n let firstAvailableFit = fitSizes[0];\n $(firstAvailableFit).trigger('click');\n }\n }\n if (fitSizeCount > 1) {\n removeClass(fitSizeSelectableConatiner, 'fit-size-tab');\n addClass(sizeText, 'd-none');\n removeClass(fitSizeText, 'd-none');\n } else {\n removeClass(sizeText, 'd-none');\n addClass(fitSizeText, 'd-none');\n }\n }\n });\n\n updateScarcityMessage('', queryFirst('.product-detail'));\n}\nconst handleLastLinkTab = e => {\n const sizeChartCatBtn = queryFirst('#sizechart-menu-toggle');\n const isTabPressed = e.key === TabKey || e.keyCode === KEYCODE_TAB;\n if (!isTabPressed) {\n return;\n }\n\n if (!e.shiftKey) {\n sizeChartCatBtn.focus();\n }\n};\n\nexport default {\n init: init,\n\n availability: base.availability,\n\n addToCart: base.addToCart,\n\n scrollFitRatingToReviews: function () {\n $(document).on('click', 'button.fit-review, button.no-fit-review', function (e) {\n e.preventDefault();\n const bvReviews = document.getElementById('bazaarvoiceReviews');\n if (bvReviews) {\n scrollTo(window.scrollY + bvReviews.getBoundingClientRect().top, 0);\n }\n });\n },\n\n handleProductImageZoom: handleProductImageZoom,\n\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n const { container } = response;\n const {\n id,\n variationAttributes,\n gtmData,\n gtmGA4Data\n } = response.data.product;\n if ($('.product-detail>.bundle-items').length) {\n container.data('pid', id);\n container.find('.product-id').text(id);\n } else if ($('.product-set-detail').eq(0)) {\n container.data('pid', id);\n container.find('.product-id').text(id);\n } else {\n $('.product-id').text(id);\n $('.product-detail:not(\".bundle-item\")').data('pid', id);\n }\n\n const $addToCart = $('.add-to-cart');\n\n if (gtmData) {\n $addToCart.data('gtmdata', gtmData);\n }\n\n if (gtmGA4Data) {\n $addToCart.data('gtmga4data', gtmGA4Data);\n }\n\n updateSelectedSwatchProductName(variationAttributes, container);\n $('body').trigger('product:handleImageZoom');\n updateFitSizeTab();\n });\n },\n\n selectSizeAttribute: function () {\n $('body').off('click').on('click', '.set-items .size-btn, .product-quickview .size-btn, .quick-buy .size-btn', function (e) {\n e.preventDefault();\n const buttonElement = e.target;\n const $productContainer = $(this).closest('.product-detail');\n if ($productContainer.hasClass('quick-buy')) {\n const $body = $('body');\n const productTileItem = $(this).closest('.product-tile-container')[0];\n const productName = queryFirst('.product-name a', productTileItem).textContent;\n const selectedColor = $(this).closest('.product-tile-container').find('.product-tile-swatch.selected').data('swatch-name');\n const plpItemImage = queryFirst('.tile-image', productTileItem);\n const notifyImageElementMarkup = `\"${plpItemImage.getAttribute('alt')}\"`;\n const size = $(this).data('attr-value');\n if ($(this).hasClass('not-available')) {\n if ($(this).data('stock-notification')) {\n $('.quick-buy-modal').modal('hide')\n const notifyContainer = queryFirst('.notify-me-container');\n const notifyImageElement = queryFirst('.notify-product-img', notifyContainer);\n notifyImageElement.innerHTML = notifyImageElementMarkup;\n queryFirst('.notify-product-name', notifyContainer).textContent = productName;\n const productPrice = queryFirst('.price-section .sales .value', productTileItem).innerText;\n queryFirst('.notify-price', notifyContainer).textContent = productPrice;\n const pid = $(this).data('variation-id');\n const sizeLabel = $('.size-display-name').val();\n const notifySize = queryFirst('.notify-size', notifyContainer);\n const notifySizeSeperator = queryFirst('.size-seperator', notifyContainer);\n const notifySelectedSize = queryFirst('.selected-size', notifyContainer);\n queryFirst('.size-label', notifySize).textContent = sizeLabel;\n queryFirst('.selected-size', notifySize).textContent = size;\n removeClass(notifySizeSeperator, 'd-none');\n removeClass(notifySelectedSize, 'd-none');\n if (pid) {\n document.getElementById('notifySku').value = pid;\n }\n const custEmail = (document.getElementById('notifyEmail') || {}).value;\n if (custEmail) {\n queryFirst('.notify-email', notifyContainer).value = custEmail;\n }\n const notifyForm = queryFirst('.notify-form.enable-form-validate', notifyContainer);\n removeClass(notifyForm, 'd-none');\n const notifyConfirm = queryFirst('.notify-me-confirm', notifyContainer);\n addClass(notifyConfirm, 'd-none');\n $('div.quick-buy-notifyme').find('#notifyMe').modal('show');\n }\n } else {\n $('.quick-buy-modal').modal('hide');\n $body.removeClass('modal-open');\n $('.quick-buy-add-toast .sizeVal').text(size);\n $('.quick-buy-add-toast .colorVal').text(selectedColor);\n $('.quick-buy-add-toast .title').text(productName);\n $('.quick-buy-add-toast .image-container').html(notifyImageElementMarkup);\n $('.quick-buy-add-toast').attr('is-quick-buy', true);\n $('.quick-buy .size-btn').removeClass('selected');\n $(this).addClass('selected');\n if ($('.pdp-container').length === 0) {\n queryFirst('.quick-buy-add-to-cart', $productContainer[0]).click();\n }\n }\n } else {\n const isPDPSetPage = this.closest('.product-set-item');\n if ($productContainer.hasClass('cached-quick-view') && !hasClass(buttonElement, 'selected')) {\n const productContainer = this.closest('.product-detail');\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainer);\n const selectedColorId = selectedColorElement.dataset.attrValue;\n const selectedSizeValue = this.dataset.attrValue;\n onSizeChangeHandler.apply(this, productContainer, selectedSizeValue);\n updateQuickViewProductInfo(selectedSizeValue, selectedColorId, productContainer, this);\n } else if (isPDPSetPage) {\n const productContainerEle = isPDPSetPage;\n if (!hasClass(productContainerEle, 'scrollable-product-item')) {\n const url = buttonElement.dataset.attrUrl;\n base.attributeSelect(url, $productContainer, buttonElement);\n } else {\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainerEle);\n const selectedColorIdValue = selectedColorElement.dataset.attrValue;\n const selectedSizeEleValue = this.dataset.attrValue;\n onSizeChangeHandler.apply(this, [productContainerEle, selectedSizeEleValue]);\n $body.trigger('product:pdpSizeSelected', {\n selectedColorElement,\n selectedSizeElement: buttonElement,\n productContainer: productContainerEle\n });\n updateProductInfo(selectedSizeEleValue, selectedColorIdValue, productContainerEle, this, isPDPSetPage);\n }\n //Code echange to Fix the Scrolling issue on PDP Set page on click on Add all to Cart CTA\n const availabilityEle = queryFirst('.product-availability', productContainerEle);\n if (availabilityEle) {\n $(availabilityEle).attr('data-ready-to-order', true);\n }\n }\n }\n });\n $('body').on('product:quickViewAttributeChange', (e, response) => {\n const selectedSizeElement = queryFirst('.product-quickview.cached-quick-view .size-btn.selected');\n const selectedValue = selectedSizeElement ? selectedSizeElement.dataset.attrValue : '';\n updateQuickViewProductInfo(selectedValue, response.variantGroupId, response.container[0], selectedSizeElement);\n });\n window.addEventListener('resize', throttle(() => {\n const quickViewCarouselEl = queryFirst('.product-quickview.cached-quick-view .carousel');\n if (quickViewCarouselEl) {\n quickViewCarouselEl.style.minHeight = '';\n }\n }, 16));\n },\n afterAttributeSelect: function () {\n $('body').on('product:afterAttributeSelect', (event, response) => {\n const { selectedSizeElement } = response;\n const { product } = response.data;\n const { id, readyToOrder, available, formattedPrice, formattedStandardPrice, forceOutOfStock, price, wishListID, images, isDirectlyPurchasable } = product;\n const { ispu } = images;\n const responseContainer = response.container[0];\n const addToCartButton = queryFirst('.add-to-cart', responseContainer);\n responseContainer.dataset.pid = id;\n responseContainer.dataset.wishlistId = wishListID;\n\n let ssSize = 'unknown';\n const hiddenClass = 'd-none';\n if (hasClass(responseContainer, 'product-quickview') && addToCartButton) {\n addToCartButton.disabled = false;\n }\n if (selectedSizeElement) {\n ssSize = selectedSizeElement.dataset.attrValue;\n removeClass(queryAll('.size-btn', responseContainer), 'selected');\n addClass(selectedSizeElement, 'selected');\n const sizeCard = selectedSizeElement.closest('.size-card');\n const selectedSize = queryFirst('.selected-size', sizeCard);\n if (selectedSize) {\n const sizeSeparator = queryFirst('.size-seperator', sizeCard);\n selectedSize.textContent = selectedSizeElement.dataset.attrValue;\n removeClass([sizeSeparator, selectedSize], hiddenClass);\n }\n const sizeContainer = selectedSizeElement.closest('.size-container');\n const assistiveElements = queryAll('.selected-assistive-text', sizeContainer);\n assistiveElements.forEach(eachElement => {\n if (eachElement.textContent.includes(eachElement.dataset.outOfStock)) {\n eachElement.textContent = eachElement.dataset.outOfStock;\n } else {\n eachElement.textContent = '';\n }\n });\n const assistiveElementOfSelected = queryFirst('.selected-assistive-text', selectedSizeElement.closest('.size-list'));\n const { selectedText, outOfStock } = assistiveElementOfSelected.dataset;\n assistiveElementOfSelected.textContent = selectedText;\n if (hasClass(selectedSizeElement, 'not-available')) {\n assistiveElementOfSelected.textContent += ' ' + outOfStock;\n }\n if (addToCartButton) {\n addToCartButton.disabled = !readyToOrder || !available || forceOutOfStock;\n }\n\n const quickviewContainer = selectedSizeElement.closest('.product-quickview');\n if (quickviewContainer) {\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', responseContainer);\n const notifyMeButton = queryFirst('.notify-me-btn', responseContainer);\n const notifyMeDesc = queryFirst('.notify-me-desc', responseContainer);\n const availabilityMessageEl = queryFirst('.product-availability', responseContainer);\n const { isNotifyMeEnabled, isDirectlyPurchasable } = product;\n const salesPrice = price.type === 'range' ? price.min.sales : price.sales;\n const productData = {\n available,\n isNotifyMeEnabled,\n id,\n formattedPrice: salesPrice.formatted,\n forceOutOfStock,\n imageData: ispu\n };\n handleNotifyMe(productData, quickviewContainer);\n const updateCartButton = queryFirst('.update-cart-product-global', quickviewContainer);\n if (updateCartButton) {\n const { giftWrapAvailableFlag } = product;\n updateCartButton.dataset.giftWrapAvailable = giftWrapAvailableFlag;\n }\n if (isDirectlyPurchasable === false) {\n removeClass(addToCartSection, hiddenClass);\n if (availabilityMessageEl) {\n removeClass(availabilityMessageEl, hiddenClass);\n }\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n }\n }\n\n const ispuButton = queryFirst('.btn-in-store-pickup', responseContainer);\n if (ispuButton) {\n ispuButton.dataset.pid = id;\n ispuButton.disabled = false;\n const pickupImageElement = queryFirst('.pickup-product-img img', responseContainer);\n if (pickupImageElement && ispu) {\n const { alt, url, srcset } = ispu[0];\n pickupImageElement.setAttribute('src', url);\n pickupImageElement.setAttribute('srcset', srcset);\n pickupImageElement.setAttribute('alt', alt);\n }\n queryFirst('.pickup-product-name', responseContainer).textContent = product.productName;\n const pickupSalesPrice = queryFirst('.pickup-price .sale-price');\n if (pickupSalesPrice) {\n pickupSalesPrice.textContent = (product.price && product.price.sales) ? product.price.sales.formatted : '';\n }\n const pickupStandardPrice = queryFirst('.pickup-price .standard-price');\n if (formattedStandardPrice !== formattedPrice && pickupStandardPrice) {\n pickupStandardPrice.classList.add('mr-2');\n pickupStandardPrice.textContent = formattedStandardPrice;\n pickupSalesPrice.classList.add('has-marked-price');\n }\n const selectedSwatchName = queryFirst('.selected-swatch-name', responseContainer);\n if (selectedSwatchName) {\n queryFirst('.pickup-color .selected-color', responseContainer).textContent = selectedSwatchName.textContent;\n }\n const pickupSize = queryFirst('.pickup-size', responseContainer);\n queryFirst('.size-label', pickupSize).textContent = queryFirst('.size-display-name', responseContainer).value;\n const sizeSelected = queryFirst('.size-card .size-btn.selected', responseContainer);\n if (sizeSelected) {\n queryFirst('.selected-size', pickupSize).textContent = sizeSelected.dataset.attrValue;\n }\n }\n }\n if (hasClass(responseContainer, 'product-quickview') && isDirectlyPurchasable === false) {\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', responseContainer);\n const notifyMeButton = queryFirst('.notify-me-btn', responseContainer);\n const notifyMeDesc = queryFirst('.notify-me-desc', responseContainer);\n const availabilityMessageEl = queryFirst('.product-availability', responseContainer);\n removeClass(addToCartSection, hiddenClass);\n if (addToCartButton) {\n addToCartButton.disabled = true;\n }\n if (availabilityMessageEl) {\n removeClass(availabilityMessageEl, hiddenClass);\n }\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n }\n const wishlistButton = queryFirst('.add-to-wish-list', responseContainer);\n if (wishlistButton && hasClass(wishlistButton, 'added-to-wish-list')) {\n removeClass(wishlistButton, 'added-to-wish-list');\n wishlistButton.disabled = false;\n const assistiveText = wishlistButton.getAttribute('data-assistive-text');\n wishlistButton.setAttribute('aria-label', assistiveText);\n }\n if (!hasClass(responseContainer, 'gift-card-main') && !document.getElementById('chooseBonusProductModal')) {\n const ssColorElement = queryFirst('.color-container .color-attribute.selected', responseContainer);\n const ssColor = (ssColorElement && ssColorElement.dataset.attrDisplayvalue) || 'unknown';\n const { type } = price;\n const pricesObject = type === 'range' ? price.min : price;\n const { sales, list } = pricesObject;\n const ssSalesPrice = ((sales && sales.value) ? sales.value.toString() : 'unknown') || 'unknown';\n const ssPrice = ((list && list.value) ? list.value.toString() : ssSalesPrice) || ssSalesPrice;\n updateProductData(ssColor, ssSize, ssPrice, ssSalesPrice, responseContainer);\n if (ssSize === 'unknown') {\n handleColor(responseContainer);\n } else {\n handleSize(responseContainer);\n }\n }\n if (selectedSizeElement) {\n const productSetModal = selectedSizeElement.closest('#productSetModal');\n if (productSetModal) {\n const addAllToToteButton = queryFirst('.add-to-cart-global', productSetModal);\n if (addAllToToteButton) {\n const productsAvailability = queryAll('.product-availability', productSetModal).filter(item => !hasClass(item.closest('.product-detail'), 'hidden-set'));\n const numberOfProducts = productsAvailability.length;\n\n // Check to enable add to tote button, if atleast one product exists\n let enable = true;\n if (!numberOfProducts) {\n enable = false;\n }\n addAllToToteButton.disabled = !enable;\n }\n }\n }\n setTimeout(() => {\n setDynamicHeight();\n }, 200);\n updateFitSizeTab();\n $.spinner().stop();\n });\n },\n selectPdpSizeAttribute: function () {\n $(document).on('click', '.pdp-container .size-btn', function (e) {\n e.preventDefault();\n\n const productContainer = this.closest('.product-detail');\n const selectedColorElement = queryFirst('.color-attribute .swatch-circle.selected', productContainer);\n const selectedColorId = selectedColorElement.dataset.attrValue;\n const selectedSizeValue = this.dataset.attrValue;\n onSizeChangeHandler.apply(this, [productContainer, selectedSizeValue]);\n $body.trigger('product:pdpSizeSelected', {\n selectedColorElement,\n selectedSizeElement: this,\n productContainer\n });\n $('.sku-section').removeClass('d-none');\n updateProductInfo(selectedSizeValue, selectedColorId, productContainer, this);\n });\n $('body').on('product:afterAttributeChange', (e, response) => {\n const selectedSizeElement = queryFirst('.pdp-container .size-btn.selected');\n const selectedValue = selectedSizeElement ? selectedSizeElement.dataset.attrValue : '';\n updateProductInfo(selectedValue, response.variantGroupId, response.container[0], selectedSizeElement);\n });\n\n const swatchEl = queryFirst('.pdp-container button.color-attribute .swatch-circle.selected');\n\n if (swatchEl) {\n const sizeElements = queryAll('.pdp-container .size-btn');\n\n if (sizeElements.length) {\n if (sizeElements.length === 1) {\n queryFirst('.pdp-container .size-btn').click();\n } else {\n const selectedSizeEl = queryFirst('.pdp-container .size-btn.selected');\n\n if (selectedSizeEl) {\n selectedSizeEl.click();\n }\n }\n\n if (!queryFirst('.pdp-container .size-btn.not-purchasable')) {\n const allSizesSoldOut = sizeElements.every((sizeElement) => hasClass(sizeElement, 'not-available'));\n\n if (allSizesSoldOut) {\n removeClass(swatchEl, 'selectable');\n\n const allSelectableSwatches = queryAll('.pdp-container button.color-attribute .swatch-circle.selectable');\n const notifyMeDesc = queryFirst('.notify-me-desc.d-none');\n\n if (allSelectableSwatches.length && notifyMeDesc.length) {\n // Hide the selected swatch because it's out of stock\n addClass(swatchEl.closest('li'), 'd-none');\n allSelectableSwatches[0].click();\n }\n }\n }\n }\n }\n },\n\n updateAttributesAndDetails: function () {\n $('body').on('product:statusUpdate', function (e, data) {\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n $productContainer\n .find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description').removeClass('hidden-xl-down');\n $productContainer\n .find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description').addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details').removeClass('hidden-xl-down');\n $productContainer\n .find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details').addClass('hidden-xl-down');\n }\n });\n },\n\n showSpinner: function () {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n const productSetModal = document.getElementById('productSetModal');\n const quickViewModal = document.getElementById('quickViewModal');\n if (productSetModal && hasClass(productSetModal, 'show')) {\n $(productSetModal)\n .spinner()\n .start();\n } else if (quickViewModal && hasClass(quickViewModal, 'show')) {\n $(quickViewModal)\n .spinner()\n .start();\n } else {\n $.spinner().start();\n }\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .attr('data-ready-to-order', response.product.readyToOrder)\n .attr('data-available', response.product.available);\n\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (response.product.readyToOrder) {\n availabilityMessages.forEach(message => {\n availabilityValue += availabilityMessageTmpl(message);\n });\n }\n\n $('.availability-msg', response.$productContainer)\n .empty()\n .html(availabilityValue);\n\n if ($('.global-availability').length) {\n var allAvailable = $('.product-availability')\n .toArray()\n .every(function (item) {\n return $(item).data('available');\n });\n\n var allReady = $('.product-availability')\n .toArray()\n .every(function (item) {\n return $(item).data('ready-to-order');\n });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg')\n .empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n }\n });\n },\n sizeChart: function () {\n var $prodSizeChart = $('.size-chart-collapsible');\n $('body').on('click', '.size-chart .size-chart-link', function (e) {\n e.preventDefault();\n var url = $(this).data('href');\n var $lpSlideout = $('.lp-sizechart');\n var activeCategoryVal = $(this).data('sizefamily');\n var defaultText = $(this).data('defaulttext');\n const setStickyNav = queryFirst('.custom-set-detail-sticky-nav');\n if ($prodSizeChart.is(':empty')) {\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $prodSizeChart.append(data.content);\n },\n complete: function () {\n var $activeCategoryEl = $prodSizeChart.find(`a[href=\"#${activeCategoryVal}-size\"]`);\n var $lpSizechartTitle = $prodSizeChart.find('.lp-sizechart-category-btn');\n $lpSizechartTitle.focus();\n $activeCategoryEl.tab('show');\n $lpSizechartTitle.text($activeCategoryEl.text().length ? $activeCategoryEl.text() : defaultText);\n\n $prodSizeChart.animate(\n {\n right: '0'\n },\n 500\n );\n $prodSizeChart.addClass('active');\n $lpSlideout.toggleClass('lp-slideout-open');\n $body.toggleClass(sizeChartClasses);\n\n const lastLinkEl = queryFirst('.return-policy-link');\n // console.log(lastLinkEl);\n if (lastLinkEl) {\n lastLinkEl.addEventListener('keydown', handleLastLinkTab);\n }\n }\n });\n } else {\n $prodSizeChart.toggleClass('active');\n $lpSlideout.toggleClass('lp-slideout-open');\n $body.toggleClass(sizeChartClasses);\n }\n if (setStickyNav) {\n addClass(setStickyNav, 'd-none');\n }\n $lpSlideout.trigger('shown.lp.sizeguide');\n });\n\n $('body').on('click touchstart', function (e) {\n if (e.target.matches('#sizechart-close') || (e.target.matches('.size-chart-bg') && $prodSizeChart.hasClass('active'))) {\n $prodSizeChart.removeClass('active');\n $('.lp-slideout').removeClass('lp-slideout-open');\n $body.removeClass(sizeChartClasses);\n }\n });\n },\n\n focusChooseBonusProductModal: base.focusChooseBonusProductModal(),\n renderSizeElements: base.renderSizeElements,\n handleEarlyAccessPLPLockIcon: base.handleEarlyAccessPLPLockIcon(),\n handleEarlyAccessLockIcon: function () {\n const productContainer = queryFirst('.pdp-container');\n const productContainerEarlyAccessIcon = queryFirst('.loyalty-early-access-lock-container', productContainer);\n if (productContainerEarlyAccessIcon) {\n const { earlyAccessDate } = productContainerEarlyAccessIcon.dataset;\n const earlyAccessItem = isEarlyAccessElement(earlyAccessDate);\n base.handleEarlyAccessCta(productContainer, earlyAccessItem);\n }\n },\n handleOflineProduct: function () {\n const offlineContainerEl = queryFirst('.offline-product-detail');\n if (offlineContainerEl) {\n const pid = offlineContainerEl.dataset.pid;\n const inventoryData = window.productInventory;\n if (inventoryData && inventoryData.variants) {\n const data = inventoryData.variants[pid];\n if (data && data.availabilityStatus === IN_STOCK) {\n location.search = (location.search ? location.search + '&' : '') + 'timestamp=' + new Date().getTime();\n }\n }\n }\n },\n};\n\n/**\n * Set dynamic height for carousel indicators based on main image height.\n */\nfunction setDynamicHeight() {\n const pdpContainer = document.querySelector('.container-fluid.product-detail');\n if (!pdpContainer) return;\n\n const carousels = document.querySelectorAll('.container-fluid.product-detail .carousel');\n carousels.forEach((carousel) => {\n const imgContainer = document.querySelector('.primary-images');\n const carouselIndicators = carousel.querySelector('.carousel-indicators-images');\n const mainImageHeight = imgContainer ? imgContainer.clientHeight : 0;\n if (carouselIndicators) {\n carouselIndicators.style.maxHeight = `${mainImageHeight}px`;\n }\n })\n}\n\n/**\n * Debounce function to handle window resize event.\n */\nfunction handleResize() {\n clearTimeout(resizeTimeout);\n let resizeTimeout = setTimeout(() => {\n setDynamicHeight();\n base.updatedimageSlideArrowPDP();\n }, 200); // Adjust the debounce delay as needed\n}\n\n/**\n * Attach event listener for window resize using the debounce mechanism.\n */\nwindow.addEventListener('resize', handleResize);\n\n","'use strict';\n\nconst { queryFirst, addClass, removeClass, hasClass, matchesBreakpoint } = require('../domUtil');\nconst { getNestedValue } = require('../util');\nconst { selectStyleMessageTmpl, ispuSelectStyleMessageTmpl } = require('../templates').productDetail;\nconst { EMPTY_STRING } = require('../constants');\n\n/**\n * Function to check if shipping preferences view is enabled or not\n * @returns { boolean } - returns isEnabled flag value\n */\nfunction isShippingPreferencesViewEnabled() {\n return getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig.isEnabled') || false;\n}\n\n\n/**\n * This method manages Notify me container content\n * @param {Object} productData - Product data\n * @param {Object} productContainer - Product Container DOM element\n */\nfunction handleNotifyMe(productData, productContainer) {\n const $body = $('body');\n const addToCartSection = queryFirst('.prices-add-to-cart-actions', productContainer);\n const notifyContainer = queryFirst('.notify-me-container', productContainer);\n const notifyMeButton = queryFirst('.notify-me-btn', productContainer);\n const notifyMeDesc = queryFirst('.notify-me-desc', productContainer);\n const availabilityMessageEl = queryFirst('.product-availability', productContainer);\n const isPDPPage = queryFirst('.product-detail');\n const mainImageEle = queryFirst('.primary-images .carousel-item.active img', productContainer);\n const hiddenClass = 'd-none';\n const { available, isNotifyMeEnabled, id, forceOutOfStock, imageData } = productData;\n if (!available && isNotifyMeEnabled && !forceOutOfStock) {\n addClass(addToCartSection, hiddenClass);\n if (availabilityMessageEl) {\n addClass(availabilityMessageEl, hiddenClass);\n }\n removeClass([notifyMeDesc, notifyMeButton], hiddenClass);\n const notifyImageElement = queryFirst('.notify-product-img img', notifyContainer);\n if (imageData && notifyImageElement) {\n const { alt, url, srcset, src } = isPDPPage ? mainImageEle : imageData[0];\n const imageHasLoaded = hasClass(notifyImageElement, 'lz-loaded');\n\n notifyImageElement.setAttribute(imageHasLoaded ? 'src' : 'data-src', isPDPPage ? src : url);\n notifyImageElement.setAttribute(imageHasLoaded ? 'srcset' : 'data-srcset', srcset);\n notifyImageElement.setAttribute('alt', alt);\n }\n const notifySize = queryFirst('.notify-size', notifyContainer);\n const notifySizeSeperator = queryFirst('.size-seperator', notifyContainer);\n const notifySelectedSize = queryFirst('.selected-size', notifyContainer);\n queryFirst('.size-label', notifySize).textContent = queryFirst('.size-display-name', productContainer).value;\n queryFirst('.selected-size', notifySize).textContent = queryFirst('.size-btn.selected', productContainer).dataset.attrValue;\n removeClass(notifySizeSeperator, 'd-none');\n removeClass(notifySelectedSize, 'd-none');\n if (id) {\n queryFirst('.notify-pid', notifyContainer).value = id;\n }\n const custEmail = (document.getElementById('notifyEmail') || {}).value;\n if (custEmail) {\n queryFirst('.notify-email', notifyContainer).value = custEmail;\n }\n removeClass(queryFirst('.notify-me-desc', notifyContainer), hiddenClass);\n removeClass(queryFirst('.notify-form', notifyContainer), hiddenClass);\n addClass(queryFirst('.notify-me-confirm', notifyContainer), hiddenClass);\n addClass(queryFirst('.footer-close-link', notifyContainer), hiddenClass);\n\n $body.trigger('product:notifyMeShown', productContainer);\n } else {\n removeClass(addToCartSection, hiddenClass);\n if (availabilityMessageEl) {\n removeClass(availabilityMessageEl, hiddenClass);\n }\n addClass([notifyMeDesc, notifyMeButton], hiddenClass);\n\n $body.trigger('product:notifyMeHidden', productContainer);\n }\n}\n\n/**\n * Function to toggle select color or size info\n * @param {HTMLElement} productContainer - current product element\n */\nfunction toggleSelectSizeInfo(productContainer) {\n const selectedSizeEl = queryFirst('.size-btn.selected', productContainer);\n const availabilityMessageEl = queryFirst('.select-size-message', productContainer);\n if (availabilityMessageEl) {\n if (!selectedSizeEl) {\n removeClass(availabilityMessageEl, 'd-none');\n availabilityMessageEl.innerHTML = selectStyleMessageTmpl(availabilityMessageEl.dataset.selectStylesMessage);\n }\n }\n\n if (isShippingPreferencesViewEnabled()) {\n const ispuAvailabilityMessageEl = queryFirst('.ispu-preference-container .select-size-info-msg', productContainer);\n if (ispuAvailabilityMessageEl) {\n const messages = getNestedValue(window, 'johnnyWasUtils.shippingPreferencesConfig.messages') || {};\n const { selectStylesMessage } = messages;\n if (!selectedSizeEl && selectStylesMessage) {\n ispuAvailabilityMessageEl.innerHTML = ispuSelectStyleMessageTmpl(selectStylesMessage);\n }\n }\n }\n}\n/**\n * Helper method to check if product is on early access or not\n * @param {Object|String} earlyAccess - product | early access date\n * @return {Boolean} true, if early access product or false for not\n */\nfunction isEarlyAccessElement(earlyAccess) {\n let isEarlyAccessItem = false;\n const earlyAccessDate = earlyAccess && earlyAccess.earlyAccessUntilDate || earlyAccess;\n if (earlyAccessDate && earlyAccessDate !== 'false') {\n if (new Date(earlyAccessDate).getTime() > new Date().getTime()) {\n isEarlyAccessItem = true;\n }\n }\n return isEarlyAccessItem;\n}\n\nconst updatePLPTileHeight = (element) => {\n let cards = $('.tile-img-link');\n let carouselImageHeight = cards;\n\n if (element) {\n carouselImageHeight = $('.carousel-inner');\n }\n\n // Find the maximum height among the cards\n let maxHeight = Math.max.apply(null, carouselImageHeight.map(function () {\n return $(this).height();\n }).get());\n\n // Set the same height for all cards\n cards.height(maxHeight);\n};\n\n\nmodule.exports = {\n toggleSelectSizeInfo: toggleSelectSizeInfo,\n isEarlyAccessElement: isEarlyAccessElement,\n isShippingPreferencesViewEnabled: isShippingPreferencesViewEnabled,\n handleNotifyMe: handleNotifyMe,\n updatePLPTileHeight: updatePLPTileHeight\n};\n\n","/* eslint-disable no-param-reassign */\n'use strict';\n\nconst { queryFirst, queryAll, addClass, hasClass, removeClass } = require('../domUtil');\n\nconst { initOnce } = require('../util');\nconst hiddenClass = 'd-none';\nconst mql = window.matchMedia('(max-width: 767px)');\nlet initialMonogramClick = false;\n\nconst styleMap = {\n singleLetterStyle: 'Single Letter',\n doubleLetterStyle: 'Double Letter',\n tripleLetterStyle: 'Triple Letter',\n traditionalLetterStyle: 'Traditional'\n};\n\nconst colorMap = [\n {\n name: 'Indigo',\n rgb: 'rgb(0, 0, 102)'\n },\n {\n name: 'Resort White',\n rgb: 'rgb(246, 246, 246)'\n },\n {\n name: 'Pasha Pink',\n rgb: 'rgb(245, 85, 123)'\n },\n {\n name: 'Gold',\n rgb: 'rgb(221, 161, 69)'\n }\n];\n\nconst selectedMonogramValues = {\n monogramInitials: '',\n monogramStyle: '',\n monogramColor: 'Indigo',\n placementSelect: ''\n};\n\nlet enableContinue = false;\n\nlet allInputText = '';\n\nlet monogramData = {};\n\nconst monogramContinueButton = queryFirst('.monogram-continue-btn');\nconst monogramModalEl = queryFirst('.monogram-modal');\nconst initialsButtons = queryFirst('.monogram-style .selected');\nconst monongramUlEl = queryFirst('.monogram-color');\nconst selectedClass = 'selected';\nconst activeViewClass = 'active-view';\nconst monogramConfirmationView = queryFirst('.monogram-confirmation-view');\nconst detailViewEl = queryFirst('.monogram-detail-view');\n\n// check selectedMonogramValues and enable continue button if values are set\nconst updateMonogramValues = (type, value) => {\n selectedMonogramValues[type] = value;\n\n const { monogramInitials, monogramStyle, monogramColor, placementSelect } = selectedMonogramValues;\n\n if (monogramInitials.length === 0 || !monogramStyle || !monogramColor || !placementSelect) {\n enableContinue = false;\n monogramContinueButton.setAttribute('disabled', true);\n return;\n }\n\n enableContinue = true;\n monogramContinueButton.removeAttribute('disabled');\n removeClass(queryFirst('.monogram-incomplete-label'), 'show-error');\n};\n\n// This method adds assistive text for selected options at various stages of monogramming selection\nconst changeSelectedAssistiveText = (assistiveElementSelector, selectedElement) => {\n queryAll(assistiveElementSelector).forEach(eachElement => {\n eachElement.textContent = '';\n });\n const selectedAssistiveElement = queryFirst('.selected-assistive-text', selectedElement);\n selectedAssistiveElement.textContent = selectedAssistiveElement.dataset.selectedText;\n};\n\n// toggle style and sample text length\nconst toggleStyle = style => {\n const monogramDetails = queryFirst('.monogram-customize-details');\n const initialsSampleAll = queryAll('.product-initials-sample');\n const traditionalSampleAll = queryAll('.product-traditional-sample');\n const inputValue = allInputText;\n const monogramStyle = monogramDetails.querySelector('.monogramStyle');\n\n const setInitials = value => {\n initialsSampleAll.forEach(el => {\n el.textContent = value;\n });\n };\n\n const selectStyle = (styleSelect, textValue) => {\n const selectedStyleElement = document.getElementById(styleSelect);\n selectedStyleElement.className = 'selectable selected';\n changeSelectedAssistiveText('.monogram-style .selectable .selected-assistive-text', selectedStyleElement);\n monogramStyle.value = styleMap[styleSelect] || '';\n updateMonogramValues('monogramStyle', styleMap[styleSelect]);\n updateMonogramValues('monogramInitials', (textValue || inputValue).toUpperCase());\n\n if (styleSelect === 'traditionalLetterStyle') {\n traditionalSampleAll.forEach(el => {\n el.querySelector('.first').textContent = textValue.charAt(0);\n el.querySelector('.middle').textContent = textValue.charAt(2);\n el.querySelector('.last').textContent = textValue.charAt(1);\n });\n } else {\n setInitials(textValue || inputValue);\n }\n };\n\n removeClass(queryAll('.monogram-style .selectable'), 'selected');\n addClass(initialsSampleAll, 'active');\n removeClass(traditionalSampleAll, 'active');\n removeClass(queryFirst('.initials'), 'show-labels');\n\n const letter1 = inputValue.charAt(0);\n const letter2 = inputValue.charAt(1);\n const letter3 = inputValue.charAt(2);\n\n switch (style) {\n case 0:\n setInitials('');\n removeClass(initialsButtons, 'selected');\n updateMonogramValues('monogramInitials', '');\n updateMonogramValues('monogramStyle', '');\n addClass(queryFirst('.monogram-incomplete-label'), 'show-error');\n break;\n case 1:\n case 'singleLetterStyle':\n selectStyle('singleLetterStyle', letter1);\n break;\n\n case 2:\n selectStyle('doubleLetterStyle', inputValue.substr(0, 2));\n break;\n\n case 'doubleLetterStyle':\n if (inputValue.length === 1) {\n selectStyle('singleLetterStyle');\n } else if (inputValue.length === 3) {\n selectStyle(style, letter1 + letter3);\n } else {\n selectStyle(style, inputValue.substr(0, 2));\n }\n break;\n\n case 3:\n case 'tripleLetterStyle':\n if (inputValue.length === 2) {\n selectStyle('doubleLetterStyle');\n } else if (inputValue.length === 1) {\n selectStyle('singleLetterStyle');\n } else {\n selectStyle('tripleLetterStyle');\n }\n break;\n\n case 'traditionalLetterStyle':\n if (inputValue.length === 2) {\n selectStyle('doubleLetterStyle');\n } else if (inputValue.length === 1) {\n selectStyle('singleLetterStyle');\n } else {\n addClass(queryFirst('.initials'), 'show-labels');\n removeClass(initialsSampleAll, 'active');\n addClass(traditionalSampleAll, 'active');\n selectStyle('traditionalLetterStyle', letter1 + letter2 + letter3);\n }\n break;\n\n default:\n setInitials('');\n break;\n }\n};\n\n// resets monnogram values / settings\nconst resetMonogram = () => {\n // reset initials\n allInputText = '';\n updateMonogramValues('monogramInitials', '');\n queryAll('.monogram-initials').forEach(el => {\n el.value = '';\n });\n\n // reset color\n updateMonogramValues('monogramColor', 'Indigo');\n removeClass(queryAll('.monogram-color li'), selectedClass);\n addClass(queryFirst('.monogram-color li'), selectedClass);\n queryAll('.monogram-img-wrapper').forEach(el => {\n el.setAttribute('style', `color:${colorMap[0].rgb}`);\n });\n\n // reset style\n toggleStyle(0);\n\n // reset placement\n updateMonogramValues('placementSelect', monogramData.monogramLocations[0].displayValue);\n removeClass(queryAll('.monogram-placement li'), selectedClass);\n addClass(queryFirst('.monogram-placement li'), selectedClass);\n\n // set monongram modal to first view\n removeClass(monogramConfirmationView, activeViewClass);\n removeClass(detailViewEl, hiddenClass);\n addClass(monogramConfirmationView, hiddenClass);\n};\n\nconst initListeners = () => {\n // Update Selected Sample Text upon entering initials\n queryAll('.monogram-initials').forEach(el => {\n initOnce(el, 'keyup', e => {\n const windowTest = w => {\n if (w.matches) {\n initOnce(el, 'keydown', e => {\n const isTabEnterPressed = e.key === 'Tab' || e.keyCode === 9 || e.key === 'Backspace' || e.keyCode === 9 || e.key === 'Delete' || e.keyCode === 46;\n const max = 1;\n if (el.value.length >= max && !isTabEnterPressed) {\n e.preventDefault();\n return;\n }\n });\n }\n };\n windowTest(mql);\n\n const { target } = e;\n const { keyCode } = e;\n const valid = (keyCode > 46 && keyCode < 91) || (keyCode > 185 && keyCode < 93) || (keyCode > 218 && keyCode < 223) || keyCode === 8;\n const replaceReg = /[^a-z]/gi;\n\n allInputText = '';\n target.value = target.value.replace(replaceReg, '');\n queryAll('.monogram-initials').forEach(elem => {\n allInputText += elem.value;\n });\n\n if (valid) {\n toggleStyle(allInputText.length);\n }\n });\n });\n\n // Update Selected Sample Text Style on style type click\n queryAll('.monogram-style button').forEach(el => {\n initOnce(el, 'click', e => {\n const style = e.target.closest('li').id;\n toggleStyle(style);\n });\n });\n\n // Update Selected Sample Text Color on color type click\n initOnce(queryFirst('.monogram-close'), 'click', () => {\n resetMonogram();\n });\n\n // Update Selected Sample Text Color on color type click\n initOnce(monongramUlEl, 'click', e => {\n const { target } = e;\n const parentLI = target.closest('li');\n const btnEl = target.closest('.color-swatch');\n\n if (!btnEl || hasClass(parentLI, selectedClass)) return;\n\n queryAll('.monogram-img-wrapper').forEach(element => {\n element.style.color = btnEl.dataset.colorRgb;\n });\n removeClass(queryAll('.monogram-color li'), selectedClass);\n addClass(parentLI, selectedClass);\n changeSelectedAssistiveText('.monogram-color .selectable .selected-assistive-text', target.closest('.selectable'));\n\n // update monogram obj\n updateMonogramValues('monogramColor', btnEl.dataset.colorName);\n });\n\n // Update Selected Placement selction on img click\n initOnce(queryFirst('.monogram-placement'), 'click', e => {\n const { target } = e;\n const parentLI = target.closest('li');\n const btnEl = target.closest('.placement-swatch');\n\n if (!btnEl || hasClass(parentLI, selectedClass)) return;\n\n removeClass(queryAll('.monogram-placement li'), selectedClass);\n addClass(parentLI, selectedClass);\n changeSelectedAssistiveText('.monogram-placement .selectable .selected-assistive-text', target.closest('.selectable'));\n\n // update monogram obj\n updateMonogramValues('placementSelect', btnEl.dataset.placement);\n\n queryFirst('.monogram-confirmation-placement span').textContent = selectedMonogramValues.placementSelect;\n });\n\n // Enable and show monogram confirmation menu if values selected\n initOnce(monogramContinueButton, 'click', () => {\n addClass(monogramConfirmationView, activeViewClass);\n addClass(detailViewEl, hiddenClass);\n removeClass(monogramConfirmationView, hiddenClass);\n });\n\n initOnce(queryFirst('.monogram-continue'), 'click', () => {\n if (!enableContinue) {\n addClass(queryFirst('.monogram-incomplete-label'), 'show-error');\n }\n });\n\n // Go back to monogram selection from confrimation menu\n initOnce(queryFirst('.monogram-go-back'), 'click', () => {\n removeClass(monogramConfirmationView, activeViewClass);\n addClass(monogramConfirmationView, hiddenClass);\n removeClass(detailViewEl, hiddenClass);\n });\n\n initOnce(queryFirst('.monogram-add-to-tote-btn'), 'click', event => {\n event.preventDefault();\n const data = queryFirst('.monogram-add-to-tote-btn').dataset;\n const url = data.monogramUrl;\n\n var form = {\n pid: monogramData.monogramProductID,\n monogramValues: JSON.stringify(selectedMonogramValues)\n };\n const spinner = $.spinner();\n spinner.start();\n $('body').trigger('product:beforeAddToCart');\n $.ajax({\n url: url,\n type: 'post',\n data: form,\n success: function (responseData) {\n const { error } = responseData;\n $('#monogram-modal').modal('hide');\n if (error) {\n // show add to cart toast\n $('.add-to-cart-messages').remove();\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('
      ');\n }\n\n $('.add-to-cart-messages').append('
      ' + responseData.message + '
      ');\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n } else {\n $('.minicart').trigger('count:update', responseData);\n $('body').trigger('product:afterAddToCart', responseData);\n }\n resetMonogram();\n spinner.stop();\n },\n error: function () {\n spinner.stop();\n }\n });\n });\n};\n\n// update dynamic monogram text labels\nconst appendDynamicText = () => {\n queryAll('.monogram-pattern-img').forEach(el => {\n el.innerHTML = `\"${monogramData.monogramSelectedColor}\"`;\n });\n\n queryAll('.product-name', monogramModalEl).textContent = monogramData.monogramProductName;\n\n queryAll('.monogram-product-price').forEach(el => {\n el.textContent = monogramData.productPrice;\n });\n\n queryAll('.monogram-price').forEach(el => {\n el.textContent = monogramData.monogramProductPrice;\n });\n\n queryFirst('.monogram-pattern span').textContent = monogramData.monogramSelectedColor;\n\n queryFirst('.monogram-size span').textContent = monogramData.monogramSelectedSize;\n\n queryFirst('.monogram-price-label span').textContent = monogramData.monogramProductPrice;\n\n queryFirst('.monogram-total span').textContent = monogramData.totalPrice;\n};\n\nconst appendColorSwatches = () => {\n if (!colorMap || !colorMap.length) return;\n let monogramColorHtml = '';\n const { stepTitle } = queryFirst('.monogram-customize-details .product-colors .step-title').dataset;\n const { selectedText } = queryFirst('.monogram-customize-details .selected-assistive-text').dataset;\n\n colorMap.forEach((swatch, i) => {\n if (!swatch) {\n return;\n }\n monogramColorHtml += `
    7. \n \n ${swatch.name}\n \n ${i === 0 ? selectedText : ''}\n \n
    8. `;\n });\n monongramUlEl.innerHTML = monogramColorHtml;\n};\n\nconst appendPositionSwatches = () => {\n const btnPositionData = monogramData.monogramLocations;\n if (!btnPositionData || !btnPositionData.length) return;\n let monogramPositionHtml = '';\n const { stepTitle } = queryFirst('.monogram-customize-details .placement .step-title').dataset;\n const { selectedText } = queryFirst('.monogram-customize-details .selected-assistive-text').dataset;\n\n btnPositionData.forEach((el, i) => {\n if (!el) {\n return;\n }\n const { displayValue, imgURL, value } = el;\n if (i === 0) {\n updateMonogramValues('placementSelect', displayValue);\n queryFirst('.monogram-confirmation-placement span').textContent = displayValue;\n }\n monogramPositionHtml += `
    9. \n \n ${displayValue}\n \n ${i === 0 ? selectedText : ''}\n \n
    10. `;\n });\n queryFirst('.monogram-placement').innerHTML = monogramPositionHtml;\n updateMonogramValues('placementSelect', btnPositionData[0].displayValue);\n};\n\nmodule.exports = {\n checkMonogram: () => {\n const monogramButton = queryFirst('.monogram-btn');\n if (monogramContinueButton) {\n $('body').on('product:afterAttributeSelect product:afterSizeChange', (e, response) => {\n removeClass(monogramConfirmationView, activeViewClass);\n removeClass(detailViewEl, hiddenClass);\n if ('monogramObject' in response.data.product) {\n monogramData = response.data.product.monogramObject;\n appendDynamicText();\n if (!initialMonogramClick) {\n appendPositionSwatches();\n appendColorSwatches();\n }\n initListeners();\n if (monogramButton) {\n removeClass(monogramButton, hiddenClass);\n }\n initialMonogramClick = true;\n } else if (monogramButton) {\n addClass(monogramButton, hiddenClass);\n }\n });\n }\n }\n};\n","'use strict';\n\nconst base = require('./base').default;\nconst detail = require('./detail').default;\nconst { updateSelectedSwatchProductName, injectAfterpay, injectFitPredictor, injectLongDescription, updateFullProductLink } = require('../quickView/quickViewHelpers').default;\nconst focusHelper = require('base/components/focus');\nconst { getJSON } = require('../util');\nconst { getLastElementInRow, getStyles, hasClass, queryFirst, remove, scrollTo } = require('../domUtil');\nconst { quickView: quickViewTemplates } = require('../templates');\nconst $window = $(window);\nconst $body = $('body');\nconst { ajaxFormInvalid, ajaxFormSubmit } = require('../clientSideValidation');\nconst header = queryFirst('.main-header');\nconst { handleEarlyAccessLogin } = require('../loyalty/loyaltyDrawer');\n\n/**\n * OOTB function\n * Generates the modal window on the first call.\n * @param {HTMLElement} srcElement - quick view initiator element\n */\nfunction getModalHtmlElement(srcElement) {\n const quickViewModalEl = document.getElementById('quickViewModal');\n remove(quickViewModalEl);\n const quickview = $(quickViewTemplates.quickViewModal);\n quickview.data('srcElement', srcElement);\n $('body').append(quickview);\n}\n\n/**\n * OOTB function\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n const $html = $('
      ').append($.parseHTML(html));\n const body = $html.find('.product-quickview');\n return { body };\n}\n\n/**\n * Modifies a quickview template to include elements specific to this implementation\n * @param {string} template - The rendered template\n * @returns {string} Modified template\n */\nfunction modifyTemplate(template) {\n const openTagIndex = template.indexOf('>') + 1;\n\n return template.substr(0, openTagIndex) + template.substr(openTagIndex);\n}\n\n/**\n * Returns the additional offset that should be scrolled depending on whether the navigation menu is sticky\n * @returns {number} Main navigation offset\n */\nfunction getNavOffset() {\n return hasClass(header, 'sticky') ? header.offsetHeight : 0;\n}\n\n/**\n * Function to attach form validation events\n */\nfunction attachFormEvents() {\n const quickViewFormSelector = '.product-quickview form';\n ajaxFormInvalid(quickViewFormSelector);\n ajaxFormSubmit(quickViewFormSelector);\n}\n\n/**\n * OOTB function with changes\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n * @param {jQuery.event} event - Event object which trigger the action\n */\nfunction fillModalElement(selectedValueUrl, event) {\n const quickViewModal = $('#quickViewModal');\n\n $.spinner().start();\n\n getJSON(selectedValueUrl, 'GET', null,\n data => {\n const { quickviewProductInfo } = data;\n var parsedHtml = parseHtml(data.renderedTemplate);\n\n if (quickViewModal) {\n quickViewModal.find('.modal-body').html(parsedHtml.body);\n quickViewModal.find('.size-chart').attr('href', data.productUrl);\n quickViewModal.find('.enter-message').text(data.enterDialogMessage);\n\n updateFullProductLink(data.quickViewFullDetailMsg, data.productUrl, quickViewModal);\n injectAfterpay(quickViewModal);\n injectFitPredictor(quickViewModal);\n\n if (quickviewProductInfo) {\n window.quickviewProductInfo = quickviewProductInfo;\n const swatchEl = quickViewModal.find('.color-attribute .swatch-value');\n const selectedSwatchEl = quickViewModal.find('.color-attribute .swatch-value.selected');\n const sizeElements = quickViewModal.find('.size-btn');\n if (quickviewProductInfo && swatchEl.length && !selectedSwatchEl) {\n quickViewModal.find('.color-attribute').eq(0).click();\n }\n if (selectedSwatchEl && sizeElements.length === 1 && !sizeElements.hasClass('selected')) {\n sizeElements.click();\n }\n }\n\n quickViewModal.modal('show');\n\n requestAnimationFrame(() => {\n $body.trigger('quickview:visible');\n });\n\n // Only for Gift card quickview attach form events\n if (data.gcType) {\n attachFormEvents();\n\n if (data.gcType === 'pgc' && queryFirst('.cart-page')) {\n const productLineItemEl = event.target.closest('.product-info-p-giftcard');\n // Return if the line item is not pgiftcard\n if (!productLineItemEl) {\n return;\n }\n\n const lineItemAmountEl = queryFirst('.gift-card-amount', productLineItemEl);\n if (lineItemAmountEl) {\n quickViewModal\n .find('.gift-card-custom-input-group .form-control')\n .val(lineItemAmountEl.value)\n .trigger('keyup');\n quickViewModal\n .find('.gift-card-amount')\n .val(lineItemAmountEl.value);\n }\n }\n }\n }\n\n $.spinner().stop();\n },\n () => $.spinner().stop()\n );\n}\n\n/**\n * Replaces the content in a quickview container with the template returned by the specified endpoint\n * @param {JQuery} container - jQuery element to inject HTML into\n * @param {string} url - URL of the endpoint that will return a rendered template\n * @param {JQuery} selectedProductDescriptionElement - jQuery element of selected product SEO long description \n */\nfunction injectQuickView(container, url, selectedProductDescriptionElement) {\n const spinner = $.spinner();\n const stopSpinner = () => { spinner.stop(); };\n\n spinner.start();\n\n getJSON(url, 'GET', null,\n data => {\n const { quickviewProductInfo, isEarlyAccessProduct, earlyAccessDate } = data;\n const parent = container.parent();\n const scrollHeight = parent.prop('scrollHeight');\n const scrollY = $window.scrollTop();\n const filledContainers = $('.quickview-container').not(container);\n let containerTop = container.offset().top;\n const isNewContainerBelow = !!filledContainers.length && !!filledContainers.filter((i, openContainer) => $(openContainer).offset().top < containerTop).length;\n\n filledContainers.remove();\n\n if (quickviewProductInfo) {\n window.quickviewProductInfo = quickviewProductInfo;\n }\n\n requestAnimationFrame(() => {\n containerTop = container.offset().top - getNavOffset();\n\n // If the target container is below an a container that's already injected,\n // the emptying of the existing container will cause the content to jump.\n // To offset this, we can scroll up by the difference in scrollHeight.\n if (isNewContainerBelow) {\n scrollTo(scrollY - (scrollHeight - parent.prop('scrollHeight')), 0);\n }\n\n // Modify the template returned by the endpoint so we can keep the OOTB code and\n // so that the OOTB template can be used in other implementation types (e.g. dialogs)\n container.html(modifyTemplate(data.renderedTemplate));\n const sizeElements = container.find('.size-btn');\n const swatchEl = container.find('.color-attribute .swatch-value');\n const selectedSwatchEl = container.find('.color-attribute .swatch-value.selected');\n if (quickviewProductInfo && swatchEl.length && !selectedSwatchEl) {\n container.find('.color-attribute').eq(0).click();\n }\n if (selectedSwatchEl && sizeElements.length === 1 && !sizeElements.hasClass('selected')) {\n sizeElements.click();\n }\n\n // Only for Gift card quickview attach form events\n if (data.gcType) {\n attachFormEvents();\n }\n\n updateFullProductLink(data.quickViewFullDetailMsg, data.productUrl, container);\n injectAfterpay(container);\n injectFitPredictor(container);\n injectLongDescription(selectedProductDescriptionElement, container);\n \n stopSpinner();\n scrollTo(containerTop);\n\n requestAnimationFrame(() => {\n $body.trigger('quickview:visible');\n });\n\n const wishlistButton = queryFirst('.add-to-wish-list', container[0]);\n\n if (wishlistButton) {\n setTimeout(() => {\n wishlistButton.focus();\n }, 0);\n }\n if (earlyAccessDate) {\n const { isEarlyAccessElement } = require('./helper');\n const isEarlyAccessItem = isEarlyAccessElement(earlyAccessDate);\n const quickViewContainer = queryFirst('.quickview-container');\n base.handleEarlyAccessCta(quickViewContainer, isEarlyAccessItem);\n const earlyAccessGuestSignIn = queryFirst('.js-early-access-sign-in-cta', quickViewContainer);\n earlyAccessGuestSignIn.addEventListener('click', e => {\n e.preventDefault();\n handleEarlyAccessLogin(earlyAccessGuestSignIn);\n });\n }\n });\n },\n stopSpinner\n );\n}\n\nmodule.exports = {\n showQuickview: () => {\n $body.on('click', '.product-grid .quickview', e => {\n e.preventDefault();\n\n const { target } = e;\n const $target = $(target);\n const container = $target.closest('.product-tile-container');\n const quickviewURL = $target.closest('.quickview').attr('data-href');\n const lastElementInRow = getLastElementInRow(container[0]);\n const quickviewContainer = $(quickViewTemplates.container).insertAfter(lastElementInRow);\n const seoLongDescriptionElement = $target.parents('.product-tile-container').find('.seo-long-description');\n\n injectQuickView(quickviewContainer, quickviewURL, seoLongDescriptionElement);\n\n $target.trigger('quickview:show');\n });\n $body.on('click', `\n .recommendations-products .quickview,\n .product-listing .quickview,\n .shop-by-style .quickview,\n .style-component .quickview,\n .shop-the-print-tiles .quickview,\n .cart-page .product-edit .edit,\n .cart-page .bundle-edit .edit`, e => {\n e.preventDefault();\n const $target = $(e.target);\n getModalHtmlElement($target);\n const selectedValueUrl = $target.data('href');\n fillModalElement(selectedValueUrl, e);\n $target.trigger('quickview:show');\n });\n\n $body.on('click', '.quickview-container .close-quickview', e => {\n const container = e.target.closest('.quickview-container');\n if (container) {\n const target = $(container).prev();\n const padding = parseInt(getStyles(container, 'padding-top'), 10);\n\n remove(container);\n $body.trigger('quickview:close');\n\n // Scroll back to the target row so the user doesn't lose their position\n scrollTo(target.offset().top - padding - getNavOffset(), 250);\n } else {\n $('#quickViewModal').modal('hide');\n }\n });\n\n $body.on('click', '.product-quickview .notify-me-btn', function (e) {\n e.preventDefault();\n $(this).closest('.product-quickview').find('#notifyMe').modal('show');\n });\n },\n focusQuickview: function () {\n $body.on('shown.bs.modal', '#quickViewModal', function () {\n $('#quickViewModal .close-quickview').focus();\n });\n },\n trapQuickviewFocus: function () {\n $body.on('keydown', '.product-quickview', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '.product-quickview',\n firstElementSelector: '.close-quickview',\n lastElementSelector: '.full-pdp-link',\n nextToLastElementSelector: '.add-to-cart'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n availability: base.availability,\n addToCart: base.addToCart,\n showSpinner: function () {\n $body.on('product:beforeAddToCart', function (e, data) {\n $(data).closest('.product-quickview').spinner().start();\n });\n },\n sizeChart: detail.sizeChart,\n hideDialog: function () {\n $body.on('product:afterAddToCart', function () {\n $('#quickViewModal').modal('hide');\n\n const isCartPage = queryFirst('.cart-container');\n const addToCartWarningDialog = queryFirst('#add-to-cart-warning-dialog') || false;\n if (isCartPage && !addToCartWarningDialog) {\n location.reload();\n }\n });\n },\n beforeUpdateAttribute: function () {\n $body.on('product:beforeAttributeSelect', function () {\n $('.product-quickview').spinner().start();\n });\n },\n updateAttribute: function () {\n $body.on('product:afterAttributeSelect', function (e, response) {\n const quickView = response.container[0];\n\n if (hasClass(quickView, 'product-quickview')) {\n const { productDetailsUrl } = response.data.product;\n const fullPDPLink = queryFirst('.full-pdp-link', quickView);\n fullPDPLink.setAttribute('href', productDetailsUrl);\n\n updateSelectedSwatchProductName(response.data.product.variationAttributes, $(quickView));\n }\n });\n },\n updateAddToCart: function () {\n $body.on('product:updateAddToCart', function (e, response) {\n const quickView = queryFirst('.product-quickview');\n\n if (quickView) {\n const disabled = !response.product.readyToOrder || !response.product.available;\n\n let buttonToUpdate;\n const addToCartButton = queryFirst('button.add-to-cart', quickView);\n if (addToCartButton) {\n buttonToUpdate = addToCartButton;\n } else {\n const updateCartButton = queryFirst('.update-cart-product-global', quickView);\n if (updateCartButton) {\n buttonToUpdate = updateCartButton;\n }\n }\n\n if (buttonToUpdate) {\n if (disabled) {\n buttonToUpdate.setAttribute('disabled', disabled);\n } else {\n buttonToUpdate.removeAttribute('disabled');\n }\n }\n }\n });\n },\n updateAvailability: function () {\n $body.on('product:updateAvailability', function (e, response) {\n const quickView = queryFirst('.product-quickview');\n\n if (quickView) {\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n }\n};\n","'use strict';\n\nconst { queryFirst } = require('../domUtil');\nconst { sauce } = require('fitpredictor/product/secretsauce');\n\n/**\n * Updates the product view when a product attribute is selected or deselected or when changing quantity\n * @param {Array} variationAttributes - Array of product variation attributes\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateSelectedSwatchProductName(variationAttributes, $productContainer) {\n if (Array.isArray(variationAttributes) && variationAttributes.length) {\n const colorVariationObject = variationAttributes.find(attribute => attribute.attributeId === 'color');\n\n if (colorVariationObject && Array.isArray(colorVariationObject.values) && colorVariationObject.values.length) {\n const selectedSwatchObject = colorVariationObject.values.find(eachValue => eachValue.selected);\n $productContainer.find('.selected-swatch-name').text(selectedSwatchObject ? selectedSwatchObject.displayValue : '');\n }\n }\n}\n\n/**\n * Function to initialize Fit predictor on quick view\n * @param {jQuery} containerEl - Quickview container element\n */\nfunction injectFitPredictor(containerEl) {\n if (!!document.getElementById('fitPredictorEnabled')) {\n sauce($('.product-detail.product-quickview', containerEl));\n }\n}\n\n/**\n * Initialize Afterpay in QuickViews\n */\nfunction injectAfterpay() {\n require('../afterpay')({\n anchors: '.product-quickview-detail',\n observerTargets: '.prices',\n priceTargets: ['.sales .price-value', '.list .price-value', '.sales .value'],\n renderMode: 'adjacent',\n renderTarget: '.prices',\n showExcluded: false\n });\n}\n\n/**\n * Function to sets href for full pdp link\n * @param {string} label - Label to set\n * @param {string} link - href value\n * @param {jQuery} containerEl - Parent DOM element\n */\nfunction updateFullProductLink(label, link, containerEl) {\n containerEl.find('.full-pdp-link').text(label).attr('href', link);\n}\n\n/**\n * Function to add long Description on quick view\n * @param {jQuery} description - Product Description getting DOM element\n * @param {jQuery} containerEl - Parent DOM element\n */\nfunction injectLongDescription(description, containerEl) {\n containerEl.find('.long-description').html(description.html());\n}\n\nexport default {\n updateSelectedSwatchProductName,\n injectAfterpay,\n injectFitPredictor,\n updateFullProductLink,\n injectLongDescription\n}\n","/**\n * HTML Templates for use in client-side rendering.\n *\n * @module dom.templates\n * @version 1.0.0\n */\n\n'use strict';\n\n/**\n * QuickView Templates\n */\nexports.quickView = {\n container: '
      ',\n quickViewModal: `\n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n `\n};\n\n/**\n * Get All Wishlist Collection Templates\n */\nexports.addToWishlist = {\n container: '
      ',\n addToWishlistModal: `\n
      \n \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n \n\n `\n};\n\n/**\n * Cart error message template\n */\nexports.cart = {\n errorMessage: '

      {0}

      ',\n cartAvailabilityMessageOOS: (message, url) => (`\n
    11. ${message}\n Browse Similar Styles

      \n
    12. \n `),\n};\n\n/**\n * Cart & Checkout promo template\n */\nexports.promo = {\n shippingMethod: `\n
      \n
      \n

      \n {0}:{1}\n

      \n

      \n {3}\n

      \n
      \n
      \n

      \n {2}\n

      \n
      \n
      `,\n checkoutNormalShipping: '{0}',\n checkoutDiscountShipping: `\n {0}\n {1}\n `\n};\n\n/**\n * Checkout template\n */\nexports.checkout = {\n discountPrice: '{0}{1}'\n};\n\n/**\n * Selected swatch name template\n */\nexports.swatchNameTemplate = {\n swatchNameHtml: '

      Color: {0}

      '\n};\n\nexports.emptySwatchTemplate = '{0}';\n\n/*\n * Address Suggestions template\n */\nexports.addressSuggestions = {\n suggestionTextTemplate: '

      ',\n suggestionsTemplate: `\n
      \n
      \n \n \n
      \n
      `\n};\n\n/*\n * Approaching Discounts template\n */\nexports.approachingDiscounts = {\n discountContainerTemplate: '
        ',\n singleDiscountTemplate: '
      • {0}
      • ',\n multipleDiscountsTemplate: `\n
      • \n
        \n
        \n
          {0}
        \n
        \n
        \n
        \n \n
        \n
        \n
        \n
      • `,\n nonCouponBasedAdjustmentTemplate: `
        \n
        \n

        {0}\n {2}\n

        \n

        \n {1}\n

        \n
        \n
        `\n};\n\n/**\n * Video Template\n * @param {Object} options video setting values\n * @return {html} video html template\n */\nexports.videoTemplate = (options = {}) => {\n // Note: I don't believe this template is used anywhere anymore\n const { loop = '', videoUrl = '', imgUrl = '', classNames = '', autoplay = false, muted = true, controls = false, icontitle = '', icondesc = '' } = options;\n\n return `\n
        \n \n \n
        \n `;\n};\n\n/**\n * Image Template\n * @param {string} imgUrl value\n * @param {string} altText value\n * @param {string} classNames value\n * @return {html} video html template\n */\nexports.imageTemplate = (imgUrl, altText, classNames) => {\n return `\n
        \n \"${altText}\"/\n
        \n `;\n};\n\n/**\n * Video Thumbnail Template on PDP\n * @param {string} carouselId value\n * @param {string} imgs value\n * @param {string} videoUrl value\n * @param {string} pId value\n * @return {html} list item html template\n */\nexports.videoThumbnailTemplate = (carouselId, imgs, videoUrl, pId) => {\n return `\n
      • \n \n \"${imgs[0].alt}\n \n Play\n \n \n \n
      • \n `;\n};\n\n/**\n * Size option template\n * @param {string} url - Size variant url\n * @param {string} value - Size value\n * @return {html} size option html template\n */\nexports.sizeOptionTemplate = (url, value) => {\n return ``;\n};\n\n/**\n * Function to rerender size button element\n * @param {Object} variantData - variant details\n * @param {string} ariaLabel - aria label\n * @param {string} ariaDescribedby - aria described by\n * @param {string} selectedText - selected text\n * @param {string} oosMessage - out of the stock text\n * @return {html} size button html template\n */\nexports.sizeButtonTemplate = (variantData, ariaLabel, ariaDescribedby, selectedText, oosMessage) => {\n const { selected, forceOutOfStock, inStock, value, url, sizeSwatchNotAvailable } = variantData;\n return `
      • \n \n ${selected ? selectedText : ''} ${!inStock || forceOutOfStock ? oosMessage : ''}\n
      • `;\n};\n\n/**\n * Function to render empty wishlist markup for guest user\n * @param {string} emptyWishlistMessage - empty wishlist message\n * @return {html} wishlist html template\n */\nexports.guestEmptyWishlistTemplate = (emptyWishlistMessage, emptyWishlistContentAssetBody) => {\n return `
        \n
        \n

        ${emptyWishlistMessage}

        \n ${emptyWishlistContentAssetBody}\n
        \n
        `;\n};\n\n/**\n * Function to render empty wishlist markup for guest user\n * @param {string} emptySFLMessage - empty SFL message\n * @param {string} continueShopURL - continue shopping URL\n * @param {string} continueShopMsg - continue shopping message\n * @param {string} signInMsg - sign In message\n * @param {string} signInSFLURL - sign in URL\n * @return {html} SFL html template\n */\nexports.emptySFL = (emptySFLMessage, continueShopURL, continueShopMsg, signInMsg, signInSFLURL) => {\n return `
        \n
        \n
        \n
        \n

        ${emptySFLMessage}

        \n ${signInMsg}\n \n ${continueShopMsg}
        \n
        \n
        \n
        \n
        `;\n};\n\n/**\n * GWP Site Templates\n */\nexports.gwpSizeTemplate = {\n singleSize: '{0}',\n multiSize: `\n
        \n \n \n
        \n `,\n multiDefaultSizeOption: '',\n multiSizeOption: ''\n};\n\n/**\n * Address autocomplete templates\n */\nexports.autoComplete = {\n suggestionLink: (suggestion, addressLine, secondaryEntryAddressLine) => (`\n 1}\"\n data-secondary-entry-search-value=\"${secondaryEntryAddressLine}\"\n >${addressLine}\n `),\n suggestionContainer: containerClass => (`
        `)\n};\n\nexports.contactUsTemplate = {\n signupMessage: (status, msg) => (`\n \n `)\n};\n\nexports.browserWarningTemplate = `\n We're sorry, this browser is no longer supported.
        \n Please update your browser for a smoother, more secure shopping experience. We recommend downloading the latest version of\n Google Chrome,\n Microsoft Edge or\n Mozilla Firefox.\n`;\n\n/*\n * Shipping preference radio buttons\n */\nexports.shippingPreferenceTemplates = {\n shippingPreferences: (ispuRadioLabel, ispuRadioValue, shipToRadioLabel, shipToRadioValue, changeStoreLabel, preferISPU = false) => (`\n
        \n \n \n \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        \n \n \n
        \n
        \n
        \n
        \n
        \n `),\n storeDetail: (storeId, name, address1, city, stateCode, postalCode) => (`\n
        \n
        ${name}
        \n
        \n
        ${address1},\n ${city}, ${stateCode} ${postalCode}\n
        \n
        \n
        \n `)\n};\n\n/*\n * Product detail page - messaging templates\n */\nexports.productDetail = {\n selectStyleMessageTmpl: message => `
      • ${message}

      • `,\n availabilityMessageTmpl: message => `
      • ${message}

      • `,\n restrictedMessageTmpl: message => `
      • ${message}

      • `,\n availabilityMessageOOS: (message, url) => (`\n
      • ${message}\n Browse Similar Styles

        \n
      • \n `),\n availabilityMessagePreorder: (message, url) => (`\n
      • \n

        ${message}

        \n Shop for Similar Styles
        \n
      • \n `),\n ispuSelectStyleMessageTmpl: message => `

        ${message}

        `,\n ispuAvailabilityMessageTmpl: message => `

        ${message}

        `,\n ispuLowStockMessageTmpl: message => `
      • ${message}

      • `\n};\n\nexports.dialogTemplate = options => {\n const {\n buttons = [{ text: 'OK', primary: true, link: '' }],\n className = '',\n modalContentHeading = '',\n modalContentBody = '',\n id = 'dialog-' + Date.now(),\n slideOut = false\n } = options;\n\n const buttonSpace = Math.floor(12 / buttons.length);\n\n return `\n
        \n
        \n
        \n
        \n ${slideOut && modalContentHeading ? `

        ${modalContentHeading}

        ` : ''}\n \n
        \n ${!slideOut && modalContentHeading ? `

        ${modalContentHeading}

        ` : ''}\n
        ${modalContentBody}
        \n
        \n ${buttons.map(button => `\n
        \n ${button.link ?\n `${button.text}` :\n ``\n }\n
        `).join('')\n }\n
        \n
        \n
        \n
        \n `;\n};\n\nexports.errorTextTemplate = errorMessage => `

        ${errorMessage}

        `;\n\nexports.oneTrust = {\n privacyDialogCookieBanner: `\n \n `\n};\nexports.loyalty = {\n carouselBadge: '
        {0}
        '\n};\n","const { addClass, hasClass, queryFirst } = require('./domUtil');\n\n/**\n * Tokenize strings\n *\n * @param {string | Object} string Resource message that need to be tokenized\n * @param {string | Object} values Values that need to be replaced.\n * @param {string | Object} leftToken Left token type with default as {{\n * @param {string | Object} rightToken Right token type with defaulat as }}\n * @return {string} Updated string.\n */\nexports.tokenize = (string, values, leftToken = '{{', rightToken = '}}') => {\n if (typeof values !== 'object') return string;\n const operators = /([{}+.\\-!?[\\]])/g;\n return string.replace(new RegExp(leftToken.replace(operators, '\\\\$1') + '[\\\\r\\\\n\\\\s\\\\t]*([\\\\s\\\\S]+?)[\\\\r\\\\n\\\\s\\\\t]*' + rightToken.replace(operators, '\\\\$1'), 'igm'), (_, code) => {\n return values[code] || '';\n });\n};\n\n/**\n * Transforms all text to a kebab-case string.\n * @param {string} text - The text to transform\n * @returns {string} - The transformed string value\n * @example toKebabCase('.suggestions-related-products', ['.product-tile', '.link']) // suggestions-related-products-product-tile-link\n */\nconst toKebabCase = exports.toKebabCase = (...values) => values.map(value => {\n if (!Array.isArray(value)) value = [value];\n return value.map(text => typeof text === 'undefined' ? '' : String(text).toLowerCase().replace(/\\W/g, '-').trim()).join('-');\n}).join('-').replace(/-+/g, '-').replace(/^-+|-+$/g, '');\n\n/**\n * Transforms any input into a hash value.\n * @param {*} input - The input to transform\n * @returns {string} - The transformed string hash value\n * @example hashValue(function(a){ return a++; }) // 66756e6374696f6e2861297b2072657475726e20612b2b3b207d\n */\nexports.hashValue = input => {\n let value = JSON.stringify(String(input));\n\n if (value === '\"[object Object]\"') {\n // Sort the object first so hashes match despite key order\n value = JSON.stringify(Object.keys(input).sort().reduce((result, key) => {\n result[key] = input[key];\n return result;\n }, {}));\n }\n\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.substr(1, value.length - 2);\n }\n\n return value.split(\"\").map(digit => digit.charCodeAt(0).toString(16)).join('');\n};\n\n/**\n * Transforms all text to a valid dataset key.\n * @param {string} text - The text to transform\n * @returns {string} - The transformed string value\n * @example toDatasetKey('.suggestions-related-products', ['.product-tile', '.link']) // suggestionsRelatedProductsProductTileLink\n */\nexports.toDatasetKey = (...values) => toKebabCase(...values).split('-').map((text, index) => index === 0 ? text : text.charAt(0).toUpperCase() + text.substr(1)).join('');\n\n/**\n * Format dynamic resource messages.\n *\n * @param {string | Object} string Resource message that need to be tokenized\n * @param {string | Object} tokens Tokens that need to be replaced.\n * @return {string} Updated string.\n */\nexports.formatMessage = (string, ...tokens) => {\n return this.tokenize(\n string,\n tokens.reduce((result, item, index) => {\n result[index] = item;\n return result;\n }, {}),\n '{',\n '}'\n );\n};\n\n/**\n * Safely gets nested object properties. Returns the value if found, undefined if not found.\n * @param {*} obj The parent object in which the property exists\n * @param {*} keyString String denoting where in the parent object your target property should exist\n * @param {...any} replaceValues Values in the keyString to replace -- reference in the keyString with a number encapsulated in {} (e.g. {0}, {1}, etc)\n * @return {Object} returns nested object properties\n */\nexports.getNestedValue = function (obj, keyString, ...replaceValues) {\n const keys = keyString.split(/\\[|\\]|\\./).filter(el => el !== '');\n\n return keys.reduce((o, i) => (o || {})[/\\{\\d+\\}/.test(i) ? replaceValues[i.split(/\\{|\\}/)[1]] : i], obj);\n};\n\n/**\n * Ensures an event handler is only bound to an element once\n * @param {HTMLElement} element The element to bind the event to\n * @param {string} eventType The type of event\n * @param {function} handler The handler to execute when the event occurs, or the immediate callback if not defined\n * @param {string} initFlag The name of the flag to use for init\n */\nexports.initOnce = (element, eventType = '', handler, initFlag = '') => {\n const flag = 'init' + initFlag + eventType.toLowerCase();\n\n if (!element || element.dataset[flag]) return;\n\n element.dataset[flag] = true;\n if (eventType) {\n element.addEventListener(eventType, handler);\n } else {\n handler();\n }\n};\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nexports.appendToUrl = (url, params) => {\n let newUrl = url;\n newUrl +=\n (newUrl.indexOf('?') !== -1 ? '&' : '?') +\n Object.keys(params)\n .map(key => key + '=' + encodeURIComponent(params[key]))\n .join('&');\n\n return newUrl;\n};\n\n/**\n * This method performs an ajax call\n * @param {string} url endpoint url\n * @param {string} type ajax method type\n * @param {Object} data data for an ajax call\n * @param {function} onSuccess success call back function\n * @param {function} onError error call back function\n * @return {function} returns ajax function\n */\nexports.getJSON = (url, type, data = {}, onSuccess = function () { }, onError = function () { }) => {\n return $.ajax({\n url,\n type,\n dataType: 'json',\n data,\n success: onSuccess,\n error: onError\n });\n};\n\n/**\n * This method renders geo location\n * @param {function} successCallback Success callback function\n * @param {Object} mixin additional parameters\n * @param {function} errorCallback Error callback function\n */\nexports.geolocate = (successCallback, mixin = {}, errorCallback) => {\n if (!navigator.geolocation) return;\n const data = Object.assign({}, mixin);\n const successHandler = response => {\n const { coords } = response;\n if (coords) {\n const { latitude, longitude } = coords;\n data.latitude = latitude;\n data.longitude = longitude;\n }\n\n if (successCallback) {\n successCallback(data);\n }\n };\n const errorHandler = error => {\n if (errorCallback) {\n errorCallback(data);\n }\n };\n navigator.geolocation.getCurrentPosition(successHandler, errorHandler);\n};\n\n/**\n * This method stores data in key-value pair into browser's localStorage\n * @param {string} key Identifier to be stored\n * @param {string | Object} value Value to be stored\n */\nexports.setItemInLocalStorage = function (key, value) {\n if (!window.localStorage || !key) {\n return;\n }\n\n localStorage.setItem(key, JSON.stringify(value));\n};\n\n/**\n * This method stores data into browser's localStorage\n * @param {string} key Identifier for retrieving the value\n * @return {string | Object | boolean} returns parsed value\n */\nexports.getItemFromLocalStorage = function (key) {\n if (!window.localStorage || !key) {\n return false;\n }\n\n const value = localStorage.getItem(key);\n\n if (!value) {\n return false;\n }\n\n return JSON.parse(value);\n};\n\n/**\n * This method removes data from browser's localStorage\n * @param {string} key Identifier\n */\nexports.removeItemFromLocalStorage = function (key) {\n if (!window.localStorage || !key) {\n return;\n }\n\n localStorage.removeItem(key);\n};\n\n/**\n * This method formats phone number\n * @param {HTMLElement} element - current element for which formatting should be one\n */\nexports.formatPhoneNumber = function (element) {\n const Cleave = require('cleave.js').default;\n if (element) {\n let selector = '#' + element.id;\n setTimeout(() => {\n var cleave = new Cleave(selector, {\n delimiters: ['(', ') ', '-'],\n blocks: [0, 3, 3, 9],\n numericOnly: true\n });\n\n $(element).data('cleave', cleave);\n }, 0);\n }\n}\n\n/**\n * @function\n * @desc Determines if the device that is being used is mobile\n * @returns {Boolean}\n */\nexports.isMobile = function () {\n const mobileAgentHash = ['mobile', 'tablet', 'phone', 'ipad', 'ipod', 'android', 'blackberry', 'windows ce', 'opera mini', 'palm'];\n let idx = 0;\n let isMobile = false;\n const userAgent = navigator.userAgent.toLowerCase();\n\n while (mobileAgentHash[idx] && !isMobile) {\n isMobile = userAgent.indexOf(mobileAgentHash[idx]) >= 0;\n idx++;\n }\n return isMobile;\n};\n\n/**\n * @function\n * @desc Fixes position sticky scrolling behavior for elements with greater height than widnow height. Ensures content is scrollable above the fold\n * @param {Array} items - items to set scroll height position\n * @param {Boolean} isTopOnly - Whether stick to top side only\n * @param {Number} topOffset - additional top space\n */\nexports.stickyScrollPosition = (items, isTopOnly, topOffset = 0) => {\n const $window = $(window);\n const handleStickyPositionOnScroll = item => {\n let ticking = false;\n const detailStickyScroll = () => {\n ticking = false;\n const itemHeight = item.getBoundingClientRect().height;\n const windowHeight = window.innerHeight;\n const headerHeight = $('.main-header').outerHeight();\n const newTop = itemHeight - windowHeight + headerHeight;\n\n if (!isTopOnly && itemHeight > windowHeight - headerHeight) {\n item.style.setProperty('--top', `${-newTop}px`);\n } else {\n item.style.setProperty('--top', `${headerHeight + topOffset}px`);\n }\n };\n const requestTick = () => {\n if (!ticking) {\n requestAnimationFrame(detailStickyScroll);\n }\n ticking = true;\n };\n const onScroll = () => {\n requestTick(item);\n };\n $window.scroll(onScroll);\n };\n\n items.forEach(item => {\n handleStickyPositionOnScroll(item);\n });\n};\n\n/**\n * Determines whether the user is browsing with an old/unsupported browser.\n * @returns {boolean} True if the browser is old/unsupported.\n */\nexports.isUnsupportedBrowser = () => {\n const { userAgent } = navigator;\n const sitePrefs = document.getElementById('site-prefs');\n\n if (!sitePrefs) return false;\n\n let unsupportedBrowserTypes;\n\n if (sitePrefs.dataset) {\n ({ unsupportedBrowserTypes } = sitePrefs.dataset);\n } else {\n // For old IE\n unsupportedBrowserTypes = sitePrefs.getAttribute('data-unsupported-browser-types');\n }\n\n return JSON.parse(unsupportedBrowserTypes).some(function (uaFragment) {\n return ~userAgent.indexOf(uaFragment);\n });\n};\n\n/**\n * Get remaining time object for given time string \n * @param {string} endtime - remaining time string comes as parameter\n * @return {Object} remainTimeObject - Date Object with day, hours, minutes, Sec\n */\nexports.getTimeRemaining = (endtime) => {\n const total = Date.parse(endtime) - Date.now();\n const seconds = Math.floor((total / 1000) % 60).toString();\n const minutes = Math.floor((total / 1000 / 60) % 60).toString();\n const hours = Math.floor((total / (1000 * 60 * 60)) % 24).toString();\n const days = Math.floor(total / (1000 * 60 * 60 * 24));\n\n return {\n total,\n days,\n hours,\n minutes,\n seconds\n };\n};\n\n\n/**\n * Converts the range to Absolute, according to the Rounding Rules configured on Global-e side.\n * @param {number} price - Price\n * @param {Object} range - Range\n * @returns {Object} - result Absolute\n */\nfunction convertRangeToAbsolute(price, range) {\n let result;\n let intPart;\n let base;\n if (range.RangeBehavior === 1) {\n // range already has absolute behavior\n result = range;\n } else {\n result = {};\n result.RangeBehavior = range.RangeBehavior;\n result.RoundingExceptions = [];\n result.From = range.From;\n result.To = range.To;\n\n intPart = Math.floor(price);\n\n if (range.RangeBehavior === 2) {\n // Relative Decimal\n result.LowerTarget = intPart - 1;\n result.LowerTarget += range.LowerTarget;\n result.UpperTarget = intPart + range.UpperTarget;\n result.Threshold = intPart + range.Threshold;\n for (let i = 0; i < range.RoundingExceptions.length; i++) {\n let ex = range.RoundingExceptions[i];\n ex.ExceptionValue += intPart;\n result.RoundingExceptions.push(ex);\n }\n } else if (range.RangeBehavior === 3) {\n // Relative Whole\n if (range.TargetBehaviorHelperValue === 0) {\n range.TargetBehaviorHelperValue = 10; // eslint-disable-line no-param-reassign\n }\n base = Math.floor(price / range.TargetBehaviorHelperValue) * range.TargetBehaviorHelperValue;\n result.LowerTarget = (base - range.TargetBehaviorHelperValue) + range.LowerTarget;\n result.UpperTarget = base + range.UpperTarget;\n result.Threshold = base + range.Threshold;\n for (let i = 0; i < range.RoundingExceptions.length; i++) {\n let ex = range.RoundingExceptions[i];\n ex.ExceptionValue += base;\n result.RoundingExceptions.push(ex);\n }\n } else if (range.RangeBehavior === 4) {\n // Nearest target\n if (range.TargetBehaviorHelperValue === 0) {\n range.TargetBehaviorHelperValue = 5; // eslint-disable-line no-param-reassign\n }\n base = Math.floor(price / range.TargetBehaviorHelperValue) * range.TargetBehaviorHelperValue;\n result.LowerTarget = (base - 1) + range.LowerTarget;\n result.UpperTarget = ((base - 1) + range.TargetBehaviorHelperValue) + range.UpperTarget;\n result.Threshold = base + range.Threshold;\n for (let i = 0; i < range.RoundingExceptions.length; i++) {\n let ex = range.RoundingExceptions[i];\n ex.ExceptionValue += base;\n result.RoundingExceptions.push(ex);\n }\n }\n }\n return (result || null);\n}\n\n/**\n * Rounds the given price, according to the Rounding Rules configured on Global-e side\n * @param {number} price - Price\n * @param {Object} range - Range\n * @returns {number} - Absolute\n */\nfunction absoluteRounding(price, range) {\n let result = null;\n // check exceptions\n if (range.RoundingExceptions.length > 0) {\n for (let i = 0; i < range.RoundingExceptions.length; i++) {\n let ex = range.RoundingExceptions[i];\n if (price === ex.ExceptionValue) {\n result = price;\n }\n }\n }\n // no exception was found\n if (!result) {\n // check threshold\n if (price < range.Threshold) {\n result = range.LowerTarget;\n } else {\n result = range.UpperTarget;\n }\n }\n return result;\n}\n\n/**\n * Calculate and returns currecy price for Stylitics widget\n * @param {string} gePrice - price\n * @param {Object} roundingRanges - globale rouding rules json\n * @return {string} - Rounded price\n */\nfunction roundPrice(gePrice, roundingRanges) {\n let range = null;\n let price = gePrice;\n for (let i = 0; i < roundingRanges.length; i++) {\n let rg = roundingRanges[i];\n if (rg.From < price && price <= rg.To) {\n range = rg;\n break;\n }\n }\n if (range) {\n range = convertRangeToAbsolute(price, range);\n price = absoluteRounding(price, range); // eslint-disable-line no-param-reassign\n }\n if (price < 0) {\n price = 0; // eslint-disable-line no-param-reassign\n }\n return price;\n}\n\n/**\n * Calculate and returns currecy price for Stylitics widget\n * @param {string} price - list price\n * @param {string} salesPrice - sales price\n * @return {Object} - localized price object with list and sales price\n */\nexports.globaleCalculation = (price, salesPrice) => {\n const countryCurrency = window.currencySymbol;\n if (price.innerText.indexOf(countryCurrency) === -1) {\n let salesPriceText;\n let geSalesPrice;\n\n let priceText = price.innerText.replace('$', '');\n let gePrice = priceText;\n\n if (salesPrice) {\n salesPriceText = salesPrice.innerText.replace('$', '');\n geSalesPrice = salesPriceText;\n }\n\n const countryCoefficientIncludeVAT = window.countryCoefficientIncludeVAT;\n const countryVATRate = parseFloat(window.countryVATRate);\n const merchantTaxRate = parseFloat(window.merchantTaxRate);\n const currenyRate = parseFloat(window.currenyRate);\n const coefficientRate = parseFloat(window.coefficientRate);\n\n if (['2', '4', '6'].indexOf(countryCoefficientIncludeVAT) !== -1) {\n gePrice += gePrice * countryVATRate;\n if (geSalesPrice) {\n geSalesPrice += (geSalesPrice * countryVATRate);\n }\n } else if (['0', '8'].indexOf(countryCoefficientIncludeVAT) !== -1\n || (parseInt(countryCoefficientIncludeVAT) === 6 && window.useCountryVAT)) {\n gePrice /= (1 + (merchantTaxRate / 100));\n geSalesPrice /= (1 + (merchantTaxRate / 100));\n if (parseInt(countryCoefficientIncludeVAT) === 6) {\n gePrice += gePrice * countryVATRate;\n if (geSalesPrice) {\n geSalesPrice += geSalesPrice * countryVATRate;\n }\n }\n }\n\n gePrice = gePrice * currenyRate * coefficientRate;\n geSalesPrice = geSalesPrice ? geSalesPrice * currenyRate * coefficientRate : null;\n\n const globaleRoundingRanges = JSON.parse(JSON.stringify(window.roundingRanges));\n if (globaleRoundingRanges) {\n const roundingRanges = JSON.parse(globaleRoundingRanges);\n gePrice = roundPrice(gePrice, roundingRanges);\n geSalesPrice = geSalesPrice ? roundPrice(geSalesPrice, roundingRanges) : '';\n }\n\n return {\n gePrice: countryCurrency + ' ' + gePrice,\n geSalesPrice: countryCurrency + ' ' + geSalesPrice\n };\n }\n return {\n gePrice: price.innerText,\n geSalesPrice: salesPrice ? salesPrice.innerText : ''\n };\n};\n","'use strict';\n\nvar storeLocator = require('base/storeLocator/storeLocator');\n\n/**\n * Restores Quantity Selector to its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction restoreQuantityOptions($quantitySelect) {\n var originalHTML = $quantitySelect.data('originalHTML');\n if (originalHTML) {\n $quantitySelect.html(originalHTML);\n }\n}\n\n/**\n * Sets the data attribute of Quantity Selector to save its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction setOriginalQuantitySelect($quantitySelect) {\n if (!$quantitySelect.data('originalHTML')) {\n $quantitySelect.data('originalHTML', $quantitySelect.html());\n } // If it's already there, don't re-set it\n}\n\n/**\n * Updates the Quantity Selector based on the In Store Quantity.\n * @param {string} quantitySelector - Quantity Selector\n * @param {string} quantityOptionSelector - Quantity Option Selector\n * @param {number} productAtsValue - Inventory in the selected store\n */\nfunction updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue) {\n var selectedQuantity = $(quantitySelector).val();\n restoreQuantityOptions($(quantitySelector));\n for (var i = $(quantityOptionSelector).length - 1; i >= productAtsValue; i--) {\n $(quantityOptionSelector).eq(i).remove();\n }\n $(quantitySelector + ' option[value=\"' + selectedQuantity + '\"]').attr('selected', 'selected');\n}\n\n/**\n * Generates the modal window on the first call.\n */\nfunction getModalHtmlElement() {\n if ($('#inStoreInventoryModal').length !== 0) {\n $('#inStoreInventoryModal').remove();\n }\n var htmlString = ''\n + '
        '\n + '
        '\n + ''\n + '
        '\n + '
        '\n + ' '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        '\n + '
        ';\n $('body').append(htmlString);\n $('#inStoreInventoryModal').modal('show');\n}\n\n/**\n * Replaces the content in the modal window with find stores components and\n * the result store list.\n * @param {string} pid - The product ID to search for\n * @param {number} quantity - Number of products to search inventory for\n * @param {number} selectedPostalCode - The postal code to search for inventory\n * @param {number} selectedRadius - The radius to search for inventory\n */\nfunction fillModalElement(pid, quantity, selectedPostalCode, selectedRadius) {\n var requestData = {\n products: pid + ':' + quantity\n };\n\n if (selectedRadius) {\n requestData.radius = selectedRadius;\n }\n\n if (selectedPostalCode) {\n requestData.postalCode = selectedPostalCode;\n }\n\n $('#inStoreInventoryModal').spinner().start();\n $.ajax({\n url: $('.btn-get-in-store-inventory').data('action-url'),\n data: requestData,\n method: 'GET',\n success: function (response) {\n $('.modal-body').empty();\n $('.modal-body').html(response.storesResultsHtml);\n storeLocator.search();\n storeLocator.changeRadius();\n storeLocator.selectStore();\n storeLocator.updateSelectStoreButton();\n\n $('.btn-storelocator-search').attr('data-search-pid', pid);\n\n if (selectedRadius) {\n $('#radius').val(selectedRadius);\n }\n\n if (selectedPostalCode) {\n $('#store-postal-code').val(selectedPostalCode);\n }\n\n if (!$('.results').data('has-results')) {\n $('.store-locator-no-results').show();\n }\n\n $('#inStoreInventoryModal').modal('show');\n $('#inStoreInventoryModal').spinner().stop();\n },\n error: function () {\n $('#inStoreInventoryModal').spinner().stop();\n }\n });\n}\n\n/**\n * Remove the selected store.\n * @param {HTMLElement} $container - the target html element\n */\nfunction deselectStore($container) {\n var storeElement = $($container).find('.selected-store-with-inventory');\n $(storeElement).find('.card-body').empty();\n $(storeElement).addClass('display-none');\n $($container).find('.btn-get-in-store-inventory').show();\n $($container).find('.quantity-select').removeData('originalHTML');\n}\n\n/**\n * Update quantity options. Only display quantity options that are available for the store.\n * @param {sring} searchPID - The product ID of the selected product.\n * @param {number} storeId - The store ID selected for in store pickup.\n */\nfunction updateQuantityOptions(searchPID, storeId) {\n var selectorPrefix = '.product-detail[data-pid=\"' + searchPID + '\"]';\n var productIdSelector = selectorPrefix + ' .product-id';\n var quantitySelector = selectorPrefix + ' .quantity-select';\n var quantityOptionSelector = quantitySelector + ' option';\n\n setOriginalQuantitySelect($(quantitySelector));\n\n var requestData = {\n pid: $(productIdSelector).text(),\n quantitySelected: $(quantitySelector).val(),\n storeId: storeId\n };\n\n $.ajax({\n url: $('.btn-get-in-store-inventory').data('ats-action-url'),\n data: requestData,\n method: 'GET',\n success: function (response) {\n // Update Quantity dropdown, Remove quantity greater than inventory\n var productAtsValue = response.atsValue;\n var availabilityValue = '';\n\n var $productContainer = $('.product-detail[data-pid=\"' + searchPID + '\"]');\n\n if (!response.product.readyToOrder) {\n availabilityValue = '
        ' + response.resources.info_selectforstock + '
        ';\n } else {\n response.product.messages.forEach(function (message) {\n availabilityValue += '
        ' + message + '
        ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n });\n\n updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue);\n }\n });\n}\n\nmodule.exports = {\n updateSelectStore: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n $('.btn-get-in-store-inventory', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available ||\n !response.product.availableForInStorePickup));\n });\n },\n removeSelectedStoreOnAttributeChange: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n response.container.attr('data-pid', response.data.product.id);\n deselectStore(response.container);\n });\n },\n updateAddToCartFormData: function () {\n $('body').on('updateAddToCartFormData', function (e, form) {\n if (form.pidsObj) {\n var pidsObj = JSON.parse(form.pidsObj);\n pidsObj.forEach(function (product) {\n var storeElement = $('.product-detail[data-pid=\"' +\n product.pid\n + '\"]').find('.store-name');\n product.storeId = $(storeElement).length// eslint-disable-line no-param-reassign\n ? $(storeElement).attr('data-store-id')\n : null;\n });\n\n form.pidsObj = JSON.stringify(pidsObj);// eslint-disable-line no-param-reassign\n }\n\n var storeElement = $('.product-detail[data-pid=\"'\n + form.pid\n + '\"]');\n\n if ($(storeElement).length) {\n form.storeId = $(storeElement).find('.store-name') // eslint-disable-line\n .attr('data-store-id');\n }\n });\n },\n showInStoreInventory: function () {\n $('.btn-get-in-store-inventory').on('click', function (e) {\n var pid = $(this).closest('.product-detail').attr('data-pid');\n var quantity = $(this).closest('.product-detail').find('.quantity-select').val();\n getModalHtmlElement();\n fillModalElement(pid, quantity);\n e.stopPropagation();\n });\n },\n removeStoreSelection: function () {\n $('body').on('click', '#remove-store-selection', (function () {\n deselectStore($(this).closest('.product-detail'));\n $(document).trigger('store:afterRemoveStoreSelection', $(this).closest('.product-detail').find('.quantity-select'));\n }));\n },\n selectStoreWithInventory: function () {\n $('body').on('store:selected', function (e, data) {\n var searchPID = $('.btn-storelocator-search').attr('data-search-pid');\n var storeElement = $('.product-detail[data-pid=\"' + searchPID + '\"]');\n $(storeElement).find('.selected-store-with-inventory .card-body').empty();\n $(storeElement).find('.selected-store-with-inventory .card-body').append(data.storeDetailsHtml);\n $(storeElement).find('.store-name').attr('data-store-id', data.storeID);\n $(storeElement).find('.selected-store-with-inventory').removeClass('display-none');\n\n var $changeStoreButton = $(storeElement).find('.change-store');\n $($changeStoreButton).data('postal', data.searchPostalCode);\n $($changeStoreButton).data('radius', data.searchRadius);\n\n $(storeElement).find('.btn-get-in-store-inventory').hide();\n\n updateQuantityOptions(searchPID, data.storeID);\n\n $('#inStoreInventoryModal').modal('hide');\n $('#inStoreInventoryModal').remove();\n });\n },\n changeStore: function () {\n $('body').on('click', '.change-store', (function () {\n var pid = $(this).closest('.product-detail').attr('data-pid');\n var quantity = $(this).closest('.product-detail').find('.quantity-select').val();\n getModalHtmlElement();\n fillModalElement(pid, quantity, $(this).data('postal'), $(this).data('radius'));\n }));\n }\n};\n","'use strict';\n\nvar scrollAnimate = require('../components/scrollAnimate');\n\n/**\n * Display error messages and highlight form fields with errors.\n * @param {string} parentSelector - the form which contains the fields\n * @param {Object} fieldErrors - the fields with errors\n */\nfunction loadFormErrors(parentSelector, fieldErrors) { // eslint-disable-line\n // Display error messages and highlight form fields with errors.\n $.each(fieldErrors, function (attr) {\n $('*[name=' + attr + ']', parentSelector)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .html(fieldErrors[attr]);\n });\n // Animate to top of form that has errors\n scrollAnimate($(parentSelector));\n}\n\n/**\n * Clear the form errors.\n * @param {string} parentSelector - the parent form selector.\n */\nfunction clearPreviousErrors(parentSelector) {\n $(parentSelector).find('.form-control.is-invalid').removeClass('is-invalid');\n $('.error-message').hide();\n}\n\nmodule.exports = {\n loadFormErrors: loadFormErrors,\n clearPreviousErrors: clearPreviousErrors\n};\n","'use strict';\n\nmodule.exports = function (element, message) {\n var errorHtml = '
        ' +\n '' + message + '
        ';\n\n $(element).append(errorHtml);\n};\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, payload) {\n // clear form validation first\n clearFormErrors(formElement);\n $('.alert', formElement).remove();\n\n if (typeof payload === 'object' && payload.fields) {\n Object.keys(payload.fields).forEach(function (key) {\n if (payload.fields[key]) {\n var feedbackElement = $(formElement).find('[name=\"' + key + '\"]')\n .parent()\n .children('.invalid-feedback');\n\n if (feedbackElement.length > 0) {\n if (Array.isArray(payload[key])) {\n feedbackElement.html(payload.fields[key].join('
        '));\n } else {\n feedbackElement.html(payload.fields[key]);\n }\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n }\n }\n });\n }\n if (payload && payload.error) {\n var form = $(formElement).prop('tagName') === 'FORM'\n ? $(formElement)\n : $(formElement).parents('form');\n\n form.prepend('
        '\n + payload.error.join('
        ') + '
        ');\n }\n};\n","'use strict';\n\nmodule.exports = function (element) {\n var position = element && element.length ? element.offset().top : 0;\n $('html, body').animate({\n scrollTop: position\n }, 500);\n if (!element) {\n $('.logo-home').focus();\n }\n};\n","'use strict';\n\nvar formValidation = require('../components/formValidation');\nvar createErrorNotification = require('../components/errorNotification');\n\nmodule.exports = {\n login: function () {\n $('form.login').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n form.spinner().start();\n $('form.login').trigger('login:submit', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n formValidation(form, data);\n $('form.login').trigger('login:error', data);\n } else {\n $('form.login').trigger('login:success', data);\n location.href = data.redirectUrl;\n }\n },\n error: function (data) {\n if (data.responseJSON.redirectUrl) {\n window.location.href = data.responseJSON.redirectUrl;\n } else {\n $('form.login').trigger('login:error', data);\n form.spinner().stop();\n }\n }\n });\n return false;\n });\n },\n\n register: function () {\n $('form.registration').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n form.spinner().start();\n $('form.registration').trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n $('form.registration').trigger('login:register:error', data);\n formValidation(form, data);\n } else {\n $('form.registration').trigger('login:register:success', data);\n location.href = data.redirectUrl;\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification($('.error-messaging'), err.responseJSON.errorMessage);\n }\n\n form.spinner().stop();\n }\n });\n return false;\n });\n },\n\n resetPassword: function () {\n $('.reset-password-form').submit(function (e) {\n var form = $(this);\n e.preventDefault();\n var url = form.attr('action');\n form.spinner().start();\n $('.reset-password-form').trigger('login:register', e);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: form.serialize(),\n success: function (data) {\n form.spinner().stop();\n if (!data.success) {\n formValidation(form, data);\n } else {\n $('.request-password-title').text(data.receivedMsgHeading);\n $('.request-password-body').empty()\n .append('

        ' + data.receivedMsgBody + '

        ');\n if (!data.mobile) {\n $('#submitEmailButton').text(data.buttonText)\n .attr('data-dismiss', 'modal');\n } else {\n $('.send-email-btn').empty()\n .html(''\n + data.buttonText + ''\n );\n }\n }\n },\n error: function () {\n form.spinner().stop();\n }\n });\n return false;\n });\n },\n\n clearResetForm: function () {\n $('#login .modal').on('hidden.bs.modal', function () {\n $('#reset-password-email').val('');\n $('.modal-dialog .form-control.is-invalid').removeClass('is-invalid');\n });\n }\n};\n","/* globals google */\n'use strict';\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\n/**\n * Uses google maps api to render a map\n */\nfunction maps() {\n var map;\n var infowindow = new google.maps.InfoWindow();\n\n // Init U.S. Map in the center of the viewport\n var latlng = new google.maps.LatLng(37.09024, -95.712891);\n var mapOptions = {\n scrollwheel: false,\n zoom: 4,\n center: latlng\n };\n\n map = new google.maps.Map($('.map-canvas')[0], mapOptions);\n var mapdiv = $('.map-canvas').attr('data-locations');\n\n mapdiv = JSON.parse(mapdiv);\n\n var bounds = new google.maps.LatLngBounds();\n\n // Customized google map marker icon with svg format\n var markerImg = {\n path: 'M13.5,30.1460153 L16.8554555,25.5 L20.0024287,25.5 C23.039087,25.5 25.5,' +\n '23.0388955 25.5,20.0024287 L25.5,5.99757128 C25.5,2.96091298 23.0388955,0.5 ' +\n '20.0024287,0.5 L5.99757128,0.5 C2.96091298,0.5 0.5,2.96110446 0.5,5.99757128 ' +\n 'L0.5,20.0024287 C0.5,23.039087 2.96110446,25.5 5.99757128,25.5 L10.1445445,' +\n '25.5 L13.5,30.1460153 Z',\n fillColor: '#0070d2',\n fillOpacity: 1,\n scale: 1.1,\n strokeColor: 'white',\n strokeWeight: 1,\n anchor: new google.maps.Point(13, 30),\n labelOrigin: new google.maps.Point(12, 12)\n };\n\n Object.keys(mapdiv).forEach(function (key) {\n var item = mapdiv[key];\n var lable = parseInt(key, 10) + 1;\n var storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n var marker = new google.maps.Marker({\n position: storeLocation,\n map: map,\n title: item.name,\n icon: markerImg,\n label: { text: lable.toString(), color: 'white', fontSize: '16px' }\n });\n\n marker.addListener('click', function () {\n infowindow.setOptions({\n content: item.infoWindowHtml\n });\n infowindow.open(map, marker);\n });\n\n // Create a minimum bound based on a set of storeLocations\n bounds.extend(marker.position);\n });\n // Fit the all the store marks in the center of a minimum bounds when any store has been found.\n if (mapdiv && mapdiv.length !== 0) {\n map.fitBounds(bounds);\n }\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {Object} data - Response from the server\n */\nfunction updateStoresResults(data) {\n var $resultsDiv = $('.results');\n var $mapDiv = $('.map-canvas');\n var hasResults = data.stores.length > 0;\n\n if (!hasResults) {\n $('.store-locator-no-results').show();\n } else {\n $('.store-locator-no-results').hide();\n }\n\n $resultsDiv.empty()\n .data('has-results', hasResults)\n .data('radius', data.radius)\n .data('search-key', data.searchKey);\n\n $mapDiv.attr('data-locations', data.locations);\n\n if ($mapDiv.data('has-google-api')) {\n maps();\n } else {\n $('.store-locator-no-apiKey').show();\n }\n\n if (data.storesResultsHtml) {\n $resultsDiv.append(data.storesResultsHtml);\n }\n}\n\n/**\n * Search for stores with new zip code\n * @param {HTMLElement} element - the target html element\n * @returns {boolean} false to prevent default event\n */\nfunction search(element) {\n var dialog = element.closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n var $form = element.closest('.store-locator');\n var radius = $('.results').data('radius');\n var url = $form.attr('action');\n var urlParams = { radius: radius };\n\n var payload = $form.is('form') ? $form.serialize() : { postalCode: $form.find('[name=\"postalCode\"]').val() };\n\n url = appendToUrl(url, urlParams);\n\n $.ajax({\n url: url,\n type: $form.attr('method'),\n data: payload,\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n return false;\n}\n\nmodule.exports = {\n init: function () {\n if ($('.map-canvas').data('has-google-api')) {\n maps();\n } else {\n $('.store-locator-no-apiKey').show();\n }\n\n if (!$('.results').data('has-results')) {\n $('.store-locator-no-results').show();\n }\n },\n\n detectLocation: function () {\n // clicking on detect location.\n $('.detect-location').on('click', function () {\n $.spinner().start();\n if (!navigator.geolocation) {\n $.spinner().stop();\n return;\n }\n\n navigator.geolocation.getCurrentPosition(function (position) {\n var $detectLocationButton = $('.detect-location');\n var url = $detectLocationButton.data('action');\n var radius = $('.results').data('radius');\n var urlParams = {\n radius: radius,\n lat: position.coords.latitude,\n long: position.coords.longitude\n };\n\n url = appendToUrl(url, urlParams);\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $.spinner().stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n });\n });\n },\n\n search: function () {\n $('.store-locator-container form.store-locator').submit(function (e) {\n e.preventDefault();\n search($(this));\n });\n $('.store-locator-container .btn-storelocator-search[type=\"button\"]').click(function (e) {\n e.preventDefault();\n search($(this));\n });\n },\n\n changeRadius: function () {\n $('.store-locator-container .radius').change(function () {\n var radius = $(this).val();\n var searchKeys = $('.results').data('search-key');\n var url = $(this).data('action-url');\n var urlParams = {};\n\n if (searchKeys.postalCode) {\n urlParams = {\n radius: radius,\n postalCode: searchKeys.postalCode\n };\n } else if (searchKeys.lat && searchKeys.long) {\n urlParams = {\n radius: radius,\n lat: searchKeys.lat,\n long: searchKeys.long\n };\n }\n\n url = appendToUrl(url, urlParams);\n var dialog = $(this).closest('.in-store-inventory-dialog');\n var spinner = dialog.length ? dialog.spinner() : $.spinner();\n spinner.start();\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n spinner.stop();\n updateStoresResults(data);\n $('.select-store').prop('disabled', true);\n }\n });\n });\n },\n selectStore: function () {\n $('.store-locator-container').on('click', '.select-store', (function (e) {\n e.preventDefault();\n var selectedStore = $(':checked', '.results-card .results');\n var data = {\n storeID: selectedStore.val(),\n searchRadius: $('#radius').val(),\n searchPostalCode: $('.results').data('search-key').postalCode,\n storeDetailsHtml: selectedStore.siblings('label').find('.store-details').html(),\n event: e\n };\n\n $('body').trigger('store:selected', data);\n }));\n },\n updateSelectStoreButton: function () {\n $('body').on('change', '.select-store-input', (function () {\n $('.select-store').prop('disabled', false);\n }));\n }\n};\n","'use strict';\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n queryAll,\n queryFirst,\n scrollTo,\n addClass,\n removeClass,\n hasClass,\n setAttribute,\n removeAttribute\n} from '../domUtil';\n\nlet observer = null;\nconst productContainer = queryFirst('.pdp-container');\nconst stickyCTAContainer = queryFirst('.js-sticky-cta-container');\nconst addToCartBtn = queryFirst('.add-to-cart', productContainer);\nconst notifyMeBtn = queryFirst('.notify-me-btn', productContainer);\nconst sizeHeaderEl = queryFirst('#cta-size-options-header', stickyCTAContainer);\nconst header = queryFirst('.main-header');\nconst headerHeight = header ? header.clientHeight + 40 : 0;\nconst masterId = productContainer.dataset.masterid;\nconst productInfo = window.productInfo[masterId];\nconst hiddenClass = 'd-none';\nconst sizeContainerEl = queryFirst('.size-accordion', productContainer);\nlet initSizeContainerHeight;\n\n// First Sticky CTA functionality\n\n/**\n * @description Changes CTA Button title\n * @param {JQuery} ctaElement DOM element for CTA component\n */\nfunction updateAddToCartButtonTitle() {\n const ctaElement = queryFirst('.js-sticky-cta-one');\n const selectedSize = queryFirst('.size-btn.selected');\n const addToCartBtnCTA = queryFirst('.js-sticky-add-to-cart', ctaElement);\n\n if (addToCartBtnCTA) {\n const title = selectedSize\n ? addToCartBtnCTA.dataset.addToCartTitle\n : addToCartBtnCTA.dataset.selectSizeTitle;\n\n addToCartBtnCTA.innerText = title;\n }\n}\n\n/**\n * @description Update product price on swanth selection\n * @param {int} price - product sale price\n * @param {int} standardPrice - product standard price\n * @param {Object} container - DOM container for a given product\n */\nfunction updateProductPrice(price, standardPrice, container) {\n const priceTemplate = document.getElementById('price-template').cloneNode(true);\n const priceSection = queryFirst('.prices .price', container);\n const priceContainer = queryFirst('.price-section', priceTemplate);\n const strikeThroughContainer = queryFirst('.strike-through-section', priceContainer);\n const priceElement = queryFirst('.strike-through-price', strikeThroughContainer);\n const salesContainer = queryFirst('.sales', priceContainer);\n const salesPriceElement = queryFirst('.price-value', salesContainer);\n let fixedPrice = price;\n let fixedStandardPrice = standardPrice;\n\n // Fix decimal places for non-whole-number prices\n if (price % 1 !== 0) {\n fixedPrice = price.toFixed(2);\n }\n if (standardPrice % 1 !== 0) {\n fixedStandardPrice = standardPrice.toFixed(2);\n }\n\n removeClass(strikeThroughContainer, hiddenClass);\n priceElement.textContent = `$${fixedStandardPrice}`;\n salesPriceElement.textContent = `$${fixedPrice}`;\n if (price === standardPrice) {\n addClass(strikeThroughContainer, hiddenClass);\n }\n priceSection.innerHTML = priceTemplate.innerHTML;\n}\n\n/**\n * @description Handle button visibility\n * @param {Object} data DOM event\n * @param {Object} container DOM event\n */\nfunction handleButton(data, container) {\n const { selectedSizeElement } = data;\n const selectedColorId = queryFirst('.swatch-circle.selected').dataset.attrValue;\n const addToCartBtnCTA = queryFirst('.js-sticky-add-to-cart', container);\n const notifyCTA = queryFirst('.js-notify-cta', container);\n\n if (hasClass(selectedSizeElement, 'not-available')) {\n const selectedSizeValue = selectedSizeElement.dataset.attrValue;\n const variantGroupData = productInfo.variants[selectedColorId];\n const { sizes } = variantGroupData;\n const selectedSizeData = sizes[selectedSizeValue];\n const { isNotifyMeEnabled } = selectedSizeData;\n\n if (isNotifyMeEnabled) {\n observer.unobserve(addToCartBtn);\n observer.observe(notifyMeBtn);\n removeClass(notifyCTA, hiddenClass);\n addClass(addToCartBtnCTA, hiddenClass);\n } else {\n setAttribute(addToCartBtnCTA, 'disabled');\n addClass(sizeHeaderEl, 'm-error');\n }\n } else {\n observer.observe(addToCartBtn);\n observer.unobserve(notifyMeBtn);\n addClass(notifyCTA, hiddenClass);\n removeClass(addToCartBtnCTA, hiddenClass);\n removeAttribute(addToCartBtnCTA, 'disabled');\n removeClass(sizeHeaderEl, 'm-error');\n }\n}\n\n/**\n * @description Handle click on color select button\n * @param {Event} event DOM event\n * @param {Object} response DOM event\n */\nfunction onPdpColorSelected(event, response) {\n const variationSelected = response?.data?.variationSelected;\n\n if (variationSelected) {\n const variantGroupId = response.data.variationSelected;\n\n const { price, standardPrice } = productInfo.variants[variantGroupId];\n\n updateProductPrice(price, standardPrice, queryFirst('.sticky-cta-ver1-info'));\n }\n\n handleButton(response, queryFirst('.js-sticky-cta-one'));\n updateAddToCartButtonTitle();\n}\n\n/**\n * @description Handle click on size select button\n * @param {Event} event DOM event\n * @param {Object} response DOM event\n */\nfunction onPdpSizeSelectedOne(event, response) {\n handleButton(response, queryFirst('.js-sticky-cta-one'));\n updateAddToCartButtonTitle();\n}\n\n/**\n * @description Handel click on CTA button\n * @param {JQuery} ctaElement DOM element for CTA component\n */\nfunction initFirstStickyCTA(ctaElement) {\n const addToCartBtnCTA = queryFirst('.js-sticky-add-to-cart', ctaElement);\n\n $('body').on('product:pdpSizeSelected', onPdpSizeSelectedOne);\n $('body').on('product:afterAttributeSelect', onPdpColorSelected);\n\n updateAddToCartButtonTitle();\n\n addToCartBtnCTA.addEventListener('click', () => {\n const selectedSize = queryFirst('.size-btn.selected');\n\n if (selectedSize) {\n $(addToCartBtn).trigger('click');\n } else {\n scrollTo($('.card.size-card').offset().top - headerHeight);\n }\n });\n\n queryFirst('.js-notify-cta', ctaElement).addEventListener('click', () => {\n $(notifyMeBtn).trigger('click');\n });\n}\n\n// Second Sticky CTA functionality\n\n/**\n * @description Hide unselected fit accordions\n * @param {string} selectedFitValue Selected fit value\n */\nfunction hideUnselectedFits(selectedFitValue) {\n const selectFitAccordions = queryAll('.js-fit-size-accordion');\n\n if (selectFitAccordions) {\n selectFitAccordions.forEach(selectFitAccordion => {\n if (selectFitAccordion.dataset.attrValue !== selectedFitValue) {\n addClass(selectFitAccordion, hiddenClass);\n }\n });\n }\n}\n\n/**\n * @description Update fit size accordion with available sizes\n * @param {Array} variationAttributes Product variation attributes\n */\nfunction updateFitSizeAccordions(variationAttributes) {\n if (variationAttributes) {\n const fitSizeVariation = variationAttributes.find(item => item.id === 'fitSize');\n const sizeVariation = variationAttributes.find(item => item.id === 'size');\n const sizeAccordionContainer = queryFirst('.js-size-select-container .card-body');\n const fitSizeElements = queryAll('.js-size-select-container .js-fit-size-accordion');\n const selectedFit = fitSizeVariation.filteredValues.find(item => item.selected);\n const selectedFitValue = selectedFit ? selectedFit.value : '';\n const selectSizeBtn = queryFirst('.js-selected-size-btn');\n let sizeItemsMarkup = '';\n\n if (sizeVariation?.filteredValues.length) {\n sizeItemsMarkup = sizeVariation.filteredValues.reduce((markup, item) => {\n return markup\n + `
      • \n \n ${item.displayValue}\n \n
      • `;\n }, '');\n }\n\n if (fitSizeVariation?.filteredValues?.length > 1) {\n const isRerenderNeeded = fitSizeVariation.filteredValues.some(fitValue => !queryFirst(`#cta-size-options-header-${fitValue.value}`));\n\n if (isRerenderNeeded || fitSizeElements.length !== fitSizeVariation.filteredValues.length) {\n const sizeSelectContentMarkup = fitSizeVariation.filteredValues.reduce((markup, fitValue) => {\n return markup\n + `
      • \n
        \n
        \n
        \n
        \n \n ${fitValue.value}\n \n
        \n
        \n \n
        \n
          \n ${fitValue.selected ? sizeItemsMarkup : ''}\n
        \n
        \n
        \n
        \n \n
      • `;\n }, '');\n\n sizeAccordionContainer.innerHTML = `
          ${sizeSelectContentMarkup}
        `;\n\n // Collapse size accordion\n setAttribute(selectSizeBtn, 'aria-expanded', false);\n removeClass(queryFirst('#cta-size-options'), 'show');\n } else {\n const selectedFitSizeAccordion = queryFirst(`.js-size-select-accordion[data-attr-value=\"${selectedFitValue}\"]`);\n\n if (selectedFitSizeAccordion) {\n selectedFitSizeAccordion.innerHTML = `
          ${sizeItemsMarkup}
        `;\n }\n }\n } else if (fitSizeVariation?.filteredValues?.length === 1 && sizeVariation?.filteredValues?.length) {\n sizeAccordionContainer.innerHTML = `
          ${sizeItemsMarkup}
        `;\n // Collapse size accordion\n setAttribute(selectSizeBtn, 'aria-expanded', false);\n removeClass(queryFirst('#cta-size-options'), 'show');\n }\n\n if (!sizeVariation?.filteredValues?.some(size => size.selected)) {\n const selectedSizeTitle = queryFirst('.js-selected-size-title');\n selectedSizeTitle.innerText = '';\n }\n\n if (selectSizeBtn) {\n // Disable size selector if only one size available for product variant\n if (fitSizeVariation?.filteredValues?.length <= 1 && sizeVariation?.filteredValues.length === 1) {\n setAttribute(selectSizeBtn, 'disabled');\n } else {\n removeAttribute(selectSizeBtn, 'disabled');\n }\n }\n }\n}\n\n/**\n * @description Update Color Selector with selected color\n * @param {string} selectedColorValue Selected color value\n * @param {Object} data Data object\n */\nfunction updateColorSelector(selectedColorValue) {\n const colorSelectorColor = queryFirst('.js-selected-color-swatch');\n const colorSelectBtns = queryAll('.js-color-select-btn');\n let selectedColorImageUrl = '';\n\n if (colorSelectBtns.length && colorSelectorColor) {\n colorSelectBtns.forEach(colorSelectBtn => {\n if (colorSelectBtn.dataset.attrValue === selectedColorValue) {\n selectedColorImageUrl = colorSelectBtn.dataset.imgUrl;\n addClass(colorSelectBtn, 'selected');\n } else {\n removeClass(colorSelectBtn, 'selected');\n }\n });\n\n colorSelectorColor.style.backgroundImage = `url(${selectedColorImageUrl})`;\n }\n}\n\n/**\n * @description Handle click on fitSize select button\n * @param {Event} event DOM event\n * @param {Object} response DOM event\n */\nfunction onAttributeSelected(event, response) {\n const variationAttributes = response?.data?.product?.variationAttributes;\n let newSizeContainerHeight;\n\n if (variationAttributes) {\n updateFitSizeAccordions(response.data.product.variationAttributes);\n\n const colorAttr = variationAttributes.find(attr => attr.id === 'color');\n\n if (colorAttr) {\n const selectedColorValue = colorAttr.values.find(colorValue => colorValue.selected);\n\n if (selectedColorValue) {\n updateColorSelector(selectedColorValue.value);\n }\n }\n }\n\n newSizeContainerHeight = sizeContainerEl.clientHeight;\n\n // change scroll position if size container height changes\n if (!hasClass(stickyCTAContainer, hiddenClass) && initSizeContainerHeight !== newSizeContainerHeight) {\n scrollTo(window.scrollY + newSizeContainerHeight - initSizeContainerHeight, 0);\n }\n\n initSizeContainerHeight = newSizeContainerHeight;\n handleButton(response, queryFirst('.js-sticky-cta-two'));\n}\n\n/**\n * @description Show all fit size selectors\n */\nfunction showAllFitsSelectors() {\n const fitSizeSelectAccordions = queryAll('.js-fit-size-accordion');\n\n if (fitSizeSelectAccordions) {\n fitSizeSelectAccordions.forEach(fitSizeSelectAccordion => removeClass(fitSizeSelectAccordion, hiddenClass));\n }\n}\n\n/**\n * @description Handle click on fitSize select button and trigger click on fitSize tab on product details\n * @param {Event} event DOM event\n */\nfunction onFitSizeSelectClick(event) {\n const selectedFitValue = event.target.dataset.attrValue;\n\n if (!hasClass(event.target, 'collapsed')) {\n showAllFitsSelectors();\n } else {\n hideUnselectedFits(selectedFitValue);\n }\n\n $(`.pdp-product-details .non-color-attribute.fit-product-type[data-attr-value=\"${selectedFitValue}\"]`)\n .trigger('click');\n}\n\n/**\n * @description Handle click on size selector to collapse fit accordions\n * @param {Event} event DOM event\n */\nfunction onSizeSelectorClick() {\n const fitSizeSelectBtns = queryAll('.js-selected-fit-btn');\n\n if (fitSizeSelectBtns && fitSizeSelectBtns.length) {\n fitSizeSelectBtns.forEach(fitSelectBtn => {\n if (!hasClass(fitSelectBtn, 'collapsed')) {\n const contentSelector = fitSelectBtn.dataset.target;\n const content = queryFirst(contentSelector);\n\n addClass(fitSelectBtn, 'collapsed');\n setAttribute(fitSelectBtn, 'aria-expanded', false);\n removeClass(content, 'show');\n }\n });\n }\n\n showAllFitsSelectors();\n}\n\n/**\n * @description Update CTA when size selected (update selected size and Add To Cart button)\n * @param {Event} event DOM event\n * @param {Object} data Data object\n */\nfunction onPdpSizeSelected(event, data) {\n const { selectedSizeElement } = data;\n const selectedSizeValue = selectedSizeElement.dataset.attrValue;\n const selectedSizeTitle = queryFirst('.js-selected-size-title');\n const prevSelectedSize = queryFirst('.js-size-select-btn.selected');\n const sizeBtnToSelect = queryFirst(`.js-size-select-btn[data-attr-value=\"${selectedSizeValue}\"]`);\n\n handleButton(data, queryFirst('.js-sticky-cta-two'));\n\n if (prevSelectedSize) {\n removeClass(prevSelectedSize, 'selected');\n }\n\n selectedSizeTitle.innerText = `: ${selectedSizeValue}`;\n addClass(sizeBtnToSelect, 'selected');\n}\n\n/**\n * @description Handle color option button click\n * @param {Event} event DOM event\n */\nfunction onColorSelect(event) {\n const selectedColorValue = event.target.dataset.attrValue;\n\n $(`.color-attribute[data-attr-value=\"${selectedColorValue}\"]`).trigger('click');\n\n updateColorSelector(selectedColorValue);\n\n $('.js-selected-color-swatch-btn').trigger('click');\n}\n\n/**\n * @description Handle size option button click in CTA size selector\n * @param {Event} event DOM event\n */\nfunction onSizeSelect(event) {\n const selectedSizeValue = event.target.dataset.attrValue;\n\n $(`.pdp-product-details .size-container .size-btn[data-attr-value=\"${selectedSizeValue}\"]`).trigger('click');\n $('.js-selected-size-btn').trigger('click');\n}\n\n/**\n * @description Handle clicks on size selector\n * @param {Event} event DOM event\n */\nfunction onSizeSelectContainerClick(event) {\n const target = event.target;\n\n if (hasClass(target, 'js-size-select-btn')) {\n onSizeSelect(event);\n }\n\n if (hasClass(target, 'js-selected-size-btn')) {\n onSizeSelectorClick(event);\n }\n\n if (hasClass(target, 'js-selected-fit-btn')) {\n onFitSizeSelectClick(event);\n }\n}\n\n/**\n * @description Init second sticky CTA functionality\n * @param {JQuery} ctaElement DOM element for CTA component\n */\nfunction initSecondStickyCTA(ctaElement) {\n const addToCartBtnCTA = queryFirst('.js-sticky-add-to-cart', ctaElement);\n\n $('body').on('product:pdpSizeSelected', onPdpSizeSelected);\n $('body').on('product:afterAttributeSelect', onAttributeSelected);\n\n addToCartBtnCTA.addEventListener('click', () => {\n const selectedSize = queryFirst('.size-btn.selected');\n\n if (selectedSize) {\n $(addToCartBtn).trigger('click');\n } else {\n addClass(sizeHeaderEl, 'm-error');\n }\n });\n\n queryFirst('.js-notify-cta', ctaElement).addEventListener('click', () => {\n $(notifyMeBtn).trigger('click');\n });\n\n const colorSelectBtns = queryAll('.js-color-select-btn', ctaElement);\n\n if (colorSelectBtns) {\n colorSelectBtns.forEach((colorSelectBtn) => {\n colorSelectBtn.addEventListener('click', onColorSelect);\n });\n }\n\n const sizeSelectContainer = queryFirst('.js-size-select-container', ctaElement);\n\n sizeSelectContainer.addEventListener('click', onSizeSelectContainerClick);\n}\n\n// CTA functionality Initialization\n\n/**\n * @description Handles Add To Cart button intersection\n * @param {Array} entries Intersection Entries\n */\nfunction onIntersection(entries) {\n if (entries && (entries[0].isIntersecting\n || (!entries[0].isIntersecting && entries[0].boundingClientRect.bottom < headerHeight))) {\n stickyCTAContainer.classList.toggle(hiddenClass, entries[0].isIntersecting);\n\n if (!initSizeContainerHeight) {\n initSizeContainerHeight = sizeContainerEl.clientHeight;\n }\n }\n}\n\n/**\n * @description Initialize Add To Cart sticky CTA\n */\nfunction initStickyCta() {\n if (stickyCTAContainer && addToCartBtn) {\n observer = new IntersectionObserver(onIntersection, {\n threshold: 0.01,\n rootMargin: header ? `-${headerHeight}px 0px ${headerHeight}px 0px` : '0px'\n });\n\n observer.observe(addToCartBtn);\n\n const firstStickyCTA = queryFirst('.js-sticky-cta-one');\n const secondStickyCTA = queryFirst('.js-sticky-cta-two');\n\n if (firstStickyCTA) {\n initFirstStickyCTA(firstStickyCTA);\n }\n\n if (secondStickyCTA) {\n initSecondStickyCTA(secondStickyCTA);\n }\n }\n}\n\nif (window.matchMedia('(max-width: 767px)').matches) {\n initStickyCta();\n}\n","'use strict';\n\nimport quickView from './quickView';\n\nexport default {\n showQuickview: quickView.showQuickview,\n focusQuickview: quickView.focusQuickview,\n trapQuickviewFocus: quickView.trapQuickviewFocus,\n hideDialog: quickView.hideDialog,\n updateAttribute: quickView.updateAttribute,\n updateAddToCart: quickView.updateAddToCart,\n updateAvailability: quickView.updateAvailability\n};\n","'use strict';\n\nimport { queryFirst, addClass, removeClass } from '../domUtil';\nimport { getJSON } from '../util';\n\nconst $body = $('body');\nconst hiddenClass = 'd-none';\n\nexport default {\n validateEmail: function () {\n $body.on('blur', '.notify-email', e => {\n const { target } = e;\n const { value } = target;\n const emailFormGroup = target.closest('.form-group');\n const emailError = queryFirst('.email-error', emailFormGroup);\n const { missingError, patternMismatch } = target.dataset;\n const invalidClass = 'is-invalid';\n if (!value) {\n addClass(target, invalidClass);\n emailError.textContent = missingError;\n } else if (target.checkValidity && !target.checkValidity()) {\n addClass(target, invalidClass);\n emailError.textContent = patternMismatch;\n } else {\n removeClass(target, invalidClass);\n }\n });\n },\n notifyMeSubmit: function () {\n $body.on('submit', '.notify-form', e => {\n e.preventDefault();\n const { target } = e;\n const actionUrl = target.getAttribute('action');\n const checkBoxValue = queryFirst('.notify-checkbox', target);\n const isChecked = checkBoxValue && checkBoxValue.value === 'true';\n const data = {\n productID: queryFirst('.notify-pid', target).value,\n email: queryFirst('.notify-email', target).value,\n subscribe: isChecked\n };\n $('.notify-form').spinner().start();\n getJSON(actionUrl, 'POST', data, (data) => {\n const confirmMessage = data.message;\n const notifyMeCntr = target.closest('.notify-me-container');\n const notifyMeDesc = queryFirst('.notify-me-desc', notifyMeCntr);\n addClass(notifyMeDesc, hiddenClass);\n addClass(target, hiddenClass);\n const notifyConfirm = queryFirst('.notify-me-confirm', notifyMeCntr);\n notifyConfirm.textContent = confirmMessage;\n removeClass(notifyConfirm, hiddenClass);\n removeClass(queryFirst('.footer-close-link', notifyMeCntr), hiddenClass);\n $.spinner().stop();\n }, () => {\n $.spinner().stop();\n });\n });\n },\n notifyMeCloseCTA: function () {\n // Code to close the nearest boostrap modal\n $body.on('click', '.lp-slideout-modal .close-current-modal', e => {\n e.preventDefault();\n const currentModal = $(e.target).closest('.lp-slideout-modal');\n\n if (currentModal.length) {\n currentModal.modal('hide');\n }\n });\n }\n}","'use strict';\n\nimport { matchesBreakpoint, queryFirst, queryAll } from './domUtil';\nimport { stickyScrollPosition } from './util';\nimport { sauce } from 'fitpredictor/product/secretsauce';\nimport detail from './product/detail';\nimport stickyCTA from './product/stickyCTA';\nimport pdpQuickView from './product/pdpQuickView';\nimport notifyMe from './components/notifyMe';\n\nvar processInclude = require('base/util');\n\n$(document).ready(function () {\n processInclude(require('./components/shippingPreference'));\n processInclude(detail);\n processInclude(notifyMe);\n processInclude(require('./components/imageSlider'));\n processInclude(require('./components/modal'));\n processInclude(require('./components/pickUpInStore'));\n processInclude(require('instore/product/pdpInstoreInventory'));\n if (!!queryFirst('#fitPredictorEnabled')) {\n sauce($('.product-detail.product-wrapper'));\n }\n processInclude(require('./product/monogram'));\n const pdpContainer = queryFirst('.pdp-container');\n if (pdpContainer) {\n const selectedSize = queryFirst('.size-btn.selected');\n if (selectedSize) {\n selectedSize.click();\n }\n }\n processInclude(pdpQuickView);\n processInclude(stickyCTA);\n\n // Afterpay\n require('./afterpay')({\n anchors: '.product-price-row',\n renderMode: 'adjacent',\n observerTargets: '.prices',\n priceTargets: ['.sales .price-value', '.list .price-value', '.sales .value'],\n showExcluded: false\n });\n\n if (matchesBreakpoint('md')) {\n stickyScrollPosition(queryAll('.pdp-details'));\n }\n});\n"],"names":["module","exports","breakpoints","xs","sm","md","lg","xl","require","queryFirst","selector","parent","arguments","length","undefined","document","querySelector","loadScript","source","isAsync","Promise","resolve","script","createElement","src","async","onload","body","append","loadInput","referrerID","formElement","input","setAttribute","appendChild","queryAll","slice","call","querySelectorAll","getStyles","element","styles","getComputedStyle","_len","rules","Array","_key","map","rule","remove","el","isArray","NodeList","i","n","node","parentElement","removeChild","attr","val","removeAttribute","addClass","_len2","_key2","_el$classList","_node$classList","classList","add","apply","removeClass","_len3","_key3","_el$classList2","_node$classList2","toggleClass","_len4","_key4","_el$classList3","_node$classList3","toggle","hasClass","_len5","classes","_key5","every","className","contains","throttle","callback","limit","waitCallback","isThrottling","_len6","args","_key6","returnValue","_this","setTimeout","debounce","timer","minimumDelay","options","condition","unrestrictedCallback","_len7","_key7","clearTimeout","toArray","_len8","_key8","reduce","results","arg","concat","target","newTarget","array","makeArray","outerHeight","offsetHeight","parseInt","marginTop","marginBottom","isInViewportCheck","scroll","window","scrollY","pageYOffset","boundsTop","getBoundingClientRect","top","numberOfViewportToCheck","dataset","nextViewportLazyLoad","viewport","innerHeight","bounds","clientHeight","isInViewport","rect","bottom","right","left","innerWidth","documentElement","clientWidth","emptyCart","message","forEach","cartElement","innerHTML","scrollTo","y","duration","$","getLastElementInRow","nextElementSibling","sibling","offsetTop","scrollHeight","previousElementSibling","updateUrlQueryParam","fragment","queryParamsElement","permaLink","history","pushState","path","value","newUrl","location","href","split","getCharacterCount","waitForElement","scope","timeout","reject","elements","observer","MutationObserver","mutations","self","disconnect","observe","childList","subtree","bind","eventTypes","eventCondition","_options$bindEngine","bindEngine","_options$once","once","type","trim","useJQuery","String","toLowerCase","_options$targetSelect","targetSelectors","handler","e","extraData","Element","jQuery","Event","data","targetElement","result","closest","_targetElement","$element","eventType","off","removeEventListener","on","addEventListener","getProductData","variationGroupId","originalPrice","productPrice","isPreorder","productData","getNestedValue","container","containerData","monetatePid","isQuickview","_window","productInfo","productInventory","pid","wishlistId","masterId","masterid","productName","productSize","swatchName","colorCode","attrValue","productId","find","id","indexOf","colorEl","swatchButton","attrDisplayvalue","textContent","tileEl","standardPrice","price","groupId","productNameEl","productSizeEl","valueId","originalPriceEl","pop","productPriceEl","productColorEl","productColor","matchesBreakpoint","breakpoint","matchMedia","matches","getCSRFToken","token","renderFragment","html","template","content","getCookieMap","cookie","keyValue","_keyValue$trim$split2","key","decodeURIComponent","validateDate","monthSelector","getElementById","dateSelector","m","d","mlength","labelOption","Option","text","option","toString","selected","getISOCodeByLocale","locale","replace","validateEmail","email","test","obj","keyString","replaceValues","filter","o","_arrayLikeToArray","r","a","isFitPredictorEnabled","noop","c","getPriceFromContainer","priceContainerId","parseFloat","getPrice","getSalePrice","getSelectedColor","colorElement","getSelectedSize","sizeElement","getSizes","sizeArray","size","push","startFP","ssp","getAvailableSizes","getFitName","selectedFitElement","fitName","hasAttribute","fitSwatchName","getAttribute","updateProductSetData","$container","context","sizes","availableSizes","each","this","first","salePrice","color","selectedFitName","sizeType","productContext","$giftCardAmount","useSale","prediction","event","productContainer","service","sizeOption","trigger","Object","entries","handleColor","attribute","handleSize","sauce","deviceWidth","channelValue","custID","screen","width","layout","currency","language","market","shippingCountry","userId","emailHash","pt","pageContext","setupTrigger","initializeDom","ssAddToCart","_container$dataset","variantId","quantity","startOM","startSF","updateProductData","newColor","setSelectedColor","newSize","setSelectedSize","newPrice","priceElement","setPrice","newSalePrice","salesPriceElement","setSalePrice","exported","_ref","_ref2","_arrayWithHoles","l","t","Symbol","iterator","u","f","next","done","return","_iterableToArrayLimit","constructor","name","from","_unsupportedIterableToArray","TypeError","_nonIterableRest","alias","method","featureSwitch","commonjsGlobal","global","NumeralFormatter","numeralDecimalMark","numeralIntegerScale","numeralDecimalScale","numeralThousandsGroupStyle","numeralPositiveOnly","stripLeadingZeroes","prefix","signBeforePrefix","tailPrefix","delimiter","owner","groupStyle","thousand","delimiterRE","RegExp","lakh","wan","none","prototype","getRawValue","format","parts","partSign","partSignAndPrefix","partInteger","partDecimal","NumeralFormatter_1","DateFormatter","datePattern","dateMin","dateMax","date","blocks","reverse","x","unshift","initBlocks","getISOFormatDate","addLeadingZero","getBlocks","getValidatedDate","index","sub","sub0","rest","getFixedDateString","day","month","year","dayIndex","monthIndex","yearIndex","dayStartIndex","monthStartIndex","yearStartIndex","fullYearDone","getFixedDate","getRangeFixedDate","previous","current","addLeadingZeroForYear","Math","min","isLeapYear","number","fullYearMode","DateFormatter_1","TimeFormatter","timePattern","timeFormat","time","getISOFormatTime","getTimeFormatOptions","maxHourFirstDigit","maxHours","maxMinutesFirstDigit","maxMinutes","getValidatedTime","timeFormatOptions","getFixedTimeString","second","minute","hour","secondIndex","minuteIndex","hourIndex","secondStartIndex","minuteStartIndex","hourStartIndex","getFixedTime","TimeFormatter_1","PhoneFormatter","formatter","setFormatter","phoneNumber","clear","validated","iMax","inputDigit","charAt","PhoneFormatter_1","CreditCardDetector","uatp","amex","diners","discover","mastercard","dankort","instapayment","jcb15","jcb","maestro","visa","mir","unionPay","general","re","getStrictBlocks","block","total","prev","getInfo","strictMode","matchedBlocks","CreditCardDetector_1","Util_1","strip","getPostDelimiter","delimiters","matchedDelimiter","getDelimiterREByDelimiter","getNextCursorPosition","prevPos","oldValue","newValue","getPositionOffset","oldRawValue","newRawValue","lengthOffset","stripDelimiters","abs","letter","headStr","str","getMaxLength","getPrefixStrippedValue","prefixLength","prevResult","noImmediatePrefix","prevValue","getFirstDiffIndex","getFormattedValue","blocksLength","delimiterLazyShow","multipleDelimiters","currentDelimiter","fixPrefixCursor","appendix","setSelectionRange","len","checkFullSelection","getSelection","ex","setSelection","position","doc","getActiveElement","createTextRange","range","move","select","console","warn","activeElement","shadowRoot","isAndroid","navigator","userAgent","isAndroidBackspaceKeydown","lastInputValue","currentInputValue","DefaultProperties_1","assign","opts","creditCard","creditCardStrictMode","creditCardType","onCreditCardTypeChanged","phone","phoneRegionCode","phoneFormatter","timeFormatter","dateFormatter","numeral","swapHiddenInput","numericOnly","uppercase","lowercase","rawValueTrimPrefix","copyDelimiter","initValue","delimiterLength","root","_typeof","maxLength","backspace","onValueChanged","Cleave","hasMultipleElements","Error","properties","DefaultProperties","init","pps","Util","isBackward","onChangeListener","onChange","onKeyDownListener","onKeyDown","onFocusListener","onFocus","onCutListener","onCut","onCopyListener","onCopy","initSwapHiddenInput","initPhoneFormatter","initDateFormatter","initTimeFormatter","initNumeralFormatter","onInput","inputFormatter","cloneNode","parentNode","insertBefore","elementSwapHidden","numeralFormatter","AsYouTypeFormatter","charCode","which","keyCode","inputType","postDelimiter","postDelimiterBackspace","copyClipboardData","textToCopy","inputValue","clipboardData","setData","preventDefault","postDelimiterAfter","updateValueState","toUpperCase","updateCreditCardPropsByValue","creditCardInfo","endPos","selectionEnd","callOnValueChanged","rawValue","setPhoneRegionCode","setRawValue","destroy","Cleave_1","exportName","VENDOR_PREFIXES","TEST_ELEMENT","TYPE_FUNCTION","round","now","Date","setTimeoutContext","fn","bindFn","invokeArrayArg","hasOwnProperty","deprecate","deprecationMessage","stack","log","output","nextKey","extend","dest","merge","keys","inherit","child","base","childP","baseP","create","_super","boolOrFn","ifUndefined","val1","val2","addEventListeners","types","splitStr","removeEventListeners","hasParent","inStr","inArray","findByKey","uniqueArray","sort","values","b","prefixed","property","prop","camelProp","_uniqueId","getWindowForElement","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","COMPUTE_INTERVAL","INPUT_START","INPUT_END","INPUT_CANCEL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","PROPS_XY","PROPS_CLIENT_XY","Input","manager","inputTarget","domHandler","ev","enable","inputHandler","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","deltaX","deltaY","computeDeltaXY","offsetDirection","getDirection","start","end","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","MouseInput","pressed","button","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","touch","DEDUP_TIMEOUT","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_POSSIBLE","STATE_FAILED","Recognizer","defaults","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","handlers","oldCssProps","inputClass","toggleCssProps","item","recognizeWith","requireFailure","cssProps","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","force","stopped","curRecognizer","existing","events","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_MOVE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","Tap","Pan","Swipe","Pinch","Rotate","Press","define","_require","formatMessage","afterpayTimeout","elementArray","items","afterpay","_options$alwaysShow","alwaysShow","anchors","observerTargets","priceTargets","renderMode","renderTarget","_options$showExcluded","showExcluded","_options$thresholds","thresholds","_options$logoPosition","logoPosition","presentAfterpay","afterpayPrefsEl","afterpayPrefs","apConfig","afterpayLogoColor","exclusions","JSON","parse","apThresholds","minMaxThreshold","max","updateAmount","config","stringValue","isDecimalValue","intValue","amount","observerTarget","innerText","renderAfterpay","instance","anchor","mode","_config$minMaxThresho","notWithinThreshold","excluded","hidden","_getProductData","afterpayNode","afterpayMessage","firstChild","lastToken","tokenText","excludedMultiSuffix","notWithinThresholdMessage","instanceNode","insertAdjacentElement","replaceChild","instanceConfig","anchorObserverTargets","priceValue","isNaN","apInstance","updateAmazonPayButton","isCartPage","errorTextTemplate","checkoutContainerEl","checkoutContainer","showClass","scrollToError","formEl","headerEl","headerHeight","invalidEl","validateForm","valid","checkValidity","stopPropagation","stopImmediatePropagation","validity","clearForm","form","enableOrDisableButton","disabled","getValidationMessage","validationMessage","$this","patternMismatchValue","rangeErrorValue","missingErrorValue","badInputErrorValue","stepMismatchErrorValue","_this$validity","patternMismatch","rangeOverflow","rangeUnderflow","tooLong","tooShort","valueMissing","badInput","stepMismatch","onFormInvalidHandler","setCustomValidity","parents","onFormSubmit","validateInputs","getAddressValidationHandler","addressLengthLimit","addressForm","timeoutID","formHelpers","addressEl","loadFormErrors","toPrimitive","_toPrimitive","_toPropertyKey","defineProperty","enumerable","configurable","writable","invalid","ajaxFormInvalid","formElSelector","submit","ajaxFormSubmit","validateAddressForm","address1","address2","addressLimit","addressValidationHandler","validateCheckoutForm","guestCustomerForm","registeredCustomerForm","shippingForm","billingForm","submitShippingBtn","billingAddress","reauthForm","submitReauthBtn","spinner","submitCustomerBtn","submitCustomerLoginBtn","shippingAddress1","shippingAddress2","shippingAddressLimit","shippingAddressValidationHandler","billingAddress1","billingAddress2","billingAddressLimit","billingAddressValidationHandler","click","errorElement","shippingError","addressMode","customerType","giftMessageEl","submitPaymentBtn","isPaymentDisabled","isCreditTabActive","isNewPayment","isRequired","savedPaymentCvv","required","checkoutStage","link","enableFormSubmitButton","$form","isFieldsMatched","newFieldValue","confirmFieldValue","matchId","confirmEl","isFieldMatched","mismatchError","selectorContainer","notMatchedClass","matchedClass","thisValue","regexPattern","regexpattern","buttonClick","functions","SCROLLABLE_CONTENT_SELECTOR","initSpecificCarousel","scrollableContainerEl","parentEl","leftArrowEl","scrollLeft","offsetWidth","behavior","rightArrowEl","scrollWidth","initCarousel","hasEtmc","_etmc","trackCart","trackPageView","trackWishlist","setUserInfo","startCoord","isTouchingCarousel","$window","$document","$body","activeClass","initScrollSlider","carousels","carousel","indicators","slideItem","slideIndicatorPosition","relatedTarget","handleDesktopCarousel","initOnce","currentScrollPos","ticking","carouselIndicatorScroll","sliderContainer","sliderContainerOffsetTop","offsetParent","getOffsetTop","sliderContainerOffsetEnd","scrollDistance","activeIndex","some","requestAnimationFrame","handleCarouselOnScroll","ready","response","carouselIndicatorsElement","resize","pdpCarouselEl","minHeight","currentCoord","coordsAreNumbers","cancelable","passive","currentModal","modal","css","overflow","_require2","NOT_AVAILABLE_STATUS","PREORDER_STATUS","PDPNarvarEDD","johnnyWasUtils","isEDDEnabled","EDD_INFO_SELECTOR","isEDDApplicable","availabilityStatus","injectEDDInfo","productContainerEl","eddEl","estimatedDeliveryTime","removeEDDInfo","cartTemplates","cart","approachingDiscountsTemplates","approachingDiscounts","promoTemplates","promo","displayFlex","emptySFL","registeredUserEmailEl","registeredUserEmail","boltCheckoutAccountExistEl","invisible","validateBasket","error","errorHtml","errorMessage","empty","resources","emptyCartMsg","numItems","cartErrors","minicartCountOfItems","title","couponErrorMessage","checkoutButtonElement","expressCheckoutSection","gwpProductsLength","chooseGwpMessage","HIDDEN_CLASS","grandTotalVal","cartPage","zeroTotal","boltCheckoutCtaEl","_checkoutButtonElemen","isBoltEnable","isBoltUserLoggedIn","checkBoltAccountUrl","encodeURIComponent","ajax","url","success","has_bolt_account","enableOrDisableCheckoutButton","hiddenClass","toggleLocationIcon","isGeolocationAllowed","locationInactiveIcon","locationActiveIcon","isSetPage","ispuContainer","ispuModalContainer","pickUpInStoreButton","isRecognizedUser","ispuClosestParent","isInCartPage","isInPdpPage","handleStoreResults","noStoresMessage","storeResults","productDetails","storesResultsHtml","preferredStore","setItemInLocalStorage","PREFERRED_STORE_ID","ID","noStoresErrorMessage","handleConfirmStoreResults","storeConfirm","storeForm","errorCallBack","handleInStore","locationData","latitude","longitude","address","actionUrl","forceGeoLocation","ispuContainerDataset","products","editStore","inputSearchParameter","selectStoreView","storeId","getItemFromLocalStorage","storeID","getJSON","handlePreferredStore","currentTarget","_currentTarget$datase","googleKey","mixinData","includeGoogleMaps","uuid","geolocate","_event$currentTarget$","getLatLong","isEditStore","storePickupInfo","ispuLineItems","ispuLineItemsData","productsInfo","stringify","ispuLineItem","_ispuLineItem$dataset","_ispuContainer$datase","lineItemErrorMessage","cartProductsHtml","discountsHtml","totals","couponsEl","discounts","shippingMethod","promotionsListContainer","cartShippingMethodContainer","checkoutShippingMethodContainer","promotionsHtml","promoTemplate","promoContainer","promoText","promoTitle","promoValue","description","eachDiscount","applied","couponData","relationship","couponCode","totalPrice","callOutMsg","isDiscounted","shippingLabel","displayName","shippingCost","estimatedArrivalTime","checkoutDiscountShipping","adjustedShippingCost","checkoutNormalShipping","updatePromoCodeDetails","selectedShippingMethod","giftWrapQuantity","giftWrapTotalPrice","giftWrapISPUTotalPrice","giftWrapISPUQuantity","giftWrapContainer","giftWrapISPUContainer","nonCouponContainer","freeprice","formattedPrice","cartWithSFLCountTotal","numberOfItems","subTotal","totalAmount","totalTax","orderLevelDiscountTotal","formatted","nonCouponPromotionsHTML","nonCouponBasedAdjustments","couponItem","nonCouponBasedAdjustmentTemplate","discountPrice","renderedPromotions","UUID","priceTotal","renderedPrice","renderedPromoPrice","appliedPromotions","promoMsg","finalSaleMessageContainer","saleMsg","finalSaleMsg","finalsalemsg","isFinalSale","updateCartTotals","findStoreSubmit","confirmSection","geolocateError","appendToUrl","shippingPreferences","ispuSelectStyleMessageTmpl","isShippingPreferencesViewEnabled","_require4","getChangeStoreLinkEl","getSelectedPreferenceEl","getShippingPreferencesContainerEl","getISPUradioButtonEl","getSelectedSizeEl","getShipToAddressradioButtonEl","getISPUPreferenceContentEl","addStoreNameClass","removeStoreNameClass","selectISPURadioButton","selectShipToRadioButton","getPreferedShippingPreference","disableISPURadioButton","disableShipToRadioButton","getShipToAddressContentEl","updateVisibilityOfLowInventoryMsg","getAvailableForInStorePickup","_require5","updateShipToInventoryMessages","updateISPUInventoryMessages","clearAllInventoryMessages","updateServiceResponseMessage","clearServiceResponseMessage","_require6","injectISPUDeliveryMessage","clearISPUDeliveryMessage","showISPUDeliveryMessage","hideISPUDeliveryMessage","_require7","getStoreDetailEl","addStoreDetail","_require8","_require9","EMPTY_STRING","_require10","DISABLED_CLASS","PRODUCT_DETAIL_CONTAINER_SELECTOR","SHIPPING_PREFERENCES_CONTAINER_SELECTOR","ISPU_SELECT_STYLE_MESSAGE_SELECTOR","ISPU_SERVICE_ERROR_ATTR_NAME","ISPU_RADIO_VALUE","SHIP_TO_RADIO_VALUE","SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR","CHANGE_STORE_LINK_SELECTOR","SHIPPING_PREFERENCE_KEY","RADIO_BUTTON_LABEL_SELECTOR","STORE_DETAIL_SELECTOR","ISPU_INFO_MESSAGE_SELECTOR","PDP_CONTAINER_SELECTOR","AVAILABILITY_MSG_SELECTOR","NOT_AVAILABLE_CLASS","ISPU_SERVICE_BLOCKED","PDP_SET_PAGE","PRE_ORDER_CLASS","SHIP_TO_LOW_INVENTORY_CLASS","$shippingPreferenceContainer","shippingPreferencesConfig","isEnabled","messages","reasonCodes","inventoryCache","clearAllMessages","resetPreferences","shipToRadioButtonEl","shipToAddressContentEl","ispuRadioButtonEl","ispuPreferenceContentEl","handleISPUInventoryResponse","isPDPSetPage","storeDetailEl","changeStoreLinkEl","selectedSizeEl","ispuProductInventory","instorePickupStoreMsg","checked","ispuAvailabilityMessageEl","selectStylesMessage","updateOutOfStockSizeForIspu","productISPUInventoryJSON","varients","wrapErrorMessage","reasonCode","NO_STORES_FOUND","STORES_SERVICE_DOWN","STORE_UNAVAILABLE","pdpContainer","selectedColorValue","variationGroup","sizeBtn","attributeValue","getVariationJson","storeAvailability","preferISPU","shippingPreferencesContainerEl","preferenceIspuLabel","preferenceShipToAddressLabel","changeStoreLabel","shippingPreferencesHTML","injectShippingPreferences","selectedSwatchButton","params","skipCall","sessionStoreId","paramHash","urlWithParams","$spinner","variants","handleISPUInventoryError","$event","availabilityElement","storeServiceResponse","ispuInfomessage","noStoresFound","notEligibleISPUMessage","shipToAddressAvailabilityStatus","inStorePickUpAvailabilityStatus","isStorePickUpLowInventory","inStorePickUpAvailabilityMessage","inStorePickUpLowStockMessage","availableForInStorePickup","preferenceValue","ispuContentEl","ispuLabelEl","selectedPreferenceEl","shipToContentEl","shipToLabelEl","radioButtonEl","inStorePickupCTA","STORE_DETAIL_CONTAINER_SELECTOR","ISPU_PREFERENCE_CONTAINER_SELECTOR","ISPU_PREFERENCE_CONTENT_SELECTOR","ISPU_RADIO_SELECTOR","SHIP_TO_ADDRESS_RADIO_SELECTOR","STORE_SERVICE_INFO_MESSAGE_SELECTOR","STORE_AVAILABILITY_MESSAGE_SELECTOR","SHIP_TO_INFO_MESSAGE_SELECTOR","ISPU_STORE_NAME_CLASS","CHECKOUT_HIDDEN_CLASS","PREFERENCE_SELECTOR","SHIP_TO_ADDRESS_CONTENT_SELECTOR","BOLT_PAY","INVENTORY_MSG_SELECTOR","LOW_STOCK_ISPU_SELECTOR","WISHLIST_NAME_REGEX","TRACKER_FUNCTIONAL_COOKIE","LOYALTY_POSTAL_CODE_REGEX","MY_ACCOUNT","ORDER_CONFIRMATION","injectMessageAndUpdateElementState","getISPUNotAvailableMessageEl","getShipToNotAvailableMessageEl","getISPUInventoryLevelMessageEl","getStoreServiceResponseMessageEl","shipToAvailabilityStatus","shipToAvailableMessageEl","notAvailableShipToMessage","ispuAvailabilityStatus","ispuAvailabilityMessage","ispuLowInventoryMessage","ispuNotAvailableMessageEl","ispuInventoryLevelMessageEl","ispuLowInventoryMessageEl","getISPULowInventoryMessageEl","notAvailableISPUMessage","wrapText","ispuServiceResponseEl","_require3","getISPUDeliveryMessageEl","ispuDeliveryMessageEl","handleNotifyMe","storeNameEl","enableISPUSection","disableISPUSection","enableShipToContent","disableShipToContent","activeStoreFilter","ispuLowStockEl","ispuLowInventory","ispuLowInventoryMsg","notifyMeButton","notifyMeDesc","addToCartSection","selectedSizeElement","selectedSizeValue","selectedColorId","variantGroupData","images","selectedSizeData","isNotifyMeEnabled","forceOutOfStock","available","imageData","ispu","storeDetail","getStoreDetailContainerEl","storeDetailContainerEl","city","stateCode","postalCode","storeDetailHTML","INVALID_CLASS","INVISIBLE_CLASS","NO_SCROLL_CLASS","IS_STICKY_CLASS","SELECTED_CLASS","IN_STOCK_STATUS","KEYCODE_TAB","KEYCODE_ESCAPE","KEYCODE_UP","KEYCODE_DOWN","validateDateOption","googleMapScript","geocoder","head","callBack","mixin","google","maps","Geocoder","geocode","status","GeocoderStatus","OK","geometry","lat","lng","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","formValidation","createErrorNotification","baseLogin","formatPhoneNumber","registrationFormPhone","loyaltyGuestReferralModal","login","one","redirectUrl","dataType","serialize","responseJSON","register","err","resetPassword","resetPasswordDialog","emailEl","handleLogin","loginBtnEl","$loginFormEl","mobileImg","desktopImg","getTimeRemaining","loyaltyWelcomeDialog","loyaltyEnrollNowDialog","invalidClass","exclusiveCarouselIdSelector","loyaltyEarlyAccessRegisterForm","earlyAccessPdpSignInRegistration","swatchImageDownload","swatchImageDownloaded","downloadCtaDesktop","downloadCtaMobile","handleEarlyAccessEnrollModal","welcomeDialogEarlyAccessMsgEl","welcomeDialogMsgEl","removeWelcomeModalShowSession","reload","handlePdpEarlyAccessLoginRegistration","isLoyaltyMember","showWelcomeModal","loyaltyEnrollModalForm","loyaltyEnrollPostalCodeEl","loyaltyGuestEnrollment","closeButton","welcomeSessionUrl","attachLoginRegistrationFormEvents","handleEarlyAccessLogin","earlyAccessCta","accountRegistrationForm","loginForm","signInForm","registerForm","accountHelpEl","earlyAccessRegisterLeft","earlyAccessRegisterRight","loyaltyRegistrationForm","loyaltyLoginForm","loyaltyProgramMemberId","earlyAccessSignIn","optedInToLoyalty","earlyAccessRegistration","hideShowDrawerImage","drawerMobileImg","drawerDesktopImg","desktopImageWrapper","mobileImageWrapper","drawerMobileImgEl","drawerDesktopImgEl","loyaltyDrawerImageView","updateReferralBg","loyaltyReferralBg","_loyaltyReferralBg$da","bgColor","bgImageDesktop","bgImageMobile","setProperty","drawerImage","loyaltyModalEl","withImageEl","withoutImageEl","loyaltyDrawerBackground","updateImgURLOnDownloadCta","selectedWallpaperId","selectTab","imageElement","swatchImageDownloadCtaDesktop","swatchImageDownloadCtaMobile","swatchImageDownloadedCtaDesktop","swatchImageDownloadedCtaMobile","_imageElement$dataset","desktopDownloadedImage","mobileDownloadedImage","wrap","carouselControlsToggle","exclusiveCarousel","carouselControl","lastElementChild","firstElementChild","previousControl","nextControl","hash","exclusiveExperiencesTile","_loop","exclusiveModule","countDownTime","countDownTimer","countDownEle","countDownEleNoDays","countDataMsg","counterMsg","countDataMsgNoDays","timeinterval","setInterval","tokenize","newCountDataMsg","days","clearInterval","updateClock","exclusiveExperiencesCountDown","earlyAccessBtn","loyaltyDrawer","loyaltyAppImage","loyaltyDrawerContent","isAppDrawer","drawerAppImgEl","appImageWrapper","appMobileImgEl","isLoyaltyProgramDrawerClick","isLoyaltyProgramOverviewFromHeader","loyaltyContainer","guestEnrollment","memberSignInEnrollment","loyaltyIsImage","closeButtonLabel","drawerTitle","drawerCloseButtonLabel","drawerTitleE1","drawerCloseButtonE1","ariaLabel","loyaltyEnrollPostalCodeContainer","loyaltyEnrollPostalEl","loyaltyEnrollCheckboxEl","enrollNowSource","loyaltyRemoveClass","loyaltyEnrollNowSubmit","postalCodeEl","referrerIDEl","postalCodeRegex","regexp","invalidFeedback","requestData","lillyLoyaltyProgram","loyaltyUnenrollDashboard","accountLoyaltyDashboard","showWelcomePopup","loyaltyDashboardShow","checkLoyaltyAccess","showEnrollmentModel","imageUrls","modelImages","enrollmentModel","welcomeModel","loyaltyaccesspopupmobile","LoyaltyguestenrollmentnonloyaltyD2x","loyaltywelcomepopupmobile","LoyaltywelcomeloyaltyD2x","loyaltyDashboardOffersTile","expirationDateTime","cardFlippedEl","cardFront","_e$target$dataset","expiryDate","formatString","offerDiscountDialog","offerDiscountTileData","offerDiscountModalData","copyCodeText","getFormatDateString","clipboard","writeText","loyaltyReferralDrawer","referralUrlElement","referralUrl","loyaltyCopyReferralUrl","copyReferralUrl","copyCta","copiedLinkCta","then","loyaltyOopsRefreshSection","successServiceResData","tooltipModule","tooltipInnerData","serviceResHTMLData","updatedToolTip","popContent","tooltipIcon","popover","placement","clickEvent","clicked","scrollableContent","referralModuleBg","referralSection","loyaltyEarlyAccessSignUp","focusHelper","toggleSelectSizeInfo","isEarlyAccessElement","swatchNameTemplate","sizeButtonTemplate","sizeOptionTemplate","gwpSizeTemplate","dialogTemplate","videoThumbnailTemplate","loyalty","$gwpDialog","readyClass","selectedProductClass","notAvailable","loyaltyProfile","isLoyaltyProgramMember","isLoyaltyAuthenticated","isLoyaltyEnabled","isMcEnable","selectedSizeCTA","getPidValue","$el","getQuantitySelector","getQuantitySelected","updateAttrs","attrs","$productContainer","msgs","product","attrsWithSwatches","fitSizes","filteredValues","fitSizeLi","counter","elFitSizeContainer","fitSize","isDirectlyPurchasable","displayValue","selectable","hide","show","isChoiceOfBonusProducts","$attrValue","$swatchButton","siblings","assistiveSelectedText","bonusVariationUrl","removeAttr","processSwatchValues","$bonusProductItem","sizeContainer","singleSize","loopStatus","resetUrl","selectLabel","selectId","sizeOptions","multiDefaultSizeOption","inStock","outOfStockMsg","outOfStock","multiSizeOption","multiSize","productContainerEle","li","selectedSize","variantID","manufacturerSKU","ssSize","insertAdjacentHTML","selectedSizeEle","processNonSwatchValues","updateOptions","$optionEl","handleEarlyAccessCta","isEarlyAccessProduct","earlyAccessLockIcon","earlyAccessWishlistIcon","addToCartCta","earlyAccessPdpEl","earlyAccessGuest","earlyAccessRegistered","createCarousel","imgs","isEarlyAccess","videoUrl","carouselId","displayCounter","pdpPageCarousels","pId","EGCPage","pdpCarouselClass","counterHtml","dataSrc","imageZoomUrl","imagePresetUrl","enableCache","includes","srcset","alt","appendTo","addToWishlistIconPdp","loyaltyEarlyAccessEl","addToCartButtonPdp","loyaltyEarlyAccessLockContainer","firstImageElement","videoTemplate","templateVideoElement","eachElement","load","replaceVideoThumbnailImage","detach","MagicZoom","handleVariantResponse","triggerColorAction","_response$product","variationAttributes","productType","readyToOrder","bonusVariationAtrributes","earlyAccess","videoFile","saleMessageEl","sizeElements","primaryImageUrls","checkout","large","productImageElement","setModalImages","swatchNameElement","selectedSwatch","selectedSwatchName","swatchHtml","swatchNameHtml","selectedSwatchElement","manufacturerID","$priceSelector","replaceWith","promotionElement","variantGroupId","swatchParam","queryParams","UpdatedParams","promotionsPopover","availabilityValue","availabilityMessages","availability","availabilityMsgEl","notPurchasable","updateAvailability","attributes","attributeGroup","label","getAttributesHtml","_response$queryString","_variationAttributes$","fitSizeEle","requestedFitSize","queryString","param","fitSizeIncluded","attributeId","search","eachParam","replaceState","updateQuantities","quantities","optionsHtml","attributeSelect","selectedValueUrl","$choiceOfBonusProductEl","updatedimageSlideArrowPDP","carouselArrows","height","videoThumbnailEl","playPromise","videoThumbnailImgEl","videoComponentSourceEl","video","canvas","ctx","getContext","img","Image","videoWidth","videoHeight","pause","catch","drawImage","toBlob","blob","URL","revokeObjectURL","createObjectURL","_videoComponentSource","xhr","XMLHttpRequest","open","responseType","muted","play","send","fetchAndPlayVideo","updateProductPrice","priceTemplate","priceSection","priceContainer","strikeThroughContainer","salesContainer","fixedPrice","fixedStandardPrice","toFixed","updateSizeElements","variantsList","quickviewProductInfo","_sizeContainer$datase","selectedText","describedby","sizeButtonHtml","eachVariant","eachSize","sizeId","inventoryData","variantData","sizeSwatchNotAvailable","sizeswatchnotavailable","updateImageDetails","imageObj","srcsetPresets","srcsetString","imageScene7","parseHtml","$html","parseHTML","selectedProducts","footer","getOptions","$elOption","urlValue","selectedValueId","optionId","setControlsEnabled","control","methods","editBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","maxBonusItems","addToCartUrl","pliUUID","pageSize","bonusDiscountLineItems","parsedHtml","renderedTemplate","enterDialogMessage","insertAfter","selectedBonusProducts","modalDialog","selectedProductsCount","eachProductList","bonusAccordionContainer","maxCount","maxItems","productListLength","eachProduct","selectedProduct","selectBonusCheckbox","selectedIndex","productDialog","accordionContainer","bonusAccordionElements","addToCart","sizeEl","isSizeSelected","isSelectedSizeUnavailable","children","firstOption","validProducts","chooseBonusProducts","updateProductDetails","currentElement","elementData","swatchContainer","assistiveElements","assistiveTextElement","monogramBtn","_productInfo$variants","shopThePrint","mgFlag","mgLocs","hasWaysToWear","colorElements","customPageTitle","pageTitle","includeLillyColor","lillyColorName","customPageDescription","pageDescription","titleElement","descriptionElement","waysToWearEl","variationGridUrl","colorlabel","colorLabel","longDescriptionElement","longDescription","lillyColor","productFinalSaleMessage","productFreeReturnsMessage","variationUrl","updateContentModules","shopThePrintElement","outerHTML","updateShopThePrint","ssColor","ssSizeElement","carouselContainerEl","carouselContainerHeight","wishlistButton","assistiveText","focusChooseBonusProductModal","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","focusParams","containerSelector","firstElementSelector","lastElementSelector","setTabNextFocus","colorAttribute","productDetailContainer","selectedSizeBtn","notifyMeCTA","addToCartCTA","_productInfo$variants2","pdpBreadCrumbs","monetateData","updateQuickViewDetails","_data$product","selectColorAttribute","renderSizeElements","swatchEl","_productInfo$variants3","selectAttribute","pidsObj","setPids","setMasterPid","storeLocatoreContainer","ispuAddToCart","isSet","triggerSSAddToCart","setModal","setProducts","qty","childProducts","displayModal","addToCartWarningDialog","isOnCartPage","pathname","buttons","primary","redirectLink","modalContentHeading","messageHeading","modalContentBody","messageBodyOnCart","messageBodyOffCart","messageType","handlePostCartAdd","productContainerPrice","selectBonusProduct","$choiceOfBonusProduct","maxPids","totalQty","choiceOfBonusProduct","selectedProductElement","bonusCountElement","selectedCount","enableAddTocart","optionID","selectedBonusProductHtml","removeBonusProduct","$selected","enableBonusProductSelection","bonusProductDialog","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","pidsObject","bonusProducts","qtyOption","revealRecommendations","eachRecommendation","titleEl","productEl","display","handleEarlyAccessPLPLockIcon","earlyAccessPLPContainer","earlyAccessPlpIcon","lockIconContainer","earlyAccessPLPBadge","earlyAccessDate","isEarlyAccessItem","_require$productDetai","availabilityMessageTmpl","restrictedMessageTmpl","availabilityMessageOOS","availabilityMessagePreorder","ispuAvailabilityMessageTmpl","ispuLowStockMessageTmpl","sizeChartClasses","ACTIVE_CLASS","IN_STOCK","NOT_AVAILABLE","PREORDER","handleProductImageZoom","imageObserver","mutationList","_step","_iterator","_n","F","s","_createForOfIteratorHelper","mutation","addedNodes","zoomAlt","pdpImages","pdpIndicators","imageEl","zoomed","mobileZoomed","touchZoom","elm","thisHammer","transform","xPos","yPos","ceil","createTouchZoom","createHoverZoom","not","hiresUrl","zoom","magnify","onSizeChangeHandler","sizeDetailsContainer","selectedSizeErrMsg","assistiveElementOfSelected","_assistiveElementOfSe","updateQuickViewProductInfo","currentSizeElement","quickViewInfo","vgProductDetailsUrl","addToCartButton","productDetailsUrl","fullPDPLink","variantProductDetailsUrl","isLowInventory","selectedColorName","updateScarcityMessage","fitSizeScarcityLabel","ctaScarcityLabel","oosMsg","updateProductInfo","formattedStandardPrice","monogramProductPrice","ispuButton","restrictedMsg","restrictedItem","isGlobaleSession","scarcityMessage","ispuInventoryData","ispuMessage","ispuLowStockMessage","isISPULowInventory","shippingPreferencesEnabled","ispuAvailabilityValue","ispuLowStockValue","lowStockAvailabilityMessage","breadcrumbItems","categoryUrl","pickupImageElement","_ispu$","imageHasLoaded","pickupSalesPrice","pickupStandardPrice","pickupSize","sizeSelected","ispuCheckBoxChecked","monogramImages","monogram","updatedImageData","updateFitSizeTab","fitSizeSelectableCount","fitSizeSelectableConatiner","sizeAccordionEle","fitSizeText","sizeText","fitSizeCount","selectableCount","firstAvailableFit","handleLastLinkTab","sizeChartCatBtn","shiftKey","focus","setDynamicHeight","imgContainer","carouselIndicators","mainImageHeight","maxHeight","_carouselInnerItem$ge","clickedContainerEle","carouselIndicatorsActivedImages","carouselIndicatorsActivedPips","idx","carouselIndicatorsToBeActivedImages","carouselIndicatorsToBeActivedPips","carouselMzThumbSelected","carouselInnerItem","carouselItemImage","carouselMzZoomWindow","newImgSrc","newImgAlt","triggerHandler","imgEle","mzZoomImg","scrollFitRatingToReviews","bvReviews","updateAttribute","_response$data$produc","gtmData","gtmGA4Data","eq","$addToCart","colorVariationObject","selectedSwatchObject","eachValue","$swatchSection","updateSelectedSwatchProductName","selectSizeAttribute","buttonElement","productTileItem","selectedColor","plpItemImage","notifyImageElementMarkup","notifyContainer","sizeLabel","notifySize","notifySizeSeperator","notifySelectedSize","custEmail","notifyForm","notifyConfirm","selectedColorElement","selectedColorIdValue","selectedSizeEleValue","attrUrl","availabilityEle","quickViewCarouselEl","afterAttributeSelect","wishListID","responseContainer","sizeCard","sizeSeparator","_assistiveElementOfSe2","quickviewContainer","availabilityMessageEl","sales","updateCartButton","giftWrapAvailableFlag","giftWrapAvailable","_ispu$2","ssColorElement","pricesObject","list","ssSalesPrice","ssPrice","productSetModal","addAllToToteButton","selectPdpSizeAttribute","allSelectableSwatches","updateAttributesAndDetails","attributesHtml","shortDescription","showSpinner","quickViewModal","allAvailable","allReady","info_selectforstock","sizeChart","$prodSizeChart","$lpSlideout","activeCategoryVal","defaultText","setStickyNav","is","complete","$activeCategoryEl","$lpSizechartTitle","tab","animate","lastLinkEl","handleEarlyAccessLockIcon","productContainerEarlyAccessIcon","earlyAccessItem","handleOflineProduct","offlineContainerEl","getTime","resizeTimeout","selectStyleMessageTmpl","earlyAccessUntilDate","isPDPPage","mainImageEle","notifyImageElement","updatePLPTileHeight","cards","carouselImageHeight","mql","initialMonogramClick","styleMap","singleLetterStyle","doubleLetterStyle","tripleLetterStyle","traditionalLetterStyle","colorMap","rgb","selectedMonogramValues","monogramInitials","monogramStyle","monogramColor","placementSelect","enableContinue","allInputText","monogramData","monogramContinueButton","monogramModalEl","initialsButtons","monongramUlEl","selectedClass","activeViewClass","monogramConfirmationView","detailViewEl","updateMonogramValues","changeSelectedAssistiveText","assistiveElementSelector","selectedElement","selectedAssistiveElement","toggleStyle","monogramDetails","initialsSampleAll","traditionalSampleAll","setInitials","selectStyle","styleSelect","textValue","selectedStyleElement","letter1","letter2","letter3","substr","resetMonogram","monogramLocations","checkMonogram","monogramButton","monogramObject","monogramImageURL","monogramImageSrcSetURL","monogramSelectedColor","monogramProductName","monogramSelectedSize","btnPositionData","monogramPositionHtml","stepTitle","imgURL","appendPositionSwatches","monogramColorHtml","swatch","appendColorSwatches","isTabEnterPressed","elem","parentLI","btnEl","colorRgb","colorName","monogramUrl","monogramProductID","monogramValues","responseData","detail","_require$default","injectAfterpay","injectFitPredictor","injectLongDescription","updateFullProductLink","quickViewTemplates","quickView","header","getNavOffset","attachFormEvents","quickViewFormSelector","showQuickview","$target","quickviewURL","lastElementInRow","selectedProductDescriptionElement","stopSpinner","scrollTop","filledContainers","containerTop","isNewContainerBelow","openContainer","openTagIndex","selectedSwatchEl","gcType","quickViewFullDetailMsg","productUrl","quickViewContainer","earlyAccessGuestSignIn","injectQuickView","srcElement","quickViewModalEl","quickview","getModalHtmlElement","productLineItemEl","lineItemAmountEl","padding","focusQuickview","trapQuickviewFocus","nextToLastElementSelector","hideDialog","beforeUpdateAttribute","updateAddToCart","buttonToUpdate","containerEl","addToWishlist","addToWishlistModal","cartAvailabilityMessageOOS","emptySwatchTemplate","addressSuggestions","suggestionTextTemplate","suggestionsTemplate","discountContainerTemplate","singleDiscountTemplate","multipleDiscountsTemplate","_options$loop","loop","_options$videoUrl","_options$imgUrl","imgUrl","_options$classNames","classNames","_options$autoplay","autoplay","_options$muted","_options$controls","controls","_options$icontitle","icontitle","_options$icondesc","icondesc","imageTemplate","altText","ariaDescribedby","oosMessage","guestEmptyWishlistTemplate","emptyWishlistMessage","emptyWishlistContentAssetBody","emptySFLMessage","continueShopURL","continueShopMsg","signInMsg","signInSFLURL","autoComplete","suggestionLink","suggestion","addressLine","secondaryEntryAddressLine","street_line","secondary","zipcode","suggestionContainer","containerClass","contactUsTemplate","signupMessage","msg","browserWarningTemplate","shippingPreferenceTemplates","ispuRadioLabel","ispuRadioValue","shipToRadioLabel","shipToRadioValue","productDetail","_options$buttons","_options$className","_options$modalContent","_options$modalContent2","_options$id","_options$slideOut","slideOut","buttonSpace","floor","oneTrust","privacyDialogCookieBanner","carouselBadge","string","leftToken","rightToken","operators","_","code","toKebabCase","roundPrice","gePrice","roundingRanges","rg","From","To","intPart","RangeBehavior","RoundingExceptions","LowerTarget","UpperTarget","Threshold","ExceptionValue","TargetBehaviorHelperValue","convertRangeToAbsolute","absoluteRounding","hashValue","startsWith","endsWith","digit","charCodeAt","toDatasetKey","tokens","flag","onSuccess","onError","successCallback","errorCallback","geolocation","getCurrentPosition","coords","localStorage","setItem","getItem","removeItemFromLocalStorage","removeItem","cleave","isMobile","mobileAgentHash","stickyScrollPosition","isTopOnly","topOffset","detailStickyScroll","itemHeight","windowHeight","newTop","handleStickyPositionOnScroll","isUnsupportedBrowser","unsupportedBrowserTypes","sitePrefs","uaFragment","endtime","seconds","minutes","hours","globaleCalculation","salesPrice","countryCurrency","currencySymbol","geSalesPrice","countryCoefficientIncludeVAT","countryVATRate","merchantTaxRate","currenyRate","coefficientRate","useCountryVAT","globaleRoundingRanges","storeLocator","htmlString","fillModalElement","selectedPostalCode","selectedRadius","radius","changeRadius","selectStore","updateSelectStoreButton","deselectStore","storeElement","removeData","updateSelectStore","removeSelectedStoreOnAttributeChange","updateAddToCartFormData","showInStoreInventory","removeStoreSelection","selectStoreWithInventory","searchPID","storeDetailsHtml","$changeStoreButton","searchPostalCode","searchRadius","$quantitySelect","selectorPrefix","productIdSelector","quantitySelector","quantityOptionSelector","quantitySelected","productAtsValue","atsValue","originalHTML","selectedQuantity","updateQOptions","updateQuantityOptions","changeStore","scrollAnimate","parentSelector","fieldErrors","clearPreviousErrors","firstFocusableEl","lastFocusableEl","linkElements","payload","fields","feedbackElement","prepend","receivedMsgHeading","receivedMsgBody","mobile","returnUrl","buttonText","clearResetForm","infowindow","InfoWindow","mapOptions","scrollwheel","LatLng","Map","mapdiv","LatLngBounds","markerImg","fillColor","fillOpacity","strokeColor","strokeWeight","Point","labelOrigin","lable","storeLocation","marker","Marker","icon","fontSize","addListener","setOptions","infoWindowHtml","fitBounds","updateStoresResults","$resultsDiv","$mapDiv","hasResults","stores","searchKey","locations","dialog","urlParams","detectLocation","long","change","searchKeys","selectedStore","include","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","g","globalThis","Function","toStringTag","initSizeContainerHeight","stickyCTAContainer","addToCartBtn","notifyMeBtn","sizeHeaderEl","sizeContainerEl","updateAddToCartButtonTitle","ctaElement","addToCartBtnCTA","addToCartTitle","selectSizeTitle","handleButton","notifyCTA","unobserve","onPdpColorSelected","_response$data","variationSelected","onPdpSizeSelectedOne","updateColorSelector","colorSelectorColor","colorSelectBtns","selectedColorImageUrl","colorSelectBtn","backgroundImage","onAttributeSelected","_response$data2","newSizeContainerHeight","_fitSizeVariation$fil","_fitSizeVariation$fil2","_sizeVariation$filter","_sizeVariation$filter2","_fitSizeVariation$fil3","fitSizeVariation","sizeVariation","sizeAccordionContainer","fitSizeElements","selectedFit","selectedFitValue","selectSizeBtn","sizeItemsMarkup","markup","fitValue","sizeSelectContentMarkup","selectedFitSizeAccordion","updateFitSizeAccordions","colorAttr","colorValue","showAllFitsSelectors","fitSizeSelectAccordions","fitSizeSelectAccordion","onPdpSizeSelected","selectedSizeTitle","prevSelectedSize","sizeBtnToSelect","onColorSelect","onSizeSelectContainerClick","fitSizeSelectBtns","onSizeSelect","fitSelectBtn","contentSelector","selectFitAccordions","selectFitAccordion","hideUnselectedFits","onFitSizeSelectClick","onIntersection","isIntersecting","boundingClientRect","IntersectionObserver","rootMargin","firstStickyCTA","secondStickyCTA","initSecondStickyCTA","initStickyCta","emailFormGroup","emailError","_target$dataset","missingError","notifyMeSubmit","checkBoxValue","isChecked","productID","subscribe","confirmMessage","notifyMeCntr","notifyMeCloseCTA","processInclude","notifyMe","pdpQuickView","stickyCTA"],"sourceRoot":""}