{"version":3,"file":"default/js/gtm.js","mappings":";;;;;AAAA;AACA,cAAc,+BAA+B;AAC7C;AACA,cAAc,8FAA8F;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,SAAS;AACxB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA,iBAAiB,aAAa;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,2DAA2D;AAC3D;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,qEAAqE,oGAAoG;AACzK,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4BAA4B,sBAAsB;AAClD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,UAAU;AACV;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA,wBAAwB,oBAAoB;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;;AAEA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;AACjB,aAAa;AACb;AACA,KAAK;;AAEL;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA","sources":["webpack://sfra-startup-kit/./cartridges/app_cwf/cartridge/client/default/js/gtm.js"],"sourcesContent":["/**\n * @typedef {{label: string, value: string}} Filter\n *\n * @typedef {{pageType: string, categoryLevel_1: string, categoryLevel_2: string, categoryLevel_3: string}} GtmPageParameters\n *\n * @typedef {{\n * event: string,\n * envCountry: string,\n * envCurrencyCode: string,\n * envLanguage: string,\n * envStoreId: string,\n * envWork: string,\n * page: GtmPageParameters,\n * userEmail: string,\n * userEmailSHA256: string,\n * userId: string,\n * userLoginState: string\n * }} GtmParameters\n */\n\nvar gtm = {\n active: true,\n buffer: {},\n events: {\n ADD_TO_CART: \"addToCart\",\n BANNER_CLICK: \"clickBannière\",\n CREATE_ACCOUNT: \"creationCompte\",\n FILTERS: \"filtres\",\n LOGIN: \"connexion\",\n MENU_CLICK: \"clicMenuNiveau\",\n MENU_FOOTER_CLICK: \"clickMenuFooter\",\n NEWSLETTER_SUBSCRIPTION: \"newsletterSoumission\",\n PRODUCT_ADD_WISHLIST: \"productAddWishlist\",\n PRODUCT_CHECKOUT: \"productCheckout\",\n PRODUCT_DETAIL: \"productDetail\",\n PRODUCT_IMPRESSIONS: \"productImpressions\",\n PRODUCT_CLICK: \"productClick\",\n PROMOTIONAL_BANNER_CLICK: \"clickBandeau\",\n PURCHASE: \"orderConfirmation\",\n RESET_PASSWORD: \"reinitilisationMotPasse\",\n SEARCH: \"recherche\",\n SOCIAL_NETWORK_CLICK: \"clickSociauxRéseaux\"\n },\n productsImpressionsFirstPosition: 0,\n productsImpressionsLastPosition: 0,\n\n /**\n * @description Initialize the datalayer\n *\n * @param {Object} parameters Parameters to initialize the datalayer\n */\n init: function (parameters) {\n this.active = parameters.hasConsent;\n if (!this.active) {\n return;\n }\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n event: parameters.event,\n\n // Environment information\n environnement: {\n language: parameters.envLanguage, // Current language of website\n country: parameters.envCountry, // Current country of website\n currencyCode: parameters.envCurrencyCode, // Current currency of website\n work: parameters.envWork, // Work environment\n store_id: parameters.envStoreId // Current store id of website\n },\n\n // Page information\n page: parameters.page,\n\n // User information\n user: {\n userLoginState: parameters.userLoginState, // 1 if user is logged, else 0\n userId: parameters.userId, // Salesforce user Id\n userEmail: parameters.userEmail, // Email of the user\n userEmailSHA256: parameters.userEmailSHA256, // Email of the user encrypted with SHA256\n userphone_number: parameters.userPhone,\n userphone_numberSHA256: parameters.userPhoneSHA256,\n userfirst_name: parameters.userFirstName,\n userfirst_nameSHA256: parameters.userFirstNameSHA256,\n userlast_name: parameters.userLastName,\n userlast_nameSHA256: parameters.userLastNameSHA256,\n useraddress_street: parameters.userAddressStreet,\n useraddress_city: parameters.userAddressCity,\n useraddress_region: parameters.userAddressRegion,\n useraddress_postalcode: parameters.userAddressPostalCode,\n useraddress_country: parameters.userAddressCountryCode\n }\n });\n },\n\n clipRect: function (rect) {\n return {\n left: Math.max(0, rect.left),\n top: Math.max(0, rect.top),\n right: Math.min(window.innerWidth, rect.right),\n bottom: Math.min(window.innerHeight, rect.bottom)\n };\n },\n\n calcArea: function (rect) {\n return (rect.right - rect.left) * (rect.bottom - rect.top);\n },\n\n calcOcclusion: function (element) {\n var rect = element.getBoundingClientRect();\n var clippedRect = this.clipRect(rect);\n return Math.max(0, this.calcArea(clippedRect) / this.calcArea(rect));\n },\n\n /**\n * @description Push the data of an event into the buffer\n *\n * @param {string} event Event name\n * @param {Object} data Event data\n * @param {boolean} autoPush Enables automatic push\n */\n addEventToBuffer: function (event, data, autoPush) {\n if (Object.hasOwnProperty.call(this.buffer, event)) {\n this.buffer[event].push(data);\n\n return;\n }\n\n this.buffer[event] = [data];\n\n if (autoPush) {\n this.pushMessage(event);\n }\n },\n\n /**\n * @description Push an action into the dataLayer\n *\n * @param {Object} action Action to push in the datalayer\n */\n pushAction: function (action) {\n if (this.active) {\n window.dataLayer.push(action);\n }\n },\n\n /**\n * @description Push an action with a buffer into the dataLayer\n *\n * @param {string} event Event to push in the datalayer\n */\n pushMessage: function (event) {\n var message = this.buildMessage(event);\n\n if (message && this.active) {\n window.dataLayer.push(message);\n }\n },\n\n /**\n * @description Build the message from the buffered data\n *\n * @param {string} event Event to transform into an object message\n *\n * @returns {Object|null} Object message built\n */\n buildMessage: function (event) {\n if (!Object.hasOwnProperty.call(this.buffer, event) || this.buffer[event].length === 0) {\n return null;\n }\n\n var message = {\n event: event\n };\n\n var items = this.buffer[event];\n var data = items[0];\n\n switch (event) {\n case this.events.ADD_TO_CART:\n message.locationAddToCart = data.location; // Change depending the location (panier/productdetail/product list/wishlist)\n message.productAddToCart = [data.product];\n break;\n\n case this.events.BANNER_CLICK:\n message.nomBannière = data.bannerName;\n message.typeBannière = \"Category\";\n break;\n\n case this.events.CREATE_ACCOUNT:\n message.tunnel = data.tunnel;\n break;\n\n case this.events.FILTERS:\n message.category = data.category;\n message.label = data.label;\n break;\n\n case this.events.LOGIN:\n message.tunnel = data.tunnel;\n break;\n\n case this.events.MENU_FOOTER_CLICK:\n message.text = data.text;\n break;\n\n case this.events.PRODUCT_ADD_WISHLIST:\n message.productAddWishlist = items;\n break;\n\n case this.events.PRODUCT_CHECKOUT:\n message.cartStep = data.currentStage;\n message.cartTotal_exclu_tax = data.cartTotalWithoutTax;\n message.cartTotal_inclu_tax = data.cartTotalWithTax;\n message.cartProductsTotal = data.cartProductsTotal;\n message.client_id = data.userId;\n message.store_id = data.storeId;\n message.order_id = data.orderId;\n message.productCheckout = data.products;\n break;\n\n case this.events.PRODUCT_DETAIL:\n message.productDetail = items;\n break;\n\n case this.events.PRODUCT_IMPRESSIONS:\n message.productsImpressions = items;\n break;\n\n case this.events.PRODUCT_CLICK:\n message.productClick = items;\n break;\n\n case this.events.PURCHASE:\n message.transactionShippingMethod = data.shippingMethod;\n message.transactionPaymentMethod = data.paymentMethod;\n message.transactionTotal_exclu_tax = data.merchandiseTotalNetPrice;\n message.transactionTotal_inclu_tax = data.merchandiseTotalGrossPrice;\n message.transactionCurrency = data.currency;\n message.transactionRevenu = data.totalGrossPrice;\n message.transactionId = data.orderId;\n message.transactionShipping = data.shippingFees;\n message.transactionTax = data.totalTax;\n message.transactionCoupon = data.coupon;\n message.userTotalPurchase = data.userTotalOrders;\n message.transactionProducts = data.products;\n break;\n\n case this.events.RESET_PASSWORD:\n message.tunnel = data.tunnel;\n break;\n\n case this.events.SEARCH:\n message.rechercheTerm = data.searchTerm;\n message.nombreRechercheTerm = data.searchCount;\n break;\n\n case this.events.SOCIAL_NETWORK_CLICK:\n message.text = data.text;\n break;\n\n default:\n break;\n }\n\n if (new RegExp(this.events.MENU_CLICK, \"g\").test(event)) {\n message.text = data.text;\n }\n\n delete this.buffer[event];\n\n return message;\n },\n\n /**\n * @description Add listeners on the filters of a product list.\n */\n addFilterListener: function () {\n var refinementNode = document.getElementsByClassName(\"js-refinement-container\")[0];\n if (typeof refinementNode === \"undefined\") {\n return;\n }\n\n refinementNode.addEventListener(\"click\", function (event) {\n var eventPath = event.composedPath();\n var refinement = null;\n for (var j = 0; j < eventPath.length; j++) {\n var node = eventPath[j];\n\n if (typeof node.className === \"string\" && node.className.includes(\"title\")) {\n continue;\n }\n\n if (node.localName === \"button\") {\n refinement = node;\n break;\n }\n }\n\n if (!refinement) {\n return;\n }\n\n var refinementLabelNode = refinement.querySelector(\".js-refinement-label\");\n if (refinementLabelNode.classList.contains(\"selected\")) {\n return;\n }\n\n var refinementCardNode = refinement.closest(\".card\");\n var refinementCategoryNode = refinementCardNode.querySelector(\".js-refinement-category\");\n\n window.gtm.addEventToBuffer(window.gtm.events.FILTERS, { category: refinementCategoryNode.textContent.trim(), label: refinementLabelNode.textContent.trim() }, true);\n });\n },\n\n /**\n * @description Add a listener main menu\n */\n addMenuListener: function () {\n var navigation = document.getElementsByClassName(\"js_main_menu\")[0];\n if (typeof navigator === \"undefined\") {\n return;\n }\n\n navigation.addEventListener(\"click\", function (event) {\n var eventPath = event.composedPath();\n var linkNode = null;\n var level = null;\n\n for (var i = 0; i < eventPath.length; i++) {\n var node = eventPath[i];\n\n if (node.localName === \"a\") {\n linkNode = node;\n }\n\n if (linkNode) {\n break;\n }\n }\n\n if (linkNode) {\n if (linkNode.getAttribute(\"data-menu-level\")) {\n level = linkNode.getAttribute(\"data-menu-level\");\n }\n\n var eventAction = \"clicMenuNiveau\" + level;\n var label = linkNode.textContent.trim();\n\n window.gtm.addEventToBuffer(eventAction, {\n text: label\n }, true);\n }\n });\n },\n\n addProductDetailListener: function () {\n var addToCartButton = document.getElementsByClassName(\"add-to-cart\")[0];\n\n addToCartButton.addEventListener(\"click\", function () {\n var gtmDataInput = document.getElementsByClassName(\"js-gtm-product\")[0];\n var gtmData = JSON.parse(gtmDataInput.dataset.gtm);\n\n var productBrand = document.getElementsByClassName(\"product-brand\")[0];\n var productId = document.getElementsByClassName(\"product-id\")[0];\n var productName = document.getElementById(\"product-detail-product-name\");\n var sizeSelect = document.getElementsByClassName(\"select-size\")[0];\n var size = sizeSelect.options[sizeSelect.selectedIndex].dataset.attrValue;\n\n var priceElement = document.getElementsByClassName(\"price\")[0];\n var originalPriceElement = priceElement.querySelector(\".old-price\");\n var currentPriceElement = priceElement.querySelector(\".value\");\n\n var price = parseFloat(currentPriceElement.attributes.content.value);\n var originalPrice = originalPriceElement ? parseFloat(originalPriceElement.attributes.content.value) : price;\n var promotion = price - originalPrice;\n\n var productData = {\n brand: productBrand ? productBrand.textContent : \"\",\n category: gtmData.category,\n id: productId.textContent,\n name: productName.textContent,\n originPrice: String(originalPrice),\n price: String(price),\n promotion: String(promotion),\n quantity: \"1\",\n size: size ? size : \"\",\n sku: productId.textContent\n };\n\n this.addEventToBuffer(this.events.ADD_TO_CART, {\n location: \"productdetail\",\n product: productData\n }, true);\n }.bind(this));\n },\n\n addProductFromCartListener: function () {\n var quantitySelect = document.querySelectorAll(\".line-item-quantity .quantity\");\n var productData = {};\n\n if (quantitySelect) {\n quantitySelect.forEach(select => {\n var parentNode = select.closest(\".product-line-item-details__description\");\n select.setAttribute(\"data-current-value\", select.value);\n\n select.addEventListener(\"change\", function (event) {\n var newValue = event.target.value;\n\n var addToCartQuantity = 0;\n if (event.target.getAttribute(\"data-current-value\")) {\n addToCartQuantity = newValue - event.target.getAttribute(\"data-current-value\");\n select.setAttribute(\"data-current-value\", newValue);\n }\n\n if (addToCartQuantity > 0) {\n var gtmDataInput = parentNode.querySelector(\".js-gtm-product\");\n var gtmData = JSON.parse(gtmDataInput.dataset.gtm);\n\n var price = parseFloat(gtmData.price);\n var originalPrice = parseFloat(gtmData.originPrice);\n var promotion = price - originalPrice;\n\n productData = {\n brand: gtmData.brand,\n category: gtmData.category,\n id: gtmData.id,\n name: gtmData.name,\n originPrice: String(originalPrice),\n price: String(price),\n promotion: String(promotion),\n quantity: addToCartQuantity,\n size: gtmData.size,\n sku: gtmData.id\n };\n\n this.addEventToBuffer(this.events.ADD_TO_CART, {\n location: \"panier\",\n product: productData\n }, true);\n }\n }.bind(this));\n });\n }\n },\n\n addProductAddWishlistListener: function () {\n var addToWishlistButton = document.querySelectorAll(\".add-to-wish-list\");\n var productData = {};\n\n if (addToWishlistButton) {\n addToWishlistButton.forEach(button => {\n button.addEventListener(\"click\", function (event) {\n if (event.target.closest(\".product-detail\")) {\n var gtmDataInput = document.getElementsByClassName(\"js-gtm-product\")[0];\n productData = JSON.parse(gtmDataInput.dataset.gtm);\n var sizeSelect = document.getElementsByClassName(\"select-size\")[0];\n var productId = document.getElementsByClassName(\"product-id\")[0];\n productData = {\n ...productData,\n size: sizeSelect.options[sizeSelect.selectedIndex].dataset.attrValue || \"\",\n sku: productId.textContent\n };\n } else {\n var productTile = event.target.closest(\".product\");\n var productTileData = productTile.querySelector(\".js-product-tile\");\n\n productData = JSON.parse(productTileData.dataset.gtm);\n if (productData.list === \"\") {\n var pageTitle = document.getElementsByClassName(\"h2\")[0];\n productData.list = pageTitle.textContent.trim();\n }\n productData = {\n ...productData,\n size: \"\",\n sku: productData.id\n };\n }\n\n if (!event.target.closest(\".wishlisted\")) {\n this.addEventToBuffer(this.events.PRODUCT_ADD_WISHLIST, productData, true);\n }\n }.bind(this));\n });\n }\n },\n\n addProductListListener: function (tileContainerClass) {\n var tileContainer = document.getElementsByClassName(tileContainerClass)[0];\n\n if (typeof tileContainer === \"undefined\") {\n return;\n }\n\n tileContainer.addEventListener(\"click\", function (event) {\n var flagNode = event.composedPath().find(function (node) {\n return typeof node.className === \"string\" && node.className.includes(\"js-product-link\");\n });\n\n if (!flagNode) {\n return;\n }\n\n var productTile = event.target.closest(\".product\");\n var productTileData = productTile.querySelector(\".js-product-tile\");\n\n var productData = JSON.parse(productTileData.dataset.gtm);\n if (productData.list === \"\") {\n var pageTitle = document.getElementsByClassName(\"h2\")[0];\n productData.list = pageTitle.textContent.trim();\n }\n\n this.addEventToBuffer(this.events.PRODUCT_CLICK, productData, true);\n }.bind(this));\n },\n\n addScrollListener: function () {\n window.onscroll = function () {\n window.gtm.sendProductImpression();\n };\n },\n\n sendProductImpression: function () {\n var currentFirstPosition = 0;\n var currentLastPosition = 0;\n var elements = document.getElementsByClassName(\"product\");\n var impressionEvent = window.gtm.events.PRODUCT_IMPRESSIONS;\n for (var i = 0; i < elements.length; i++) {\n var elem = elements[i];\n var visibilityElem = Math.round(window.gtm.calcOcclusion(elem) * 100);\n\n if (visibilityElem >= 70) {\n var productTileData = elem.querySelector(\".js-product-tile\");\n var productData = JSON.parse(productTileData.dataset.gtm);\n if (productData.list === \"\") {\n var pageTitle = document.getElementsByClassName(\"h2\")[0];\n productData.list = pageTitle.textContent.trim();\n }\n window.gtm.addEventToBuffer(impressionEvent, productData);\n\n if (window.gtm.buffer[impressionEvent].length === 1) {\n currentFirstPosition = parseInt(productData.position, 10);\n }\n\n currentLastPosition = parseInt(productData.position, 10);\n }\n\n if (window.gtm.buffer[impressionEvent] && window.gtm.buffer[impressionEvent].length >= 15) {\n break;\n }\n }\n\n // Check buffered impressions\n if ((currentFirstPosition === 0 && currentLastPosition === 0) ||\n (window.gtm.productsImpressionsFirstPosition === currentFirstPosition &&\n window.gtm.productsImpressionsLastPosition === currentLastPosition)\n ) {\n delete this.buffer[impressionEvent];\n\n return;\n }\n\n window.gtm.pushMessage(impressionEvent);\n window.gtm.productsImpressionsFirstPosition = currentFirstPosition;\n window.gtm.productsImpressionsLastPosition = currentLastPosition;\n },\n\n /**\n * @description Add a listener to the layer (login)\n */\n loginListener: function () {\n var loginData = {\n tunnel: false\n };\n\n var loginButton = document.getElementById(\"jsLoginButton\");\n var queryString = window.location.search;\n var urlParams = new URLSearchParams(queryString);\n var urlFrom = urlParams.get(\"from\");\n\n if (!sessionStorage.getItem(\"login\")) {\n if (urlFrom === \"cart\") {\n loginData = {\n tunnel: true\n };\n }\n\n if (loginButton) {\n loginButton.addEventListener(\"click\", function () {\n sessionStorage.setItem(\"login\", JSON.stringify(loginData));\n });\n }\n } else {\n loginData = JSON.parse(sessionStorage.getItem(\"login\"));\n this.addEventToBuffer(this.events.LOGIN, loginData, true);\n sessionStorage.removeItem(\"login\");\n }\n },\n\n /**\n * @description Add a listener to the layer (create account)\n */\n createAccountListener: function () {\n var createAccountData = {\n tunnel: false\n };\n\n var createAccountButton = document.getElementById(\"jsCreateAccountButton\");\n var queryString = window.location.search;\n var urlParams = new URLSearchParams(queryString);\n var urlFrom = urlParams.get(\"from\");\n\n if (!sessionStorage.getItem(\"createAccount\")) {\n if (urlFrom === \"cart\") {\n createAccountData = {\n tunnel: true\n };\n }\n\n if (createAccountButton) {\n createAccountButton.addEventListener(\"click\", function () {\n sessionStorage.setItem(\"createAccount\", JSON.stringify(createAccountData));\n });\n }\n } else {\n createAccountData = JSON.parse(sessionStorage.getItem(\"createAccount\"));\n this.addEventToBuffer(this.events.CREATE_ACCOUNT, createAccountData, true);\n sessionStorage.removeItem(\"createAccount\");\n }\n },\n\n bannerListener: function () {\n var banners = document.querySelectorAll(\".marketing-tile\");\n\n for (var i = 0; i < banners.length; i++) {\n var banner = banners[i];\n var bannerLink = banner.getElementsByTagName(\"a\");\n\n if (bannerLink.length > 0) {\n banner.addEventListener(\"click\", function (event) {\n var titleBanner = event.target.querySelector(\"h3\");\n var titleBannerText = titleBanner.textContent.replace(/(\\r\\n|\\n|\\r)/gm, \" \");\n var bannerData = {\n bannerName: titleBannerText\n };\n\n this.addEventToBuffer(this.events.BANNER_CLICK, bannerData, true);\n }.bind(this));\n }\n }\n\n },\n\n /**\n * @description Add a listener to the layer (menu footer)\n */\n addClickMenuFooterListener: function () {\n var footerLink = document.querySelectorAll(\".footer-main__list__item > a\");\n var clickData = {};\n\n if (footerLink) {\n footerLink.forEach(link => {\n link.addEventListener(\"click\", function (event) {\n clickData = {\n text: event.target.textContent\n };\n\n this.addEventToBuffer(this.events.MENU_FOOTER_CLICK, clickData, true);\n }.bind(this));\n });\n }\n },\n\n /**\n * @description Add a listener to the layer (social networks)\n */\n addClickSocialNetworksListener: function () {\n var socialNetwork = document.querySelectorAll(\".footer-main__social-media__list a\");\n var clickData = {};\n\n if (socialNetwork) {\n socialNetwork.forEach(icon => {\n icon.addEventListener(\"click\", function (event) {\n clickData = {\n text: event.target.title\n };\n\n this.addEventToBuffer(this.events.SOCIAL_NETWORK_CLICK, clickData, true);\n }.bind(this));\n });\n }\n },\n\n /**\n * @description Add a listener to the layer (social networks)\n */\n addClickPromotionalBanner: function () {\n var promotionalBanner = document.getElementsByClassName(\"header-top-banner\")[0];\n\n if (promotionalBanner) {\n promotionalBanner.addEventListener(\"click\", function () {\n this.addEventToBuffer(this.events.PROMOTIONAL_BANNER_CLICK, null, true);\n }.bind(this));\n }\n },\n\n /**\n * @description Add a listener to the layer (checkout steps)\n */\n addCheckoutListener: function (data) {\n this.addEventToBuffer(this.events.PRODUCT_CHECKOUT, data, true);\n\n var submitShippingButton = document.getElementsByClassName(\"submit-shipping\")[0];\n var triggerShippingButton = document.getElementsByClassName(\"trigger-shipping\")[0];\n var submitButtons = [];\n\n if (submitShippingButton && triggerShippingButton) {\n submitButtons = [submitShippingButton, triggerShippingButton];\n }\n\n if (submitButtons.length) {\n submitButtons.forEach((button) => {\n button.addEventListener(\"click\", () => {\n setTimeout(() => {\n var newCheckoutStage = document.getElementById(\"checkout-main\").dataset.checkoutStage;\n\n if (data.currentStage !== newCheckoutStage) {\n data.currentStage = newCheckoutStage;\n this.addEventToBuffer(this.events.PRODUCT_CHECKOUT, data, true);\n }\n }, 500);\n });\n });\n }\n },\n\n /**\n * @description Load gtm script\n *\n * @param {string} gtmId GTM identifier\n */\n loadGtm: function (gtmId) {\n (function (w, d, s, l, i) { // eslint-disable-line no-unused-vars\n w[l] = w[l] || [];\n w[l].push({\n \"gtm.start\": new Date().getTime(),\n event: \"gtm.js\"\n });\n var f = d.getElementsByTagName(s)[0];\n var j = d.createElement(s);\n var dl = l !== \"dataLayer\" ? \"&l=\" + l : \"\";\n j.async = true;\n j.src = \"https://metrics.kidsaround.us/7qcd7r11ks.js?\" + dl;\n f.parentNode.insertBefore(j, f);\n })(window, document, \"script\", \"dataLayer\", gtmId);\n }\n};\n\nwindow.gtm = gtm;\n"],"names":[],"sourceRoot":""}