{"version":3,"sources":["webpack:///webpack/bootstrap 4b14b2fe0d2f00fd3acc?6fbb*******","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","ga4BrandSelectContent","selectContentData","ga4UnsuccessfulSearch","ga4Share","shareData","itemId","link_domain","linkDomain","type","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","ga4BrandSecondCategoryLevel","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","stopPropagation","brandElement","closest","heroBannerElement","sorting","$refinement","checkbox","prop","customerId","isLoginCheckout","$social","socialName","hostname","$category","text","parentCatName","siblings","thirdCatName","secondCatName","prev","$button","buttonText","$link","blockTitle","parent","qty","producturl","categoryurl","imageurl","ga4CheckoutData","shippingTotalAfterDiscountValue","selectedShippingMethod","displayName","form","secondLevelData","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 4b14b2fe0d2f00fd3acc","'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 'element_id': shareData.elementId,\n 'element_text': shareData.elementText,\n 'link_url': shareData.linkUrl,\n 'link_domain': shareData.linkDomain,\n 'type': shareData.type\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\nfunction ga4BrandSelectContent(selectContentData) {\n ga4EventPush({\n 'event': 'select_content',\n 'content_id': selectContentData.contentId,\n 'content_type': selectContentData.contentType,\n 'content_name': selectContentData.contentName\n });\n}\n// End of Google Analytics 4\n\nfunction ga4BrandSecondCategoryLevel(eventData) {\n ga4EventPush({\n 'event': 'click_menu_nav',\n 'menu_level': eventData.menuLevel,\n 'menu_selection': eventData.menuSelection,\n });\n}\n\n// End of Google Analytics 4\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 ga4BrandSelectContent: ga4BrandSelectContent,\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 ga4BrandSecondCategoryLevel: ga4BrandSecondCategoryLevel,\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$(document).on('click', '.js-analytics-selectContentBrand .cc-component-textbox-cta', function(e) {\n e.preventDefault();\n e.stopPropagation();\n\n const brandElement = $(this).closest('.js-analytics-selectContentBrand');\n const heroBannerElement = $(this).closest('.js-analytics-herobanner');\n\n if (!brandElement.length || !heroBannerElement.length) {\n return;\n }\n\n const contentType = brandElement.attr('data-analytics-select-content-brand');\n const contentName = heroBannerElement.attr('data-analytics-select-content-name');\n const contentId = heroBannerElement.attr('data-analytics-select-content-id');\n\n if (!contentType || !contentName || !contentId) {\n return;\n }\n\n const selectContentData = {\n contentId: contentId,\n contentType: `${contentType} - banner content`,\n contentName: contentName\n };\n\n events.ga4BrandSelectContent(selectContentData);\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 elementId = $social.data('id'),\n elementText = $social.attr('title'),\n linkUrl = $social.attr('href'),\n linkDomain = linkUrl ? new URL(linkUrl).hostname : null,\n type = $social.data('content-type');\n\n var contentType = 'product detail page';\n events.ga4Share({\n method: socialName,\n contentType: contentType,\n itemId: productId,\n elementId: elementId,\n elementText: elementText,\n linkUrl: linkUrl,\n linkDomain: linkDomain,\n content_type: linkDomain,\n type: type\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:brandSecondCategoryLevel', function(secondLevelData) {\n const eventData = {\n menuLevel:\"2 - second level category brand\",\n menuSelection: secondLevelData || \"\",\n };\n events.ga4CheckoutProgress(eventData);\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":""}