{"version":3,"file":"ga4.min.js","mappings":"MA0MA,SAASA,EAAoBC,EAAOC,GAChC,IAAIC,EAAW,GACXC,EAAQ,EACRC,EAAW,GAEfJ,EAAMK,SAAQ,SAAUC,GACpB,MAAMC,EAAeN,IAAaK,EAAKE,gBAAkBF,EAAKE,gBAAgBC,YAAc,IAEtFC,GADUC,EAAWL,GACd,CAETM,UAAWN,EAAKO,YAChBC,UAAWR,EAAKQ,UAAYR,EAAKS,kBAAoB,GAAGC,aAKxDT,IACAG,EAAKO,cAAgBV,GAErBD,EAAKY,MAAMC,QACXT,EAAKQ,MAAQZ,EAAKY,MAAMC,MAAMhB,MAAMiB,QAAQ,GAC5CV,EAAKN,SAAWE,EAAKY,MAAMC,MAAMf,SACjCD,GAASO,EAAKQ,MAAQR,EAAKI,SAC3BV,EAAWM,EAAKN,UAEpBF,EAASmB,KAAKX,EAClB,IAEA,MAAMY,EAAS,CACXtB,MAAOE,GASX,OAPIE,IACAkB,EAAOlB,SAAWA,GAElBD,EAAQ,IACRmB,EAAOnB,MAAQA,EAAMiB,QAAQ,IAG1BE,CACX,CASA,SAASC,EAAmBvB,EAAOC,GAC/B,IAAIC,EAAW,GAuBf,OArBAF,EAAMK,SAAQ,SAAUC,GACpB,MAAMC,EAAeN,IAAaK,EAAKE,gBAAkBF,EAAKE,gBAAgBC,YAAc,IACtFe,EAAUb,EAAWL,GACrBI,EAAO,CACTe,GAAInB,EAAKmB,GACTC,KAAMpB,EAAKO,YACXC,UAAWR,EAAKQ,UAAYR,EAAKS,kBAAoB,GAAGC,YAExDQ,IACAd,EAAKc,QAAUA,GAEfjB,IACAG,EAAKT,SAAWM,GAEhBD,EAAKY,MAAMC,OAAoC,OAA3Bb,EAAKY,MAAMC,MAAMhB,QACrCO,EAAKQ,MAAQZ,EAAKY,MAAMC,MAAMhB,MAAMiB,QAAQ,GAC5CV,EAAKN,SAAWE,EAAKY,MAAMC,MAAMf,UAErCF,EAASmB,KAAKX,EAClB,IAEOR,CACX,CAQA,SAASS,EAAWL,GAChB,IAAKA,EAAKqB,oBACN,MAAO,GAGX,IAAIC,EAAa,GAgBjB,OAfAtB,EAAKqB,oBAAoBtB,SAAQ,SAAUwB,GACvC,GAAIA,EAAEC,aACFF,EAAWP,KAAKQ,EAAEpB,YAAc,KAAOoB,EAAEC,kBACtC,CACH,MAAMC,EAAWF,EAAEG,OAAOC,KAAI,SAAUC,GACpC,OAAOA,EAAIH,SAAWG,EAAIJ,aAAe,IAC7C,IAAGK,QAAO,SAAUD,GAChB,QAASA,CACb,IACIH,EAASK,QACTR,EAAWP,KAAKQ,EAAEpB,YAAc,KAAOsB,EAASM,KAAK,MAE7D,CACJ,IAEOT,EAAWU,OAAOD,KAAK,KAClC,CAjTAE,EAAEC,UAAUC,OAAM,WACdF,EAAE,QAAQG,GAAG,0BAA0B,SAAUC,EAAOC,GACpD,MAAMC,EAAYD,EAASlC,KAAKoC,KAAK9C,MAAM+C,MAAK,SAAUzC,GACtD,OAAOA,EAAKmB,IAAMmB,EAASI,GAC/B,IACAH,EAAU/B,SAAW8B,EAAS9B,SAG9BmC,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,cACPQ,UAAWpD,EAAoB,CAAC8C,MAIpCI,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,UACPQ,UAAW,CACPC,IAAK,CACDC,YAAa,CACTC,KAAM,gBAEVC,SAAUhC,EAAmB,CAACsB,OAI9C,IACAN,EAAE,QAAQG,GAAG,gCAAgC,SAAUC,EAAOC,GAC1D,MAAM3C,EAAW2C,EAASlC,KAAK8C,YAAY,GAAKZ,EAASlC,KAAK8C,YAAY,GAAGC,UAAY,GASzFR,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,aACPQ,UAAW,CACPO,OAAQ,CACJH,SAAUhC,EAAmB,CAACqB,EAASlC,KAAKiD,SAAU1D,MAItE,IACAsC,EAAE,QAAQG,GAAG,6BAA6B,SAAUC,EAAOC,GACvD,MACMgB,EADOhB,EAASiB,KAAKC,iBACN3B,QAAO,SAAU7B,GAClC,MAAqB,uBAAdA,EAAKoB,IAChB,IAEIkC,EAAQxB,OAAS,IAEjBa,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,mBACPQ,UAAW,CACPY,aAAcH,EAAQ,GAAGzD,SAKjC8C,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,eACPQ,UAAW,CACPa,SAAU,CACNX,YAAa,CACTY,KAAM,IACNC,OAAQN,EAAQ,GAAGzD,WAM3C,IACAoC,EAAE,QAAQG,GAAG,iCAAiC,SAAUC,EAAOC,GAC3D,MAAMuB,EAAOvB,EAASwB,SAASC,uBAAuBC,cAAgB,GAChElE,EA6Od,SAAqBJ,GACjB,MAAMuE,EAAavE,EAAMiC,KAAI,SAAU3B,GACnC,OAAOA,EAAKY,OAASZ,EAAKY,MAAMC,MAC1Bb,EAAKY,MAAMC,MAAMf,SACjB,EACV,IAEA,OAAOmE,EAAWnC,OAAS,EAAImC,EAAW,GAAK,EACnD,CArPyBC,CAAY5B,EAASwB,SAASK,iBAAiBzE,OAC1D0E,EAAO9B,EAASwB,SAASC,uBAAuB5D,YAChDC,EAAO,CACTiE,cAAeD,GAGfP,IACAzD,EAAKP,MAuPNyE,WAvP0BT,EAuPXU,QAAQ,IAAK,IAAIA,QAAQ,IAAK,KAAKA,QAAQ,UAAW,KAAKzD,QAAQ,IArPjFhB,IACAM,EAAKN,SAAWA,GAIpB6C,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,oBACPQ,UAAWzC,IAIfuC,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,sBACPQ,UAAW,CACP2B,gBAAiB,CACbzB,YAAa,CACTY,KAAM,IACNC,OAAQQ,MAK5B,IA4BAnC,EAAE,QAAQG,GAAG,sCAAsC,WAC/CO,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,sBACnC,IAEAJ,EAAE,QAAQG,GAAG,mCAAmC,SAAUC,EAAOoC,GAC7D9B,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,mCAAoCoC,MAAOA,GAC9E,IAEAxC,EAAE,QAAQG,GAAG,sCAAsC,SAAUC,EAAOoC,GAChE9B,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,4BAA6BoC,MAAOA,GACvE,IAEAxC,EAAE,QAAQG,GAAG,iCAAiC,WAC1CO,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,uBACnC,IAEAJ,EAAE,iCAAiCG,GAAG,SAAS,WAC3CO,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,wBACPoC,MAAOxC,EAAEyC,MAAMtE,KAAK,UAE5B,IAEA6B,EAAE,2BAA2BG,GAAG,SAAS,WACrCO,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,iCACPoC,MAAOxC,EAAEyC,MAAMtE,KAAK,SACpBuE,OAAQ1C,EAAEyC,MAAMtE,KAAK,UACrBwE,KAAM,YAEd,IAEA3C,EAAE,+BAA+BG,GAAG,SAAS,WACzCO,OAAOC,UAAU7B,KAAK,CAClBsB,MAAO,gCACPoC,MAAOxC,EAAEyC,MAAMtE,KAAK,SACpBwE,KAAM,YAEd,IAEA3C,EAAE,oCAAoCG,GAAG,QAAS,KAAK,WACnD,IAAIyC,EAAO5C,EAAEyC,MAAMI,KAAK,SAEU,IAA9BD,EAAKE,QAAQ,YACbpC,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,yBAA0BoC,MAAO,cAC3B,IAA9BI,EAAKE,QAAQ,YACpBpC,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,yBAA0BoC,MAAO,cAC1B,IAA/BI,EAAKE,QAAQ,aACpBpC,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,yBAA0BoC,MAAO,eAC5B,IAA7BI,EAAKE,QAAQ,WACpBpC,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,yBAA0BoC,MAAO,aAC1B,IAA/BI,EAAKE,QAAQ,cACpBpC,OAAOC,UAAU7B,KAAK,CAAEsB,MAAO,yBAA0BoC,MAAO,aAExE,GACJ,G","sources":["webpack://sfcc-hastens/./cartridges/app_hastens/cartridge/client/default/js/ga4.js"],"sourcesContent":["$(document).ready(function () {\n $('body').on('hastens:afterAddToCart', function (event, response) {\n const addedItem = response.data.cart.items.find(function (item) {\n return item.id == response.pid;\n });\n addedItem.quantity = response.quantity;\n\n // GA4\n window.dataLayer.push({\n event: 'add_to_cart',\n ecommerce: generateGA4ItemData([addedItem])\n });\n\n // UA\n window.dataLayer.push({\n event: 'eec.add',\n ecommerce: {\n add: {\n actionField: {\n list: 'Product Page'\n },\n products: generateUAItemData([addedItem])\n }\n }\n })\n });\n $('body').on('product:afterAttributeSelect', function (event, response) {\n const category = response.data.breadcrumbs[1] ? response.data.breadcrumbs[1].htmlValue : '';\n\n // GA4 - skip for now\n // window.dataLayer.push({\n // event: 'view_item',\n // ecommerce: generateGA4ItemData([response.data.product], category)\n // });\n\n // UA\n window.dataLayer.push({\n event: 'eec.detail',\n ecommerce: {\n detail: {\n products: generateUAItemData([response.data.product], category)\n }\n }\n });\n });\n $('body').on('checkout:serializeBilling', function (event, response) {\n const form = response.form.serializeArray();\n const payment = form.filter(function (item) {\n return item.name === 'adyenPaymentMethod';\n });\n\n if (payment.length > 0) {\n // GA4\n window.dataLayer.push({\n event: 'add_payment_info',\n ecommerce: {\n payment_type: payment[0].value\n }\n });\n\n // UA\n window.dataLayer.push({\n event: 'eec.checkout',\n ecommerce: {\n checkout: {\n actionField: {\n step: '2',\n option: payment[0].value\n }\n }\n }\n });\n }\n });\n $('body').on('hastens:updateShippingMethods', function (event, response) {\n const cost = response.shipping.selectedShippingMethod.shippingCost || '';\n const currency = getCurrency(response.shipping.productLineItems.items);\n const tier = response.shipping.selectedShippingMethod.displayName;\n const data = {\n shipping_tier: tier,\n };\n\n if (cost) {\n data.value = cleanNumber(cost);\n }\n if (currency) {\n data.currency = currency;\n }\n\n // GA4\n window.dataLayer.push({\n event: 'add_shipping_info',\n ecommerce: data\n });\n\n // UA - must trigger after begin_checkout\n window.dataLayer.push({\n event: 'eec.checkout_option',\n ecommerce: {\n checkout_option: {\n actionField: {\n step: '1',\n option: tier\n }\n }\n }\n });\n });\n\n /*\n // Currently not triggered\n $('body').on('afterRemoveFromCart', function (event, response) {\n const items = response.cart.items;\n\n window.dataLayer.push({\n event: 'remove_from_cart',\n ecommerce: generateEcommerceData(items)\n });\n });\n\n // Maybe needed\n $('body').on('product:statusUpdate', function (event, response) {\n console.log(event, response);\n });\n $('body').on('cart:update', function (event, response) {\n console.log(event, response);\n });\n $('body').on('cart:updateQuantity', function (event, response) {\n console.log(event, response);\n });\n $('body').on('setShippingMethodSelection', function (event, response) {\n console.log(event, response);\n });\n */\n\n $('body').on('hastens:storeLocatorResultsUpdated', function () {\n window.dataLayer.push({ event: 'storeLocatorSearch' });\n });\n\n $('body').on('hastens:storeLocatorResultClick', function (event, label) {\n window.dataLayer.push({ event: 'storeLocatorClickOnSearchResults', label: label });\n });\n\n $('body').on('hastens:storeLocatorMapMarkerClick', function (event, label) {\n window.dataLayer.push({ event: 'storeLocatorClickOnMarker', label: label });\n });\n\n $('body').on('hastens:newsletterRequestSent', function () {\n window.dataLayer.push({ event: 'signUpForNewsLetter' });\n });\n\n $('.tid-storelocator-partnerpage').on('click', function() {\n window.dataLayer.push({\n event: 'storeLocatorViewStore',\n label: $(this).data('store'),\n });\n });\n\n $('.tid-storelocator-phone').on('click', function() {\n window.dataLayer.push({\n event: 'storeLocatorClickOnPhoneNumber',\n label: $(this).data('store'),\n number: $(this).data('number'),\n type: 'location',\n });\n });\n\n $('.tid-storelocator-direction').on('click', function() {\n window.dataLayer.push({\n event: 'storeLocatorClickOnDirections',\n label: $(this).data('store'),\n type: 'location',\n });\n });\n\n $('#footercontent .container-social').on('click', 'a', function() {\n var href = $(this).attr('href');\n\n if (href.indexOf('facebook') !== -1) {\n window.dataLayer.push({ event: 'clickOnSocialMediaIcon', label: 'facebook' });\n } else if (href.indexOf('linkedin') !== -1) {\n window.dataLayer.push({ event: 'clickOnSocialMediaIcon', label: 'linkedin' });\n } else if (href.indexOf('pinterest') !== -1) {\n window.dataLayer.push({ event: 'clickOnSocialMediaIcon', label: 'pinterest' });\n } else if (href.indexOf('youtube') !== -1) {\n window.dataLayer.push({ event: 'clickOnSocialMediaIcon', label: 'youtube' });\n } else if (href.indexOf('instagram') !== -1) {\n window.dataLayer.push({ event: 'clickOnSocialMediaIcon', label: 'instagram' });\n }\n });\n});\n\n/**\n * Generate default ecommerce data object with item list and value.\n *\n * Skipping item_id and item_variant since Analytics don't handle them\n * correctly as of now.\n *\n * @param items\n * @param {string} category\n * @returns {object}\n */\nfunction generateGA4ItemData(items, category) {\n let itemData = [];\n let value = 0;\n let currency = '';\n\n items.forEach(function (item) {\n const dataCategory = category || (item.primaryCategory ? item.primaryCategory.displayName : '');\n const variant = getVariant(item);\n const data = {\n // item_id: item.id,\n item_name: item.productName,\n quantity: (item.quantity || item.selectedQuantity || 0).toString(),\n };\n if (variant) {\n // data.item_variant = variant;\n }\n if (dataCategory) {\n data.item_category = dataCategory;\n }\n if (item.price.sales) {\n data.price = item.price.sales.value.toFixed(2);\n data.currency = item.price.sales.currency;\n value += data.price * data.quantity;\n currency = data.currency;\n }\n itemData.push(data);\n });\n\n const retVal = {\n items: itemData\n }\n if (currency) {\n retVal.currency = currency;\n }\n if (value > 0) {\n retVal.value = value.toFixed(2);\n }\n\n return retVal;\n}\n\n/**\n * Generate a products array appropriate for UA events.\n *\n * @param items\n * @param category\n * @returns {[]}\n */\nfunction generateUAItemData(items, category) {\n let itemData = [];\n\n items.forEach(function (item) {\n const dataCategory = category || (item.primaryCategory ? item.primaryCategory.displayName : '');\n const variant = getVariant(item);\n const data = {\n id: item.id,\n name: item.productName,\n quantity: (item.quantity || item.selectedQuantity || 0).toString(),\n };\n if (variant) {\n data.variant = variant;\n }\n if (dataCategory) {\n data.category = dataCategory;\n }\n if (item.price.sales && item.price.sales.value !== null) {\n data.price = item.price.sales.value.toFixed(2);\n data.currency = item.price.sales.currency;\n }\n itemData.push(data);\n });\n\n return itemData;\n}\n\n/**\n * Return a string of all selected variants.\n *\n * @param item\n * @returns {string}\n */\nfunction getVariant(item) {\n if (!item.variationAttributes) {\n return '';\n }\n\n let variations = [];\n item.variationAttributes.forEach(function (v) {\n if (v.displayValue) {\n variations.push(v.displayName + ': ' + v.displayValue);\n } else {\n const selected = v.values.map(function (cur) {\n return cur.selected ? cur.displayValue : null;\n }).filter(function (cur) {\n return !!cur;\n });\n if (selected.length) {\n variations.push(v.displayName + ': ' + selected.join(', '));\n }\n }\n });\n\n return variations.sort().join(', ');\n}\n\n/**\n * Extract currency information from item data.\n *\n * @param items\n * @returns {string}\n */\nfunction getCurrency(items) {\n const currencies = items.map(function (item) {\n return item.price && item.price.sales\n ? item.price.sales.currency\n : '';\n });\n\n return currencies.length > 0 ? currencies[0] : '';\n}\n\n/**\n * Change a formatted money string to float.\n *\n * @param {string} num\n * @returns {string}\n */\nfunction cleanNumber(num) {\n return parseFloat(num.replace('.', '').replace(',', '.').replace(/[^0-9.]/, '')).toFixed(2);\n}\n"],"names":["generateGA4ItemData","items","category","itemData","value","currency","forEach","item","dataCategory","primaryCategory","displayName","data","getVariant","item_name","productName","quantity","selectedQuantity","toString","item_category","price","sales","toFixed","push","retVal","generateUAItemData","variant","id","name","variationAttributes","variations","v","displayValue","selected","values","map","cur","filter","length","join","sort","$","document","ready","on","event","response","addedItem","cart","find","pid","window","dataLayer","ecommerce","add","actionField","list","products","breadcrumbs","htmlValue","detail","product","payment","form","serializeArray","payment_type","checkout","step","option","cost","shipping","selectedShippingMethod","shippingCost","currencies","getCurrency","productLineItems","tier","shipping_tier","parseFloat","replace","checkout_option","label","this","number","type","href","attr","indexOf"],"sourceRoot":""}