1var dataLayerEvent = []; 2var clickTracker = []; 3 4dataLayerEvent.pendingCartEvents = []; 5 6dataLayerEvent.useGA4 = $('#google-ga4-enable').val().toLocaleLowerCase() == 's' ? true : false; 7dataLayerEvent.advancedEcommerce = $('#google-ecommerce-enable').val().toLocaleLowerCase() == 's' ? true : false; 8 9dataLayerEvent.addPendingCartEvent = function (item, eventName) { 10 dataLayerEvent.pendingCartEvents.push({ 11 item: item, 12 name: eventName 13 }); 14}; 15 16dataLayerEvent.clearPendingCartEvent = function () { 17 dataLayerEvent.pendingCartEvents = []; 18} 19 20dataLayerEvent.sendPendingCartEvents = function () { 21 for (var event of dataLayerEvent.pendingCartEvents) { 22 dataLayerEvent.makeGACartEvent(event.item, event.name); 23 } 24 25 dataLayerEvent.clearPendingCartEvent(); 26}; 27 28dataLayerEvent.getProduct = function (productId) { 29 if (typeof(dataLayer) !== "object" || !dataLayer instanceof Array) { 30 return; 31 } 32 33 var data = dataLayer.filter(function (property) { 34 return property.ecommerce && property.ecommerce.impressions; 35 }).shift(); 36 37 if (!data) { 38 return; 39 } 40 41 var impressions = data.ecommerce.impressions; 42 43 return impressions.filter(function (product) { 44 return product.id == productId; 45 }).shift(); 46}; 47 48dataLayerEvent.makeGAProductClickEvent = function (productId) { 49 if (typeof(dataLayer) === "undefined") { 50 return; 51 } 52 53 var product = dataLayerEvent.getProduct(productId); 54 if (!product) { 55 return; 56 } 57 58 product.list = product.list || 'produto'; 59 60 var eventData = { 61 'event': 'productClick', 62 'ecommerce': { 63 'currencyCode': 'BRL', 64 'click': { 65 'actionField': { 'list': product.list }, 66 'products': [product] 67 } 68 } 69 } 70 71 dataLayer.push(eventData); 72}; 73 74clickTracker.productClick = function () { 75 $(document).on('click','a[href*="/produto/"]', function (ev) { 76 var parents = $(this).parents(); 77 78 for (var key in parents) { 79 var $element = $(parents[key]); 80 if ($element.prop("tagName") == 'BODY') { 81 return true; 82 } 83 if (!$element.attr('class') || !$element.attr('class').match(/product/)) { 84 continue; 85 } 86 87 if ($element.find('input[value="comprarapida"]').length) { 88 var productId = $element.find('input[name="id"]').val(); 89 dataLayerEvent.makeGAProductClickEvent(productId); 90 return true; 91 } 92 93 var $link = $element.find('a[data-href*="avisodisponiveltodasunidades"]'); 94 if ($link.length) { 95 var productId = helper.strstr($link.attr('data-href'), 'id=').replace('id=', ''); 96 dataLayerEvent.makeGAProductClickEvent(productId); 97 return true; 98 } 99 } 100 101 return true; 102 }); 103 104 $('a[data-href*="avisodisponiveltodasunidades"]').on('click', function (ev) { 105 $this = $(this); 106 if (!$this.attr('data-href').match(/avisodisponiveltodasunidades/)) { 107 return true; 108 } 109 110 var productId = helper.strstr($this.attr('data-href'), 'id=').replace('id=', ''); 111 dataLayerEvent.makeGAProductClickEvent(productId); 112 return true; 113 }); 114 115 $(document).on('submit','.ajaxform, form[data-action]', function () { 116 var $this = $(this); 117 if (!$this.find('input[value="comprarapida"]').length) { 118 return true; 119 } 120 121 var productId = $this.find('input[name="id"]').val(); 122 123 dataLayerEvent.makeGAProductClickEvent(productId); 124 }); 125}; 126 127dataLayerEvent.makeGACheckoutStepEvent = function (step) { 128 if (typeof(dataLayer) === "undefined") { 129 return; 130 } 131 132 var eventData = { 133 'event': 'checkout', 134 'ecommerce': { 135 'checkout': { 136 'actionField': { 'step': step || 1 }, 137 } 138 } 139 } 140 141 dataLayer.push(eventData); 142}; 143 144dataLayerEvent.makeGACheckoutOptionEvent = function (step, checkoutOption) { 145 if (dataLayerEvent.useGA4) { 146 return; 147 } 148 149 if (typeof(dataLayer) === "undefined") { 150 return; 151 } 152 153 var eventData = { 154 'event': 'checkoutOption', 155 'ecommerce': { 156 'checkout_option': { 157 'actionField': { 'step': step, 'option': checkoutOption } 158 } 159 } 160 } 161 162 dataLayer.push(eventData); 163}; 164 165dataLayerEvent.cartEvents = { 166 'addToCart': 'add', 167 'removeFromCart': 'remove' 168}; 169 170dataLayerEvent.makeGACartEvent = function (item, eventName) { 171 if (typeof(dataLayer) === "undefined") { 172 return; 173 } 174 175 if (!dataLayerEvent.useGA4) { 176 var eventAction = dataLayerEvent.cartEvents[eventName] || 'none'; 177 var eventData = { 178 'event': eventName, 179 'ecommerce': { 180 'currencyCode': 'BRL', 181 eventAction: { 182 'products': [item], 183 } 184 } 185 } 186 187 dataLayer.push(eventData); 188 return; 189 } 190 191 dataLayerEvent.buildEventData(eventName, dataLayerEvent.buildItems([item])); 192}; 193 194dataLayerEvent.buildEventData = function(eventName, items, additionalData) { 195 let value = 0; 196 197 if (cart.subtotalValue) { 198 value = cart.subtotalValue - cart.couponValue; 199 } 200 201 if (checkout.order.total) { 202 value = checkout.order.total; 203 } 204 205 if (!dataLayerEvent.advancedEcommerce) { 206 gtag("event", eventName, { 207 currency: value ? "BRL": null, 208 value: is_null(value) ? 0 : value, 209 coupon: orderCoupon.appliedCoupon.reference ? orderCoupon.appliedCoupon.reference : null, 210 items: items, 211 ...additionalData 212 }); 213 214 return; 215 } 216 217 dataLayer.push({ 218 event: eventName, 219 value: value, 220 coupon: orderCoupon.appliedCoupon.reference ? orderCoupon.appliedCoupon.reference : null, 221 ...additionalData, 222 ecommerce: { 223 items: items 224 } 225 }); 226} 227 228dataLayerEvent.buildLoginEventData = function(eventName, method) { 229 if (!dataLayerEvent.advancedEcommerce) { 230 gtag("event", eventName, { 231 method: method 232 }); 233 234 return; 235 } 236 237 dataLayer.push({ 238 event: eventName, 239 method: method 240 }); 241} 242 243dataLayerEvent.buildItems = function(items) { 244 let itemsData = items.map(item => { 245 return { 246 item_id: item.id ? item.id : null, 247 item_name: item.name ? item.name : null, 248 price: item.price ? item.price : null, 249 quantity: item.quantity ? item.quantity : 1, 250 item_variant: item.variant ? item.variant : null 251 } 252 }); 253 254 return itemsData; 255} 256 257dataLayerEvent.translateCartToDataLayerItems = function() { 258 if (!cart.items) { 259 return null; 260 } 261 262 const items = cart.items.map(item => { 263 let variant = null; 264 if (item.tamanho && item.opcao) { 265 variant = `${item.produto.id}-${item.opcao.id}-${item.tamanho.id}`; 266 } 267 268 return { 269 item_id: item.produto.id ? item.produto.id : null, 270 item_name: item.produto.nome ? item.produto.nome : null, 271 price: item.preco ? item.preco : null, 272 quantity: item.quantidade ? item.quantidade : 1, 273 item_variant: variant 274 } 275 }); 276 277 return items; 278} 279 280clickTracker.cartEvents = function () { 281 var selector = 'a[data-add-action]'; 282 var quantitySelector = 'input[data-quantity]'; 283 var removeSelector = 'a[data-ask-action="excluirUnidade"]'; 284 285 $(document).on('click', selector, function (ev) { 286 dataLayerEvent.clearPendingCartEvent() 287 288 var action = $(this).data('add-action'); 289 var $quantityUnit = $(this).parent('[data-quantity-unit]'); 290 291 var itemSku = $quantityUnit.data('quantity-unit'); 292 var productId = itemSku.split('-')[0]; 293 var item = { 294 'id': productId, 295 'variant': itemSku, 296 'quantity': 1 297 }; 298 299 var eventName = dataLayerEvent.useGA4 ? 'add_to_cart' : 'addToCart'; 300 if (action == 'down') { 301 eventName = dataLayerEvent.useGA4 ? 'remove_from_cart' : 'removeFromCart'; 302 303 var quantity = $quantityUnit.find(quantitySelector).val(); 304 // O envio é executado após a confirmação do usuário 305 if (quantity == 1) { 306 dataLayerEvent.addPendingCartEvent(item, eventName); 307 return true; 308 } 309 } 310 311 dataLayerEvent.makeGACartEvent(item, eventName); 312 }); 313 314 $(document).on('focus', quantitySelector, function () { 315 if (!this.previousValue) { 316 this.previousValue = this.value; 317 } 318 }).on('change', quantitySelector, function (ev) { 319 dataLayerEvent.clearPendingCartEvent() 320 321 var diffQuantity = this.value - this.previousValue; 322 323 var eventName = dataLayerEvent.useGA4 ? 'add_to_cart' : 'addToCart'; 324 if (diffQuantity < 0) { 325 eventName = dataLayerEvent.useGA4 ? 'remove_from_cart' : 'removeFromCart'; 326 } 327 328 var itemSku = $(this).parent('[data-quantity-unit]').data('quantity-unit'); 329 var productId = itemSku.split('-')[0]; 330 var item = { 331 'id': productId, 332 'variant': itemSku, 333 'quantity': Math.abs(diffQuantity) 334 }; 335 336 this.previousValue = this.value; 337 338 // O envio é executado após a confirmação do usuário 339 if (this.value == 0) { 340 dataLayerEvent.addPendingCartEvent(item, eventName); 341 return true; 342 } 343 344 dataLayerEvent.makeGACartEvent(item, eventName); 345 }); 346 347 $(document).on('click', removeSelector, function () { 348 dataLayerEvent.clearPendingCartEvent() 349 350 var itemSku = $(this).siblings('[data-quantity-unit]').data('quantity-unit'); 351 if (!itemSku) { 352 itemSku = $(this).data('itemsku'); 353 } 354 355 var productId = itemSku.split('-')[0]; 356 var item = { 357 'id': productId, 358 'variant': itemSku 359 }; 360 361 dataLayerEvent.addPendingCartEvent(item, dataLayerEvent.useGA4 ? 'remove_from_cart' : 'removeFromCart'); 362 }) 363}; 364 365clickTracker.stepsEvents = function() { 366 $(document).on('checkout.stepevent', function(ev, step, stepsName) { 367 clickTracker.buildGA4Event(step, stepsName); 368 }); 369} 370 371clickTracker.buildGA4Event = function(step, stepsName, additionalData = {}) { 372 const stepsNameContent = { 373 0: 'begin_checkout', 374 1: 'sign_up', 375 2: 'login', 376 3: 'create_address', 377 4: 'add_address_info', 378 5: 'add_billing_info', 379 6: 'add_shipping_info', 380 7: 'add_coupon', 381 8: 'add_payment_info' 382 }; 383 384 if (dataLayerEvent.useGA4) { 385 if (step == 1 || step == 2) { 386 dataLayerEvent.buildLoginEventData( 387 stepsNameContent[step], 388 'Guest' 389 ); 390 391 return; 392 } 393 394 dataLayerEvent.buildEventData( 395 stepsNameContent[step], 396 dataLayerEvent.translateCartToDataLayerItems(), 397 additionalData 398 ); 399 } 400} 401 402clickTracker.eventTriggered = { 403 login: false, 404 signUp: false, 405 addAddress: false, 406 createAddress: false, 407 addShipping: false, 408 addBilling: false 409}; 410 411clickTracker.checkoutEvents = function () { 412 $(document).on('checkout.step', function (ev, step, stepName) { 413 if (!helper.isEmpty(step)) { 414 dataLayerEvent.makeGACheckoutStepEvent(step); 415 } 416 }); 417 418 $(document).on('checkout.login', function (ev, option) { 419 if (!helper.isEmpty(option) && !clickTracker.eventTriggered.login) { 420 clickTracker.eventTriggered.login = true; 421 clickTracker.buildGA4Event(2, 'login'); 422 dataLayerEvent.makeGACheckoutOptionEvent(1, option); 423 } 424 }); 425 426 $(document).on('checkout.address.selected', function (ev, option) { 427 if (!helper.isEmpty(option) && !clickTracker.eventTriggered.addAddress) { 428 clickTracker.eventTriggered.addAddress = true; 429 clickTracker.buildGA4Event(4, 'add_address_info'); 430 dataLayerEvent.makeGACheckoutOptionEvent(2, 'selecionado'); 431 } 432 }); 433 434 $(document).on('checkout.address.created', function (ev, option) { 435 if (!helper.isEmpty(option) && !clickTracker.eventTriggered.createAddress) { 436 clickTracker.eventTriggered.createAddress = true; 437 clickTracker.buildGA4Event(3, 'create_address'); 438 dataLayerEvent.makeGACheckoutOptionEvent(2, 'cadastro'); 439 } 440 }); 441 442 $(document).on('checkout.delivery.selected', function (ev, option) { 443 if (!helper.isEmpty(option) && 'nome' in option && !clickTracker.eventTriggered.addShipping) { 444 clickTracker.eventTriggered.addShipping = true; 445 clickTracker.buildGA4Event(6, 'add_shipping_info'); 446 dataLayerEvent.makeGACheckoutOptionEvent(3, option.nome); 447 } 448 }); 449 450 $(document).on('checkout.billingaddress.selected', function (ev, option) { 451 if (!helper.isEmpty(option) && !clickTracker.eventTriggered.addBilling) { 452 clickTracker.eventTriggered.addBilling = true; 453 clickTracker.buildGA4Event(5, 'add_billing_info'); 454 dataLayerEvent.makeGACheckoutOptionEvent(4, 'selecionado'); 455 } 456 }); 457 458 $(document).on('checkout.billingaddress.created', function (ev, option) { 459 if (!helper.isEmpty(option) && !clickTracker.eventTriggered.addBilling) { 460 clickTracker.eventTriggered.addBilling = true; 461 clickTracker.buildGA4Event(5, 'add_billing_info'); 462 dataLayerEvent.makeGACheckoutOptionEvent(4, 'cadastro'); 463 } 464 }); 465 466 $(document).on('checkout.payment.selected', function (ev, option) { 467 if (!helper.isEmpty(option) && 'nomeExibicao' in option) { 468 const data = {payment_type: option.nomeExibicao}; 469 470 clickTracker.buildGA4Event(8, 'add_payment_info', data); 471 dataLayerEvent.makeGACheckoutOptionEvent(4, option.nomeExibicao); 472 } 473 }); 474 475 $(document).on('checkout.coupon.applied', (ev, coupon) => { 476 clickTracker.buildGA4Event(7, 'add_coupon'); 477 }); 478}; 479 480$(function () { 481 clickTracker.productClick(); 482 clickTracker.cartEvents(); 483 clickTracker.checkoutEvents(); 484 clickTracker.stepsEvents(); 485});
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.