{"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":""}