1(function ($) { 2 $(document).ready(function () { 3 4 let eventTagTimeout; 5 window.tcfEventsTags = new TcfTagsEvents(); 6 eventTagTimeout = setTimeout(() => { 7 window.tcfEventsTags.init(); 8 }, 4000); 9 10 }); 11 12 class TcfTagsEvents { 13 constructor() { 14 this.eventName = ''; 15 this.paymentMethod = ''; 16 } 17 18 init() { 19 this.attachPaymentListener(); 20 this.passEventNameOnPageLoad(); 21 this.attachAddToCartListener(); 22 this.attachBillingEmailListener(); 23 // this.getUTMParameters(); 24 } 25 26 passEventNameOnPageLoad() { 27 this.eventName = this.getEventName(); 28 29 if (this.eventName) { 30 console.log('Passing event name on page load: ' + this.eventName); 31 // const formAttrs = this.getEventNameAttributes(); 32 const utmParams = this.getUTMParams(); 33 34 let data = { 35 eventName: this.eventName, 36 ...utmParams 37 } 38 39 this.passEventToGA('EventView', data); 40 console.log('hitted') 41 } else { 42 console.log('No event name available to pass.'); 43 } 44 } 45 46 attachAddToCartListener() { 47 let self = this; 48 $('#order_now').on('click', (event) => { 49 event.preventDefault(); 50 const formAttrs = this.gatherTicketInfo(); 51 52 if ( formAttrs.eventTicketQuantities > 0 ) { 53 54 const existingEventData = self.getEventsDataFromLocalStorage('eventData'); 55 if (!existingEventData){ 56 57 self.setEventDataWithExpiry('eventData', formAttrs, 2); 58 self.passEventToGA('EventAddToCart', formAttrs); 59 console.log('EventAddToCart', formAttrs) 60 } 61 else { 62 console.log('EventAddToCart exists:', existingEventData); 63 } 64 } 65 66 }); 67 } 68 69 attachBillingEmailListener() { 70 let self = this; 71 let billingEmailTimeout; 72 73 $('#billing_email').on('input', () => { 74 clearTimeout(billingEmailTimeout); 75 76 billingEmailTimeout = setTimeout(() => { 77 78 const eventData = self.getEventsDataFromLocalStorage('eventData'); 79 const paymentMethod = $('input[name="payment_method"]:checked').val() || 'Not selected'; 80 81 if (eventData) { 82 83 self.passEventToGA('EventAddedPaymentInfo', eventData); 84 console.log('EventAddedPaymentInfo', eventData); 85 } else { 86 console.log('EventAddedPaymentInfo expired'); 87 } 88 89 }, 3000); 90 }); 91 } 92 93 94 attachPaymentListener() { 95 let self = this; 96 97 $(document).on('woocommerce_thankyou_page_init', function (e, data) { 98 const eventData = self.getEventsDataFromLocalStorage(); 99 100 if ( eventData ) { 101 eventData.eventOrderId = data.order_id; 102 self.passEventToGA('EventTicketPurchased', eventData); 103 localStorage.removeItem('eventData'); 104 console.log('Removed event data from local storage') 105 } 106 107 }); 108 } 109 110 passEventToGA(event, attrs = {}) { 111 if (typeof window.dataLayer !== 'undefined') { 112 attrs.event = event; 113 window.dataLayer.push(attrs); 114 console.log('Firing GA event: ', attrs); 115 } else { 116 console.log('GA event not fired, dataLayer not found: ', event); 117 } 118 } 119 120 getEventName() { 121 return $('.wpem-event-title h3').html() || ''; 122 } 123 124 setEventDataWithExpiry(key, data, expiryInDays) { 125 const now = new Date(); 126 const expiryTime = now.getTime() + expiryInDays * 24 * 60 * 60 * 1000; 127 const item = { 128 data: data, 129 expiry: expiryTime 130 }; 131 localStorage.setItem(key, JSON.stringify(item)); 132 } 133 134 getEventsDataFromLocalStorage(key = 'eventData') { 135 const itemStr = localStorage.getItem(key); 136 137 if (!itemStr) { 138 return null; 139 } 140 const item = JSON.parse(itemStr); 141 const now = new Date(); 142 143 if (item.expiry && now.getTime() > item.expiry) { 144 localStorage.removeItem(key); 145 return null; 146 } 147 148 return item.data; 149 } 150 151 gatherTicketInfo() { 152 const ticketsInfo = []; 153 const quantityDropdowns = $('[id^="quantity-"]'); 154 155 let eventTicketName = []; 156 let eventTicketPrice = 0 157 let eventTicketQuantities = 0; 158 let eventTicketCurrency = ''; 159 160 $(quantityDropdowns).each(function (index) { 161 162 if ( $(this).val() > 0 ) { 163 eventTicketName.push($(this).data('ticket-name')); 164 eventTicketQuantities += parseInt($(this).val()); 165 eventTicketPrice += parseInt($(this).data('amount')) * $(this).val(); 166 } 167 168 eventTicketCurrency = $(this).data('currency'); 169 }); 170
171 const utmParams = this.getUTMParams(); 172 173 let data = { 174 eventName: this.eventName, 175 eventTicketName: eventTicketName.join(", "), 176 eventTicketPrice: eventTicketPrice, 177 eventTicketQuantities: eventTicketQuantities, 178 eventTicketCurrency: eventTicketCurrency, 179 ...utmParams 180 }; 181 182 return data; 183 } 184 185 getUTMParams() { 186 const urlParams = new URLSearchParams(window.location.search); 187 return { 188 eventTicketsource: urlParams.get('utm_source') || null, 189 eventTicketmedium: urlParams.get('utm_medium') || null, 190 eventTicketcampaign: urlParams.get('utm_campaign') || null, 191 eventTicketterm: urlParams.get('utm_term') || null, 192 eventTicketcontent: urlParams.get('utm_content') || null 193 }; 194 } 195 196 } 197})(jQuery);
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.