1export default class GTMWatch{constructor(){this.selector="[data-gtm-event]";this.init()}init(){this.bind()}trackProductImpressions(){if(!$(this.selector).length)return;let items=[];let self=this;$(this.selector).each(function(){const evt=$(self.selector).data("gtm-event");$(this).find(".gtm-data").each(function(){if($(this).attr("data-gtm-done")=="true")return;const $this=$(this);const item=self._fillDataStructure($this);items.push(item);$this.attr("data-gtm-done","true")});if(items.length)self.pushToDataLayer(self._toGtmObject(evt, 2items));items=[]})}trackSelectItem(e){if(!$(e.target).hasClass("buy")&&!$(e.target).hasClass("btn--wishlist")){let items=[];const item=this._fillDataStructure($(e.currentTarget).find(".gtm-data"));items.push(item);this.pushToDataLayer(this._toGtmObject("select_item",items))}}trackSelectItemFavorite(e){if(!$(e.target).hasClass("buy")){let items=[];const item=this._fillDataStructure($(e.currentTarget).find(".gtm-data"));items.push(item);this.pushToDataLayer(this._toGtmObject("select_item_favorite", 3items))}}trackAddToCart(data){let items=[];const item=this._fillDataStructure(data);items.push(item);this.pushToDataLayer(this._toGtmObject("add_to_cart",items));$(data).attr("data-gtm-done","true")}trackRemoveCart(data){let items=[];const item=this._fillDataStructure(data);items.push(item);this.pushToDataLayer(this._toGtmObject("remove_from_cart",items))}trackRemoveFromCart(data){let items=[];const item=this._fillDataStructure(data);items.push(item);this.pushToDataLayer(this._toGtmObject("remove_from_cart", 4items))}pushToDataLayer(obj){let url=new URL(window.location.href);window.dataLayer.push(obj)}_fillDataStructure(data){const self=this;const item={};$.each(data.data(),function(key,value){if(value&&key!=="gtmDone"){const val=key!=="index"?String(value):value;item[self._camelToSnake(key)]=val}});return item}_camelToSnake(str){const result=str.replace(/([A-Z])/g," $1");return result.split(" ").join("_").toLowerCase()}_toGtmObject(evt,obj){return{"event":evt,"ecommerce":{"items":obj}}}bind(){$(document).ready(this.trackProductImpressions.bind(this)); 5$(document).on("tdi:ajax:done",this.trackProductImpressions.bind(this));$(document).on("click",".selling-card:not(.library):not(.wishlist), .autocomplete-card",this.trackSelectItem.bind(this));$(document).on("click",".selling-card.wishlist, .btn--wishlist",this.trackSelectItemFavorite.bind(this))}};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.