{"version":3,"sources":["webpack:///webpack/bootstrap 18ae76087b773c166ed0?35be*******","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-index.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-mapping.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/pageMetaDataUtils.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-events.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-utils.js","webpack:///./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-listener.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","id","loaded","modules","call","m","c","p","PageTypeMap","events","utils","pushPageData","$user","$","pageType","getPageType","customerCrmId","data","customerEmail","currency","countryCode","length","window","bata_com_ns","analytics","country","abTests","callAbTestInteraction","businessHours","getBusinessHours","pageImpression","location","href","ga4CrmId","ga4PageView","pageURL","origin","pagePath","pathname","userID","loginStatus","customerType","PageDesignerPromoImpressionHelper","PRODUCT_IMPRESSION_MAPPING","products","ga4Products","getProductDataPDP","value","ga4GetProducts","price","promoImpressionHelper","ga4ViewItem","parseFloat","getProductsCartData","cartPageData","ga4GetCartData","ga4ViewCart","couponNames","getProductsData","ga4ViewItemList","trackProductImpression","trackRecommendationsLists","triggerProductsImpressions","searchHelper","orderConfirmHelper","removeFromCartByUnavailabilityModal","dataLayer","push","event","document","ready","PAGE_MAPPING","getPageMappingFromMetaDataElement","CART_MAPPING","category","wishlist","product","WISHLIST_MAPPING","account","billing","brands","cart","checkoutlogin","content","home","ordeConfirmation","shipping","storelocator","getOrSetPageMetaDataAttrElement","dataAttrName","val","metaData","getElementsByClassName","getAttribute","setAttribute","mapping","JSON","parse","console","log","e","ga4EventPush","object","timestamp","Date","now","ecommerce","productClick","currencyCode","click","actionField","list","action","search","isCategorySearch","keyWord","categoryID","numberOfResults","categoryName","search_term","searchKeyword","numberResults","searchType","visitorStatus","url","userEmail","email","impressions","promoImpression","promotions","promoView","PageDesignerPromoImpression","PageDesignerPromoClick","promoClick","variantSelected","detail","addToCart","customerPhone","arTryonInfo","eventData","phone","add","tryOnDesktopClick","tryOnMobileRedirect","removeFromCart","remove","pushCheckoutData","step","option","checkout","purchase","purchaseData","affiliation","revenue","adjustedMerchandizeTotalNetPrice","adjustedMerchandizeTotalTax","tax","coupon","couponCodeName","registration","userId","accountType","socialNetwork","customerID","login","trackGAEvent","label","eventValue","notInteraction","eventCategory","eventAction","eventLabel","eventNotInteraction","ga4AddPaymentInfo","checkoutData","items","payment_type","paymentType","payment_method_saved","paymentMethodSaved","ga4AddShippingInfo","shipping_tier","shippingTier","ga4AddToCart","ga4AddToWishlist","ga4RemoveFromWishlist","ga4BeginCheckout","ga4ClearSearch","ga4CheckoutProgress","step_label","stepLabel","step_number","stepNumber","ga4SaveCreditCard","ga4ClickBackInStock","clickBackInStockData","element_id","elementId","element_text","elementText","link_url","linkUrl","ga4Login","loginData","method","login_type","loginType","ga4Purchase","transaction_id","transactionId","bata_store","bataStore","cart_id","cartId","transaction_type","transactionType","ga4RemoveFromCart","ga4SelectItem","ga4SelectContent","contentData","content_id","contentId","content_type","contentType","content_name","contentName","ga4SelectPromotion","promotionData","promotion_id","promotionId","promotion_name","promotionName","item_id","item_name","ga4SelectWishlist","ga4SearchProduct","searchData","searchTerm","search_type","ga4StartSearch","ga4SuccessfulSearch","results_number","resultsNumber","search_method","searchMethod","ga4UnsuccessfulSearch","ga4Share","shareData","itemId","ga4SignUp","registrationData","signup_form_type","signupType","ga4SignUpCheckout","ga4ViewPromotion","pageData","page_type","page_url","page_path","user_id","login_status","customer_type","ga4ClickMenuNav","menuLevel","menuSelection","menu_level","menu_selection","ga4ClickFilter","filterCategory","filterName","filterValue","filter_category","filter_name","filter_value","ga4Scroll","percent","ga4Subscribe","subscriptionType","subscription_type ","ga4SelectSizeGuide","ga4OpenPdpImage","abTestInteraction","forEach","item","variant_id","variant_name","version_type","productOrder","pageMetaDataUtils","scrollPosition","25","50","75","100","getSalesStatus","jQuery","discount","extendProductDataWithGA4Categories","productData","attributeName","index","key","ga4GetProductItemListId","listId","referrer","sessionStorage","getItem","removeItem","error","categoryId","map","isSalesStatus","ga4Product","name","position","item_brand","brand","quantity","item_dimension1","dimension1","item_dimension2","dimension2","item_dimension3","dimension3","item_sales_status","size","item_size","variant","item_variant","item_list_id","item_list_name","genderName","item_gender","itemSeason","item_season","stockStatus","item_stock_status","ga4GetProductsValue","reduce","accumulator","$cartInfo","ga4GetPromotions","promotion","creative_name","creative","creative_slot","getCustomerEmailAndPhone","getProductTileData","$product","color","getProductBaseData","isNaN","parseInt","getProductTileDataExtended","openedInArTryon","getCheckoutProducts","isCartOpened","$checkoutProducts","elementsFound","each","this","setCheckoutProducts","order","analyticsProduct","variants","variationAttributes","displayValue","localizedSize","productName","masterProductID","articleNo","variationGroupID","sales","decimalPrice","primaryCategoryID","analyticsListId","getPDPProduct","description","productUrl","categoryUrl","imageUrl","itemSalesStatus","getProductClickTileData","promoHelper","promo","analyticsPromotionsData","i","rank","ga4Promotions","getABtestsDataFromDOM","abTestId","segment","params","productClickHelper","$analyticsProduct","first","variationClickHelper","variation","masterCategory","breadcrumbs","productID","custom","longDescription","canonicalUrl","URL","baseURI","images","large","values","selected","category1","category2","category3","category4","category5","checkoutUpdate","$checkout","attr","addToCartHelper","pageView","currUser","$productsElements","removeClass","removeFromCartHelper","singleItem","addToWishlistHelper","pid","removeFromWishlistHelper","keyword","$search","$productsPLP","productsDisplayed","getProductsDataSearch","$productsSearch","checkouStepHelper","options","isMiniCartOpened","ga4CartData","$checkoutInfo","couponDiscount","ga4PurchaseData","updateCheckoutData","paymentMethod","payment","selectedPaymentInstruments","labelMethod","couponsName","totals","grandTotalDecimal","$promo","updateProductQuantity","$removedProducts","$banner","$bh","recommendationContainer","$recommendation","$recommendations","recommendationName","find","html","trim","$products","trackScrollPosition","scrollPercent","scrollTop","height","toFixed","some","toString","on","response","analyticsTileSelector","tile","numberProductAlreadyDisplayed","preventDefault","productId","hasClass","analyticsInfo","setItem","sorting","$refinement","checkbox","prop","customerId","isLoginCheckout","$social","socialName","closest","$category","text","parentCatName","siblings","thirdCatName","secondCatName","prev","$button","buttonText","$link","blockTitle","parent","qty","producturl","categoryurl","imageurl","ga4CheckoutData","shippingTotalAfterDiscountValue","selectedShippingMethod","displayName","form","buttonData","elementMessage","message","bind"],"mappings":"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","file":"analytics-index.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 18ae76087b773c166ed0","'use strict';\nconst PageTypeMap = require('./analytics-mapping');\n\nvar events = require('./analytics-events');\nvar utils = require('./analytics-utils');\nrequire('./analytics-listener');\n\n//Global variable used by analytics\nwindow['dataLayer'] = window['dataLayer'] || [];\nwindow.bata_com_ns = window.bata_com_ns || {};\nwindow.bata_com_ns.analytics = window.bata_com_ns.analytics || {};\n\n/**\n * @description launch the product (PDP) impression\n */\nfunction triggerProductsImpressions(pageType) {\n var products;\n var ga4Products;\n if (pageType === 'product') {\n products = utils.getProductDataPDP();\n ga4Products = utils.ga4GetProducts(products);\n let value = ga4Products && ga4Products.length > 0 ? ga4Products[0].price : 0;\n utils.promoImpressionHelper();\n events.ga4ViewItem(window.bata_com_ns.analytics.currency, ga4Products, parseFloat(value));\n } else if (pageType === 'cart') {\n products = utils.getProductsCartData(pageType);\n ga4Products = utils.ga4GetProducts(products);\n let cartPageData = utils.ga4GetCartData();\n events.ga4ViewCart(window.bata_com_ns.analytics.currency, ga4Products, cartPageData.couponNames, parseFloat(cartPageData.value));\n } else {\n products = utils.getProductsData();\n ga4Products = utils.ga4GetProducts(products);\n // track GA4 product views only if not empty\n if (ga4Products && ga4Products.length > 0) {\n events.ga4ViewItemList(window.bata_com_ns.analytics.currency, ga4Products);\n }\n }\n // track UA product views only if not empty\n if (products && products.length > 0) {\n events.trackProductImpression(window.bata_com_ns.analytics.currency, products);\n }\n utils.trackRecommendationsLists();\n}\n\n/**\n * @description get all the global information form the DOM, then eventually, lauch the various impressions\n */\nfunction pushPageData() {\n var $user = $('#analytics-user');\n var pageType = utils.getPageType();\n var customerCrmId = $user.data('customerCrmId');\n var customerEmail = $user.data('email');\n var currency = $('#analyticsCurrencyCode').data('currency');\n var countryCode = $('#analytics-countryCode').data('content');\n\n // pageType should always be set at least to 'other'\n pageType = pageType && pageType.length > 0 ? pageType : 'other';\n\n //saves useful information in window object to improve the performances\n window.bata_com_ns.analytics.currency = currency;\n window.bata_com_ns.analytics.pageType = pageType;\n window.bata_com_ns.analytics.country = countryCode;\n\n window.bata_com_ns.abTests = {\n callAbTestInteraction: utils.callAbTestInteraction\n };\n\n // businessHours event\n events.businessHours(utils.getBusinessHours());\n\n // abTests data pushing into the dataLayer\n utils.callAbTestInteraction({'pageType': pageType});\n\n //If the pageType is detected, track the page impression\n if (pageType) {\n events.pageImpression(customerCrmId, pageType, window.location.href, customerEmail);\n var ga4CrmId = customerCrmId && customerCrmId !== 'guest' ? customerCrmId : null;\n events.ga4PageView({\n pageType: pageType,\n pageURL: window.location.origin,\n pagePath: window.location.pathname,\n userID: ga4CrmId,\n loginStatus: ga4CrmId ? 'loggedIn' : 'guest',\n customerType: ga4CrmId ? 'loyal-cutomer' : '',\n country: countryCode\n });\n utils.PageDesignerPromoImpressionHelper();\n }\n //if the pageType can contains products to track the impressions, trigger the event\n if (PageTypeMap.PRODUCT_IMPRESSION_MAPPING[pageType]) {\n triggerProductsImpressions(pageType);\n }\n //if it is a category or brand page, try to get search data\n if (pageType === 'category' || pageType === 'brands') {\n utils.searchHelper();\n } else if (pageType === 'purchase') {\n //if the user lands on purchase page, launch checkout events\n utils.orderConfirmHelper();\n }\n\n // At cart page check for removed items due to unavailability\n if (pageType === 'cart' && $('#unavailableProductsModal').length > 0) {\n utils.removeFromCartByUnavailabilityModal();\n }\n window.dataLayer.push({'event': 'basicAppEventsInitialized'});\n}\n\n$(document).ready(function () {\n pushPageData();\n});\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-index.js","//link the information extracted from pdic.action (or other location) to the analytics pages\n\nconst pageMetaDataUtils = require('../pageMetaDataUtils');\n\nconst PAGE_MAPPING = pageMetaDataUtils.getPageMappingFromMetaDataElement('data-analytics-page-type-mapping');\n\n//specifies the pages where the event for addToCart needs further information\nconst CART_MAPPING = {\n \"category\": \"category\",\n \"wishlist\": \"wishlist view\",\n \"product\": \"product detail page\"\n};\n\n//specifies the pages where the event for add/remove from wishlist needs further information\nconst WISHLIST_MAPPING = {\n \"category\": \"catalog\",\n \"wishlist\": \"wishlist page\",\n \"product\": \"product detail page\"\n};\n\n//specifies in which pages products impression are tracked (the pages that can contain products)\nconst PRODUCT_IMPRESSION_MAPPING = {\n \"account\": false,\n \"billing\": false,\n \"brands\": false,\n \"cart\": true,\n \"category\": true,\n \"checkoutlogin\": false,\n \"content\": false,\n \"home\": true,\n \"ordeConfirmation\": false,\n \"product\": true,\n \"shipping\": false,\n \"wishlist\": true,\n \"storelocator\": false\n};\n\nmodule.exports = {\n PAGE_MAPPING: PAGE_MAPPING,\n CART_MAPPING: CART_MAPPING,\n WISHLIST_MAPPING: WISHLIST_MAPPING,\n PRODUCT_IMPRESSION_MAPPING: PRODUCT_IMPRESSION_MAPPING\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-mapping.js","//link the information extracted from pdic.action (or other location) to the analytics pages\n\nvar getOrSetPageMetaDataAttrElement = function(dataAttrName, val) {\n var metaData = document.getElementsByClassName('page-meta-data');\n metaData = metaData && metaData.length > 0 ? metaData[0] : null;\n\n if (!metaData) {\n return null;\n }\n\n if (!dataAttrName) {\n return null;\n }\n\n // get\n if (typeof val === 'undefined') {\n metaData = metaData.getAttribute(dataAttrName);\n }\n // set\n else {\n metaData.setAttribute(dataAttrName, val);\n }\n\n return metaData;\n};\n\nvar getPageMappingFromMetaDataElement = function(dataAttrName) {\n var metaData = getOrSetPageMetaDataAttrElement(dataAttrName);\n var mapping;\n if (metaData) {\n try {\n mapping = JSON.parse(metaData);\n if (!mapping) {\n // eslint-disable-next-line no-console\n console.log('Error - there was an empty page meta data element on the page !!');\n }\n }\n catch (e) {\n // eslint-disable-next-line no-console\n console.log('Error - while parsing a JSON attribute of a page meta data !!');\n // eslint-disable-next-line no-console\n console.log(e);\n }\n }\n else {\n // eslint-disable-next-line no-console\n console.log('Error - there was a missing page meta data element on the page !!');\n }\n return mapping;\n};\n\nconst PAGE_MAPPING = getPageMappingFromMetaDataElement('data-page-type-mapping');\n\nmodule.exports = {\n PAGE_MAPPING: PAGE_MAPPING,\n getOrSetPageMetaDataAttrElement: getOrSetPageMetaDataAttrElement,\n getPageMappingFromMetaDataElement: getPageMappingFromMetaDataElement\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/pageMetaDataUtils.js","/**\n * Send GA4 event to GTM\n * @param {Object} object GA4 data object\n */\nfunction ga4EventPush(object) {\n if (!object || !object.event) {\n return;\n }\n object.timestamp = Date.now();\n\n // Clear the previous ecommerce object as suggested by google\n window.dataLayer.push({ ecommerce: null });\n // Send data to GTM\n window.dataLayer.push(object);\n}\n\n/**\n * @description push in the data layer the impression of the page\n * @param visitorStatus {String} the status of the user: if it is logged is the customerID, guest if not\n * @param pageType {String} the type of the page, look at analytics-mapping for more information\n * @param url {String} the url of the page\n * @param userEmail {String} the user's email if logged, empty otherwhise\n */\nfunction pageImpression(visitorStatus, pageType, url, userEmail) {\n window.dataLayer.push({\n 'event': 'basicPageData',\n 'visitorStatus': visitorStatus || 'guest',\n 'pageType': pageType,\n 'pageURL': url,\n 'email': userEmail || ''\n });\n}\n\n/**\n * @description push in the data layer the business hours data\n * @param businessHours object is a json that should have a structure like that:\n * {'freshchat': {'on': { 'days': {'mo': '7-12, 12:30-17', 'tu': '8-16', ...}}, 'off': { 'days': [ '14.5', '24.12', '11.4:: 7-18' ] }}}\n */\nfunction businessHours(businessHours) {\n if (businessHours) {\n window.dataLayer.push({\n 'event': 'businessHours',\n 'businessHours': businessHours\n });\n }\n}\n\n/**\n * @description track the search data\n * @param isCategorySearch {Boolean} set true only if the user has landed on page by clicking a category\n * @param keyWord {String} the argoument of the search (could be the category name or the keyword inserted in the searchBar)\n * @param categoryID {String} the id of the category clicked (set null if it is not a category search)\n * @param numberOfResults {Int} the number of results (only if it is not a category search)\n */\nfunction search(isCategorySearch, keyWord, categoryID, numberOfResults) {\n if (isCategorySearch) {\n window.dataLayer.push({\n 'event': 'search',\n 'categoryID': categoryID,\n 'categoryName': keyWord,\n 'ecommerce': {\n 'search_term': keyWord\n }\n });\n } else {\n window.dataLayer.push({\n 'event': 'search',\n 'searchKeyword': keyWord,\n 'numberResults': numberOfResults,\n 'searchType': 'site search',\n 'ecommerce': {\n 'search_term': keyWord\n }\n });\n }\n}\n\n/**\n * @description push in the data layer the impression of products\n * @param currencyCode {String} The unicode of the currency used\n * @param products {Object} contains collection of the products\n */\nfunction trackProductImpression(currencyCode, products) {\n window.dataLayer.push({\n 'event': 'ecommerceTrack',\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'impressions': products\n }\n });\n}\n\n/**\n * @description push in the data layer the product variant data\n * @param currencyCode {String} The currency code used\n * @param products {Object} contains collection products\n */\nfunction variantSelected(currencyCode, products) {\n window.dataLayer.push({\n 'event': 'variantSelection',\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'impressions': products,\n 'detail': products\n }\n });\n}\n\n/**\n * @description track the event addToCart\n * @param currencyCode {String} The currency code used\n * @param products {Object} contains collection products\n * @param pageType {String} the current page type, null if the function is invoked inside the PDP\n * @param customerEmail {String} the customer email if logged\n * @param customerPhone {String} the customer phone if logged\n * @param arTryonInfo {arTryonInfo} object with the tryon flags\n */\nfunction addToCart(currencyCode, products, pageType, customerEmail, customerPhone, arTryonInfo) {\n var eventData = {\n 'event': 'addToCart',\n 'email': customerEmail,\n 'phone': customerPhone,\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'add': {\n 'products': products\n }\n }\n };\n\n //IN-AR TRY ON\n if (arTryonInfo) {\n eventData.tryOnDesktopClick = arTryonInfo.tryOnDesktopClick;\n eventData.tryOnMobileRedirect = arTryonInfo.tryOnMobileRedirect;\n }\n\n if (pageType) {\n eventData.ecommerce.actionField = {};\n eventData.ecommerce.actionField.list = pageType;\n eventData.ecommerce.actionField.action = 'add';\n }\n window.dataLayer.push(eventData);\n}\n\n/**\n * @description track the remove from cart\n * @param products {List} contains collection products\n */\nfunction removeFromCart(products) {\n window.dataLayer.push({\n 'event' : 'removeFromCart',\n 'ecommerce': {\n 'remove': {\n 'products': products\n }\n }\n });\n}\n\n/**\n * @description push into the datalayer the checkout step data\n * @param step {int} The checkout's step\n * @param option {String} checkout's information, based on the steps\n * @param products {List} the products in the basket during the checkout\n */\nfunction pushCheckoutData(step, option, products, customerEmail, customerPhone) {\n if (step === 1 && customerEmail && customerPhone) {\n window.dataLayer.push({\n 'event' : 'ecommerceTrack',\n 'email' : customerEmail,\n 'phone' : customerPhone,\n 'ecommerce': {\n 'checkout': {\n 'actionField': {\n 'step': step,\n 'option': option,\n 'action': 'checkout'\n },\n 'products': products\n }\n }\n });\n } else {\n window.dataLayer.push({\n 'event' : 'ecommerceTrack',\n 'ecommerce': {\n 'checkout': {\n 'actionField': {\n 'step': step,\n 'option': option,\n 'action': 'checkout'\n },\n 'products': products\n }\n }\n });\n }\n}\n\n/**\n * @description the standalone event for purchase, is launched always with the sixth checkout's step\n * @param purchaseData {Object} Purchase data:\n * id {String} the id of the order\n * revenue {Number} the revenue of the order\n * tax {Number} the tax total\n * shipping {Number} the order shipping cost\n * coupon {String} the name of the order coupon\n * products {List} a list of all products purchased\n * customerEmail {String} the customer email\n * customerPhone {String} the customer phone\n * adjustedMerchandizeTotalNetPrice {Decimal} order total net price\n * adjustedMerchandizeTotalTax {Decimal} order total tax\n */\nfunction purchase(purchaseData) {\n window.dataLayer.push({\n 'event' : 'ecommerceTrack',\n 'email' : purchaseData.customerEmail,\n 'phone' : purchaseData.customerPhone,\n 'ecommerce': {\n 'purchase': {\n 'actionField': {\n 'id': purchaseData.id,\n 'affiliation': 'Bata',\n 'revenue': purchaseData.revenue,\n 'adjustedMerchandizeTotalNetPrice': purchaseData.adjustedMerchandizeTotalNetPrice,\n 'adjustedMerchandizeTotalTax': purchaseData.adjustedMerchandizeTotalTax,\n 'tax': purchaseData.tax,\n 'shipping': purchaseData.shipping,\n 'coupon': purchaseData.coupon.couponCodeName,\n 'action': 'purchase',\n },\n 'products': purchaseData.products\n }\n }\n });\n}\n\n/**\n * @description registration of new user into the Bata club\n * @param userId {String} the id of the user\n * @param accountType {String} the type of account used by the user, regular user as default value\n * @param socialNetwork {String} The social network used by the user to sign up, empty string as default value\n */\nfunction registration(userId, email, phone, accountType, socialNetwork) {\n window.dataLayer.push({\n 'event': 'customerContact',\n 'customerID': userId,\n 'email': email,\n 'phone': phone,\n 'accountType': accountType || 'regular user',\n 'socialNetwork': socialNetwork || ''\n });\n}\n\n/**\n * @description login user into the Bata club\n * @param userCrmId {String} the crm id of the user\n * @param accountType {String} the type of account used by the user, regular user as default value\n * @param socialNetwork {String} The social network used by the user to sign up, empty string as default value\n */\nfunction login(customerCrmId, email, accountType, socialNetwork) {\n window.dataLayer.push({\n 'event': 'loggedIn',\n 'customerCrmId': customerCrmId,\n 'email': email,\n 'accountType': accountType || 'regular user',\n 'socialNetwork': socialNetwork || ''\n });\n}\n\n/**\n * @description a product link is clicked from the user (exept from minicart)\n * @param currencyCode {String} The currency code used\n * @param pageType {String} the type of the page, look at analytics-mapping for more information\n * @param products {List} the list that contains the product clicked\n */\nfunction productClick(currencyCode, pageType, products) {\n window.dataLayer.push({\n 'event' : 'productClick',\n 'ecommerce': {\n 'currencyCode': currencyCode,\n 'click': {\n 'actionField': {\n 'list': pageType,\n 'action': 'click'\n },\n 'products': products\n }\n }\n });\n}\n\n/**\n * @description register the impression of the promotions in PDP\n * @param promotions {List} A list of all the promotions displayed\n */\nfunction promoImpression(promotions) {\n window.dataLayer.push({\n 'event' : 'promoView',\n 'ecommerce' : {\n 'promoView': {\n 'promotions': promotions\n }\n }\n });\n}\n\n/**\n * @description register the impression of a promotional banner\n */\nfunction PageDesignerPromoImpression(promotions) {\n window.dataLayer.push({\n 'event' : 'ecommerceTrack',\n 'ecommerce' : {\n 'promoView': {\n 'promotions': promotions\n }\n }\n });\n}\n\n/**\n * @description register the click on a promotional banner\n */\nfunction PageDesignerPromoClick(promotions) {\n window.dataLayer.push({\n 'event': 'promotionClick',\n 'ecommerce' : {\n 'promoClick': {\n 'promotions': promotions\n }\n }\n });\n}\n\n/**\n * @description the generic GAevent, take a look into the official documentation to understand his scope\n */\nfunction trackGAEvent(category, action, label, eventValue, notInteraction) {\n window.dataLayer.push({\n 'event': 'GAevent',\n 'eventCategory': category || '',\n 'eventAction': action || '',\n 'eventLabel': label || '',\n 'eventValue': eventValue || 0,\n 'eventNotInteraction': notInteraction || false\n });\n}\n\n//\n// Google Analytics 4\n\n/**\n * GA4 add_payment_info event\n * @param {Object} checkoutData Checkout data\n * @param {Array.} items items Order items\n */\nfunction ga4AddPaymentInfo(checkoutData, items) {\n ga4EventPush({\n 'event': 'add_payment_info',\n 'ecommerce': {\n 'currency': checkoutData.currency,\n 'payment_type': checkoutData.paymentType,\n 'coupon': checkoutData.coupon,\n 'payment_method_saved': checkoutData.paymentMethodSaved,\n 'value': checkoutData.value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 add_shipping_info event\n * @param {Object} checkoutData Checkout data\n * @param {Array.} items items Order items\n */\nfunction ga4AddShippingInfo(checkoutData, items) {\n ga4EventPush({\n 'event': 'add_shipping_info',\n 'ecommerce': {\n 'currency': checkoutData.currency,\n 'shipping': checkoutData.shipping,\n 'shipping_tier': checkoutData.shippingTier,\n 'coupon': checkoutData.coupon,\n 'value': checkoutData.value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 add_to_cart event\n * @param {String} currencyCode Two-letters currency code\n * @param {Number} value Product price\n * @param {Array.} items Products\n */\nfunction ga4AddToCart(currencyCode, items, value) {\n ga4EventPush({\n 'event': 'add_to_cart',\n 'ecommerce': {\n 'currency': currencyCode,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 add_to_wishlist event\n * @param {String} currencyCode Two-letters currency code\n * @param {Number} value Product price\n * @param {Array.} items Products\n */\nfunction ga4AddToWishlist(currencyCode, items, value) {\n ga4EventPush({\n 'event': 'add_to_wishlist',\n 'ecommerce': {\n 'currency': currencyCode,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 remove_from_wishlist event\n * @param {String} currencyCode Two-letters currency code\n * @param {Number} value Product price\n * @param {Array.} items Products\n */\nfunction ga4RemoveFromWishlist(currencyCode, items, value) {\n ga4EventPush({\n 'event': 'remove_from_wishlist',\n 'ecommerce': {\n 'currency': currencyCode,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 begin_checkout event\n * @param {String} currencyCode Two-letters currency code\n * @param {String} coupon List of used order-level coupons separated by |\n * @param {Number} value Product price\n * @param {Array.} items Cart items\n */\nfunction ga4BeginCheckout(currencyCode, items, coupon, value) {\n ga4EventPush({\n 'event': 'begin_checkout',\n 'ecommerce': {\n 'currency': currencyCode,\n 'coupon': coupon,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 checkout_progress event\n * @param {Object} checkoutData Checkout data object\n * @param {Array.} items Cart items\n */\nfunction ga4CheckoutProgress(checkoutData, items) {\n ga4EventPush({\n 'event': 'checkout_progress',\n 'step_label': checkoutData.stepLabel,\n 'step_number': checkoutData.stepNumber,\n 'ecommerce': {\n 'currency': checkoutData.currencyCode,\n 'coupon': checkoutData.coupon,\n 'value': checkoutData.value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 clear_search event\n */\nfunction ga4ClearSearch() {\n ga4EventPush({'event': 'clear_search'});\n}\n\n/**\n * GA4 Save credit card information\n */\nfunction ga4SaveCreditCard() {\n ga4EventPush({\n 'event': 'save_credit_card',\n });\n}\n\n/**\n * GA4 login event\n * @param {Object} loginData Login data\n */\nfunction ga4Login(loginData) {\n ga4EventPush({\n 'event': 'login',\n 'method': loginData.method,\n 'login_type': loginData.loginType,\n 'ecommerce': {\n 'customerCrmId': loginData.customerCrmId\n }\n });\n}\n\n/**\n * GA4 purchase event\n * @param {Object} purchaseData Purchase related data\n * @param {Array.} items Order items\n */\nfunction ga4Purchase(purchaseData, items) {\n ga4EventPush({\n 'event': 'purchase',\n 'ecommerce': {\n 'currency': purchaseData.currency,\n 'payment_type': purchaseData.paymentType,\n 'shipping': purchaseData.shipping,\n 'shipping_tier': purchaseData.shippingTier,\n 'tax': purchaseData.tax,\n 'transaction_id': purchaseData.transactionId,\n 'coupon': purchaseData.coupon,\n 'value': purchaseData.value,\n 'adjustedMerchandizeTotalNetPrice': purchaseData.adjustedMerchandizeTotalNetPrice,\n 'adjustedMerchandizeTotalTax': purchaseData.adjustedMerchandizeTotalTax,\n 'bata_store': purchaseData.bataStore,\n 'cart_id': purchaseData.cartId,\n 'transaction_type': purchaseData.transactionType,\n 'email': purchaseData.email,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 remove_from_cart event\n * @param {String} currencyCode Two-letters currency code\n * @param {Number} value Product price\n * @param {Array.} items Cart items\n */\nfunction ga4RemoveFromCart(currencyCode, items, value) {\n ga4EventPush({\n 'event': 'remove_from_cart',\n 'ecommerce': {\n 'currency': currencyCode,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 select_item event\n * @param {String} currencyCode Two-letters currency code\n * @param {Array.} items Products\n */\nfunction ga4SelectItem(currencyCode, items) {\n ga4EventPush({\n 'event': 'select_item',\n 'ecommerce': {\n 'currency': currencyCode,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 select_size_guide event\n */\nfunction ga4SelectSizeGuide() {\n window.dataLayer.push({'event': 'select_size_guide'});\n}\n\n/**\n * GA4 select_content event\n * @param {Object} contentData Content related data\n */\nfunction ga4SelectContent(contentData) {\n ga4EventPush({\n 'event': 'select_content',\n 'content_id': contentData.contentId,\n 'content_type': contentData.contentType,\n 'content_name': contentData.contentName\n });\n}\n\n/**\n * GA4 select_promotion event\n * @param {Object} promotionData promotion related data\n */\nfunction ga4SelectPromotion(promotionData) {\n ga4EventPush({\n 'event': 'select_promotion',\n 'promotion_id': promotionData.promotionId,\n 'promotion_name': promotionData.promotionName,\n 'items': [{\n 'item_id': promotionData.promotionId,\n 'item_name': promotionData.promotionName\n }]\n });\n}\n\n/**\n * GA4 select_size_wishlist event\n */\nfunction ga4SelectWishlist() {\n window.dataLayer.push({'event': 'select_wishlist'});\n}\n\n/**\n * GA4 start search event\n */\nfunction ga4StartSearch() {\n ga4EventPush({\n 'event': 'start_search',\n });\n}\n\n/**\n * GA4 select_size_wishlist event\n */\nfunction ga4SearchProduct(searchData) {\n ga4EventPush({\n 'event': 'search',\n 'search_term': searchData.searchTerm,\n 'search_type': searchData.searchType\n });\n}\n\n/**\n * GA4 share event\n * @param {Object} shareData Product\n */\nfunction ga4Share(shareData) {\n ga4EventPush({\n 'event': 'share',\n 'ecommerce': {\n 'method': shareData.method,\n 'content_type': shareData.contentType,\n 'item_id': shareData.itemId\n }\n });\n}\n\n/**\n * GA4 sign_up event\n * @param {Object} registrationData data\n */\nfunction ga4SignUp(registrationData) {\n ga4EventPush({\n 'event': 'sign_up',\n 'signup_form_type': registrationData.signupType,\n 'ecommerce': {\n 'customerCrmId': registrationData.customerCrmId\n }\n });\n}\n\n/**\n * GA4 sign_up event in checkout\n * @param {Object} registrationData data\n */\nfunction ga4SignUpCheckout(registrationData) {\n ga4EventPush({\n 'event': 'sign_up',\n 'signup_form_type': registrationData.signupType\n });\n}\n\n/**\n * GA4 view_cart event\n * @param {String} currencyCode Two-letters currency code\n * @param {String} coupon List of used order-level coupons separated by |\n * @param {Number} value Product price\n * @param {Array.} items Cart items\n */\nfunction ga4ViewCart(currencyCode, items, coupon, value) {\n ga4EventPush({\n 'event': 'view_cart',\n 'ecommerce': {\n 'currency': currencyCode,\n 'coupon': coupon,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 view_item event\n * @param {String} currencyCode Two-letters currency code\n * @param {Array.} items Products\n */\nfunction ga4ViewItem(currencyCode, items, value) {\n ga4EventPush({\n 'event': 'view_item',\n 'ecommerce': {\n 'currency': currencyCode,\n 'value': value,\n 'items': items\n }\n });\n}\n\n/**\n * GA4 view_item_list event\n * @param {String} currencyCode Two-letters currency code\n * @param {Array.} items Products\n */\nfunction ga4ViewItemList(currencyCode, items) {\n ga4EventPush({\n 'event': 'view_item_list',\n 'ecommerce': {\n 'currency': currencyCode,\n 'items': items,\n \"results_number\": items.length\n }\n });\n}\n\n/**\n * GA4 view_promotion event\n * @param {Array.} items Products\n */\nfunction ga4ViewPromotion(items) {\n ga4EventPush({\n 'event': 'view_promotion',\n 'ecommerce': {\n 'items': items\n }\n });\n}\n\n/**\n * GA4 page_view event\n * @param {Object} pageData Page data\n */\nfunction ga4PageView(pageData) {\n ga4EventPush({\n 'event': 'page_view',\n 'page_type': pageData.pageType,\n 'page_url': pageData.pageURL,\n 'page_path': pageData.pagePath,\n 'user_id': pageData.userID,\n 'login_status': pageData.loginStatus,\n 'customer_type': pageData.customerType,\n 'country': pageData.country\n });\n}\n\n/**\n * GA4 click_menu_nav event\n * @param {Number} menuLevel Menu level\n * @param {String} menuSelection Selected menu item name\n */\nfunction ga4ClickMenuNav(menuLevel, menuSelection) {\n ga4EventPush({\n 'event': 'click_menu_nav',\n 'menu_level': menuLevel,\n 'menu_selection': menuSelection\n });\n}\n\n/**\n * GA4 click_filter event\n * @param {String} filterCategory Input type (Checkbox or Slider or ...)\n * @param {String} filterName Filter name\n * @param {String} filterValue Filter selected value\n */\nfunction ga4ClickFilter(filterCategory, filterName, filterValue) {\n ga4EventPush({\n 'event': 'click_filter',\n 'filter_category': filterCategory,\n 'filter_name': filterName,\n 'filter_value': filterValue\n });\n}\n\n/**\n * GA4 scroll event\n * @param {Number} percent Screen scrolled in percent\n */\nfunction ga4Scroll(percent) {\n ga4EventPush({\n 'event': 'scroll',\n 'percent': percent\n });\n}\n\n/**\n * GA4 subscribe event\n * @param {String} subscription_type Subscription type (newsletter)\n */\nfunction ga4Subscribe(subscriptionType) {\n ga4EventPush({\n 'event': 'subscribe',\n 'subscription_type ': subscriptionType\n });\n}\n\n/**\n * GA4 open_pdp_image event\n */\nfunction ga4OpenPdpImage() {\n ga4EventPush({'event': 'open_pdp_image'});\n}\n\nfunction ga4SuccessfulSearch(searchData) {\n ga4EventPush({\n 'event': 'successful_search',\n 'results_number': searchData.resultsNumber,\n 'search_method': searchData.searchMethod,\n 'search_term': searchData.searchTerm\n });\n}\n\nfunction ga4UnsuccessfulSearch(searchData) {\n ga4EventPush({\n 'event': 'unsuccessful_search',\n 'results_number': searchData.resultsNumber,\n 'search_method': searchData.searchMethod,\n 'search_term': searchData.searchTerm\n });\n}\n\nfunction ga4ClickBackInStock(clickBackInStockData) {\n ga4EventPush({\n 'event': 'click_email',\n 'element_id': clickBackInStockData.elementId,\n 'element_text': clickBackInStockData.elementText,\n 'link_url': clickBackInStockData.linkUrl\n });\n}\n// End of Google Analytics 4\n\n\n/**\n * AB testing interaction dataLayer event\n * @param {Array} array of AB tests (from abTests)\n */\nfunction abTestInteraction(list, pageType) {\n if (!list) {\n return;\n }\n\n list.forEach(function(item) {\n window.dataLayer.push({\n event: 'abTestInteraction',\n page_type: pageType && pageType.length > 0 ? pageType : 'other',\n variant_id: item.variant_id,\n variant_name: item.variant_name,\n version_type: item.version_type\n });\n });\n}\n\nmodule.exports = {\n productClick: productClick,\n search: search,\n pageImpression: pageImpression,\n trackProductImpression: trackProductImpression,\n promoImpression: promoImpression,\n PageDesignerPromoImpression: PageDesignerPromoImpression,\n PageDesignerPromoClick: PageDesignerPromoClick,\n variantSelected: variantSelected,\n addToCart: addToCart,\n removeFromCart: removeFromCart,\n pushCheckoutData: pushCheckoutData,\n purchase: purchase,\n registration: registration,\n login: login,\n trackGAEvent: trackGAEvent,\n ga4AddPaymentInfo: ga4AddPaymentInfo,\n ga4AddShippingInfo: ga4AddShippingInfo,\n ga4AddToCart: ga4AddToCart,\n ga4AddToWishlist: ga4AddToWishlist,\n ga4RemoveFromWishlist: ga4RemoveFromWishlist,\n ga4BeginCheckout: ga4BeginCheckout,\n ga4ClearSearch: ga4ClearSearch,\n ga4CheckoutProgress: ga4CheckoutProgress,\n ga4SaveCreditCard: ga4SaveCreditCard,\n ga4ClickBackInStock: ga4ClickBackInStock,\n ga4Login: ga4Login,\n ga4Purchase: ga4Purchase,\n ga4RemoveFromCart: ga4RemoveFromCart,\n ga4SelectItem: ga4SelectItem,\n ga4SelectContent: ga4SelectContent,\n ga4SelectPromotion: ga4SelectPromotion,\n ga4SelectWishlist: ga4SelectWishlist,\n ga4SearchProduct: ga4SearchProduct,\n ga4StartSearch: ga4StartSearch,\n ga4SuccessfulSearch: ga4SuccessfulSearch,\n ga4UnsuccessfulSearch: ga4UnsuccessfulSearch,\n ga4Share: ga4Share,\n ga4SignUp: ga4SignUp,\n ga4SignUpCheckout: ga4SignUpCheckout,\n ga4ViewCart: ga4ViewCart,\n ga4ViewItem: ga4ViewItem,\n ga4ViewItemList: ga4ViewItemList,\n ga4ViewPromotion: ga4ViewPromotion,\n ga4PageView: ga4PageView,\n ga4ClickMenuNav: ga4ClickMenuNav,\n ga4ClickFilter: ga4ClickFilter,\n ga4Scroll: ga4Scroll,\n ga4Subscribe: ga4Subscribe,\n ga4SelectSizeGuide: ga4SelectSizeGuide,\n ga4OpenPdpImage: ga4OpenPdpImage,\n businessHours: businessHours,\n abTestInteraction: abTestInteraction\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-events.js","const PageTypeMap = require('./analytics-mapping');\nvar events = require('./analytics-events');\nvar pageMetaDataUtils = require('../pageMetaDataUtils');\n\n//global variable used for orders\nvar productOrder;\n\nvar scrollPosition = {\n \"25\": false,\n \"50\": false,\n \"75\": false,\n \"100\": false\n};\n\n/**\n * Returns the sales status of a product based on discount data.\n * @param {Object} product - jQuery or plain object representing the product.\n * @returns {string} - \"on sale\" if discounted, otherwise \"full price\".\n */\nfunction getSalesStatus(product) {\n var isSalesStatus = product instanceof jQuery ? product.data('discount') : product.discount;\n return isSalesStatus ? \"on sale\" : \"full price\";\n}\n\n/**\n * Extend analytics product with categories related to Google Analytics 4\n * @param {Object} product Analytics product\n * @param {Object} productData Product data\n * @param {Object} attributeName Analytics product's attribute name (postfix number will be added)\n * @returns Extended analytics product\n */\nfunction extendProductDataWithGA4Categories(product, productData, attributeName) {\n if (!product || !productData) {\n return;\n }\n attributeName = attributeName || 'category';\n let index;\n let key;\n for (index = 1; index <= 5; index++) {\n if (productData) {\n if (!productData['category' + index]) {\n continue;\n }\n }\n key = attributeName + index;\n // GA4 first category attribute does not contain postfix number\n if (attributeName === 'item_category' && index === 1) {\n key = attributeName;\n }\n if (productData) {\n product[key] = productData['category' + index];\n }\n }\n return product;\n}\n\n/**\n * GA4 Get item_list_id by product data\n * @param {Object} product Product object\n * @returns {String} GA4 list id\n */\nfunction ga4GetProductItemListId(product) {\n if (!product) {\n return;\n }\n if (product.listId) {\n return product.listId;\n }\n // check saved list id after click on product tile\n if (window.bata_com_ns.analytics.pageType === \"product\" && document.referrer) {\n try {\n let listId = window.sessionStorage.getItem(\"analyticsListId\");\n if (listId) {\n window.sessionStorage.removeItem(\"analyticsListId\");\n $('.analytics-productPDP.analytics-product').data('listId', listId);\n return listId;\n }\n } catch (error) {\n // sessionStorage not supported\n }\n }\n\n // set current category id and path for PLP\n if (window.bata_com_ns.analytics.pageType === \"category\" || window.bata_com_ns.analytics.pageType === \"brands\") {\n var categoryId = $(\"div.grid-footer > input.category-id\").val() || $('.js-analytics-search-category').data('analytics-category-id');\n if (categoryId) {\n return categoryId;\n } else {\n return \"product search result\";\n }\n }\n if (window.bata_com_ns.analytics.pageType === \"product\") {\n return \"detail\";\n }\n return product.list || window.bata_com_ns.analytics.pageType;\n}\n\n/**\n * GA4 formatted product items\n * @param {Array} products Analytics products\n * @returns GA4 formatted product items list\n */\nfunction ga4GetProducts(products) {\n if (!products || !products.length) {\n return [];\n }\n var mappedProducts = [];\n mappedProducts = products.map(function(product) {\n let isSalesStatus = getSalesStatus(product);\n let ga4Product = {\n item_id: product.id,\n item_name: product.name,\n index: product.position || 0,\n item_brand: product.brand,\n price: parseFloat(product.price),\n quantity: product.quantity || 1,\n item_dimension1: product.dimension1 || \"\",\n item_dimension2: product.dimension2 || \"\",\n item_dimension3: product.dimension3 || \"\",\n item_sales_status: isSalesStatus\n };\n\n extendProductDataWithGA4Categories(ga4Product, product, 'item_category');\n if (product.size) {\n ga4Product.item_size = product.size;\n }\n if (product.variant) {\n ga4Product.item_variant = product.variant;\n }\n if (product.coupon) {\n ga4Product.coupon = product.coupon;\n }\n if (product.discount) {\n ga4Product.discount = parseFloat(product.discount);\n }\n if (product.promotionName) {\n ga4Product.promotion_id = product.promotionName;\n ga4Product.promotion_name = product.promotionName;\n }\n ga4Product.item_list_id = ga4GetProductItemListId(product);\n ga4Product.item_list_name = ga4Product.item_list_id;\n if (product.genderName) {\n ga4Product.item_gender = product.genderName;\n }\n if (product.itemSeason) {\n ga4Product.item_season = product.itemSeason;\n }\n if (product.stockStatus) {\n ga4Product.item_stock_status = product.stockStatus;\n }\n return ga4Product;\n });\n return mappedProducts;\n}\n\n/**\n * GA4 Get value of products\n * @param {Arrray} products products to be evaluated\n * @returns value of all products in array\n */\nfunction ga4GetProductsValue(products) {\n let value = products.reduce((accumulator, product) => {\n return accumulator + parseFloat(product.price) * product.quantity;\n }, 0);\n return parseFloat(value);\n}\n\n/**\n * GA4 Get cart page data\n */\nfunction ga4GetCartData() {\n var $cartInfo = $('#analytics-cartInfo');\n return {\n couponNames: $cartInfo.data('coupons-name'),\n value: $cartInfo.data('value')\n };\n}\n\n/**\n * GA4 formatted promotion items\n * @param {Array} products Analytics promotions\n * @returns GA4 formatted promotion items list\n */\nfunction ga4GetPromotions(promotions) {\n if (!promotions || !promotions.length) {\n return [];\n }\n var mappedPromotions = [];\n mappedPromotions = promotions.map(function(promotion) {\n return {\n item_id: promotion.id,\n promotion_id: promotion.id,\n promotion_name: promotion.name,\n creative_name: promotion.creative,\n creative_slot: promotion.position\n };\n });\n return mappedPromotions;\n}\n\n/**\n * @description extract the user email and phone from menuAccount - analytics-user, populated after login\n * @return user {obj} an object with the customer email and phone\n */\nfunction getCustomerEmailAndPhone() {\n var $user = $('#analytics-user');\n var customerEmail = $user.data('email') ? $user.data('email') : '';\n var customerPhone = $user.data('phone') ? $user.data('phone') : '';\n\n return {\n customerEmail,\n customerPhone\n };\n}\n\n/**\n * @description get the product tile information\n * @param $product {div} the analytics-product div where the data will be extracted\n * @return product {Object} a the product Object contains the analytics informations\n */\nfunction getProductBaseData($product) {\n var product = {\n 'name': $product.data('name'),\n 'id': $product.data('id'),\n 'price': $product.data('price'),\n 'brand': $product.data('brand'),\n 'category': $product.data('category'),\n 'discount': $product.data('discount'),\n 'promotionName': $product.data('promotionName')\n };\n let size = $product.data('size');\n if (size) {\n product.size = size;\n }\n let listId = $product.data('listId');\n if (listId) {\n product.listId = listId;\n }\n let genderName = $product.data('gender-name');\n if (genderName) {\n product.genderName = genderName;\n }\n let itemSeason = $product.data('item-season');\n if (itemSeason) {\n product.itemSeason = itemSeason;\n }\n let stockStatus = $product.data('stock-status');\n if (stockStatus) {\n product.stockStatus = stockStatus;\n }\n return product;\n}\n\n/**\n * @description get the product tile information\n * @param $product {div} the analytics-tileproduct div where the data will be extracted\n * @return product {Object} a the product Object contains the analytics tiles informations\n */\nfunction getProductTileData($product) {\n var color = $product.data('color'),\n size = $product.data('size');\n var variant = size ? color + ' | ' + size : color;\n var product = getProductBaseData($product);\n product.variant = variant;\n\n // quantity\n var quantity = $product.data('quantity');\n if (typeof quantity !== 'undefined' && quantity !== null && !isNaN(quantity)) {\n product.quantity = parseInt(quantity);\n }\n\n // custom attributes - dimensions\n var dimension1 = $product.data('dimension1');\n if (dimension1) {\n product.dimension1 = dimension1;\n }\n var dimension2 = $product.data('dimension2');\n if (dimension2) {\n product.dimension2 = dimension2;\n }\n var dimension3 = $product.data('dimension3');\n if (dimension3) {\n product.dimension3 = dimension3;\n }\n\n // ga4 categories\n extendProductDataWithGA4Categories(product, $product.data());\n\n return product;\n}\n\n/**\n * @description get the product tile information with also the three dimensions and the tryon\n * @param $product {div} the analytics-tileproduct div where the data will be extracted\n * @return product {Object} a the product Object contains the analytics informations\n */\nfunction getProductTileDataExtended($product) {\n var product = getProductTileData($product);\n product.dimension1 = $product.data('dimension1');\n product.dimension2 = $product.data('dimension2');\n product.dimension3 = $product.data('dimension3');\n //IN-AR TRY ON\n if ($product.data('opened-in-ar-tryon')) {\n product.openedInArTryon = $product.data('opened-in-ar-tryon');\n }\n\n return product;\n}\n\n/**\n * @description extract all the products impressions from the dom\n * @param index {number} the index to start the position of the products\n * @return products {list} a list of all the products showed in page\n */\nfunction getProductsData(index) {\n var products = [],\n product,\n $product;\n var position = index || 0;\n //track the plp products\n var $productsPLP = $('.analytics-ProductList .analytics-product.unregistered');\n if ($productsPLP.length > 1) {\n $productsPLP.each(function() {\n $product = $(this);\n product = getProductTileData($product);\n $product.data('position', position);\n product.position = position;\n product.list = window.bata_com_ns.analytics.pageType;\n position++;\n products.push(product);\n\n $product.removeClass('unregistered');\n });\n } else {\n product = getProductTileData($productsPLP);\n if (!product.id) {\n return;\n }\n $productsPLP.data('position', position);\n product.position = position;\n product.list = window.bata_com_ns.analytics.pageType;\n position++;\n products.push(product);\n\n $productsPLP.removeClass('unregistered');\n }\n window.bata_com_ns.analytics.productsDisplayed = position;\n return products;\n}\n\n/**\n * @description extract all the products impressions from the search dom\n * @param index {number} the index to start the position of the products\n * @return products {list} a list of all the products showed in page\n */\nfunction getProductsDataSearch(index) {\n var products = [],\n product,\n $product;\n var position = index;\n var list = window.bata_com_ns.analytics.pageType + ' search suggestion';\n //get the search products's data from the DOM\n var $productsSearch = $('.analytics-ProductList .analytics-product-search.unregistered');\n if ($productsSearch.length > 1) {\n $productsSearch.each(function() {\n $product = $(this);\n product = getProductTileData($product);\n $product.data('position', position);\n product.position = position;\n product.list = list;\n product.item_list_id = list;\n position++;\n products.push(product);\n\n $product.removeClass('unregistered');\n });\n } else {\n product = getProductTileData($productsSearch);\n $productsSearch.data('position', position);\n product.position = position;\n product.list = list;\n product.item_list_id = list;\n position++;\n products.push(product);\n\n $productsSearch.removeClass('unregistered');\n }\n return products;\n}\n\n/**\n * @description extract all the products impressions from the cart in dom (cart or minicart)\n * @param pageType {String} the location where the event is triggered\n * @return products {list} a list of all the products showed in cart\n */\nfunction getProductsCartData(pageType) {\n var products = [],\n product,\n $product;\n\n var $productsElements = $('.analytics-cart > .analytics-product.unregistered');\n if ($productsElements.length > 1) {\n $productsElements.each(function() {\n $product = $(this);\n product = getProductTileData($product);\n product.position = $product.data('position');\n product.list = pageType;\n product.listId = $product.data('listId');\n products.push(product);\n $product.removeClass('unregistered');\n });\n } else if ($productsElements.length === 1) {\n product = getProductTileData($productsElements);\n product.position = $productsElements.data('position');\n product.list = pageType;\n product.listId = $productsElements.data('listId');\n products.push(product);\n $productsElements.removeClass('unregistered');\n }\n return products;\n}\n\n/**\n * @description extract all the products data from checkout page\n * @param step {Int} the checkout's step\n * @param isCartOpened {boolean} optional: set on true only for checkout's step where the products's data needs to be picked from cart or minicart\n * @return products {list} a list of all the products showed in checkout page\n */\nfunction getCheckoutProducts(step, isCartOpened) {\n var products = [],\n product,\n $product,\n $checkoutProducts;\n //if the minicart was opened means that some products could have been deleted (available only in the first and second checkout step)\n if (step < 2 && isCartOpened) {\n //if the user is in cart page picks the product's data directly from the main cart (and not from the minicart)\n if (window.bata_com_ns.analytics.pageType === 'cart') {\n $checkoutProducts = $('.js-analytics-MainCart .analytics-cart > .analytics-product');\n } else {\n $checkoutProducts = $('.analytics-cart > .analytics-product');\n }\n } else {\n $checkoutProducts = $('.js-analytics-checkout > .analytics-product');\n }\n var elementsFound = $checkoutProducts.length;\n if (elementsFound === 0) {\n products = productOrder;\n } else if (elementsFound > 1) {\n $checkoutProducts.each(function() {\n $product = $(this);\n product = getProductTileDataExtended($product);\n product.quantity = parseInt($product.data('quantity'));\n products.push(product);\n });\n } else {\n product = getProductTileDataExtended($checkoutProducts);\n product.quantity = parseInt($checkoutProducts.data('quantity'));\n products.push(product);\n }\n\n return products;\n}\n\n/**\n * @description simulate a page impression for checkout updates\n * @param order {OrderModel} the relative order model\n */\nfunction setCheckoutProducts(order) {\n productOrder = [];\n var products = order.items.items;\n var analyticsProduct,\n variants;\n products.forEach(function(product) {\n if (product.variationAttributes.length > 1) {\n variants = product.variationAttributes[0].displayValue + ' | ' + product.variationAttributes[1].localizedSize || product.variationAttributes[1].displayValue;\n } else {\n variants = product.variationAttributes[0].displayValue;\n }\n analyticsProduct = {\n 'name': product.productName,\n 'id': product.id,\n 'dimension1': product.masterProductID,\n 'dimension2': product.articleNo,\n 'dimension3': product.variationGroupID,\n 'price': product.price.sales.decimalPrice,\n 'brand': product.brand,\n 'category': product.primaryCategoryID,\n 'variant': variants,\n 'quantity': product.quantity || 1,\n 'discount': product.discount,\n 'promotionName': product.promotionName,\n 'listId': product.analyticsListId,\n 'genderName': product.genderName,\n 'itemSeason': product.itemSeason,\n 'stockStatus': product.stockStatus\n };\n if (product.size) {\n analyticsProduct.size = product.size;\n }\n extendProductDataWithGA4Categories(analyticsProduct, product);\n productOrder.push(analyticsProduct);\n });\n}\n\n/**\n * @description extract the page type from the dom\n * @return pageType {String} the type of the page, mapped on analytics-pagemapping.js\n */\nfunction getPageType() {\n var pageType = $('.page-meta-data').data('page-type');\n return pageType;\n}\n\n/**\n * @description determine if this is a search page and proceed to extract search's data, the track the event\n */\nfunction searchHelper() {\n var $search = $('.js-analytics-search-keyword');\n\n var isCategorySearch = false,\n keyword = null,\n categoryId = null,\n numberOfResults = null;\n\n if ($search.length > 0) {\n numberOfResults = $search.data('analytics-results-number');\n } else {\n //it's a category search\n isCategorySearch = true;\n $search = $('.js-analytics-search-category');\n categoryId = $search.data('analytics-category-id');\n }\n\n keyword = $search.data('analytics-keyword');\n\n if (keyword && keyword.length > 0) {\n let searchData = {\n resultsNumber: numberOfResults && numberOfResults > 0 ? numberOfResults : 0,\n searchMethod: \"standard\",\n searchTerm: keyword\n };\n\n if (searchData.resultsNumber > 0) {\n events.ga4SuccessfulSearch(searchData);\n } else {\n events.ga4UnsuccessfulSearch(searchData);\n }\n }\n\n events.search(isCategorySearch, keyword, categoryId, numberOfResults);\n}\n\n/**\n * @description extract the data from the PDP dom and return a product formatted\n * @return product {Object} the product formatted\n */\nfunction getPDPProduct() {\n var $product = $('.analytics-productPDP');\n var color = $product.data('color'),\n size = $product.data('size');\n var variant = size ? color + ' | ' + size : color;\n var isSalesStatus = getSalesStatus($product);\n\n var product = {\n 'name': $product.data('name'),\n 'id': $product.data('id'),\n 'dimension1': $product.data('dimension1'),\n 'dimension2': $product.data('dimension2'),\n 'dimension3': $product.data('dimension3'),\n 'price': $product.data('price'),\n 'brand': $product.data('brand'),\n 'category': $product.data('category'),\n 'description': $product.data('description'),\n 'productUrl': $product.data('canonicalUrl'),\n 'categoryUrl': $product.data('categoryurl'),\n 'imageUrl': $product.data('imageurl'),\n 'variant': variant,\n 'promotionName': $product.data('promotionName'),\n 'discount': $product.data('discount'),\n 'listId': $product.data('listId'),\n 'genderName': $product.data('gender-name'),\n 'itemSeason': $product.data('item-season'),\n 'stockStatus': $product.data('stock-status'),\n 'itemSalesStatus': isSalesStatus\n };\n if (size) {\n product.size = size;\n }\n extendProductDataWithGA4Categories(product, $product.data());\n return product;\n}\n\n/**\n * @description get all the products's impression from the DOM\n * @return products {List} a list of products impression\n */\nfunction getProductDataPDP() {\n var products = [];\n var product = getPDPProduct();\n products.push(product);\n return products;\n}\n\n/**\n * @description get the product tile information\n * @param $product {div} the analytics-tileproduct div where the data will be extracted\n * @return product {Object} a the product Object contains the analytics informations\n */\nfunction getProductClickTileData($product) {\n var color = $product.data('color'),\n size = $product.data('size');\n var variant = size ? color + ' | ' + size : color;\n var isSalesStatus = getSalesStatus($product);\n\n var product = {\n 'name': $product.data('name'),\n 'id': $product.data('id'),\n 'dimension1': $product.data('dimension1'),\n 'dimension2': $product.data('dimension2'),\n 'dimension3': $product.data('dimension3'),\n 'price': $product.data('price'),\n 'brand': $product.data('brand'),\n 'category': $product.data('category'),\n 'position': $product.data('position'),\n 'variant': variant,\n 'discount': $product.data('discount'),\n 'promotionName': $product.data('promotionName'),\n 'list': window.bata_com_ns.analytics.pageType,\n 'listId': $product.data('listId'),\n 'genderName': $product.data('gender-name'),\n 'itemSeason': $product.data('item-season'),\n 'stockStatus': $product.data('stock-status'),\n 'item_sales_status': isSalesStatus\n };\n if (size) {\n product.size = size;\n }\n extendProductDataWithGA4Categories(product, $product.data());\n return product;\n}\n\n/**\n * @description get all the promo informations, then launch the event\n */\nfunction promoHelper(promotions) {\n if (promotions && promotions.length > 0) {\n var promo,\n analyticsPromotionsData = [];\n //get all promotions data and build the analytics promo object\n for (var i = 0; i < promotions.length; i++) {\n promo = promotions[i];\n analyticsPromotionsData.push({\n 'id': promo.id,\n 'name': promo.name,\n 'creative': '',\n 'position': promo.rank || 'center'\n });\n }\n var ga4Promotions = ga4GetPromotions(analyticsPromotionsData);\n events.ga4ViewPromotion(ga4Promotions);\n events.promoImpression(analyticsPromotionsData);\n }\n}\n\n/**\n * @description get all the promo information from the DOM, then process to pass the formatted data\n */\nfunction promoImpressionHelper() {\n var $promo = $('span.analytics-promotion');\n var promotions = [],\n promo = {\n 'id': $promo.data('id'),\n 'name': $promo.data('name'),\n 'rank': $promo.data('rank')\n };\n promotions.push(promo);\n promoHelper(promotions);\n}\n\n/**\n * @description get all the pagedesigner promo information from the DOM, then process to pass the formatted data\n */\nfunction PageDesignerPromoImpressionHelper() {\n var analyticsPromotionsData = [];\n var $productsElements = $('.js-analytics-banner');\n if ($productsElements.length > 1) {\n $productsElements.each(function() {\n var $banner = $(this);\n if ($banner.data(\"analytics-title\") && $banner.data(\"analytics-title\") !== \"\" && $banner.data(\"analytics-title\") !== \"No title\") {\n analyticsPromotionsData.push({\n 'id': $banner.data(\"analytics-title\"),\n 'name': $banner.data(\"analytics-title\")\n });\n }\n });\n if (analyticsPromotionsData.length) {\n var ga4Promotions = ga4GetPromotions(analyticsPromotionsData);\n events.ga4ViewPromotion(ga4Promotions);\n events.PageDesignerPromoImpression(analyticsPromotionsData);\n }\n }\n}\n\n/**\n * @description Extract the data from the variation product, then call the event\n * @param product {Object} The new variation product selected\n */\nfunction variationClickHelper(product) {\n // The master category is always contained in the last breadcrumb, so the variation group ID\n var masterCategory = product.breadcrumbs && product.breadcrumbs.length > 0 ? product.breadcrumbs[product.breadcrumbs.length - 1] : null;\n\n // Extract product details\n var productName = product.productName,\n productID = product.id,\n masterProductID = product.masterProductID,\n articleNo = product.custom.articleNo,\n variationGroupID = masterCategory ? masterCategory.variationGroupID : '',\n price = product.price.sales.decimalPrice,\n brand = product.brand,\n categoryID = masterCategory ? masterCategory.id : '',\n description = product.longDescription,\n productUrl = product.canonicalUrl,\n categoryUrl = masterCategory ? new URL(masterCategory.url, document.baseURI).href : '',\n imageUrl = product.images.large[0].url,\n promotionName = product.promotionName,\n discount = product.discount,\n isSalesStatus = getSalesStatus(product),\n stockStatus = product.stockStatus,\n genderName = product.genderName,\n itemSeason = product.itemSeason,\n color,\n size,\n variation;\n // Detect the color selected\n for (let i = 0; i < product.variationAttributes[0].values.length; i++) {\n variation = product.variationAttributes[0].values[i];\n if (variation.selected) {\n color = variation.displayValue;\n }\n }\n // Detect the size selected, only if the size variation exist\n for (let i = 0; i < product.variationAttributes[1].values.length; i++) {\n variation = product.variationAttributes[1].values[i];\n if (variation.selected) {\n size = variation.localizedSize || variation.displayValue;\n }\n }\n var variant = size ? color + ' | ' + size : color;\n var $analyticsProduct = $('.analytics-productPDP');\n\n // Prepare the products object for analytics\n var products = [{\n 'name': productName,\n 'id': productID,\n 'dimension1': masterProductID,\n 'dimension2': articleNo,\n 'dimension3': variationGroupID,\n 'price': price,\n 'brand': brand,\n 'category': categoryID,\n 'description': description,\n 'productUrl': productUrl,\n 'categoryUrl': categoryUrl,\n 'imageUrl': imageUrl,\n 'variant': variant,\n 'promotionName': promotionName,\n 'discount': discount,\n 'listId': $analyticsProduct.data('listId'),\n 'genderName': genderName,\n 'itemSeason': itemSeason,\n 'stockStatus': stockStatus,\n 'item_sales_status': isSalesStatus\n }];\n if (size) {\n products.size = size;\n }\n extendProductDataWithGA4Categories(products[0], product);\n var ga4Products = ga4GetProducts(products);\n\n events.ga4SelectItem(window.bata_com_ns.analytics.currency, ga4Products);\n // Launch the event variantSelected\n events.variantSelected(window.bata_com_ns.analytics.currency, products);\n // Update the analytics producs data in the DOM, so it's ready for addToCart event\n $analyticsProduct.data('name', productName);\n $analyticsProduct.data('id', productID);\n $analyticsProduct.data('dimension1', masterProductID);\n $analyticsProduct.data('dimension2', articleNo);\n $analyticsProduct.data('dimension3', variationGroupID);\n $analyticsProduct.data('price', price);\n $analyticsProduct.data('brand', brand);\n $analyticsProduct.data('category', categoryID);\n $analyticsProduct.data('description', description);\n $analyticsProduct.data('canonicalUrl', productUrl);\n $analyticsProduct.data('categoryurl', categoryUrl);\n $analyticsProduct.data('imageurl', imageUrl);\n $analyticsProduct.data('color', color);\n $analyticsProduct.data('size', size);\n $analyticsProduct.data('category1', product.category1);\n $analyticsProduct.data('category2', product.category2);\n $analyticsProduct.data('category3', product.category3);\n $analyticsProduct.data('category4', product.category4);\n $analyticsProduct.data('category5', product.category5);\n $analyticsProduct.data('discount', product.discount);\n $analyticsProduct.data('promotionName', product.promotionName);\n $analyticsProduct.data('gender-name', genderName);\n $analyticsProduct.data('item-season', itemSeason);\n $analyticsProduct.data('stock-status', stockStatus);\n $analyticsProduct.data('item_sales_status', isSalesStatus);\n\n // Also collect the new possible promotions displayed\n promoHelper(product.promotions);\n\n // Update PDP analytics data for \"share\" event\n if (window.bata_com_ns.analytics.pageType === \"product\") {\n $('ul.social-icons').data('analytics-pid', variationGroupID);\n }\n}\n\n/**\n * @description simulate a page impression for checkout updates\n */\nfunction checkoutUpdate() {\n var $checkout = $('#checkout-main');\n var step = $checkout.attr('data-checkout-stage');\n step = PageTypeMap.PAGE_MAPPING[step] || step;\n window.bata_com_ns.analytics.pageType = step;\n\n // set page-meta tag so that it's in sync with window.bata_com_ns.analytics.pageType\n pageMetaDataUtils.getOrSetPageMetaDataAttrElement('data-analytics-page-type', step);\n\n // set page-meta tag so that it's in sync with page's pageType\n pageMetaDataUtils.getOrSetPageMetaDataAttrElement('data-page-type', pageMetaDataUtils.PAGE_MAPPING[step] || step);\n\n var customerType = $checkout.data('customer-crm-id') || 'guest';\n var customerEmail = $checkout.data('customer-email') || '';\n\n events.pageImpression(customerType, step, window.location.href, customerEmail);\n var customerCrmId = $checkout.data('customer-crm-id');\n var ga4CrmId = customerCrmId && customerCrmId !== 'guest' ? customerCrmId : null;\n events.ga4PageView({\n pageType: step,\n pageURL: window.location.origin,\n pagePath: window.location.pathname,\n userID: ga4CrmId,\n loginStatus: ga4CrmId ? 'loggedIn' : 'guest',\n customerType: ga4CrmId ? 'loyal-cutomer' : '',\n country: window.bata_com_ns.analytics.country\n });\n}\n\n/**\n * @description simulate a page impression for checkout updates\n * @param $analyticsProduct {element} the div(s) that contains all the product's data\n * @returns products {List} a list that contains the product'data clicked\n */\nfunction productClickHelper($analyticsProduct) {\n var products = [],\n product;\n //if the minicart is opened, there can be multiple tile of the same product, so pick the first one available\n $analyticsProduct = $analyticsProduct.length > 1 ? $analyticsProduct.first() : $analyticsProduct;\n\n product = getProductClickTileData($analyticsProduct);\n products.push(product);\n\n return products;\n}\n\n/**\n * @description launch both of the events for addToCart event\n * @param $product {element} the div that contains all the product's data\n * @param arTryonInfo {arTryonInfo} IN-AR TRY ON object with the tryon flags\n */\nfunction addToCartHelper($product, arTryonInfo) {\n var product,\n products = [],\n pageType = window.bata_com_ns.analytics.pageType,\n pageView;\n\n if (pageType !== 'product' && $product) {\n product = getProductTileDataExtended($product);\n product.list = pageType;\n pageView = PageTypeMap.CART_MAPPING[pageType];\n } else {\n product = getPDPProduct();\n }\n product.quantity = 1;\n products.push(product);\n\n var currUser = getCustomerEmailAndPhone(),\n ga4Products = ga4GetProducts(products);\n\n events.ga4AddToCart(window.bata_com_ns.analytics.currency, ga4Products, parseFloat(product.price) * product.quantity);\n events.addToCart(window.bata_com_ns.analytics.currency, products, pageView, currUser.customerEmail, currUser.customerPhone, arTryonInfo);\n events.trackGAEvent(pageType, 'add to bag', product.id);\n}\n\n/**\n * @description launch both of the events for removeFromCart event\n * @param $product {element} the div that contains all the product's data\n * @param pageType {String} the page type where the product is removed\n * @param singleItem {String} only single item was removed from a cart\n */\nfunction removeFromCartHelper($product, pageType, singleItem) {\n var product,\n products = [];\n\n product = getProductTileData($product);\n product.position = $product.data('position');\n product.quantity = singleItem ? 1 : parseInt($product.data('quantity'));\n product.list = pageType;\n product.dimension1 = $product.data('dimension1');\n product.dimension2 = $product.data('dimension2');\n product.dimension3 = $product.data('dimension3');\n products.push(product);\n\n var ga4Products = ga4GetProducts(products);\n events.ga4RemoveFromCart(window.bata_com_ns.analytics.currency, ga4Products, ga4GetProductsValue(ga4Products));\n events.removeFromCart(products);\n events.trackGAEvent(pageType, 'remove', product.id);\n}\n\n/**\n * @description launch the event addToWishlist\n * @param pid {String} the product's ID added\n */\nfunction addToWishlistHelper(pid, $product) {\n var product = getProductClickTileData($product);\n var ga4Products = ga4GetProducts([product]);\n events.ga4AddToWishlist(window.bata_com_ns.analytics.currency, ga4Products, parseFloat(product.price || 0));\n events.trackGAEvent(PageTypeMap.WISHLIST_MAPPING[window.bata_com_ns.analytics.pageType], 'wishlist add', pid);\n}\n\n/**\n * @description launch the event removeFromWishlist\n * @param pid {String} the product's ID removed\n */\nfunction removeFromWishlistHelper(pid, $product) {\n var product = getProductClickTileData($product);\n var ga4Products = ga4GetProducts([product]);\n events.ga4RemoveFromWishlist(window.bata_com_ns.analytics.currency, ga4Products, parseFloat(product.price || 0));\n events.trackGAEvent(PageTypeMap.WISHLIST_MAPPING[window.bata_com_ns.analytics.pageType], 'wishlist remove', pid);\n}\n\n/**\n * @description launch the checkout's events\n * @param step {int} the checkout's step\n * @param options {Object} various information, step based\n * @param isMiniCartOpened {boolean} optional: set on true only for checkout's second step, if the minicart has been opened\n */\nfunction checkouStepHelper(step, options, isMiniCartOpened) {\n var products = getCheckoutProducts(step, isMiniCartOpened);\n var currUser = getCustomerEmailAndPhone();\n\n // GA4 begin_checkout (cart -> checkout)\n if (step === 1) {\n let ga4Products = ga4GetProducts(products);\n let ga4CartData = ga4GetCartData();\n events.ga4BeginCheckout(window.bata_com_ns.analytics.currency, ga4Products, ga4CartData.couponNames, ga4CartData.value);\n }\n\n if (step === 2) {\n let ga4Products = ga4GetProducts(products);\n let checkoutData = {\n stepLabel: \"shipping info\",\n stepNumber: 2\n };\n events.ga4CheckoutProgress(checkoutData, ga4Products);\n }\n\n // GA4 checkout_progress (payment page load)\n if (step === 3) {\n let ga4Products = ga4GetProducts(products);\n let ga4CartData = ga4GetCartData();\n let checkoutData = {\n currencyCode: window.bata_com_ns.analytics.currency,\n coupon: ga4CartData && ga4CartData.couponNames,\n value: ga4CartData && ga4CartData.value,\n stepLabel: \"payment info\",\n stepNumber: 3\n };\n events.ga4CheckoutProgress(checkoutData, ga4Products);\n }\n\n events.pushCheckoutData(step, options, products, currUser.customerEmail, currUser.customerPhone);\n}\n\n/**\n * @description launch the checkout's events\n * @param step {int} the checkout's step\n * @param options {Object} various information, step based\n * @param order {Object} the order in execution\n */\nfunction updateCheckoutData(step, options, order) {\n var option;\n // in case of multiple payment methods concatenate them (only for CO step 4)\n if (step === 4) {\n for (var i = 0; i < options.length; i++) {\n if (i === 0) {\n option = options[i].paymentMethod;\n } else {\n option += (' | ' + options[i].paymentMethod);\n }\n }\n } else {\n option = options;\n }\n\n setCheckoutProducts(order);\n var products = productOrder;\n\n // GA4 payment\n if (step === 4 && order) {\n let ga4Products = ga4GetProducts(products);\n let checkoutData = {\n currency: window.bata_com_ns.analytics.currency,\n paymentType: order.billing && order.billing.payment && order.billing.payment.selectedPaymentInstruments && order.billing.payment.selectedPaymentInstruments.length && order.billing.payment.selectedPaymentInstruments[0].labelMethod,\n coupon: order.couponsName,\n paymentMethodSaved: order.paymentMethodSaved,\n value: order.totals && order.totals.grandTotalDecimal\n };\n events.ga4AddPaymentInfo(checkoutData, ga4Products);\n }\n events.pushCheckoutData(step, option, products);\n}\n\n/**\n * @description launch the event order confirmation\n */\nfunction orderConfirmHelper() {\n var step = 5;\n var products = getCheckoutProducts(step, false);\n events.pushCheckoutData(step, 'orderconfirmation', products);\n var $checkoutInfo = $('#analytics-checkoutInfo');\n var coupon = {\n 'couponCodeName': $checkoutInfo.data('coupons-name'),\n 'couponDiscount': $checkoutInfo.data('coupons-discount')\n };\n var currUser = getCustomerEmailAndPhone();\n var couponNames = coupon.couponCodeName;\n\n var ga4Products = ga4GetProducts(products);\n var ga4PurchaseData = {\n currency: window.bata_com_ns.analytics.currency,\n affiliation: 'Bata',\n transactionId: $checkoutInfo.data('id'),\n value: parseFloat($checkoutInfo.data('revenue')),\n shipping: parseFloat($checkoutInfo.data('shipping')),\n shippingTier: $checkoutInfo.data('shipping-tier'),\n paymentType: $checkoutInfo.data('payment-type'),\n tax: $checkoutInfo.data('tax'),\n adjustedMerchandizeTotalNetPrice: $checkoutInfo.data('adjustedMerchandizeTotalNetPrice'),\n adjustedMerchandizeTotalTax: $checkoutInfo.data('adjustedMerchandizeTotalTax'),\n bataStore: $checkoutInfo.data('bataStore'),\n cartId: $checkoutInfo.data('cartId'),\n transactionType: $checkoutInfo.data('transactionType'),\n email: $checkoutInfo.data('email')\n };\n if (couponNames) {\n ga4PurchaseData.coupon = couponNames;\n }\n events.ga4Purchase(ga4PurchaseData, ga4Products);\n\n events.purchase({\n id: $checkoutInfo.data('id'),\n revenue: $checkoutInfo.data('revenue'),\n tax: $checkoutInfo.data('tax'),\n shipping: $checkoutInfo.data('shipping'),\n coupon: coupon,\n products: products,\n customerEmail: currUser.customerEmail,\n customerPhone: currUser.customerPhone,\n adjustedMerchandizeTotalNetPrice: $checkoutInfo.data('adjustedMerchandizeTotalNetPrice'),\n adjustedMerchandizeTotalTax: $checkoutInfo.data('adjustedMerchandizeTotalTax')\n });\n}\n\n/**\n * @description update the analytics product quantity in Cart page\n * @param productID {String} the product's ID\n * @param quantity {Int} the quantity of the product\n */\nfunction updateProductQuantity(productID, quantity) {\n var analyticsSelector = '.js-analytics-MainCart .analytics-product.' + productID;\n $(analyticsSelector).data('quantity', quantity);\n}\n\n\n/**\n * @description gets business hours (they are defined within Site preferences - businessHours field)\n */\nfunction getBusinessHours() {\n var $bh = $('.analytics-businessHours');\n var content = $bh && $bh.length ? $bh.data('content') : null;\n return content;\n}\n\n\n/**\n * @description extract the data from the cart unavailability modal and fire removeFromCart event\n */\nfunction removeFromCartByUnavailabilityModal() {\n var products = [],\n $product,\n $removedProducts = $('#unavailableProductsModal .cc-cart-item');\n\n var elementsFound = $removedProducts.length;\n if (elementsFound > 0) {\n $removedProducts.each(function() {\n $product = $(this);\n var product = {};\n product.id = $product.data('id');\n product.quantity = parseInt($product.data('quantity'));\n product.price = $product.data('priceTotal');\n products.push(product);\n });\n }\n\n var ga4Products = ga4GetProducts(products);\n events.ga4RemoveFromCart(window.bata_com_ns.analytics.currency, ga4Products, ga4GetProductsValue(ga4Products));\n events.removeFromCart(products);\n}\n\n/**\n * Track recommendations products view\n * @param {Object} recommendationContainer recommendation element\n */\nfunction trackRecommendationsLists(recommendationContainer) {\n var product,\n $product,\n $recommendation;\n // loop recommendations carousels\n var $recommendations = $(recommendationContainer) || $('.recommendations');\n if ($recommendations.length > 0) {\n $recommendations.each(function() {\n $recommendation = $(this);\n var position = 0;\n var products = [];\n var recommendationName = $recommendation.find('.carousel-title').first().html().trim() || 'recommendation';\n var $products = $recommendation.find('.analytics-product.unregistered');\n if ($products.length > 0) {\n // loop products in a recommendation carousel\n $products.each(function() {\n $product = $(this);\n product = getProductTileData($product);\n // skip invalid product\n if (!product.id) {\n return;\n }\n product.position = position;\n $product.data('position', position);\n product.listId = recommendationName;\n $product.data('listId', recommendationName);\n position++;\n products.push(product);\n $product.removeClass('unregistered');\n });\n }\n if (products.length === 0) {\n return;\n }\n // enhance product object with GA4 attributes\n var ga4Products = ga4GetProducts(products);\n // track products view event\n events.ga4ViewItemList(window.bata_com_ns.analytics.currency, ga4Products);\n });\n }\n return;\n}\n\n/**\n * Track scroll position\n */\nfunction trackScrollPosition() {\n let scrollPercent = (($(window).scrollTop() / ($(document).height() - $(window).height())) * 100).toFixed();\n [25, 50, 75, 100].some(function(position) {\n if (scrollPercent < position) {\n return true;\n }\n if (scrollPercent >= position && !scrollPosition[position.toString()]) {\n scrollPosition[position.toString()] = true;\n events.ga4Scroll(position);\n return true;\n }\n });\n}\n\n/**\n * Parse abTests data off the page's DOM\n * Only active and visible ab tests are there (div's data)\n */\nfunction getABtestsDataFromDOM(abTestId) {\n var list = [];\n $('.abTestsSegmentData').each(function() {\n var id = $(this).data('id');\n var segment = $(this).data('segment');\n\n if (typeof id !== 'undefined' && id !== null && id.length > 0 &&\n typeof segment !== 'undefined' && segment !== null && segment.length > 0 &&\n (!(typeof abTestId !== 'undefined' && abTestId !== null && abTestId.length > 0) || abTestId === id)) {\n var params = {\n variant_id: id,\n variant_name: segment,\n version_type: $(this).data('is-control-segment') ? 'control' : 'variant'\n };\n list.push(params);\n }\n });\n return list;\n}\n\n/**\n * Call ab test interection event that pushes active ab test data to the dataLayer\n * @param {Object} params - example: {abTestId: null, pageType: 'other'}\n */\nfunction callAbTestInteraction(params) {\n var abTestId = null;\n var pageType = 'other';\n\n if (params) {\n abTestId = params.abTestId && params.abTestId.length > 0 ? params.abTestId : abTestId;\n if (params.pageType && params.pageType.length > 0) {\n pageType = params.pageType;\n }\n else if (window.bata_com_ns && window.bata_com_ns.pageType && window.bata_com_ns.pageType.length > 0) {\n pageType = window.bata_com_ns.pageType;\n }\n }\n\n events.abTestInteraction(getABtestsDataFromDOM(abTestId), pageType);\n}\n\n\nmodule.exports = {\n extendProductDataWithGA4Categories: extendProductDataWithGA4Categories,\n ga4GetProductItemListId: ga4GetProductItemListId,\n ga4GetProducts: ga4GetProducts,\n ga4GetPromotions: ga4GetPromotions,\n productClickHelper: productClickHelper,\n getProductTileDataExtended: getProductTileDataExtended,\n variationClickHelper: variationClickHelper,\n checkoutUpdate: checkoutUpdate,\n addToCartHelper: addToCartHelper,\n getProductsCartData: getProductsCartData,\n removeFromCartHelper: removeFromCartHelper,\n addToWishlistHelper: addToWishlistHelper,\n removeFromWishlistHelper: removeFromWishlistHelper,\n getPageType: getPageType,\n searchHelper: searchHelper,\n getProductDataPDP: getProductDataPDP,\n getProductsData: getProductsData,\n getProductsDataSearch: getProductsDataSearch,\n checkouStepHelper: checkouStepHelper,\n getCheckoutProducts: getCheckoutProducts,\n orderConfirmHelper: orderConfirmHelper,\n updateCheckoutData: updateCheckoutData,\n setCheckoutProducts: setCheckoutProducts,\n promoHelper: promoHelper,\n promoImpressionHelper: promoImpressionHelper,\n getProductClickTileData: getProductClickTileData,\n updateProductQuantity: updateProductQuantity,\n removeFromCartByUnavailabilityModal: removeFromCartByUnavailabilityModal,\n PageDesignerPromoImpressionHelper: PageDesignerPromoImpressionHelper,\n getBusinessHours: getBusinessHours,\n ga4GetCartData: ga4GetCartData,\n trackRecommendationsLists: trackRecommendationsLists,\n trackScrollPosition: trackScrollPosition,\n getABtestsDataFromDOM: getABtestsDataFromDOM,\n callAbTestInteraction: callAbTestInteraction\n};\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-utils.js","'use strict';\nvar utils = require('./analytics-utils');\nvar events = require('./analytics-events');\n\n/**\n * @description variationClick listener\n * @param response {Object} an object that contains the fullproduct as an attribute (response.product)\n */\n$('body').on('product:afterAttributeSelect', function(e, response) {\n utils.variationClickHelper(response.data.product);\n});\n\n/**\n * @description addToCart listener\n * @param data {Object} a data object containing:\n * -productID: the id of the product added to the cart with pageType,\n * -tryOnDesktopClick: true if the user clicked on the tryon button on Desktop,\n * -tryOnMobileRedirect: true if the user used the tryon funcionality and got redirected back on Mobile\n */\n$('body').on('analytics:addToCart', function(e, data) {\n var $product,\n analyticsTileSelector = '.analytics-ProductList .analytics-product.' + data.productID,\n tile = $(analyticsTileSelector),\n //IN-AR TRY ON\n arTryonInfo = {};\n\n //tryOnDesktopClick and tryOnMobileRedirect are not null only if the tryon logic is active\n if (data.tryOnDesktopClick && data.tryOnDesktopClick !== null && data.tryOnMobileRedirect && data.tryOnMobileRedirect !== null) {\n arTryonInfo.tryOnDesktopClick = data.tryOnDesktopClick;\n arTryonInfo.tryOnMobileRedirect = data.tryOnMobileRedirect;\n } else {\n arTryonInfo = null;\n }\n //the tile will be > 0 only if the event is originated outside the PDP\n if (tile.length > 0) {\n $product = tile;\n } else {\n $product = $('.analytics-productPDP');\n }\n\n if (data.pageType === 'cart') {\n analyticsTileSelector = '.analytics-cart > .analytics-product.' + data.productID;\n tile = $(analyticsTileSelector);\n $product = tile;\n }\n\n utils.addToCartHelper($product, arTryonInfo);\n});\n\n/**\n * @description removeFromCart listener\n * @param pid {String} the id of the product added to the cart\n * @param pageType {String} the page type where the action is committed\n */\n$('body').on('analytics:removeFromCart', function(e, data) {\n var $product;\n //the cart tiles must be the at first child level of analytics-cart\n var analyticsTileSelector = '.analytics-cart > .analytics-product.' + data.productID;\n var tile = $(analyticsTileSelector);\n\n $product = tile;\n utils.removeFromCartHelper($product, data.pageType, data.singleItem);\n});\n\n/**\n * @description removeFromCartBySystem listener\n */\n$('body').on('analytics:removeFromCartBySystem', function() {\n utils.removeFromCartByUnavailabilityModal();\n});\n\n/**\n * @description addToWishlist listener\n * @param pid {String} the id of the product added\n */\n$('body').on('analytics:addToWishlist', function(e, pid) {\n var $analyticsProduct;\n if (utils.getPageType() === \"product\") {\n // PDP\n $analyticsProduct = $('.analytics-productPDP');\n } else {\n $analyticsProduct = $('.analytics-product.' + pid);\n }\n utils.addToWishlistHelper(pid, $analyticsProduct);\n});\n\n/**\n * @description removeFromWishlist listener\n * @param pid {String} the id of the product removed\n */\n$('body').on('analytics:removeFromWishlist', function(e, pid) {\n var $analyticsProduct;\n if (utils.getPageType() === \"product\") {\n $analyticsProduct = $('.analytics-productPDP');\n } else {\n $analyticsProduct = $('.analytics-product.' + pid);\n }\n utils.removeFromWishlistHelper(pid, $analyticsProduct);\n});\n\n/**\n * @description launch the checkout update data and impressions\n */\n$('body').on('analytics:checkoutUpdateState', function() {\n utils.checkoutUpdate();\n});\n\n/**\n * @description collect the new product impressions\n */\n$('body').on('analytics:productsLoaded', function() {\n\n //get the number of the products already registered, then collect the new products and launch the impression\n var numberProductAlreadyDisplayed = window.bata_com_ns.analytics.productsDisplayed || 0;\n var products = utils.getProductsData(numberProductAlreadyDisplayed);\n var ga4Products = utils.ga4GetProducts(products);\n events.ga4ViewItemList(window.bata_com_ns.analytics.currency, ga4Products);\n events.trackProductImpression(window.bata_com_ns.analytics.currency, products);\n});\n\n/**\n * @description collect the new search suggestion products\n */\n$('body').on('analytics:searchProductLoaded', function(e, searchTerm) {\n let searchData = {\n resultsNumber: $('.js-analytics-searchProduct [id^=\"product-\"]').length || 0,\n searchMethod: \"autosuggested\",\n searchTerm: searchTerm\n };\n\n if (searchData.resultsNumber > 0) {\n var products = utils.getProductsDataSearch(0);\n var ga4Products = utils.ga4GetProducts(products);\n\n events.ga4SuccessfulSearch(searchData);\n events.ga4ViewItemList(window.bata_com_ns.analytics.currency, ga4Products);\n events.trackProductImpression(window.bata_com_ns.analytics.currency, products);\n } else {\n events.ga4UnsuccessfulSearch(searchData);\n }\n});\n\n/**\n * @description standard search\n */\n$('body').on('analytics:searchProduct', function(e, searchTerm) {\n if (searchTerm && searchTerm.length) {\n var searchData = {\n searchTerm: searchTerm,\n searchType: \"standard\"\n };\n events.ga4SearchProduct(searchData);\n }\n});\n\n/**\n * @description user clicked on an product image on the product description page\n */\n$(document).on('click', '.cc-pdp-carousel-item[data-target=\"#pdpImgModal\"]', function() {\n events.ga4OpenPdpImage();\n return true;\n});\n\n/**\n * @description It is triggered when a user clicks the \"X\" button on the search bar, which is\n * used to clear the text entered by the user.\n */\n$(document).on('click', '.js-resetSearch.cc-search__reset', function() {\n events.ga4ClearSearch();\n return true;\n});\n\n/**\n * @description register the product click (PLP. CART, CAROUSELS ETC.)\n */\n$(document).on('click', 'a.js-analytics-productClick', function(e) {\n e.preventDefault();\n\n var $product = $(this);\n var url = $product.attr('href'),\n productId = $product.data('analytics-product-id'),\n $analyticsProduct;\n if ($product.hasClass(\"js-analytics-suggestionProduct\")) {\n // Product suggestion on product search\n $analyticsProduct = $('.analytics-product-search.' + productId);\n } else {\n $analyticsProduct = $('.analytics-product.' + productId);\n }\n\n var products = utils.productClickHelper($analyticsProduct),\n analyticsInfo = window.bata_com_ns.analytics;\n\n // save GA4 item list id\n try {\n let listId = utils.ga4GetProductItemListId(products && products.length && products[0]);\n window.sessionStorage.setItem(\"analyticsListId\", listId);\n } catch (error) {\n // session storage not supported\n }\n\n var ga4Products = utils.ga4GetProducts(products);\n events.ga4SelectItem(analyticsInfo.currency, ga4Products);\n events.productClick(analyticsInfo.currency, analyticsInfo.pageType, products);\n\n window.location.href = url;\n});\n\n/**\n * @description user clicked on a size guide link on a PDP page\n */\n$(document).on('click', '#size-guide-asset', function() {\n events.ga4SelectSizeGuide();\n return true;\n});\n\n/**\n * @description user clicked on a wishlist link in the account menu\n */\n$(document).on('click', '.menu-container a[href*=\"wishlist\"]', function() {\n events.ga4SelectWishlist();\n return true;\n});\n\n/**\n * @description user clicked on a wishlist link in the header\n */\n$(document).on('click', '.wishlistLink', function() {\n events.ga4SelectWishlist();\n return true;\n});\n\n/**\n * @description user clicked on a search bar in the header\n */\n$(document).on('click', '.js-headerSearchButton', function () {\n events.ga4StartSearch();\n});\n\n/**\n * @description register the click on a suggested product\n */\n$(document).on('click', '.js-analytics-suggestionProduct', function() {\n events.trackGAEvent('Ecommerce', 'Suggestion Click', $(this).attr('href'));\n});\n\n/**\n * @description register the display of the cookiesbar\n */\n$('body').on('analytics:showCookieBar', function() {\n events.trackGAEvent('cookie bar', 'shown', '-', 0, true);\n});\n\n/**\n * @description register the closing of cookiesbar\n */\n$('.js-cookies-bar-close').on('click', function() {\n events.trackGAEvent('cookie bar', 'accepted', '-', 0, true);\n});\n\n/**\n * @description register the click on a promotional banner\n */\n$(document).on('click', 'a.js-analytics-banner, a.js-analytics-banner-button', function(e) {\n e.preventDefault();\n var analyticsPromotionsData = [];\n var $banner = $(this);\n var url = $banner.attr('href');\n\n if ($banner.data(\"analytics-title\") && $banner.data(\"analytics-title\") !== \"\" && $banner.data(\"analytics-title\") !== \"No title\") {\n analyticsPromotionsData.push({\n 'id': $banner.data(\"analytics-title\"),\n 'name': $banner.data(\"analytics-title\")\n });\n events.ga4SelectContent({\n contentId: $banner.data(\"analytics-title\"),\n contentType: 'banner',\n contentName: $banner.data(\"analytics-title\")\n });\n events.ga4SelectPromotion({\n promotionId: $banner.data(\"analytics-title\"),\n promotionName: $banner.data(\"analytics-title\")\n });\n events.PageDesignerPromoClick(analyticsPromotionsData);\n }\n\n window.location.href = url;\n});\n\n/**\n * @description the user select a product sorting rule\n * @param sorting {Int} the sort id selected\n */\n$('body').on('analytics:updateProductSorting', function(e, data) {\n events.ga4ClickFilter(\"Radio\", \"Sort by\", data.sorting);\n events.trackGAEvent(window.bata_com_ns.analytics.pageType, 'sorting', data.sorting);\n});\n\n/**\n * @description register the refinement clicks (not the price one)\n */\n$('.container').on('click', '.js-analytics-refinement', function(e) {\n e.preventDefault();\n var $refinement = $(this);\n events.ga4ClickFilter(\"Checkbox\", $refinement.data('refinement-id'), $refinement.data('refinement-value'));\n events.trackGAEvent(window.bata_com_ns.analytics.pageType, 'filter - ' + $refinement.data('refinement-id'), $refinement.data('refinement-value'));\n});\n\n/**\n * @description register the category clicks\n */\n$('.container').on('click', '.js-categoryItem', function(e) {\n e.preventDefault();\n var $refinement = $(this);\n events.ga4ClickFilter(\"Category selection\", $refinement.data('category-id'), $refinement.data('category-title'));\n events.trackGAEvent(window.bata_com_ns.analytics.pageType, 'filter - ' + $refinement.data('category-id'), $refinement.data('category-title'));\n});\n\n/**\n * @description register the \"proceed to checkout\" button click from cart page\n */\n$('#cart-page-checkout-btn').on('click', function(e) {\n e.preventDefault();\n utils.checkouStepHelper(1, 'cart', true);\n});\n\n/**\n * @description register the \"proceed to checkout\" button click from the minicart\n */\n$('body').on('analytics:cartSubmit', function() {\n utils.checkouStepHelper(1, 'minicart', true);\n});\n\n/**\n * @description register the checkout step\n * @param step {Int} the step number\n * @param option {Object} various information, step based\n */\n$('body').on('analytics:checkoutStep', function(e, data) {\n //step 3 and 4 replace the products's informations displayed, so we need to extract them directly from the order object\n if (data.order) {\n const checkbox = $('.adyen-checkout__checkbox__input[name=\"storeDetails\"]');\n if (checkbox.length) {\n data.order.paymentMethodSaved = checkbox.prop('checked');\n } else {\n data.order.paymentMethodSaved = false;\n }\n utils.updateCheckoutData(data.step, data.option, data.order);\n } else {\n utils.checkouStepHelper(data.step, data.option);\n }\n});\n\n/**\n * @description register the second checkout step\n */\n$('body').on('analytics:loginStep', function (e, data) {\n var options = $('#checkout-main').attr('data-customer-type') === 'registered' ? 'Logged In' : 'Guest';\n utils.checkouStepHelper(data.step, options, false);\n});\n\n/**\n * @description a new user has registered from the registration form\n * @param customerId {String} the ID of the customer registered\n */\n$('body').on('analytics:registration', function(e, data) {\n events.ga4SignUp({\n method: 'email',\n customerCrmId: data.customerCrmId,\n signupType: 'standard'\n });\n events.registration(data.customerId, data.email, data.phone);\n});\n\n/**\n * @description new registration submit in checkout with lightregistration\n */\n$('body').on('analytics:registrationCheckout', function() {\n events.ga4SignUpCheckout({\n signupType: 'checkout'\n });\n});\n\n/**\n * @description a user has logged in\n * @param customerCrmId {String} the CRM ID of the logged in customer\n */\n$('body').on('analytics:login', function(e, data) {\n events.ga4Login({\n method: 'email',\n customerCrmId: data.customerCrmId,\n loginType: data.isLoginCheckout ? 'checkout' : 'standard'\n });\n events.login(data.customerCrmId, data.email);\n});\n\n/**\n * @description socialShareClick event on PDP\n */\n$('a.js-analytics-socialIcon').on('click', function() {\n var $social = $(this);\n\n var socialName = $social.data('share'),\n productId = $social.closest('ul.social-icons').data('analytics-pid');\n\n var contentType = 'product detail page';\n events.ga4Share({\n method: socialName,\n contentType: contentType,\n itemId: productId\n });\n events.trackGAEvent(contentType, 'social media sharing - ' + socialName, productId);\n});\n\n/**\n * @description storeAvailibility event on PDP\n */\n$('body').on('analytics:storeAvailibility', function() {\n events.trackGAEvent('storeAvailibility', 'click', $('button#findInStoreButton').data('pid'));\n});\n\n/**\n * @description Handles click on the first level category and tracks the event\n */\n$('.cc-menu__level__link.cc-menu__firstLevel__link').on('click', function() {\n var $category = $(this).closest('.cc-menu__level__link.cc-menu__firstLevel__link');\n var categoryName = $category.attr('aria-label') || $category.text().trim();\n events.ga4ClickMenuNav(1, categoryName);\n});\n\n/**\n * @description Handles click on the second level category of menu\n */\n$('.cc-menu__secondLevel__link-wrapper .cc-menu__level__link.cc-menu__secondLevel__link').on('click', function() {\n var $category = $(this);\n var categoryName = $category.attr('aria-label') || $category.text().trim();\n var parentCatName = $(this).closest('.cc-menu__level.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').attr('aria-label');\n events.ga4ClickMenuNav(2, parentCatName + \" - \" + categoryName);\n events.trackGAEvent('dropdown', parentCatName, categoryName);\n});\n\n/**\n * @description Handles click on the second level content links of menu\n */\n$('.cc-menu__secondLevel__content-link__item a').on('click', function() {\n var $link = $(this);\n var categoryName = $link.text().trim();\n events.ga4ClickMenuNav(2, categoryName);\n});\n\n/**\n * @description Handles click on the third level category of menu\n */\n$('.cc-menu__level__link.cc-menu__thirdLevel__link').on('click', function() {\n var $category = $(this);\n var thirdCatName = $category.attr('aria-label') || $category.text().trim();\n var secondCatName = $category.closest('.cc-menu__thirdLevel').prev('.cc-menu__secondLevel__link-wrapper').find('.cc-menu__secondLevel__link').attr('aria-label') || $category.closest('.cc-menu__thirdLevel').prev('.cc-menu__secondLevel__link-wrapper').find('.cc-menu__secondLevel__title').text().trim();\n var firstCatName = $category.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').attr('aria-label') || $category.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').find('.cc-menu__firstLevel__title').text().trim();\n var parentCatName = firstCatName + ' - ' + secondCatName;\n events.ga4ClickMenuNav(3, parentCatName + \" - \" + thirdCatName);\n events.trackGAEvent('dropdown', parentCatName, thirdCatName);\n});\n\n/**\n * @description Handles click on the highlights section buttons of third level menu\n */\n$('.cc-menu__HighlightsSection__cta').on('click', function() {\n var $button = $(this);\n var buttonText = $button.text().trim();\n var secondCatName = $button.closest('.cc-menu__HighlightsSection').prev('.cc-menu__secondLevelColumn').find('.cc-menu__secondLevel__link').attr('aria-label') || $button.closest('.cc-menu__HighlightsSection').prev('.cc-menu__secondLevelColumn').find('.cc-menu__secondLevel__title').text().trim();\n var firstCatName = $button.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').attr('aria-label') || $button.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').find('.cc-menu__firstLevel__title').text().trim();\n var parentCatName = firstCatName + ' - ' + secondCatName;\n events.ga4ClickMenuNav(3, parentCatName + \" - \" + buttonText);\n events.trackGAEvent('highlight section', parentCatName, buttonText);\n});\n\n/**\n * @description Handles click on the multiple block section links\n */\n$('.cc-menu__blockForMultipleBlocksSection__link').on('click', function() {\n var $link = $(this);\n var blockTitle = $link.find('.cc-menu__blockForMultipleBlocksSection__text').text().trim();\n var secondCatName = $link.closest('.cc-menu__multipleBlockSection').prev('.cc-menu__secondLevelColumn').find('.cc-menu__secondLevel__link').attr('aria-label') || $link.closest('.cc-menu__multipleBlockSection').prev('.cc-menu__secondLevelColumn').find('.cc-menu__secondLevel__title').text().trim();\n var firstCatName = $link.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').attr('aria-label') || $link.closest('.cc-menu__secondLevel').siblings('.cc-menu__level__link.cc-menu__firstLevel__link').find('.cc-menu__firstLevel__title').text().trim();\n var parentCatName = firstCatName + ' - ' + secondCatName;\n events.ga4ClickMenuNav(3, parentCatName + \" - \" + blockTitle);\n events.trackGAEvent('collection block', parentCatName, blockTitle);\n});\n\n/**\n * @description Handles click on a category in the mobile menu, fetches parent and current category, and tracks the event\n */\n$(document).on('click', '.js-category-container .cc-menu__secondLevel__link', function() {\n var $category = $(this);\n if (!$category.data('subcategories')) {\n var parent = $category.data('analytics-parent');\n var name = $category.data('name') || $category.attr('aria-label') || $category.text().trim();\n if (parent) {\n events.ga4ClickMenuNav(2, parent + \" - \" + name);\n events.trackGAEvent('dropdown', parent, name);\n } else {\n events.ga4ClickMenuNav(1, name);\n events.trackGAEvent('main menu', name, '', 0, true);\n }\n }\n});\n\n/**\n * @description register the quantity variation of product\n * @param pid {String} the id of the product changed\n * @param qty {Int} the new quantity selected\n */\n$('body').on('analytics:updateProductQuantity', function(e, data) {\n utils.updateProductQuantity(data.pid, data.qty);\n});\n\n/**\n * @description variationSelectedPLP listener\n * @param pid {pid} the id of the product added to the cart\n */\n$('body').on('analytics:variantSelectionPLP', function(e, data) {\n let product = data.productData;\n var products = [{\n 'name': product.name,\n 'id': product.id,\n 'dimension1': product.dimension1,\n 'dimension2': product.dimension2,\n 'dimension3': product.dimension3,\n 'price': product.price,\n 'brand': product.brand,\n 'category': product.category,\n 'description': product.description,\n 'productUrl': product.producturl,\n 'categoryUrl': product.categoryurl,\n 'imageUrl': product.imageurl,\n 'variant': product.color + (product.size ? \" | \" + product.size : \"\"),\n 'discount': product.discount,\n 'promotionName': product.promotionName,\n 'position': product.position,\n 'genderName': product.genderName,\n 'itemSeason': product.itemSeason,\n 'stockStatus': product.stockStatus\n }];\n utils.extendProductDataWithGA4Categories(products[0], product);\n var ga4Products = utils.ga4GetProducts(products);\n events.ga4SelectItem(window.bata_com_ns.analytics.currency, ga4Products);\n //launch the event variantSelected\n events.variantSelected(window.bata_com_ns.analytics.currency, products);\n});\n\n/**\n * @description Checkout progress event\n * @param data {String} checkout step name\n */\n$('body').on('analytics:checkoutProgress', function() {\n var products = utils.getCheckoutProducts(3, false);\n var ga4Products = utils.ga4GetProducts(products);\n var ga4CheckoutData = utils.ga4GetCartData();\n var checkoutData = {\n currencyCode: window.bata_com_ns.analytics.currency,\n coupon: ga4CheckoutData.couponNames,\n value: ga4CheckoutData.value,\n stepLabel: \"customer info\",\n stepNumber: 1\n };\n events.ga4CheckoutProgress(checkoutData, ga4Products);\n});\n\n/**\n * @description collect the cart product views / impressions\n */\n$('body').on('analytics:viewMiniCart', function() {\n var products = utils.getProductsCartData(window.bata_com_ns.analytics.pageType);\n var ga4Products = utils.ga4GetProducts(products);\n events.ga4ViewItemList(window.bata_com_ns.analytics.currency, ga4Products);\n events.trackProductImpression(window.bata_com_ns.analytics.currency, products);\n});\n\n/**\n * @description collect the recommendations products views\n */\n$('body').on('analytics:recommendationsLoaded', function(e, recommendationContainer) {\n utils.trackRecommendationsLists(recommendationContainer);\n});\n\n/**\n * @description GA4 track checkout progress\n */\n$('body').on('analytics:shippingSubmitted', function(e, order) {\n if (!order) {\n return;\n }\n var products = utils.getCheckoutProducts(3, false);\n let ga4Products = utils.ga4GetProducts(products);\n let checkoutData = {\n currency: window.bata_com_ns.analytics.currency,\n shipping: order.totals && order.totals.shippingTotalAfterDiscountValue,\n shippingTier: order.shipping && order.shipping.length && order.shipping[0].selectedShippingMethod && order.shipping[0].selectedShippingMethod.displayName,\n coupon: order.couponsName,\n value: order.totals && order.totals.grandTotalDecimal\n };\n events.ga4AddShippingInfo(checkoutData, ga4Products);\n});\n\n/**\n * @description GA4 newsletter form submitted\n */\n$('body').on('analytics:newsletterSubscribe', function() {\n events.ga4Subscribe(\"newsletter\");\n});\n\n/**\n * @description GA4 Add to cart submitting -> extend the form with analytics list id\n */\n$('body').on('analytics:addToCartSubmitting', function(e, form) {\n if (window.bata_com_ns.analytics.pageType === \"category\") {\n form.analyticsListId = $(\"div.grid-footer > input.category-id\").val() || $('.js-analytics-search-category').data('analytics-category-id') || 'product search';\n } else if (window.bata_com_ns.analytics.pageType === \"product\") {\n form.analyticsListId = $('.analytics-productPDP.analytics-product').data('listId') || 'detail';\n } else {\n form.analyticsListId = 'detail';\n }\n});\n\n$('body').on('analytics:clickBackInStock', function(e, buttonData) {\n if (!buttonData || !$('#product-id').length) {\n return;\n }\n\n const productId = $('#product-id').val();\n const elementId = buttonData.id || '';\n const elementMessage = buttonData.message || '';\n\n let $analyticsProduct;\n\n if (utils.getPageType() === \"product\") {\n $analyticsProduct = $('.analytics-productPDP');\n } else {\n $analyticsProduct = $(`.analytics-product.${productId}`);\n }\n\n const clickBackInStockData = {\n 'linkUrl': $analyticsProduct.data('producturl') || '',\n 'elementId': elementId,\n 'elementText': elementMessage,\n };\n events.ga4ClickBackInStock(clickBackInStockData);\n});\n\n/**\n * @description GA4 scroll position\n */\n$(window).bind('scroll', function() {\n utils.trackScrollPosition();\n});\n\n$('body').on('change', 'input[name=\"storeDetails\"]', function() {\n events.ga4SaveCreditCard();\n});\n\n\n\n// WEBPACK FOOTER //\n// ./cartridges/app_bata_sfra/cartridge/client/default/js/analytics/analytics-listener.js"],"sourceRoot":""}