1/* creation date: Thu, 01 Oct 2026 15:30:30 GMT 2concat references: 3https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2FproductTile.js 4https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2Fhome.js 5https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2FuiShow.js 6*/ 7/*! https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2FproductTile.js */ 8!function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={i:moduleId,l:!1,exports:{}};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.l=!0,module.exports}__webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.d=function(exports,name,getter){__webpack_require__.o(exports,name)||Object.defineProperty(exports,name,{enumerable:!0,get:getter})},__webpack_require__.r=function(exports){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},__webpack_require__.t=function(value,mode){if(1&mode&&(value=__webpack_require__(value)),8&mode)return value;if(4&mode&&"object"==typeof value&&value&&value.__esModule)return value;var ns=Object.create(null);if(__webpack_require__.r(ns),Object.defineProperty(ns,"default",{enumerable:!0,value:value}),2&mode&&"string"!=typeof value)for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns},__webpack_require__.n=function(module){var getter=module&&module.__esModule?function(){return module.default}:function(){return module};return __webpack_require__.d(getter,"a",getter),getter},__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s="./cartridges/app_coremodel_storefront/cartridge/client/default/js/productTile.js")}({
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/adrenalead/cartEventsAdrenalead.js":function(module,exports){eval("module.exports = {\n\n //If we have a specific product (in case of addToCart) we use it or if we don't have a specific product we take one in the cart\n addedToCart: function(cartModel, product) {\n try{\n if(window['NADZ_TRIGGERS'] != 'undefined') {\n var actions = window['NADZ_TRIGGERS'].getNadzTriggerActions();\n actions.handleActions([\n ['setProduitsDansPanier', true]\n ]);\n }\n else {\n var _nAdzqTriggers = _nAdzqTriggers || [];\n _nAdzqTriggers.push(['handleActions', [\n ['setProduitsDansPanier', true]\n ]]);\n }\n }catch(error){\n console.log(error);\n }\n },\n\n confirmOrder: function(orderModel) {\n try{\n var order = orderModel;\n var orderTotal = $('.grand-total-sum').html().replace(' â¬','');\n var orderNo = $('#orderTotalText').html();\n var _nAdztr = _nAdztr || [];\n (function () {\n _nAdztr.push([\"setAdvertiserId\", \"2990\"]);\n _nAdztr.push([\"setTransactionId\", orderNo]);\n _nAdztr.push([\"setAmount\", orderTotal]);\n _nAdztr.push([\"setTr\"]);\n var u = \"https://notifpush.com/scripts/\";\n var s = document.createElement(\"script\");\n s.type = \"text/javascript\";\n s.defer = true;\n s.async = true;\n s.src = u + \"nadz-tr.js\";\n var p = document.getElementsByTagName(\"script\")[0];\n p.parentNode.insertBefore(s, p);\n })();\n if (window['NADZ_TRIGGERS'] != undefined) {\n var actions = window['NADZ_TRIGGERS'].getNadzTriggerActions();\n actions.handleActions([\n ['setProduitsDansPanier', false],\n ['setMontantConversion', orderTotal]\n ]);\n }\n else {\n var _nAdzqTriggers = _nAdzqTriggers || [];\n _nAdzqTriggers.push(['handleActions', [\n ['setProduitsDansPanier', false],\n ['setMontantConversion', orderTotal]\n ]]);\n }\n }catch(error){\n console.log(error);\n }\n }\n\n};\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/adrenalead/cartEventsAdrenalead.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/batch/cartEventsBatch.js":function(module,exports){eval('\nfunction getProductsEventInfos(Product) {\n\n let price = null;\n\n if (Product.price != null) {\n if (Product.price.sales != null) {\n if (Product.price.sales.type == "range") {\n price = Product.price.max.sales.values;\n } else {\n price = Product.price.sales.value;\n }\n }\n }\n\n if (Product.price && price) {\n var discount = Product.price.list ? Product.price.list.value : price\n discount = discount - price;\n if (discount != 0)\n discount = Math.round(discount * 100) / 100;\n }\n var rc = null;\n var rct = null;\n if (Product.productType == \'variationGroup\') {\n rc = Product.id.toLowerCase();\n //not for layer\n } else if (Product.productType == \'variant\') {\n rct = Product.id.toLowerCase();\n if (Product.variationGroupID) {\n rc = Product.variationGroupID;\n }\n }\n \n let r = Product.masterID || Product.id;\n let name = Product.productName ? Product.productName.toLowerCase() : "";\n let category = Product.primaryCategory && Product.primaryCategory.category ? Product.primaryCategory.category.toLowerCase() : null;\n let subCategory = Product.primaryCategory && Product.primaryCategory.subCategory ? Product.primaryCategory.subCategory.toLowerCase() : null;\n let subsubCategory = Product.primaryCategory && Product.primaryCategory.subSubCategory ? Product.primaryCategory.subSubCategory.toLowerCase() : null;\n let gender = Product.sexe ? Product.sexe.toLowerCase() : "";\n let season = Product.season ? Product.season.toLowerCase() : "";\n \n let price_calcul = price;\n if (Product.productType !== \'set\') {\n if (Product.price.type == "range") {\n price_calcul = Product.price.max.sales.values;\n } else {\n price_calcul = Product.price.sales.value;\n }\n }\n let unitpriceAti = price_calcul;\n\n var quantityProduct = null;\n if (Product.selectedQuantity) {\n quantityProduct = Product.selectedQuantity;\n } else if (Product.quantity) {\n quantityProduct = Product.quantity;\n }\n\n let eventObj = {\n "product_r": r,\n "product_rc": rc,\n "product_rct": rct,\n "product_name": name,\n "product_category": category,\n "product_subCategory": subCategory,\n "product_subsubCategory": subsubCategory,\n "product_gender": gender,\n "product_season": season,\n "product_unitpriceAti": unitpriceAti,\n "product_discountAti": discount,\n "product_quantity": quantityProduct\n };\n\n return eventObj;\n}\n\n\nmodule.exports = {\n\n //If we have a specific product (in case of addToCart) we use it or if we don\'t have a specific product we take one in the cart\n addedToCart: function(cartModel, product) {\n try{\n window.didomiOnReady = window.didomiOnReady || [];\n window.didomiOnReady.push(function (Didomi) { \n Didomi.getObservableOnUserConsentStatusForVendor(\'c:batch\')\n .filter(function (status) { return status !== undefined })\n .subscribe(function (consentStatus) {\n if (consentStatus === true) {\n\n batchSDK(function (api) {\n\n if (!product && cartModel.items && cartModel.items.length > 0) {\n product = cartModel.items[0];\n }\n \n var trackingObj = {};\n if (product) {\n trackingObj = getProductsEventInfos(product);\n }\n \n if (cartModel.customerCodeStl) {\n trackingObj["user_id_unencrypted"] = cartModel.customerCodeStl;\n }\n\n var productUrlBatch = null;\n if (product && product.productPageUrl) {\n productUrlBatch = {\n type: api.eventAttributeTypes.URL,\n value: product.productPageUrl,\n } \n }\n\n trackingObj["product_url"] = productUrlBatch;\n trackingObj["$label"] = trackingObj.product_category;\n \n api.trackEvent("add_to_cart", \n {\n //name: "ue.added_to_cart",\n attributes : trackingObj\n });\n\n });\n }\n });\n });\n } catch(error) {}\n }
8,\n\n cancelledCart: function() {\n try{\n window.didomiOnReady = window.didomiOnReady || [];\n window.didomiOnReady.push(function (Didomi) { \n Didomi.getObservableOnUserConsentStatusForVendor(\'c:batch\')\n .filter(function (status) { return status !== undefined })\n .subscribe(function (consentStatus) {\n if (consentStatus === true) {\n\n batchSDK(function (api) { \n api.trackEvent("cancelled_cart");\n });\n }\n });\n });\n } catch(error) {}\n },\n\n addedToWishList : function(customercode, product) {\n try {\n window.didomiOnReady = window.didomiOnReady || [];\n window.didomiOnReady.push(function (Didomi) { \n Didomi.getObservableOnUserConsentStatusForVendor(\'c:batch\')\n .filter(function (status) { return status !== undefined })\n .subscribe(function (consentStatus) {\n if (consentStatus === true) {\n\n batchSDK(function (api) {\n var trackingObj = {};\n\n product ? trackingObj = getProductsEventInfos(product) : null;\n customercode ? trackingObj["user_id_unencrypted"] = customercode : trackingObj["user_id_unencrypted"] = null;\n\n var productUrlBatch = null;\n if (product && product.productPageUrl) {\n productUrlBatch = {\n type: api.eventAttributeTypes.URL,\n value: product.productPageUrl,\n } \n }\n\n trackingObj["product_url"] = productUrlBatch;\n \n api.trackEvent("added_to_wishlist", {\n name: "ue.added_to_wishlist",\n user_id_unencrypted: customercode,\n label: trackingObj.product_category,\n attributes : trackingObj\n });\n });\n }\n });\n });\n } catch(error){ }\n }\n\n};\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/batch/cartEventsBatch.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/cart/approachingDiscounts.js":function(module,exports,__webpack_require__){"use strict";eval("\n\n\nmodule.exports = {\n\n/**\n * re-renders the approaching discount messages\n * @param {Object} approachingDiscounts - updated approaching discounts for the cart\n */\n updateApproachingDiscounts: function(approachingDiscounts) {\n if (approachingDiscounts) {\n if (approachingDiscounts.subTotal < approachingDiscounts.threshold) {\n $('.single-approaching-discount').html(approachingDiscounts.approachingPromoMessage);\n $('#progress').removeClass('full');\n if (approachingDiscounts.subTotal >= approachingDiscounts.minimumForSlotDisplay) {\n $('#cart-recommendation-freeDelivery').removeClass('d-none');\n } else {\n $('#cart-recommendation-freeDelivery').addClass('d-none');\n }\n } else {\n $('.single-approaching-discount').html(approachingDiscounts.reachedPromoMessage);\n $('#progress').addClass('full');\n $('#cart-recommendation-freeDelivery').addClass('d-none');\n }\n $('#progress').val(approachingDiscounts.percentage);\n }\n }\n};\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/cart/approachingDiscounts.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/ds/displayNotification.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = function (element, type, content) {\n if (element !== null) {\n const alertNotification = element;\n alertNotification.classList.remove('alert', 'information', 'success', 'warning', 'error');\n alertNotification.setAttribute('aria-hidden', false);\n content !== undefined ? alertNotification.querySelector('.inner-content').textContent = content : false;\n setTimeout(() => { \n alertNotification.classList.remove('d-none');\n alertNotification.classList.add('alert', type);\n }, 10);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/ds/displayNotification.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js":function(module,exports,__webpack_require__){"use strict";eval("\n// set all GTM events here\nvar GTMHelper = __webpack_require__(/*! ./gtm/GTMHelper.js */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js\");\nvar processInclude = __webpack_require__(/*! ./util */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js\");\nprocessInclude(__webpack_require__(/*! ./gtm/pwa-analytics.js */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/pwa-analytics.js\"));\n\nvar gtm = {};\nvar $cache = {};\n\nfunction initializeCache() {\n $cache.document = $(document);\n}\n\nfunction isDatalayerDefined() {\n return typeof dataLayer !== 'undefined';\n}\n\nfunction removeDataLayer (event, template) {\n if (!isDatalayerDefined()) {\n return;\n }\n if (event) {\n var index = null;\n for (var i = 0; i < dataLayer.length && index == null; i++) {\n if (template != null) {\n if (dataLayer[i].event === event && dataLayer[i].layer.template === template)\n index = i;\n } else {\n if (dataLayer[i].event === event)\n index = i;\n }\n }\n if (index != null)\n dataLayer.splice(index, 1);\n }\n}\n\nfunction findDataLayer (event, template) {\n if (!isDatalayerDefined()) {\n return;\n }\n if (event) {\n for (var i = 0; i < dataLayer.length; i++) {\n if (template != null) {\n if (dataLayer[i].event === event && dataLayer[i].layer.template === template)\n return (dataLayer[i]);\n } else {\n if (dataLayer[i].event === event)\n return (dataLayer[i]);\n }\n }\n }\n return null;\n}\n\nfunction fillDataLayer (data){\n\tif (!isDatalayerDefined()) {\n return;\n }\n\n if (data)\n dataLayer.push(data);\n // dataLayer.push({\n // \"event\": data.event,\n // \"page\": data.page,\n // \"eeAction\": data.eeAction,\n // \"currencyCode\": data.currency,\n // \"checkoutStep\": data.checkoutStep,\n // \"checkoutType\": data.checkoutType,\n // \"products\": data.products\n // });\n return;\n}\n\nfunction fillSecondaryDataLayer(data){\n\tif (!isDatalayerDefined()) {\n return;\n }\n\n\tdataLayer.push({\n\t\t\"event\": data.event2,\n\t\t\"checkoutStep\": data.prevcheckoutStep,\n\t\t\"checkoutOption\": data.checkoutOption\n\t});\n}\n\nfunction initializeEvents() {\n $cache.document.on('paymentStepGTM', function(event, data) {\n \tdata.event='virtualPageview';\n \tdata.page='/payment';\n\t\tdata.checkoutStep='3';\n\t\tdata.prevcheckoutStep='2';\n\n\t\tfillDataLayer(data);\n \tfillSecondaryDataLayer(data);\n\n return;\n });\n}\n\nfunction clicCrossSell_GTM($click) {\n var title = '';\n var $title = $click.closest('.product-carousel').siblings('.title');\n if ($title.length === 0)\n $title = $click.closest('#slot-pushproduct').find('.title-reco');\n if ($title.length === 0) {\n \n $title = $click.closest('.container-reco').find('.swipper-title');\n }\n if ($title.length != 0) {\n var calloutmsg = $title.data('calloutmsg');\n var recommender = $title.data('recommender');\n title = calloutmsg;\n if (recommender)\n title = title + '/' + recommender;\n }\n \n var url = $click.data('gtm-url');\n var pid = $click.data('pid');\n $.ajax({\n url: url,\n data: {\n pid: pid\n },\n async: false,\n method: 'GET',\n success: function (data) {\
8n let GTMclicCrossSell = __webpack_require__(/*! ./gtm/util/actions/clicCrossSell */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/clicCrossSell.js\");\n GTMclicCrossSell.getDataLayerForAction({\n product: data.product,\n title: title\n });\n }\n });\n}\n\nmodule.exports = {\n fillDataLayer : fillDataLayer,\n removeDataLayer : removeDataLayer,\n findDataLayer: findDataLayer,\n init : function() {\n initializeCache();\n initializeEvents();\n $cache.document.trigger('GTMReady');\n\n $(document).on('click', '.slotReco .clickproduct', function(){\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.slotReco .product-tile .tile-body .pdp-link .link', function(){\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.slotReco .product-tile .tile-body .color-swatches', function(){\n clicCrossSell_GTM($(this));\n });\n $(document).on('click', '.container-reco .clickproduct', function(){\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.container-reco .product-tile .tile-body .pdp-link .link', function(){\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.container-reco .product-tile .tile-body .color-swatches', function(){\n clicCrossSell_GTM($(this));\n });\n \n // Reco dans le mini-panier\n $(document).on('click', '.js-minicart-body .clickproduct', function () {\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.js-minicart-body .product-tile .tile-body .pdp-link .link', function () {\n clicCrossSell_GTM($(this));\n });\n\n $(document).on('click', '.js-minicart-body .product-tile .tile-body .color-swatches', function () {\n clicCrossSell_GTM($(this));\n });\n }\n}\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js":function(module,exports){eval('getProductJsonBase = function (Product, price, quantity, addToCartOrigin) {\n if (Product.price) {\n var discount = Product.price.list ? Product.price.list.value : price\n discount = discount - price;\n if (discount != 0)\n discount = Math.round(discount * 100) / 100;\n }\n var rc = null;\n var rct = null;\n var rct_sku = \'\';\n if (Product.productType == \'variationGroup\') {\n rc = Product.id.toLowerCase();\n rct_sku = \'\';\n //not for layer\n } else if (Product.productType == \'variant\') {\n rct = Product.id.toLowerCase();\n rct_sku = Product.rctSku ? Product.rctSku : \'\';\n if (Product.variationGroupID) {\n rc = Product.variationGroupID;\n }\n }\n \n let r = Product.masterID || Product.id;\n let name = Product.productName ? Product.productName.toLowerCase() : "";\n let category = Product.primaryCategory && Product.primaryCategory.category ? Product.primaryCategory.category.toLowerCase() : null;\n let subCategory = Product.primaryCategory && Product.primaryCategory.subCategory ? Product.primaryCategory.subCategory.toLowerCase() : null;\n let subsubCategory = Product.primaryCategory && Product.primaryCategory.subSubCategory ? Product.primaryCategory.subSubCategory.toLowerCase() : null;\n let subsubsubCategory = Product.primaryCategory && Product.primaryCategory.subSubSubCategory ? Product.primaryCategory.subSubSubCategory.toLowerCase() : null;\n let categoryName = Product.primaryCategory && Product.primaryCategory.categoryname ? Product.primaryCategory.categoryname.toLowerCase() : null;\n let subCategoryName = Product.primaryCategory && Product.primaryCategory.subCategoryname ? Product.primaryCategory.subCategoryname.toLowerCase() : null;\n let subsubCategoryName = Product.primaryCategory && Product.primaryCategory.subSubCategoryname ? Product.primaryCategory.subSubCategoryname.toLowerCase() : null;\n let subsubsubCategoryName = Product.primaryCategory && Product.primaryCategory.subSubSubCategoryname ? Product.primaryCategory.subSubSubCategoryname.toLowerCase() : null;\n let gender = Product.sexe ? Product.sexe.toLowerCase() : "";\n let season = Product.season ? Product.season.toLowerCase() : "";\n let price_flag = Product.flagsPromo && Product.flagsPromo.flagPromoName ? Product.flagsPromo.flagPromoName.toLowerCase() : "";\n let product_flag = [];\n let productset_id;\n let productset_products_number;\n\n \n if (Product.flagsPromo && Product.flagsPromo.tabOfFlags && Product.flagsPromo.tabOfFlags.length > 0) {\n for (var i = 0; i < Product.flagsPromo.tabOfFlags.length; i++) {\n product_flag.push(Product.flagsPromo.tabOfFlags[i].name.toLowerCase());\n }\n }\n\n var flagNewName;\n if (Product.flagsPromo && Product.flagsPromo.flagNewName) {\n flagNewName = Product.flagsPromo.flagNewName;\n }\n\n let brand = Product.brand ? Product.brand.toLowerCase() : "";\n let rating = Product.rating;\n\n let price_calcul = price;\n if (Product.productType !== \'set\') {\n if (Product.price.type != undefined && Product.price.type == "range") {\n price_calcul = Product.price.max.sales.values;\n } else {\n price_calcul = Product.price.sales.value;\n }\n }\n\n let unitpriceAti = price_calcul;\n let brandName = Product.brandName ? Product.brandName.toLowerCase() : "";\n let brandTitle = Product.brandTitle ? Product.brandTitle.toLowerCase() : "";\n\n let productJson = {\n "r": r,\n "rc": rc,\n "rct": rct,\n "rct_sku": rct_sku,\n "name": name,\n "category": category,\n "subCategory": subCategory,\n "subsubCategory": subsubCategory,\n "subsubsubCategory": subsubsubCategory,\n "category_label": categoryName,\n "subCategory_label": subCategoryName,\n "subsubCategory_label": subsubCategoryName,\n "subsubsubCategory_label": subsubsubCategoryName,\n "gender": gender,\n "season": season,\n "price_flag": price_flag,\n "product_flag": product_flag,\n "new_flag": flagNewName,\n "brand": brand,\n "brandName": brandName,\n "brandTitle": brandTitle,\n "rating": rating,\n "unitpriceAti": unitpriceAti,\n "discountAti": discount,\n "hasVideo": !!(Product.brightcoveVideos),\n "imageNumber": Product.images && Product.images.large ? Product.images.large.length : 0\n };\n\n if (Product.productType == \'set\') {\n productJson.productset_id = Product.id;\n productJson.productset_products_number = Product.individualProducts.length;\n }\n\n if (quantity) {\n productJson.quantity = quantity;\n }\n \n if(addToCartOrigin){\n productJson.addToCartOrigin = addToCartOrigin;\n }\n\n return productJson;\n},\n\n module.exports = {\n populateProduct: function (productLineItems, addQuantity, addToCartOrigin) {\n // Prepare default value\n addQuantity = addQuantity || false;\n for (let i in productLineItems) {\n let item = productLineItems[i].product;\n //let price = item.basePrice ? item.basePrice.getValue() : item.price.sales.decimalPrice.value;\n let price = null;\n\n if (item.price != null) {\n if (item.price.sales != null) {\n if (item.price.sales.type == "range") {\n price = item.price.max.sales.values;\n } else {\n price = item.price.sales.value;\n }\n }\n }\n\n let quantity = null;\n if (addQuantity) {\n quantity = item.quantity || parseInt(addQuantity);\n }\n return (getProductJsonBase(item, price, quantity, addToCartOrigin));\n }\n },\n }\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/pwa-analytics.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = {\n pwaInstalled: function() {\n window.addEventListener('appinstalled', function(evt) {\n let GTMPWAInstalled = __webpack_require__(/*! ./util/actions/pwaInstalled */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/pwaInstalled.js\");\n GTMPWAInstalled.getDataLayerForAction();\n });\n },\n usePWA: function() {\n window.addEventListener('load', function () {\n\n let displayMode = 'browser tab';\n\n // Pour Safari sur IOs qui ne dispose pas de matchMedia\n if (navigator.standalone) {\n displayMode = 'standalone-ios';\n }\n \n if (window.matchMedia('(display-mode: standalone)').matches) {\n displayMode = 'standalone';\n }\n\n var hasPWA = displayMode.indexOf('standalone') != -1 ? 'yes' : 'no';\n let GTMhasPWA = __webpack_require__(/*! ./util/pages/pwa */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/pages/pwa.js\");\n GTMhasPWA.getDataLayerForPage({\n hasPWA : hasPWA\n });\n \n });\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/pwa-analytics.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/cartUpdate.js":function(module,exports,__webpack_require__){eval("var gtm = __webpack_require__(/*! ../../../gtm */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js\");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n \"event\": \"cart_update\",\n };\n\n data.e = {\n 'category' : 'cart',\n 'action' : 'update'\n }\n\n if (params.action) {\n data.e.label = params.action;\n }\n\n data.cart = {};\n\n var hasDiscountWithDetails = 'no';\n if (params.cart && params.cart.totals && params.cart.totals.hasDiscountWithDetails) {\n hasDiscountWithDetails = 'yes';\n }\n\n data.cart.hasOffers = hasDiscountWithDetails;\n\n if (params.cart && params.cart.hasSavings) {\n data.cart.hasSavings = params.cart.hasSavings;\n }\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/cart
8Update.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/clicCrossSell.js":function(module,exports,__webpack_require__){eval('var gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\nvar GTMHelper = __webpack_require__(/*! ../../GTMHelper */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "clic cross-sell",\n };\n\n params = params || {};\n\n data.e = [];\n\n var product = [];\n if (params.product){\n product = (GTMHelper.populateProduct([{product : params.product}], false));\n }\n data.e={\n category: \'cross-sell\',\n action: params.title.trim(),\n product: product\n };\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/clicCrossSell.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/closeLayer.js":function(module,exports){eval('module.exports = {\n populateData : function (params) {\n var data = {\n "event": "closing layer",\n };\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/closeLayer.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/colorChanged.js":function(module,exports,__webpack_require__){eval('var gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "analytics",\n };\n\n params = params || {};\n data.e = [];\n\n data.e={\n category: \'pdp\',\n action: \'color_changed\',\n product: {rc:params.idProductRC, rct: params.idProductRCT},\n label : params.label\n };\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/colorChanged.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/pwaInstalled.js":function(module,exports,__webpack_require__){eval('var gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "pwa installed",\n };\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/pwaInstalled.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/ratingProduct.js":function(module,exports,__webpack_require__){eval('var GTMHelper = __webpack_require__(/*! ../../GTMHelper */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js");\nvar gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n event: "layer",\n };\n\n params = params || {};\n\n data.layer = [];\n data.layer={\n template: \'rating\',\n };\n\n if (params.product){\n var product = [];\n product = (GTMHelper.populateProduct([{product : params.product}], false));\n const {hasVideo, imageNumber, ... productDataUpdated} = product;\n data.layer.product = productDataUpdated;\n }\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/ratingProduct.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/sizeChanged.js":function(module,exports,__webpack_require__){eval('var gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "analytics",\n };\n\n params = params || {};\n data.e = [];\n\n data.e={\n category: \'pdp\',\n action: \'size_changed\',\n product: {rc:params.idProductRC, rct: params.idProductRCT},\n label : params.label\n };\n\n return data;\n },\n getDataLayerForAction : function(params) {\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/sizeChanged.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/addToCart.js":function(module,exports,__webpack_require__){eval("var GTMHelper = __webpack_require__(/*! ../../GTMHelper */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js\");\nvar gtm = __webpack_require__(/*! ../../../gtm */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js\");\n\nvar template = 'add to cart';\nmodule.exports = {\n populateData : function (params) {\n var data = {\n \"event\": \"layer\",\n };\n\n params = params || {};\n\n if (params.product){\n if(params.product.productType == 'set') {\n data.product_array_bundle = [];\n data.layer={\n template: 'add_to_cart_productset',\n };\n var product = [];\n var pids = false;\n\n // check selected products in PS\n if(params.pidsObj) {\n var pids = JSON.parse(params.pidsObj);\n }\n\n for (let i in params.product.individualProducts) {\n var individualProduct = params.product.individualProducts[i];\n if(pids) {\n pids.forEach((pid) => {\n if(pid.pid == individualProduct.id) {\n var productToPopulate = GTMHelper.populateProduct([{product : individualProduct}], document.querySelector('#quantity-1') ? document.querySelector('#quantity-1 option:checked').value : false, params.pageOrigin);\n productToPopulate.productset_id = params.product.id;\n productToPopulate.rct = pid.pidOrigin;\n product.push(productToPopulate);\n }\n });\n } else {\n var productToPopulate = GTMHelper.populateProduct([{product : params.product}], document.querySelector('#quantity-1') ? document.querySelector('#quantity-1 option:checked').value : false, params.pageOrigin);\n productToPopulate.productset_id = params.product.id;\n productToPopulate.productset_products_number = params.product.individualProducts.length;\n product.push(productToPopulate);\n }\n }\n data.product_array_bundle = product;\n } else {\n data.layer = [];\n data.layer={\n template: template,\n };\n var product = [];\n product = (GTMHelper.populateProduct([{product : params.product}], document.querySelector('#quantity-1') ? document.querySelector('#quantity-1 option:checked').value : false, params.pageOrigin));\n data.layer.product = product;\n }\n if (params.product_array && params.product_array.length > 0) {\n data.product_array = params.product_array;\n }\n }\n\n if (params.currentBasketId) {\n data.cart = {\n id : params.currentBasketId,\n creation : params.isCartCreation\n }\n \n }\n\n return data;\n },\n removeDataLayer : function()\n {\n gtm.removeDataLayer('layer', template);\n },\n getDataLayerForLayer : function(params) {\n this.removeDataLayer();\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/addToCart.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickViewCart.js":function(module,exports,__webpack_require__){eval('var GTMHelper = __webpack_require__(/*! ../../GTMHelper */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js");\nvar gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nvar template = \'quickview cart\';\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "layer",\n };\n\n params = params || {};\n\n data.layer = [];\n data.layer={\n template: template,\n };\n if (params.product){\n var product = [];\n product = (GTMHelper.populateProduct([{product : params.product}], false, params.addedToCartOrigin));\n data.layer.product = product;\n }\n\n data.cart = [];\n data.cart={\n id:params.cartId,\n }\n \n return data;\n },\n removeDataLayer : function()\n {\n gtm.removeDataLayer(\'layer\', template);\n },\n getDataLayerForLayer : function(params) {\n this.removeDataLayer();\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickViewCart.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickview.js":function(module,exports,__webpack_require__){eval('var GTMHelper = __webpack_require__(/*! ../../GTMHelper */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js");\nvar gtm = __webpack_require__(/*! ../../../gtm */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js");\n\nvar template = \'quickview\';\nmodule.exports = {\n populateData : function (params) {\n var data = {\n "event": "layer",\n };\n\n params = params || {};\n\n data.layer = [];\n data.layer={\n template: template,\n };\n\n if (params.product){\n var product = [];\n product = (GTMHelper.populateProduct([{product : params.product}], false));\n data.layer.product = product;\n }\n\n data.cart = [];\n data.cart={\n id:params.cartId,\n }\n return data;\n },\n removeDataLayer : function()\n {\n gtm.removeDataLayer(\'layer\', template);\n },\n getDataLayerForLayer : function(params) {\n this.removeDataLayer();\n var data = this.populateData(params);\n gtm.fillDataLayer(data);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickview.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/pages/pwa.js":function(module,exports,__webpack_require__){eval("var GTMHelper = __webpack_require__(/*! ../../GTMHelper */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/GTMHelper.js\");\nvar gtm = __webpack_require__(/*! ../../../gtm */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm.js\");\n\npopulateData = function (dataLayer, params) {\n if (dataLayer.env)\n dataLayer.env.hasPWA = params.hasPWA;\n}\n\nmodule.exports = {\n removeDataLayer : function()\n {\n gtm.removeDataLayer('pageview');\n },\n findDataLayer : function()\n {\n return gtm.findDataLayer('pageview');\n },\n getDataLayerForPage : function(params) {\n var dataLayer = this.findDataLayer();\n if (dataLayer)\n populateData(dataLayer, params);\n }\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/pages/pwa.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/helpers.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nfunction decode_base64(s) {\n var b = 0;\n var l = 0;\n var r = '';\n s = s.split('');\n var m = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n for (var i in s) {\n b = (b << 6) + m.indexOf(s[i]); l += 6;\n while (l >= 8) r += String.fromCharCode((b >>> (l -= 8)) & 0xff);\n }\n return r.trimRight();\n}\n\nfunction isElementInViewport (el) {\n if(el && el.offset()) {\n var elementTop = el.offset().top;\n var elementBottom = elementTop + el.outerHeight();\n \n var viewportTop = $(window).scrollTop();\n var viewportBottom = viewportTop + $(window).height();\n \n return elementBottom > viewportTop && elementTop < viewportBottom;\n }\n return;\n}\n\nfunction initLazyLoading() {\n var elements = document.querySelectorAll('.carousel-inner .carousel-item');\n elements.forEach(function(element) {\n if(!element.classList.contains('active')) {\n element.querySelector('img').setAttribute('loading', 'lazy');\n }\n });\n $('img').each(function() {\n if(isElementInViewport($(this))) {\n $(this).attr('loading', 'lazy');\n }\n });\n}\n\n\n$(function() {\n var lazyElts = document.querySelectorAll('.carousel-inner .carousel-item');\n\n lazyElts.forEach(function(elt) {\n if(!elt.classList.contains('active') && elt.querySelector('img')) {\n elt.querySelector('img').setAttribute('loading', 'lazy');\n }\n });\n\n $('img').each(function() {\n if($(this) && $(this).offset()) {\n var elementTop = $(this).offset().top;\n var elementBottom = elementTop + $(this).outerHeight();\n var viewportTop = $(window).scrollTop();\n var viewportBottom = viewportTop + $(window).height();\n\n if(!(elementBottom > viewportTop && elementTop < viewportBottom)) {\n $(this).attr('loading', 'lazy');\n }\n }\n });\n});\n\nmodule.exports = {\n decode_base64: decode_base64,\n initLazyLoading: initLazyLoading\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/helpers.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/addToCartSuccess.js":function(module,exports,__webpack_require__){"use strict";eval("\nvar approachingDiscounts = __webpack_require__(/*! ../cart/approachingDiscounts */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/cart/approachingDiscounts.js\");\nvar displayNotification = __webpack_require__(/*! ../ds/displayNotification */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/ds/displayNotification.js\");\n\n/**\n * Add a product line item to the product list.\n * Originally made for gift wrap, can be extended to more\n * @param {Object} data - AJAX response from the server\n */\nfunction updateProductsInCart(data) {\n $('#cart-products').empty().html(data.cartCardHtml);\n}\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 = '\x3c!-- Modal --\x3e' +\n '<div class=\"modal fade\" id=\"chooseBonusProductModal\" role=\"dialog\">' +\n '<div class=\"modal-dialog choose-bonus-product-dialog\" ' +\n 'data-total-qty=\"' + data.maxBonusItems + '\"' +\n 'data-UUID=\"' + data.uuid + '\"' +\n 'data-pliUUID=\"' + data.pliUUID + '\"' +\n 'data-addToCartUrl=\"' + data.addToCartUrl + '\"' +\n 'data-pageStart=\"0\"' +\n 'data-pageSize=\"' + data.pageSize + '\"' +\n 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"' +\n 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">' +\n '\x3c!-- Modal content--\x3e' +\n '<div class=\"modal-content\">
8' +\n '<div class=\"modal-header\">' +\n ' <span class=\"\">' + data.labels.selectprods + '</span>' +\n ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">×</button>' +\n '</div>' +\n '<div class=\"modal-body\"></div>' +\n '<div class=\"modal-footer\"></div>' +\n '</div>' +\n '</div>' +\n '</div>';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('#chooseBonusProductModal .modal-body').empty();\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\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n $('body').trigger('pwa:updateCard', response.cart);\n\n // show add to cart toast\n if (response.newBonusDiscountLineItem &&\n Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n let url = $('.js-minicart').data('action-url');\n let count = parseInt($('.js-minicart .minicart-quantity').text(), 10);\n\n if (count !== 0 && $('.minicart .popover.show').length === 0) {\n let miniCartModal = $('.js-minicart-body');\n $('#miniCartModal').modal('show');\n miniCartModal.spinner().start();
8\n $.get(url, function (data) {\n\n miniCartModal.empty();\n miniCartModal.append(data);\n\n if (typeof $('body #js-added-to-cart-msg') == \"undefined\") {\n $('body').prepend($('#js-added-to-cart-msg'));\n }\n // use for AB Test OCS-248 Variation 2\n $('#layerCart').addClass('test-hide');\n\n $('#js-added-to-cart-msg').addClass('show');\n\n\n\n var checkExist = setInterval(function () {\n var $reco = $(document).find('#slot-pushproduct');\n\n // use for AB Test OCS-248 Variation 1\n var useAnchor = $(document).find('.js-minicart-body').data('use-anchor');\n if(useAnchor === undefined) {\n useAnchor = true;\n }\n // END AB Test OCS-248 Variation 1\n \n if ($reco && $reco.length > 0) {\n var anchor = $reco.data('slot-anchor');\n if (anchor && useAnchor) {\n $reco.parents('.modal-content').animate({ scrollTop: $reco[0].offsetTop }, 'slow');\n\n }\n clearInterval(checkExist);\n }\n }, 200);\n miniCartModal.spinner().stop();\n });\n }\n }\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $('body').trigger('pwa:updateCard', data);\n\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.shipping-cost-cart').empty().append(data.totals.totalShippingCost);\n $('.shipping-cost').empty().append(data.totals.totalShippingCost);\n $('.tax-total').empty().append(data.totals.totalTax);\n if ($('#checkout-main').length > 0) {\n $('.grand-total-sum').empty().append(data.totals.grandTotal);\n } else {\n $('.grand-total').empty().append(data.totals.grandTotal);\n }\n let deliveryCost = \"\";\n const deliveryMethod = data.shipments[0].bestShippingMethodDisplayName !== undefined ? data.shipments[0].bestShippingMethodDisplayName : data.shipments[0].selectedShippingMethodDisplayName;\n if (data.shipments[0].bestShippingMethodTotals !== undefined && data.shipments[0].bestShippingMethodTotals.totalShippingCost !== undefined ) {\n deliveryCost = data.shipments[0].bestShippingMethodTotals.totalShippingCost;\n } else {\n data.shipments[0].shippingMethods.forEach(function(deliveryMethodName) {\n if (deliveryMethodName.displayName == deliveryMethod) {\n if (deliveryMethodName.shippingCost == '0,00 â¬') {\n deliveryCost = $('.delivery-value').attr('data-free-delivery');\n } else {\n deliveryCost = deliveryMethodName.shippingCost;\n }\n }\n })\n }\n $('.delivery-text').empty().append(deliveryMethod);\n $('.delivery-value').empty().append(deliveryCost);\n $('.totalPrice').empty().append(data.totals.grandTotal);\n $('.sub-total').empty().append(data.totals.subTotal);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-layer-quantity').empty().append('(' + data.numItems + ')');\n\n $('.bonus-product-line-item').remove();\n if (data.hasBonusProduct) {\n addProductlineItem(data);\n }\n\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $('.order-discount').removeClass('hide-order-discount');\n $('.order-discount-total').empty()\n .append('- ' + data.totals.orderLevelDiscountTotal.formatted);\n } else {\n $('.order-discount').addClass('hide-order-discount');\n }\n\n if (data.totals.shippingLevelDiscountTotal.value > 0) {\n $('.shipping-discount').removeClass('hide-shipping-discount');\n $('.shipping-discount-total').empty().append('- ' +\n data.totals.shippingLevelDiscountTotal.formatted);\n } else {\n $('.shipping-discount').addClass('hide-shipping-discount');\n }
8\n\n data.items.forEach(function (item) {\n $('.item-' + item.UUID).empty().append(item.renderedPromotions);\n $('.item-total-' + item.UUID).empty().append(item.priceTotal.renderedPrice);\n });\n\n //ABtestEconomy segment : economyProductBasket // economyBasket\n var $cartEconomySelector = $('.js-cart-economy');\n if ($cartEconomySelector.length > 0) {\n if (data.totals.cartEconomy) {\n $cartEconomySelector.replaceWith(data.totals.cartEconomyHtml);\n } else {\n $cartEconomySelector.empty();\n }\n }\n}\n\n/**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n if (data.valid.error) {\n if (data.valid.message) {\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'error', data.valid.message);\n\n if (data.valid.invalidProducts.length > 0) {\n $('.product-cart-invalid').removeClass('d-flex').addClass('d-none');\n data.valid.invalidProducts.forEach(function(invalidProduct) {\n $('.product-cart-invalid[data-pid=\"' + invalidProduct + '\"]').removeClass('d-none').addClass('d-flex');\n });\n }\n } else {\n $('.cart').empty().append('<div class=\"row\"> ' +\n '<div class=\"col-12 text-center\"> ' +\n '<h1>' + data.resources.emptyCartMsg + '</h1> ' +\n '</div> ' +\n '</div>'\n );\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-layer-quantity').empty().append('(' + data.numItems + ')');\n $('.minicart .popover').empty();\n $('.minicart .popover').removeClass('show');\n }\n\n $('.checkout-btn').addClass('disabled');\n } else {\n $('.checkout-btn').removeClass('disabled');\n $('.product-cart-invalid').removeClass('d-flex').addClass('d-none');\n }\n}\n\nfunction validateExclusionProducts(validExclusionProducts, basket) {\n let productAvailable = true;\n const jsValidExluButton = document.querySelectorAll('.js-valid-exclusion'); /* Mobile and desktop buttons */\n if (validExclusionProducts && validExclusionProducts.valid) {\n $(document).find('.valid-exclusion-product-error').addClass('d-none');\n }\n else {\n $(document).find('.valid-exclusion-product-error').removeClass('d-none');\n }\n\n if (jsValidExluButton.length !== 0) {\n basket.items.forEach(function(product) {\n product.available !== true ? productAvailable = false : false ;\n })\n\n jsValidExluButton.forEach(function(button) { \n productAvailable == true ? (button.classList.remove('disabled'), button.setAttribute('aria-disabled', 'false')) : (button.classList.add('disabled'), button.setAttribute('aria-disabled', 'true')) ;\n })\n }\n}\n\n/**\n * Updates price of all product lines item\n * @param {Object} items - list of items from the server\n * Info : it's useful only when valopanier said to apply Pricebook when customer update quantity\n */\nfunction updatePrice(items) {\n for (var i = 0; i < items.length; i++) {\n var priceSelector = '.Price-' + items[i].UUID;\n $(priceSelector).replaceWith(items[i].price.html);\n\n //ABtestEconomy segment : economyProductBasket\n var economySelector = '.js-lineitem-economy-' + items[i].UUID;\n if ($(economySelector).length > 0) {\n if (items[i].economy) {\n $(economySelector).replaceWith(items[i].economyHtml);\n } else {\n $(economySelector).empty();\n }\n }\n }\n}\n\nfunction ajaxAddToCart(data, dataPageOrigin){\n \n let GTMaddToCart = __webpack_require__(/*! ../gtm/util/layers/addToCart */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/addToCart.js\");\n GTMaddToCart.getDataLayerForLayer({\n product: data.product,\n pageOrigin: dataPageOrigin,\n currentBasketId: data.currentBasketId,\n pidsObj: data.pidsObj,\n product_array: data.product_array,\n isCartCreation: data.isCartCreation \n });\n\n if($(document).find('#batch').length > 0) {\n let cartEventsBatch = __webpack_require__(/*! ../batch/cartEventsBatch */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/batch/cartEventsBatch.js\");\n cartEventsBatch.addedToCart(data.cart, data.product);\n } else if($(document).find('#adrenalead').length > 0) {\n let cartEventsAdrenalead = __webpack_require__(/*! ../adrenalead/cartEventsAdrenalead */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/adrenalead/cartEventsAdrenalead.js\");\n cartEventsAdrenalead.addedToCart(data.cart, data.product);\n }\n\n // update bestshippingMethodName\n if (data && data.bestShippingMethodName) {\n if ($('.js-best-shipping-name').length > 0) {\n $('.js-best-shipping-name').empty().html(data.bestShippingMethodName);\n }\n }\n if ($('.Cart-Show').length > 0 && data) {\n if (data.cartWasEmpty) {\n window.location.reload();\n } else {\n updateProductsInCart(data); //ok\n $('.coupons-and-promos').empty().append(data.cart.totals.discountsHtml); //ok\n //ABTestEconomy segment : economyProductBasket // economyBasket // Control\n //Tracking\n let GTMcartUpdate = __webpack_require__(/*! ../gtm/util/actions/cart
8Update */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/cartUpdate.js\");\n GTMcartUpdate.getDataLayerForAction({\n cart: data.cart,\n action: 'product added to cart'\n });\n //////////////////////////////////////////////////////////\n updateCartTotals(data.cart);\n approachingDiscounts.updateApproachingDiscounts(data.cart.approachingDiscounts); //ok\n $('body').trigger('setShippingMethodSelection', data.cart);\n validateBasket(data.cart);\n validateExclusionProducts(data.validExclusionProducts, data.cart);\n updatePrice(data.cart.items);\n $('body').trigger('cart:update');\n }\n }\n \n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n}\n\nmodule.exports = {\n ajaxAddToCart : ajaxAddToCart\n}\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/addToCartSuccess.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/base.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar sizeChartAlreadyLoaded = false;\nvar lastUrl = \"\";\nvar helpers = __webpack_require__(/*! ../helpers */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/helpers.js\");\nconst addToCartSuccess = __webpack_require__(/*! ./addToCartSuccess */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/addToCartSuccess.js\");\nconst addToCart = __webpack_require__(/*! ../gtm/util/layers/addToCart */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/addToCart.js\");\nvar displayNotification = __webpack_require__(/*! ../ds/displayNotification */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/ds/displayNotification.js\");\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n/**\n * 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').data('pid');\n } else if($('.container-adproduct').length){\n pid = $($el).closest('.container-adproduct').data('pid');\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/** Manage position of the active color **/\nfunction colorSelectedFirstPos() {\n const colors = document.querySelectorAll(\".product-detail .color-attribute\");\n if (colors) {\n colors.forEach(function(color) {\n color.classList.contains('selected') ? color.classList.remove('selected') : false ;\n if (color.querySelector('.color-value') != null && color.querySelector('.color-value').classList.contains('selected')) {\n colors[0].insertAdjacentElement('beforebegin', color)\n }\n })\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, $productC
8ontainer, 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.length !== 0) {\n if (attrValue.selected) {\n var $attrSelected = $(\"#js-color-name\")[0];\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n if ($attrValue.length > 0) {\n var $selectedColor = $attrValue[0].getAttribute(\"data-color\");\n // update attribute label\n var colorText = $('#js-color-name .attr-text')[0].innerText;\n $attrSelected.innerHTML = '<span class=\"attr-text\">'+colorText+'</span>'+ $selectedColor;\n $attrValue[0].closest(\"a.ocs-item-control-item\") !== null ? $attrValue[0].closest(\"a.ocs-item-control-item\").classList.add(\"selected\") : false;\n // update product label\n var $productName = $(\"h1.product-name\")[0];\n var productDataName = $productContainer.data('name');\n $productName.innerHTML = productDataName;\n var productDataDisplayColor = $productContainer.data('displaycolor');\n if (!productDataDisplayColor && $('.set-items').length === 0) {\n $productName.innerHTML += \" - \" + $selectedColor;\n }\n }\n } else {\n $attrValue.removeClass('selected');\n $attrValue[0].closest(\"a.ocs-item-control-item\") !== null ? $attrValue[0].closest(\"a.ocs-item-control-item\").classList.remove(\"selected\") : false;\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n }\n\n /* --------------------- AB OCS-1136 --------------------- */\n if (attr.attributeId == \"color\" && document.querySelector('#colorSelect') !== null) {\n var colorOpt = document.querySelectorAll('#colorSelect option');\n colorOpt.forEach(function(opt) {\n opt.getAttribute('data-color') == attrValue.displayValue ? opt.setAttribute('data-url', attrValue.url) : false;\n })\n }\n /* --------------------- AB OCS-1136 --------------------- */\n \n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\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 $attrValue.removeAttr('disabled');\n\n var $attrButton = $attrValue.parent();\n\n // Check if the button and span shoud be disabled or not\n if (!attrValue.selectable) {\n /* --------------------- AB OCS-1136 --------------------- */\n if ($attrValue[0] !== null) {\n if ($attrValue[0].localName == \"option\") {\n $attrValue[0].setAttribute('disabled', true);\n if ($attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input input[type=\"text\"]').value == attrValue.displayValue) { /*It means the option selected is now disabled */\n $attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input').classList.remove('has-value');\n $attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input input[type=\"text\"]').value = \"\";\n }\n /* --------------------- AB OCS-1136 --------------------- */\n } else {\n $attrValue[0].closest(\".ocs-item-control-item\").setAttribute('disabled', true);\n $attrValue[0].closest(\"button.ocs-button\").setAttribute('aria-disabled', true);\n $attrButton.prop('disabled', true).removeClass('selectable').addClass('unselectable');\n $attrValue.removeClass('selectable').addClass('unselectable');\n }\n }\n } else {\n /* --------------------- AB OCS-1136 --------------------- */\n if ($attrValue[0] !== null) {\n if ($attrValue[0].localName == \"option\") {\n $attrValue[0].removeAttribute('disabled');\n /* --------------------- AB OCS-1136 --------------------- */\n } else {\n $attrValue[0].closest(\".ocs-item-control-item\").removeAttribute(\"disabled\");\n $attrValue[0].closest(\"button.ocs-button\").setAttribute(\"aria-disabled\", false);\n $attrButton.removeAttr('disabled').removeClass('unselectable').addClass('selectable');\n $attrValue.removeClass('unselectable').addClass('selectable');\n }\n }\n }\n\n if ($attrValue[0] !== null && $attrValue[0].localName !== \"option\") { /* --------------------- AB OCS-1136 CONDITION --------------------- */\n // Set/Unset the select class fron the attribute\n if (!attrValue.selected) {\n $attrValue.removeClass('select');\n $attrValue[0].closest(\"button.ocs-button\").classList.remove(\"selected\");\n $attrValue[0].closest('.ocs-item-control-item').classList.remove(\"selected\");\n } else {\n $attrValue.addClass('select');\n $attrValue[0].closest(\"button.ocs-button\").classList.add(\"selected\");\n \n if ($('.set-items').length)\n var selectCheckbox = $productC
8ontainer.find(':checkbox');\n if (selectCheckbox && !selectCheckbox.is(':checked'))\n selectCheckbox.attr('checked', 'checked').addClass('checked').trigger('change');\n }\n }\n\n /* Override the standard only for length */\n if (attr.id === 'length') {\n if (attrValue.selected) {\n $attrValue.prop('selected', true);\n } else {\n $attrValue.prop('selected', false);\n }\n }\n });\n}\n\nfunction adProcessNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' select.js-select-adproduct-' + attr.id + ' option[data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url);\n $attrValue.attr('data-url', attrValue.url);\n $attrValue.removeAttr('disabled');\n \n\n // Check if the button and span shoud be disabled or not\n if (!attrValue.selectable) {\n $attrValue.prop('disabled', true)\n } else {\n $attrValue.removeAttr('disabled')\n }\n\n // Set/Unset the select class fron the attribute\n if (!attrValue.selected) {\n $attrValue.removeAttr('selected');\n } else {\n $attrValue.prop('selected',true);\n }\n\n /* Override the standard only for length */\n if (attr.id === 'length') {\n if (attrValue.selected) {\n $attrValue.prop('selected', true);\n } else {\n $attrValue.prop('selected', false);\n }\n }\n\n if (!attrValue.selectable && $attrValue[0] !== null && $attrValue[0].localName == \"option\") {\n $attrValue[0].setAttribute('disabled', true);\n if ($attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input input[type=\"text\"]').value == attrValue.displayValue) { /*It means the option selected is now disabled */\n $attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input').classList.remove('has-value');\n $attrValue[0].closest(\".ocs-select\").querySelector('.ocs-input input[type=\"text\"]').value = \"\";\n }\n }\n });\n}\n\n/**\n * Decide whether to display or not the length attribute field\n *\n * The length attribute field is displayed when:\n * - A size is selected, and at least one \"real\" size exists\n *\n * @param {Object} attrSize - The size attribute\n * @param {Object} attrLength - The length attribute\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateLengthVisibilty(attrSize, attrLength, $productContainer) {\n /* Default value for length display is false */\n var isLengthDisplayed = false;\n var sizeValueSelected = false;\n\n /* Search if a size is selected */\n attrSize.values.forEach(function (attrSizeValue) {\n if (attrSizeValue.selected) {\n sizeValueSelected = true;\n }\n });\n\n /* When a size is selected, decide if the length should be diplated */\n if (sizeValueSelected === true) {\n var countSelectableRealLengthValues = 0;\n\n /* Count the real number of selectable length. */\n attrLength.values.forEach(function (attrLengthValue) {\n /* The value \"099099\" is not a real value. It is used as a default value for items that doesn't have a size\n It will be removed from import data, but is still here for sometimes.\n */\n //TODO To be removed when no more \"099099\" are sent in HC import files\n if (attrLengthValue.selectable && attrLengthValue.id !== \"099099\") {\n countSelectableRealLengthValues++;\n }\n });\n\n if (countSelectableRealLengthValues > 0) {\n isLengthDisplayed = true;\n }\n }\n\n if (isLengthDisplayed === true) {\n selectLengthIfOnlyOne();\n } \n}\n\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object}
8 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 // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n var attrSize = null;\n var attrLength = null;\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n if($productContainer[0].closest('.container-adproduct') !== null){\n adProcessNonSwatchValues(attr, $productContainer);\n }else{ \n processNonSwatchValues(attr, $productContainer);\n }\n }\n\n if (attr.id === 'size') {\n attrSize = attr;\n }\n if (attr.id === 'length') {\n attrLength = attr;\n }\n });\n\n\n if (attrSize !== null && attrLength !== null) {\n updateLengthVisibilty(attrSize, attrLength, $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 = '<li class=\"message-taille-longueur\"><div>' + response.resources.info_selectforstock + '</div></li>';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '<li><div>' + message + '</div></li>';\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\nfunction updateStressMarketing(response, $productContainer) {\n $productContainer.find('.availability-msg');\n\n if ($productContainer.find('.js-stressmarketing') && $productContainer.find('.js-stressmarketing').length > 0) {\n $productContainer.find('.js-stressmarketing').closest('li').remove();\n }\n \n if (response.product && response.product.stressMarketingMessage && response.product.stressMarketingMessage != \"\") {\n $productContainer.find('.availability-msg').prepend('<li><div class=\"js-stressmarketing\">'+ response.product.stressMarketingMessage +'</div></li>');\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.displayCalloutMessagePDP) {\n html += '<div class=\"callout\" title=\"' + promotion.details + '\">' + promotion.calloutMsg +\n '</div>';\n }\n });\n\n return html;\n}\n\n/* Product Waro traceability update */\nfunction updateWaroData(product) {\n if(product.agec == true){\n if (document.querySelector('.waro-widget') !== null) {\n const waroButton = document.querySelector('.waro-widget');\n const waroButtonAttr = 'data-prop-sku';\n const allLinkAgec = document.querySelectorAll('.link_agec');\n product !== undefined ? waroButton.setAttribute(waroButtonAttr, product.variationGroupID ? product.variationGroupID : product.id) : false;\n allLinkAgec.forEach(function(item) {\n item.classList.contains('waro') ? (item.classList.add('d-block'), item.classList.remove('d-none')) : (item.classList.remove('d-block'), item.classList.add('d-none'));\n })\n }\n }\n}\n\n/* Product Chrystalchain and Winddle traceability update */\nfunction updateChrystalChainWinddle(product) { \n var traceability = null;\n if(product.agec == true){\n if(product.agecType == \"CrystalChain\"){\n traceability = \"chrystalchain\";\n }else if(product.agecType == \"Winddle\" && product.agecUUID !== undefined && product.agecUUID !== null && product.agecUUID !== \"\" && product.agecUUID !== \"null\"){\n traceability = \"winddle\";\n }\n }\n\n if(traceability){\n const allLinkAgec = document.querySelectorAll('.link_agec');
8\n allLinkAgec.forEach(function(item) {\n item.classList.contains(traceability) ? (item.classList.add('d-block'), item.classList.remove('d-none')) : (item.classList.remove('d-block'), item.classList.add('d-none'));\n })\n }\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '<div class=\"attribute-values\">' + attribute.label + ': ' +\n attribute.value + '</div>';\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\nfunction updateSoclozButton(product) {\n if (document.querySelector('button.socloz') !== null) {\n const soclozButton = document.querySelector('button.socloz');\n const soclozColorAttr = 'data-socloz-product-attributes-color';\n const soclozSizeAttr = 'data-socloz-product-attributes-clothes_size';\n product.colorDisplayValue !== undefined ? soclozButton.setAttribute(soclozColorAttr, product.colorDisplayValue) : false;\n product.sizeDisplayValue !== undefined ? soclozButton.setAttribute(soclozSizeAttr, product.sizeDisplayValue) : false;\n product.onStore !== undefined && product.onStore == true ? soclozButton.style.display = \"flex\" : soclozButton.style.display = \"none\";\n }\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarouselQuickview(imgs, secondaryImageUrls, $productContainer, flagsPromo) {\n var carousel = $productContainer.find('.carousel');\n var carouselId = $(carousel).attr('id');\n var carouselSmallImages = $('.carousel-outer', $productContainer).empty();\n for (var i = 0; i < secondaryImageUrls.length; i++) {\n if (i == 0) {\n carouselSmallImages.append('<a class=\"image-indicator active\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + i + '\">' + '<img src=\"' + secondaryImageUrls[i].url + '\" class=\"d-block img-fluid\" alt=\"' + secondaryImageUrls[i].alt + '\" itemprop=\"image\" />' + '</a>');\n } else {\n carouselSmallImages.append('<a class=\"image-indicator\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + i + '\">' + '<img src=\"' + secondaryImageUrls[i].url + '\" class=\"d-block img-fluid\" alt=\"' + secondaryImageUrls[i].alt + '\" itemprop=\"image\" />' + '</a>');\n }\n }\n\n var flagNew = flagsPromo.flagNew ? '<div class=\"newcollection\"><img src=\"' + flagsPromo.flagNew + '\" alt=\"\"/></div>' : '';\n var flagProduct = ''\n\n if (flagsPromo && flagsPromo.tabOfFlags && flagsPromo.tabOfFlags.length > 0) {\n for (var i = 0; i < flagsPromo.tabOfFlags.length;
8 i++) {\n flagProduct = flagProduct + '<div class=\"product\"><img src=\"' + flagsPromo.tabOfFlags[i].flagProduct + '\" alt=\"\"/></div>'\n }\n }\n $(carousel).carousel('dispose');\n $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" data-toggle=\"modal\" data-bs-target=\"#myModal\" role=\"listbox\"><div class=\"flags\">' + flagNew + flagProduct + '</div></div><button class=\"carousel-control-prev ocs-button overflow-inverse has-icon medium\" aria-disabled=\"false\"><a role=\"button\" href=\"#' + carouselId + '\" data-bs-slide=\"prev\"><i class=\"ocs-icon arrow-left-large medium\" aria-hidden=\"true\"></i></a><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></button><button class=\"carousel-control-next ocs-button overflow-inverse has-icon medium\" aria-disabled=\"false\"><a role=\"button\" href=\"#' + carouselId + '\" data-bs-slide=\"next\"><i class=\"ocs-icon arrow-right-large medium\" aria-hidden=\"true\"></i></a><span class=\"sr-only\">' + $(carousel).data('next') + '</span></button>');\n \n\n for (var i = 0; i < imgs.length; i++) {\n $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n $('<li data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n }\n\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, secondaryImageUrls, $productContainer, flagsPromo, brightcoveVideo,pdpCarouselPortraitImageUrls) {\n var $carousel = $productContainer.find('.carousel');\n var carouselId = $carousel.attr('id');\n var carouselSmallImages = $('.carousel-outer', $productContainer);\n var carouselDisImg;\n var adProduct = $productContainer.hasClass('container-adproduct') ? true : false;\n var carWithVideo = !adProduct;\n\n var desktopBurstMobileCurrent = $productContainer[0].classList.contains('desktopBurstMobileCurrent');\n var desktopDevice = window.outerWidth > 768 ? true : false;\n\n if($carousel[0] != null){\n carouselDisImg = $carousel[0].closest('.product-detail');\n $carousel[0].id && $carousel[0].id.indexOf('adsProductCarousel') !== -1 ? false : true;\n }\n\n if (carouselSmallImages.hasClass('slick-initialized')) {\n carouselSmallImages.slick('destroy');\n }\n\n carouselSmallImages.empty();\n var html = '';\n var imgUrl = '';\n var imgAdUrl = '';\n\n var globalIndex = 0;\n var nbOfVideosPositioned = 0;\n for (var i = 0; i < secondaryImageUrls.length; i++) {\n\n if (carouselDisImg) {\n if (carouselDisImg.dataset.disimages && carouselDisImg.dataset.disimages == 'false' ) {\n imgUrl = secondaryImageUrls[i].staticURL\n } else {\n imgUrl = secondaryImageUrls[i].url\n }\n } else {\n imgUrl = secondaryImageUrls[i].url\n }\n\n if (carWithVideo && brightcoveVideo && brightcoveVideo.position == (globalIndex + 1)) {\n\n if (globalIndex == 0) {\n html += '<a class=\"image-indicator active is-video-poster\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + brightcoveVideo.poster + '\" class=\"d-block img-fluid\" alt=\"' + brightcoveVideo.alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1;\" />' + '</a>';\n } else {\n html += '<a class=\"image-indicator is-video-poster\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + brightcoveVideo.poster + '\" class=\"d-block img-fluid\" alt=\"' + brightcoveVideo.alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1;\" />' + '</a>';\n }\n nbOfVideosPositioned = nbOfVideosPositioned + 1;\n globalIndex = globalIndex + 1;\n }\n\n if (globalIndex == 0) {\n html += '<a class=\"image-indicator active\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + imgUrl + '\" class=\"d-block img-fluid\" alt=\"' + secondaryImageUrls[i].alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1.5\" />' + '</a>';\n } else {\n html += '<a class=\"image-indicator\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + imgUrl + '\" class=\"d-block img-fluid\" alt=\"' + secondaryImageUrls[i].alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1.5\" />' + '</a>';\n }\n\n globalIndex = globalIndex + 1;\n }\n\n if (carWithVideo && brightcoveVideo && nbOfVideosPositioned == 0) {\n if (globalIndex == 0) {\n html += '<a class=\"image-indicator active is-video-poster\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + brightcoveVideo.poster + '\" class=\"d-block img-fluid\" alt=\"' + brightcoveVideo.alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1;\" />' + '</a>';\n } else {\n html += '<a class=\"image-indicator is-video-poster\" data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\">' + '<img src=\"' + brightcoveVideo.poster + '\" class=\"d-block img-fluid\" alt=\"' + brightcoveVideo.alt + '\" itemprop=\"image\" width=\"95\" height=\"140\" style=\"object-fit: cover; aspect-ratio: 1/1;\" />' + '</a>';\n }\n }\n carouselSmallImages.append(html);\n \n carouselSmallImages.slick({\n vertical: true,\n slidesToShow: 5,\n slidesToScroll: 1,\n verticalSwiping: true,\n prevArrow: '<button class=\"ocs-button overflow-inverse has-icon medium prev\"><i class=\"ocs-icon arrow-up-large medium\" aria-hidden=\"true\"></i></button>',\n nextArrow: '<button class=\"ocs-button overflow-inverse has-icon medium next\"><i class=\"ocs-icon arrow-down-large medium\" aria-hidden=\"true\"></i></button>',\n infinite: false\n });\n if ($('.image-indicator').length >= 6) {\n $('.product-detail-container .carousel-outer')[0].insertAdjacentHTML(\"beforeend\", '<div class=\"nav-button\"><div class=\"nav-button-container\"></div></div>');\n $('.nav-button-container')[0].insertAdjacentElement(\"afterbegin\", $('.product-detail-container .carousel-outer .ocs-button.next')[0]);\n $('.nav-button-container')[0].insertAdjacentElement(\"afterbegin\", $('.product-detail-container .carousel-outer .ocs-button.prev')[0]);\n }\n\n var flagNew = flagsPromo.flagNew ? '<div class=\"newcollection\"><img src=\"' + flagsPromo.flagNew + '\" alt=\"\"/></div>' : '';\n var flagProduct = '';\n if (flagsPromo && flagsPromo.tabOfFlags && flagsPromo.tabOfFlags.length > 0) {\n for (var i = 0; i < flagsPromo.tabOfFlags.length;
8 i++) {\n flagProduct = flagProduct + '<div class=\"product\"><img src=\"' + flagsPromo.tabOfFlags[i].flagProduct + '\" alt=\"\"/></div>'\n }\n }\n \n \n var controls = $carousel.data('controls') ? '<button class=\"carousel-control-prev ocs-button secondary has-icon medium\" aria-disabled=\"false\"><a role=\"button\" href=\"#' + carouselId + '\" data-bs-slide=\"prev\"><i class=\"ocs-icon arrow-left-large medium\" aria-hidden=\"true\"></i></a><span class=\"sr-only\">' + $carousel.data('prev') + '</span></button><button class=\"carousel-control-next ocs-button secondary has-icon medium\" aria-disabled=\"false\"><a role=\"button\" href=\"#' + carouselId + '\" data-bs-slide=\"next\"><i class=\"ocs-icon arrow-right-large medium\" aria-hidden=\"true\"></i></a><span class=\"sr-only\">' + $carousel.data('next') + '</span></button>' : '';\n \n if (desktopBurstMobileCurrent== true && desktopDevice == true) { /* MIN HEIGHT FOR CLS */\n $('.product-detail .product-detail-container').css(\"min-height\", $('.product-detail-container').height()+\"px\")\n }\n $carousel.carousel('dispose');\n $carousel.empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\" data-toggle=\"modal\" data-bs-target=\"#fullWidthModal\"><div class=\"flags\">' + flagNew + flagProduct + '</div></div>' + controls);\n \n var $carouselIndicators = $carousel.find('.carousel-indicators');\n\n globalIndex = 0;\n nbOfVideosPositioned = 0;\n\n for (var i = 0; i < imgs.length; i++) {\n if (carWithVideo && brightcoveVideo && brightcoveVideo.position == (globalIndex + 1)) {\n $('<div class=\"carousel-item js-isvideo\"><video-js id=\"brightcoveplayer\" data-account=\"'+ brightcoveVideo.accountId +'\" data-player=\"'+ brightcoveVideo.playerId +'\" data-embed=\"default\" controls=\"\" data-video-id=\"'+ brightcoveVideo.videoId +'\" data-playlist-id=\"\" data-application-id=\"\" class=\"vjs-fluid\" playinline ></video-js></div>').appendTo($carousel.find('.carousel-inner'));\n $('<li data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\" class=\"video-indicator\"></li>').appendTo($carouselIndicators);\n globalIndex = globalIndex + 1;\n nbOfVideosPositioned = nbOfVideosPositioned + 1;\n }\n\n // provoque bug OCS-563\n //carouselDisImg ? carouselDisImg.dataset.disimages ? carouselDisImg.dataset.disimages == 'false' ? imgUrl = imgs[i].staticURL : imgUrl = imgs[i].url : false : false;\n imgUrl = imgs[i].url;\n\n if(adProduct){\n imgAdUrl = pdpCarouselPortraitImageUrls[i].url;\n $('<div data-image-large=\"'+ imgUrl +'\" class=\"carousel-item\"><picture><source srcset=\"'+ imgUrl +'\" media=\"(min-width: 959px)\" width=\"1300\" height=\"1300\" /><source srcset=\"'+ imgAdUrl +'\" media=\"(max-width: 959px)\" width=\"400\" height=\"600\"/><img alt=\"' + imgs[i].alt + '\" src=\"'+ imgAdUrl +'\" width=\"400\" height=\"600\"/></picture></div>').appendTo($carousel.find('.carousel-inner'));\n }
8else{\n $('<div data-image-large=\"'+ imgUrl +'\" class=\"carousel-item\"><img src=\"' + imgUrl + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($carousel.find('.carousel-inner'));\n }\n \n $('<li data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\" class=\"\"></li>').appendTo($carouselIndicators);\n\n globalIndex = globalIndex + 1;\n }\n \n if (carWithVideo && brightcoveVideo && nbOfVideosPositioned == 0) {\n $('<div class=\"carousel-item js-isvideo\"><video-js id=\"brightcoveplayer\" data-account=\"'+ brightcoveVideo.accountId +'\" data-player=\"'+ brightcoveVideo.playerId +'\" data-embed=\"default\" controls=\"\" data-video-id=\"'+ brightcoveVideo.videoId +'\" data-playlist-id=\"\" data-application-id=\"\" class=\"vjs-fluid\" playinline ></video-js></div>').appendTo($carousel.find('.carousel-inner'));\n $('<li data-bs-target=\"#' + carouselId + '\" data-bs-slide-to=\"' + globalIndex + '\" class=\"video-indicator\"></li>').appendTo($carouselIndicators);\n }\n\n $carousel.find('.carousel-item').first().addClass('active');\n $carouselIndicators.find('li').first().addClass('active');\n $('<div class=\"overView\"><button class=\"ocs-button has-icon medium overflow-inverse\" data-bs-dismiss=\"modal\" aria-label=\"overView\" aria-disabled=\"false\"><i role=\"button\" class=\"ocs-icon full-screen-on medium\" aria-hidden=\"true\"></i></button></div>').appendTo($carousel.find('.carousel-inner'));\n if (imgs.length === 1) {\n $carouselIndicators.detach();\n $carousel.find('a[class^=\"carousel-control-\"]').detach();\n }\n\n $carousel.carousel();\n $carouselIndicators.attr('aria-hidden', true);\n $carousel.append('<div class=\"modal fade\" id=\"fullWidthModal\"><div class=\"modal-header\"><button type=\"button\" class=\"btn-close close\" data-dismiss=\"modal\"></button></div><div class=\"modal-dialog modal-dialog-centered\"><div class=\"modal-content\"><div class=\"modal-body\"><img src=\"\" class=\"img-fluid\"></div></div></div><div class=\"fullwidth-control fullwidth-prev\" role=\"button\" data-bs-slide=\"prev\"><span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span><span class=\"sr-only\">Previous</span></div><div class=\"fullwidth-control fullwidth-next\" role=\"button\" data-bs-slide=\"next\"><span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span><span class=\"sr-only\">Next</span></div></div>');\n \n if (carWithVideo && brightcoveVideo) {\n $carousel.append('<script src=\"'+ brightcoveVideo.scriptUrl +'\"><\/script>');\n }\n \n $(\".carousel-inner\").swipe({\n swipeLeft: function (event, direction, distance, duration, fingerCount, fingerData) {\n this.closest('.carousel').carousel('next');\n },\n swipeRight: function (event, direction, distance, duration, fingerCount, fingerData) {\n this.closest('.carousel').carousel('prev');\n },\n //Default is 75px, set to 0 for demo so any distance triggers swipe\n threshold: 50\n });\n\n //Add a mutationObserver to observe if element js-isvideo loose class active\n if (carWithVideo && brightcoveVideo && window.videojs != undefined && $('#brightcoveplayer') && $('#brightcoveplayer').length > 0) {\n var mut = new MutationObserver(function(mutations, mut){\n\n mutations.forEach(function(mutation) {\n if(mutation.attributeName == \"class\" && !mutation.target.classList.contains('active')){\n videojs.getPlayer('brightcoveplayer').pause();\n }\n });\n });\n \n mut.observe(document.querySelector(\".js-isvideo\"),{\n 'attributes': true\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}
8 $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 primary images\n var primaryImageUrls = response.product.images.large;\n var secondaryImageUrls = response.product.images.small;\n var pdpCarouselPortraitImageUrls = response.product.images.pdpCarouselPortrait;\n $productContainer.parent('.product-quickview')\n let isQuickview =\n $productContainer.hasClass('product-quickview');\n\n if (isQuickview) {\n createCarouselQuickview(primaryImageUrls, secondaryImageUrls, $productContainer, response.product.flagsPromo);\n } else {\n createCarousel(primaryImageUrls, secondaryImageUrls, $productContainer, response.product.flagsPromo, response.product.brightcoveVideos,pdpCarouselPortraitImageUrls);\n\n }\n\n // update bestshippingMethodName\n if (response && response.bestShippingMethodName) {\n if ($('.js-best-shipping-name').length > 0) {\n $('.js-best-shipping-name').empty().html(response.bestShippingMethodName);\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 // Update promotions\n $('.promotions').empty().html(getPromotionsHtml(response.product.promotions));\n\n updateAvailability(response, $productContainer);\n\n updateStressMarketing(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product,\n $productContainer: $productContainer\n });\n } else {\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,\n $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\nfunction adHandleVariantResponse(response, $productContainer) {\n \n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (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 primary images\n var primaryImageUrls = response.product.images.large;\n var secondaryImageUrls = response.product.images.small;\n var pdpCarouselPortraitImageUrls = response.product.images.pdpCarouselPortrait;\n\n $productContainer.parent('.product-quickview')\n let isQuickview =\n $productContainer.hasClass('product-quickview');\n if (isQuickview) {\n createCarouselQuickview(primaryImageUrls, secondaryImageUrls, $productC
8ontainer, response.product.flagsPromo);\n } else {\n createCarousel(primaryImageUrls, secondaryImageUrls, $productContainer, response.product.flagsPromo, response.product.brightcoveVideos,pdpCarouselPortraitImageUrls);\n }\n\n // Update pricing\n var $priceSelector = $('.prices .price', $productContainer).length ?\n $('.prices .price', $productContainer) :\n $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n \n // Update promotions\n $('.promotions').empty().html(getPromotionsHtml(response.product.promotions));\n\n updateAvailability(response, $productContainer);\n\n updateStressMarketing(response, $productContainer);\n\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product,\n $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n\n}\n\n/**\n * @param {*} htmlPromo - html representant les promos\n */\nfunction updatePromo(htmlPromo) {\n if ($('.op-commercial') && !$('.op-commercial').find(\".soldes\").hasClass('product-set')) {\n $('.op-commercial').empty().html(htmlPromo);\n }\n}\n\n/**\n * @param {*} htmlPromo - html representant le bouton de reservation en boutique\n */\nfunction updateOnStoreStatus(htmlSocloz) {\n if ($('.js-eresa')) {\
8n $('.js-eresa').empty().html(htmlSocloz);\n }\n}\n\nfunction callAPIOneStock(url,product) {\n $.ajax({\n url: url + \"&rct=\" + product.id,\n method: 'get',\n success: function (data) {\n if ($('.js-eresa')) {\n $('.js-eresa').empty().html(data);\n }\n var selectedSizeBtn = $(\"[data-attr=size] .size-attribute .selectable.select\");\n var selectedSizeDropdown = $('.js-select-adproduct-size').val();\n var isOutOfStock = $('.js-eresa .eresa').hasClass('false');\n\n if ((selectedSizeBtn.length || selectedSizeDropdown) && isOutOfStock) {\n $('.js-eresa .eresa').addClass('not-instock');\n }\n\n }\n });\n}\n\nfunction updateStockMag(stockMagPdp){\n $('.ocs-content-layer #woosmapstore').value = \"\";\n if($('.size-attribute.selectable').hasClass('selected')){\n $(\".displayIf-isSizeSelected-false\").addClass('d-none');\n $(\".displayIf-isSizeSelected-true\").removeClass('d-none');\n }\n if(stockMagPdp){\n $('.displayIf-selectedStoreAvailable-true').removeClass('d-none');\n $('.displayIf-selectedStoreAvailable-false').addClass('d-none');\n }else{\n $('.displayIf-selectedStoreAvailable-false').removeClass('d-none');\n $('.displayIf-selectedStoreAvailable-true').addClass('d-none');\n }\n}\n\n/**\n * @param {*} htmlPromo - html representant le bouton de reservation en boutique\n */\nfunction updateProductSet(productID) {\n if ($('.js-pushSet').length > 0) {\n if (productID != null) {\n var urlParams = {\n productID: productID\n };\n var url = appendToUrl($('.js-pushSet').data('url'), urlParams);\n $.ajax({\n url: url,\n method: 'get',\n success: function (htmlProductSet) {\n if ($('.js-pushSet')) {\n $('.js-pushSet').empty().html(htmlProductSet);\n }\n }\n });\n } else {\n $('.js-pushSet').empty();\n }\n }\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 var quantitySelected = false;\n if (!($productContainer.parent('.bonus-product-item').length > 0)) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = '';\n if(quantity.selected){\n selected =' selected ';\n quantitySelected = quantity.value;\n }\n return '<option value=\"' + quantity.value + '\" data-url=\"' + quantity.url + '\"' +\n selected + '>' + quantity.value + '</option>';\n }).join('');\n var quantitySelector = getQuantitySelector($productContainer);\n quantitySelector.empty().html(optionsHtml);\n if(!quantitySelected){\n quantitySelector.closest('.ocs-select').find('input[type=\"text\"]').val(\"1\");\n }
8else{\n quantitySelector.closest('.ocs-select').find('input[type=\"text\"]').val(quantitySelected);\n }\n }\n}\n\n\n/**\n * updates the recommendations CArousel\n * @param {object} data - product requested\n */\nfunction updateRecommendations(data) {\n\n $('.push-product-reco').empty();\n if (!data.recommendations || data.recommendations.length === 0) {\n return;\n }\n\n $('.push-product-reco .ocs-swiper-recommendation').remove();\n var pids = data.recommendations;\n \n $.ajax({\n url: $('.product-detail').data('update-recommendations-url') + \"?pids=\" + pids,\n type: 'get',\n success: function (data) {\n if ($('.push-product-reco .ocs-swiper-recommendation').length == 0) {\n $('.push-product-reco').append(data);\n var swiper = new Swiper('.swiper', {\n observer: true,\n observeParents: true,\n slidesPerView: 2.3,\n spaceBetween: 8,\n breakpoints: {\n 769: {\n slidesPerView: 3.3,\n spaceBetween: 16\n },\n 1320: {\n slidesPerView: 4.3,\n }\n },\n loop: false,\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev',\n },\n /*\n a11y : {\n nextSlideMessage: $('.swiper-button-next')[0].getAttribute('aria-label'),\n prevSlideMessage: $('.swiper-button-prev')[0].getAttribute('aria-label'), \n },\n scrollbar: {\n el: '.swiper-scrollbar',\n },*/\n on: {\n init: function () {\n $(this.el).find('.swiper-wrapper .swiper-slide').css('opacity', '1');\n $(this.el).find('.before-loading').removeClass('before-loading');\n },\n },\n });\n }\n },\n error: function (error) {\n }\n });\n}\n\nfunction gtmRatingProduct(selectedValueUrl) {\n if (selectedValueUrl) {\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\
8n let GTMratingProduct = __webpack_require__(/*! ../gtm/util/actions/ratingProduct */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/ratingProduct.js\");\n GTMratingProduct.getDataLayerForAction({product: data.product});\n },\n error: function () {}\n });\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n * @param {Boolean} canChangeUrl - specify if the script can change page url\n */\nfunction attributeSelect(selectedValueUrl, $productContainer, canChangeUrl) {\n if (selectedValueUrl) {\n $productContainer.spinner().start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\n const productType = data.product.productType;\n productType === \"variationGroup\" ? $productContainer.data('idvariationgroup', data.product.id) : false;\n\n //Only on product Page\n if (canChangeUrl && $('.Product-Show').length > 0 && data.variationGroupUrl) {\n history.replaceState(null, null, data.variationGroupUrl);\n }\n\n $productContainer.data('name', data.product.productName);\n\n if ($('#js-isproductpage-productquantity').length > 0) {\n $('#js-isproductpage-productquantity').val(data.product.selectedQuantity);\n }\n if ($('#js-isproductpage-productid').length > 0) {\n $('#js-isproductpage-productid').val(data.product.id);\n }\n\n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.options, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n updatePromo(data.product.price.htmlOp);\n data.product.enableWaro == true ? updateWaroData(data.product) : updateChrystalChainWinddle(data.product); /* Product traceability update */\n if(data.product.htmlSocloz) {\n updateOnStoreStatus(data.product.htmlSocloz);\n }else if(data.product.isOneStock) {\n callAPIOneStock(selectedValueUrl.replace('Product','OneStock').replace('Variation','CheckOneStock'), data.product);\n }\n\n if ($productContainer.closest('#quickViewModal').length == 0) { /* No update reco when quickview click comes from reco */\n updateRecommendations(data);\n }\n updateSoclozButton(data.product);\n updateStockMag(data.selectedStoreAvailable);\n // comment the updateProductSet because we don't need to get productSet for variants \n // updateProductSet(data.product.id);\n $('body').trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer\n });\n\n if ($productContainer.prevObject[0] && $productContainer.prevObject[0].classList.contains('color-attribute') && ($('[data-attr=\"color\"] a:not(.more-colors):not(.color-attribute-mobile)').length > 1 || $('[data-attr=\"color\"] select option').length > 1)) { \n let GTMColorChanged = __webpack_require__(/*! ../gtm/util/actions/colorChanged */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/colorChanged.js\");\n let valueSizeColorChanged;\n const defaultValueSize = function addDefaultValueSize() {\n let defaultValueSize = '';\n data.product.variationAttributes.forEach( item => {\n if (item.attributeId == 'size') {\n item.values.forEac
8h( value => {\n defaultValueSize == '' && value.selectable ? defaultValueSize = value.url : false;\n })\n } else if (item.attributeId == 'length') {\n item.values.forEach( value => {\n value.selectable ? defaultValueSize += \"&dwvar_\"+data.product.id+\"_length=\"+value.id+\"\" : false;\n })\n } else {\n false\n }\n })\n $.ajax({\n url: defaultValueSize,\n success: function(data) {\n GTMColorChanged.getDataLayerForAction({\n idProductRC: data.product.variationGroupID ? data.product.variationGroupID : data.product.id,\n idProductRCT: data.product.id,\n label: data.product.colorDisplayValue\n });\n }\n })\n }\n data.product.sizeDisplayValue !== \"\" ? valueSizeColorChanged = data.product.id : valueSizeColorChanged = (defaultValueSize(), defaultValueSize);\n if (typeof(valueSizeColorChanged) !== 'function') {\n GTMColorChanged.getDataLayerForAction({\n idProductRC: data.product.variationGroupID ? data.product.variationGroupID : data.product.id,\n idProductRCT: valueSizeColorChanged,\n label: data.product.colorDisplayValue\n });\n }\n }\n \n if ($productContainer.prevObject[0] && ($productContainer.prevObject[0].classList.contains('size-choose') || $productContainer.prevObject[0].classList.contains('length-choose')) && $('button.size-attribute').length > 1) { \n let colorProductLabel = data.product.sizeDisplayValue;\n if ($('.length-choose').length !== 0 && productType !== \"variationGroup\") {\n colorProductLabel = data.product.sizeDisplayValue + \" \" + $('.select.length-choose')[0].innerText;\n }\n \n if (productType !== \"variationGroup\") { // release the event only when all sizes are chosen, ex. with width and height for jeans\n let GTMSizeChanged = __webpack_require__(/*! ../gtm/util/actions/sizeChanged */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/sizeChanged.js\");\n GTMSizeChanged.getDataLayerForAction({\n idProductRC: data.product.variationGroupID ? data.product.variationGroupID : data.product.id,\n idProductRCT: data.product.id,\n label: colorProductLabel\n });\n }\n }\n \n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\nfunction adAttributeSelect(selectedValueUrl, $productContainer, canChangeUrl) {\n if (selectedValueUrl) {\n $productContainer.spinner().start();\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\
8n data.product.productType === \"variationGroup\" ? $productContainer.data('idvariationgroup', data.product.id) : false;\n\n $productContainer.data('name', data.product.productName);\n\n adHandleVariantResponse(data, $productContainer);\n updateOptions(data.product.options, $productContainer);\n updatePromo(data.product.price.htmlOp);\n if (data.product.htmlSocloz) {\n updateOnStoreStatus(data.product.htmlSocloz);\n }\n updateSoclozButton(data.product);\n // comment the updateProductSet because we don't need to get productSet for variants \n //updateProductSet(data.product.id);\n $('body').trigger('product:afterAttributeSelect', {\n data: data,\n container: $productContainer\n });\n \n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\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 = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return {\n body: body,\n footer: footer\n };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').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 = '\x3c!-- Modal --\x3e' +\n '<div class=\"modal fade\" id=\"chooseBonusProductModal\" role=\"dialog\">' +\n '<div class=\"modal-dialog choose-bonus-product-dialog\" ' +\n 'data-total-qty=\"' + data.maxBonusItems + '\"' +\n 'data-UUID=\"' + data.uuid + '\"' +\n 'data-pliUUID=\"' + data.pliUUID + '\"' +\n 'data-addToCartUrl=\"' + data.addToCartUrl + '\"' +\n 'data-pageStart=\"0\"' +\n 'data-pageSize=\"' + data.pageSize + '\"' +\n 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"' +\n 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">' +\n '\x3c!-- Modal content--\x3e' +\n '<div class=\"modal-content\">
8' +\n '<div class=\"modal-header\">' +\n ' <span class=\"\">' + data.labels.selectprods + '</span>' +\n ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">×</button>' +\n '</div>' +\n '<div class=\"modal-body\"></div>' +\n '<div class=\"modal-footer\"></div>' +\n '</div>' +\n '</div>' +\n '</div>';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('#chooseBonusProductModal .modal-body').empty();\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\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\nfunction changeReco(contentJsonReco,url,divreco){\n \n var contentJsonRecoNew = contentJsonReco.toString();\n contentJsonRecoNew = contentJsonRecoNew.replace(/\\\\n/g, \"\\\\n\") \n .replace(/\\\\'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\\\\\"')\n .replace(/\\\\&/g, \"\\\\&\")\n .replace(/\\\\r/g, \"\\\\r\")\n .replace(/\\\\t/g, \"\\\\t\")\n .replace(/\\\\b/g, \"\\\\b\")\n .replace(/\\\\f/g, \"\\\\f\")\n .replace(\"/\",\"\");\n // remove non-printable and other non-valid JSON chars\n contentJsonRecoNew = contentJsonRecoNew.replace(/[\\u0000-\\u0019]+/g,\"\"); \n var contentReco = JSON.stringify(contentJsonRecoNew);\n\n var urlParams = {\n contentReco: contentReco,\n divreco: divreco,\n template: 'layer'\n };\n\n var urlChangeReco = appendToUrl(url, urlParams);\n\n $.ajax({\n url: urlChangeReco,\n method: 'GET',\n dataType: 'html',\n success: function (html) {\n var $recoDiv = $('#'+divreco);\n $recoDiv.html(html);\n },\n error: function (err) {\n \n }\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 */\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}
8\n\nfunction sizeGuideModal() {\n $('.sizeguide-trigger').on('click', function (e) {\n e.preventDefault();\n var sizeChartAsset = $(this).data('sizechartasset');\n var url = $(this).data('sizecharturl');\n\n if (!sizeChartAlreadyLoaded) {\n $.ajax({\n url: url,\n data: { sizeChartAsset: sizeChartAsset },\n success: function (data) {\n if (data && data.sizeChartAsset) {\n $('#sizeModal').find('.modal-body').append(data.sizeChartAsset);\n sizeChartAlreadyLoaded = true;\n }\n }\n });\n }\n $('#sizeModal').modal('show');\n });\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n//all of these functions are use for cart.js and addToCart function\n\n\n\n\n /**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $('body').trigger('pwa:updateCard', data);\n\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.shipping-cost-cart').empty().append(data.totals.totalShippingCost);\n $('.shipping-cost').empty().append(data.totals.totalShippingCost);\n $('.tax-total').empty().append(data.totals.totalTax);\n if ($('#checkout-main').length > 0) {\n $('.grand-total-sum').empty().append(data.totals.grandTotal);\n } else {\n $('.grand-total').empty().append(data.totals.grandTotal);\n }\n let deliveryCost = \"\";\n const deliveryMethod = data.shipments[0].bestShippingMethodDisplayName !== undefined ? data.shipments[0].bestShippingMethodDisplayName : data.shipments[0].selectedShippingMethodDisplayName;\n if (data.shipments[0].bestShippingMethodTotals !== undefined && data.shipments[0].bestShippingMethodTotals.totalShippingCost !== undefined ) {\n deliveryCost = data.shipments[0].bestShippingMethodTotals.totalShippingCost;\n } else {\n data.shipments[0].shippingMethods.forEach(function(deliveryMethodName) {\n if (deliveryMethodName.displayName == deliveryMethod) {\n if (deliveryMethodName.shippingCost == '0,00 â¬') {\n deliveryCost = $('.delivery-value').attr('data-free-delivery');\n } else {\n deliveryCost = deliveryMethodName.shippingCost;\n }\n }\n })\n }\n $('.delivery-text').empty().append(deliveryMethod);\n $('.delivery-value').empty().append(deliveryCost);\n $('.totalPrice').empty().append(data.totals.grandTotal);\n $('.sub-total').empty().append(data.totals.subTotal);\n $('.sub-total').attr('data-subtotal', data.totals.subTotalSimple);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-layer-quantity').empty().append('(' + data.numItems + ')');\n\n $('.bonus-product-line-item').remove();\n if (data.hasBonusProduct) {\n addProductlineItem(data);\n }\n\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $('.order-discount').removeClass('hide-order-discount');\n $('.order-discount-total').empty()\n .append('- ' + data.totals.orderLevelDiscountTotal.formatted);\n } else {\n $('.order-discount').addClass('hide-order-discount');\n }\n\n if (data.totals.shippingLevelDiscountTotal.value > 0) {\n $('.shipping-discount').removeClass('hide-shipping-discount');\n $('.shipping-discount-total').empty().append('- ' +\n data.totals.shippingLevelDiscountTotal.formatted);\n } else {\n $('.shipping-discount').addClass('hide-shipping-discount');\n }\n\n data.items.forEach(function (item) {\n $('.item-' + item.UUID).empty().append(item.renderedPromotions);\n $('.item-total-' + item.UUID).empty().append(item.priceTotal.renderedPrice);\n });\n\n //ABtestEconomy segment : economyProductBasket // economyBasket\n var $cartEconomySelector = $('.js-cart-economy');\n if ($cartEconomySelector.length > 0) {\n if (data.totals.cartEconomy) {\n $cartEconomySelector.replaceWith(data.totals.cartEconomyHtml);\n } else {\n $cartEconomySelector.empty();\n }\n }\n}\n\n/**\n * Updates price of all product lines item\n * @param {Object} items - list of items from the server\n * Info : it's useful only when valopanier said to apply Pricebook when customer update quantity\n */\n function updatePrice(items) {\n for (var i = 0; i < items.length;
8 i++) {\n var priceSelector = '.Price-' + items[i].UUID;\n if (document.querySelector(priceSelector+'.price')) {\n $(priceSelector+' .price').html(items[i].price.sales.formatted);\n }\n else {\n $(priceSelector).replaceWith(items[i].price.html);\n }\n\n //ABtestEconomy segment : economyProductBasket\n var economySelector = '.js-lineitem-economy-' + items[i].UUID;\n if ($(economySelector).length > 0) {\n if (items[i].economy) {\n $(economySelector).replaceWith(items[i].economyHtml);\n } else {\n $(economySelector).empty();\n }\n }\n }\n}\n\n /**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n if (data.valid.error) {\n if (data.valid.message) {\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'error', data.valid.message);\n\n if (data.valid.invalidProducts.length > 0) {\n $('.product-cart-invalid').removeClass('d-flex').addClass('d-none');\n data.valid.invalidProducts.forEach(function(invalidProduct) {\n $('.product-cart-invalid[data-pid=\"' + invalidProduct + '\"]').removeClass('d-none').addClass('d-flex');\n });\n }\n } else {\n $('.cart').empty().append('<div class=\"row\"> ' +\n '<div class=\"col-12 text-center\"> ' +\n '<h1>' + data.resources.emptyCartMsg + '</h1> ' +\n '</div> ' +\n '</div>'\n );\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-layer-quantity').empty().append('(' + data.numItems + ')');\n $('.minicart .popover').empty();\n $('.minicart .popover').removeClass('show');\n }\n\n $('.checkout-btn').addClass('disabled');\n } else {\n $('.checkout-btn').removeClass('disabled');\n $('.product-cart-invalid').removeClass('d-flex').addClass('d-none');\n }\n}\n\nfunction validateExclusionProducts(validExclusionProducts, basket) {\n let productAvailable = true;\n const jsValidExluButton = document.querySelectorAll('.js-valid-exclusion'); /* Mobile and desktop buttons */\n if (validExclusionProducts && validExclusionProducts.valid) {\n $(document).find('.valid-exclusion-product-error').addClass('d-none');\n }\n else {\n $(document).find('.valid-exclusion-product-error').removeClass('d-none');\n }\n\n if (jsValidExluButton.length !== 0) {\n basket.items.forEach(function(product) {\n product.available !== true ? productAvailable = false : false ;\n })\n\n jsValidExluButton.forEach(function(button) { \n productAvailable == true ? (button.classList.remove('disabled'), button.setAttribute('aria-disabled', 'false')) : (button.classList.add('disabled'), button.setAttribute('aria-disabled', 'true')) ;\n })\n }\n}\n///////////////////////////////////////////////////////////////////////////////////////////////////\n\nfunction selectVariantIfOnlyOne () {\n $('div').find(\"[data-attr=size]\").each(function(){\n var $sizeAttrs = $(this).find('.size-attribute');\n if ($sizeAttrs.length == 1 && $sizeAttrs.hasClass('selectable')){\n if (!$sizeAttrs.find('.selectable').hasClass('select')){\n $sizeAttrs.click();\n }\n }\n });\n}\n\nfunction selectLengthIfOnlyOne () {\n $('div').find(\"[data-attr=length]\").each(function(){\n var $sizeAttrs = $(this).find('.size-attribute');\n if ($sizeAttrs.length == 1 && $sizeAttrs.hasClass('selectable')){\n if (!$sizeAttrs.find('.selectable').hasClass('select')){\n $sizeAttrs.click();\n }\n }\n });\n}\n\n/* Update fidelity points in DOM */\nfunction updateFidelityPoints(data) {\
8n document.querySelector('.pointsEarned .points') !== null && data.basketPointNumber !== null ? document.querySelector('.pointsEarned .points').innerText = data.basketPointNumber : false;\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\n chooseBonusProducts(data);\n },\n updateCartTotals: function(data) {\n updateCartTotals(data);\n },\n validateBasket: function(data) {\n validateBasket(data);\n },\n validateExclusionProducts: function(validExclusionProducts, basket) {\n validateExclusionProducts(validExclusionProducts, basket);\n },\n updatePrice: function(items) {\n updatePrice(items);\n },\n selectVariantIfOnlyOne: function() {\n selectVariantIfOnlyOne();\n },\n selectLengthIfOnlyOne: function() {\n selectLengthIfOnlyOne();\n },\n colorSelectedFirstPos: function() {\n colorSelectedFirstPos();\n },\n updateFidelityPoints: function(data) {\n updateFidelityPoints(data);\n } \n },\n ratingAttribute: function () {\n $(document).on('click', '.bzv-global-rating, #js-zone-reviews button, #js-zone-qa button', function (e) {\n e.preventDefault();\n var gtmRatingProductUrl = lastUrl == \"\" ? $('[data-attr=\"size\"] .select').length !== 0 ? $('[data-attr=\"size\"] .select').attr('value') : atob($('[data-attr=\"color\"] .selected').closest('a').attr('data-url')) : lastUrl;\n\n if ($('.container-adproduct').length == 0){\n gtmRatingProduct(gtmRatingProductUrl, true);\n }\n })\n },\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] a:not(.more-colors):not(.color-attribute-mobile)', function (e) {\n e.preventDefault();\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');
8\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n \n var decodeUrl = atob($(this).attr('data-url'));\n lastUrl = decodeUrl;\n if($(this).closest('.container-adproduct').length !== 0){\n $productContainer = $(this).closest('.container-adproduct');\n adAttributeSelect(decodeUrl, $productContainer, true);\n }else{\n attributeSelect(decodeUrl, $productContainer, true);\n }\n });\n\n /* --------------------- AB OCS-1136 --------------------- */\n $(document).on('change', '[data-attr=\"color\"] select', function(e) {\n e.preventDefault();\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n \n var decodeUrl = atob($(this).children('option:selected').attr('data-url'));\n lastUrl = decodeUrl;\n if($(this).closest('.container-adproduct').length !== 0){\n false;\n }
8else{\n attributeSelect(decodeUrl, $productContainer, true);\n }\n })\n /* --------------------- AB OCS-1136 --------------------- */\n\n },\n selectAttribute: function () {\n /*\n ** Le on('click') n'est pas directement sur le span mais sur le bouton car non supporté par\n ** mozilla sur macOs\n */\n\n $(document).off('click', 'button.size-attribute.selectable').on('click', 'button.size-attribute.selectable', function (e) {\n e.preventDefault();\n var $span = $(this).find(\"span\");\n var $productContainer = $span.closest('.set-item');\n lastUrl = $span.attr('value');\n\n if (!$productContainer.length) {\n $productContainer = $span.closest('.product-detail');\n }\n\n attributeSelect($span.attr('value'), $productContainer);\n \n });\n\n /* --------------------- AB OCS-1136 --------------------- */\n $(document).on('change', '[data-attr=\"size\"] select, [data-attr=\"length\"] select', function() {\n var $productContainer = $(this).children('option:selected').closest('.set-item');
8\n if (!$productContainer.length) {\n $productContainer = $(this).children('option:selected').closest('.product-detail');\n }\n attributeSelect($(this).children('option:selected').attr('value'), $productContainer);\n });\n $(document).ready(function() {\n if (document.querySelector('[data-attr=size] select') !== null && document.querySelectorAll('[data-attr=size] select option:not(:disabled)').length == 1) {\n const changeEvent = new Event('change', { bubbles: true });\n document.querySelector('[data-attr=size] select').dispatchEvent(changeEvent);\n }\n if (document.querySelector('[data-attr=length] select') !== null && document.querySelectorAll('[data-attr=length] select option:not(:disabled)').length == 1) {\n const changeEvent = new Event('change', { bubbles: true });\n document.querySelector('[data-attr=length] select').dispatchEvent(changeEvent);\n }\n })\n /* --------------------- AB OCS-1136 --------------------- */\n\n /*---Google Shopping---*/\n if($('.container-adproduct').length){\n $(document).off('change', '.js-select-adproduct').on('change', '.js-select-adproduct', function (e) {\n e.preventDefault();\n var $option = $(this).find(':selected');\n var $productContainer = $option.closest('.container-adproduct');\n adAttributeSelect($option.attr('data-url'), $productContainer);\n });\n }\n\n },\n\n selectAttributeIndicator: function () {\n $(document).on('click', '.image-indicator', function (e) {\n e.preventDefault();\n\n $('.image-indicator').removeClass('active');\n\n $(this).addClass('active');\n });\n },\n\n selectAttributeSliderIndicator: function () {\n $(document).on('click', '.carousel-indicators li', function (e) {\n e.preventDefault();\n\n $('.image-indicator').removeClass('active');\n $('a[data-bs-slide-to=\"' + $(this).attr('data-bs-slide-to') + '\"]').addClass('active');\n });\n },\n\n productSetSelectProducts: function () {\n $(document).on('change', '.set-items :checkbox', function () {\n let totalPriceSet = 0;\n let totalBaseSet = 0\n let nbChecked = 0;\n let $priceProductSet = $('.product-set-detail .prices.total .ocs-price');\n let dataPriceAll = false;\n $('.set-item').each(function () {\n if ($(this).find(':checkbox').is(':checked')) {\n nbChecked++;\n let $price = $(this).find('.prices .ocs-price span')[0].innerText;\n totalPriceSet = totalPriceSet + parseFloat($price);\n if ($(this).find('.prices .ocs-price span')[1] !== undefined) {\n totalBaseSet = totalBaseSet + parseFloat($(this).find('.prices .ocs-price span')[1].innerText);\n } else {\n totalBaseSet = totalBaseSet + parseFloat($(this).find('.prices .ocs-price span')[0].innerText);\n }\n }\n });\n\n let totalPriceSetStr = totalPriceSet.toFixed(2) + \"â¬\";\n\n if ($($priceProductSet[0]).attr('data-priceall')) {\n dataPriceAll = true;\n if ($($priceProductSet[0]).data('priceall') == totalPriceSetStr) {\n $priceProductSet[0].children[0].innerText = $($priceProductSet[0]).data('priceset');\n } else {\n $priceProductSet[0].children[0].innerText = totalPriceSetStr;\n }\n } else {\n $priceProductSet[0].children[0].innerText = totalPriceSetStr;\n }\n\n if ($priceProductSet[0].children[1] !== undefined) {\n $priceProductSet[0].children[1].innerText = totalBaseSet.toFixed(2) + \"â¬\";\n \n if (totalBaseSet == 0 || totalBaseSet == totalPriceSet) {\n $priceProductSet[0].children[1].style.display = \"none\";\n $($priceProductSet[0].children[0]).removeClass('discount-price');\n $($priceProductSet[0].children[0]).addClass('price');\n } else {\n $($priceProductSet[0].children[0]).addClass('discount-price');\n $($priceProductSet[0].children[0]).removeClass('price');\n $priceProductSet[0].children[1].style.display = \"block\";\n }\n }\n\n if ($('.set-item').length == nbChecked && dataPriceAll == true) {\n $priceProductSet[0].children[0].innerText = $($priceProductSet[0]).data('priceset');\n $priceProductSet[0].children[1].innerText = $($priceProductSet[0]).data('priceall');\n $($priceProductSet[0].children[0]).addClass('discount-price');\n $($priceProductSet[0].children[0]).removeClass('price');\n $priceProductSet[0].children[1].style.display = \"block\";\n }\n \n if ($('.set-item').length == nbChecked) {\n $('.not-all-items-selected').addClass('d-none');\n $('.all-items-selected').removeClass('d-none');\n } else {\n $('.not-all-items-selected').removeClass('d-none');\n $('.all-items-selected').addClass('d-none');\n }\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();
8\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).off('click', 'button.add-to-cart, button.add-to-cart-global').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 var pidVariant;\n var isOk = true;\n var setPidsVariant = [];\n var isProductSet = false;\n var $productErrors = [];\n\n pidVariant = $(this).closest('.product-detail').data('idvariationgroup');\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n isProductSet = true;\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail') && $(this).find(':checkbox').is(':checked')) {\n setPids.push({\n pid: $(this).data('pid').toString(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n if ($(this).data('idvariationgroup') == $(this).data('pid')) {\n isOk = false;\n $productErrors.push($(this));\n }\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');
8\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var dataPageOrigin =$(this).parents('.js-data-page').data('page');\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this)),\n addToCartOrigin: dataPageOrigin\n };\n \n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n if (!isProductSet) {\n if (pid == pidVariant) {\n isOk = false;\n $productErrors.push($(this).closest('.product-detail'));\n }\n } else {\n if (setPids.length == 0) {\n isOk = false;\n $productErrors.push($(this).closest('.product-detail'));\n }\n }\n \n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl && isOk) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\
8n addToCartSuccess.ajaxAddToCart(data,dataPageOrigin);\n updateFidelityPoints(data);\n $('.coupons-and-promos').empty().append(data.cart.totals.discountsHtmlDS);\n $('.basketvalueDiscounts').children().length !== 0 ?($('.coupons-and-promos').addClass('d-block'),$('.coupons-and-promos').removeClass('d-none')) : ($('.coupons-and-promos').addClass('d-none'), $('.coupons-and-promos').removeClass('d-block'));\n if(!($('.fitle-placeholder').is(':empty'))) {\n ftltag('event', 'cart', {\n product_id: data.product.variationGroupID,\n size: data.product.sizeDisplayValue\n });\n }\n },\n error: function () {\n if (isProductSet && $productErrors.length > 0) {\n $('html, body').scrollTop({ scrollTop: $productErrors[0].offset().top - 80 }, 'slow');\n }\n $.spinner().stop();\n }\n });\n } else {\n var msg;\n if (isProductSet && setPids.length == 0) {\n msg = $($('.error-select-none-msg')[0]).text();\n } else {\n msg = $($('.error-select-size-msg')[0]).text();\n }\n $('.availability-msg').text(\"\").removeClass(\"error-select-size\");\n $productErrors.forEach(function ($productError) {\n $productError.find('.availability-msg').text(msg).addClass(\"error-select-size\");\n })\n if ($productErrors.length > 0) {\n $('html, body').animate({ scrollTop: $($productErrors[0]).find('*[data-attr=\"size\"]').offset().top - 80 }, 'slow');\n }\n $.spinner().stop();\n }\n });\n\n $(document).off('click','button.js-add-to-cart-ads').on('click','button.js-add-to-cart-ads',function(){\n var addToCartUrl;\n var pid;\n var pidsObj;\n var pidVariant;\n var isOk = true;\n var isProductSet = false;\n var $productErrors = [];\n\n pidVariant = $(this).closest('.container-adproduct').data('idvariationgroup');\n\n $('body').trigger('product:beforeAddToCart', this);\n\n pid = getPidValue($(this));\n\n addToCartUrl = getAddToCartUrl();\n\n var dataPageOrigin =$(this).parents('.js-data-page').data('page');\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: 1,\n addToCartOrigin: dataPageOrigin\n };\n\n if (!isProductSet) {\n if (pid == pidVariant) {\n isOk = false;\n $productErrors.push($(this).closest('.container-adproduct'));\n\n }\n } \n \n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl && isOk) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\
8n addToCartSuccess.ajaxAddToCart(data,dataPageOrigin);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n } else {\n var msg = $($('.error-select-size-msg')[0]).text();\n $('.availability-msg').text(\"\").removeClass(\"error-select-size\");\n $productErrors.forEach(function ($productError) {\n $productError.find('.availability-msg').text(msg).addClass(\"error-select-size\");\n })\n \n if ($productErrors.length > 0) {\n $('html, body').animate({ scrollTop: $($productErrors[0]).find('*[data-attr=\"size\"]').offset().top - 80 }, 'slow');\n }\n $.spinner().stop();\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 '<div class=\"selected-pid row\" ' +\n 'data-pid=\"' + pid + '\"' +\n 'data-qty=\"' + submittedQty + '\"' +\n 'data-optionID=\"' + (optionID || '') + '\"' +\n 'data-option-selected-value=\"' + (valueId || '') + '\"' +\n '>' +\n '<div class=\"col-sm-11 col-9 bonus-product-name\" >' +\n $choiceOfBonusProduct.find('.product-name').html() +\n '</div>' +\n '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>' +\n '</div>';\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\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) {\
8n $.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-xxl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '<div class=\"add-to-cart-messages\"></div>'\n );\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.minicart-layer-quantity').html(data.totalQty);\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'success', data.msgSuccess);\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 getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n sizeGuideModal : sizeGuideModal,\n initFunction: $(function() {\n if($('.product-detail .before-loading').length && $('.active-loader').length){\n $('.product-detail .before-loading').removeClass('before-loading');\n $('.before-loading_icon').removeClass('before-loading_icon');\n $('.before-loading_fixHeight').removeClass('before-loading_fixHeight');\n } \n \n\n if($('.search-results .before-loading').length && $('.active-loader').length){\n $('.search-results .before-loading').removeClass('before-loading');\n $('.before-loading_icon').removeClass('before-loading_icon');\n $('.refinements-container').removeClass('d-none');\n }\n \n })\n};\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/base.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/quickView.js":function(module,exports,__webpack_require__){"use strict";eval("\nvar base = __webpack_require__(/*! ./base */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/base.js\");\n\n/**\n * Generates the modal window on the first call.\n *\n */\nfunction getModalHtmlElement() {\n if ($('#quickViewModal').length !== 0) {\n $('#quickViewModal').remove();\n }\n var htmlString = '\x3c!-- Modal --\x3e'\n + '<div class=\"modal fade right\" id=\"quickViewModal\" role=\"dialog\">'\n + '<div class=\"modal-dialog quick-view-dialog\">'\n + '\x3c!-- Modal content--\x3e'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-body\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n}\n\n/**\n * @typedef {Object} QuickViewHtml\n * @property {string} body - Main Quick View body\n * @property {string} footer - Quick View footer content\n */\n\n/**\n * Parse HTML code in Ajax response\n *\n * @param {string} html - Rendered HTML from quickview template\n * @return {QuickViewHtml} - QuickView content components\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.product-quickview');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * replaces the content in the modal window on for the selected product variation.\n * @param {string} selectedValueUrl - url to be used to retrieve a new product model\n */\nfunction fillModalElement(selectedValueUrl) {\n $('#quickViewModal .modal-body').spinner().start();\n var checkCart = $('.Cart-Show').length ? true : false;\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n data: {checkCart:checkCart}
8,\n success: function (data) {\n let GTMquickview = __webpack_require__(/*! ../gtm/util/layers/quickview */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickview.js\");\n \n if($('.Cart-Show').length > 0) {\n GTMquickview = __webpack_require__(/*! ../gtm/util/layers/quickViewCart */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/layers/quickViewCart.js\");\n }\n ///////////////////////////////////////////////\n var parsedHtml = parseHtml(data);\n var productUrl = $(parsedHtml.body).data('url');\n var quickViewFullDetailMsg = $(parsedHtml.body).data('quickViewFullDetailMsg');\n var category = $(parsedHtml.body).data('category');\n var subCategory = $(parsedHtml.body).data('subCategory');\n var subSubCategory = $(parsedHtml.body).data('subSubCategory');\n\n GTMquickview.getDataLayerForLayer({\n product: $(parsedHtml.body).find('#obj-product').data('product'),\n category: category,\n subCategory: subCategory,\n subSubCategory: subSubCategory,\n });\n\n $('#quickViewModal .modal-body').empty();\n $('#quickViewModal .modal-body').html(parsedHtml.body);\n $('#quickViewModal .modal-footer').html(parsedHtml.footer);\n $('#quickViewModal .full-pdp-link').text(quickViewFullDetailMsg);\n $('#quickViewModal .full-pdp-link').attr('href', productUrl);\n $('#quickViewModal .product-link').attr('href', productUrl);\n $('#quickViewModal .size-chart').attr('href', productUrl);\n fillAvailabilitySlot();\n $('#quickViewModal').modal('show');\n $('.primary-images .carousel.slide.pointer-event .carousel-indicators li:first-child').click();\n $.spinner().stop();\n base.methods.selectVariantIfOnlyOne();\n base.methods.selectLengthIfOnlyOne();\n },\n error: function (err) {\n console.log(err);\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Génère un appel AJAX pour remplir la section slot availibily\n */\nfunction fillAvailabilitySlot() {\n if ($('.js-pdp-availability').length > 0) {\n var url = $('.js-pdp-availability').data('url');\n $.ajax({\n url: url,\n method: 'get',\n success: function (htmlProductSet) {\n if ($('.js-pdp-availability')) {\n $('.js-pdp-availability').empty().html(htmlProductSet);\n }\n }\n });\n }\n}\n\nmodule.exports = {\n showQuickview: function () {\n $('body').on('click', '.quickview', function (e) {\n e.preventDefault();\n\n var selectedValueUrl = $(this).closest('.quickview').data('url');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n fillModalElement(selectedValueUrl);\n });\n },\n\n //exitRateBasket\n showQuickviewTitleImg: function () {\n $('body').on('click', '.exitRateBasket span.clickproduct, .product-set-quickview', function (e) {\n e.preventDefault();\n var selectedValueUrl = $(this).data('quickview-link');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n fillModalElement(selectedValueUrl);\n });\n },\n\n showQuickviewExitRateBasket: function () {\n $('body').on('click', '.exitRateBasket .pdp-title-link', function (e) {\n e.preventDefault();\n\n var selectedValueUrl = $(this).closest('a.pdp-title-link').attr('data-quickview-link');\n $(e.target).trigger('quickview:show');\n getModalHtmlElement();\n fillModalElement(selectedValueUrl);\n });\n },\n\n\n closeQuickview: function() {\n $(document).on('hidden.bs.modal', '#quickViewModal', function() {\
8n // let GTMquickview = require('../gtm/util/layers/quickview');\n // GTMquickview.removeDataLayer();\n let GTMcloseLayer = __webpack_require__(/*! ../gtm/util/actions/closeLayer */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/gtm/util/actions/closeLayer.js\");\n GTMcloseLayer.getDataLayerForAction();\n });\n },\n changeImageNext: function (){\n $(document).on('click','.carousel-control-next', function() {\n $(this).closest(\".carousel\").carousel('next');\n\t\t});\n },\n changeImagePrev: function (){\n $(document).on('click','.carousel-control-prev', function() {\n $(this).closest(\".carousel\").carousel('prev');\n\t\t});\n },\n ratingAttribute: base.ratingAttribute,\n colorAttribute: base.colorAttribute,\n selectAttribute: base.selectAttribute,\n removeBonusProduct: base.removeBonusProduct,\n selectBonusProduct: base.selectBonusProduct,\n enableBonusProductSelection: base.enableBonusProductSelection,\n showMoreBonusProducts: base.showMoreBonusProducts,\n addBonusProductsToCart: base.addBonusProductsToCart,\n availability: base.availability,\n addToCart: base.addToCart,\n popImage: base.popImage,\n attributeSelect: base.attributeSelect,\n showSpinner: function () {\n $('body').on('product:beforeAddToCart', function (e, data) {\n $(data).closest('.modal-content').spinner().start();\n });\n },\n hideDialog: function () {\n $('body').on('product:afterAddToCart', function () {\n $('#quickViewModal').modal('hide');\n });\n },\n beforeUpdateAttribute: function () {\n $('body').on('product:beforeAttributeSelect', function () {\n $('.modal.show .modal-content').spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.modal.show .product-quickview>.bundle-items').length) {\n $('.modal.show').find(response.container).data('pid', response.data.product.id);\n $('.modal.show').find(response.container)\n .find('.product-id').text(response.data.product.id);\n } else if ($('.set-items').length) {\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('#quickViewModal .product-quickview').data('pid', response.data.product.id);\n $('#quickViewModal .full-pdp-link')\n .attr('href', response.data.product.selectedProductUrl);\n }\n $('#quickViewModal .modal-content').spinner().stop();\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n $('.availability-msg').removeClass('error-select-size');\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 // update global add to cart (single products, bundles)\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n // $('.add-to-cart-global', dialog).attr('disabled',\n // !$('.global-availability', dialog).data('ready-to-order')\n // || !$('.global-availability', dialog).data('available')\n // );\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n // bundle individual products\n $('.product-availability', response.$productContainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);
8\n\n\n var dialog = $(response.$productContainer)\n .closest('.quick-view-dialog');\n\n if ($('.product-availability', dialog).length) {\n // bundle all products\n var allAvailable = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability', dialog).toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability', dialog)\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg', dialog).empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n } else {\n // single product\n $('.global-availability', dialog)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available)\n .find('.availability-msg')\n .empty()\n .html(response.message);\n }\n });\n },\n removeClassCarousel: function () {\n $('.modal-content').addClass('red');\n },\n opensocloz: function () {\n $(document).on('click', '.socloz', function (e) {\n $('#quickViewModal').modal('hide');\n });\n }\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/quickView.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/wishlistHeart.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar displayNotification = __webpack_require__(/*! ../ds/displayNotification */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/ds/displayNotification.js\");\n\n/**\n * appends params to a url\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} icon - icon that was clicked to add a product to the wishlist\n */\nfunction displayMessageAndChangeIcon(data, icon) {\n $.spinner().stop();\n var status;\n if (data.success) {\n status = 'success';\n if (icon.hasClass('fa-heart-o')) {\n icon.removeClass('fa-heart-o').addClass('fa-heart');\n }\n } else {\n status = 'error';\n }\n\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), status, data.msg);\n \n $.spinner().stop();\n}\n\nmodule.exports = {\n addToWishlist: function () {\n $('body').on('click', '.wishlistTile', function (e) {\n e.preventDefault();\n var icon = $(this).find($('i'));\n var url = $(this).attr('href');\n var pid = $(this).closest('.product').data('pid');\n var optionId = $(this).closest('.product-detail').find('.product-option').attr('data-option-id');\n var optionVal = $(this).closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\n optionId = optionId || null;\n optionVal = optionVal || null;\n if (!url || !pid) {\n return;\n }\n\n $.spinner().start();\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n }
8,\n success: function (data) {\n displayMessageAndChangeIcon(data, icon);\n },\n error: function (err) {\n displayMessageAndChangeIcon(err, icon);\n }\n });\n });\n }\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/wishlistHeart.js?")},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/productTile.js":function(module,exports,__webpack_require__){"use strict";eval('\n\nvar processInclude = __webpack_require__(/*! ./util */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js");\n\n$(document).ready(function () {\n processInclude(__webpack_require__(/*! ./product/quickView */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/quickView.js"));\n processInclude(__webpack_require__(/*! ./product/wishlistHeart */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/product/wishlistHeart.js"));\n});\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/productTile.js?')},
8"./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js?")}}); 9var __fstrzSep=""; 10/*! https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2Fhome.js */ 11!function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={i:moduleId,l:!1,exports:{}};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.l=!0,module.exports}__webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.d=function(exports,name,getter){__webpack_require__.o(exports,name)||Object.defineProperty(exports,name,{enumerable:!0,get:getter})},__webpack_require__.r=function(exports){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},__webpack_require__.t=function(value,mode){if(1&mode&&(value=__webpack_require__(value)),8&mode)return value;if(4&mode&&"object"==typeof value&&value&&value.__esModule)return value;var ns=Object.create(null);if(__webpack_require__.r(ns),Object.defineProperty(ns,"default",{enumerable:!0,value:value}),2&mode&&"string"!=typeof value)for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns},__webpack_require__.n=function(module){var getter=module&&module.__esModule?function(){return module.default}:function(){return module};return __webpack_require__.d(getter,"a",getter),getter},__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s="./cartridges/app_coremodel_storefront/cartridge/client/default/js/home.js")}({
11"./cartridges/app_coremodel_storefront/cartridge/client/default/js/home.js":function(module,exports,__webpack_require__){"use strict";eval('\n\nvar processInclude = __webpack_require__(/*! ./util */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js");\n\n$(document).ready(function () {\n processInclude(__webpack_require__(/*! ./home/home */ "./cartridges/app_coremodel_storefront/cartridge/client/default/js/home/home.js"));\n});\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/home.js?')},
11"./cartridges/app_coremodel_storefront/cartridge/client/default/js/home/home.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = {\n showResetPasswordModal: function () {\n if ($('#js-showresetModalPassword').length > 0){\n $(\"#requestPasswordResetModal\").modal('show');\n }\n }\n};\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/home/home.js?")},
11"./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/util.js?")}}); 12var __fstrzSep=""; 13/*! https%3A%2F%2Fwww.b-z-b.com%2Fon%2Fdemandware.static%2FSites-Bizzbee-SFRA-Site%2F-%2Ffr_FR%2Fv1790857808157%2Fjs%2FuiShow.js */ 14!function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={i:moduleId,l:!1,exports:{}};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.l=!0,module.exports}__webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.d=function(exports,name,getter){__webpack_require__.o(exports,name)||Object.defineProperty(exports,name,{enumerable:!0,get:getter})},__webpack_require__.r=function(exports){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},__webpack_require__.t=function(value,mode){if(1&mode&&(value=__webpack_require__(value)),8&mode)return value;if(4&mode&&"object"==typeof value&&value&&value.__esModule)return value;var ns=Object.create(null);if(__webpack_require__.r(ns),Object.defineProperty(ns,"default",{enumerable:!0,value:value}),2&mode&&"string"!=typeof value)for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns},__webpack_require__.n=function(module){var getter=module&&module.__esModule?function(){return module.default}:function(){return module};return __webpack_require__.d(getter,"a",getter),getter},__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s="./cartridges/app_coremodel_storefront/cartridge/client/default/js/uiShow.js")}({
14"./cartridges/app_coremodel_storefront/cartridge/client/default/js/components/formValidation.js":function(module,exports,__webpack_require__){"use strict";eval("\n\n/**\n * Remove all validation. Should be called every time before revalidating form\n * @param {element} form - Form to be cleared\n * @returns {void}\n */\nfunction clearFormErrors(form) {\n $(form).find('.form-control.is-invalid').removeClass('is-invalid');\n}\n\nmodule.exports = function (formElement, data) {\n // clear form validation first\n clearFormErrors(formElement);\n $('.alert', formElement).remove();\n\n if (typeof data === 'object' && data.fields) {\n Object.keys(data.fields).forEach(function (key) {\n if (data.fields[key]) {\n var feedbackElement = $(formElement).find('[name=\"' + key + '\"]');\n var reactOcs = feedbackElement.closest('.ocs-form').length !== 0 ? true : false;\n !reactOcs ? feedbackElement = feedbackElement.parent().children('.invalid-feedback') : feedbackElement = feedbackElement[0]; \n\n if (reactOcs) {\n const errorContainer = '<div class=\"hint\" role=\"alert\"><p class=\"invalid-text\"><i class=\"ocs-icon danger alert-negative-default medium\" aria-hidden=\"true\"></i>'+data.fields[key]+'</p></div>';\n const containerFeddback = feedbackElement.closest('.ocs-input');\n const hint = containerFeddback.querySelectorAll('.hint');\n if (hint !== null) {\n hint.forEach(function(ht) {\n ht.getAttribute('role') !== null ? ht.remove() : false;\n })\n }\n containerFeddback.classList.remove('valid');\n containerFeddback.classList.add('dirty', 'invalid');\n containerFeddback.insertAdjacentHTML(\"beforeend\", errorContainer);\n } else {\n if (feedbackElement.length > 0) {\n if (Array.isArray(data[key])) {\n feedbackElement.html(data.fields[key].join('<br/>'));\n } else {\n feedbackElement.html(data.fields[key]);\n }\n feedbackElement.siblings('.form-control').removeClass('valid');\n feedbackElement.siblings('.form-control').addClass('is-invalid');\n }\n }\n }\n });\n }\n if (data && data.error) {\n if (data.errorMessage) {\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'error', data.errorMessage);\n } else {\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'error', data.error);\n }\n }\n\n if (data && data.success && data.msg) {\n displayNotification(document.querySelector('.ocs-notification[role=alert]'), 'success', data.msg);\n }\n};\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/components/formValidation.js?")},
14"./cartridges/app_coremodel_storefront/cartridge/client/default/js/uiShow.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar formValidation = __webpack_require__(/*! ./components/formValidation */ \"./cartridges/app_coremodel_storefront/cartridge/client/default/js/components/formValidation.js\");\n\nasync function checkOcsComponentsValidity(field) {\n field.setCustomValidity('');\n if (!field.validity.valid) {\n checkOcsSpecificField(field, true)\n return false;\n }\n return true;\n }\n\nasync function checkOcsComponentsValidityForm(ocsForm) {\n const formElements = ocsForm.elements;\n let resultValidity = true;\n\n for (const field of formElements) {\n if (!await checkOcsComponentsValidity(field)) {\n resultValidity = false;\n }\n }\n\n return resultValidity;\n}\n\n$(document).ready(function() {\n let ocsForm;\n $('form.ocs-form').length !== 0 ? ocsForm = $('form.ocs-form')[0] : false ;\n $('form.ocs-form-core').length !== 0 ? ocsForm = $('form.ocs-form-core')[0] : false ;\n if (ocsForm.length) {\n let ocsFormSubmit;\n ocsForm.querySelector('.ocs-button[type=submit]') !== null ? ocsFormSubmit = ocsForm.querySelector('.ocs-button[type=submit]') : ocsFormSubmit = ocsForm.querySelector('.ocs-core-button[type=submit]');\n \n $(ocsFormSubmit).on('click', async function(event) {\n event.preventDefault(); // Prevent the default form submission\n if (await checkOcsComponentsValidityForm(ocsForm)) {\n $(ocsForm).submit();\n }\n });\n }\n});\n\n$('.input-text.date').each(function (e) {\n $(this).focus(function () {\n $(this).attr('placeholder', 'JJ/MM/YYY');\n }).blur(function () {\n $(this).attr('placeholder', ' ');\n });\n});\n\n$(\".show_hide_password a\").on('click keyup', function (event) {\n event.preventDefault();\n if (event.type === 'click' || (event.type === 'keyup' && event.key === \"Enter\")) {\n if ($('.show_hide_password input').attr(\"type\") == \"text\") {\n $('.show_hide_password input').attr('type', 'password');\n $('.show_hide_password i').addClass(\"fa-eye\");\n $('.show_hide_password i').removeClass(\"fa-eye-slash\");\n } else if ($('.show_hide_password input').attr(\"type\") == \"password\") {\n $('.show_hide_password input').attr('type', 'text');\n $('.show_hide_password i').removeClass(\"fa-eye\");\n $('.show_hide_password i').addClass(\"fa-eye-slash\");\n }\n }\n});\n\n/// Valid or not input\n$.fn.hasAttr = function (name) {\n return this.attr(name) !== undefined;\n};\n\n$('.input-text.date').blur(function () {\n if ($(this).is(\":valid\")) {\n var max = new Date($(this).attr('max'));\n if (max) {\n var date = $(this).val();\n var dateSplit = date.split(\"/\");\n if (dateSplit.length === 3 &&\n dateSplit[0] && dateSplit[1] && dateSplit[2]) {\n var val = new Date(dateSplit[2], dateSplit[1] - 1, dateSplit[0]);\n if (val < max) {\n $(this).addClass('valid');\n $(this).removeClass('is-invalid');\n } else {\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n var validationMessage = $(this).data('bad-input');\n $(this).parents('.form-group').find('.invalid-feedback')\n .text(validationMessage);\n }\n } else {\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n var validationMessage = $(this).data('bad-input');\n $(this).parents('.form-group').find('.invalid-feedback')\n .text(validationMessage);\n }\n }\n }\n});\n\n$(\"body\").on('blur', 'input, textarea, select', function (e) {\n \n if ($(this).attr('id') != 'registration-form-password-confirm') {\n if ($(this).hasAttr('required') || $(this).val().length) {\n if ($(this).hasClass('min-today')) {\n \n var stringDate = $(this).val();\n var sliceDate = stringDate.split('/');\n var date = new Date(sliceDate[2], sliceDate[1] - 1, sliceDate[0]);\n var today = new Date();\n var onlyDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n var onlyTodayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n\n if (!$(this).val().length || onlyDate < onlyTodayDate) {\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n $(this).trigger('invalid');\n if ($(this).val().length) {\n $(this).parents('.form-group').find('.invali
14d-feedback').text($(this).data('error-date'));\n }\n } else {\n $(this).addClass('valid');\n $(this).removeClass('is-invalid');\n }\n } else if ($(this).is(\":valid\") && !$(this).hasClass('date')) {\n checkOcsSpecificField(e, false)\n $(this).addClass('valid');\n $(this).removeClass('is-invalid');\n } else if ($(this).is(\":invalid\")) {\n /* Only for OCS password input because we don't want to display error message on focus out for each other fields */\n checkOcsSpecificField(e, true)\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n $(this).trigger('invalid');\n }\n } else {\n checkOcsSpecificField(e, false)\n $(this).removeClass('is-invalid');\n }\n }\n});\n\n$('input[type=radio].custom-control-input').on('change', function() {\n if (this.closest('.form-check-radio') !== null) {\n this.closest('.form-check-radio').querySelectorAll('input[type=radio].custom-control-input').forEach((radio) => radio.classList.remove('is-invalid'));\n if (this.closest('.form-check-radio ').querySelector('.invalid-feedback') !== null) {\n this.closest('.form-check-radio').querySelector('.invalid-feedback').classList.remove('d-block');\n }\n }\n})\n\n\n$(\"body\").on('blur', 'input.input-email', function(e) {\n $(this)[0].value = $(this)[0].value.replace(/ /g, '');\n var inputPattern = $(this).attr('pattern');\n const regex = new RegExp(inputPattern);\n if ($(this)[0].value) {\n if (regex.test($(this)[0].value)){\n checkOcsSpecificField(e, false);\n $(this).addClass('valid');\n $(this).removeClass('is-invalid');\n } else {\n checkOcsSpecificField(e, true);\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n var validationMessage = $(this).data('pattern-mismatch');\n $(this).parents('.form-group').find('.invalid-feedback')\n .text(validationMessage);\n } \n } else {\n checkOcsSpecificField(e, true);\n }\n})\n\nfunction checkOcsSpecificField(e, errorField) {\n\tlet currentField;\n if (e.handleObj !== undefined) { /* It mean \"e\" is an event */\n currentField = e.currentTarget;\n } else {\n currentField = e;\n }\n\tif ((currentField.closest('.ocs-form') || currentField.closest('.ocs-form-core')) && (currentField.attributes.required !== undefined && currentField.attributes.required !== false || currentField.value.trim() !== \"\")) {\n\t\tlet ocsInput;\n let ocsInputInput;\n if (currentField.tagName !== 'TEXTAREA' && currentField.tagName !== 'SELECT' && currentField.type !== \"checkbox\") {\n currentField.closest('.ocs-input') !== null ? ocsInput = currentField.closest('.ocs-input') : ocsInput = currentField.closest('.ocs-core-input');\n ocsInputInput = ocsInput.querySelector('input');\n\n }\n else if (currentField.tagName == 'TEXTAREA') {\n currentField.closest('.ocs-textarea') !== null ? ocsInput = currentField.closest('.ocs-textarea') : ocsInput = currentField.closest('.ocs-core-textarea');\n ocsInputInput = currentField;\n }else if (currentField.tagName == 'SELECT') {\n currentField.closest('.ocs-select') !== null ? ocsInput = currentField.closest('.ocs-select') : ocsInput = currentField.closest('.ocs-core-input');\n ocsInputInput = ocsInput.querySelector('select');\n } else {\n currentField.closest('.ocs-checkbox') !== null ? ocsInput = currentField.closest('.ocs-checkbox') : ocsInput = currentField.closest('.ocs-core-checkbox');\n ocsInputInput = currentField;\n }\n if (ocsInput !== undefined && ocsInput !== null) {\n\t\t\tif (errorField == true) {\n\t\t\t\tocsInputInput.setCustomValidity('');\n let validationMessage;\n if (ocsInputInput.validity.badInput && ocsInputInput.getAttribute('data-bad-input') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-bad-input');\n } else if (ocsInputInput.validity.patternMismatch && ocsInputInput.getAttribute('data-pattern-mismatch') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-pattern-mismatch');\n } else if ((ocsInputInput.validity.rangeOverflow || ocsInputInput.validity.rangeUnderflow)\n && ocsInputInput.getAttribute('data-range-error') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-range-error');\n } else if ((ocsInputInput.validity.tooLong || ocsInputInput.validity.tooShort)\n && ocsInputInput.getAttribute('data-range-error') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-range-error');\n } else if (ocsInputInput.validity.valueMissing && $(ocsInputInput).data('data-missing-error') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-missing-error');\n } else if (ocsInputInput.validity.typeMismatch && $(ocsInputInput).data('data-pattern-mismatch') !== null) {\n validationMessage = ocsInputInput.getAttribute('data-pattern-mismatch');\n }\n const hint = ocsInput.querySelectorAll('.hint');\n if (hint !== null) {\n hint.forEach(function(ht) {\n ht.getAttribute('role') !== null ? ht.remove() : false;\n })\n }\n let ariaDescribedBy = \"\";\n let ariaDescribedById = \" err_\"+currentField.id+\"\";\n\n if (ocsInputInput.getAttribute('aria-describedby') !== null && ocsInput.querySelector('.help-text') !== null) {\n ariaDescribedBy = ocsInputInput.getAttribute('aria-describedby');\n }\n if (ocsInputInput.getAttribute('aria-describedby') == null || (ocsInputInput.getAttribute('aria-describedby') !== null && ocsInputInput.getAttribute('aria-describedby').indexOf('err_'+currentField.id+'') == -1)) {\n ariaDescribedBy += \" err_\"+currentField.id+\"\";\n }\n \n\t\t\t\tconst errorContainer = '<div class=\"hint\" role=\"alert\" id='+ariaDescribedById+'><p class=\"invalid-text\"><i class=\"ocs-icon danger alert-negative-default medium\" aria-hidden=\"true\"></i>'+validationMessage+'</p></div>';\n\t\t\t\tcurrentField.setAttribute('aria-invalid', 'true');\n\t\t\t\tcurrentField.setAttribute('aria-describedby', ariaDescribedBy);\n\t\t\t\tocsInput.classList.remove('valid');\n\t\t\t\tocsInput.classList.add('dirty', 'invalid');\n\t\t\t\tocsInput.insertAdjacentHTML(\"beforeend\", errorContainer);\n\t\t\t} else {\n const hint = ocsInput.querySelectorAll('.hint');\n if (hint !== null) {\n hint.forEach(function(ht) {\n ht.getAttribute('role') !== null ? ht.remove() : false;\n })\n }\n ocsInputInput.getAttribute('aria-describedby') !== null && ocsInputInput.getAttribute('aria-describedby').indexOf('err_'+currentField.id+'') !== -1 ? ocsInputInput.setAttribute('aria-describedby', ocsInputInput.getAttribute('aria-describedby').replace('err_'+currentField.id+'', '')) : false;\n\t\t\t\tcurrentField.setAttribute('aria-invalid', 'false');
14\n\t\t\t\tocsInput.classList.add('valid');\n\t\t\t\tocsInput.classList.remove('dirty', 'invalid');\n\t\t\t}\n\t\t}\n\t}\n}\n\n$('.form-group select').click(function () {\n if ($(this).hasAttr('required')) {\n if ($(this).is(\":valid\")) {\n $(this).addClass('valid');\n $(this).removeClass('is-invalid');\n } else if ($(this).is(\":invalid\")) {\n $(this).addClass('is-invalid');\n $(this).removeClass('valid');\n }\n }\n});\n\n\n// $('.ocs-core-input select').change(function () {\n// if ($(this).hasAttr('required')) {\n// if ($(this).is(\":valid\")) {\n// $(this).parents('.ocs-core-input').addClass('valid');\n// $(this).parents('.ocs-core-input').removeClass('dirty invalid');\n// } else if ($(this).is(\":invalid\")) {\n// $(this).parents('.ocs-core-input').addClass('dirty invalid');\n// $(this).parents('.ocs-core-input').removeClass('valid');\n// }\n// }\n// });\n\n/// search input\n$('.navbar-header .user').on('mouseenter focusin', function () {\n if ($('.navbar-header .user .popover').length > 0) {\n $('.navbar-header .user .popover').addClass('show');\n }\n});\n\n$('.navbar-header .user').on('mouseleave', function () {\n $('.navbar-header .user .popover').removeClass('show');\n});\n\n// checkboxes check\n$(document).on(\"click\", \".custom-checkbox .custom-control-label\", function (e) {\n\n e.preventDefault();\n var $input = $(this).siblings(\".custom-checkbox .custom-control-input\");\n if ($input.hasClass(\"ValidCGV\")) {\n $('body').spinner().start();\n }\n if (!$input.attr('disabled')) {\n $input.toggleClass('checked')\n if ($input.attr('checked')) {\n $input.removeAttr('checked');\n } else {\n $input.attr('checked', '');\n }\n if ($input.hasClass(\"ValidCGV\")) {\n $(\"#js-CGV\").attr(\"value\", $input[0].checked);\n $('body').spinner().stop();\n }\n }\n $input.trigger('change');\n});\n\n// searchbar\nvar $searchinput = $(\".custom-search .input-text\");\nvar $searchinputReset = $(\".custom-search .reset-button\");\n\n$searchinputReset.click(function () {\n $(this).siblings($searchinput).val('');\n $(this).parent().addClass(\"icon-navigation-search\");\n});\n$searchinput.on('input', function () {\n if ($searchinput.val() !== '') {\n $(this).parent().removeClass(\"icon-navigation-search\");\n $(this).siblings('.reset-button').show();\n } else {\n $(this).parent().addClass(\"icon-navigation-search\");\n $(this).siblings('.reset-button').hide();\n }\n});\n\n// auto generate <pre> for contenteditable=\"true\" text elements\nvar editableTexts = $(\"#texts [contenteditable=true]\");\n$('<pre></pre><a href=\"#\" class=\"js-copyToClipboard\">copy code</a>').insertAfter(editableTexts);\neditableTexts.on('DOMSubtreeModified', function () {\n var elementCode = $(this).prop('outerHTML');\n elementCode = elementCode.replace(' contenteditable=\"true\"', '');\n $(this).siblings('pre').text(elementCode);\n});\neditableTexts.trigger('DOMSubtreeModified');\n\n// gender select\n\n$(document).find(\".gender.btn-group-toggle\").on('click', 'label', function () {\n $(this).closest('.gender').find('label.btn').each(function( index ) {\n $(this).removeClass('active');\n var $inputGender = $(this).find('input');\n if(typeof $inputGender != 'undefined'){\n $inputGender.removeAttr('checked');\n }\n $(this).removeAttr('checked');\n });\n $(this).addClass(\"active\");\n $(this).closest('label.btn-outline-primary').addClass(\"active\");\n $(this).attr('checked', true);\n $(this).find('input').attr('checked', true);\n});\n\n// hide message textarea validation\n/*\ndocument.addEventListener('invalid', (function () {\n return function (e) {\n e.preventDefault();\n document.getElementById(\"contactForm-form-message\").focus();\n };\n})(), true);\n*/\n\n\n// copy code to clipboard\n$('body').append('<input id=\"clipboard\" aria-label=\"clipboard\" value=\"\" style=\"position:absolute;top:-100%\" />')\n$('<a href=\"#\" class=\"js-copyToClipboard\">copy code</a>').insertAfter($('pre'));\nvar btnCopy = $('.js-copyToClipboard');\n\nbtnCopy.click(function () {\n var toCopy = $(this).siblings('pre').text();\n var $temp = $('#clipboard');\n $temp.val(toCopy);\n $temp.select();\n document.execCommand('copy');\n return false;\n});\n\n// custom dropdown with flag\n\n// set form values\n$('.dropbtn').each(function () {\n $('#' + $(this).data('rel')).val($(this).data('code'));\n});\n\n// dropdown dynamics\n$(document).on('click', '.dropbtn', function (e) {\n $(this).next('.dropdown-content').not('.dropdown-search .dropdown-content').toggleClass('d-none');\n});\n\n// select actions\n$(document).on('click', '.dropdown-content a, .dropdown-content .option-sort', function (e) {\n e.preventDefault(); // avoid jump to top\n var dropbtn = $(this).parent().prev('.dropbtn');\n // get select datas\n var countryValue = $(this).data('code');\n var inputPattern = $(this).data('pattern');\n var displayValue = $(this).find('.option').text();\n var selectedValue = $(this).data('value');\n var inputCaption = $(this).data('caption');\n // get option datas\n var relatedInput = dropbtn.data('rel');\n var linkedInput = dropbtn.data('link');\n // change selected index\n dropbtn.trigger('click');\n dropbtn.find('.value').not('.dropdown-search .value').text(displayValue);\n dropbtn.find('i').removeClass().addClass('flag-icon flag-icon-' + countryValue);\n // update current form\n $('#' + relatedInput).val(selectedValue);\n $('#' + linkedInput).attr('pattern', inputPattern);\n $('#' + linkedInput).siblings('.caption').text(inputCaption);\n dropbtn.find('.value').addClass('selected');\n if ($('#prefixCountryCode-selected').length) {\n $('#prefixCountryCode-selected').val(countryValue.toUpperCase());\n }\n});\n\n// prefill an input hidden with the prefix country code to check the regex in back\n$(document).ready(function () {\n let $prefixCountryCode = $('#prefixCountryCode-selected');\n\n if ($prefixCountryCode && $prefixCountryCode.length) {\n\n let dataCountryCode = $(\".ocs-option-card-label input:checked\").parents('.shipping-dropdown').find('.phoneCode').data('country-code');\n\n if(dataCountryCode != null){\n $prefixCountryCode.val(dataCountryCode.toUpperCase());\n }\n }\n});\n\n// closing custom dropdowns on outside click\n$(document).on('click', function (e) {\n var container = $(\".dropbtn, .dropdown-content\");\n if (!container.is(e.target) && container.has(e.target).length === 0) {\n container.next('.dropdown-content').not('.dropdown-search .dropdown-content').addClass('d-none');\n }\n});\n\n\n// auto focus on input invalid\n$('[type=\"submit\"]').on('click', function () {\n let formValidation = $(this).closest('form');\n\n //dont work for new DesignSystem\n if(!formValidation.hasClass('ocs-form') || !formValidation.hasClass('ocs-form-core')){\n if (formValidation.find(':invalid').first().offset()) {\n if (!formValidation.hasClass('loginlayer')) {\n $('html, body').animate({ scrollTop: $(this).closest('form').find(':invalid').first().offset().top - 80 }, 'slow');\n }\n }\n }\n});\n\n// Hide Header on on scroll down\nvar didScroll;\nvar lastScrollTop = 0;\nvar delta = 5;\nvar navbarHeight = $(\".header\").outerHeight();\n$(document).scroll(function () {\n var st = $(this).scrollTop();\n // Make sure they scroll more than delta\n if (Math.abs(lastScrollTop - st) <= delta)\n return;\n\n // If they scrolled down and are past the navbar, add class scrollUp.\n // This is necessary so you never see what is \"behind\" the navbar.\n if (st > lastScrollTop && st > navbarHeight) {\n // Scroll Down\n $('.header').removeClass('nav-down').addClass('scrollUp');\n $('.refinement-bar').addClass('scrollUp');\n $('.grid-header').addClass('scrollUp');\n } else {\n // Scroll Up\n if (st + window.innerHeight < $(document).height()) {\n $('.header').removeClass('scrollUp').addClass('nav-down');\n $('.refinement-bar').removeClass('scrollUp');\n $('.grid-header').removeClass('scrollUp');\n }\n }\n\n $('.search-mobile').hasClass('show') ? ($('.header').addClass('nav-down'), $('.header').removeClass('scrollUp')) : false ;
14\n\n lastScrollTop = st;\n if(st > 0) {\n $('.grid-header').addClass('scrolling');\n }\n else {\n $('.grid-header').removeClass('scrolling');\n }\n});\n\n// closing alert messages\n$(document).on('click', '.alert', function () {\n $(this).css('animation', 'slide-show 2s reverse forwards');\n});\n\n$(document).on('keyup focus','.datefieldcustom', function (e) {\n \n let valeurContent = $(this).val();\n let sizeContent = valeurContent.length;\n let newValue = valeurContent;\n let valuePrecedent = $(this).attr('data-precedent');\n\n if(typeof valuePrecedent == 'undefined'){\n valuePrecedent = \"\";\n }\n if(sizeContent == 2 || sizeContent == 5){\n if(valuePrecedent.length<valeurContent.length){\n newValue = valeurContent+'/';\n $(this).val(newValue);\n }\n }\n\n $(this).attr('data-precedent',newValue);\n}); \n\n$(document).on('keyup','.dateseparatefields', function (e) {\n var key = e.which || e.keyCode;\n if (key == 8) { //backspace\n if (this.value.length == 0) {\n $(this).closest(\".form-group\").prev('.form-group').find('.dateseparatefields').focus();\n }\n } else {\n if (this.value.length > this.dataset.maxlen) { //maxlength\n this.value = this.value.slice(0, this.maxLength);\n }\n if (this.value.length == this.dataset.maxlen) { //autofocus\n $(this).closest(\".form-group\").next('.form-group').find('.dateseparatefields').focus();\n }\n concatenationBirthday();\n }\n});\n\n$(document).on('change','.dateseparatefields', function (e) {\n concatenationBirthday();\n});\n\nfunction concatenationBirthday() {\n if($('#form-birthday').length > 0){\n $(\"#form-birthday\").val( \n $(\"#form-birthday-day\").val() + \"/\" +\n $(\"#form-birthday-month\").val() + \"/\" +\n $(\"#form-birthday-year\").val()\n );\n }\n\n if($('#form-birthday-toggle').length > 0){\n $(\"#form-birthday-toggle\").val( \n $(\"#form-birthday-day-toggle\").val() + \"/\" +\n $(\"#form-birthday-month-toggle\").val() + \"/\" +\n $(\"#form-birthday-year-toggle\").val()\n );\n }\n}\n\n// responsive menu management\n$(window).resize( function() {\n var divMobileMenu = $('div.isMobileMenu');\n\n if ( $(window).width()+17 >= 1280 ) {\n divMobileMenu.removeClass('mobile-menu').addClass('container-fluid d-flex');\n if ( $('div.mega-menu').length == 0 ) {\n divMobileMenu.wrap('<div class=\"mega-menu\"></div>');\n $('div.slotCategory').addClass('d-xl-block');\n }\n\n if ( $('li.detached').length ) {\n $('li[data-levels=true]').each( function() {\n $(this).addClass('dropdown');\n $(this).find('> a').addClass('dropdown-toggle').attr('data-toggle','dropdown');\n var ulTarget = $(this).find('> ul');\n ulTarget.removeClass('d-none');\n $(this).nextUntil(':not(.detached)','.detached').removeClass('detached').detach().appendTo(ulTarget);\n });\n }\n } else {\n divMobileMenu.removeClass('container-fluid d-flex').addClass('mobile-menu');\n if ( $('div.mega-menu').length ) {\n $('div.slotCategory').removeClass('d-xl-block');\n divMobileMenu.unwrap();\n }\n\n if ( $('li.detached').length == 0 ) {\n $('li[data-levels=true]').each( function() {\n $(this).removeClass('dropdown');\n $(this).find('> a').removeClass('dropdown-toggle').removeAttr('data-toggle');\n $(this).find('> ul').addClass('d-none');\n $(this).find('> ul li').addClass('detached').detach().insertAfter($(this));\n });\n }\n }\n}).resize();\n\n\nlet recoCount = 0;\nlet recoInterval = setInterval(recoResizePlp, 500);\n\nfunction recoResizePlp() {\n recoCount += 1;\n const ocsReco = document.querySelectorAll('.ocs-reco-fullpage');\n const productGrid = document.querySelector('.product-grid');
14\n\n if (ocsReco.length !== 0) {\n ocsReco.forEach(function(reco) {\n if (window.innerWidth > 1319 && productGrid !== null) {\n reco.style.maxWidth= \"0\";\n reco.style.maxWidth= productGrid.clientWidth + \"px\";\n } else {\n reco.style.maxWidth= \"none\";\n }\n if (window.innerWidth > 768) {\n const swipperButtons = reco.querySelectorAll('.swiper-action .ocs-button, .swiper-action .ocs-core-button');\n let swipperButtonsCount = 0;\n let swipeActionDisplay = \"\";\n swipperButtons.forEach(function (button) {\n button.classList.contains('swiper-button-disabled') ? swipperButtonsCount += 1 : false;\n })\n\n swipperButtonsCount == swipperButtons.length ? swipeActionDisplay = \"none\" : swipeActionDisplay = \"flex\";\n reco.querySelector('.swiper-action') !== null ? reco.querySelector('.swiper-action').style.display = swipeActionDisplay : false;\n }\n })\n }\n recoCount > 5 ? clearInterval(recoInterval) : false;\n}\nrecoResizePlp();\nwindow.addEventListener('resize', recoResizePlp, false);\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\n\nwindow.lazySizesConfig.expand = 10; //default 360-500\nlazySizesConfig.expFactor = 1.5; //default: 1.7\n\n\n//$(\"img.lazy\").lazyload();\n\n\n//# sourceURL=webpack:///./cartridges/app_coremodel_storefront/cartridge/client/default/js/uiShow.js?")}
vendor: 3 bytes, line 14
14});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.