{"version":3,"file":"jquery.external_tracking.min.js","sources":["jquery.external_tracking.js"],"sourcesContent":["(function ($, _, root) {\r\n var _trackingMetadataCache = {};\r\n\r\n root.productListType = {\r\n productList: 'Product list',\r\n relatedProducts: 'Related products',\r\n bestsellers: 'Bestsellers',\r\n alsoBought: 'Also bought',\r\n searchResults: 'Search results'\r\n }\r\n\r\n // Listen to the cart changes and generate notifications to the external tracking listeners\r\n root.PubSub.subscribe('estore.callback.shopcart',\r\n function (topic, data) {\r\n _reportCartChange(topic, data.result.trackableMetadata);\r\n });\r\n root.PubSub.subscribe('estore.postback.shopcart',\r\n function (topic, data) {\r\n _reportCartChange(topic, data);\r\n });\r\n\r\n root.PubSub.subscribe('estore.callback.shoppinglist',\r\n function (topic, data) {\r\n _reportShoppingListChange(topic, data.result.trackableMetadata);\r\n });\r\n\r\n root.toProductListType = function (mode) {\r\n switch (mode) {\r\n case 'Bestsellers':\r\n return root.productListType.bestsellers;\r\n case 'CustomersAlsoBought':\r\n return root.productListType.alsoBought;\r\n case 'SearchResults':\r\n case 'SmartSearchResults':\r\n return root.productListType.searchResults;\r\n default:\r\n return root.productListType.productList;\r\n }\r\n }\r\n\r\n // trackingProductsWithLinks should be an array of objects { productId: 123, $links: $() }\r\n root.reportProductListView = function (productListType, productListName, trackingProductsWithLinks) {\r\n if (!_.isEmpty(trackingProductsWithLinks)) {\r\n var productListViewData = {\r\n currencyCode: root.globalSettings.siteCurrencyCode,\r\n listType: productListType,\r\n listName: $.trim(productListName),\r\n items: []\r\n }\r\n\r\n var trackingProductIds = _.map(trackingProductsWithLinks, function (product) { return product.productId; });\r\n $.when(_loadMetadataForTrackingProducts(trackingProductIds))\r\n .done(function (metadata) {\r\n var trackingProductMetadataMap = {};\r\n _.each(metadata,\r\n function (trackingProduct) {\r\n trackingProductMetadataMap[trackingProduct.productId] = trackingProduct;\r\n });\r\n\r\n // Remember to follow the order of tracking products, it is important for the GTM impressions where shown position is being tracked.\r\n _.each(trackingProductsWithLinks,\r\n function (trackingProduct) {\r\n var trackingProductMetadata = trackingProductMetadataMap[trackingProduct.productId];\r\n\r\n productListViewData.items.push($.extend({}, trackingProduct, trackingProductMetadata));\r\n });\r\n\r\n root.PubSub.publish('externaltracking.product.listview', productListViewData);\r\n })\r\n .fail(function () {\r\n console.error('Failed to get tracking products metadata while reporting product list view action');\r\n });\r\n }\r\n };\r\n\r\n root.reportProductDetailsView = function (productId) {\r\n productId = parseInt(productId);\r\n\r\n if (productId > 0) {\r\n $.when(_loadMetadataForTrackingProducts([productId]))\r\n .done(function (metadata) {\r\n var trackingProductDetails = metadata[0];\r\n\r\n trackingProductDetails.currencyCode = root.globalSettings.siteCurrencyCode;\r\n\r\n root.PubSub.publish('externaltracking.product.detailsview', trackingProductDetails);\r\n })\r\n .fail(function () {\r\n console.error('Failed to get tracking products metadata while reporting product list view action');\r\n });\r\n } else {\r\n throw 'Invalid ProductID value';\r\n }\r\n };\r\n\r\n root.reportPaymentOptionSelection = function (step, paymentName) {\r\n var optionData = {\r\n step: step,\r\n isPaymentStep: true,\r\n option: 'Payment: ' + $.trim(paymentName)\r\n };\r\n\r\n _reportCheckoutOption(optionData);\r\n };\r\n\r\n root.reportDeliveryOptionSelection = function (step, deliveryName) {\r\n var optionData = {\r\n step: step,\r\n isDeliveryStep: true,\r\n option: 'Delivery: ' + $.trim(deliveryName)\r\n };\r\n\r\n _reportCheckoutOption(optionData);\r\n };\r\n\r\n root.reporWebshopSearchEvent = function (searchText) { \r\n if (searchText?.length > 0) {\r\n root.PubSub.publish('externaltracking.webshop.search', searchText);\r\n }\r\n };\r\n\r\n root.loadMetadataForTrackingProducts = _loadMetadataForTrackingProducts;\r\n\r\n function _reportCartChange(topic, trackableCartChanges) {\r\n if (_.isEmpty(trackableCartChanges)) {\r\n return;\r\n }\r\n var cartChangeMetadata;\r\n var channelParts = topic.split('.');\r\n var topicAction = channelParts[channelParts.length - 1];\r\n var topicType = channelParts[channelParts.length - 3];\r\n switch (topicAction.toLowerCase()) {\r\n case 'addtocart':\r\n cartChangeMetadata = {\r\n source: topicType,\r\n currencyCode: root.globalSettings.activeCurrencyCode,\r\n items: trackableCartChanges\r\n };\r\n\r\n root.PubSub.publish('externaltracking.shopcart.addtocart', cartChangeMetadata);\r\n break;\r\n case 'emptycart':\r\n case 'removefromcart':\r\n cartChangeMetadata = {\r\n source: topicType,\r\n currencyCode: root.globalSettings.activeCurrencyCode,\r\n items: trackableCartChanges\r\n };\r\n\r\n root.PubSub.publish('externaltracking.shopcart.removefromcart', cartChangeMetadata);\r\n break;\r\n case 'updatecartquantity':\r\n cartChangeMetadata = {\r\n source: topicType,\r\n currencyCode: root.globalSettings.activeCurrencyCode,\r\n addedQtyItems: trackableCartChanges.trackableAddedQtyLinesMetadata,\r\n removedQtyItems: trackableCartChanges.trackableRemovedQtyLinesMetadata\r\n }; \r\n\r\n root.PubSub.publish('externaltracking.shopcart.updatecartquantity', cartChangeMetadata);\r\n break;\r\n }\r\n }\r\n\r\n function _reportShoppingListChange(topic, trackableCartChanges) {\r\n if (_.isEmpty(trackableCartChanges)) {\r\n return;\r\n }\r\n var shoppingListChangeMetadata;\r\n var channelParts = topic.split('.');\r\n var topicAction = channelParts[channelParts.length - 1];\r\n var topicType = channelParts[channelParts.length - 3];\r\n switch (topicAction.toLowerCase()) {\r\n case 'addtowishlist':\r\n case 'addtoshoppinglist':\r\n case 'addshoppinglist':\r\n shoppingListChangeMetadata = {\r\n source: topicType,\r\n currencyCode: root.globalSettings.activeCurrencyCode,\r\n items: trackableCartChanges\r\n };\r\n\r\n root.PubSub.publish('externaltracking.shoppinglist.addtowishlist', shoppingListChangeMetadata);\r\n break;\r\n }\r\n }\r\n\r\n function _reportCheckoutOption(optionData) {\r\n root.PubSub.publish('externaltracking.checkout.option', optionData);\r\n }\r\n\r\n function _loadMetadataForTrackingProducts(productIds) {\r\n // Note: the function may return data in other-than-requested order. Consider it in usages.\r\n var deferred = $.Deferred();\r\n\r\n var productMetadata = [], toFetch = [];\r\n\r\n _.each(productIds,\r\n function (productId) {\r\n var cached = _trackingMetadataCache[productId];\r\n if (cached) {\r\n productMetadata.push(cached);\r\n } else {\r\n toFetch.push(productId);\r\n }\r\n });\r\n\r\n if (toFetch.length > 0) {\r\n $.ajax({\r\n url: root.R + 'api/trackingmetadata/products',\r\n type: 'GET',\r\n data: {\r\n productIDs: toFetch\r\n }\r\n })\r\n .done(function (fetchedMetadata) {\r\n _.each(fetchedMetadata,\r\n function (fetched) {\r\n // Add to cache\r\n _trackingMetadataCache[fetched.productId] = fetched;\r\n // Add to results\r\n productMetadata.push(fetched);\r\n });\r\n\r\n deferred.resolve(productMetadata);\r\n })\r\n .fail(deferred.reject);\r\n } else {\r\n deferred.resolve(productMetadata);\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n})(jQuery, window._, window);\r\n\r\n/* External tracking event bus. The main purpose of this object is to be sure that all tracking systems handled event */\r\n(function (w, factory) {\r\n w.ExternalTrackingEventBus = factory(w, w._);\r\n\r\n window.PubSub.subscribe('externaltracking.shopcart',\r\n function (topic, data) {\r\n if (!w.ExternalTrackingEventBus.hasRegisteredSystems()) {\r\n if (w.PubSub) {\r\n var channelParts = topic.split('.');\r\n var topicAction = channelParts[channelParts.length - 1];\r\n w.PubSub.publish(w.ExternalTrackingEventBus.channel.event.handled, { topicAction: topicAction.toLowerCase(), data: data });\r\n }\r\n }\r\n });\r\n\r\n}(window, function (w, _) {\r\n\r\n var _trackingSystems = {};\r\n var _topic = 'externaltracking';\r\n\r\n var supportedChannels = {\r\n event: {\r\n handled: _topic + '.event.handled'\r\n }\r\n };\r\n var externalTrackingEventBus = {};\r\n\r\n externalTrackingEventBus.channel = supportedChannels;\r\n\r\n externalTrackingEventBus.register = function (trackingSystem) {\r\n var trackingSystemsObject = _trackingSystems[trackingSystem];\r\n if (_.isUndefined(trackingSystemsObject)) {\r\n _trackingSystems[trackingSystem] = {};\r\n }\r\n };\r\n\r\n externalTrackingEventBus.eventHandledByAllSystems = function (event) {\r\n var trackingSystemsArray = _.values(_trackingSystems);\r\n\r\n if (trackingSystemsArray) {\r\n for (var i = 0; i < trackingSystemsArray.length; ++i) {\r\n if (!trackingSystemsArray[i][event]) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n externalTrackingEventBus.resetEvent = function (event) {\r\n var trackingSystemsArray = _.values(_trackingSystems);\r\n\r\n if (trackingSystemsArray) {\r\n for (var i = 0; i < trackingSystemsArray.length; ++i) {\r\n if (trackingSystemsArray[i][event]) {\r\n trackingSystemsArray[i][event] = false;\r\n }\r\n }\r\n }\r\n };\r\n\r\n externalTrackingEventBus.eventHandled = function (trackingSystem, event, data) {\r\n var trackingSystemObject = _trackingSystems[trackingSystem];\r\n\r\n if (!_.isUndefined(trackingSystemObject)) {\r\n trackingSystemObject[event] = true;\r\n }\r\n\r\n if (this.eventHandledByAllSystems(event)) {\r\n this.resetEvent(event);\r\n if (w.PubSub) {\r\n w.PubSub.publish(w.ExternalTrackingEventBus.channel.event.handled, { topicAction: event, data: data });\r\n }\r\n }\r\n };\r\n\r\n externalTrackingEventBus.hasRegisteredSystems = function () {\r\n var trackingSystemsArray = _.values(_trackingSystems);\r\n return trackingSystemsArray && trackingSystemsArray.length > 0;\r\n };\r\n\r\n return externalTrackingEventBus;\r\n}));"],"names":["$","_","root","_trackingMetadataCache","_reportCartChange","topic","trackableCartChanges","isEmpty","cartChangeMetadata","channelParts","split","topicAction","length","topicType","toLowerCase","source","currencyCode","globalSettings","activeCurrencyCode","items","PubSub","publish","addedQtyItems","trackableAddedQtyLinesMetadata","removedQtyItems","trackableRemovedQtyLinesMetadata","_reportCheckoutOption","optionData","_loadMetadataForTrackingProducts","productIds","deferred","Deferred","productMetadata","toFetch","each","productId","cached","push","ajax","url","R","type","data","productIDs","done","fetchedMetadata","fetched","resolve","fail","reject","promise","productListType","productList","relatedProducts","bestsellers","alsoBought","searchResults","subscribe","result","trackableMetadata","_reportShoppingListChange","shoppingListChangeMetadata","toProductListType","mode","reportProductListView","productListName","trackingProductsWithLinks","productListViewData","siteCurrencyCode","listType","listName","trim","trackingProductIds","map","product","when","metadata","trackingProductMetadataMap","trackingProduct","trackingProductMetadata","extend","console","error","reportProductDetailsView","parseInt","trackingProductDetails","reportPaymentOptionSelection","step","paymentName","isPaymentStep","option","reportDeliveryOptionSelection","deliveryName","isDeliveryStep","reporWebshopSearchEvent","searchText","loadMetadataForTrackingProducts","jQuery","window","w","_trackingSystems","ExternalTrackingEventBus","channel","event","handled","_topic","register","trackingSystem","trackingSystemsObject","isUndefined","eventHandledByAllSystems","trackingSystemsArray","values","i","resetEvent","eventHandled","trackingSystemObject","this","hasRegisteredSystems"],"mappings":"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"}