{"version":3,"sources":["wwwroot/scripts/framework/local-storage.js","wwwroot/scripts/framework/data-layer-manager.js","wwwroot/scripts/libs/klaviyo.js"],"names":["DummyStorage","self","this","store","setItem","key","value","getItem","removeItem","EvoStorage","type","backingStore","window","sessionStorage","localStorage","e","expireDate","excludeExpiration","JSON","stringify","now","Date","newVal","_c","toISOString","_expire","getExpireDate","data","val","parse","setFullYear","getFullYear","evo","storage","PREVIOUS_PAGE_STORAGE_KEY","LISTNAME_KEY_PREFIX","firstPageLoad","dataLayerManager","dataLayer","that","_cache","setProductListName","uniqueId","listName","getProductListName","cacheProducts","products","length","i","p","position","_uniqueId","dataLayerPushForProduct","eventName","actionContainer","product","definition","event","ecommerce","list","actionField","push","console","warn","clearDataLayer","undefined","eventCallback","pushToDataLayer","flushDataLayer","checkout","impressions","pushEvoPageType","pageName","pageType","pageTypeData","pageTypeDataEvent","evoPageType","appendAndSetPreviousPage","cacheTrips","trips","Array","isArray","forEach","t","sku","pushDestinationView","destination","pushTripView","dataToMerge","trip","hasOwnProperty","call","inventory","Inventory","pushDetailView","IsOutlet","Used","detail","pushAddToCart","buttonContext","button_context","add","pushProductClick","pushRemoveFromCart","pushPromoViews","promoObjects","promos","_","filter","id","name","promoView","promotions","pushPromoClick","promoObject","promoClick","pushImpressions","currencyCode","pushCompatibleBindingsClick","productName","click","pushData","propertyName","flushData","pushEvent","category","action","label","nonInteraction","pushCustomVariable","variableName","currentPageType","currentCoreTaxonomyNodePath","currentProductSaleStatus","dataLayerModel","previousPage","previousPageType","previousPageCoreTaxonomyNode","previousPageSaleStatus","currentPageData","exception","klaviyo","_klOnsite","Proxy","get","n","apply","arguments","o","w","pop","Promise","concat"],"mappings":"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","file":"framework-support.min.js","sourcesContent":["// Storage\n(function () {\n function DummyStorage() {\n var self = this,\n store = {};\n\n self.setItem = function (key, value) {\n store[key] = value;\n }\n\n self.getItem = function (key) {\n return store[key];\n }\n\n self.removeItem = function (key) {\n delete store[key];\n }\n }\n\n function EvoStorage(type) {\n var self = this,\n backingStore = type == 'session' ? window.sessionStorage : window.localStorage;\n\n try {\n if (!backingStore) throw \"storage not supported\";\n\n // even if localStorage exists, iOS will throw an exception if\n // in \"Private\" mode\n backingStore.setItem(\"storage-availability-test\", \"data\");\n backingStore.removeItem(\"storage-availability-test\");\n } catch (e) {\n backingStore = new DummyStorage();\n }\n\n self.setItem = function (key, value, expireDate = null, excludeExpiration = false) {\n if (excludeExpiration) {\n return backingStore.setItem(key, JSON.stringify(value));\n }\n var now = new Date(),\n newVal =\n {\n '_c': now.toISOString(),\n '_expire': (expireDate || getExpireDate(now)).toISOString(),\n 'data': value\n };\n return backingStore.setItem(key, JSON.stringify(newVal));\n };\n\n self.getItem = function (key, excludeExpiration = false) {\n\n try {\n var val = JSON.parse(backingStore.getItem(key));\n if (val) {\n if (excludeExpiration) {\n return val;\n } else if (new Date() <= new Date(val['_expire'])) {\n return val['data'];\n }\n }\n }\n catch (e) {\n }\n\n backingStore.removeItem(key);\n return null;\n };\n\n self.removeItem = function (key) {\n return backingStore.removeItem(key);\n };\n }\n\n function getExpireDate(now) {\n now = now || new Date();\n now.setFullYear(now.getFullYear() + 1);\n return now;\n }\n\n evo = evo || {};\n evo.storage = evo.storage || new EvoStorage('local');\n evo.sessionStorage = evo.sessionStorage || new EvoStorage('session');\n})();","/// \n\n(function () {\n const PREVIOUS_PAGE_STORAGE_KEY = \"PreviousPage\";\n const LISTNAME_KEY_PREFIX = \"evogtm-pl-\";\n\n var firstPageLoad = true;\n\n //helper manager class for Google Universal Analytics' dataLayer pushes\n function dataLayerManager(dataLayer) {\n var that = this,\n _cache = {};\n\n function setProductListName(uniqueId, listName) {\n evo.sessionStorage.setItem(LISTNAME_KEY_PREFIX + uniqueId, listName);\n }\n\n function getProductListName(uniqueId) {\n return evo.sessionStorage.getItem(LISTNAME_KEY_PREFIX + uniqueId);\n }\n\n //helper method that caches the products into the _productCache lookup\n //for later usage with product clicks and cart removal data layer pushes\n function cacheProducts(products) {\n if (!products || products.length < 1) {\n return;\n }\n\n for (var i = 0; i < products.length; i++) {\n var p = products[i];\n p.position = i + 1;\n if (p._uniqueId) {\n _cache[p._uniqueId] = p;\n }\n }\n }\n\n //helper method that builds and pushes a data layer definition object for products in cache\n function dataLayerPushForProduct(\n uniqueId,\n eventName,\n actionContainer,\n listName,\n ) {\n //make sure the product object was cached\n if (!uniqueId || !_cache[uniqueId]) {\n console.warn(\n \"call to dataLayer.push \" +\n eventName +\n \" failed: product not in cache\",\n );\n return;\n }\n\n //build the definition object for the push\n var product = _cache[uniqueId],\n definition = {\n event: eventName,\n ecommerce: {},\n };\n\n definition.ecommerce[actionContainer] = {\n products: [product],\n };\n\n if (product.list || listName) {\n definition.ecommerce[actionContainer].actionField = {\n list: product.list || listName,\n };\n // Store the list name for fetching in checkout\n setProductListName(uniqueId, product.list || listName);\n }\n\n //finally, push to the data layer (does the actual reporting to GA)\n dataLayer.push(definition);\n }\n\n // Google Tag Manager persists values in the dataLayer. Not a problem for\n // page refreshes, but for ajax updates need to reset the dataLayer so\n // that only the visible products are displayed\n function clearDataLayer() {\n dataLayer.push({\n ecommerce: undefined,\n event: undefined,\n eventCallback: undefined,\n });\n }\n\n //use instead of the standard dataLayer.push method to cache product instances\n //for later usage with product clicks and cart removals\n function pushToDataLayer(definition, flushDataLayer) {\n if (flushDataLayer) {\n clearDataLayer();\n }\n\n //special case for impressions and checkout steps\n //that caches products for later usage\n var ecommerce = definition.ecommerce;\n if (ecommerce) {\n if (ecommerce.checkout) {\n cacheProducts(ecommerce.checkout.products);\n } else {\n cacheProducts(ecommerce.impressions);\n }\n }\n\n dataLayer.push(definition);\n }\n\n // Pushes a page type event to the data layer\n // example: { event: 'evodatalayer', evoPageType: 'evo Trip' }\n function pushPageTypeEvent(pageType) {\n var pageTypeData = {\n event: \"evodatalayer\",\n evoPageType: pageType,\n };\n var pageTypeDataEvent = that.appendAndSetPreviousPage(\n pageType,\n \"\",\n \"\",\n pageTypeData,\n );\n\n dataLayer.push(pageTypeDataEvent);\n }\n\n that.pushEvoPageType = function (pageName) {\n pushPageTypeEvent(pageName);\n };\n\n //Cache the specified evoTrip objects for use at a later time\n that.cacheTrips = function (trips) {\n if (!Array.isArray(trips) || trips.length === 0) {\n console.warn(\"Unable to cache empty trips array\");\n return;\n }\n\n trips.forEach(function (t) {\n if (t.sku) _cache[t.sku] = t;\n });\n };\n\n //wrapper of standard push event for normal usage\n that.push = function (data) {\n dataLayer.push(data);\n };\n\n //Add evoTrip destination data to the dataLayer\n that.pushDestinationView = function (destination) {\n if (!destination) {\n console.warn(\"Unable to push null destination to dataLayer\");\n return;\n }\n\n dataLayer.push(destination);\n };\n\n //push evoTrip individual data to the dataLayer\n that.pushTripView = function (sku, dataToMerge) {\n var trip = _cache[sku || \"-1\"];\n if (!sku || !trip) {\n console.warn(\"Unable to push null trip to dataLayer\");\n return;\n }\n\n // merge properties that are only known at view time\n if (\n dataToMerge &&\n dataToMerge.hasOwnProperty &&\n dataToMerge.hasOwnProperty.call\n ) {\n trip.inventory = dataToMerge.Inventory;\n }\n\n pushToDataLayer(trip);\n };\n\n ///Use to notify dataLayer of a product detail view\n that.pushDetailView = function (product) {\n if (!product) {\n console.warn(\"Unable to push null product to dataLayer\");\n return;\n }\n\n clearDataLayer();\n\n var listName =\n getProductListName(product._uniqueId) ||\n \"PDP - \" +\n (product.IsOutlet ? \"Outlet\" : \"Store\") +\n \" - \" +\n (product.Used ? \"Used\" : \"New\");\n dataLayer.push({\n event: firstPageLoad ? \"ecommerce\" : \"ecommerce-detail\",\n ecommerce: {\n detail: {\n actionField: {list: listName},\n products: [product],\n },\n },\n });\n\n firstPageLoad = false;\n setProductListName(product._uniqueId, listName);\n };\n\n ///Use to notify dataLayer of a product added to the user's cart\n that.pushAddToCart = function (product, buttonContext) {\n if (!product) {\n console.warn(\"Unable to push null product to dataLayer\");\n return;\n }\n\n clearDataLayer();\n\n dataLayer.push({\n button_context: buttonContext,\n ecommerce: {\n add: {\n products: [product],\n },\n },\n event: \"addToCart\",\n });\n };\n\n //Use to notify the dataLayer that a product click has occurred\n that.pushProductClick = function (uniqueId, listName) {\n dataLayerPushForProduct(uniqueId, \"productClick\", \"click\", listName);\n };\n\n //Use to notify the dataLayer that an item has been removed from the cart\n that.pushRemoveFromCart = function (uniqueId) {\n var list = getProductListName(uniqueId);\n dataLayerPushForProduct(uniqueId, \"removeFromCart\", \"remove\", list);\n };\n\n // Use to notify GA that a promotion has been viewed\n // promoObjects is an array of:\n // { name: 'Promotion Name, i.e. \"\"', creative: 'creative_asset_name', position: 'hero_slot_1' }\n that.pushPromoViews = function (promoObjects) {\n var promos = _.filter(promoObjects || [], function (p) {\n if (!p || (!p.id && !p.name)) {\n console.warn(\"promoView must have id or name value\");\n return false;\n }\n return true;\n });\n\n if (!promos.length) {\n console.warn(\"no valid promo objects found to push\");\n return;\n }\n\n pushToDataLayer(\n {\n event: \"promotionImpression\",\n ecommerce: {\n promoView: {\n promotions: promos,\n },\n },\n },\n true,\n );\n };\n\n // Use to notify GA that a promotion has been clicked\n // promoObject is an object like: { name: 'Promotion Name', creative: 'creative_asset_name', position: 'hero_slot_1' }\n that.pushPromoClick = function (promoObject) {\n if (!promoObject || (!promoObject.id && !promoObject.name)) {\n console.warn(\"promoClick must have id or name value\");\n return;\n }\n\n pushToDataLayer(\n {\n event: \"promotionClick\",\n ecommerce: {\n promoClick: {\n promotions: [promoObject],\n },\n },\n },\n true,\n );\n };\n\n // Use to add data to a collection of incomplete impressionFieldObject data\n // and then format it as a product impressions measurement and push it.\n that.pushImpressions = function (impressions, list, flushDataLayer) {\n if (!impressions || !impressions.length) return;\n\n //build the definition object for the push\n for (var i = 0; i < impressions.length; i++) {\n impressions[i].list = list;\n }\n\n pushToDataLayer(\n {\n ecommerce: {\n currencyCode: \"USD\",\n impressions: impressions,\n },\n event: \"productImpression\",\n },\n flushDataLayer,\n );\n };\n\n //Use to notify the dataLayer that the Add Compatible Binds button was clicked\n that.pushCompatibleBindingsClick = function (productName) {\n pushToDataLayer(\n {\n event: \"compatibleBindingsClick\",\n ecommerce: {\n click: {\n product: productName,\n list: 'compatibleBindingsClick'\n },\n },\n },\n true,\n );\n }\n\n that.pushData = function (propertyName, value, flushData) {\n if (!propertyName) return;\n\n var data = {};\n data[propertyName] = value;\n pushToDataLayer(data, flushData === true);\n };\n\n // use to push a generic event to the data layer\n that.pushEvent = function (category, action, label, value, nonInteraction) {\n var data = {\n action: action,\n category: category,\n event: category + \"||\" + action,\n label: label,\n nonInteraction: nonInteraction,\n value: value,\n };\n pushToDataLayer(data);\n };\n\n // use to push a generic custom variable to the data layer\n that.pushCustomVariable = function (variableName, value) {\n var data = {};\n data[variableName] = value;\n pushToDataLayer(data);\n };\n\n that.appendAndSetPreviousPage = function (\n currentPageType,\n currentCoreTaxonomyNodePath,\n currentProductSaleStatus,\n dataLayerModel,\n ) {\n try {\n var previousPage = evo.sessionStorage.getItem(\n PREVIOUS_PAGE_STORAGE_KEY,\n true,\n );\n\n if (previousPage) {\n dataLayerModel[\"previousPage\"] = {\n previousPageType: previousPage.previousPageType,\n previousPageCoreTaxonomyNode:\n previousPage.previousPageCoreTaxonomyNode,\n previousPageSaleStatus: previousPage.previousPageSaleStatus,\n };\n }\n\n var currentPageData = {\n previousPageType: currentPageType ? currentPageType : \"\",\n previousPageCoreTaxonomyNode: currentCoreTaxonomyNodePath\n ? currentCoreTaxonomyNodePath\n : \"\",\n previousPageSaleStatus: currentProductSaleStatus\n ? currentProductSaleStatus\n : \"\",\n };\n\n evo.sessionStorage.setItem(\n PREVIOUS_PAGE_STORAGE_KEY,\n currentPageData,\n null,\n true,\n );\n } catch (exception) {\n // do nothing\n }\n\n return dataLayerModel;\n };\n }\n\n window.dataLayerManager = new dataLayerManager(dataLayer);\n})();\n","!function () { if (!window.klaviyo) { window._klOnsite = window._klOnsite || []; try { window.klaviyo = new Proxy({}, { get: function (n, i) { return \"push\" === i ? function () { var n; (n = window._klOnsite).push.apply(n, arguments) } : function () { for (var n = arguments.length, o = new Array(n), w = 0; w < n; w++)o[w] = arguments[w]; var t = \"function\" == typeof o[o.length - 1] ? o.pop() : void 0, e = new Promise((function (n) { window._klOnsite.push([i].concat(o, [function (i) { t && t(i), n(i) }])) })); return e } } }) } catch (n) { window.klaviyo = window.klaviyo || [], window.klaviyo.push = function () { var n; (n = window._klOnsite).push.apply(n, arguments) } } } }();"]}