{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/alertNotification.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/alerts/alertHelpers.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/userActivity.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/newsletterModal.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/scrollIntoView.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/UUIDGenerator.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/seo/gtm/gtmEvents.js","webpack:///./node_modules/@babel/runtime/helpers/defineProperty.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/product/detail.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/productDetail.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/components/focus.js","webpack:///./cartridges/app_monnalisa/cartridge/client/default/js/product/base.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","alert","require","alertNotification","set","alertName","id","alertOptions","alertContainer","document","querySelector","attachToElement","appendTo","prependTo","createAlertContainer","createAlert","UUIDGenerator","message","status","timeout","dismissible","dismissibleAlert","alertUUID","alertHTML","dwPropertyLabels","window","dwResources","properties","close","createAlertHTML","insertAdjacentHTML","setTimeout","parentNode","removeChild","childElementCount","_setAlertTimeout","alertElementDiv","createElement","classList","add","body","append","UserActivity","constructor","callback","this","resetListener","reset","start","events","forEach","event","addEventListener","clearTimeout","timeoutId","stop","removeEventListener","newsletterModal","isClosed","localStorage","getItem","modal","$","length","userActivity","on","setItem","show","scrollIntoView","anchor","headerHeight","outerHeight","animate","scrollTop","offset","top","UUID","Uint32Array","crypto","getRandomValues","sendPageData","pageLang","pageType","storeView","visitorId","loginState","visitorType","existingCustomer","lifetimeValue","newsletterSubscription","dataLayer","push","sendPromoData","promotions","sendReserchData","queryReserch","reserchResult","sendNewsletterSuccess","sendFormData","formName","sendFormRegistrationData","sendFormLoginData","sendProductDetailsData","currencyCode","products","sendProductClickData","currency","list","sendCartDisplay","addToCart","removeFromCart","sendPurchaseData","orderID","shopName","total","tax","shippingCosts","couponCode","discountedAmount","checkoutStep","step","option","checkoutOption","addToWishlist","productName","filterData","filterType","filterValue","listingOrder","order","sendSearchData","searchResultsCount","obj","configurable","writable","base","GtmEvents","updateSwiperSlide","container","slide","removeAllSlides","appendSlide","update","GtmProductDetails","items","product","attr","price","brand","color","description","gender","link","material","product_type","season","theme","size","retrieveGTMcategories","detail","productImageModal","closeProductZoom","desktopVerticalCarousel","verticalCarousel","lgDown","Breakpoints","is","unset","updateAttributesAndDetails","e","data","resources","$productContainer","longDescription","find","removeClass","descriptionHtml","shortDescription","productIdLabel","selectedVariationProductId","empty","html","addClass","mobileSlickPagination","mobileZoomCarousel","slick","currentSlide","currentPageNumber","parseInt","relatedTarget","totalSlidesNumber","slideCount","currentTarget","setStartingSlideNumber","currentImageNumber","width","min","showSpinner","spinner","gtmSendProductDetails","updateAttribute","response","swiperThumbs","swiper","swiperMain","swiperThumbsModal","swiperMainModal","prevObject","hasClass","updatedSlides","updateImages","eq","text","gtmAdditionalData","updateAddToCart","readyToOrder","available","enable","toArray","every","item","updateAvailability","allAvailable","allReady","info_selectforstock","imageOpen","setPosition","clickThumb","mediumUrl","parent","extendedDetailsScroll","preventDefault","target","showMore","closest","hide360HelperImage","fadeOut","init360","load360","url","hsl","autoRotation","rotation","autoRotate","withCredentials","hasButtons","load","fit360","children","images360","enabled","tab","newContainer","replaceWith","resize","containerWidth","innerWidth","Math","height","availability","focusChooseBonusProductModal","handleColorVariationSwatches","productInit","init","readyState","setTabNextFocus","focusParams","keyCode","firstFocusableEl","containerSelector","firstElementSelector","lastFocusableEl","lastElementSelector","nextToLastElementSelector","linkElements","shiftKey","focus","focusHelper","getPidValue","$el","getQuantitySelector","getQuantitySelected","val","handleVariantResponse","isVaraint","isChoiceOfBonusProducts","parents","variationAttributes","attrs","msgs","values","attrValue","$attrValue","$swatchButton","selected","siblings","assistiveSelectedText","removeAttr","selectable","processSwatchValues","$attr","$select","$defaultOption","resetUrl","v","processNonSwatchValues","updateAttrs","productType","lastPriceHtml","promotion","calloutMsg","details","getPromotionsHtml","availabilityValue","availabilityMessages","messages","trigger","attributes","attributeGroup","ID","attribute","label","getAttributesHtml","attributeSelect","selectedValueUrl","ajax","method","success","options","$optionEl","updateOptions","quantities","optionsHtml","map","quantity","join","updateQuantities","productContainer","error","parseHtml","$html","parseHTML","footer","chooseBonusProducts","bonusUrl","remove","bonusChoiceRuleBased","showProductsUrlRuleBased","showProductsUrlListBased","htmlString","maxBonusItems","uuid","pliUUID","addToCartUrl","pageSize","labels","selectprods","dataType","parsedHtml","renderedTemplate","enterDialogMessage","closeButtonText","getOptions","$elOption","urlValue","selectedValueId","optionId","JSON","stringify","divClass","prodObj","iter","categoriesArray","split","k","methods","editBonusProducts","onClosingChooseBonusProductModal","trapChooseBonusProductModalFocus","nonSelectAttribute","selectAttribute","pid","pidsObj","setPids","each","qty","childProducts","form","messageType","newBonusDiscountLineItem","keys","handlePostCartAdd","selectBonusProduct","$choiceOfBonusProduct","maxPids","submittedQty","totalQty","optionID","valueId","selectedBonusProductHtml","removeBonusProduct","$selected","count","enableBonusProductSelection","showMoreBonusProducts","addBonusProductsToCart","$readyToOrderBonusProducts","queryString","pidsObject","bonusProducts","qtyOption","productId","errorMessage","msgSuccess","location","reload","off","hideColorVariationSwatches","containerRects","getBoundingClientRect","swatches","outElementsCount","el","swatchRects","left","right","stopPropagation","displayValue"],"mappings":"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","file":"productDetail.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 46);\n","'use strict';\n\nvar alert = require('./alerts/alertHelpers');\n\n/**\n * ALERT NOTIFICATION API v1.0x\n * A set of methods and helper functions written in Vanilla Javascript which simplify the creation of standard alert messages according to client's specifications\n * \n * ------------\n * Accepted properties\n * ------------ \n * @param {String} alertName - (MANDATORY) A class name for the alert\n * @param {String} id - (OPTIONAL) An optional identifier for the alert\n * \n * // Alert options - alertOptions: {}\n * @param {String} message - (MANDATORY) The message to attach to alert. It can be simple text or a HTML string - e.g., '

Your product has been added to the wishlist

'\n * @param {String} status - (MANDATORY) the alert status. It accepts two values: 'alert-success' for succesful alerts and 'alert-danger' for warning alerts\n * @param {String} appendTo - (OPTIONAL) The element to append the alert to. It defaults to body\n * @param {Boolean} dismissible - (OPTIONAL) If true, set a dismissible alert. Dismissible alerts have no timeout and a button which requires user interaction in order to close it\n * @param {String} prependTo - (OPTIONAL) The element to prepend the alert to. It defaults to body\n * @param {Boolean} timeout - (OPTIONAL) If false, remove the default timeout for alerts. Dismissible alerts have no timeout by default\n * \n */\n\n/**\n * ----------------\n * Example of usage\n * ----------------\n * var alertNotification = require('./alertNotification');\n * alertNotification.set(\n {\n alertName: 'add-to-wishlist',\n alertOptions: {\n message: data.msg,\n status: 'alert-success' \n }\n }\n);\n*/\n\nclass AlertNotification {\n set ({alertName, id, alertOptions}) {\n let alertContainer = document.querySelector('.alert-messages');\n let attachToElement = alertOptions.appendTo || alertOptions.prependTo;\n\n if (!alertContainer && !attachToElement) {\n alert.createAlertContainer (alertName);\n }\n\n alert.createAlert(alertName, id, alertOptions);\n }\n}\n\nconst alertNotification = new AlertNotification ();\nmodule.exports = alertNotification;\n","'use strict';\n\nvar UUIDGenerator = require('../UUIDGenerator');\n\n/**\n * DEFAULT VALUES\n */\nconst _ALERTTIMEOUT = 5000; // 2 seconds\nconst _DISMISSIBLE = true;\n\n/**\n * Construct the HTML for the alert, depending on whether it's a dismissible alert or not\n * @param {String} status - The status of the alert message. It accepts two values: 'alert-success' for succesful alerts and 'alert-danger' for warning alerts\n * @param {String} id - An optional identifier for the alert\n * @param {String} alertName - A class name for the alert\n * @param {Number} alertUUID - The alert identifier number\n * @param {String} message - The message to attach to alert. It can be simple text or a HTML string - e.g., '

Your product has been added to the wishlist

'\n * @param {Boolean} dismissible - If true, set a dismissible alert. Dismissible alerts have no timeout and a button which requires user interaction in order to close it\n * @returns {String} alert - The HTML repesentation of the request alert\n */\n\nconst createAlertHTML = (status, id, alertName, alertUUID, message, dismissible) => {\n let alert;\n let dwPropertyLabels = window.dwResources.properties;\n\n if (dismissible) {\n alert =`
\n ${message}
`;\n } else {\n alert = `
${message}
`;\n }\n return alert;\n};\n\n/**\n * Set a timeout for the alert. Timeout is active by default in non-dismissible alerts. It can be disabled in any moment by setting timeout: false\n * @param {Number} alertUUID - A universally unique identifier for the alert\n * @param {Object} alertContainer - The alert container.\n */\n\nconst _setAlertTimeout = (alertUUID, alertContainer) => {\n\n setTimeout(() => {\n let alert = document.querySelector(`[data-alert-uuid=\"${alertUUID}\"]`);\n alert.parentNode.removeChild(alert);\n\n if (alertContainer.childElementCount == 0) {\n alertContainer.parentNode.removeChild(alertContainer);\n }\n }, _ALERTTIMEOUT);\n};\n\n/**\n * Create alert with the requested options\n * @param {String} alertName - A class name for the alert\n * @param {String} id - An optional identifier for the alert\n * @param {String} message - The message to attach to alert. It can be simple text or a HTML string - e.g., '

Your product has been added to the wishlist

'\n * @param {String} status - The alert status. It accepts two values: 'alert-success' for succesful alerts and 'alert-danger' for warning alerts\n * @param {String} appendTo - The element to append the alert to. It defaults to body.\n * @param {String} prependTo - The element to prepend the alert to. It defaults to body\n * @param {Boolean} timeout - If false, remove the default timeout for alerts. Dismissible alerts have no timeout by default\n * @param {Boolean} dismissible - If true, set a dismissible alert. Dismissible alerts have no timeout and a button which requires user interaction in order to close it\n */\n\nconst createAlert = (alertName, id, {message, status, appendTo, prependTo, timeout, dismissible}) => {\n let attachToElement = appendTo || prependTo;\n var dismissibleAlert = dismissible == false ? dismissible : _DISMISSIBLE;\n\n let alertContainer = document.querySelector(attachToElement) || document.querySelector('.alert-messages');\n let alertUUID = UUIDGenerator.get();\n let alertHTML = createAlertHTML(status, id, alertName, alertUUID, message, dismissibleAlert);\n\n if (attachToElement) {\n alertContainer.insertAdjacentHTML(appendTo ? 'beforeend' : 'afterbegin', alertHTML);\n } else {\n alertContainer.insertAdjacentHTML('afterbegin', alertHTML);\n\n }\n\n if (dismissible != true && timeout != false) {\n _setAlertTimeout(alertUUID, alertContainer);\n }\n};\n\n/**\n * Create an alert container. An alert container is automatically created when no element to attach the alert to has been specified using the appendTo and prependTo options or when no alert container already exists\n * @param {String} alertName - A class name for the alert\n */\nconst createAlertContainer = (alertName) => {\n const alertElementDiv = document.createElement('div');\n alertElementDiv.classList.add(`${alertName}-messages`, 'alert-messages');\n\n document.body.append(alertElementDiv);\n};\n\nmodule.exports = {\n createAlert: createAlert,\n createAlertContainer: createAlertContainer\n};\n\n","const TIMEOUT = 5000;\n\nclass UserActivity {\n\n callback;\n\n events = [\n 'mousemove',\n 'mousedown',\n 'keydown',\n 'touchstart',\n 'touchmove',\n 'scroll',\n 'click',\n 'pointermove',\n 'pointerdown'\n ];\n\n timeoutId;\n\n constructor(callback) {\n this.callback = callback;\n this.resetListener = () => this.reset();\n }\n\n start() {\n this.reset();\n\n this.events.forEach(event => {\n document.addEventListener(event, this.resetListener, true);\n });\n }\n\n reset() {\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(this.callback, TIMEOUT);\n }\n\n stop() {\n clearTimeout(this.timeoutId);\n this.events.forEach(event => {\n document.removeEventListener(event, this.resetListener, true);\n });\n }\n}\n\nexport default UserActivity;\n","import UserActivity from './userActivity';\n\nconst NEWSLETTER_STORAGE_KEY = 'newsletterModalClosed';\n\nfunction newsletterModal () {\n const isClosed = localStorage.getItem(NEWSLETTER_STORAGE_KEY);\n const modal = $('#newsletterModal');\n\n if (isClosed || !modal.length) return;\n\n const idleCallback = () => {\n modal.modal('show');\n };\n\n const userActivity = new UserActivity(idleCallback);\n userActivity.start();\n\n modal.on('hidden.bs.modal', function () {\n localStorage.setItem(NEWSLETTER_STORAGE_KEY, true);\n userActivity.stop();\n });\n\n $('#newsletterModal [name=\"emailId\"]').on('focus', () => {\n $('#newsletterModal .subscribe-email, #newsletterModal .privacy-group').show();\n });\n\n $('body').on('newsletter:subscribeSuccess', () => {\n localStorage.setItem(NEWSLETTER_STORAGE_KEY, true);\n modal.modal('hide');\n });\n}\n\nexport default newsletterModal;\n","const scrollIntoView = (anchor) => {\n const headerMenuHeight = $('.header-menu:visible').outerHeight() ? $('.header-menu:visible').outerHeight() : 0;\n const headerHeadHeight = $('.header-head:visible').outerHeight() ? $('.header-head:visible').outerHeight() : 0;\n var headerHeight = headerMenuHeight + headerHeadHeight + 100;\n\n $('html, body').animate(\n {\n scrollTop: $(anchor).offset().top - headerHeight\n }, 700\n );\n};\n\nexport default scrollIntoView;\n","'use strict';\n\n/**\n * Construct a Universally Unique IDentifier number\n * @returns {Number} A universally unique identifier\n */\n\nconst getUUID = () => {\n let UUID = new Uint32Array(1);\n window.crypto.getRandomValues(UUID);\n\n return UUID[0];\n};\n\nmodule.exports = {\n get: getUUID\n};","'use strict';\n\nfunction sendPageData (pageLang,pageType,storeView,visitorId,loginState,visitorType,existingCustomer,lifetimeValue,newsletterSubscription){\n window.dataLayer.push({\n 'pageLang': pageLang,\n 'pageType': pageType,\n 'storeView': storeView,\n 'visitorId': visitorId,\n 'visitorLoginState': loginState,\n 'visitorType': visitorType,\n 'visitorExistingCustomer': existingCustomer,\n 'visitorLifetimeValue': lifetimeValue,\n 'visitorNewsletterSubscription':newsletterSubscription\n });\n}\n/** sendSearchData: sends the search event to the dataLayer.\n *@param {int} searchResultsCount: number of search results\n */\nfunction sendSearchData (searchResultsCount) {\n window.dataLayer.push({\n 'event': 'search',\n 'searchResults': searchResultsCount\n });\n}\n\nfunction sendPromoData (promotions){\n window.dataLayer.push({\n 'ecommerce': {\n 'promoView': {\n 'promotions': promotions\n }\n }\n });\n}\n\nfunction sendReserchData (queryReserch,reserchResult){\n window.dataLayer.push({\n 'event': 'inside-reserch',\n 'queryReserch': queryReserch,\n 'reserchResult': reserchResult\n\n });\n}\n\n\nfunction sendNewsletterSuccess (){\n window.dataLayer.push({\n 'event': 'submit-form-newsletter-ok'\n });\n}\n\nfunction sendFormData (formName){\n window.dataLayer.push({\n 'event': 'submit-form-'+ formName +'-ok'\n });\n}\n\nfunction sendFormRegistrationData (){\n window.dataLayer.push({\n 'event': 'submit-form-registration-ok'\n });\n}\n\nfunction sendFormLoginData (){\n window.dataLayer.push({\n 'event': 'submit-form-login-ok'\n });\n}\n\nfunction sendProductDetailsData (currencyCode,products){\n window.dataLayer.push({\n 'event': 'productDetail',\n 'ecommerce': {\n 'detail': {\n 'currencyCode': currencyCode,\n 'actionField': {'list':''},\n 'products': products\n }\n }\n });\n\n}\n\nfunction sendProductClickData (currency,products,list){\n window.dataLayer.push({\n 'event': 'productClick',\n 'ecommerce': {\n 'click': {\n 'currencyCode': currency,\n 'actionField': {'list': list},\n 'products': products\n }\n }\n });\n}\n\nfunction addToCart (currencyCode,products){\n window.dataLayer.push({\n 'event': 'addToCart',\n 'ecommerce':{\n 'currecyCode': currencyCode,\n 'add': {\n 'products': products\n }\n }\n });\n\n}\n\nfunction removeFromCart (currencyCode,products){\n window.dataLayer.push({\n 'event': 'removeFromCart',\n 'ecommerce':{\n 'currencyCode':currencyCode,\n 'remove': {\n 'products': products\n }\n }\n });\n\n}\n\nfunction sendPurchaseData (currencyCode, orderID, shopName, total, tax, shippingCosts, couponCode, discountedAmount, products){\n window.dataLayer.push({\n 'event': 'purchase',\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'purchase':{\n 'actionField':{\n 'id': orderID,\n 'affilation': shopName,\n 'revenue': total,\n 'tax': tax,\n 'shipping': shippingCosts,\n 'coupon': couponCode,\n 'discountedAmount': -discountedAmount,\n },\n 'products': products\n }\n }\n });\n\n}\nfunction checkoutStep (step,option,products){\n window.dataLayer.push({\n 'event': 'checkout',\n 'ecommerce': {\n 'checkout':{\n 'actionField': {'step': step,'option': option},\n 'products': products\n\n }\n\n }\n\n });\n\n}\n\nfunction checkoutOption (step,checkoutOption){\n window.dataLayer.push({\n 'event': 'checkoutOption',\n 'ecommerce': {\n 'checkout_option': {\n 'actionField': {'step': step, 'option': checkoutOption}\n }\n }\n });\n}\n\nfunction addToWishlist (productName){\n window.dataLayer.push({\n 'event': 'add-to-wishlist',\n 'productName': productName\n });\n}\n\nfunction filterData (filterType,filterValue){\n window.dataLayer.push({\n 'event': 'applicazione-filtro-listing',\n 'filterType': filterType,\n 'filterValue': filterValue\n });\n}\nfunction listingOrder (order){\n window.dataLayer.push({\n 'event': 'application-order-listing',\n 'orderValue': order\n });\n}\n\nfunction sendCartDisplay (currencyCode,products){\n window.dataLayer.push({\n 'event': 'cartDisplay',\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'cart': {\n 'products': products\n }\n }\n });\n}\n\nmodule.exports = {\n sendPageData: sendPageData,\n sendPromoData: sendPromoData,\n sendReserchData: sendReserchData,\n sendNewsletterSuccess: sendNewsletterSuccess,\n sendFormData: sendFormData,\n sendFormRegistrationData : sendFormRegistrationData,\n sendFormLoginData: sendFormLoginData,\n sendProductDetailsData: sendProductDetailsData,\n sendProductClickData: sendProductClickData,\n sendCartDisplay: sendCartDisplay,\n addToCart: addToCart,\n removeFromCart: removeFromCart,\n sendPurchaseData: sendPurchaseData,\n checkoutStep: checkoutStep,\n checkoutOption: checkoutOption,\n addToWishlist:addToWishlist,\n filterData: filterData,\n listingOrder: listingOrder,\n sendSearchData: sendSearchData\n};\n","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\n\nimport scrollIntoView from '../components/scrollIntoView';\n\nvar base = require('./base');\nvar GtmEvents = require('../seo/gtm/gtmEvents');\n\n/**\n * Remove slides and updates it with the given once.\n * @param {Swiper Obj} container\n * @param {Dom element} slide\n */\nconst updateSwiperSlide = (container, slide) => {\n container.removeAllSlides();\n container.appendSlide(slide);\n container.update();\n};\n\nconst GtmProductDetails = () => {\n // send data to dataLayer when land into pdp page\n if($('.product-detail').length === 0) return;\n var items = [];\n var product = {};\n var currency = $('.product-detail').attr('data-currency');\n product.name = $('.product-detail').attr('data-productname');\n product.id = $('.product-detail').attr('data-id');\n product.price = $('.product-detail').attr('data-price');\n product.brand = $('.product-detail').attr('data-brand');\n product.color = $('.product-detail').attr('data-color');\n product.description = $('.product-detail').attr('data-description');\n product.gender = $('.product-detail').attr('data-gender');\n product.link = $('.product-detail').attr('data-link');\n product.material = $('.product-detail').attr('data-material');\n product.product_type = $('.product-detail').attr('data-producttype');\n product.season = $('.product-detail').attr('data-season');\n product.theme = $('.product-detail').attr('data-theme');\n product.size = $('.product-detail').attr('data-size');\n base.retrieveGTMcategories('.product-detail',product);\n\n //variant\n items.push(product);\n GtmEvents.sendProductDetailsData(currency, items);\n};\n\n/**\n * Update image in pdp\n * @param {Object} response\n */\nconst updateImages = (response) => {\n const swiperThumbs = document.querySelector('.swiper-container.gallery-thumbs').swiper;\n const swiperMain = document.querySelector('.swiper-container.gallery-main').swiper;\n const swiperThumbsModal = document.querySelector('.swiper-container.gallery-thumbs-modal').swiper;\n const swiperMainModal = document.querySelector('.swiper-container.gallery-main-modal').swiper;\n\n\n if($(response.container.prevObject[0]).hasClass('color-attribute')) {\n updateSwiperSlide(swiperThumbs, response.data.product.updatedSlides);\n updateSwiperSlide(swiperMain, response.data.product.updatedSlides);\n updateSwiperSlide(swiperThumbsModal, response.data.product.updatedSlides);\n updateSwiperSlide(swiperMainModal, response.data.product.updatedSlides);\n }\n};\n\nclass Detail {\n constructor () {\n this.productImageModal = '#imageModal';\n }\n\n closeProductZoom () {\n // Close product zoom modal on double click on desktop devices only\n /*\n $('body').on('dblclick', this.productImageModal, (e) => {\n if (Breakpoints.is('lgUp')) {\n $(e.currentTarget).modal('toggle');\n }\n });\n */\n }\n\n desktopVerticalCarousel () {\n let verticalCarousel = '[data-carousel=\"pdpDesktopVerticalCarousel\"]'; // Vertical carousel\n let lgDown = Breakpoints.get('lgDown');\n\n // Initialize the carousel on load if the viewport is greater than 'lg'\n if (Breakpoints.is('lgUp')) {\n desktopVerticalCarousel.set(verticalCarousel);\n }\n\n // Uninitialize the carousel on resize if the viewport is lower than 'lg'\n lgDown.on('enter', () => {\n desktopVerticalCarousel.unset(verticalCarousel);\n });\n\n // Initialize the carousel on resize if the viewport is greater than 'lg'\n lgDown.on('leave', () => {\n desktopVerticalCarousel.set(verticalCarousel);\n });\n }\n\n updateAttributesAndDetails () {\n $('body').on('product:statusUpdate', function (e, data) {\n const product = data.product;\n const resources = data.resources;\n var $productContainer = $('.product-detail');\n\n if (product.longDescription) {\n $productContainer.find('.longDescription')\n .removeClass('hidden-xl-down');\n let descriptionHtml = '

';\n if (product.shortDescription) {\n descriptionHtml = product.shortDescription;\n }\n descriptionHtml += '

';\n descriptionHtml += '

' + resources.productIdLabel + ': ' + product.selectedVariationProductId + '

';\n descriptionHtml += product.longDescription;\n $productContainer.find('.longDescription .content')\n .empty()\n .html(descriptionHtml);\n } else {\n $productContainer.find('.longDescription')\n .addClass('hidden-xl-down');\n }\n });\n }\n\n mobileSlickPagination () {\n let mobileZoomCarousel = $('[data-carousel=\"pdpMainPicMobile\"]');\n\n mobileZoomCarousel.on('afterChange', (slick, slide) => {\n $(this.productImageModal).find('.current-page').empty().append(slide.currentSlide + 1);\n });\n\n $(this.productImageModal).on('show.bs.modal', function (e) {\n let currentPageNumber = parseInt($(e.relatedTarget).attr('data-image-number'));\n let totalSlidesNumber = mobileZoomCarousel.slick('getSlick').slideCount;\n\n $(e.currentTarget).find('.current-page').empty().append(currentPageNumber + 1);\n $(e.currentTarget).find('.total-pages').empty().append(totalSlidesNumber);\n });\n }\n\n setStartingSlideNumber () {\n $(this.productImageModal).on('show.bs.modal', function (e) {\n let currentImageNumber = $(e.relatedTarget).attr('data-image-number'); // Get the current image number being clicked\n\n // Set the current image number being clicked as starting slide for modal carousel. On tablet and desktop devices, currentImageNumber is decreaed by 1 if the total pdp images is greater than one, since the first PDP image is reapeted on the left-side vertical carousel. Without this modification, zoom would not work properly\n $(e.currentTarget).find('.slick-carousel').slick('slickGoTo', currentImageNumber > 0 && $(window).width() >= Breakpoints.get('sm').min ? currentImageNumber - 1 : currentImageNumber);\n });\n }\n\n\n showSpinner () {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n }\n\n gtmSendProductDetails () {\n GtmProductDetails();\n }\n\n updateAttribute () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n updateImages(response);\n if ($('.product-detail>.bundle-items').length || $('.product-set-detail').eq(0)) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n $('.product-detail').attr('data-id', response.data.product.id);\n if (response.data.product.gtmAdditionalData && response.data.product.gtmAdditionalData.color) {\n $('.product-detail').attr('data-color', response.data.product.gtmAdditionalData.color);\n }\n if (response.data.product.gtmAdditionalData && response.data.product.gtmAdditionalData.size) {\n $('.product-detail').attr('data-size', response.data.product.gtmAdditionalData.size);\n }\n // sonar code issue. same code block as above\n // } else if ($('.product-set-detail').eq(0)) {\n // response.container.data('pid', response.data.product.id);\n // response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.product-id').text(response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').attr('data-id', response.data.product.id);\n }\n // send product details on change variant.\n GtmProductDetails();\n });\n }\n\n updateAddToCart () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n var enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n $('button.add-to-cart-global').attr('disabled', !enable);\n\n //update message \"select attribute\" visibility\n if($('button.add-to-cart').is(':disabled')){\n $('.select-styles-alert').removeClass('d-none');\n }else{\n $('.select-styles-alert').addClass('d-none');\n }\n });\n }\n\n updateAvailability () {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n $('.availability-msg', response.$productContainer)\n .empty().html(response.message);\n\n if ($('.global-availability').length) {\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n }\n });\n }\n\n imageOpen () {\n $(this.productImageModal).on('shown.bs.modal', function () {\n $('.slick-carousel')[0].slick.setPosition();\n });\n }\n\n clickThumb () {\n $(document).on('click', '.product-thumb-img', function (e){\n var mediumUrl = $(e.currentTarget).data('medium');\n $('.main-image').parent().find('source').attr('srcset', mediumUrl);\n $('.main-image').attr('src', mediumUrl);\n });\n }\n\n extendedDetailsScroll () {\n $('.js-extended-details-link').on('click', (e) => {\n e.preventDefault();\n const target = $('.js-extended-details-link').attr('href');\n scrollIntoView(target);\n });\n }\n\n showMore () {\n $('.js-show-more-button').on('click', () => {\n const parent = $('.js-show-more-button').closest('.show-more');\n parent.removeClass('show-more').addClass('show-more-expanded');\n });\n }\n\n hide360HelperImage () {\n $('.container-360').on('click touchend', () => {\n if ($('.helper-image-360:visible').length) {\n $('.helper-image-360').fadeOut();\n }\n });\n }\n\n init360 () {\n /*\n Load and fit 360 images\n */\n const load360 = (url) => {\n $('.ui-360-container').hsl({\n url: url,\n autoRotation: false,\n rotation: false,\n autoRotate: false,\n withCredentials: false,\n hasButtons: false,\n load: () => {\n this.fit360();\n }\n });\n };\n\n $('.product-detail [data-toggle=\"pill\"]').on('shown.bs.tab', (e) => {\n if (e.target.id === 'pills-360-tab') {\n if ($('.ui-360-container').children().length) {\n this.fit360();\n } else {\n const url = $('.ui-360-container').attr('hsl-url');\n load360(url);\n }\n }\n });\n\n /*\n Rebuild 360 images on variation change\n */\n $('body').on('product:afterAttributeSelect', (e, data) => {\n // check if 360 is enabled to show/hide nav pills\n if (!data.data.product.images360.enabled) {\n $('#pills-gallery-tab').tab('show');\n $('.image-carousel-container').removeClass('images-360-active');\n $('#pills-360').addClass('d-none');\n $('#pills-tab').addClass('d-none');\n return;\n } else {\n $('#pills-tab').removeClass('d-none');\n $('#pills-360').removeClass('d-none');\n $('.image-carousel-container').addClass('images-360-active');\n }\n\n const newContainer = $('
').addClass('ui-360-container');\n $('.ui-360-container').replaceWith(newContainer);\n\n load360(data.data.product.images360.url);\n });\n\n /*\n Fit 360 images on window resize\n */\n $(window).resize(this.fit360);\n }\n\n fit360 () {\n const containerWidth = $('.container-360').innerWidth();\n const size = Math.min(containerWidth, 520);\n\n $('.ui-360-container').width(size).height(size).hsl('fit');\n }\n\n get init () {\n return {\n availability: base.availability(),\n addToCart: base.addToCart(),\n //closeProductZoom: this.closeProductZoom(),\n //desktopVerticalCarousel: this.desktopVerticalCarousel(),\n focusChooseBonusProductModal: base.focusChooseBonusProductModal(),\n //mobileSlickPagination: this.mobileSlickPagination(),\n //setStartingSlideNumber: this.setStartingSlideNumber(),\n showSpinner: this.showSpinner(),\n updateAttribute: this.updateAttribute(),\n updateAddToCart: this.updateAddToCart(),\n updateAvailability: this.updateAvailability(),\n gtmSendProductDetails: this.gtmSendProductDetails(),\n //imageOpen: this.imageOpen(),\n updateAttributesAndDetails: this.updateAttributesAndDetails(),\n //clickThumb: this.clickThumb(),\n extendedDetailsScroll: this.extendedDetailsScroll(),\n showMore: this.showMore(),\n hide360HelperImage: this.hide360HelperImage(),\n init360: this.init360(),\n handleColorVariationSwatches: base.handleColorVariationSwatches(),\n };\n }\n}\n\nconst detail = new Detail;\nexport default detail;\n","'use strict';\n\nimport detail from './product/detail';\nimport newsletterModal from './components/newsletterModal';\n\n/**\n * Initialize product js assets\n */\n\nconst productInit = () => {\n detail.init;\n newsletterModal();\n};\n\nif (document.readyState === 'loading') {\n document.addEventListener ('DOMContentLoaded', () => {\n productInit();\n }, false);\n\n} else {\n productInit();\n}\n","'use strict';\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n","'use strict';\n\nvar alertNotification = require('../components/alertNotification');\nvar focusHelper = require('../components/focus');\nvar GtmEvents = require('../seo/gtm/gtmEvents');\n\n/**\n * Send data to dataLayer when add a product to cart\n */\nfunction gtmSendAddToCart (){\n var items = [];\n var product = {};\n var currency = $('.product-detail').attr('data-currency');\n product.name = $('.product-detail').attr('data-productname');\n product.id = $('.product-detail').attr('data-id');\n product.price = $('.product-detail').attr('data-price');\n product.brand = $('.product-detail').attr('data-brand');\n retrieveGTMcategories('.product-detail',product);\n //product.variant = productContainer.attr('data-variant');\n product.quantity = $( '#quantity-1 option:selected' ).text();\n\n items.push(product);\n\n GtmEvents.addToCart(currency,items);\n\n}\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue ($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector ($el) {\n return $el && $('.set-items').length\n ? $($el).closest('.product-detail').find('.quantity-select')\n : $('.quantity-select');\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected ($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues (attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.parent().addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.parent().removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable').parent().removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable').parent().addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues (attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $select = $productContainer.find($attr + ' .select-' + attr.id);\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n if (!attr.values.find(function(v) {\n return v.selected;\n })) {\n $select.val($defaultOption.attr('value'));\n }\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs (attrs, $productContainer, msgs) {\n // Due project requirements, all attriutes (such as size and width) are 'swatch' values,\n // so we need to init also the processNonSwatchValues() because we have a select too\n attrs.forEach(function (attr) {\n processSwatchValues(attr, $productContainer, msgs);\n processNonSwatchValues(attr, $productContainer);\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability (response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '
  • ' + response.resources.info_selectforstock + '
  • ';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '
  • ' + message + '
  • ';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for promotions section\n *\n * @param {array} promotions - list of promotions\n * @return {string} - Compiled HTML\n */\nfunction getPromotionsHtml (promotions) {\n if (!promotions) {\n return '';\n }\n\n var html = '';\n\n promotions.forEach(function (promotion) {\n if (promotion.calloutMsg) {\n html += '
    ' + promotion.calloutMsg +\n '
    ';\n }\n });\n\n return html;\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml (attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '
    ' + attribute.label + ': '\n + attribute.value + '
    ';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} options - Ajax response options from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions (options, $productContainer) {\n options.forEach(function (option) {\n var $optionEl = $productContainer.find('.product-option[data-option-id*=\"' + option.id\n + '\"]');\n option.values.forEach(function (value) {\n var valueEl = $optionEl.find('option[data-value-id*=\"' + value.id + '\"]');\n valueEl.val(value.url);\n });\n });\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse (response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n if(response.product.price.lastPriceHtml) {\n // Update lowest price\n $('.omnibus-price').empty().append(response.product.price.lastPriceHtml);\n }\n\n // Update promotions\n $('.promotions').empty().html(getPromotionsHtml(response.product.promotions));\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities (quantities, $productContainer) {\n // sonar code smell\n // if (!($productContainer.parent('.bonus-product-item').length > 0)) {\n if (($productContainer.parent('.bonus-product-item').length <= 0)) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect (selectedValueUrl, $productContainer) {\n\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.options, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer })\n .trigger('cart:productVariantUpdate', { productContainer: $productContainer.prevObject });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl () {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml (html) {\n var $html = $('
    ').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts (data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = ''\n + '
    '\n + ''\n + '
    '\n + ''\n + '
    '\n + '
    '\n + ' ' + data.labels.selectprods + ''\n + ' '\n + '
    '\n + '
    '\n + '
    '\n + '
    '\n + '
    '\n + '
    ';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd (response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n alertNotification.set({\n alertName: 'add-to-basket',\n alertOptions: {\n message: response.message,\n status: messageType\n }\n });\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts () {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions ($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\nfunction handleColorVariationSwatches () {\n $(document).off('click.swatches');\n $(window).off('resize.swatches');\n\n if ($('.color-attribute.has-background-image').length) {\n $('.color-values-container').addClass('has-background-images');\n } else {\n return;\n }\n\n /*\n Nasconde tutti gli swatches che non stanno in una riga\n Inserisce un indicatore del numero di variation nascoste\n */\n const hideColorVariationSwatches = () => {\n const containerRects = $('.color-values-container')[0].getBoundingClientRect();\n const swatches = $('.color-attribute');\n let outElementsCount = 0;\n\n swatches.each((i, el) => {\n const swatchRects = el.getBoundingClientRect();\n if (swatchRects.left > containerRects.right || swatchRects.right > containerRects.right) {\n $(el).addClass('d-none');\n outElementsCount++;\n } else {\n return;\n }\n });\n\n if (outElementsCount > 0) {\n swatches\n .eq(swatches.length - outElementsCount - 1)\n .append(\n $('').addClass('js-open-swatches-trigger open-swatches-trigger swatch-value').text(`+ ${outElementsCount + 1}`)\n );\n }\n };\n\n $(document).on('click.swatches', '.js-open-swatches-trigger', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n $('.color-values-container').addClass('open');\n $('.color-attribute').removeClass('d-none');\n $('.js-open-swatches-trigger').remove();\n\n return false;\n });\n\n $(window).on('resize.swatches', () => {\n if (!$('.color-values-container').hasClass('open')) {\n $('.color-attribute').removeClass('d-none');\n $('.js-open-swatches-trigger').remove();\n hideColorVariationSwatches();\n }\n });\n\n /*\n Inserisce il valore del colore selezionato accanto alla label \"colore\"\n */\n $('body').on('product:afterAttributeSelect', (e, data) => {\n data.data.product.variationAttributes.forEach(attr => {\n if (attr.id === 'color') {\n attr.values.forEach(value => {\n if (value.selected) {\n $('.js-current-color-value').text(value.displayValue);\n return;\n }\n });\n return;\n }\n });\n });\n\n hideColorVariationSwatches();\n}\n\n/**\n * Retrieve product categories for GTM\n *\n * @param {string} divClass - DOM element for current product\n * @param {object} prodObj - the object to save categories in\n * @param {Number} iter - product array index (if any)\n */\n\nfunction retrieveGTMcategories (divClass, prodObj, iter) {\n var categories = $(divClass).attr('data-categories');\n var categoriesArray = categories.split('|');\n for (let i = 0; i < categoriesArray.length; i++) {\n var k = i + 1;\n if (iter >= 0) {\n prodObj[iter]['category' + k] = categoriesArray[i];\n }\n else {\n prodObj['category' + k] = categoriesArray[i];\n }\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n // Originally named as 'colorAttribute'. As per project requirements, all attriutes (such as size and width) are 'swatch' values, so they need to follow the same logic defined below, instead of the one defined under the 'selectAttribute' method\n nonSelectAttribute: function () {\n $(document).on('click', '.attributeSwatch button', function (e) {\n e.preventDefault();\n\n // As per client request, only NON-selected swatch values should trigger an ajax call\n if ($(this).attr('disabled') || $(this).find('.swatch-value').hasClass('selected')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n // As per project requirements, there are no select attributes. In case, simply restore the logic defined by the SFRA\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n gtmSendAddToCart();\n $('body').trigger('product:afterAddToCart', data);\n\n // Trigger minicart open if no error is sent back from the server\n if (!data.error) {\n $('.minicart').trigger('minicart:open');\n }\n\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($(this).parents('.choice-of-bonus-product').find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $(this).parents('.choice-of-bonus-product').find('.product-option').data('option-id');\n var valueId = $(this).parents('.choice-of-bonus-product').find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '
    '\n + '
    '\n + $choiceOfBonusProduct.find('.product-name').html()\n + '
    '\n + '
    '\n + '
    '\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product').data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\n $.spinner().stop();\n if (data.error) {\n $('.error-choice-of-bonus-products')\n .html(data.errorMessage);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '
    '\n );\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '
    '\n + data.msgSuccess + '
    '\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 3000);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n retrieveGTMcategories: retrieveGTMcategories,\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n handleColorVariationSwatches: handleColorVariationSwatches\n};\n"],"sourceRoot":""}