{"version":3,"file":"default/js/productTile.js","mappings":"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","sources":["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/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/shippingPreference/constants.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/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/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/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/../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/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/components/notifyMe.js","webpack://app_custom_jw/./cartridges/app_custom_jw/cartridge/client/default/js/productTile.js"],"sourcesContent":["'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","// 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","// 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 { 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","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\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","'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
    7. ${message}\n Browse Similar Styles

      \n
    8. \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 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","'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};","'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\nvar processInclude = require('base/util');\nimport detail from './product/detail';\nimport notifyMe from './components/notifyMe';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n processInclude(detail.selectSizeAttribute);\n processInclude(detail.afterAttributeSelect);\n processInclude(require('./product/quickView'));\n processInclude(notifyMe);\n});\n"],"names":["_arrayLikeToArray","r","a","length","e","n","Array","isFitPredictorEnabled","document","getElementById","noop","queryFirst","selector","parent","arguments","undefined","querySelector","queryAll","slice","call","querySelectorAll","hasClass","el","classList","c","contains","getPriceFromContainer","priceContainerId","container","price","value","parseFloat","replace","getPrice","getSalePrice","getSelectedColor","colorElement","getSelectedSize","sizeElement","getSizes","sizeArray","forEach","element","size","dataset","attrValue","push","startFP","ssp","getAvailableSizes","getFitName","selectedFitElement","fitName","hasAttribute","fitSwatchName","getAttribute","updateProductSetData","$container","context","sizes","availableSizes","find","each","$","this","attr","productId","data","toString","first","val","salePrice","color","selectedFitName","sizeType","productContext","$giftCardAmount","pid","masterid","useSale","closest","prediction","event","productContainer","service","sizeOption","trigger","setAttribute","module","exports","Object","entries","handleColor","attribute","handleSize","sauce","deviceWidth","channelValue","custID","email","window","screen","width","layout","currency","language","market","shippingCountry","userId","emailHash","pt","type","pageContext","setupTrigger","initializeDom","ssAddToCart","_container$dataset","variantId","quantity","startOM","startSF","updateProductData","newColor","setSelectedColor","newSize","setSelectedSize","newPrice","priceElement","setPrice","newSalePrice","salesPriceElement","setSalePrice","reduce","exported","_ref","_ref2","isArray","_arrayWithHoles","l","t","Symbol","iterator","i","u","f","o","next","done","return","_iterableToArrayLimit","constructor","name","from","test","_unsupportedIterableToArray","TypeError","_nonIterableRest","alias","method","featureSwitch","commonjsGlobal","global","self","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","indexOf","split","NumeralFormatter_1","DateFormatter","datePattern","dateMin","dateMax","date","blocks","reverse","map","x","parseInt","unshift","initBlocks","getISOFormatDate","addLeadingZero","getBlocks","getValidatedDate","result","index","sub","sub0","rest","getFixedDateString","day","month","year","dayIndex","monthIndex","yearIndex","dayStartIndex","monthStartIndex","yearStartIndex","fullYearDone","toLowerCase","getFixedDate","getRangeFixedDate","previous","current","addLeadingZeroForYear","Math","min","isLeapYear","number","fullYearMode","DateFormatter_1","TimeFormatter","timePattern","timeFormat","time","getISOFormatTime","getTimeFormatOptions","String","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","concat","getInfo","strictMode","key","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","setTimeout","checkFullSelection","getSelection","ex","setSelection","position","doc","getActiveElement","createTextRange","range","move","select","console","warn","activeElement","shadowRoot","isAndroid","navigator","userAgent","isAndroidBackspaceKeydown","lastInputValue","currentInputValue","DefaultProperties_1","assign","target","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","bind","onKeyDownListener","onKeyDown","onFocusListener","onFocus","onCutListener","onCut","onCopyListener","onCopy","initSwapHiddenInput","addEventListener","initPhoneFormatter","initDateFormatter","initTimeFormatter","initNumeralFormatter","onInput","inputFormatter","cloneNode","parentNode","insertBefore","elementSwapHidden","id","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","removeEventListener","Cleave_1","exportName","VENDOR_PREFIXES","TEST_ELEMENT","createElement","TYPE_FUNCTION","round","now","Date","setTimeoutContext","fn","timeout","bindFn","invokeArrayArg","arg","obj","hasOwnProperty","deprecate","message","deprecationMessage","stack","log","apply","output","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","childP","baseP","create","_super","boolOrFn","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","removeEventListeners","hasParent","node","inStr","trim","inArray","findByKey","toArray","uniqueArray","sort","results","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","callback","options","inputTarget","domHandler","ev","enable","inputHandler","eventType","input","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","y","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","filter","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","add","recognizeWith","requireFailure","cssProps","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","force","stopped","curRecognizer","existing","remove","on","events","off","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","require","getProductData","formatMessage","afterpayTimeout","elementArray","items","scope","matches","afterpay","_options$alwaysShow","alwaysShow","anchors","observerTargets","priceTargets","renderMode","renderTarget","_options$showExcluded","showExcluded","_options$thresholds","thresholds","_options$logoPosition","logoPosition","presentAfterpay","afterpayPrefsEl","afterpayPrefs","apConfig","afterpayLogoColor","locale","exclusions","JSON","parse","apThresholds","minMaxThreshold","max","updateAmount","config","stringValue","isDecimalValue","intValue","amount","observerTarget","innerText","renderAfterpay","instance","anchor","mode","_config$minMaxThresho","notWithinThreshold","excluded","hidden","_getProductData","masterId","productName","afterpayNode","afterpayMessage","parentElement","firstChild","lastToken","pop","tokenText","excludedMultiSuffix","textContent","notWithinThresholdMessage","instanceNode","insertAdjacentElement","replaceChild","appendChild","instanceConfig","anchorObserverTargets","priceValue","isNaN","apInstance","observer","MutationObserver","mutations","observe","childList","subtree","addClass","isInViewport","removeClass","scrollTo","errorTextTemplate","checkoutContainerEl","checkoutContainer","showClass","scrollToError","formEl","headerEl","headerHeight","offsetHeight","invalidEl","top","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","text","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","innerHTML","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","debounce","SCROLLABLE_CONTENT_SELECTOR","initSpecificCarousel","scrollableContainerEl","parentEl","leftArrowEl","left","scrollLeft","offsetWidth","behavior","rightArrowEl","scrollWidth","initCarousel","hasEtmc","_etmc","trackCart","trackPageView","trackWishlist","setUserInfo","SHIPPING_PREFERENCES_CONTAINER_SELECTOR","STORE_DETAIL_CONTAINER_SELECTOR","ISPU_PREFERENCE_CONTAINER_SELECTOR","ISPU_PREFERENCE_CONTENT_SELECTOR","ISPU_RADIO_SELECTOR","SHIP_TO_ADDRESS_RADIO_SELECTOR","STORE_DETAIL_SELECTOR","STORE_SERVICE_INFO_MESSAGE_SELECTOR","STORE_AVAILABILITY_MESSAGE_SELECTOR","ISPU_INFO_MESSAGE_SELECTOR","SHIP_TO_INFO_MESSAGE_SELECTOR","ISPU_SELECT_STYLE_MESSAGE_SELECTOR","DISABLED_CLASS","NOT_AVAILABLE_CLASS","ISPU_STORE_NAME_CLASS","PRE_ORDER_CLASS","SHIP_TO_LOW_INVENTORY_CLASS","ISPU_SERVICE_ERROR_ATTR_NAME","ISPU_SERVICE_BLOCKED","CHECKOUT_HIDDEN_CLASS","PDP_SET_PAGE","PRODUCT_DETAIL_CONTAINER_SELECTOR","PDP_CONTAINER_SELECTOR","PREFERENCE_SELECTOR","SHIP_TO_ADDRESS_CONTENT_SELECTOR","SHIPPING_PREFERENCE_RADIO_BUTTON_SELECTOR","RADIO_BUTTON_LABEL_SELECTOR","SHIPPING_PREFERENCE_KEY","ISPU_RADIO_VALUE","SHIP_TO_RADIO_VALUE","BOLT_PAY","CHANGE_STORE_LINK_SELECTOR","AVAILABILITY_MSG_SELECTOR","INVENTORY_MSG_SELECTOR","LOW_STOCK_ISPU_SELECTOR","WISHLIST_NAME_REGEX","TRACKER_FUNCTIONAL_COOKIE","LOYALTY_POSTAL_CODE_REGEX","MY_ACCOUNT","ORDER_CONFIRMATION","getNestedValue","_require3","HIDDEN_CLASS","handleNotifyMe","getISPUradioButtonEl","productContainerEl","getShipToAddressContentEl","getShipToAddressradioButtonEl","getISPUPreferenceContentEl","addStoreNameClass","storeNameEl","removeStoreNameClass","getSelectedSizeEl","getChangeStoreLinkEl","getSelectedPreferenceEl","getShippingPreferencesContainerEl","selectISPURadioButton","ispuRadioButtonEl","enableISPUSection","checked","ispuContentEl","disableISPURadioButton","disableISPUSection","selectShipToRadioButton","shipToRadioButtonEl","enableShipToContent","shipToContentEl","disableShipToRadioButton","disableShipToContent","getPreferedShippingPreference","activeStoreFilter","updateVisibilityOfLowInventoryMsg","ispuLowStockEl","availabilityElement","ispuLowInventory","ispuLowInventoryMsg","notifyMeButton","notifyMeDesc","addToCartSection","selectedSizeElement","ispuProductInventory","isSetPage","selectedSizeValue","selectedColorId","variantGroupData","productInfo","variants","images","formattedPrice","selectedSizeData","isNotifyMeEnabled","ID","forceOutOfStock","productInventory","availabilityStatus","productData","available","imageData","ispu","getAvailableForInStorePickup","availableForInStorePickup","breakpoints","xs","sm","md","lg","xl","PREFERRED_STORE_ID","EMPTY_STRING","INVALID_CLASS","INVISIBLE_CLASS","NO_SCROLL_CLASS","IS_STICKY_CLASS","SELECTED_CLASS","PREORDER_STATUS","IN_STOCK_STATUS","NOT_AVAILABLE_STATUS","KEYCODE_TAB","KEYCODE_ESCAPE","KEYCODE_UP","KEYCODE_DOWN","loadScript","isAsync","Promise","resolve","script","async","onload","body","append","loadInput","referrerID","formElement","getStyles","styles","getComputedStyle","_len","rules","_key","rule","NodeList","removeChild","removeAttribute","_len2","_key2","_el$classList","_node$classList","_len3","_key3","_el$classList2","_node$classList2","toggleClass","_len4","_key4","_el$classList3","_node$classList3","toggle","_len5","classes","_key5","every","className","throttle","limit","waitCallback","isThrottling","_len6","_key6","returnValue","_this","timer","minimumDelay","condition","unrestrictedCallback","_len7","_key7","_len8","_key8","newTarget","array","makeArray","outerHeight","marginTop","marginBottom","isInViewportCheck","scroll","scrollY","pageYOffset","boundsTop","getBoundingClientRect","numberOfViewportToCheck","nextViewportLazyLoad","viewport","innerHeight","bounds","clientHeight","rect","bottom","right","innerWidth","documentElement","clientWidth","emptyCart","cartElement","duration","getLastElementInRow","nextElementSibling","sibling","offsetTop","scrollHeight","previousElementSibling","updateUrlQueryParam","fragment","queryParamsElement","permaLink","history","pushState","path","newUrl","location","href","getCharacterCount","waitForElement","reject","elements","disconnect","eventTypes","eventCondition","_options$bindEngine","bindEngine","_options$once","once","useJQuery","_options$targetSelect","targetSelectors","extraData","Element","jQuery","Event","targetElement","_targetElement","$element","variationGroupId","originalPrice","productPrice","isPreorder","containerData","monetatePid","isQuickview","_window","wishlistId","productSize","swatchName","colorCode","colorEl","swatchButton","attrDisplayvalue","tileEl","standardPrice","groupId","productNameEl","productSizeEl","valueId","originalPriceEl","productPriceEl","productColorEl","productColor","matchesBreakpoint","breakpoint","matchMedia","getCSRFToken","token","renderFragment","html","template","content","getCookieMap","cookie","keyValue","_keyValue$trim$split2","decodeURIComponent","validateDate","monthSelector","dateSelector","validateDateOption","m","d","mlength","labelOption","Option","option","selected","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","formValidation","createErrorNotification","baseLogin","_require2","formatPhoneNumber","getItemFromLocalStorage","registrationFormPhone","loyaltyGuestReferralModal","$body","modal","login","one","redirectUrl","url","ajax","dataType","serialize","success","error","responseJSON","register","err","errorMessage","resetPassword","resetPasswordDialog","emailEl","handleLogin","loginBtnEl","$loginFormEl","mobileImg","desktopImg","getTimeRemaining","getJSON","hiddenClass","loyaltyWelcomeDialog","loyaltyEnrollNowDialog","invalidClass","activeClass","exclusiveCarouselIdSelector","loyaltyEarlyAccessRegisterForm","earlyAccessPdpSignInRegistration","_require6","swatchImageDownload","swatchImageDownloaded","downloadCtaDesktop","downloadCtaMobile","handleEarlyAccessEnrollModal","welcomeDialogEarlyAccessMsgEl","welcomeDialogMsgEl","removeWelcomeModalShowSession","reload","handlePdpEarlyAccessLoginRegistration","isLoyaltyMember","postalCode","showWelcomeModal","loyaltyEnrollModalForm","loyaltyEnrollPostalCodeEl","loyaltyGuestEnrollment","closeButton","welcomeSessionUrl","attachLoginRegistrationFormEvents","handleEarlyAccessLogin","earlyAccessCta","actionUrl","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","carousel","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","title","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","couponCode","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","_require4","loyaltyProfile","isLoyaltyProgramMember","isLoyaltyAuthenticated","isLoyaltyEnabled","isMcEnable","selectedSizeCTA","getPidValue","$el","getQuantitySelector","getQuantitySelected","updateAttrs","attrs","$productContainer","msgs","product","attrsWithSwatches","fitSizes","filteredValues","fitSizeLi","counter","elFitSizeContainer","fitSize","isDirectlyPurchasable","displayName","displayValue","selectable","hide","show","isChoiceOfBonusProducts","$attrValue","$swatchButton","siblings","assistiveSelectedText","empty","bonusVariationUrl","removeAttr","processSwatchValues","$bonusProductItem","sizeContainer","singleSize","loopStatus","resetUrl","selectLabel","selectId","sizeOptions","multiDefaultSizeOption","inStock","outOfStockMsg","outOfStock","multiSizeOption","multiSize","productContainerEle","isPDPSetPage","css","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","response","triggerColorAction","_response$product","variationAttributes","productType","readyToOrder","bonusVariationAtrributes","isFinalSale","earlyAccess","videoFile","saleMessageEl","resources","sizeElements","primaryImageUrls","checkout","large","productImageElement","setModalImages","swatchNameElement","selectedSwatch","selectedSwatchName","swatchHtml","swatchNameHtml","selectedSwatchElement","manufacturerID","$priceSelector","replaceWith","promotionElement","promotionsHtml","variantGroupId","swatchParam","queryParams","UpdatedParams","promotionsPopover","availabilityValue","availabilityMessages","availability","messages","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","status","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","stringify","setControlsEnabled","control","methods","editBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","maxBonusItems","addToCartUrl","uuid","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","isEnabled","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","description","longDescription","lillyColor","productFinalSaleMessage","productFreeReturnsMessage","variationUrl","variationGroup","updateContentModules","shopThePrintElement","outerHTML","updateShopThePrint","ssColor","ssSizeElement","carouselContainerEl","carouselContainerHeight","minHeight","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","currentTarget","pidsObj","setPids","setMasterPid","storeLocatoreContainer","ispuAddToCart","ispuModalContainer","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","isShippingPreferencesViewEnabled","_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","totalPrice","monogramProductPrice","ispuButton","restrictedMsg","restrictedItem","isGlobaleSession","scarcityMessage","ispuInventoryData","ispuMessage","ispuLowStockMessage","ispuAvailabilityStatus","isISPULowInventory","shippingPreferencesEnabled","ispuAvailabilityValue","ispuLowStockValue","lowStockAvailabilityMessage","breadcrumbItems","categoryUrl","shipToAddressAvailabilityStatus","inStorePickUpAvailabilityStatus","isStorePickUpLowInventory","inStorePickUpAvailabilityMessage","inStorePickUpLowStockMessage","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","formatted","updateCartButton","giftWrapAvailableFlag","giftWrapAvailable","_ispu$2","ssColorElement","pricesObject","list","ssSalesPrice","ssPrice","productSetModal","addAllToToteButton","selectPdpSizeAttribute","selectedSizeEl","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","ispuSelectStyleMessageTmpl","selectStylesMessage","ispuAvailabilityMessageEl","earlyAccessUntilDate","isPDPPage","mainImageEle","notifyImageElement","updatePLPTileHeight","cards","carouselImageHeight","detail","_require$default","injectAfterpay","injectFitPredictor","injectLongDescription","updateFullProductLink","quickViewTemplates","quickView","$window","header","getNavOffset","attachFormEvents","quickViewFormSelector","showQuickview","$target","quickviewURL","lastElementInRow","selectedProductDescriptionElement","stopSpinner","scrollTop","filledContainers","containerTop","isNewContainerBelow","openContainer","requestAnimationFrame","openTagIndex","substr","selectedSwatchEl","gcType","quickViewFullDetailMsg","productUrl","quickViewContainer","earlyAccessGuestSignIn","injectQuickView","srcElement","quickViewModalEl","quickview","getModalHtmlElement","productLineItemEl","lineItemAmountEl","padding","focusQuickview","trapQuickviewFocus","nextToLastElementSelector","hideDialog","isCartPage","beforeUpdateAttribute","updateAddToCart","buttonToUpdate","containerEl","addToWishlist","addToWishlistModal","cart","cartAvailabilityMessageOOS","promo","shippingMethod","checkoutNormalShipping","checkoutDiscountShipping","discountPrice","emptySwatchTemplate","addressSuggestions","suggestionTextTemplate","suggestionsTemplate","approachingDiscounts","discountContainerTemplate","singleDiscountTemplate","multipleDiscountsTemplate","nonCouponBasedAdjustmentTemplate","_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","emptySFL","emptySFLMessage","continueShopURL","continueShopMsg","signInMsg","signInSFLURL","autoComplete","suggestionLink","suggestion","addressLine","secondaryEntryAddressLine","street_line","secondary","city","zipcode","suggestionContainer","containerClass","contactUsTemplate","signupMessage","msg","browserWarningTemplate","shippingPreferenceTemplates","shippingPreferences","ispuRadioLabel","ispuRadioValue","shipToRadioLabel","shipToRadioValue","changeStoreLabel","preferISPU","storeDetail","storeId","stateCode","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","keyString","replaceValues","initOnce","flag","appendToUrl","params","encodeURIComponent","onSuccess","onError","geolocate","successCallback","mixin","errorCallback","geolocation","getCurrentPosition","coords","latitude","longitude","setItemInLocalStorage","localStorage","setItem","getItem","removeItemFromLocalStorage","removeItem","cleave","isMobile","mobileAgentHash","stickyScrollPosition","isTopOnly","topOffset","ticking","detailStickyScroll","itemHeight","windowHeight","newTop","handleStickyPositionOnScroll","isUnsupportedBrowser","unsupportedBrowserTypes","sitePrefs","some","uaFragment","endtime","seconds","minutes","hours","globaleCalculation","salesPrice","countryCurrency","currencySymbol","geSalesPrice","countryCoefficientIncludeVAT","countryVATRate","merchantTaxRate","currenyRate","coefficientRate","useCountryVAT","globaleRoundingRanges","scrollAnimate","parentSelector","fieldErrors","clearPreviousErrors","errorHtml","firstFocusableEl","lastFocusableEl","linkElements","payload","fields","feedbackElement","prepend","receivedMsgHeading","receivedMsgBody","mobile","returnUrl","buttonText","clearResetForm","include","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","g","globalThis","Function","toStringTag","validateEmail","emailFormGroup","emailError","_target$dataset","missingError","notifyMeSubmit","checkBoxValue","isChecked","productID","subscribe","confirmMessage","notifyMeCntr","notifyMeCloseCTA","currentModal","processInclude","notifyMe"],"sourceRoot":""}