{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/components/focus.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/csrf.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/utils/slick.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/utils/viewport.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/productTile.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/product/detail.js","webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/product/pdpProductDetails.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/product/quickView.js","webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/quickView.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/customUtil.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/product/base.js","webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/domUtil.js","webpack:///./cartridges/app_custom_aando/cartridge/client/default/js/components/formValidation.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","setTabNextFocus","focusParams","event","keyCode","firstFocusableEl","$","containerSelector","firstElementSelector","lastFocusableEl","lastElementSelector","is","length","nextToLastElementSelector","linkElements","shiftKey","focus","preventDefault","updateTokens","data","csrf","$elem","tokenName","each","this","val","token","customUtil","require","setCarousel","$el","slickConfigs","isEmpty","keys","not","slick","destroyCarousel","hasClass","unslick","reinitCarousel","isInViewport","$element","elementTop","offset","top","elementBottom","outerHeight","viewportTop","window","scrollTop","viewportBottom","height","processInclude","document","ready","base","baseDetails","availability","addToCart","updateAttributesAndDetails","showSpinner","updateAttribute","on","e","response","container","product","pdpVideoID","id","find","text","eq","productId","productType","defaultVariantId","updateAvailability","selectAttribute","$productContainer","closest","addClass","removeClass","siblings","attr","attributeSelect","readyToOrder","sizeChart","url","$prodSizeChart","$productDescContainer","isMobile","css","ajax","type","dataType","success","append","content","modalOptions","keyboard","backdrop","modal","toggleClass","$sizeChart","has","target","copyProductLink","focusChooseBonusProductModal","pdpApplePay","isPdpSet","selectedVal","trigger","spinner","stop","applePayButton","start","timeInt","$eddText","$eddPidDiv","limit","unHideEdd","trim","clearTimeout","setTimeout","videoId","thumbnailUrl","thumbnail_large","$videoButton","videoElement","paused","play","pause","include","forEach","empty","html","attributesHtml","shortDescription","longDescription","updateAddToCart","available","enable","toArray","every","item","message","allAvailable","allReady","resources","info_selectforstock","$temp","select","execCommand","remove","domUtil","viewportUtil","baseHelper","formValidation","handleSetUnavailabilityMessage","unavailableItems","setUnavailableMessageOne","setUnavailableMessageMany","attributeType","recommendationsHtml","einsteinProductRecommendationsHtml","price","percentOffMark","standardPrice","list","formatted","sales","percentageOff","hasSalePricebook","salesPriceBeforePromo","salesBeforePromo","productContainer","priceTemplate","cloneNode","priceSection","queryFirst","priceContainer","strikeThroughContainer","priceElement","salesContainer","salesPriceElement","salesBeforPromoElement","percentOffContainer","percentOffElement","textContent","innerHTML","updateProductPrice","PdpVideoID","carousel","selectedProductID","carouselId","imageLength","appendTo","toFixed","selectedEddProductID","eddPreOrderDate","inStockDate","eddObj","zipcode","carrierCode","serviceCode","JSON","stringify","eddObject","narvar","earliestEDD","getPdpEDD","$targetEl","hasPromotions","promotions","updateProductPromotions","setProductDetailsDescTop","parentEl","$btnContainer","woh","topOffset","position","className","classType","errMessage","messages","ele","isSetItem","prop","variationAttributes","output","variationAttribute","values","key1","$colorSelector","variationGroupID","selectable","enableBackInStockNotification","removeAttr","showBackInStockModule","push","displayValue","selected","displayvalue","join","el","parent","colorName","toLowerCase","preOrderLabel","addToCartLabel","indexOf","hide","show","descriptionAndDetailsHtml","saleBadgingHtml","exclusiveBadgingHtml","productName","noSelectionCount","$setProducts","$setProduct","errorMessage","$productDetail","$container","undefined","animate","innerHeight","expandSizeGuide","collapseSizeGuide","historyPushCount","$this","groudId","isPdp","pageTitle","title","color","exclusiveBadge","salesBadge","$jsProductTile","currentLocale","newPageUrl","history","pushState","location","href","split","newPageTitle","map","index","word","charAt","toUpperCase","slice","badgeClass","badgeValue","$newEl","class","go","imgThumbnailIndex","scroll","scrollIntoView","node","parentElement","parentCHeight","clientHeight","scrollHeight","nodeHeight","scrollOffset","offsetTop","scrollToBISModule","querySelector","$form","pid","newUrl","appendToUrl","attentiveURL","isPDP","serialize","prepend","error","scrollTo","behavior","focusHelper","baseQuickView","fillModalElement","selectedValueUrl","method","$html","parsedHtml","renderedTemplate","body","parseHTML","footer","children","uniqueSellingPropsCopy","clone","quickViewFullDetailMsg","productUrl","closeButtonText","enterDialogMessage","showQuickview","focusQuickview","trapQuickviewFocus","hideDialog","beforeUpdateAttribute","swatchVal","tElement","ellipsisText","size","substring","EllipsisChar","innerText","selectedProductUrl","dialog","mobileAgentHash","idx","userAgent","navigator","isSafari","match","iosVersion","test","platform","v","appVersion","parseInt","getCookie","cookiename","cookie","startC","endC","decodeURI","setCookie","cookieName","cookieValue","nDays","today","Date","expire","setTime","getTime","escape","toGMTString","removeQueryParam","urlparts","String","getUrlQueryParameterValue","queryParamName","currentParameter","urlQueryVariables","decodedString","decodeURIComponent","replace","handleVariantResponse","isVaraint","isChoiceOfBonusProducts","parents","videoObj","pdpVideoLink","attrs","msgs","attrsWithSwatches","attrValue","$attrValue","$swatchButton","assistiveSelectedText","processSwatchValues","sizesHtml","updateSizeUrl","$attr","processNonSwatchValues","updateAttrs","productImages","images","primaryImageUrls","large","imgs","hiResImags","indexAdjustment","alt","first","detach","createCarousel","thumbnailCarousel","template","j","$thumbnailCarouselItems","querySelectorAll","imagesLoaded","observer","IntersectionObserver","entries","delayInMS","entry","isIntersecting","Promise","resolve","then","observe","createThumbnailCarousel","replaceWith","promotionsHtml","availabilityValue","availabilityMessages","availabiityContainer","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","updateQuantities","quantities","optionsHtml","quantity","redirect","updateOptions","complete","chooseBonusProducts","bonusUrl","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","getOptions","options","$elOption","urlValue","selectedValueId","optionId","methods","editBonusProducts","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","colorAttribute","currentTarget","promotion","calloutMsg","pidsObj","setPids","$thisBtnAdd","$messageQtyError","$messageNoStock","qty","getPidValue","childProducts","form","getQuantitySelected","$addToCartBtn","newBonusDiscountLineItem","handlePostCartAdd","addedPid","miniCartReportingUrl","reportingURL","sfmcCartInfo","_etmc","selectBonusProduct","removeBonusProduct","enableBonusProductSelection","showMoreBonusProducts","addBonusProductsToCart","backToTop","atcPid","getQuantitySelector","resetUrl","parseHtml","messageType","$checkIcon","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","$selected","count","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","option","msgSuccess","reload","queryAll","selector","getStyles","element","styles","getComputedStyle","rules","rule","Array","isArray","NodeList","removeChild","setAttribute","removeAttribute","classList","add","toggle","contains","throttle","callback","isThrottling","args","apply","debounce","timer","minimumDelay","makeArray","newTarget","array","reduce","results","arg","concat","offsetHeight","marginTop","marginBottom","scrollY","pageYOffset","boundsTop","getBoundingClientRect","numberOfViewportToCheck","dataset","nextViewportLazyLoad","viewport","bounds","emptyCart","cartElement","y","duration","getLastElementInRow","nextElementSibling","sibling","bottom","previousElementSibling","updateUrlQueryParam","$queryParamsElement","path","getCharacterCount","waitForElement","scope","timeout","reject","elements","MutationObserver","mutations","self","disconnect","childList","subtree","params","encodeURIComponent","formElement","payload","clearFormErrors","fields","feedbackElement","before"],"mappings":"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","file":"default/js/productTile.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 153);\n","'use strict';\r\n\r\nmodule.exports = {\r\n setTabNextFocus: function (focusParams) {\r\n var KEYCODE_TAB = 9;\r\n var isTabPressed = focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB;\r\n\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n\r\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\r\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\r\n\r\n if (\r\n $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled') ||\r\n $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).length === 0\r\n ) {\r\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\r\n if ($('.product-quickview.product-set').length > 0) {\r\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\r\n lastFocusableEl = linkElements[linkElements.length - 1];\r\n }\r\n }\r\n\r\n if (focusParams.event.shiftKey) {\r\n /* shift + tab */ if ($(':focus').is(firstFocusableEl)) {\r\n lastFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n } /* tab */ else if ($(':focus').is(lastFocusableEl)) {\r\n // eslint-disable-line\r\n firstFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n }\r\n};\r\n","'use strict';\r\nmodule.exports = {\r\n updateTokens: function (data) {\r\n if (data && 'csrf' in data) {\r\n var csrf = data.csrf;\r\n if ('tokenName' in csrf && 'token' in csrf) {\r\n var $elem = $('input[name=\"' + csrf.tokenName + '\"]');\r\n if ($elem.length > 0) {\r\n $elem.each(function () {\r\n $(this).val(csrf.token);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n};\r\n","'use strict';\r\nlet customUtil = require('../customUtil');\r\n\r\nmodule.exports = {\r\n setCarousel: function($el, slickConfigs) {\r\n if (customUtil.isEmpty($el) && Object.keys(slickConfigs).length === 0) return;\r\n $el.not('.slick-initialized').slick(slickConfigs);\r\n },\r\n destroyCarousel: function($el) {\r\n if($el.hasClass('slick-initialized')) {\r\n $el[0].slick.unslick();\r\n }\r\n },\r\n reinitCarousel: function($el, slickConfigs) {\r\n this.destroyCarousel($el);\r\n this.setCarousel($el, slickConfigs);\r\n }\r\n}\r\n\r\n\r\n","'use strict';\r\n\r\n/**\r\n * Function to update image attributes\r\n * @param {JQuery} $element - Jquery element to check\r\n * @returns {boolean} - Returns true if element is in viewport, else returns false\r\n */\r\nfunction isInViewport($element) {\r\n let elementTop = $element.offset().top;\r\n let elementBottom = elementTop + $element.outerHeight();\r\n\r\n let viewportTop = $(window).scrollTop();\r\n let viewportBottom = viewportTop + $(window).height();\r\n\r\n return elementBottom > viewportTop && elementTop < viewportBottom;\r\n}\r\n\r\nmodule.exports = {\r\n isInViewport: isInViewport\r\n};","'use strict';\r\n\r\nvar processInclude = require('base/util');\r\n\r\n$(document).ready(function () {\r\n processInclude(require('./product/quickView'));\r\n});\r\n","'use strict';\r\nvar base = require('../product/base');\r\nvar baseDetails = require('base/product/detail');\r\nvar customUtil = require('../customUtil');\r\n\r\nmodule.exports = {\r\n availability: base.availability,\r\n addToCart: base.addToCart,\r\n // removed updateAddToCart for SI-38 requirment\r\n updateAttributesAndDetails: baseDetails.updateAttributesAndDetails,\r\n showSpinner: baseDetails.showSpinner,\r\n updateAttribute: function () {\r\n $('body').on('product:afterAttributeSelect', function (e, response) {\r\n response.container.data('video', response.data.product.pdpVideoID);\r\n if ($('.product-detail>.bundle-items').length) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else if ($('.product-set-detail').eq(0).length) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else {\r\n var productId = response.data.product.id;\r\n // BF might be using element text or data attribute which is also used by add to cart in PDP. Use different attribute for ATC.\r\n if ($('.product-detail.container:not(\".bundle-item\")').hasClass('bfx-price-product')) {\r\n $('.product-detail:not(\".bundle-item\")').data('addtocart-pid', productId);\r\n if (response.data.product.productType === 'variationGroup') {\r\n productId = response.data.product.defaultVariantId;\r\n }\r\n $('.product-id').text(productId);\r\n $('.product-detail:not(\".bundle-item\")').data('pid', productId);\r\n } else {\r\n $('.product-id').text(productId);\r\n $('.product-detail:not(\".bundle-item\")').data('pid', productId);\r\n }\r\n }\r\n });\r\n },\r\n updateAvailability: baseDetails.updateAvailability,\r\n selectAttribute: function() {\r\n $('body').on('click', '.product-description-container [data-attr=\"size\"] button', function(e) {\r\n e.preventDefault();\r\n\r\n\r\n // if ($('.plp-atc').length && $('[data-page=\"Search-ShowResult\"]').length == 0) {\r\n // return;\r\n // }\r\n\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n\r\n // Back in Stock Notification\r\n $('.notify-sign-up').addClass('hide');\r\n $('#waitListJoin').removeClass('is-invalid');\r\n $(this).closest('.product-detail').find('.btn-container').removeClass('hide');\r\n\r\n if ($(this).hasClass('show-backinstock-module')) {\r\n // Show Back In Stock Module\r\n var $currentSelectedSize = $(this).siblings('[aria-checked=\"true\"]');\r\n $(this).siblings('.size-attribute').attr('aria-checked', 'false');\r\n base.attributeSelect($(this).attr('data-url'), $productContainer, 'size');\r\n\r\n $(this).closest('.product-detail').find('.add-to-cart').addClass('hide');\r\n $(this).closest('.product-detail').find('.apple-pay-pdp').addClass('hide');\r\n $(this).closest('.product-detail').find('.backinstock-notify').removeClass('hide');\r\n } else {\r\n base.attributeSelect($(this).attr('data-url'), $productContainer, 'size');\r\n\r\n $(this).closest('.product-detail').find('.btn-container').removeClass('hide');\r\n $(this).closest('.product-detail').find('.add-to-cart').removeClass('hide');\r\n $(this).closest('.product-detail').find('.apple-pay-pdp').removeClass('hide');\r\n $(this).closest('.product-detail').find('.backinstock-notify').addClass('hide');\r\n }\r\n });\r\n\r\n $('button.add-to-cart-global').on('product:updateAddToCart', function (e, response) {\r\n if (response.product.readyToOrder) {\r\n $(this).attr('disabled', false);\r\n }\r\n });\r\n },\r\n sizeChart: function() {\r\n $(document).on('click', '.size-chart .sizeGuide-link', function(e) {\r\n e.preventDefault();\r\n var url = $(this).attr('href');\r\n var $prodSizeChart = $(this)\r\n .closest('.size-chart')\r\n .find('.size-chart-collapsible');\r\n var $productDescContainer = $(this)\r\n .closest('.product-description-container');\r\n if (!customUtil.isMobile()) {\r\n $productDescContainer.css({ top: '0rem' });\r\n }\r\n if ($prodSizeChart.is(':empty')) {\r\n $.ajax({\r\n url: url,\r\n type: 'get',\r\n dataType: 'json',\r\n success: function(data) {\r\n $prodSizeChart.append(data.content);\r\n\r\n var modalOptions = {\r\n keyboard: false,\r\n backdrop: false\r\n };\r\n\r\n if ($('.modal-backdrop').length === 0) {\r\n modalOptions.backdrop = 'static';\r\n }\r\n\r\n $('#pdp-sizeGuide').modal(modalOptions);\r\n\r\n }\r\n });\r\n }\r\n $prodSizeChart.toggleClass('active');\r\n });\r\n\r\n var $sizeChart = $('.size-chart-collapsible');\r\n $('body').on('click touchstart', function(e) {\r\n if ($('.size-chart').has(e.target).length <= 0) {\r\n $sizeChart.removeClass('active');\r\n }\r\n });\r\n },\r\n copyProductLink: baseDetails.copyProductLink,\r\n focusChooseBonusProductModal: base.focusChooseBonusProductModal(),\r\n pdpApplePay: function() {\r\n $('body').on('click', '.dw-apple-pay-button', function(e) {\r\n // Based on the product:beforeAddToCart event in pdpProductDetails.js\r\n var isPdpSet = $(this).closest('.product-set-detail').length;\r\n var selectedVal = $(this)\r\n .closest('.product-detail')\r\n .find('.select-size option:selected')\r\n .data('attr-value');\r\n if (!selectedVal && selectedVal !== 0 && !isPdpSet) {\r\n e.preventDefault();\r\n $('body').trigger('product:beforeAddToCart', this);\r\n $.spinner().stop();\r\n return false;\r\n }\r\n });\r\n\r\n $('body').on('product:updateAddToCart', function(e, response) {\r\n if (response.product.readyToOrder) {\r\n var applePayButton = $('.apple-pay-pdp', response.$productContainer);\r\n if (applePayButton.length !== 0) {\r\n applePayButton.attr('sku', response.product.id);\r\n }\r\n }\r\n });\r\n },\r\n showSpinner: function () {\r\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\r\n if (!$('.container.search-results').length) {\r\n $.spinner().start();\r\n }\r\n });\r\n },\r\n showPDPEDD: function () {\r\n var $eddText = $('.eddtext.productDetails');\r\n var $eddPidDiv = $eddText.find('.eddpid');\r\n var limit = 0;\r\n var timeInt;\r\n var unHideEdd = function () {\r\n if ($eddPidDiv.text().trim().length > 0 || limit > 100) {\r\n if ($eddText.hasClass('hide') && $eddPidDiv.text().trim().length > 0) {\r\n $eddText.removeClass('hide');\r\n }\r\n clearTimeout(timeInt);\r\n } else {\r\n limit++;\r\n timeInt = setTimeout(unHideEdd, 100);\r\n }\r\n };\r\n unHideEdd();\r\n },\r\n videoThumbnail: function () {\r\n var videoId = $('.product-detail').data('video');\r\n if (videoId) {\r\n $.ajax({\r\n type: 'GET',\r\n url: 'https://vimeo.com/api/v2/video/' + videoId + '.json',\r\n dataType: 'json',\r\n success: function (data) {\r\n var thumbnailUrl = data[0].thumbnail_large;\r\n $('.video-thumbnail').attr('src', thumbnailUrl);\r\n $('.pdp-main-video').attr('poster', thumbnailUrl);\r\n }\r\n });\r\n }\r\n },\r\n videoButton: function () {\r\n if ($('.pdp-main-video').length) {\r\n $(document).on('click', '.pdp-video-button', function () {\r\n var $videoButton = $('.pdp-video-button');\r\n var videoElement = $('.pdp-main-video')[0];\r\n if (videoElement.paused) {\r\n videoElement.play();\r\n $videoButton.addClass('pause-button');\r\n $videoButton.removeClass('play-button');\r\n } else {\r\n $videoButton.removeClass('pause-button');\r\n $videoButton.addClass('play-button');\r\n videoElement.pause();\r\n }\r\n });\r\n }\r\n }\r\n};\r\n","'use strict';\r\n\r\nmodule.exports = function (include) {\r\n if (typeof include === 'function') {\r\n include();\r\n } else if (typeof include === 'object') {\r\n Object.keys(include).forEach(function (key) {\r\n if (typeof include[key] === 'function') {\r\n include[key]();\r\n }\r\n });\r\n }\r\n};\r\n","'use strict';\r\nvar base = require('./base');\r\n\r\nmodule.exports = {\r\n availability: base.availability,\r\n\r\n addToCart: base.addToCart,\r\n\r\n updateAttributesAndDetails: function () {\r\n $('body').on('product:statusUpdate', function (e, data) {\r\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\r\n\r\n $productContainer.find('.description-and-detail .product-attributes')\r\n .empty()\r\n .html(data.attributesHtml);\r\n\r\n if (data.shortDescription) {\r\n $productContainer.find('.description-and-detail .description')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .description .content')\r\n .empty()\r\n .html(data.shortDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .description')\r\n .addClass('hidden-xl-down');\r\n }\r\n\r\n if (data.longDescription) {\r\n $productContainer.find('.description-and-detail .details')\r\n .removeClass('hidden-xl-down');\r\n $productContainer.find('.description-and-detail .details .content')\r\n .empty()\r\n .html(data.longDescription);\r\n } else {\r\n $productContainer.find('.description-and-detail .details')\r\n .addClass('hidden-xl-down');\r\n }\r\n });\r\n },\r\n\r\n showSpinner: function () {\r\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\r\n $.spinner().start();\r\n });\r\n },\r\n updateAttribute: function () {\r\n $('body').on('product:afterAttributeSelect', function (e, response) {\r\n if ($('.product-detail>.bundle-items').length) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else if ($('.product-set-detail').eq(0).length) {\r\n response.container.data('pid', response.data.product.id);\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else {\r\n var productId = response.data.product.id;\r\n if (response.data.product.productType === 'variationGroup') {\r\n productId = response.data.product.defaultVariantId;\r\n }\r\n $('.product-id').text(productId);\r\n $('.product-detail:not(\".bundle-item\")').data('pid', productId);\r\n }\r\n });\r\n },\r\n updateAddToCart: function () {\r\n $('body').on('product:updateAddToCart', function (e, response) {\r\n // update local add to cart (for sets)\r\n $('button.add-to-cart', response.$productContainer).attr('disabled',\r\n (!response.product.readyToOrder || !response.product.available));\r\n\r\n var enable = $('.product-availability').toArray().every(function (item) {\r\n return $(item).data('available') && $(item).data('ready-to-order');\r\n });\r\n $('button.add-to-cart-global').attr('disabled', !enable);\r\n });\r\n },\r\n updateAvailability: function () {\r\n $('body').on('product:updateAvailability', function (e, response) {\r\n $('div.availability', response.$productContainer)\r\n .data('ready-to-order', response.product.readyToOrder)\r\n .data('available', response.product.available);\r\n\r\n $('.availability-msg', response.$productContainer)\r\n .empty().html(response.message);\r\n\r\n if ($('.global-availability').length) {\r\n var allAvailable = $('.product-availability').toArray()\r\n .every(function (item) { return $(item).data('available'); });\r\n\r\n var allReady = $('.product-availability').toArray()\r\n .every(function (item) { return $(item).data('ready-to-order'); });\r\n\r\n $('.global-availability')\r\n .data('ready-to-order', allReady)\r\n .data('available', allAvailable);\r\n\r\n $('.global-availability .availability-msg').empty()\r\n .html(allReady ? response.message : response.resources.info_selectforstock);\r\n }\r\n });\r\n },\r\n sizeChart: function () {\r\n $('.size-chart a').on('click', function (e) {\r\n e.preventDefault();\r\n var url = $(this).attr('href');\r\n var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\r\n if ($prodSizeChart.is(':empty')) {\r\n $.ajax({\r\n url: url,\r\n type: 'get',\r\n dataType: 'json',\r\n success: function (data) {\r\n $prodSizeChart.append(data.content);\r\n }\r\n });\r\n }\r\n $prodSizeChart.toggleClass('active');\r\n });\r\n\r\n var $sizeChart = $('.size-chart-collapsible');\r\n $('body').on('click touchstart', function (e) {\r\n if ($('.size-chart').has(e.target).length <= 0) {\r\n $sizeChart.removeClass('active');\r\n }\r\n });\r\n },\r\n copyProductLink: function () {\r\n $('body').on('click', '#fa-link', function () {\r\n event.preventDefault();\r\n var $temp = $('');\r\n $('body').append($temp);\r\n $temp.val($('#shareUrl').val()).select();\r\n document.execCommand('copy');\r\n $temp.remove();\r\n $('.copy-link-message').attr('role', 'alert');\r\n $('.copy-link-message').removeClass('d-none');\r\n setTimeout(function () {\r\n $('.copy-link-message').addClass('d-none');\r\n }, 3000);\r\n });\r\n },\r\n\r\n focusChooseBonusProductModal: base.focusChooseBonusProductModal()\r\n};\r\n","'use strict';\r\n\r\nvar domUtil = require('../domUtil');\r\nvar customUtil = require('../customUtil');\r\nvar slickHelper = require('../utils/slick');\r\nvar viewportUtil = require('../utils/viewport');\r\nvar baseHelper = require('./base');\r\nvar formValidation = require('../components/formValidation');\r\nvar csrf = require('../csrf');\r\nvar hiddenClass = 'd-none';\r\n\r\n/**\r\n * Process attribute values associated with an attribute that does not have image swatches\r\n *\r\n * @param {int} price - product sale price\r\n * @param {int} standardPrice - product standard price\r\n * @param {string} percentOffMark - string value\r\n * @param {Object} productContainer - DOM container for a given product\r\n * @param {boolean} hasSalePricebook - has sale pricebook\r\n */\r\nfunction updateProductPrice(price, standardPrice, percentOffMark, productContainer, hasSalePricebook, salesPriceBeforePromo) {\r\n var priceTemplate = $('.price-template')[0].cloneNode(true);\r\n var priceSection = domUtil.queryFirst('.prices .price', productContainer);\r\n var priceContainer = domUtil.queryFirst('.price-section', priceTemplate);\r\n var strikeThroughContainer = domUtil.queryFirst('.strike-through-section', priceContainer);\r\n var priceElement = domUtil.queryFirst('.strike-through-price', strikeThroughContainer);\r\n var salesContainer = domUtil.queryFirst('.sales', priceContainer);\r\n var salesPriceElement = domUtil.queryFirst('.price-value', salesContainer);\r\n var salesBeforPromoElement = domUtil.queryFirst('.sales-before-promo', priceContainer);\r\n var percentOffContainer = domUtil.queryFirst('.sales-percentage', priceContainer);\r\n var percentOffElement = domUtil.queryFirst('.percent-value', priceContainer);\r\n domUtil.removeClass(strikeThroughContainer, hiddenClass);\r\n\r\n if (!hasSalePricebook) {\r\n domUtil.addClass(strikeThroughContainer, hiddenClass);\r\n domUtil.addClass(percentOffContainer, hiddenClass);\r\n }\r\n\r\n if (salesBeforPromoElement && salesPriceBeforePromo) {\r\n salesBeforPromoElement.textContent = salesPriceBeforePromo;\r\n }\r\n\r\n if (priceElement) {\r\n priceElement.textContent = standardPrice;\r\n }\r\n if (salesPriceElement) {\r\n salesPriceElement.textContent = price;\r\n }\r\n if (price === standardPrice) {\r\n domUtil.addClass(strikeThroughContainer, hiddenClass);\r\n }\r\n if (price < standardPrice && percentOffElement && percentOffMark) {\r\n percentOffElement.textContent = percentOffMark;\r\n }\r\n priceSection.innerHTML = priceTemplate.innerHTML;\r\n}\r\n\r\n/**\r\n * This method used to get the pdp estimated delivery date via ajax call\r\n * @param {string} inStockDate - In Stoke date\r\n */\r\nfunction getPdpEDD(inStockDate) {\r\n var $eddText = $('.eddtext.productDetails');\r\n var $eddPidDiv = $eddText.find('.eddpid');\r\n\r\n if ($eddPidDiv.length) {\r\n var url = $eddPidDiv.data('url');\r\n\r\n if (url) {\r\n var eddObj = {\r\n zipcode: $eddPidDiv.data('narvar-dest-zip'),\r\n carrierCode: $eddPidDiv.data('narvar-carrier-code'),\r\n serviceCode: $eddPidDiv.data('narvar-service-code'),\r\n inStockDate: inStockDate\r\n };\r\n\r\n $eddText.addClass('d-none');\r\n\r\n $.ajax({\r\n url: url,\r\n type: 'get',\r\n dataType: 'json',\r\n data: { eddObj: JSON.stringify(eddObj) },\r\n success: function(data) {\r\n if (data.success) {\r\n $eddPidDiv.closest('.eddtext').attr('data-object', JSON.stringify(data.eddObject));\r\n if (eddObj.serviceCode && eddObj.serviceCode.length > 0 && eddObj.carrierCode && eddObj.carrierCode.length > 0) {\r\n $eddPidDiv.text('');\r\n if (window.narvar) {\r\n window.narvar('getEdd', {});\r\n }\r\n } else if (data.earliestEDD) {\r\n $eddPidDiv.text(data.earliestEDD);\r\n if (window.narvar) {\r\n window.narvar('getEdd', {});\r\n }\r\n } else if (window.narvar) {\r\n window.narvar('getEdd', {});\r\n }\r\n } else if (window.narvar) {\r\n window.narvar('getEdd', {});\r\n }\r\n var limit = 0;\r\n var timeInt;\r\n var unHideEdd = function() {\r\n if ($eddPidDiv.text().trim().length > 0 || limit > 100) {\r\n if ($eddPidDiv.text().trim().length > 0) {\r\n $eddText.removeClass('d-none');\r\n }\r\n clearTimeout(timeInt);\r\n } else {\r\n limit++;\r\n timeInt = setTimeout(unHideEdd, 100);\r\n }\r\n };\r\n unHideEdd();\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * This method handles the unavailability message in product set\r\n */\r\nfunction handleSetUnavailabilityMessage() {\r\n var unavailableItems = $('.availability-container .no-stock').length;\r\n var setUnavailableMessageOne = $('.set-unavailable-message-one');\r\n var setUnavailableMessageMany = $('.set-unavailable-message-many');\r\n if (unavailableItems > 1) {\r\n setUnavailableMessageOne.addClass('d-none');\r\n setUnavailableMessageMany.find('.no-of-items').text(unavailableItems);\r\n setUnavailableMessageMany.removeClass('d-none');\r\n } else if (unavailableItems === 1) {\r\n setUnavailableMessageMany.addClass('d-none');\r\n setUnavailableMessageOne.removeClass('d-none');\r\n } else {\r\n setUnavailableMessageOne.addClass('d-none');\r\n setUnavailableMessageMany.addClass('d-none');\r\n }\r\n}\r\n\r\n$('body').on('product:afterAttributeSelect', function(e, data) {\r\n if (data.attributeType && data.attributeType === 'color') {\r\n if (data.data.product.recommendationsHtml) {\r\n $('.recommendations-products').empty();\r\n $('.product-recommendation-details')\r\n .empty()\r\n .html(data.data.product.recommendationsHtml);\r\n $('body').trigger('search:updateProducts');\r\n }\r\n if (data.data.product.einsteinProductRecommendationsHtml) {\r\n $('.custom-recommender')\r\n .empty()\r\n .html(data.data.product.einsteinProductRecommendationsHtml);\r\n $('body').trigger('search:updateProducts');\r\n } else {\r\n $('.custom-recommender').empty();\r\n }\r\n }\r\n if ($('.product-detail.product-pdp .custom-select-wrapper .size-value.selected').length) {\r\n $('.qty-err').remove();\r\n }\r\n if (!data.data.product.price.type) {\r\n var standardPrice = data.data.product.price.list ? data.data.product.price.list.formatted : data.data.product.price.sales.formatted;\r\n var price = standardPrice;\r\n var percentOffMark;\r\n if (data.data.product.price.sales) {\r\n price = data.data.product.price.sales.formatted;\r\n }\r\n if (data.data.product.price.list) {\r\n percentOffMark = data.data.product.price.percentageOff;\r\n }\r\n\r\n var hasSalePricebook = data.data.hasSalePricebook;\r\n var salesPriceBeforePromo =\r\n 'salesBeforePromo' in data.data.product.price && data.data.product.price.salesBeforePromo ? data.data.product.price.salesBeforePromo.formatted : '';\r\n updateProductPrice(price, standardPrice, percentOffMark, data.container[0], hasSalePricebook, salesPriceBeforePromo);\r\n }\r\n var isPdpSet = $('.product-set-detail').length;\r\n if (isPdpSet) {\r\n handleSetUnavailabilityMessage();\r\n }\r\n\r\n var PdpVideoID = data.data.product.pdpVideoID;\r\n if (PdpVideoID !== null && PdpVideoID !== undefined) {\r\n var carousel = $('.product-detail .primary-images .carousel');\r\n if (isPdpSet) {\r\n var selectedProductID = data.data.product.id;\r\n if (selectedProductID !== null && selectedProductID !== undefined) {\r\n $('.product-detail').each(function() {\r\n var setItemID = $(this)\r\n .find('.product-id.bfx-sku')\r\n .text();\r\n if (setItemID === selectedProductID) {\r\n carousel = $(this).find('.carousel');\r\n }\r\n });\r\n }\r\n }\r\n\r\n if ($(carousel).length > 0) {\r\n var carouselId = $(carousel).attr('id');\r\n var imageLength = $(carousel).find('.carousel-inner .carousel-item ').length;\r\n $(\r\n '
'\r\n ).appendTo($(carousel).find('.carousel-inner'));\r\n $('
  • ').appendTo(\r\n $(carousel).find('.carousel-indicators')\r\n );\r\n }\r\n }\r\n // update Narvar estimated date on PDP\r\n var $eddPidDiv = $('.eddpid');\r\n if (isPdpSet) {\r\n var selectedEddProductID = data.data.product.id;\r\n if (selectedEddProductID !== null && selectedEddProductID !== undefined) {\r\n $('.product-detail').each(function() {\r\n var setItemID = $(this)\r\n .find('.product-id.bfx-sku')\r\n .text();\r\n if (setItemID === selectedEddProductID) {\r\n $eddPidDiv = $(this).find('.eddpid');\r\n }\r\n });\r\n }\r\n }\r\n if ($eddPidDiv.length > 0) {\r\n if (data.data.product.availability.eddPreOrderDate) {\r\n $eddPidDiv.attr('data-narvar-instock-date', data.data.product.availability.eddPreOrderDate);\r\n $eddPidDiv.addClass('preorder-date');\r\n if ($('.pdp-edd.hide').length > 0) {\r\n $('.pdp-edd.hide').removeClass('hide');\r\n }\r\n } else {\r\n if ($eddPidDiv.hasClass('preorder-date')) {\r\n $eddPidDiv.removeClass('preorder-date');\r\n }\r\n if ($('.pdp-edd.hide').length > 0) {\r\n $('.pdp-edd.hide').removeClass('hide');\r\n }\r\n }\r\n\r\n getPdpEDD(data.data.product.availability.eddPreOrderDate);\r\n }\r\n\r\n /* re-renders the applicable promotions if the product has active product-level promotions */\r\n var $targetEl = $('.applicable-promotions');\r\n if (data.data.product.hasPromotions) {\r\n var promotions = data.data.product.promotions;\r\n baseHelper.updateProductPromotions($targetEl, promotions);\r\n } else {\r\n $targetEl.empty();\r\n }\r\n});\r\n\r\n// calculate the top offset of product details description container and lock it at the top once the 'Add to bag' button is in the viewport\r\nvar setProductDetailsDescTop = function(parentEl) {\r\n if (!parentEl) {\r\n return;\r\n }\r\n\r\n var $productDescContainer = parentEl.find('.product-description-container');\r\n var $btnContainer = parentEl.find('.prices-add-to-cart-actions');\r\n var woh = $(window).outerHeight(true);\r\n var bPadding = 50;\r\n var topOffset = 150;\r\n\r\n if ($btnContainer.length > 0 && !viewportUtil.isInViewport($btnContainer)) {\r\n topOffset = woh - ($btnContainer.position().top + $btnContainer.outerHeight(true) + bPadding);\r\n }\r\n\r\n $productDescContainer.css({ top: topOffset / 16 + 'rem' });\r\n};\r\n\r\n$('body').on('product:updateAvailability', function(e, data) {\r\n var className = data.product.availability.classType;\r\n var errMessage = data.product.availability.messages[0];\r\n var ele = $(e.target).find('.product-description');\r\n var isSetItem = data.$productContainer.hasClass('product-detail set-item');\r\n if (className === 'qty-err') {\r\n ele.find('.add-to-cart').prop('disabled', true);\r\n } else {\r\n ele.find('.add-to-cart').prop('disabled', false);\r\n }\r\n if (data.product.variationAttributes) {\r\n var output = [];\r\n $.each(data.product.variationAttributes, function(key, variationAttribute) {\r\n if (variationAttribute.id === 'color') {\r\n $.each(variationAttribute.values, function(key1, value) {\r\n var $colorSelector = $(\r\n '.product-detail [data-attr=\"' +\r\n variationAttribute.id +\r\n '\"] button.' +\r\n variationAttribute.id +\r\n '-attribute[data-variationgroupid=\"' +\r\n value.variationGroupID +\r\n '\"]'\r\n );\r\n if (!value.selectable && (!value.enableBackInStockNotification || isSetItem)) {\r\n $colorSelector.attr('disabled', 'disabled');\r\n } else {\r\n $colorSelector.removeAttr('disabled');\r\n }\r\n if (!value.enableBackInStockNotification || isSetItem) {\r\n $colorSelector.removeClass('back-in-stock-notification');\r\n } else {\r\n $colorSelector.addClass('back-in-stock-notification');\r\n }\r\n });\r\n }\r\n if (variationAttribute.id === 'size') {\r\n $.each(variationAttribute.values, function(key1, value) {\r\n var showBackInStockModule = value.enableBackInStockNotification;\r\n output.push(\r\n ''\r\n );\r\n\r\n if (value.selected && !value.selectable) {\r\n ele.find('button.add-to-cart').prop('disabled', true);\r\n }\r\n });\r\n ele.find('[data-attr=\"' + variationAttribute.id + '\"] .size-selections').html(output.join(''));\r\n }\r\n });\r\n }\r\n\r\n // Back in Stock Notification\r\n $('.notify-sign-up').addClass('hide');\r\n $('#waitListJoin').removeClass('is-invalid');\r\n $(this)\r\n .closest('.product-detail')\r\n .find('.btn-container')\r\n .removeClass('hide');\r\n\r\n if (\r\n ele\r\n .closest('.product-detail')\r\n .find('[data-attr=\"size\"] .size-attribute[aria-checked=\"true\"]')\r\n .hasClass('show-backinstock-module')\r\n ) {\r\n ele.closest('.product-detail')\r\n .find('.add-to-cart')\r\n .addClass('hide');\r\n ele.closest('.product-detail')\r\n .find('.backinstock-notify')\r\n .removeClass('hide');\r\n } else {\r\n ele.closest('.product-detail')\r\n .find('.btn-container')\r\n .removeClass('hide');\r\n ele.closest('.product-detail')\r\n .find('.add-to-cart')\r\n .removeClass('hide');\r\n ele.closest('.product-detail')\r\n .find('.backinstock-notify')\r\n .addClass('hide');\r\n }\r\n\r\n $(ele)\r\n .find('.color-value')\r\n .each(function(d, el) {\r\n if ($(el).hasClass('unselectable')) {\r\n if (\r\n !$(el)\r\n .parent()\r\n .hasClass('back-in-stock-notification')\r\n ) {\r\n $(el)\r\n .parent()\r\n .attr('disabled', true);\r\n } else {\r\n $(el)\r\n .parent()\r\n .attr('disabled', false);\r\n }\r\n } else {\r\n $(el)\r\n .parent()\r\n .attr('disabled', false);\r\n }\r\n });\r\n $(ele)\r\n .find('.color-value')\r\n .parent('.color-attribute')\r\n .attr('aria-checked', 'false');\r\n $(ele)\r\n .find('.color-value.selected')\r\n .parent('.color-attribute')\r\n .attr('aria-checked', 'true');\r\n var colorName = $(ele)\r\n .find('.color-value.selected')\r\n .data('attr-displayvalue');\r\n if (typeof colorName !== 'undefined') {\r\n $(ele)\r\n .find('.selected-color')\r\n .text(colorName.toLowerCase());\r\n }\r\n\r\n if (className !== 'no-stock') {\r\n $(ele)\r\n .find('.product-availability')\r\n .html('
    ' + errMessage + '
    ');\r\n $(ele)\r\n .find('.cart-and-ipay')\r\n .removeClass('hide');\r\n } else {\r\n $(ele)\r\n .find('.product-availability')\r\n .empty();\r\n $(ele)\r\n .find('.notify-sign-up .form-group, .notify-sign-up .btn.stock-notify-signup-email, .notify-sign-up.title')\r\n .removeClass('hide');\r\n $(ele)\r\n .find('.notify-sign-up .btn.stock-notify-signup-success')\r\n .addClass('hide');\r\n }\r\n\r\n if (className !== 'no-err') {\r\n $('#footercontent').addClass('message');\r\n } else {\r\n $('#footercontent').removeClass('message');\r\n }\r\n\r\n var preOrderLabel = $('.add-to-cart-btn-labels').attr('data-value-preorder-text');\r\n var addToCartLabel = $('.add-to-cart-btn-labels').attr('data-value-cart-text');\r\n var hasPreorder = data.product.availability.messages[0].indexOf('pre-order-ship-msg') >= 0;\r\n\r\n if (hasPreorder) {\r\n $(ele)\r\n .find('.add-to-cart span')\r\n .text(preOrderLabel);\r\n $(ele)\r\n .find('.availability')\r\n .hide();\r\n $(ele)\r\n .find('.availability-container .availability-msg')\r\n .show();\r\n } else {\r\n $(ele)\r\n .find('.add-to-cart span')\r\n .text(addToCartLabel);\r\n $(ele)\r\n .find('.availability')\r\n .show();\r\n $(ele)\r\n .find('.availability-container .availability-msg')\r\n .hide();\r\n }\r\n $(ele)\r\n .find('.product-desc .content')\r\n .html(data.product.shortDescription);\r\n $(ele)\r\n .find('.description-and-detail')\r\n .empty()\r\n .html(data.product.descriptionAndDetailsHtml);\r\n $(ele)\r\n .find('.sales-bdg')\r\n .empty()\r\n .html(data.product.saleBadgingHtml);\r\n $(ele)\r\n .find('.ex-promotion')\r\n .empty()\r\n .html(data.product.exclusiveBadgingHtml);\r\n $(ele)\r\n .find('.product-name')\r\n .empty()\r\n .html(data.product.productName);\r\n\r\n // reset and re-calculate the top offset when color/size is changed\r\n var $productDescContainer = $('.product-detail .product-description-container');\r\n $productDescContainer.removeAttr('style');\r\n\r\n if (!customUtil.isMobile() && $('.product-detail').length > 0) {\r\n setProductDetailsDescTop($('.product-detail'));\r\n }\r\n});\r\n\r\n// adding error message when size not selected\r\n// eslint-disable-next-line consistent-return\r\n$('body').on('product:beforeAddToCart', function(data, ele) {\r\n var isPdpSet = $(ele).closest('.product-set-detail').length;\r\n if (isPdpSet) {\r\n var noSelectionCount = 0;\r\n var $setProducts = $(ele)\r\n .closest('.product-detail')\r\n .find('.set-item');\r\n if (!$setProducts.length) {\r\n $setProducts = $(ele).closest('.product-detail.set-item');\r\n }\r\n $setProducts.each(function() {\r\n var $setProduct = $(this);\r\n var labelText = $setProduct.find('.size-selections').attr('data-value-select-size-label');\r\n var errorMessage = '

    ' + labelText + '

    ';\r\n var $sizeSelected = $setProduct.find('.custom-select-wrapper .size-selections .size-value.selected');\r\n if ($sizeSelected.length === 0) {\r\n noSelectionCount++;\r\n $setProduct\r\n .find('.product-description')\r\n .find('.availability')\r\n .empty()\r\n .html(errorMessage);\r\n\r\n $setProduct.find('.select-size').focus();\r\n $setProduct.find('.add-to-cart').prop('disabled', true);\r\n }\r\n });\r\n if (noSelectionCount > 0) {\r\n $(ele)\r\n .closest('.product-set-detail')\r\n .find('.add-to-cart-global')\r\n .prop('disabled', true);\r\n return false;\r\n }\r\n } else {\r\n var $productDetail = $(ele).closest('.product-detail');\r\n if (!$productDetail.length) {\r\n return false;\r\n }\r\n var selectedVal = $productDetail.find('.custom-select-wrapper .size-value.selected').data('attr-value');\r\n var $container = $(ele).closest('.product-detail');\r\n var labelText = $('.size-selections').attr('data-value-select-size-label');\r\n var errorMessage = '

    ' + labelText + '

    ';\r\n if ((selectedVal === undefined || selectedVal === 'undefined') && !isPdpSet) {\r\n data.preventDefault();\r\n if (customUtil.isMobile() || $('.availability').css('display') === 'none') {\r\n $container.find('.availability').show();\r\n $('#footercontent').addClass('message');\r\n }\r\n $container\r\n .find('.availability')\r\n .empty()\r\n .html(errorMessage);\r\n\r\n if ($('.desktop-menu').hasClass('d-none')) {\r\n $('body, html').animate({\r\n scrollTop:\r\n $('.size-container').offset().top -\r\n ($(window).innerHeight() + $('.prices-add-to-cart-actions').innerHeight()) / 2 +\r\n $('.size-container').innerHeight()\r\n });\r\n }\r\n\r\n $container.find('.select-size').focus();\r\n $container.find('.add-to-cart').prop('disabled', true);\r\n return false;\r\n }\r\n }\r\n handleSetUnavailabilityMessage();\r\n return false;\r\n});\r\n\r\nvar expandSizeGuide = function() {\r\n var sizeGuideAccordion = '.sizeGuide-expand-all';\r\n $(sizeGuideAccordion).toggleClass('expand');\r\n if ($(sizeGuideAccordion).hasClass('expand')) {\r\n $('.pdp-sizeGuide-modal-body > div').addClass('active');\r\n } else {\r\n $('.pdp-sizeGuide-modal-body > div').removeClass('active');\r\n }\r\n $(sizeGuideAccordion).text($(sizeGuideAccordion).text() === 'Collapse all' ? 'Expand all' : 'Collapse all');\r\n};\r\n\r\n$(document).on('click', '.sizeGuide-expand-all', function(e) {\r\n e.preventDefault();\r\n expandSizeGuide();\r\n});\r\n\r\nvar collapseSizeGuide = function() {\r\n $('.pdp-sizeGuide-modal-body > div').removeClass('active');\r\n $('.sizeGuide-expand-all')\r\n .removeClass('expand')\r\n .text(' Expand all');\r\n};\r\n\r\n$(document).on('click', '.sizeGuide-link', function() {\r\n $('.product-detail').addClass('sizeGuideShow');\r\n});\r\n\r\n$(document).on('hidden.bs.modal', '#pdp-sizeGuide', function() {\r\n $('.product-detail').removeClass('sizeGuideShow');\r\n setProductDetailsDescTop();\r\n collapseSizeGuide();\r\n});\r\n\r\nvar historyPushCount = 0;\r\nvar toTitleCase = function(phrase) {\r\n return phrase\r\n .toLowerCase()\r\n .split(' ')\r\n .map(function(word) {\r\n return word.charAt(0).toUpperCase() + word.slice(1);\r\n })\r\n .join(' ');\r\n};\r\n\r\n$(document).on('click', '.color-attribute', function() {\r\n var $this = $(this);\r\n var groudId = $(this).data('variationgroupid');\r\n var isPdp = $(this)\r\n .closest('.product-detail')\r\n .hasClass('product-wrapper');\r\n var pageTitle = document.title;\r\n var color = $(this)\r\n .find('.color-value')\r\n .data('attr-value');\r\n var productName = $(this)\r\n .closest('.product-detail')\r\n .find('.product-name')\r\n .text();\r\n var exclusiveBadge = $this.data('exclusivebadge');\r\n var salesBadge = $this.data('salesbadge');\r\n var $jsProductTile = $this.closest('.js-product-tile');\r\n var currentLocale = $(this).data('currentlocale');\r\n\r\n if (isPdp) {\r\n var newPageUrl = groudId + '.html';\r\n if (currentLocale && currentLocale !== 'default') {\r\n newPageUrl = newPageUrl + '?lang=' + currentLocale;\r\n }\r\n window.history.pushState('data', 'Title', newPageUrl);\r\n // update the canonical tag\r\n $('[rel=\"canonical\"]').attr('href', window.location.href);\r\n\r\n if (pageTitle.split('|').length > 0) {\r\n // update the page title\r\n var newPageTitle = pageTitle\r\n .trim()\r\n .split('|')\r\n .map(function(item, index) {\r\n // only update the product name in the title\r\n if (index === 0) {\r\n // concatinate the product color\r\n item = toTitleCase(productName + ' In ' + color);\r\n }\r\n return item;\r\n })\r\n .join(' | ');\r\n\r\n document.title = newPageTitle;\r\n }\r\n historyPushCount++;\r\n }\r\n\r\n // check if exclusive/sales badge has data value\r\n if (exclusiveBadge || salesBadge) {\r\n var badgeClass = 'badge-product';\r\n var badgeValue = salesBadge;\r\n var $targetEl = $jsProductTile.find('.product-detail');\r\n\r\n if (!salesBadge && exclusiveBadge) {\r\n badgeClass = 'badge-product badge-exclusive';\r\n badgeValue = exclusiveBadge;\r\n }\r\n\r\n // check if badge element not exist\r\n if ($jsProductTile.find('.badge-product').length === 0) {\r\n // create badge element and append to the target element\r\n var $newEl = $('
    ', {\r\n class: badgeClass\r\n }).html('' + badgeValue + '');\r\n $targetEl.append($newEl);\r\n } else {\r\n // update the badge element value\r\n $targetEl.find('.badge-product span').text(badgeValue);\r\n }\r\n }\r\n});\r\n\r\nif ($('.product-pdp').length > 0) {\r\n $(window).on('popstate', function() {\r\n if (historyPushCount > 0) {\r\n window.history.go(-historyPushCount);\r\n }\r\n });\r\n}\r\n\r\nvar pdpSizeGuideTitleClick = function() {\r\n if ($('.pdp-sizeGuide-modal-body .collapsible-xs.active').length === $('.pdp-sizeGuide-modal-body .collapsible-xs').length) {\r\n expandSizeGuide();\r\n } else if ($('.pdp-sizeGuide-modal-body .collapsible-xs.active').length === 0) {\r\n collapseSizeGuide();\r\n }\r\n};\r\n\r\n$(document).on('click', '#pdp-sizeGuide .collapsible-xs .title', pdpSizeGuideTitleClick);\r\n\r\nif ($('.thumbnail-carousel').length > 0) {\r\n $('body').on('click', '.thumbnail-carousel__item', function() {\r\n var $this = $(this);\r\n // todo remove a as wrapper here in base.js and in thumnailCarousel\r\n var imgThumbnailIndex = $this.find('img').data('index');\r\n var activeClass = 'thumbnail-carousel__item--active';\r\n $('.thumbnail-carousel__item').removeClass(activeClass);\r\n $('.carousel-item.active').removeClass('active');\r\n\r\n /* display the selected thumbnail image into the large image */\r\n $('.pdp-carousel .primary-images .carousel').carousel(imgThumbnailIndex);\r\n $('#carousel-item-' + imgThumbnailIndex)\r\n .addClass('active')\r\n .scroll();\r\n $this.addClass(activeClass);\r\n });\r\n}\r\n\r\n$('body').on('click', '.backinstock-notify', function() {\r\n var scrollToBISModule = function scrollIntoView(node) {\r\n var parent = node.parentElement;\r\n var parentCHeight = parent.clientHeight;\r\n var parentSHeight = parent.scrollHeight;\r\n // Doesn't scroll if parent element is body\r\n if (parentSHeight > parentCHeight && parent.parentElement) {\r\n var nodeHeight = node.clientHeight;\r\n var nodeOffset = node.offsetTop;\r\n var scrollOffset = nodeOffset + nodeHeight / 2 - parentCHeight / 2;\r\n parent.scrollTop = scrollOffset;\r\n }\r\n if (parent.parentElement) {\r\n scrollIntoView(parent);\r\n }\r\n };\r\n\r\n scrollToBISModule(document.querySelector('.product-description-container .attributes'));\r\n $('.notify-sign-up').removeClass('hide');\r\n $(this)\r\n .closest('.cart-and-ipay')\r\n .addClass('hide');\r\n});\r\n\r\n$('form.stock-notify-sign-up').on('stock-notify-sign-up:error', function(e, data) {\r\n csrf.updateTokens(data);\r\n});\r\n\r\n$('form[name=\"dwfrm_stockNotify\"]').on('submit', function(event) {\r\n event.preventDefault();\r\n\r\n var $form = $(this);\r\n var url = $form.attr('action');\r\n var pid = $('.product-id')\r\n .text()\r\n .trim();\r\n\r\n if (!pid) {\r\n return;\r\n }\r\n\r\n var newUrl = domUtil.appendToUrl(url, { pid: pid });\r\n var attentiveURL = domUtil.appendToUrl($form.data('attentive-action'), { pid: pid, isPDP: true });\r\n\r\n $form.spinner().start();\r\n $.ajax({\r\n url: newUrl,\r\n type: 'post',\r\n dataType: 'json',\r\n data: $form.serialize(),\r\n success: function(data) {\r\n if (!data.success) {\r\n $form.spinner().stop();\r\n formValidation($form, data);\r\n $('.error-msg').remove();\r\n if ('message' in data) {\r\n $form.find('#waitListJoin').addClass('is-invalid');\r\n $('#stock-notify-signup-form-email-error').empty();\r\n $('#stock-notify-signup-form-email-error').prepend(\"');\r\n }\r\n $('form.stock-notify-sign-up').trigger('stock-notify-sign-up:error', data);\r\n } else if (!$form.find('#attentive-pdp').is(':checked')) {\r\n $form.spinner().stop();\r\n $('.notify-sign-up .form-group, .notify-sign-up .btn.stock-notify-signup-email, .notify-sign-up.title').addClass('hide');\r\n $('.notify-sign-up .btn.stock-notify-signup-success').removeClass('hide');\r\n }\r\n },\r\n error: function() {\r\n $form.spinner().stop();\r\n }\r\n });\r\n\r\n if ($form.find('#attentive-pdp').is(':checked')) {\r\n $.ajax({\r\n url: attentiveURL,\r\n type: 'get',\r\n dataType: 'json',\r\n data: $form.serialize(),\r\n success: function (data) {\r\n $form.spinner().stop();\r\n if (!data.success) {\r\n formValidation($form, data);\r\n $('.error-msg').remove();\r\n if ('message' in data) {\r\n $form.find('#smsJoin').addClass('is-invalid');\r\n $('#sms-signup-form-error').empty();\r\n $('#sms-signup-form-error').prepend(\"');\r\n }\r\n $('form.stock-notify-sign-up').trigger('stock-notify-sign-up:error', data);\r\n } else {\r\n $('.notify-sign-up .form-group, .notify-sign-up .btn.stock-notify-signup-email, .notify-sign-up.title').addClass('hide');\r\n $('.notify-sign-up .btn.stock-notify-signup-success').removeClass('hide');\r\n }\r\n },\r\n error: function () {\r\n $form.spinner().stop();\r\n }\r\n });\r\n }\r\n});\r\n\r\n// remove isapplepay element on pdp for browsers that do not support it\r\nif ('ApplePaySession' in window === false) {\r\n $('isapplepay').remove();\r\n}\r\n\r\n// page load initialization on desktop only\r\nif (!customUtil.isMobile()) {\r\n setProductDetailsDescTop($('.product-detail'));\r\n\r\n $('body').on('click', '.product-pdp .size-attribute, .product-pdp .color-attribute', function() {\r\n window.scrollTo({ top: 0, behavior: 'smooth' });\r\n });\r\n}\r\n\r\n","'use strict';\r\nvar processInclude = require('base/util');\r\nvar base = require('./base');\r\nvar focusHelper = require('base/components/focus');\r\nvar baseQuickView = require('base/product/quickView');\r\n\r\n$(document).ready(function() {\r\n processInclude(require('./detail'));\r\n processInclude(require('./pdpProductDetails'));\r\n});\r\n\r\n/**\r\n * Generates the modal window on the first call.\r\n *\r\n */\r\nfunction getModalHtmlElement() {\r\n if ($('#quickViewModal').length !== 0) {\r\n $('#quickViewModal').remove();\r\n }\r\n var htmlString =\r\n '' +\r\n '
    ' +\r\n '' +\r\n '
    ' +\r\n '' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    ';\r\n $('body').append(htmlString);\r\n}\r\n\r\n/**\r\n * @typedef {Object} QuickViewHtml\r\n * @property {string} body - Main Quick View body\r\n * @property {string} footer - Quick View footer content\r\n */\r\n\r\n/**\r\n * Parse HTML code in Ajax response\r\n *\r\n * @param {string} html - Rendered HTML from quickview template\r\n * @return {QuickViewHtml} - QuickView content components\r\n */\r\nfunction parseHtml(html) {\r\n var $html = $('
    ').append($.parseHTML(html));\r\n\r\n var body = $html.find('.product-quickview');\r\n var footer = $html.find('.modal-footer').children();\r\n\r\n return { body: body, footer: footer };\r\n}\r\n\r\n/**\r\n * replaces the content in the modal window on for the selected product variation.\r\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\r\n */\r\nfunction fillModalElement(selectedValueUrl, el) {\r\n $('.modal-body')\r\n .spinner()\r\n .start();\r\n $.ajax({\r\n url: selectedValueUrl,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(data) {\r\n var parsedHtml = parseHtml(data.renderedTemplate),\r\n uniqueSellingPropsCopy = el.parent('.product-detail').find('.unique-selling-props-copy').clone();\r\n\r\n $('.quick-view-dialog .modal-body').empty();\r\n $('.quick-view-dialog .modal-body').html(parsedHtml.body);\r\n $('.quick-view-dialog .modal-footer').html(parsedHtml.footer);\r\n $('.full-pdp-link').text(data.quickViewFullDetailMsg);\r\n $('#quickViewModal .full-pdp-link').attr('href', data.productUrl);\r\n $('#quickViewModal .size-chart').attr('href', data.productUrl);\r\n $('#quickViewModal .modal-header .close .sr-only').text(data.closeButtonText);\r\n $('#quickViewModal .enter-message').text(data.enterDialogMessage);\r\n $('#quickViewModal .unique-selling-props-container').append(uniqueSellingPropsCopy);\r\n $('#quickViewModal').modal('show');\r\n\r\n $.spinner().stop();\r\n },\r\n error: function() {\r\n $.spinner().stop();\r\n }\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n showQuickview: function() {\r\n $('body').on('click', '.quickview', function(e) {\r\n e.preventDefault();\r\n var $this = $(this),\r\n selectedValueUrl = $this\r\n .closest('a.quickview')\r\n .attr('href');\r\n $(e.target).trigger('quickview:show');\r\n getModalHtmlElement();\r\n fillModalElement(selectedValueUrl, $this);\r\n });\r\n },\r\n focusQuickview: function() {\r\n $('body').on('shown.bs.modal', '#quickViewModal', function() {\r\n $('#quickViewModal .close').focus();\r\n });\r\n },\r\n trapQuickviewFocus: function() {\r\n $('body').on('keydown', '#quickViewModal', function(e) {\r\n var focusParams = {\r\n event: e,\r\n containerSelector: '#quickViewModal',\r\n firstElementSelector: '.full-pdp-link',\r\n lastElementSelector: '.add-to-cart-global',\r\n nextToLastElementSelector: '.modal-footer .quantity-select'\r\n };\r\n focusHelper.setTabNextFocus(focusParams);\r\n });\r\n },\r\n\r\n availability: base.availability,\r\n showSpinner: baseQuickView.showSpinner,\r\n hideDialog: baseQuickView.hideDialog,\r\n beforeUpdateAttribute: baseQuickView.beforeUpdateAttribute,\r\n updateAttribute: baseQuickView.updateAttribute,\r\n updateAddToCart: baseQuickView.updateAddToCart,\r\n updateAvailability: baseQuickView.updateAvailability\r\n};\r\n\r\n$(document).on('click', '.pdp-sizeGuide-modal .close', function() {\r\n $('#pdp-sizeGuide').remove();\r\n});\r\n\r\n$(document).on('show.bs.modal', '#quickViewModal', function() {\r\n $('.pdp-sizeGuide-modal .close').removeAttr('data-dismiss');\r\n $('.modal-body .swatch-circle').each(function(i, d) {\r\n if ($(d).hasClass('selected')) {\r\n var swatchVal = $(d).data('attr-value');\r\n $('.selected-color').text(swatchVal.toLowerCase());\r\n }\r\n });\r\n\r\n var tElement = document.querySelector('.product-desc .value');\r\n if (tElement != null) {\r\n var tElementText = tElement.innerText;\r\n var ellipsisText = EllipsisChar(tElementText, 168);\r\n tElement.innerText = ellipsisText;\r\n }\r\n});\r\n\r\nfunction EllipsisChar(text, size) {\r\n var len = text.length;\r\n\r\n if (len >= size) {\r\n text = text.substring(0, 168) + '...';\r\n }\r\n\r\n return text;\r\n}\r\n$(document).on('hidden.bs.modal', '#quickViewModal', function() {\r\n $('.modal-backdrop').remove();\r\n});\r\n","'use strict';\r\nvar base = require('./base');\r\nvar focusHelper = require('../components/focus');\r\n\r\n/**\r\n * Generates the modal window on the first call.\r\n *\r\n */\r\nfunction getModalHtmlElement() {\r\n if ($('#quickViewModal').length !== 0) {\r\n $('#quickViewModal').remove();\r\n }\r\n var htmlString = ''\r\n + '
    '\r\n + ''\r\n + '
    '\r\n + ''\r\n + '
    '\r\n + '
    '\r\n + ' '\r\n + ' '\r\n + '
    '\r\n + '
    '\r\n + '
    '\r\n + '
    '\r\n + '
    '\r\n + '
    ';\r\n $('body').append(htmlString);\r\n}\r\n\r\n/**\r\n * @typedef {Object} QuickViewHtml\r\n * @property {string} body - Main Quick View body\r\n * @property {string} footer - Quick View footer content\r\n */\r\n\r\n/**\r\n * Parse HTML code in Ajax response\r\n *\r\n * @param {string} html - Rendered HTML from quickview template\r\n * @return {QuickViewHtml} - QuickView content components\r\n */\r\nfunction parseHtml(html) {\r\n var $html = $('
    ').append($.parseHTML(html));\r\n\r\n var body = $html.find('.product-quickview');\r\n var footer = $html.find('.modal-footer').children();\r\n\r\n return { body: body, footer: footer };\r\n}\r\n\r\n/**\r\n * replaces the content in the modal window on for the selected product variation.\r\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\r\n */\r\nfunction fillModalElement(selectedValueUrl) {\r\n $('.modal-body').spinner().start();\r\n $.ajax({\r\n url: selectedValueUrl,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function (data) {\r\n var parsedHtml = parseHtml(data.renderedTemplate);\r\n\r\n $('.modal-body').empty();\r\n $('.modal-body').html(parsedHtml.body);\r\n $('.modal-footer').html(parsedHtml.footer);\r\n $('.full-pdp-link').text(data.quickViewFullDetailMsg);\r\n $('#quickViewModal .full-pdp-link').attr('href', data.productUrl);\r\n $('#quickViewModal .size-chart').attr('href', data.productUrl);\r\n $('#quickViewModal .modal-header .close .sr-only').text(data.closeButtonText);\r\n $('#quickViewModal .enter-message').text(data.enterDialogMessage);\r\n $('#quickViewModal').modal('show');\r\n $('body').trigger('quickview:ready');\r\n\r\n $.spinner().stop();\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n}\r\n\r\nmodule.exports = {\r\n showQuickview: function () {\r\n $('body').on('click', '.quickview', function (e) {\r\n e.preventDefault();\r\n var selectedValueUrl = $(this).closest('a.quickview').attr('href');\r\n $(e.target).trigger('quickview:show');\r\n getModalHtmlElement();\r\n fillModalElement(selectedValueUrl);\r\n });\r\n },\r\n focusQuickview: function () {\r\n $('body').on('shown.bs.modal', '#quickViewModal', function () {\r\n $('#quickViewModal .close').focus();\r\n });\r\n },\r\n trapQuickviewFocus: function () {\r\n $('body').on('keydown', '#quickViewModal', function (e) {\r\n var focusParams = {\r\n event: e,\r\n containerSelector: '#quickViewModal',\r\n firstElementSelector: '.full-pdp-link',\r\n lastElementSelector: '.add-to-cart-global',\r\n nextToLastElementSelector: '.modal-footer .quantity-select'\r\n };\r\n focusHelper.setTabNextFocus(focusParams);\r\n });\r\n },\r\n availability: base.availability,\r\n addToCart: base.addToCart,\r\n showSpinner: function () {\r\n $('body').on('product:beforeAddToCart', function (e, data) {\r\n $(data).closest('.modal-content').spinner().start();\r\n });\r\n },\r\n hideDialog: function () {\r\n $('body').on('product:afterAddToCart', function () {\r\n $('#quickViewModal').modal('hide');\r\n });\r\n },\r\n beforeUpdateAttribute: function () {\r\n $('body').on('product:beforeAttributeSelect', function () {\r\n $('.modal.show .modal-content').spinner().start();\r\n });\r\n },\r\n updateAttribute: function () {\r\n $('body').on('product:afterAttributeSelect', function (e, response) {\r\n if ($('.modal.show .product-quickview>.bundle-items').length) {\r\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\r\n $('.modal.show').find(response.container)\r\n .find('.product-id').text(response.data.product.id);\r\n } else if ($('.set-items').length) {\r\n response.container.find('.product-id').text(response.data.product.id);\r\n } else {\r\n $('.modal.show .product-quickview').data('pid', response.data.product.id);\r\n $('.modal.show .full-pdp-link')\r\n .attr('href', response.data.product.selectedProductUrl);\r\n }\r\n });\r\n },\r\n updateAddToCart: function () {\r\n $('body').on('product:updateAddToCart', function (e, response) {\r\n // update local add to cart (for sets)\r\n $('button.add-to-cart', response.$productContainer).attr('disabled',\r\n (!response.product.readyToOrder || !response.product.available));\r\n\r\n // update global add to cart (single products, bundles)\r\n var dialog = $(response.$productContainer)\r\n .closest('.quick-view-dialog');\r\n\r\n $('.add-to-cart-global', dialog).attr('disabled',\r\n !$('.global-availability', dialog).data('ready-to-order')\r\n || !$('.global-availability', dialog).data('available')\r\n );\r\n });\r\n },\r\n updateAvailability: function () {\r\n $('body').on('product:updateAvailability', function (e, response) {\r\n // bundle individual products\r\n $('.product-availability', response.$productContainer)\r\n .data('ready-to-order', response.product.readyToOrder)\r\n .data('available', response.product.available)\r\n .find('.availability-msg')\r\n .empty()\r\n .html(response.message);\r\n\r\n\r\n var dialog = $(response.$productContainer)\r\n .closest('.quick-view-dialog');\r\n\r\n if ($('.product-availability', dialog).length) {\r\n // bundle all products\r\n var allAvailable = $('.product-availability', dialog).toArray()\r\n .every(function (item) { return $(item).data('available'); });\r\n\r\n var allReady = $('.product-availability', dialog).toArray()\r\n .every(function (item) { return $(item).data('ready-to-order'); });\r\n\r\n $('.global-availability', dialog)\r\n .data('ready-to-order', allReady)\r\n .data('available', allAvailable);\r\n\r\n $('.global-availability .availability-msg', dialog).empty()\r\n .html(allReady ? response.message : response.resources.info_selectforstock);\r\n } else {\r\n // single product\r\n $('.global-availability', dialog)\r\n .data('ready-to-order', response.product.readyToOrder)\r\n .data('available', response.product.available)\r\n .find('.availability-msg')\r\n .empty()\r\n .html(response.message);\r\n }\r\n });\r\n }\r\n};\r\n","exports.isMobile = function () {\r\n var mobileAgentHash = ['mobile', 'tablet', 'phone', 'ipad', 'ipod', 'android', 'blackberry', 'windows ce', 'opera mini', 'palm'];\r\n var idx = 0;\r\n var isMobile = false;\r\n var userAgent = navigator.userAgent.toLowerCase();\r\n\r\n while (mobileAgentHash[idx] && !isMobile) {\r\n isMobile = userAgent.indexOf(mobileAgentHash[idx]) >= 0;\r\n idx++;\r\n }\r\n return isMobile;\r\n};\r\n\r\nexports.isSafari = function () {\r\n return navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/);\r\n};\r\n\r\nexports.iosVersion = function () {\r\n if (/iP(hone|od|ad)/.test(navigator.platform)) {\r\n var v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\r\n return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];\r\n }\r\n return null;\r\n};\r\n\r\nexports.getCookie = function (cookiename) {\r\n if (document.cookie.length > 0) {\r\n startC = document.cookie.indexOf(cookiename + '=');\r\n if (startC != -1) {\r\n startC += cookiename.length + 1;\r\n endC = document.cookie.indexOf(';', startC);\r\n if (endC == -1) endC = document.cookie.length;\r\n return decodeURI(document.cookie.substring(startC, endC));\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nexports.setCookie = function (cookieName, cookieValue, nDays) {\r\n var today = new Date();\r\n var expire = new Date();\r\n if (nDays == null || nDays == 0) nDays = 1;\r\n expire.setTime(today.getTime() + 3600000 * 24 * nDays);\r\n document.cookie = cookieName + '=' + escape(cookieValue) + '; expires=' + expire.toGMTString() + '; path=/';\r\n};\r\n\r\nexports.isEmpty = function (val) {\r\n // remove whitespaces\r\n if (typeof val === 'string') {\r\n val = $.trim(val);\r\n }\r\n\r\n return !val || val.length === 0;\r\n};\r\n\r\nexports.removeQueryParam = function (url) {\r\n var urlparts = String(url).split('?');\r\n if (urlparts.length >= 2) {\r\n return urlparts[0];\r\n }\r\n return url;\r\n};\r\n\r\nexports.getUrlQueryParameterValue = function (queryParamName, url) {\r\n var urlQueryVariables = url.split('&');\r\n var currentParameter;\r\n\r\n for (var i = 0; i < urlQueryVariables.length; i++) {\r\n currentParameter = urlQueryVariables[i].split('=');\r\n\r\n if (currentParameter[0] === queryParamName) {\r\n if (currentParameter[1] === undefined) {\r\n return true;\r\n }\r\n var decodedString = decodeURIComponent(currentParameter[1]);\r\n if (decodedString.split('|').length > 0) {\r\n return decodedString.split('|').join('+').replace(/\\s/g, '-').toLowerCase();\r\n }\r\n return decodedString.replace(/\\s/g, '-').toLowerCase();\r\n }\r\n }\r\n return false;\r\n};\r\n","/* eslint-env es6*/\r\n/* eslint-disable no-use-before-define */\r\n/* global _etmc */\r\n'use strict';\r\nvar base = require('base/product/base');\r\nvar focusHelper = require('../components/focus');\r\n\r\n/**\r\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\r\n * @param {Object} response - response from Ajax call\r\n * @param {Object} response.product - Product object\r\n * @param {string} response.product.id - Product ID\r\n * @param {jQuery} $productContainer - DOM element for a given product.\r\n * @param {string} attributeType - the attribute clicked (e.g size, color, quantity)\r\n * @param {Object[]} response.product.variationAttributes - Product attributes\r\n * @param {Object[]} response.product.images - Product images\r\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\r\n * attributes have been selected. Used partially to\r\n * determine whether the Add to Cart button can be enabled\r\n */\r\nfunction handleVariantResponse(response, $productContainer, attributeType) {\r\n var isChoiceOfBonusProducts = $productContainer.parents('.choose-bonus-product-dialog').length > 0;\r\n var isVaraint;\r\n var videoObj = null;\r\n\r\n if (response.product.pdpVideoID) {\r\n videoObj = {\r\n pdpVideoID: response.product.pdpVideoID,\r\n pdpVideoLink: response.product.pdpVideoLink\r\n };\r\n }\r\n if (response.product.variationAttributes) {\r\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\r\n isVaraint = response.product.productType === 'variant';\r\n if (isChoiceOfBonusProducts && isVaraint) {\r\n $productContainer.parent('.bonus-product-item').data('pid', response.product.id);\r\n\r\n $productContainer.parent('.bonus-product-item').data('ready-to-order', response.product.readyToOrder);\r\n }\r\n }\r\n\r\n if (attributeType === 'color') {\r\n // Update primary images\r\n var productImages = response.product.images;\r\n var primaryImageUrls = productImages.large;\r\n var hiResPrimaryImageUrls = productImages['hi-res'] !== 'undefined' ? productImages['hi-res'] : primaryImageUrls;\r\n createCarousel(primaryImageUrls, $productContainer, hiResPrimaryImageUrls, videoObj);\r\n createThumbnailCarousel(primaryImageUrls, $productContainer, videoObj);\r\n }\r\n\r\n // Update pricing\r\n if (!isChoiceOfBonusProducts) {\r\n var $priceSelector = $('.prices .price', $productContainer).length ? $('.prices .price', $productContainer) : $('.prices .price');\r\n $priceSelector.replaceWith(response.product.price.html);\r\n }\r\n\r\n // Update promotions\r\n $productContainer\r\n .find('.promotions')\r\n .empty()\r\n .html(response.product.promotionsHtml);\r\n\r\n updateAvailability(response, $productContainer);\r\n\r\n if (isChoiceOfBonusProducts) {\r\n var $selectButton = $productContainer.find('.select-bonus-product');\r\n $selectButton.trigger('bonusproduct:updateSelectButton', {\r\n product: response.product,\r\n $productContainer: $productContainer\r\n });\r\n } else {\r\n // Enable \"Add to Cart\" button if all required attributes have been selected\r\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global')\r\n .trigger('product:updateAddToCart', {\r\n product: response.product,\r\n $productContainer: $productContainer\r\n })\r\n .trigger('product:statusUpdate', response.product);\r\n }\r\n\r\n // Update attributes\r\n $productContainer\r\n .find('.main-attributes')\r\n .empty()\r\n .html(getAttributesHtml(response.product.attributes));\r\n}\r\n\r\n/**\r\n * Retrieve contextual quantity selector\r\n * @param {jquery} $el - DOM container for the relevant quantity\r\n * @return {jquery} - quantity selector DOM container\r\n */\r\nfunction getQuantitySelector($el) {\r\n return $el && $('.set-items').length\r\n ? $($el)\r\n .closest('.product-detail')\r\n .find('.quantity-select')\r\n : $('.quantity-select');\r\n}\r\n\r\n/**\r\n * Retrieve contextual size selector\r\n * @param {jquery} $el - DOM container for the relevant sizes\r\n * @return {jquery} - sizes selector DOM container\r\n */\r\nfunction getSizesSelector($el) {\r\n return $($el)\r\n .closest('.product-detail')\r\n .find('.size-selections');\r\n}\r\n\r\n/**\r\n * Process the attribute values for an attribute that has image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction processSwatchValues(attr, $productContainer, msgs) {\r\n attr.values.forEach(function(attrValue) {\r\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' + attrValue.value + '\"]');\r\n var $swatchButton = $attrValue.parent();\r\n\r\n if (attrValue.selected) {\r\n $attrValue.addClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\r\n } else {\r\n $attrValue.removeClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').empty();\r\n }\r\n\r\n if (attrValue.url) {\r\n $swatchButton.attr('data-url', attrValue.url);\r\n } else {\r\n $swatchButton.removeAttr('data-url');\r\n }\r\n\r\n // Disable if not selectable\r\n $attrValue.removeClass('selectable unselectable');\r\n\r\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\r\n });\r\n}\r\n\r\n/**\r\n * Process attribute values associated with an attribute that does not have image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction processNonSwatchValues(attr, $productContainer) {\r\n var $attr = '[data-attr=\"' + attr.id + '\"]';\r\n\r\n attr.values.forEach(function(attrValue) {\r\n var $attrValue = $productContainer.find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\r\n $attrValue.data('url', attrValue.url).removeAttr('disabled');\r\n\r\n if (!attrValue.selectable && !attrValue.enableBackInStockNotification) {\r\n $attrValue.attr('disabled', true);\r\n }\r\n if (!attrValue.selectable && attrValue.enableBackInStockNotification) {\r\n if ($attrValue.hasClass('size-attribute')) {\r\n $attrValue.addClass('show-backinstock-module');\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Dynamically creates Bootstrap carousel from response containing images\r\n * @param {Object[]} imgs - Array of large product images,along with related information\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Array} hiResImags - array of images\r\n * @param {Object} videoObj - object containing product video\r\n */\r\nfunction createCarousel(imgs, $productContainer, hiResImags, videoObj) {\r\n var indexAdjustment = !!videoObj ? 0 : 1;\r\n var carousel = $productContainer.find('.carousel');\r\n $(carousel).carousel('dispose');\r\n var carouselId = $(carousel).attr('id');\r\n $(carousel)\r\n .empty()\r\n .append(\r\n '
      ' +\r\n $(carousel).data('prev') +\r\n '' +\r\n $(carousel).data('next') +\r\n ''\r\n );\r\n for (var i = 0; i < imgs.length; i++) {\r\n var index = i ? i + indexAdjustment : i;\r\n $(\r\n '
      \"'
      '\r\n ).appendTo($(carousel).find('.carousel-inner'));\r\n $('
    1. ').appendTo($(carousel).find('.carousel-indicators'));\r\n if (!i && videoObj) {\r\n $(`
      \r\n \r\n
      \r\n
      \r\n
      `).appendTo($(carousel).find('.carousel-inner'));\r\n $('
    2. ').appendTo($(carousel).find('.carousel-indicators'));\r\n }\r\n }\r\n $($(carousel).find('.carousel-item'))\r\n .first()\r\n .addClass('active');\r\n $($(carousel).find('.carousel-indicators > li'))\r\n .first()\r\n .addClass('active');\r\n if (imgs.length === 1) {\r\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\r\n }\r\n $(carousel).carousel();\r\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\r\n}\r\n\r\n/**\r\n * Dynamically creates thumbnail carousel from response containing images\r\n * @param {Object[]} imgs - Array of large product images,along with related information\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Object} videoObj - object containing product video\r\n */\r\nfunction createThumbnailCarousel(imgs, $productContainer, videoObj) {\r\n var indexAdjustment = !!videoObj ? 0 : 1;\r\n var thumbnailCarousel = $productContainer.find('.thumbnail-carousel');\r\n\r\n // clear the active styling for the current selected thumbnail\r\n thumbnailCarousel.find('.thumbnail-carousel__item').removeClass('thumbnail-carousel__item--active');\r\n\r\n var template = '';\r\n\r\n $(thumbnailCarousel)\r\n .empty()\r\n .append(template);\r\n\r\n var setActiveThumbnail = function(delayInMS) {\r\n return new Promise(function(resolve) {\r\n setTimeout(resolve, delayInMS);\r\n });\r\n };\r\n\r\n var $thumbnailCarouselItems = document.querySelectorAll('.thumbnail-carousel__item');\r\n\r\n var imagesLoaded = 0;\r\n var observer = new IntersectionObserver(function(entries) {\r\n entries.forEach(function(entry) {\r\n if (entry.isIntersecting) {\r\n imagesLoaded++;\r\n }\r\n });\r\n\r\n if (\r\n imagesLoaded > 2 &&\r\n $(entries[0].target)\r\n .find('img')\r\n .is(':visible')\r\n ) {\r\n setActiveThumbnail(2000).then(function() {\r\n if (!$(entries[0].target).hasClass('thumbnail-carousel__item--active')) {\r\n $(entries[0].target).addClass('thumbnail-carousel__item--active');\r\n }\r\n });\r\n }\r\n }, {});\r\n\r\n $thumbnailCarouselItems.forEach(function(carousel) {\r\n observer.observe(carousel);\r\n });\r\n\r\n if (!!videoObj) {\r\n $.ajax({\r\n type: 'GET',\r\n url: 'https://vimeo.com/api/v2/video/' + videoObj.pdpVideoID + '.json',\r\n dataType: 'json',\r\n success: function (data) {\r\n var thumbnailUrl = data[0].thumbnail_large;\r\n $('.video-thumbnail').attr('src', thumbnailUrl);\r\n $('.pdp-main-video').attr('poster', thumbnailUrl);\r\n }\r\n });\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Routes the handling of attribute processing depending on whether the attribute has image\r\n * swatches or not\r\n *\r\n * @param {Object} attrs - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction updateAttrs(attrs, $productContainer, msgs) {\r\n // Currently, the only attribute type that has image swatches is Color.\r\n var attrsWithSwatches = ['color'];\r\n\r\n attrs.forEach(function(attr) {\r\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\r\n processSwatchValues(attr, $productContainer, msgs);\r\n updateSizeUrl(attrs[1], $productContainer);\r\n } else {\r\n processNonSwatchValues(attr, $productContainer);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Routes the handling of size attribute processing depending on whether the attribute has image\r\n * swatches or not\r\n *\r\n * @param {Object} attr - Size attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction updateSizeUrl(attr, $productContainer) {\r\n var sizesHtml = attr.values\r\n .map(function(size) {\r\n var selectable = size.selectable ? 'selectable' : 'unselectable';\r\n var selected = size.selected ? 'selected' : '';\r\n\r\n return (\r\n ''\r\n );\r\n })\r\n .join('');\r\n getSizesSelector($productContainer)\r\n .empty()\r\n .html(sizesHtml);\r\n}\r\n\r\n/**\r\n * Updates the availability status in the Product Detail Page\r\n *\r\n * @param {Object} response - Ajax response object after an\r\n * attribute value has been [de]selected\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n */\r\nfunction updateAvailability(response, $productContainer) {\r\n var availabilityValue = '';\r\n var availabilityMessages = response.product.availability.messages;\r\n var availabiityContainer = $productContainer.find('.product-description .availability');\r\n if (!response.product.available) {\r\n if (availabiityContainer.hasClass('hide-incart')) {\r\n availabiityContainer.removeClass('hide-incart');\r\n }\r\n } else if (!availabiityContainer.hasClass('hide-incart')) {\r\n availabiityContainer.addClass('hide-incart');\r\n }\r\n availabiityContainer.data('available', response.product.available);\r\n if (!response.product.readyToOrder) {\r\n availabilityValue = '
    3. ' + response.resources.info_selectforstock + '
    4. ';\r\n } else if (response.product.availability.classType === 'qty-err') {\r\n availabilityValue = '
    5. Please select a lesser quantity to update
    6. ';\r\n } else {\r\n availabilityMessages.forEach(function(message) {\r\n availabilityValue += '
    7. ' + message + '
    8. ';\r\n });\r\n }\r\n\r\n $($productContainer).trigger('product:updateAvailability', {\r\n product: response.product,\r\n $productContainer: $productContainer,\r\n message: availabilityValue,\r\n resources: response.resources\r\n });\r\n}\r\n\r\n/**\r\n * Generates html for product attributes section\r\n *\r\n * @param {array} attributes - list of attributes\r\n * @return {string} - Compiled HTML\r\n */\r\nfunction getAttributesHtml(attributes) {\r\n if (!attributes) {\r\n return '';\r\n }\r\n\r\n var html = '';\r\n\r\n attributes.forEach(function(attributeGroup) {\r\n if (attributeGroup.ID === 'mainAttributes') {\r\n attributeGroup.attributes.forEach(function(attribute) {\r\n html += '
      ' + attribute.label + ': ' + attribute.value + '
      ';\r\n });\r\n }\r\n });\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * @typedef UpdatedOptionValue\r\n * @type Object\r\n * @property {string} id - Option value ID for look up\r\n * @property {string} url - Updated option value selection URL\r\n */\r\n\r\n/**\r\n * @typedef OptionSelectionResponse\r\n * @type Object\r\n * @property {string} priceHtml - Updated price HTML code\r\n * @property {Object} options - Updated Options\r\n * @property {string} options.id - Option ID\r\n * @property {UpdatedOptionValue[]} options.values - Option values\r\n */\r\n\r\n/**\r\n * Updates DOM using post-option selection Ajax response\r\n *\r\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n */\r\nfunction updateOptions(optionsHtml, $productContainer) {\r\n // Update options\r\n $productContainer\r\n .find('.product-options')\r\n .empty()\r\n .html(optionsHtml);\r\n}\r\n\r\n/**\r\n * @typespec UpdatedQuantity\r\n * @type Object\r\n * @property {boolean} selected - Whether the quantity has been selected\r\n * @property {string} value - The number of products to purchase\r\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\r\n * etc.\r\n */\r\n\r\n/**\r\n * Updates the quantity DOM elements post Ajax call\r\n * @param {UpdatedQuantity[]} quantities -\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction updateQuantities(quantities, $productContainer) {\r\n if (!($productContainer.parent('.bonus-product-item').length > 0)) {\r\n var optionsHtml = quantities\r\n .map(function(quantity) {\r\n var selected = quantity.selected ? ' selected ' : '';\r\n return '';\r\n })\r\n .join('');\r\n getQuantitySelector($productContainer)\r\n .empty()\r\n .html(optionsHtml);\r\n }\r\n}\r\n\r\n/**\r\n * updates the product view when a product attribute is selected or deselected or when\r\n * changing quantity\r\n * @param {string} selectedValueUrl - the Url for the selected variation value\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n * @param {string} attributeType - the attribute clicked (e.g size, color, quantity)\r\n */\r\nfunction attributeSelect(selectedValueUrl, $productContainer, attributeType) {\r\n if (selectedValueUrl) {\r\n $('body').trigger('product:beforeAttributeSelect', { url: selectedValueUrl, container: $productContainer });\r\n\r\n $.ajax({\r\n url: `${selectedValueUrl}&variationType=${attributeType}`,\r\n method: 'GET',\r\n success: function(data) {\r\n if (data.redirect) {\r\n window.location.href = data.redirect;\r\n return;\r\n }\r\n handleVariantResponse(data, $productContainer, attributeType);\r\n updateOptions(data.product.optionsHtml, $productContainer);\r\n updateQuantities(data.product.quantities, $productContainer);\r\n $('body').trigger('product:afterAttributeSelect', { data: data, container: $productContainer, attributeType });\r\n },\r\n complete: function() {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @return {string} - The provided URL to use when adding a product to the cart\r\n */\r\nfunction getAddToCartUrl() {\r\n return $('.add-to-cart-url').val();\r\n}\r\n\r\n/**\r\n * Parses the html for a modal window\r\n * @param {string} html - representing the body and footer of the modal window\r\n *\r\n * @return {Object} - Object with properties body and footer.\r\n */\r\nfunction parseHtml(html) {\r\n var $html = $('
      ').append($.parseHTML(html));\r\n\r\n var body = $html.find('.choice-of-bonus-product');\r\n var footer = $html.find('.modal-footer').children();\r\n\r\n return { body: body, footer: footer };\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @param {Object} data - data object used to fill in dynamic portions of the html\r\n */\r\nfunction chooseBonusProducts(data) {\r\n $('.modal-body')\r\n .spinner()\r\n .start();\r\n\r\n if ($('#chooseBonusProductModal').length !== 0) {\r\n $('#chooseBonusProductModal').remove();\r\n }\r\n var bonusUrl;\r\n if (data.bonusChoiceRuleBased) {\r\n bonusUrl = data.showProductsUrlRuleBased;\r\n } else {\r\n bonusUrl = data.showProductsUrlListBased;\r\n }\r\n\r\n var htmlString =\r\n '' +\r\n '
      ' +\r\n '' +\r\n '
      ' +\r\n '' +\r\n '
      ' +\r\n '
      ' +\r\n ' ' +\r\n data.labels.selectprods +\r\n '' +\r\n ' ' +\r\n '
      ' +\r\n '
      ' +\r\n '
      ' +\r\n '
      ' +\r\n '
      ' +\r\n '
      ';\r\n $('body').append(htmlString);\r\n $('.modal-body')\r\n .spinner()\r\n .start();\r\n\r\n $.ajax({\r\n url: bonusUrl,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function(response) {\r\n var parsedHtml = parseHtml(response.renderedTemplate);\r\n $('#chooseBonusProductModal .modal-body').empty();\r\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\r\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\r\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\r\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\r\n $('#chooseBonusProductModal').modal('show');\r\n },\r\n complete: function() {\r\n $.spinner().stop();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\r\n * @param {string} response - ajax response from clicking the add to cart button\r\n * @param {jQuery} $addToCartBtn = add to cart button clicked\r\n */\r\nfunction handlePostCartAdd(response, $addToCartBtn) {\r\n $('.minicart').trigger('count:update', response);\r\n\r\n var $messageQtyError = $addToCartBtn.closest('.product-detail').find('.message.qty-err');\r\n var $messageNoStock = $addToCartBtn.closest('.product-detail').find('.message.no-stock');\r\n if ($messageQtyError.length || $messageNoStock.length) {\r\n $addToCartBtn.prop('disabled', true);\r\n return;\r\n }\r\n // show add to cart toast\r\n if (response.newBonusDiscountLineItem && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\r\n chooseBonusProducts(response.newBonusDiscountLineItem);\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\r\n * items with their selected variants\r\n *\r\n * @return {string[]} - List of selected bundle product item ID's\r\n */\r\nfunction getChildProducts() {\r\n var childProducts = [];\r\n $('.bundle-item').each(function() {\r\n childProducts.push({\r\n pid: $(this)\r\n .find('.product-id')\r\n .text(),\r\n quantity: parseInt(\r\n $(this)\r\n .find('label.quantity')\r\n .data('quantity'),\r\n 10\r\n )\r\n });\r\n });\r\n\r\n return childProducts.length ? JSON.stringify(childProducts) : [];\r\n}\r\n\r\n/**\r\n * Retrieve product options\r\n *\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n * @return {string} - Product options and their selected values\r\n */\r\nfunction getOptions($productContainer) {\r\n var options = $productContainer\r\n .find('.product-option')\r\n .map(function() {\r\n var $elOption = $(this).find('.options-select');\r\n var urlValue = $elOption.val();\r\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]').data('value-id');\r\n return {\r\n optionId: $(this).data('option-id'),\r\n selectedValueId: selectedValueId\r\n };\r\n })\r\n .toArray();\r\n\r\n return JSON.stringify(options);\r\n}\r\n\r\nmodule.exports = {\r\n attributeSelect: attributeSelect,\r\n methods: {\r\n editBonusProducts: function(data) {\r\n chooseBonusProducts(data);\r\n }\r\n },\r\n\r\n focusChooseBonusProductModal: function() {\r\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function() {\r\n $('#chooseBonusProductModal')\r\n .siblings()\r\n .attr('aria-hidden', 'true');\r\n $('#chooseBonusProductModal .close').focus();\r\n });\r\n },\r\n\r\n onClosingChooseBonusProductModal: function() {\r\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function() {\r\n $('#chooseBonusProductModal')\r\n .siblings()\r\n .attr('aria-hidden', 'false');\r\n });\r\n },\r\n\r\n trapChooseBonusProductModalFocus: function() {\r\n $('body').on('keydown', '#chooseBonusProductModal', function(e) {\r\n var focusParams = {\r\n event: e,\r\n containerSelector: '#chooseBonusProductModal',\r\n firstElementSelector: '.close',\r\n lastElementSelector: '.add-bonus-products'\r\n };\r\n focusHelper.setTabNextFocus(focusParams);\r\n });\r\n },\r\n\r\n colorAttribute: function() {\r\n $(document).on('click', '[data-attr=\"color\"] button', function(e) {\r\n e.preventDefault();\r\n\r\n if (\r\n $(this).attr('disabled') ||\r\n $(this)\r\n .find('.swatch-value')\r\n .hasClass('selected')\r\n ) {\r\n return;\r\n }\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n\r\n attributeSelect($(this).attr('data-url'), $productContainer, 'color');\r\n });\r\n },\r\n\r\n selectAttribute: function() {\r\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function(e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n attributeSelect(e.currentTarget.value, $productContainer, 'quantity');\r\n });\r\n },\r\n\r\n availability: function() {\r\n $(document).on('change', '.quantity-select', function(e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this)\r\n .closest('.modal-content')\r\n .find('.product-quickview');\r\n }\r\n\r\n if ($('.bundle-items', $productContainer).length === 0) {\r\n attributeSelect(\r\n $(e.currentTarget)\r\n .find('option:selected')\r\n .data('url'),\r\n $productContainer,\r\n 'quantity'\r\n );\r\n }\r\n });\r\n },\r\n updateProductPromotions: function($el, promotions) {\r\n if ($el.length && promotions.length) {\r\n $el.empty();\r\n\r\n var template = '';\r\n\r\n promotions.forEach(promotion => {\r\n template += `
      ${promotion.calloutMsg}
      `;\r\n });\r\n $el.html(template);\r\n }\r\n },\r\n addToCart: function() {\r\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function() {\r\n var addToCartUrl;\r\n var pid;\r\n var pidsObj;\r\n var setPids;\r\n var $thisBtnAdd = $(this);\r\n\r\n $('body').trigger('product:beforeAddToCart', this);\r\n\r\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\r\n var $messageQtyError = $(this)\r\n .closest('.product-detail')\r\n .find('.message.qty-err');\r\n var $messageNoStock = $(this)\r\n .closest('.product-detail')\r\n .find('.message.no-stock');\r\n if ($messageQtyError.length || $messageNoStock.length) {\r\n $.spinner().stop();\r\n $(this).prop('disabled', true);\r\n return;\r\n }\r\n\r\n setPids = [];\r\n\r\n $('.product-detail').each(function() {\r\n if (\r\n !$(this).hasClass('product-set-detail') &&\r\n $(this).find('.size-selections .size-attribute .size-value.selected') &&\r\n $(this).find('.quantity-select').length\r\n ) {\r\n setPids.push({\r\n pid: $(this)\r\n .find('.product-id')\r\n .text(),\r\n qty: $(this)\r\n .find('.quantity-select')\r\n .val(),\r\n options: getOptions($(this))\r\n });\r\n }\r\n });\r\n pidsObj = JSON.stringify(setPids);\r\n }\r\n\r\n pid = base.getPidValue($(this));\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this)\r\n .closest('.quick-view-dialog')\r\n .find('.product-detail');\r\n }\r\n\r\n addToCartUrl = getAddToCartUrl();\r\n\r\n var form = {\r\n pid: pid,\r\n pidsObj: pidsObj,\r\n childProducts: getChildProducts(),\r\n quantity: base.getQuantitySelected($(this))\r\n };\r\n\r\n if (!$('.bundle-item').length) {\r\n form.options = getOptions($productContainer);\r\n }\r\n\r\n $(this).trigger('updateAddToCartFormData', form);\r\n if (addToCartUrl) {\r\n $.ajax({\r\n url: addToCartUrl,\r\n method: 'POST',\r\n data: form,\r\n success: function(data) {\r\n handlePostCartAdd(data, $thisBtnAdd);\r\n data.addedPid = pid;\r\n if (!data.error) {\r\n $('body').trigger('product:afterAddToCart', data);\r\n }\r\n base.miniCartReportingUrl(data.reportingURL);\r\n if (data.sfmcCartInfo && typeof _etmc !== 'undefined') {\r\n _etmc.push(data.sfmcCartInfo);\r\n }\r\n },\r\n complete: function() {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n });\r\n },\r\n selectBonusProduct: base.selectBonusProduct,\r\n removeBonusProduct: base.removeBonusProduct,\r\n enableBonusProductSelection: base.enableBonusProductSelection,\r\n showMoreBonusProducts: base.showMoreBonusProducts,\r\n addBonusProductsToCart: base.addBonusProductsToCart,\r\n getPidValue: base.getPidValue,\r\n getQuantitySelected: base.getQuantitySelected,\r\n miniCartReportingUrl: base.miniCartReportingUrl,\r\n backToTop: function() {\r\n const $el = $('.back-to-top');\r\n\r\n if ($el.length > 0) {\r\n $el.on('click', () => {\r\n $('html, body').animate({ scrollTop: 0 }, 500);\r\n });\r\n }\r\n }\r\n};\r\n","'use strict';\r\n\r\nmodule.exports = {\r\n setTabNextFocus: function (focusParams) {\r\n var KEYCODE_TAB = 9;\r\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\r\n\r\n if (!isTabPressed) {\r\n return;\r\n }\r\n\r\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\r\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\r\n\r\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\r\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\r\n if ($('.product-quickview.product-set').length > 0) {\r\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\r\n lastFocusableEl = linkElements[linkElements.length - 1];\r\n }\r\n }\r\n\r\n if (focusParams.event.shiftKey) /* shift + tab */ {\r\n if ($(':focus').is(firstFocusableEl)) {\r\n lastFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n } else /* tab */ {\r\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\r\n firstFocusableEl.focus();\r\n focusParams.event.preventDefault();\r\n }\r\n }\r\n }\r\n};\r\n","'use strict';\r\nvar focusHelper = require('../components/focus');\r\n\r\n/**\r\n * Retrieves the relevant pid value\r\n * @param {jquery} $el - DOM container for a given add to cart button\r\n * @return {string} - value to be used when adding product to cart\r\n */\r\nfunction getPidValue($el) {\r\n var pid;\r\n\r\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\r\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\r\n } else if ($('.product-set-detail').length || $('.product-set').length) {\r\n pid = $($el).closest('.product-detail').find('.product-id').text();\r\n } else {\r\n // BF might be using element text or data attribute which is also used by add to cart in PDP. Use different attribute for ATC.\r\n var $productDetail = $('.product-detail:not(\".bundle-item\")');\r\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\r\n if ($productDetail.hasClass('bfx-price-product')) {\r\n var atcPid = $('.product-detail:not(\".bundle-item\")').data('addtocartPid');\r\n if (atcPid) {\r\n pid = atcPid;\r\n }\r\n }\r\n }\r\n\r\n return pid;\r\n}\r\n\r\n/**\r\n * Retrieve contextual quantity selector\r\n * @param {jquery} $el - DOM container for the relevant quantity\r\n * @return {jquery} - quantity selector DOM container\r\n */\r\nfunction getQuantitySelector($el) {\r\n return $el && $('.set-items').length\r\n ? $($el).closest('.product-detail').find('.quantity-select')\r\n : $('.quantity-select');\r\n}\r\n\r\n/**\r\n * Retrieves the value associated with the Quantity pull-down menu\r\n * @param {jquery} $el - DOM container for the relevant quantity\r\n * @return {string} - value found in the quantity input\r\n */\r\nfunction getQuantitySelected($el) {\r\n return getQuantitySelector($el).val();\r\n}\r\n\r\n/**\r\n * Process the attribute values for an attribute that has image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction processSwatchValues(attr, $productContainer, msgs) {\r\n attr.values.forEach(function (attrValue) {\r\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\r\n attrValue.value + '\"]');\r\n var $swatchButton = $attrValue.parent();\r\n\r\n if (attrValue.selected) {\r\n $attrValue.addClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\r\n } else {\r\n $attrValue.removeClass('selected');\r\n $attrValue.siblings('.selected-assistive-text').empty();\r\n }\r\n\r\n if (attrValue.url) {\r\n $swatchButton.attr('data-url', attrValue.url);\r\n } else {\r\n $swatchButton.removeAttr('data-url');\r\n }\r\n\r\n // Disable if not selectable\r\n $attrValue.removeClass('selectable unselectable');\r\n\r\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\r\n });\r\n}\r\n\r\n/**\r\n * Process attribute values associated with an attribute that does not have image swatches\r\n *\r\n * @param {Object} attr - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {Object[]} attr.values - Array of attribute value objects\r\n * @param {string} attr.values.value - Attribute coded value\r\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\r\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\r\n * selected. If there is no variant that corresponds to a specific combination of attribute\r\n * values, an attribute may be disabled in the Product Detail Page\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction processNonSwatchValues(attr, $productContainer) {\r\n var $attr = '[data-attr=\"' + attr.id + '\"]';\r\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\r\n $defaultOption.attr('value', attr.resetUrl);\r\n\r\n attr.values.forEach(function (attrValue) {\r\n var $attrValue = $productContainer\r\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\r\n $attrValue.attr('value', attrValue.url)\r\n .removeAttr('disabled');\r\n\r\n if (!attrValue.selectable) {\r\n $attrValue.attr('disabled', true);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Routes the handling of attribute processing depending on whether the attribute has image\r\n * swatches or not\r\n *\r\n * @param {Object} attrs - Attribute\r\n * @param {string} attr.id - Attribute ID\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n * @param {Object} msgs - object containing resource messages\r\n */\r\nfunction updateAttrs(attrs, $productContainer, msgs) {\r\n // Currently, the only attribute type that has image swatches is Color.\r\n var attrsWithSwatches = ['color'];\r\n\r\n attrs.forEach(function (attr) {\r\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\r\n processSwatchValues(attr, $productContainer, msgs);\r\n } else {\r\n processNonSwatchValues(attr, $productContainer);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the availability status in the Product Detail Page\r\n *\r\n * @param {Object} response - Ajax response object after an\r\n * attribute value has been [de]selected\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n */\r\nfunction updateAvailability(response, $productContainer) {\r\n var availabilityValue = '';\r\n var availabilityMessages = response.product.availability.messages;\r\n if (!response.product.readyToOrder) {\r\n availabilityValue = '
    9. ' + response.resources.info_selectforstock + '
    10. ';\r\n } else {\r\n availabilityMessages.forEach(function (message) {\r\n availabilityValue += '
    11. ' + message + '
    12. ';\r\n });\r\n }\r\n\r\n $($productContainer).trigger('product:updateAvailability', {\r\n product: response.product,\r\n $productContainer: $productContainer,\r\n message: availabilityValue,\r\n resources: response.resources\r\n });\r\n}\r\n\r\n/**\r\n * Generates html for product attributes section\r\n *\r\n * @param {array} attributes - list of attributes\r\n * @return {string} - Compiled HTML\r\n */\r\nfunction getAttributesHtml(attributes) {\r\n if (!attributes) {\r\n return '';\r\n }\r\n\r\n var html = '';\r\n\r\n attributes.forEach(function (attributeGroup) {\r\n if (attributeGroup.ID === 'mainAttributes') {\r\n attributeGroup.attributes.forEach(function (attribute) {\r\n html += '
      ' + attribute.label + ': '\r\n + attribute.value + '
      ';\r\n });\r\n }\r\n });\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * @typedef UpdatedOptionValue\r\n * @type Object\r\n * @property {string} id - Option value ID for look up\r\n * @property {string} url - Updated option value selection URL\r\n */\r\n\r\n/**\r\n * @typedef OptionSelectionResponse\r\n * @type Object\r\n * @property {string} priceHtml - Updated price HTML code\r\n * @property {Object} options - Updated Options\r\n * @property {string} options.id - Option ID\r\n * @property {UpdatedOptionValue[]} options.values - Option values\r\n */\r\n\r\n/**\r\n * Updates DOM using post-option selection Ajax response\r\n *\r\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n */\r\nfunction updateOptions(optionsHtml, $productContainer) {\r\n\t// Update options\r\n $productContainer.find('.product-options').empty().html(optionsHtml);\r\n}\r\n\r\n/**\r\n * Dynamically creates Bootstrap carousel from response containing images\r\n * @param {Object[]} imgs - Array of large product images,along with related information\r\n * @param {jQuery} $productContainer - DOM element for a given product\r\n */\r\nfunction createCarousel(imgs, $productContainer) {\r\n var carousel = $productContainer.find('.carousel');\r\n $(carousel).carousel('dispose');\r\n var carouselId = $(carousel).attr('id');\r\n $(carousel).empty().append('
        ' + $(carousel).data('prev') + '' + $(carousel).data('next') + '');\r\n for (var i = 0; i < imgs.length; i++) {\r\n $('
        \"'
        ').appendTo($(carousel).find('.carousel-inner'));\r\n $('
      1. ').appendTo($(carousel).find('.carousel-indicators'));\r\n }\r\n $($(carousel).find('.carousel-item')).first().addClass('active');\r\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\r\n if (imgs.length === 1) {\r\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\r\n }\r\n $(carousel).carousel();\r\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\r\n}\r\n\r\n/**\r\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\r\n * @param {Object} response - response from Ajax call\r\n * @param {Object} response.product - Product object\r\n * @param {string} response.product.id - Product ID\r\n * @param {Object[]} response.product.variationAttributes - Product attributes\r\n * @param {Object[]} response.product.images - Product images\r\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\r\n * attributes have been selected. Used partially to\r\n * determine whether the Add to Cart button can be enabled\r\n * @param {jQuery} $productContainer - DOM element for a given product.\r\n */\r\nfunction handleVariantResponse(response, $productContainer) {\r\n var isChoiceOfBonusProducts =\r\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\r\n var isVaraint;\r\n if (response.product.variationAttributes) {\r\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\r\n isVaraint = response.product.productType === 'variant';\r\n if (isChoiceOfBonusProducts && isVaraint) {\r\n $productContainer.parent('.bonus-product-item')\r\n .data('pid', response.product.id);\r\n\r\n $productContainer.parent('.bonus-product-item')\r\n .data('ready-to-order', response.product.readyToOrder);\r\n }\r\n }\r\n\r\n // Update primary images\r\n var primaryImageUrls = response.product.images.large;\r\n createCarousel(primaryImageUrls, $productContainer);\r\n\r\n // Update pricing\r\n if (!isChoiceOfBonusProducts) {\r\n var $priceSelector = $('.prices .price', $productContainer).length\r\n ? $('.prices .price', $productContainer)\r\n : $('.prices .price');\r\n $priceSelector.replaceWith(response.product.price.html);\r\n }\r\n\r\n // Update promotions\r\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\r\n\r\n updateAvailability(response, $productContainer);\r\n\r\n if (isChoiceOfBonusProducts) {\r\n var $selectButton = $productContainer.find('.select-bonus-product');\r\n $selectButton.trigger('bonusproduct:updateSelectButton', {\r\n product: response.product, $productContainer: $productContainer\r\n });\r\n } else {\r\n // Enable \"Add to Cart\" button if all required attributes have been selected\r\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\r\n product: response.product, $productContainer: $productContainer\r\n }).trigger('product:statusUpdate', response.product);\r\n }\r\n\r\n // Update attributes\r\n $productContainer.find('.main-attributes').empty()\r\n .html(getAttributesHtml(response.product.attributes));\r\n}\r\n\r\n/**\r\n * @typespec UpdatedQuantity\r\n * @type Object\r\n * @property {boolean} selected - Whether the quantity has been selected\r\n * @property {string} value - The number of products to purchase\r\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\r\n * etc.\r\n */\r\n\r\n/**\r\n * Updates the quantity DOM elements post Ajax call\r\n * @param {UpdatedQuantity[]} quantities -\r\n * @param {jQuery} $productContainer - DOM container for a given product\r\n */\r\nfunction updateQuantities(quantities, $productContainer) {\r\n if (!($productContainer.parent('.bonus-product-item').length > 0)) {\r\n var optionsHtml = quantities.map(function (quantity) {\r\n var selected = quantity.selected ? ' selected ' : '';\r\n return '';\r\n }).join('');\r\n getQuantitySelector($productContainer).empty().html(optionsHtml);\r\n }\r\n}\r\n\r\n/**\r\n * updates the product view when a product attribute is selected or deselected or when\r\n * changing quantity\r\n * @param {string} selectedValueUrl - the Url for the selected variation value\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n */\r\nfunction attributeSelect(selectedValueUrl, $productContainer) {\r\n if (selectedValueUrl) {\r\n $('body').trigger('product:beforeAttributeSelect',\r\n { url: selectedValueUrl, container: $productContainer });\r\n\r\n $.ajax({\r\n url: selectedValueUrl,\r\n method: 'GET',\r\n success: function (data) {\r\n handleVariantResponse(data, $productContainer);\r\n updateOptions(data.product.optionsHtml, $productContainer);\r\n updateQuantities(data.product.quantities, $productContainer);\r\n $('body').trigger('product:afterAttributeSelect',\r\n { data: data, container: $productContainer });\r\n $.spinner().stop();\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @return {string} - The provided URL to use when adding a product to the cart\r\n */\r\nfunction getAddToCartUrl() {\r\n return $('.add-to-cart-url').val();\r\n}\r\n\r\n/**\r\n * Parses the html for a modal window\r\n * @param {string} html - representing the body and footer of the modal window\r\n *\r\n * @return {Object} - Object with properties body and footer.\r\n */\r\nfunction parseHtml(html) {\r\n var $html = $('
        ').append($.parseHTML(html));\r\n\r\n var body = $html.find('.choice-of-bonus-product');\r\n var footer = $html.find('.modal-footer').children();\r\n\r\n return { body: body, footer: footer };\r\n}\r\n\r\n/**\r\n * Retrieves url to use when adding a product to the cart\r\n *\r\n * @param {Object} data - data object used to fill in dynamic portions of the html\r\n */\r\nfunction chooseBonusProducts(data) {\r\n $('.modal-body').spinner().start();\r\n\r\n if ($('#chooseBonusProductModal').length !== 0) {\r\n $('#chooseBonusProductModal').remove();\r\n }\r\n var bonusUrl;\r\n if (data.bonusChoiceRuleBased) {\r\n bonusUrl = data.showProductsUrlRuleBased;\r\n } else {\r\n bonusUrl = data.showProductsUrlListBased;\r\n }\r\n\r\n var htmlString = ''\r\n + '
        '\r\n + ''\r\n + '
        '\r\n + ''\r\n + '
        '\r\n + '
        '\r\n + ' ' + data.labels.selectprods + ''\r\n + ' '\r\n + '
        '\r\n + '
        '\r\n + '
        '\r\n + '
        '\r\n + '
        '\r\n + '
        ';\r\n $('body').append(htmlString);\r\n $('.modal-body').spinner().start();\r\n\r\n $.ajax({\r\n url: bonusUrl,\r\n method: 'GET',\r\n dataType: 'json',\r\n success: function (response) {\r\n var parsedHtml = parseHtml(response.renderedTemplate);\r\n $('#chooseBonusProductModal .modal-body').empty();\r\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\r\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\r\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\r\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\r\n $('#chooseBonusProductModal').modal('show');\r\n $.spinner().stop();\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\r\n * @param {string} response - ajax response from clicking the add to cart button\r\n */\r\nfunction handlePostCartAdd(response) {\r\n $('.minicart').trigger('count:update', response);\r\n var messageType = response.error ? 'alert-danger' : 'alert-success';\r\n // show add to cart toast\r\n if (response.newBonusDiscountLineItem\r\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\r\n chooseBonusProducts(response.newBonusDiscountLineItem);\r\n } else {\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append(\r\n '
        '\r\n );\r\n }\r\n\r\n $('.add-to-cart-messages').append(\r\n '
        '\r\n + ''\r\n + response.message\r\n + '
        '\r\n )\r\n\r\n var $checkIcon = $('.check-icon-reference').clone();\r\n $('.add-to-cart-messages .icon-check').append($checkIcon);\r\n\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n }, 5000);\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\r\n * items with their selected variants\r\n *\r\n * @return {string[]} - List of selected bundle product item ID's\r\n */\r\nfunction getChildProducts() {\r\n var childProducts = [];\r\n $('.bundle-item').each(function () {\r\n childProducts.push({\r\n pid: $(this).find('.product-id').text(),\r\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\r\n });\r\n });\r\n\r\n return childProducts.length ? JSON.stringify(childProducts) : [];\r\n}\r\n\r\n/**\r\n * Retrieve product options\r\n *\r\n * @param {jQuery} $productContainer - DOM element for current product\r\n * @return {string} - Product options and their selected values\r\n */\r\nfunction getOptions($productContainer) {\r\n var options = $productContainer\r\n .find('.product-option')\r\n .map(function () {\r\n var $elOption = $(this).find('.options-select');\r\n var urlValue = $elOption.val();\r\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\r\n .data('value-id');\r\n return {\r\n optionId: $(this).data('option-id'),\r\n selectedValueId: selectedValueId\r\n };\r\n }).toArray();\r\n\r\n return JSON.stringify(options);\r\n}\r\n\r\n/**\r\n * Makes a call to the server to report the event of adding an item to the cart\r\n *\r\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\r\n */\r\nfunction miniCartReportingUrl(url) {\r\n if (url) {\r\n $.ajax({\r\n url: url,\r\n method: 'GET',\r\n success: function () {\r\n // reporting urls hit on the server\r\n },\r\n error: function () {\r\n // no reporting urls hit on the server\r\n }\r\n });\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n attributeSelect: attributeSelect,\r\n methods: {\r\n editBonusProducts: function (data) {\r\n chooseBonusProducts(data);\r\n }\r\n },\r\n\r\n focusChooseBonusProductModal: function () {\r\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\r\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\r\n $('#chooseBonusProductModal .close').focus();\r\n });\r\n },\r\n\r\n onClosingChooseBonusProductModal: function () {\r\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\r\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\r\n });\r\n },\r\n\r\n trapChooseBonusProductModalFocus: function () {\r\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\r\n var focusParams = {\r\n event: e,\r\n containerSelector: '#chooseBonusProductModal',\r\n firstElementSelector: '.close',\r\n lastElementSelector: '.add-bonus-products'\r\n };\r\n focusHelper.setTabNextFocus(focusParams);\r\n });\r\n },\r\n\r\n colorAttribute: function () {\r\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\r\n e.preventDefault();\r\n\r\n if ($(this).attr('disabled')) {\r\n return;\r\n }\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n\r\n attributeSelect($(this).attr('data-url'), $productContainer);\r\n });\r\n },\r\n\r\n selectAttribute: function () {\r\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.set-item');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.product-detail');\r\n }\r\n attributeSelect(e.currentTarget.value, $productContainer);\r\n });\r\n },\r\n\r\n availability: function () {\r\n $(document).on('change', '.quantity-select', function (e) {\r\n e.preventDefault();\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\r\n }\r\n\r\n if ($('.bundle-items', $productContainer).length === 0) {\r\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\r\n $productContainer);\r\n }\r\n });\r\n },\r\n\r\n addToCart: function () {\r\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\r\n var addToCartUrl;\r\n var pid;\r\n var pidsObj;\r\n var setPids;\r\n\r\n $('body').trigger('product:beforeAddToCart', this);\r\n\r\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\r\n setPids = [];\r\n\r\n $('.product-detail').each(function () {\r\n if (!$(this).hasClass('product-set-detail') && $(this).find('size-selections .size-attribute .size-value.selected') && $(this).find('.quantity-select').length) {\r\n setPids.push({\r\n pid: $(this).find('.product-id').text(),\r\n qty: $(this).find('.quantity-select').val(),\r\n options: getOptions($(this))\r\n });\r\n }\r\n });\r\n pidsObj = JSON.stringify(setPids);\r\n }\r\n\r\n pid = getPidValue($(this));\r\n\r\n var $productContainer = $(this).closest('.product-detail');\r\n if (!$productContainer.length) {\r\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\r\n }\r\n\r\n addToCartUrl = getAddToCartUrl();\r\n\r\n var form = {\r\n pid: pid,\r\n pidsObj: pidsObj,\r\n childProducts: getChildProducts(),\r\n quantity: getQuantitySelected($(this))\r\n };\r\n\r\n if (!$('.bundle-item').length) {\r\n form.options = getOptions($productContainer);\r\n }\r\n\r\n $(this).trigger('updateAddToCartFormData', form);\r\n if (addToCartUrl) {\r\n $.ajax({\r\n url: addToCartUrl,\r\n method: 'POST',\r\n data: form,\r\n success: function (data) {\r\n handlePostCartAdd(data);\r\n $('body').trigger('product:afterAddToCart', data);\r\n $.spinner().stop();\r\n miniCartReportingUrl(data.reportingURL);\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n }\r\n });\r\n },\r\n selectBonusProduct: function () {\r\n $(document).on('click', '.select-bonus-product', function () {\r\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\r\n var pid = $(this).data('pid');\r\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\r\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\r\n var totalQty = 0;\r\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\r\n totalQty += $(this).data('qty');\r\n });\r\n totalQty += submittedQty;\r\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\r\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\r\n if (totalQty <= maxPids) {\r\n var selectedBonusProductHtml = ''\r\n + '
        '\r\n + '
        '\r\n + $choiceOfBonusProduct.find('.product-name').html()\r\n + '
        '\r\n + '
        '\r\n + '
        '\r\n ;\r\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\r\n $('.pre-cart-products').html(totalQty);\r\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\r\n } else {\r\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\r\n }\r\n });\r\n },\r\n removeBonusProduct: function () {\r\n $(document).on('click', '.selected-pid', function () {\r\n $(this).remove();\r\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\r\n var count = 0;\r\n if ($selected.length) {\r\n $selected.each(function () {\r\n count += parseInt($(this).data('qty'), 10);\r\n });\r\n }\r\n\r\n $('.pre-cart-products').html(count);\r\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\r\n });\r\n },\r\n enableBonusProductSelection: function () {\r\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\r\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\r\n (!response.product.readyToOrder || !response.product.available));\r\n var pid = response.product.id;\r\n $('button.select-bonus-product', response.$productContainer).data('pid', pid);\r\n });\r\n },\r\n showMoreBonusProducts: function () {\r\n $(document).on('click', '.show-more-bonus-products', function () {\r\n var url = $(this).data('url');\r\n $('.modal-content').spinner().start();\r\n $.ajax({\r\n url: url,\r\n method: 'GET',\r\n success: function (html) {\r\n var parsedHtml = parseHtml(html);\r\n $('.modal-body').append(parsedHtml.body);\r\n $('.show-more-bonus-products:first').remove();\r\n $('.modal-content').spinner().stop();\r\n },\r\n error: function () {\r\n $('.modal-content').spinner().stop();\r\n }\r\n });\r\n });\r\n },\r\n addBonusProductsToCart: function () {\r\n $(document).on('click', '.add-bonus-products', function () {\r\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\r\n var queryString = '?pids=';\r\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\r\n var pidsObject = {\r\n bonusProducts: []\r\n };\r\n\r\n $.each($readyToOrderBonusProducts, function () {\r\n var qtyOption =\r\n parseInt($(this)\r\n .data('qty'), 10);\r\n\r\n var option = null;\r\n if (qtyOption > 0) {\r\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\r\n option = {};\r\n option.optionId = $(this).data('optionid');\r\n option.productId = $(this).data('pid');\r\n option.selectedValueId = $(this).data('option-selected-value');\r\n }\r\n pidsObject.bonusProducts.push({\r\n pid: $(this).data('pid'),\r\n qty: qtyOption,\r\n options: [option]\r\n });\r\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\r\n }\r\n });\r\n queryString += JSON.stringify(pidsObject);\r\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\r\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\r\n $.spinner().start();\r\n $.ajax({\r\n url: url + queryString,\r\n method: 'POST',\r\n success: function (data) {\r\n $.spinner().stop();\r\n if (data.error) {\r\n $('#chooseBonusProductModal').modal('hide');\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append('
        ');\r\n }\r\n $('.add-to-cart-messages').append(\r\n '
        '\r\n + data.errorMessage + '
        '\r\n );\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n }, 3000);\r\n } else {\r\n $('.configure-bonus-product-attributes').html(data);\r\n $('.bonus-products-step2').removeClass('hidden-xl-down');\r\n $('#chooseBonusProductModal').modal('hide');\r\n\r\n if ($('.add-to-cart-messages').length === 0) {\r\n $('body').append('
        ');\r\n }\r\n $('.minicart-quantity').html(data.totalQty);\r\n $('.add-to-cart-messages').append(\r\n '
        '\r\n + data.msgSuccess + '
        '\r\n );\r\n\r\n var $checkIcon = $('.check-icon-reference').clone();\r\n $('.add-to-cart-messages .icon-check').append($checkIcon);\r\n\r\n setTimeout(function () {\r\n $('.add-to-basket-alert').remove();\r\n if ($('.cart-page').length) {\r\n location.reload();\r\n }\r\n }, 1500);\r\n }\r\n },\r\n error: function () {\r\n $.spinner().stop();\r\n }\r\n });\r\n });\r\n },\r\n\r\n getPidValue: getPidValue,\r\n getQuantitySelected: getQuantitySelected,\r\n miniCartReportingUrl: miniCartReportingUrl\r\n};\r\n","/**\r\n * DOM utilities to use native browser capabilities and avoid dependencies.\r\n *\r\n * @module dom.dom-util\r\n * @version 1.0.0\r\n * @since Sept 26 2019\r\n */\r\n\r\n'use strict';\r\n\r\n/**\r\n * Native querySelector to find first element in the dom with given selector\r\n *\r\n * @param {string | Object} selector Target selector element.\r\n * @param {string | Object} parent Parent element, if it not provided\r\n * fallback to document.\r\n * @return {Object} returns the target as a DOM node\r\n */\r\nconst queryFirst = (exports.queryFirst = (selector, parent = document) => {\r\n if (!parent) return null;\r\n return parent.querySelector(selector);\r\n});\r\n\r\n/**\r\n * Native querySelectorAll to find all the dom element with given selector.\r\n *\r\n * @param {string | Object} selector Target selector element.\r\n * @param {string | Object} parent Parent element, if it not provided\r\n * fallback to document.\r\n * @return {nodeList | Array} Returns the target as a DOM node.\r\n */\r\nconst queryAll = (exports.queryAll = (selector, parent = document) => {\r\n if (!parent) return null;\r\n return [].slice.call(parent.querySelectorAll(selector), 0);\r\n});\r\n\r\n/**\r\n * Returns the value(s) for the specified CSS rule(s), or all computed styles if no rule is specified\r\n *\r\n * @param {Element} element Target element\r\n * @param {string} rule CSS rule name (E.g. padding-top)\r\n * @return {string | Array | Object} Returns a string value, array of values, or styles object\r\n */\r\nconst getStyles = (exports.getStyles = (element, ...rules) => {\r\n const styles = getComputedStyle(element);\r\n\r\n if (!rules.length) {\r\n return styles;\r\n } else if (rules.length === 1) {\r\n return styles[rules[0]];\r\n }\r\n return rules.map(rule => styles[rule]);\r\n});\r\n\r\n/**\r\n * Remove DOM element\r\n *\r\n * @param {string | Object} el Target element.\r\n */\r\nexports.remove = el => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.parentElement.removeChild(node);\r\n }\r\n } else {\r\n el.parentElement.removeChild(el);\r\n }\r\n};\r\n\r\n/**\r\n * Set attribute to single or multiple elements\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string} attr attribute that need to be added.\r\n * @param {string | boolean} val value that need to be set for an attribute.\r\n */\r\nexports.setAttribute = (el, attr, val) => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.setAttribute(attr, val);\r\n }\r\n } else {\r\n el.setAttribute(attr, val);\r\n }\r\n};\r\n\r\n/**\r\n * Remove attribute to single or multiple elements\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string} attr attribute that need to be removed.\r\n */\r\nexports.removeAttribute = (el, attr) => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.removeAttribute(attr);\r\n }\r\n } else {\r\n el.removeAttribute(attr);\r\n }\r\n};\r\n\r\n/**\r\n * Adds class or classes to the classList of particular element.\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string | Array} val class name or class names as list of arguments.\r\n */\r\nexports.addClass = (el, ...val) => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.classList.add(...val);\r\n }\r\n } else {\r\n el.classList.add(...val);\r\n }\r\n};\r\n\r\n/**\r\n * Removes class or classes from the classList of particular element.\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string | Array} val class name or class names as list of arguments.\r\n */\r\nexports.removeClass = (el, ...val) => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.classList.remove(...val);\r\n }\r\n } else {\r\n el.classList.remove(...val);\r\n }\r\n};\r\n\r\n/**\r\n * Toggles class or classes to the classList of particular element.\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string | Array} val class name or class names as list of arguments.\r\n */\r\nexports.toggleClass = (el, ...val) => {\r\n if (!el) return;\r\n if (Array.isArray(el) || el instanceof NodeList) {\r\n for (let i = 0, n = el.length; i < n; i++) {\r\n const node = el[i];\r\n node.classList.toggle(...val);\r\n }\r\n } else {\r\n el.classList.toggle(...val);\r\n }\r\n};\r\n\r\n/**\r\n * Looks for availability of class or classes in the classList of particular element.\r\n *\r\n * @param {string | Object} el Target element.\r\n * @param {string | Array} val class name or class names as list of arguments.\r\n * @return {boolean} Returns availability of class in the target element.\r\n */\r\nexports.hasClass = (el, ...classes) => {\r\n const { classList } = el;\r\n for (let c = 0, n = classes.length; c < n; c++) {\r\n if (!classList.contains(classes[c])) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Throttle util to prevent repeatative callbacks\r\n *\r\n * @param {function} callback Callback function.\r\n * @param {number} limit Timeout upon which throttle callback need to be called.\r\n * fallback to document.\r\n * @return {function} Throttle closure function.\r\n */\r\nexports.throttle = (callback, limit = 250) => {\r\n let isThrottling = false;\r\n\r\n return (...args) => {\r\n if (isThrottling) return;\r\n\r\n callback.apply(this, args);\r\n isThrottling = true;\r\n\r\n setTimeout(() => {\r\n isThrottling = false;\r\n }, limit);\r\n };\r\n};\r\n\r\n/**\r\n * Throttle util to prevent repeatative callbacks\r\n *\r\n * @param {function} callback Callback function.\r\n * @param {number} minimumDelay Delay upon which debounce callback need to be called.\r\n * fallback to document.\r\n * @return {function} Debounce closure function.\r\n */\r\nexports.debounce = (callback, minimumDelay = 250) => {\r\n let timer;\r\n\r\n return (...args) => {\r\n clearTimeout(timer);\r\n\r\n timer = setTimeout(() => {\r\n callback(...args);\r\n }, minimumDelay);\r\n };\r\n};\r\n\r\nexports.toArray = (...args) => {\r\n const makeArray = target => {\r\n let newTarget;\r\n if (!Array.isArray(target)) {\r\n const array = [].slice.call(target);\r\n newTarget = array.length ? array : [target];\r\n }\r\n return newTarget;\r\n };\r\n return args.reduce((results, arg) => {\r\n return results.concat(makeArray(arg));\r\n }, []);\r\n};\r\n\r\n/**\r\n * Height util to get outer height of element including margins\r\n *\r\n * @param {string | Object} el target element\r\n * @return {string} height of element\r\n */\r\nexports.outerHeight = el => {\r\n const styles = getStyles(el);\r\n\r\n return el.offsetHeight + parseInt(styles.marginTop, 0) + parseInt(styles.marginBottom, 0);\r\n};\r\n\r\n/**\r\n * Determine if an element is in the viewport\r\n * (c) 2017 Chris Ferdinandi, MIT License, https://gomakethings.com\r\n * @param {Node} el The element\r\n * @return {boolean} Returns true if element is in the viewport\r\n */\r\nexports.isInViewport = el => {\r\n const scroll = window.scrollY || window.pageYOffset;\r\n const boundsTop = el.getBoundingClientRect().top + scroll;\r\n\r\n const numberOfViewportToCheck = el.dataset.nextViewportLazyLoad ? 2 : 1;\r\n\r\n const viewport = {\r\n top: scroll,\r\n bottom: scroll + window.innerHeight * numberOfViewportToCheck\r\n };\r\n\r\n const bounds = {\r\n top: boundsTop,\r\n bottom: boundsTop + el.clientHeight\r\n };\r\n\r\n return (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) || (bounds.top <= viewport.bottom && bounds.top >= viewport.top);\r\n};\r\n\r\n/**\r\n * Displays empty cart message\r\n * @param {string} message - Error message to display\r\n */\r\nexports.emptyCart = message => {\r\n const cartElements = queryAll('.cart');\r\n cartElements.forEach(cartElement => {\r\n cartElement.innerHTML = `

        ${message}

        `;\r\n });\r\n};\r\n\r\n/**\r\n * Animates scrolling the page to the specified Y coordinate\r\n * @param {number} y - The Y coordinate to scroll to\r\n * @param {number} duration - The duration of the animation in milliseconds\r\n * @param {function} callback - The callback to run when the animation is complete\r\n * @returns {JQuery}\r\n */\r\nexports.scrollTo = (y, duration = 600, callback = function() {}) => $('html, body').scrollTo(y, duration, callback);\r\n\r\n/**\r\n * Finds the last element sibling on the same line as the specified element\r\n * @param {Element} element - The element to reference when looking for siblings\r\n * @returns {Element} - returns last element in the row\r\n */\r\nexports.getLastElementInRow = element => {\r\n if (!element.nextElementSibling) return element;\r\n\r\n const bottom = element.offsetTop + element.scrollHeight;\r\n let sibling;\r\n\r\n while ((sibling = element.nextElementSibling)) {\r\n if (sibling.offsetTop >= bottom) return sibling.previousElementSibling;\r\n element = sibling;\r\n }\r\n\r\n return element;\r\n};\r\n\r\n/**\r\n * Update url with query parameter to handle remember placement\r\n *\r\n * @param {string} response - Ajax response HTML code\r\n * @return {undefined}\r\n */\r\nexports.updateUrlQueryParam = response => {\r\n const $queryParamsElement = $('
        ')\r\n .append($(response))\r\n .find('.append-params');\r\n if ($queryParamsElement.length) {\r\n const newUrl = window.location.href.split('?')[0] + '?' + $queryParamsElement.val();\r\n window.history.pushState(\r\n {\r\n path: newUrl\r\n },\r\n '',\r\n newUrl\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * This method returns character count\r\n * @param {HTMLElement} element - current element for which count has to be calculated\r\n * @return {number} character count\r\n */\r\nexports.getCharacterCount = function(element) {\r\n if (!element) {\r\n return 0;\r\n }\r\n return element.value.length;\r\n};\r\n\r\n/**\r\n * Waits for a specified element to exist.\r\n * @param {string} selector - The selector to match\r\n * @param {element} scope - The containing element to search within (default: document)\r\n * @param {number} timeout - How long (in milliseconds) to wait before rejecting the promise\r\n * @returns a Promise containing all matched elements\r\n */\r\nexports.waitForElement = (selector, scope = document, timeout = 0) =>\r\n new Promise((resolve, reject) => {\r\n const elements = queryAll(selector);\r\n\r\n if (elements.length) return resolve(elements);\r\n\r\n const observer = new MutationObserver((mutations, self) => {\r\n const elements = queryAll(selector);\r\n\r\n if (elements.length) {\r\n self.disconnect();\r\n resolve(elements);\r\n }\r\n });\r\n\r\n observer.observe(scope, { childList: true, subtree: true });\r\n\r\n if (timeout) {\r\n setTimeout(() => {\r\n observer.disconnect();\r\n reject('Timed out');\r\n }, timeout);\r\n }\r\n });\r\n\r\nexports.getStyles = getStyles;\r\nexports.queryAll = queryAll;\r\n\r\n/**\r\n * appends params to a url\r\n * @param {string} url - Original url\r\n * @param {Object} params - Parameters to append\r\n * @returns {string} result url with appended parameters\r\n */\r\nexports.appendToUrl = (url, params) => {\r\n var newUrl = url;\r\n newUrl +=\r\n (newUrl.indexOf('?') !== -1 ? '&' : '?') +\r\n Object.keys(params)\r\n .map(function(key) {\r\n return key + '=' + encodeURIComponent(params[key]);\r\n })\r\n .join('&');\r\n\r\n return newUrl;\r\n}\r\n","'use strict';\r\n\r\n/**\r\n * Remove all validation. Should be called every time before revalidating form\r\n * @param {element} form - Form to be cleared\r\n * @returns {void}\r\n */\r\nfunction clearFormErrors(form) {\r\n $(form)\r\n .find('.form-control.is-invalid')\r\n .removeClass('is-invalid');\r\n $(form)\r\n .find('.form-control.is-invalid')\r\n .removeAttr('aria-invalid');\r\n}\r\n\r\nmodule.exports = function(formElement, payload) {\r\n // clear form validation first\r\n clearFormErrors(formElement);\r\n $('.alert', formElement).remove();\r\n if (typeof payload === 'object' && payload.fields) {\r\n Object.keys(payload.fields).forEach(function(key) {\r\n if (payload.fields[key]) {\r\n var feedbackElement = $(formElement)\r\n .find('[name=\"' + key + '\"]')\r\n .parent()\r\n .children('.invalid-feedback');\r\n\r\n if (feedbackElement.length > 0) {\r\n if (Array.isArray(payload[key])) {\r\n feedbackElement.html(payload.fields[key].join('
        '));\r\n } else {\r\n feedbackElement.html(payload.fields[key]);\r\n }\r\n feedbackElement.siblings('.form-control').addClass('is-invalid');\r\n feedbackElement.siblings('.form-control').attr('aria-invalid', 'true');\r\n formElement.find('.is-invalid')[0].focus();\r\n }\r\n }\r\n });\r\n }\r\n if (payload && payload.error) {\r\n var form = $(formElement).prop('tagName') === 'FORM' ? $(formElement) : $(formElement).parents('form');\r\n\r\n form.find('button').before('
        ' + payload.error.join('
        ') + '
        ');\r\n }\r\n};\r\n"],"sourceRoot":""}