1// WOO EVENTS 2 3FP.fns.fbp_woo_events = () => { 4 5 // TRACK IMPRESSIONS 6 7 function track_woo_impress() { 8 9 if ( ! fpdata.woo.lists.single ) return; 10 if ( ! fp.woo.fbp ) fp.woo.fbp = { 'single' : [] }; 11 12 let items_a = [], 13 value = 0, 14 item_ids = fpdata.woo.lists.single.filter( id => ! fp.woo.fbp.single.includes(id) ); // track only items that were not tracked before 15 16 item_ids.forEach( id => { 17 18 let prod = fpdata.woo.products[id], 19 item = { 20 'id' : FP.fns.get_woo_prod_id(prod), 21 'quantity' : 1, 22 }; 23 24 value += prod.price; 25 items_a.push( item ); 26 }); 27 28 // prevent double tracking in case the next prods are added dynamically 29 fp.woo.fbp.single.push(...item_ids); 30 31 if ( items_a.length > 0 ) { 32 33 let payload_o = { 34 'contents' : items_a, 35 'currency' : fpdata.woo.currency, 36 'value' : value, 37 'content_type' : 'product' 38 }; 39 40 FP.track_fbp_evt( false, 'ViewContent', false, payload_o ); 41 } 42 }; 43 44 if ( ! ( fp.woo.dont_track_views_after_refresh && fpdata.refreshed ) ){ 45 track_woo_impress(); 46 FP.addAction( ['woo_impress'], track_woo_impress ); 47 } 48 49 // TRACK DEFAULT VARIANT VIEW 50 // TRACK VARIANT VIEWS 51 52 function woo_variant_view( variant_id ){ 53 54 let prod = fpdata.woo.products[variant_id]; 55 56 let payload_o = { 57 'contents' : [ { 58 'id' : FP.fns.get_woo_prod_id(prod), 59 'quantity' : 1, 60 } ], 61 'currency' : fpdata.woo.currency, 62 'value' : prod.price, 63 'content_type' : 'product' 64 }; 65 66 FP.track_fbp_evt( false, 'ViewContent', false, payload_o ); 67 } 68 69 FP.addAction( ['woo_variant_view'], woo_variant_view ); 70 FP.addAction( ['woo_def_variant_view'], woo_variant_view ); 71 72 // TRACK ADD TO CART 73 // TRACK ADD TO WISHLIST 74 75 function track_items( data, event_name ){ 76 77 let products_data = data.products, 78 event_value = data.value, 79 items_a = []; 80 81 products_data.forEach( prod_a => { 82 83 let prod = prod_a[0], 84 qty = prod_a[1] || prod.qty || 1, 85 item = { 86 'id' : FP.fns.get_woo_prod_id( prod ), 87 'item_price' : prod.price, 88 'quantity' : parseInt(qty), 89 }; 90 91 items_a.push( item ); 92 } ); 93 94 if ( items_a.length == 0 ) return false; 95 96 let payload_o = { 97 'contents' : items_a, 98 'value' : event_value, 99 'currency' : fpdata.woo.currency, 100 'content_type' : 'product' 101 }; 102 103 FP.track_fbp_evt( false, event_name, false, payload_o ); 104 }; 105 106 FP.addAction( ['woo_add_to_cart'], data =>{ 107 track_items( data, 'AddToCart' ); 108 } ); 109 110 FP.addAction( ['woo_add_to_wishlist'], data => { 111 track_items( data, 'AddToWishlist'); 112 } ); 113 114 // TRACK CHECKOUT 115 // TRACK ORDER 116 117 function track_cart( type ){ // type can be either "checkout" or "order" 118 119 let items_type = fp.woo.variable_tracking_method == 'track_parents' ? 'joined_items' : 'items', 120 items_a = [], 121 cart = type == 'checkout' ? fpdata.woo.cart : fpdata.woo.order, 122 event_name = type == 'checkout' ? 'InitiateCheckout' : 'Purchase'; 123 124 for ( const id in cart[items_type] ) { 125 126 let prod = cart[items_type][id], 127 item = { 128 'id' : FP.fns.get_woo_prod_id(prod), 129 'item_price' : prod.price, 130 'quantity' : prod.qty, 131 }; 132 133 items_a.push( item ); 134 } 135 136 if ( items_a.length == 0 ) return false; 137 138 let payload_o = { 139 'contents' : items_a, 140 'value' : cart.value, 141 'num_items': items_a.length, 142 'currency' : fpdata.woo.currency, 143 'content_type' : 'product', 144 }; 145 146 FP.track_fbp_evt( false, event_name, false, payload_o ); 147 } 148 149 // track order 150 // unless we already do it through server with advanced order tracking 151 if ( fp.woo.order_data_ready ) { 152 if ( ! fp.main.is_pro || ! ( fp.fbp.server_side && fp.fbp.adv_orders ) ) { 153 track_cart('order'); 154 } else { 155 if ( fp.main.debug ) console.log( '[FP] Meta Pixel purchase event is tracked by the server-side script' ); 156 } 157 }; 158 159 // track the start of checkout (except when the whole page or its part is refreshed) 160 if ( ! fpdata.refreshed ) { 161 if ( fp.woo.checkout_data_ready ) { 162 fp.fbp.woo_checkout_tracked = true; 163 track_cart('checkout') 164 } else { 165 document.addEventListener( 'fupi_woo_checkout_data_ready', ()=>{ 166 if ( ! fp.fbp.woo_checkout_tracked ) { 167 fp.fbp.woo_checkout_tracked = true; 168 track_cart('checkout'); 169 } 170 }) 171 }; 172 } 173}; 174 175// STANDARD EVENTS 176 177FP.fns.fbp_standard_events = () => { 178 179 // TRACK OUTBOUND LINKS 180 181 if ( fp.fbp.track_outbound ) { 182 FP.addAction( ['click'], function(){ 183 if ( fpdata.clicked.link && fpdata.clicked.link.is_outbound ) { 184 var data = { 185 'url' : fpdata.clicked.link.href, 186 'time on page' : fpdata.activity.total, 187 }; 188 FP.track_fbp_evt( true, 'outbound', false, data, !! fp.fbp.track_outbound_capi ); 189 } 190 } ); 191 } 192 193 // TRACK CLICKS ON EMAIL & TEL LINKS 194 195 if ( fp.fbp.track_email_tel ) { 196 FP.addAction( ['click'], function(){ 197 if ( fpdata.clicked.link && ( fpdata.clicked.link.is_email || fpdata.clicked.link.is_tel ) ) { 198 var data = { 199 'target' : fpdata.clicked.link.safe_email || fpdata.clicked.link.safe_tel, 200 'type' : fpdata.clicked.link.is_email ? 'email' : 'tel', 201 'time on page' : fpdata.activity.total, 202 }; 203 FP.track_fbp_evt( true, 'Contact', false, data, !! fp.fbp.track_email_tel_capi ); 204 } 205 } ); 206 } 207 208 // TRACK AFFILIATE LINKS 209 210 if ( fp.fbp.track_affiliate ) { 211 FP.addAction( ['click'], function(){ 212 var trackedAffLink = FP.getTrackedAffiliateLink( fp.fbp.track_affiliate ); 213 if ( trackedAffLink ) { 214 var data = { 215 'target' : trackedAffLink, 216 'time on page' : fpdata.activity.total, 217 }; 218 FP.track_fbp_evt( true, 'affiliate', false, data, !! fp.fbp.track_affiliate_capi ); 219 } 220 } ); 221 } 222 223 // TRACK FILE DOWNLOADS 224 225 if ( fp.fbp.track_file_downl ) { 226 FP.addAction( ['click'], function(){ 227 var filename = FP.getTrackedFilename( fp.fbp.track_file_downl ); 228 if ( filename ) { 229 var data = { 230 'file' : filename, 231 'time on page' : fpdata.activity.total, 232 }; 233 FP.track_fbp_evt( true, 'file download', false, data, !! fp.fbp.track_file_downl_capi ); 234 } 235 } ); 236 }; 237 238 // TRACK FORMS 239 240 if ( fp.fbp.track_forms ) { 241 FP.addAction( ['form_submit'], function(){ 242 var submittedForm = FP.getSubmittedForm( fp.fbp.track_forms ); 243 if ( submittedForm ){ 244 var data = { 245 'form' : submittedForm, 246 'time on page' : fpdata.activity.total, 247 }; 248 FP.track_fbp_evt( true, 'form submit', false, data, !! fp.fbp.track_forms_capi ); 249 } 250 }) 251 } 252 253 // TRACK SCROLLS 254 255 if ( fp.fbp.track_scroll ){ 256 fp.fbp.track_scroll = FP.formatScrollPoints( fp.fbp.track_scroll ); 257 FP.addAction( ['scroll', 'active_time_tick'], function(){ 258 // check if the window was scrolled 259 if ( fp.fbp.track_scroll.length > 0 && fpdata.activity.total >= fp.track.track_scroll_time && fpdata.scrolled.current_px >= fp.track.track_scroll_min ) { 260 var reachedPoint = FP.isScrollTracked( fp.fbp.track_scroll ); 261 if ( reachedPoint ) { 262 // remove from array the scroll points that were already reached 263 fp.fbp.track_scroll = fp.fbp.track_scroll.filter( function( point ){ return point > reachedPoint } ); 264 // track scroll 265 var data = { 266 'scroll height' : reachedPoint, 267 'time on page' : fpdata.activity.total, 268 }; 269 FP.track_fbp_evt( true, 'scroll', false, data, !! fp.fbp.track_scroll_capi ); 270 } 271 } 272 } ); 273 } 274 275 // TRACK VIEWS OF ELEMENTS 276 // for performance: waits 250ms for dynamically generated content to finish 277 278 FP.fns.fbp_observe_inters = ( newly_added_els = false ) => { 279 280 let send_el_view_evt = el => { 281 282 var data = { 283 'element' : el.dataset['fbp_view'], 284 'el' : el.dataset['fbp_view'], // for compat. with FP ver < 2.3 285 'time on page' : fpdata.activity.total, 286 }; 287 FP.track_fbp_evt( true, 'user viewed', false, data, !! fp.fbp.track_views_capi ); 288 }; 289 290 FP.intersectionObserver( newly_added_els, fp.fbp.track_views, 'fbp', send_el_view_evt, true); 291 } 292 293 if ( fp.fbp.track_views ) setTimeout( ()=>{ 294 FP.fns.fbp_observe_inters(); 295 FP.addAction( ['dom_modified'], FP.fns.fbp_observe_inters ); 296 }, 250 ); 297 298 299 300 // TRACK SPECIFIC ELEMENTS 301 302 if ( fp.fbp.track_elems ) { 303 FP.addAction( ['click'], function(){ 304 var trackedElName = FP.getClickTarget( fp.fbp.track_elems ); 305 if ( trackedElName ) { 306 var data = { 307 'name' : trackedElName, 308 'time on page' : fpdata.activity.total, 309 }; 310 FP.track_fbp_evt( true, 'click on element', false, data, !! fp.fbp.track_elems_capi ); 311 } 312 }) 313 } 314}; 315 316FP.fns.load_fbp_footer = function() { 317 FP.fns.fbp_standard_events(); 318 if ( fp.loaded.includes('woo') ) FP.fns.fbp_woo_events(); 319} 320 321// INIT FOOTER SCRIPTS 322FP.enqueueFn( 'FP.fns.load_fbp_footer' );
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.