PageSourceSearch

https://safariclubfoundation.org/wp-content/plugins/funnel-builder…/assets/js/native-tracks.js?ver=3.15.0.9

js safariclubfoundation.org collected 2026-10-02 10:37:49 UTC 47,816 bytes, 1,246 lines download raw bytes

1/*global wfacp_analytics_data*/
2(function ($) {
3    class Events {
4        constructor(data) {
5            if (undefined == data) {
6                return;
7            }
8            this.event_data = [];
9            this.instance_timeout = null;
10            this.timeout = 1500;
11            this.track_name = '';
12            this.track_id = data.id;
13            this.settings = data.settings;
14            this.positions = data.positions;
15            this.all_data  = data;
16            this.data = {
17                'add_to_cart': data.add_to_cart, 'checkout': data.checkout, 'payment_info': {}, 'shipping_info': data.shipping_info ? data.shipping_info : {}, 'last_checkout_data': null
18            };
19
20            this.add_to_cart_run = false;
21            this.checkout_event_run = false;
22            this.is_bumpevent = false;
23            this.init();
24            this.attach_triggers();
25
26        }
27
28        init() {
29
30        }
31
32        static enqueue_js() {
33        }
34
35        fire_events(type) {
36            if (this.positions.add_to_cart === type && false == this.add_to_cart_run) {
37                /*
38                 *hide add to cart on native checkout
39                 * only run in case wffn_pending_event is true
40                 * when add to cart run for custom ajax
41                 */
42                if (typeof this.all_data !== 'undefined' && this.all_data.hasOwnProperty('wffn_pending_event') && 'true' === this.all_data.wffn_pending_event) {
43                    this.add_to_cart();
44                }
45                this.add_to_cart_run = true;
46            }
47            if (this.positions.checkout === type) {
48                this.checkout();
49            }
50            if (this.positions.shipping_info === type) {
51                this.shipping_info();
52            }
53        }
54
55        attach_triggers() {
56            let self = this;
57            let step_changed = false;
58            let payment_trigger = false;
59            $('#billing_email').on('change', function () {
60                try {
61                    self.fire_events('email');
62                }catch (error) {
63                    console.log( error );
64                }
65
66            });
67
68            if (document.readyState === 'complete' || document.readyState === 'loading') {
69                $(document).ready(function () {
70                    try {
71                        self.fire_events('load');
72                        self.load();
73                        self.single_event_trigger();
74                    }catch (error) {
75                        console.log( error );
76                    }
77                });
78            } else {
79                $(window).on('load', function () {
80                    try {
81                        self.fire_events('load');
82                        self.load();
83                        self.single_event_trigger();
84                    }catch (error) {
85                        console.log( error );
86                    }
87                });
88            }
89
90        }
91
92        single_event_trigger() {
93            let self = this;
94            let step_button = $('.wfacp_next_page_button');
95            let step_changed = false;
96            let payment_trigger = false;
97            if (step_button.length > 0) {
98                $(document.body).on('wfacp_step_switching', function () {
99                    try {
100                        if (false === step_changed) {
101                            self.fire_events('button');
102                            step_changed = true;
103                        }
104                    }catch (error) {
105                        console.log( error );
106                    }
107                });
108            }
109
110            $(document.body).on('angelleye_paypal_onclick', function () {
111                try {
112                    if (false === payment_trigger) {
113                        self.payment_info();
114                        payment_trigger = true;
115                    }
116                }catch (error) {
117                    console.log( error );
118                }
119            });
120            $(document.body).on('kp_auth_success', function () {
121                try {
122                    if (false === payment_trigger) {
123                        self.payment_info();
124                        payment_trigger = true;
125                    }
126                }catch (error) {
127                    console.log( error );
128                }
129            });
130
131            // Trigger shipping_info event when shipping fields change
132            $(document.body).on('change', '#shipping_country, #shipping_state, #shipping_postcode, #shipping_city, #shipping_address_1, #shipping_address_2', function () {
133                try {
134                    self.fire_events('shipping_info');
135                }catch (error) {
136                    console.log( error );
137                }
138            });
139
140            // Trigger shipping_info event when cart is updated after shipping changes
141            $(document.body).on('updated_checkout', function () {
142                try {
143                    self.fire_events('shipping_info');
144                }catch (error) {
145                    console.log( error );
146                }
147            });
148
149            // Trigger shipping_info event when shipping method is selected
150            $(document.body).on('change', 'input[name="shipping_method[0]"], input[name="shipping_method"]', function () {
151                try {
152                    self.fire_events('shipping_info');
153                }catch (error) {
154                    console.log( error );
155                }
156            });
157
158            $(document.body).on('wfob_product_added', function (e, v) {
159                try {
160                    self.track_bump_item(v);
161                }catch (error) {
162                    console.log( error );
163                }
164            });
165            $(document.body).on('wfob_product_removed', function (e, v) {
166                try {
167                    self.track_remove_bump_item(v);
168                }catch (error) {
169                    console.log( error );
170                }
171            });
172
173            $(document.body).on('wfacp_product_added', function (e, v) {
174                try {
175                    self.add_item(v);
176                }catch (error) {
177                    console.log( error );
178                }
179            });
180
181            $(document.body).on('wfacp_checkout_data', function (e, v) {
182                if (v.hasOwnProperty('checkout') && v.hasOwnProperty('checkout')) {
183                    if (v.checkout === undefined) {
184                        return;
185                    }
186                    if (!v.checkout.hasOwnProperty(self.track_name)) {
187                        return;
188                    }
189                    self.data.checkout = v.checkout[self.track_name];
190                    step_changed = false;
191                    self.checkout_event_run = false;
192                }
193            });
194        }
195
196        add_item(v, by_pass = false) {
197            if (v.hasOwnProperty('item_key') && v.hasOwnProperty('item') && v.item.hasOwnProperty(v.item_key)) {
198                let item_key = v.item_key;
199                if (undefined == this.data.add_to_cart) {
200                    return;
201                }
202                if (this.data.add_to_cart.hasOwnProperty(item_key)) {
203                    return;
204                }
205                if (v.item[item_key].hasOwnProperty(this.track_name)) {
206                    if (v.item.hasOwnProperty('is_bundle') && v.item[item_key][this.track_name].length !== 0) {
207                        let b_items = v.item[item_key][this.track_name];
208                        for (let b_item in b_items) {
209                            this.data.add_to_cart[b_item] = b_items[b_item];
210                            this.single_add_to_cart(b_items[b_item], by_pass);
211                        }
212
213                    } else {
214                        this.data.add_to_cart[item_key] = v.item[item_key];
215                        this.single_add_to_cart(v.item[item_key][this.track_name], by_pass);
216                    }
217                }
218
219                this.checkout_event_run = false;
220            }
221        }
222
223        remove_item(v) {
224            if (v.hasOwnProperty('item_key') && v.hasOwnProperty('item') && v.item.hasOwnProperty(v.item_key)) {
225                let item_key = v.item_key;
226                if (this.data.add_to_cart.hasOwnProperty(item_key)) {
227                    delete this.data.add_to_cart[item_key];
228                }
229
230                if (v.item[item_key].hasOwnProperty(this.track_name)) {
231                    if (v.item.hasOwnProperty('is_bundle') && v.item[item_key][this.track_name].length !== 0) {
232                        let b_items = v.item[item_key][this.track_name];
233                        for (let b_item in b_items) {
234                            this.remove_add_to_cart(b_items[b_item], v.item.cart_key);
235                        }
236                        ;
237                    } else {
238                        this.remove_add_to_cart(v.item[item_key][this.track_name], v.item.cart_key);
239                    }
240                }
241
242                this.checkout_event_run = false;
243            }
244        }
245
246
247        single_add_to_cart(data, by_pass = false) {
248            if (this.settings.add_to_cart === 'true' || true == by_pass) {
249                this.event_single_add_to_cart(data);
250            }
251        }
252
253
254        remove_add_to_cart(data) {
255            this.event_remove_add_to_cart(data);
256        }
257
258
259        event_single_add_to_cart(data) {
260
261        }
262
263        event_remove_add_to_cart(data) {
264
265        }
266
267        /**
268         * Fire JavaScript action hook for add_to_cart events
269         * Allows developers to listen and duplicate events (e.g., for Stape)
270         * 
271         * @param {Object} eventData - The event data object
272         * @param {String} eventName - The event name (e.g., 'add_to_cart', 'AddToCart', 'addtocart', 'ADD_CART')
273         */
274        fire_add_to_cart_hook(eventData, eventName) {
275            try {
276                if (typeof $ !== 'undefined' && $.fn && $.fn.trigger) {
277                    $(document).trigger('wffn_add_to_cart_event', [eventData, eventName || 'add_to_cart']);
278                }
279            } catch (error) {
280                console.log(error);
281            }
282        }
283
284        add_to_cart() {
285            if (this.settings.add_to_cart === 'true') {
286                this.event_add_to_cart();
287            }
288        }
289
290        event_add_to_cart() {
291
292        }
293
294        checkout() {
295            let current_data = JSON.stringify(this.data.checkout);
296            if (this.settings.checkout === 'true' && (current_data !== this.data.last_checkout_data) && false == this.checkout_event_run) {
297                this.event_checkout(current_data);
298                this.data.last_checkout_data = current_data;
299                this.checkout_event_run = true;
300            }
301        }
302
303        event_checkout(current_data) {
304
305
306        }
307
308        payment_info() {
309            if (this.settings.payment === 'true') {
310                this.event_payment_info();
311            }
312        }
313
314        shipping_info() {
315            if (this.settings.shipping === 'true') {
316                this.event_shipping_info();
317            }
318        }
319
320        event_payment_info() {
321        }
322
323        load() {
324
325        }
326
327        get_event_id() {
328            let d = new Date();
329            let time = d.getTime();
330            return parseInt(time / 1000);
331        }
332
333        custom_event(event, data) {
334
335        }
336
337        // Bump Event
338
339        track_bump_item(data) {
340            let present = typeof wfob_frontend == 'object' && wfob_frontend.hasOwnProperty('track');
341            if (present) {
342                if ('1' == wfob_frontend.track[this.track_name].add_to_cart) {
343                    this.is_bumpevent = true;
344                    this.add_item(data, true);
345                }
346                if (wfob_frontend.track[this.track_name].hasOwnProperty('custom_bump') && '1' == wfob_frontend.track[this.track_name].custom_bump) {
347                    let customData = {"post_id": wfacp_analytics_data.wfacp_frontend.id, "page_title": wfacp_analytics_data.wfacp_frontend.title};
348                    this.custom_event('Woofunnels_Bump', customData);
349                }
350            }
351        }
352
353        track_remove_bump_item(data) {
354            let present = typeof wfob_frontend == 'object' && wfob_frontend.hasOwnProperty('track');
355            if (present) {
356                if ('1' == wfob_frontend.track[this.track_name].add_to_cart) {
357                    this.is_bumpevent = true;
358                    this.remove_item(data);
359                }
360            }
361        }
362
363    }
364
365    class Facebook extends Events {
366        constructor(data,count) {
367            super(data);
368            this.pixel_event_data = {"AddToCart": {}, "InitiateCheckout": {}, "AddPaymentInfo": {}, "PageView": {}};
369            this.track_name = 'pixel';
370            this.eventCount = count;
371        }
372
373        static enqueue_js() {
374            (function (f, b, e, v, n, t, s) {
375                if (f.fbq) return;
376                n = f.fbq = function () {
377                    let pl = n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments);
378                };
379                if (!f._fbq) f._fbq = n;
380                n.push = n;
381                n.loaded = !0;
382                n.version = '2.0';
383                n.queue = [];
384                t = b.createElement(e);
385                t.defer = !0;
386                t.src = v;
387                s = b.getElementsByTagName(e)[0];
388                s.parentNode.insertBefore(t, s);
389            })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
390        }
391
392
393        send_ajax() {
394            this.wfacp_send_ajax({
395                'action': 'analytics', 'type': 'post', 'data': {
396                    'event_data': this.event_data, 'source': window.location.href,
397                }
398            }, (rsp) => {
399                this.event_data = [];
400                this.timeout = 100;
401            });
402        }
403
404        wfacp_send_ajax(data, cb) {
405
406            let url = wfacp_analytics_data.wfacp_frontend.admin_ajax;
407            if (data.hasOwnProperty('url')) {
408                url = data.url;
409            }
410            if (this.eventCount !== 0) {
411                return;
412            }
413            data.action = "wfacp_" + data.action;
414            if (wfacp_analytics_data.wfacp_frontend.hasOwnProperty('wc_endpoints') && wfacp_analytics_data.wfacp_frontend.wc_endpoints.hasOwnProperty(data.action)) {
415                url = wfacp_analytics_data.wfacp_frontend.wc_endpoints[data.action];
416            }
417            $(document.body).trigger(data.action, data);
418            let send_data = {
419                'action': data.action,
420                'wfacp_nonce': wfacp_analytics_data.wfacp_frontend.wfacp_nonce,
421                'data': data.data,
422                'post_data': $('form.woocommerce-checkout').serialize()
423            };
424
425            let have_headers = false;
426            if (data.hasOwnProperty('headers')) {
427                have_headers = true;
428            }
429
430            let ajax_obj = {
431                'url': url,
432                'type': data.type,
433                'data': send_data,
434                success: (rsp) => {
435                    if (true === have_headers) {
436                        cb(rsp);
437                        return;
438                    }
439
440                    if (typeof rsp !== "object") {
441                        rsp = {'status': false};
442                    }
443                    if (typeof cb === 'function') {
444                        rsp.action = data.action;
445                        cb(rsp);
446
447                    }
448                },
449                error: (rsp) => {
450                    if (true == have_headers) {
451                        cb(rsp);
452                        return;
453                    }
454                    if (rsp.hasOwnProperty('status')) {
455                        if (403 == rsp.status) {
456                            console.log('Aero: Page is cached');
457                        } else if (500 == rsp.status) {
458                            console.log('Aero: Site Contain fatal error');
459                        } else if (502 == rsp.status) {
460                            console.log('Aero: Bad gateway');
461                        } else {
462                            console.log('Aero: Error', rsp.status);
463                        }
464                    }
465                }
466            };
467            if (data.hasOwnProperty('headers')) {
468                ajax_obj.headers = data.headers;
469                ajax_obj.data = data.data;
470            }
471            $.ajax(ajax_obj);
472
473        }
474
475        send_data(event, data, event_id) {
476            this.event_data.push({
477                'event': event, 'data': data, 'event_id': event_id
478            });
479            clearTimeout(this.instance_timeout);
480            this.instance_timeout = setTimeout(() => {
481                this.send_ajax();
482            }, this.timeout);
483        }
484
485        fbq(event, data, isCustom) {
486
487            let event_id = this.get_event_id();
488            if ('true' == wfacp_analytics_data.conversion_api) {
489                this.send_data(event, data, event_id);
490            }
491            data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
492            // Fire action hook for AddToCart events
493            if ('AddToCart' === event) {
494                this.fire_add_to_cart_hook(data, 'AddToCart');
495            }
496            if (typeof isCustom === 'undefined') {
497                fbq('trackSingle', this.track_id, event, data, {'eventID': event_id});
498            } else {
499                fbq('trackCustom', event, data, {'eventID': event_id});
500            }
501
502        }
503
504        init() {
505            if (wfacp_analytics_data.hasOwnProperty('fb_advanced') && wfacp_analytics_data.fb_advanced.length !== 0) {
506                fbq('init', this.track_id, wfacp_analytics_data.fb_advanced);
507            } else {
508                fbq('init', this.track_id);
509            }
510        }
511
512        event_add_to_cart() {
513            let add_to_cart = this.data.add_to_cart;
514
515            for (let item_key in add_to_cart) {
516                this.event_single_add_to_cart(add_to_cart[item_key], item_key);
517            }
518        }
519
520        event_single_add_to_cart(data, item_key) {
521
522            if (typeof fbq === 'function') {
523                this.fbq('AddToCart', data);
524            }
525        }
526
527        event_remove_add_to_cart(data, item_key) {
528            if (typeof fbq === 'function') {
529                this.fbq('RemoveFromCart', data);
530            }
531        }
532
533        event_checkout(current_data) {
534            if (typeof fbq === 'function') {
535                this.fbq('InitiateCheckout', JSON.parse(current_data));
536            }
537        }
538
539        event_payment_info() {
540            if (typeof fbq === 'function') {
541                if (!this.data.hasOwnProperty("checkout") || typeof this.data.checkout == "undefined" || this.data.checkout == undefined) {
542                    this.fbq('AddPaymentInfo', {});
543                } else {
544                    let parse_data = JSON.stringify(this.data.checkout);
545                    parse_data = JSON.parse(parse_data);
546                    delete parse_data.content_name;
547                    delete parse_data.content_type;
548                    delete parse_data.num_ids;
549                    delete parse_data.num_items;
550                    delete parse_data.plugin;
551                    delete parse_data.subtotal;
552                    delete parse_data.user_roles;
553                    this.fbq('AddPaymentInfo', parse_data);
554                }
555            }
556        }
557
558        load() {
559            if (typeof wffnTracking !== "undefined" && '1' == wffnTracking.pixel.settings.page_view) {
560                return;
561            }
562            if (typeof fbq === 'function' && '' !== this.track_id && this.settings.page_view === 'true') {
563                this.fbq('PageView', {});
564            }
565        }
566
567        custom_event(event, data) {
568            this.fbq(event, data, true);
569        }
570    }
571
572    class Google extends Events {
573        constructor(data) {
574            super(data);
575            this.track_name = 'google_ua';
576            window.dataLayer = window.dataLayer || [];
577            this.gtag('config', this.track_id);
578        }
579
580        static enqueue_js(analytics_id) {
581            (function (window, document, src) {
582                var a = document.createElement('script'), m = document.getElementsByTagName('script')[0];
583                a.defer = 1;
584                a.src = src;
585                m.parentNode.insertBefore(a, m);
586            })(window, document, '//www.googletagmanager.com/gtag/js?id=' + analytics_id);
587
588            window.dataLayer = window.dataLayer || [];
589            window.gtag = window.gtag || function gtag() {
590                dataLayer.push(arguments);
591            };
592
593            gtag('js', new Date());
594        }
595
596        load() {
597            if (typeof wffnTracking !== "undefined" && '1' == wffnTracking.ga.settings.page_view) {
598                return;
599            }
600            if (this.settings.page_view === 'true' && this.track_name === 'google_ads') {
601                this.gtag('event', 'page_view', {send_to: this.track_id});
602            }
603
604        }
605
606        gtag() {
607            // Fire action hook for add_to_cart events before pushing to dataLayer
608            if (arguments.length >= 2 && arguments[0] === 'event' && arguments[1] === 'add_to_cart') {
609                this.fire_add_to_cart_hook(arguments[2] || {}, 'add_to_cart');
610            }
611            dataLayer.push(arguments);
612        }
613
614        /**
615         * Fire JavaScript action hook for add_to_cart events
616         * Allows developers to listen and duplicate events (e.g., for Stape)
617         * 
618         * @param {Object} eventData - The event data object
619         * @param {String} eventName - The event name (e.g., 'add_to_cart', 'AddToCart', 'addtocart', 'ADD_CART')
620         */
621        fire_add_to_cart_hook(eventData, eventName) {
622            try {
623                if (typeof $ !== 'undefined' && $.fn && $.fn.trigger) {
624                    $(document).trigger('wffn_add_to_cart_event', [eventData, eventName || 'add_to_cart']);
625                }
626            } catch (error) {
627                console.log(error);
628            }
629        }
630
631        event_checkout(checkout_data) {
632
633            var event_data = [];
634            if ('google_ua' === this.track_name) {
635                checkout_data = JSON.parse(checkout_data);
636                if (checkout_data.length > 0) {
637                    event_data = checkout_data[0];
638                    event_data.send_to = this.track_id;
639                    event_data.event_category = "ecommerce";
640                    event_data.non_interaction = true;
641                }
642            } else {
643                event_data = {
644                    send_to: this.track_id, event_category: "ecommerce", items: JSON.parse(checkout_data), non_interaction: true
645                };
646            }
647
648            event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(event_data) : event_data;
649            this.gtag('event', 'begin_checkout', event_data);
650        }
651
652        event_single_add_to_cart(data) {
653            data.send_to = this.track_id;
654            data.event_category = "ecommerce";
655            data.non_interaction = true;
656            var event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
657            // Fire action hook before pushing to dataLayer
658            this.fire_add_to_cart_hook(event_data, 'add_to_cart');
659            this.gtag('event', 'add_to_cart', event_data);
660        }
661
662        event_remove_add_to_cart(data, item_key) {
663            data.send_to = this.track_id;
664            data.event_category = "ecommerce";
665            data.non_interaction = true;
666            var event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
667
668            this.gtag('event', 'remove_from_cart', event_data);
669        }
670
671        event_add_to_cart() {
672            if (typeof this.data.add_to_cart == "undefined" || undefined == this.data.add_to_cart) {
673                return;
674            }
675            let data = JSON.stringify(this.data.add_to_cart);
676            data = JSON.parse(data);
677            for (let item_key in data) {
678                this.event_single_add_to_cart(data[item_key]);
679            }
680        }
681
682        event_payment_info() {
683            var event_data = {send_to: this.track_id, non_interaction: true};
684            if ('google_ua' === this.track_name) {
685                var checkout_data = this.data.checkout;
686                if (checkout_data.length > 0) {
687                    event_data = checkout_data[0];
688                    event_data.send_to = this.track_id;
689                    event_data.non_interaction = true;
690                }
691            }
692
693            event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(event_data) : event_data;
694
695            this.gtag('event', 'add_payment_info', event_data);
696        }
697
698        event_shipping_info() {
699            var event_data = {send_to: this.track_id, non_interaction: true};
700            if ('google_ua' === this.track_name) {
701                var shipping_data = this.data.shipping_info;
702                if (shipping_data.length > 0) {
703                    event_data = shipping_data[0];
704                    event_data.send_to = this.track_id;
705                    event_data.non_interaction = true;
706                    
707                    // Add enhanced shipping data structure (similar to PixelYourSite)
708                    if (event_data.shipping_address) {
709                        event_data.user_data = event_data.user_data || {};
710                        event_data.user_data.address = [event_data.shipping_address];
711                    }
712                }
713            }
714
715            event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(event_data) : event_data;
716
717            this.gtag('event', 'add_shipping_info', event_data);
718        }
719
720
721        custom_event(event, data) {
722            var event_data = {
723                send_to: this.track_id, event_category: "ecommerce", items: [data], non_interaction: true
724            };
725            event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(event_data) : event_data;
726
727            this.gtag('event', event, event_data);
728        }
729
730    }
731
732    class Google_ads extends Google {
733        constructor(data) {
734            super(data);
735            this.track_name = 'google_ads';
736            this.idlabel = (typeof data.idlabel !== "undefined") ? data.idlabel : '';
737            this.bumpIdlabel = (typeof data.bumpIdlabel !== "undefined") ? data.bumpIdlabel : '';
738            window.dataLayer = window.dataLayer || [];
739        }
740
741        event_single_add_to_cart(data) {
742            data = this.set_send_id( data );
743            data.event_category = "ecommerce";
744            data.non_interaction = true;
745            var event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
746            this.gtag('event', 'add_to_cart', event_data);
747        }
748
749        event_remove_add_to_cart(data, item_key) {
750            data = this.set_send_id( data );
751            data.event_category = "ecommerce";
752            data.non_interaction = true;
753            var event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
754
755            this.gtag('event', 'remove_from_cart', event_data);
756        }
757
758        set_send_id( data ) {
759            if ( this.is_bumpevent === true ) {
760                data.send_to = (typeof this.bumpIdlabel !== "undefined") && '' !== this.bumpIdlabel ? this.bumpIdlabel : this.track_id;
761            } else {
762                data.send_to = (typeof this.idlabel !== "undefined") && '' !== this.idlabel ? this.idlabel : this.track_id;
763            }
764            return data;
765        }
766        event_checkout(checkout_data) {
767            var event_data = {
768                send_to: this.track_id, 
769                event_category: "ecommerce", 
770                items: JSON.parse(checkout_data), 
771                non_interaction: true
772            };
773            event_data = this.set_send_id(event_data);
774            event_data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(event_data) : event_data;
775            this.gtag('event', 'begin_checkout', event_data);
776        }
777
778        event_payment_info() {
779        }
780
781    }
782
783    class Pinterest extends Events {
784        constructor(data) {
785            super(data);
786            this.track_name = 'pint';
787        }
788
789        static enqueue_js() {
790            !function (e) {
791                if (!window.pintrk) {
792                    window.pintrk = function () {
793                        window.pintrk.queue.push(Array.prototype.slice.call(arguments));
794                    };
795                    var n = window.pintrk;
796                    n.queue = [], n.version = "3.0";
797                    var t = document.createElement("script");
798                    t.defer = !0, t.src = e;
799                    var r = document.getElementsByTagName("script")[0];
800                    r.parentNode.insertBefore(t, r);
801                }
802            }("https://s.pinimg.com/ct/core.js");
803        }
804
805        init(tracks_ids) {
806
807            let ids = this.track_id.split(',');
808            ids.forEach(function (pixelId) {
809                pintrk('load', pixelId);
810            });
811        }
812
813        load() {
814            if (typeof wffnTracking !== "undefined" && '1' == wffnTracking.pint.settings.page_view) {
815                return;
816            }
817            if (typeof pintrk === 'function' && '' !== this.track_id && this.settings.page_view === 'true') {
818                pintrk('page');
819            }
820        }
821
822        send_data(event, data, event_id) {
823        }
824
825        pint(event, data) {
826            if (window.pintrk) {
827                data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
828                // Fire action hook for addtocart events
829                if ('addtocart' === event) {
830                    this.fire_add_to_cart_hook(data, 'addtocart');
831                }
832                pintrk('track', event, data);
833            }
834        }
835
836        event_checkout(checkout_data) {
837            let c_data = JSON.parse(checkout_data);
838            
839            // Helper function to hash email with SHA256
840            const hashEmail = async (email) => {
841                if (!email || typeof email !== 'string') return null;
842                const normalizedEmail = email.toLowerCase().trim();
843                const msgBuffer = new TextEncoder().encode(normalizedEmail);
844                const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
845                const hashArray = Array.from(new Uint8Array(hashBuffer));
846                return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
847            };
848            
849            // Get email from checkout form if not already in data
850            const getEmailFromForm = () => {
851                const emailField = $('#billing_email');
852                if (emailField.length > 0 && emailField.val()) {
853                    return emailField.val().trim();
854                }
855                return null;
856            };
857            
858            // Process checkout data - ensure email and external_id are included
859            if (Array.isArray(c_data) && c_data.length > 0) {
860                const checkoutEventData = c_data[0];
861                
862                // Add email if not present
863                if (!checkoutEventData.em) {
864                    const formEmail = getEmailFromForm();
865                    if (formEmail) {
866                        hashEmail(formEmail).then(hashedEmail => {
867                            if (hashedEmail) {
868                                checkoutEventData.em = hashedEmail;
869                            }
870                            this.pint('InitiateCheckout', c_data);
871                        }).catch(() => {
872                            // Fallback: send without email
873                            this.pint('InitiateCheckout', c_data);
874                        });
875                        return; // Exit early, will send after hashing
876                    }
877                }
878            }
879            
880            this.pint('InitiateCheckout', c_data);
881        }
882
883        event_single_add_to_cart(data) {
884            this.pint('addtocart', data);
885        }
886
887        event_remove_add_to_cart(data, item_key) {
888            this.pint('RemoveFromCart', data);
889        }
890
891        event_add_to_cart() {
892            if (typeof this.data.add_to_cart == "undefined" || undefined == this.data.add_to_cart) {
893                return;
894            }
895            let data = JSON.stringify(this.data.add_to_cart);
896            data = JSON.parse(data);
897            for (let item_key in data) {
898                this.event_single_add_to_cart(data[item_key]);
899            }
900        }
901
902        custom_event(event, data) {
903            this.pint(event, data);
904        }
905
906
907    }
908
909    class TikTok extends Events {
910        constructor(data) {
911            super(data);
912            this.track_name = 'tiktok';
913        }
914
915        static enqueue_js() {
916            !function (w, d, t) {
917                w.TiktokAnalyticsObject = t;
918                var ttq = w[t] = w[t] || [];
919                ttq.methods = ["page", "track", "identify", "instances", "debug", "on", "off", "once", "ready", "alias", "group", "enableCookie", "disableCookie"], ttq.setAndDefer = function (t, e) {
920                    t[e] = function () {
921                        t.push([e].concat(Array.prototype.slice.call(arguments, 0)));
922                    };
923                };
924                for (var i = 0; i < ttq.methods.length; i++) ttq.setAndDefer(ttq, ttq.methods[i]);
925                ttq.instance = function (t) {
926                    for (var e = ttq._i[t] || [], n = 0; n < ttq.methods.length; n++) ttq.setAndDefer(e, ttq.methods[n]);
927                    return e;
928                }, ttq.load = function (e, n) {
929                    var i = "https://analytics.tiktok.com/i18n/pixel/events.js";
930                    ttq._i = ttq._i || {}, ttq._i[e] = [], ttq._i[e]._u = i, ttq._t = ttq._t || {}, ttq._t[e] = +new Date, ttq._o = ttq._o || {}, ttq._o[e] = n || {};
931                    var o = document.createElement("script");
932                    o.type = "text/javascript", o.defer = !0, o.src = i + "?sdkid=" + e + "&lib=" + t;
933                    var a = document.getElementsByTagName("script")[0];
934                    a.parentNode.insertBefore(o, a)
935                };
936            }(window, document, 'ttq');
937        }
938
939        init() {
940            if (typeof ttq !== "object") {
941                return;
942            }
943            ttq.load(this.track_id);
944            if (wfacp_analytics_data.hasOwnProperty('tiktok_advanced') && wfacp_analytics_data.tiktok_advanced.length !== 0) {
945                ttq.instance(this.track_id).identify(wfacp_analytics_data.tiktok_advanced)
946            }
947        }
948
949        load() {
950            if (typeof wffnTracking !== "undefined" && '1' == wffnTracking.tiktok.settings.page_view) {
951                return;
952            }
953            if ('' !== this.track_id && this.settings.page_view === 'true') {
954                ttq.page();
955            }
956        }
957
958        ttq(event, data) {
959            if (typeof ttq !== "object") {
960                return;
961            }
962            // Fire action hook for AddToCart events
963            if ('AddToCart' === event) {
964                let processedData = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
965                this.fire_add_to_cart_hook(processedData, 'AddToCart');
966            }
967            let self = this;
968            setTimeout(function () {
969                let event_id = self.get_event_id();
970                ttq.instance(self.track_id).track(event, data);
971            }, 1200);
972        }
973
974        event_payment_info() {
975            if (typeof ttq === 'object') {
976                this.ttq('AddPaymentInfo', this.data.checkout);
977            }
978        }
979
980        event_checkout(checkout_data) {
981            let c_data = JSON.parse(checkout_data);
982            let c_self = this;
983            setTimeout(function () {
984                c_self.ttq('InitiateCheckout', c_data);
985            }, 200);
986        }
987
988        event_single_add_to_cart(data) {
989            this.ttq('AddToCart', data);
990        }
991
992        event_remove_add_to_cart(data, item_key) {
993            // Not Supporting
994            // this.ttq('Custom', {'event': 'remove_from_cart', 'data': data});
995        }
996
997        event_add_to_cart() {
998            if (typeof this.data.add_to_cart == "undefined" || undefined == this.data.add_to_cart) {
999                return;
1000            }
1001            let data = JSON.stringify(this.data.add_to_cart);
1002            data = JSON.parse(data);
1003            for (let item_key in data) {
1004                this.event_single_add_to_cart(data[item_key]);
1005            }
1006        }
1007    }
1008
1009    class SnapChat extends Events {
1010        constructor(data) {
1011            super(data);
1012            this.track_name = 'snapchat';
1013        }
1014
1015        static enqueue_js() {
1016            (function (win, doc, sdk_url) {
1017                if (win.snaptr) {
1018                    return;
1019                }
1020
1021                var tr = win.snaptr = function () {
1022                    tr.handleRequest ? tr.handleRequest.apply(tr, arguments) : tr.queue.push(arguments);
1023                };
1024                tr.queue = [];
1025                var s = 'script';
1026                var new_script_section = doc.createElement(s);
1027                new_script_section.defer = !0;
1028                new_script_section.src = sdk_url;
1029                var insert_pos = doc.getElementsByTagName(s)[0];
1030                insert_pos.parentNode.insertBefore(new_script_section, insert_pos);
1031            })(window, document, 'https://sc-static.net/scevent.min.js');
1032        }
1033
1034        init() {
1035            if (typeof snaptr !== "function") {
1036                return;
1037            }
1038            snaptr('init', this.track_id, {
1039                'integration': 'woocommerce',
1040                'user_email': this.settings.user_email
1041            });
1042        }
1043
1044        load() {
1045            if (typeof wffnTracking !== "undefined" && '1' == wffnTracking.snapchat.settings.page_view) {
1046                return;
1047            }
1048            if ('' !== this.track_id && this.settings.page_view === 'true') {
1049                this.snaptr('PAGE_VIEW', {'content_id': wfacp_anal
1049ytics_data.wfacp_frontend.id});
1050            }
1051        }
1052
1053        snaptr(event, data) {
1054            if (typeof snaptr !== "function") {
1055                return;
1056            }
1057
1058            data = (typeof wffnAddTrafficParamsToEvent !== "undefined") ? wffnAddTrafficParamsToEvent(data) : data;
1059            // Fire action hook for ADD_CART events
1060            if ('ADD_CART' === event) {
1061                this.fire_add_to_cart_hook(data, 'ADD_CART');
1062            }
1063            snaptr('track', event, data);
1064        }
1065
1066        event_checkout(checkout_data) {
1067            let c_data = JSON.parse(checkout_data);
1068            this.snaptr('START_CHECKOUT', c_data);
1069        }
1070
1071        event_payment_info() {
1072            // Not Supported
1073            //this.snaptr('ADD_PAYMENT_INFO', this.data.checkout);
1074        }
1075
1076        event_single_add_to_cart(data) {
1077            this.snaptr('ADD_CART', data);
1078        }
1079
1080        event_remove_add_to_cart(data, item_key) {
1081            // Not Supported
1082            // this.snaptr('REMOVE_FROM_CART', data);
1083        }
1084
1085        event_add_to_cart() {
1086            if (typeof this.data.add_to_cart == "undefined" || undefined == this.data.add_to_cart) {
1087                return;
1088            }
1089            let data = JSON.stringify(this.data.add_to_cart);
1090            data = JSON.parse(data);
1091            for (let item_key in data) {
1092                this.event_single_add_to_cart(data[item_key]);
1093            }
1094        }
1095
1096        custom_event(event, data) {
1097            //this.snaptr(event, data);
1098        }
1099    }
1100
1101    class Loader {
1102        static init() {
1103
1104
1105            $(document).ready(function () {
1106
1107
1108                if ('1' === wfacp_analytics_data.wfacp_frontend.is_customizer || 'yes' == wfacp_analytics_data.wfacp_frontend.edit_mode) {
1109                    return;
1110                }
1111
1112                if (1 != wfacp_analytics_data.shouldRender) {
1113                    return;
1114                }
1115                let bwf_gtag_load = false;
1116
1117                wfacp_analytics_data.wfacp_frontend.tracks = {};
1118                if (wfacp_analytics_data.hasOwnProperty('pixel') && wfacp_analytics_data.pixel.hasOwnProperty('id')) {
1119                    Facebook.enqueue_js();
1120                    let ids = wfacp_analytics_data.pixel.id.split(',');
1121                    if (ids.length > 0) {
1122                        wfacp_analytics_data.wfacp_frontend.tracks.facebook = {};
1123                        for (let f = 0; f < ids.length; f++) {
1124                            let f_id = ids[f];
1125                            let temp = JSON.stringify(wfacp_analytics_data.pixel);
1126                            temp = JSON.parse(temp);
1127                            temp.id = f_id.trim();
1128                            wfacp_analytics_data.wfacp_frontend.tracks.facebook[f_id] = new Facebook(temp,f);
1129                        }
1130                    }
1131                }
1132                if (wfacp_analytics_data.hasOwnProperty('google_ua') && wfacp_analytics_data.google_ua.hasOwnProperty('id')) {
1133                    let ids = wfacp_analytics_data.google_ua.id.split(',');
1134                    if (ids.length > 0) {
1135                        if (!bwf_gtag_load) {
1136                            Google.enqueue_js(ids[0]);
1137                            bwf_gtag_load = true;
1138                        }
1139                        wfacp_analytics_data.wfacp_frontend.tracks.google_ua = {};
1140                        for (let f = 0; f < ids.length; f++) {
1141                            let f_id = ids[f];
1142                            let temp = JSON.stringify(wfacp_analytics_data.google_ua);
1143                            temp = JSON.parse(temp);
1144                            temp.id = f_id.trim();
1145                            wfacp_analytics_data.wfacp_frontend.tracks.google_ua[f_id] = new Google(temp);
1146                        }
1147                    }
1148                }
1149                if (wfacp_analytics_data.hasOwnProperty('google_ads') && wfacp_analytics_data.google_ads.hasOwnProperty('id')) {
1150                    let ids = wfacp_analytics_data.google_ads.id.split(',');
1151                    let gadLabels = [];
1152
1153                    if ( typeof wfacp_analytics_data.google_ads.cart_labels === "string") {
1154                        gadLabels = wfacp_analytics_data.google_ads.cart_labels.split(',');
1155                    }
1156                    /**
1157                     * get bump cart labels
1158                     */
1159                    let bumpGadLabels = [];
1160                    if ((typeof wfob_frontend == 'object') && wfob_frontend.hasOwnProperty('track') && wfob_frontend.track.hasOwnProperty('google_ads')) {
1161                        if (typeof wfob_frontend.track.google_ads.cart_labels === "string") {
1162                            bumpGadLabels = wfob_frontend.track.google_ads.cart_labels.split(',');
1163                        }
1164                    }
1165
1166                    if (ids.length > 0) {
1167                        if (!bwf_gtag_load) {
1168                            Google.enqueue_js(ids[0]);
1169                            bwf_gtag_load = true;
1170                        }
1171                        wfacp_analytics_data.wfacp_frontend.tracks.google_ads = {};
1172                        for (let f = 0; f < ids.length; f++) {
1173                            let f_id = ids[f];
1174                            let temp = JSON.stringify(wfacp_analytics_data.google_ads);
1175                            temp = JSON.parse(temp);
1176                            temp.id = f_id.trim();
1177                            /**
1178                             * set checkout add to cart labels
1179                             */
1180                            if ("undefined" !== typeof gadLabels[f] && gadLabels[f] !== "") {
1181                                temp.idlabel = temp.id + '/' + gadLabels[f].trim();
1182                            }
1183                            /**
1184                             * set bump add to cart labels
1185                             */
1186                            if ("undefined" !== typeof bumpGadLabels[f] && bumpGadLabels[f] !== "") {
1187                                temp.bumpIdlabel = temp.id + '/' + bumpGadLabels[f].trim();
1188                            }
1189                            wfacp_analytics_data.wfacp_frontend.tracks.google_ads[f_id] = new Google_ads(temp);
1190                        }
1191                    }
1192                }
1193                if (wfacp_analytics_data.hasOwnProperty('pint') && wfacp_analytics_data.pint.hasOwnProperty('id')) {
1194                    let ids = wfacp_analytics_data.pint.id.split(',');
1195                    if (ids.length > 0) {
1196                        Pinterest.enqueue_js();
1197                        wfacp_analytics_data.wfacp_frontend.tracks.pint = {};
1198                        for (let f = 0; f < ids.length; f++) {
1199                            let f_id = ids[f];
1200                            let temp = JSON.stringify(wfacp_analytics_data.pint);
1201                            temp = JSON.parse(temp);
1202                            temp.id = f_id.trim();
1203                            wfacp_analytics_data.wfacp_frontend.tracks.pint[f_id] = new Pinterest(temp);
1204                        }
1205                    }
1206                }
1207                if (wfacp_analytics_data.hasOwnProperty('tiktok') && wfacp_analytics_data.tiktok.hasOwnProperty('id')) {
1208                    let ids = wfacp_analytics_data.tiktok.id.split(',');
1209                    if (ids.length > 0) {
1210                        TikTok.enqueue_js();
1211                        wfacp_analytics_data.wfacp_frontend.tracks.tiktok = {};
1212                        for (let f = 0; f < ids.length; f++) {
1213                            let f_id = ids[f];
1214                            let temp = JSON.stringify(wfacp_analytics_data.tiktok);
1215                            temp = JSON.parse(temp);
1216                            temp.id = f_id.trim();
1217                            wfacp_analytics_data.wfacp_frontend.tracks.tiktok[f_id] = new TikTok(temp);
1218                        }
1219                    }
1220                }
1221                if (wfacp_analytics_data.hasOwnProperty('snapchat') && wfacp_analytics_data.snapchat.hasOwnProperty('id')) {
1222                    let ids = wfacp_analytics_data.snapchat.id.split(',');
1223                    if (ids.length > 0) {
1224                        SnapChat.enqueue_js();
1225                        wfacp_analytics_data.wfacp_frontend.tracks.snapchat = {};
1226                        for (let f = 0; f < ids.length; f++) {
1227                            let f_id = ids[f];
1228                            let temp = JSON.stringify(wfacp_analytics_data.snapchat);
1229                            temp = JSON.parse(temp);
1230                            temp.id = f_id.trim();
1231                            wfacp_analytics_data.wfacp_frontend.tracks.snapchat[f_id] = new SnapChat(temp);
1232                        }
1233                    }
1234                }
1235
1236            });
1237
1238        }
1239    }
1240
1241    try {
1242        Loader.init();
1243    } catch (e) {
1244        console.log(e);
1245    }
1246})(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.