PageSourceSearch

https://www.plantura.garden/wp-content/plugins/plantura-helper/assets/js/ph-ga4.js?x72794&ver=1776759766

js plantura.garden collected 2026-10-01 12:05:32 UTC 20,677 bytes, 533 lines download raw bytes

1jQuery(document).ready(function ($) {
2    var new_layout_debug = ($('.new-layout-g4a-debug').length > 0) ? true : false;
3    function ph_stripTags(unStripped) {
4        const parseHTML = new DOMParser().parseFromString(unStripped, 'text/html');
5        let parsedHTML = parseHTML.body.textContent || '';
6        return parsedHTML.trim();
7    }
8
9    function pushEcommerceEvent(dl_obj, eventName) {
10        var payload = $.extend(true, {}, dl_obj);
11        payload.event = eventName;
12        dataLayer.push({ ecommerce: null });
13        dataLayer.push(payload);
14    }
15
16    function buildUserData() {
17        return {
18            status: "Not logged in",
19            digital_product: "Magazine",
20            device_type: getDeviceType(),
21            page_type: "article"
22        };
23    }
24
25    function buildNavigationPayload(creative_slot, promotion_id, promotion_name) {
26        return {
27            ecommerce: {
28                creative_name: "navigation link",
29                creative_slot: creative_slot,
30                promotion_id: promotion_id,
31                promotion_name: promotion_name
32            },
33            user: buildUserData()
34        };
35    }
36
37    function buildMenuItemPayload($el) {
38        var href = $el.attr('href') || '';
39        var promotion_id = href.includes('shop.plantura.garden') ? 'shop' : 'magazine';
40        var promotion_name = ph_stripTags($el.html());
41        var creative_slot = $el.closest("ul[id]").attr("id");
42        return buildNavigationPayload(creative_slot, promotion_id, promotion_name);
43    }
44
45    function buildTopBarPayload($el) {
46        var href = $el.attr('href') || '';
47        var promotion_id = href.includes('shop.plantura.garden') ? 'shop' : 'magazine';
48        var promotion_name = ph_stripTags($el.html());
49        return buildNavigationPayload('top bar', promotion_id, promotion_name);
50    }
51
52    function buildHeaderUspPayload($el) {
53        var link_text = ph_stripTags($el.html());
54        return buildNavigationPayload('header', 'usps', link_text);
55    }
56
57    function buildHeaderLogoPayload() {
58        return buildNavigationPayload('header', 'shop', 'home');
59    }
60
61    function buildHeaderServicePayload($el) {
62        var link_text = ph_stripTags($el.html());
63        return buildNavigationPayload('header', 'service', link_text);
64    }
65
66    function buildHeaderHighlightPayload($el) {
67        var link_text = '';
68        if ($el.hasClass('text-high-emphasis')) {
69            link_text = ph_stripTags($el.find('.text-medium').html());
70        } else {
71            link_text = $el.find('img').attr('alt');
72        }
73        return buildNavigationPayload('header', 'product highlight', link_text);
74    }
75
76    function buildHeaderShopPayload($el) {
77        var link_text = ph_stripTags($el.html());
78        return buildNavigationPayload('header', 'shop', link_text);
79    }
80
81    function buildHeaderAnnouncementPayload($el) {
82        var link_text = ph_stripTags($el.html());
83        return buildNavigationPayload('header', 'announcement', link_text);
84    }
85
86    function buildFooterPayload($el) {
87        if ($el.hasClass('social-icons__link')) {
88            return null;
89        }
90        var href = $el.attr('href') || '';
91        var link_text = ph_stripTags($el.html());
92        if (href == 'https://www.plantura.garden/') {
93            link_text = 'magazine';
94        }
95        if (href.includes('click.plantura.garden')) {
96            link_text = 'app';
97        }
98        return buildNavigationPayload('footer', 'service', link_text);
99    }
100
101    function buildSearchPayload(search_term) {
102        var term = search_term ? String(search_term).trim() : '';
103        var id_and_name = term ? 'search-' + term : 'search';
104        return {
105            ecommerce: {
106                creative_name: "search",
107                creative_slot: 'header',
108                promotion_id: id_and_name,
109                promotion_name: id_and_name
110            },
111            user: buildUserData()
112        };
113    }
114
115    function buildHomeAppPayload() {
116        return {
117            ecommerce: {
118                creative_name: "Homepage",
119                creative_slot: "homepage",
120                promotion_id: "app",
121                promotion_name: "app"
122            },
123            user: buildUserData()
124        };
125    }
126
127    function buildArticleAppPayload() {
128        var primary_category = $('.ph-parent-category').val();
129        return {
130            ecommerce: {
131                creative_name: "Textlink",
132                creative_slot: primary_category,
133                promotion_id: "app",
134                promotion_name: "app"
135            },
136            user: buildUserData()
137        };
138    }
139
140    function buildArticleShopTextlinkPayload($el, eventName) {
141        if ($el.closest('.cta-shop-product-placement').length) {
142            return null;
143        }
144
145        if ($el.hasClass('pp-shop-link-btn') || $el.hasClass('plantura-content-bypass-link')) {
146            return null;
147        }
148
149        var href = $el.attr('href') || '';
150        if (!href.includes('shop.plantura.garden') || !href.includes('products')) {
151            return null;
152        }
153
154        var clean_product_url = href.split('?');
155        clean_product_url = clean_product_url[0];
156        var href_array = clean_product_url.split('/');
157        var product_handle = href_array[href_array.length - 1];
158        var shop_api_json = $('.ph-shop-api-json-response').html();
159        shop_api_json = $.parseJSON(shop_api_json);
160        var promotion_id;
161        // console.log(shop_api_json.products);
162        for (var i = 0; i < shop_api_json.products.length; i++) {
163            if (shop_api_json.products[i].handle == product_handle) {
164                promotion_id = (shop_api_json.products[i].campaignInfo) ? shop_api_json.products[i].campaignInfo : 'general';
165            }
166        }
167        var primary_category = $('.ph-parent-category').val();
168        return {
169            event: eventName,
170            ecommerce: {
171                creative_name: "Textlink",
172                creative_slot: primary_category,
173                promotion_id,
174                promotion_name: product_handle
175            },
176            user: buildUserData()
177        };
178    }
179
180    function buildNavHeaderFooterPayload(target) {
181        var $el = $(target);
182        if ($el.is('.menu-item a')) {
183            return buildMenuItemPayload($el);
184        }
185        if ($el.is('#announcement a')) {
186            return buildTopBarPayload($el);
187        }
188        if ($el.is('#header-ups__scroll .header-ups__text')) {
189            return buildHeaderUspPayload($el);
190        }
191        if ($el.is('.shop-nav #plantura-logo')) {
192            return buildHeaderLogoPayload();
193        }
194        if ($el.is('.header-ups__hook a, #shopify-section-header-bar-v2 .header-btn-v2')) {
195            return buildHeaderServicePayload($el);
196        }
197        if ($el.is('.shop-nav .site-nav__mega .nav-recommendation__image a, .shop-nav .site-nav__mega .flex-grow-1 a')) {
198            return buildHeaderHighlightPayload($el);
199        }
200        if ($el.is('.shop-nav .site-nav__list > a, .shop-nav .site-nav-v2__child > a, .shop-nav .site-nav-grandchild__link > a')) {
201            return buildHeaderShopPayload($el);
202        }
203        if ($el.is('.shop-nav .announcement-bar-v2__text')) {
204            return buildHeaderAnnouncementPayload($el);
205        }
206        if ($el.is('footer.shop-nav a')) {
207            return buildFooterPayload($el);
208        }
209        return null;
210    }
211
212    var viewedPromotionElements = new WeakSet();
213
214    function handleVisibility(entries, observer) {
215        entries.forEach((entry) => {
216            if (entry.isIntersecting) {
217                if (viewedPromotionElements.has(entry.target)) {
218                    observer.unobserve(entry.target);
219                    return;
220                }
221
222                var dl_obj = null;
223                if (entry.target.classList.contains('ga4-quiz-link')) {
224                    var device_type = getDeviceType();
225                    dl_obj = {
226                        event: "view_promotion",
227                        ecommerce: {
228                            creative_name: "quiz",
229                            creative_slot: "quiz",
230                            promotion_id: "quiz",
231                            promotion_name: "quiz"
232                        },
233                        user: {
234                            status: "Not logged in",
235                            digital_product: "Magazine",
236                            device_type: device_type,
237                            page_type: "article"
238                        }
239                    };
240                } else if ($(entry.target).is('.ga4-home-app-link')) {
241                    dl_obj = buildHomeAppPayload();
242                } else if ($(entry.target).is('.ga4-article-app-link')) {
243                    dl_obj = buildArticleAppPayload();
244                } else if ($(entry.target).is('.search-v2 form')) {
245                    dl_obj = buildSearchPayload('');
246                } else if ($(entry.target).is('.single-blog-article a')) {
247                    dl_obj = buildArticleShopTextlinkPayload($(entry.target), 'view_promotion');
248                } else if ($(entry.target).is('.menu-item a, #announcement a, #header-ups__scroll .header-ups__text, .shop-nav #plantura-logo, .header-ups__hook a, #shopify-section-header-bar-v2 .header-btn-v2, .shop-nav .site-nav__mega .nav-recommendation__image a, .shop-nav .site-nav__mega .flex-grow-1 a, .shop-nav .site-nav__list > a, .shop-nav .site-nav-v2__child > a, .shop-nav .site-nav-grandchild__link > a, .shop-nav .announcement-bar-v2__text, footer.shop-nav a')) {
249                    dl_obj = buildNavHeaderFooterPayload(entry.target);
250                } else {
251                    var promotion_key = entry.target.getAttribute("data-dl-key");
252                    dl_obj = dataLayerObjects[promotion_key];
253                }
254
255                if (dl_obj) {
256                    pushEcommerceEvent(dl_obj, 'view_promotion');
257                    viewedPromotionElements.add(entry.target);
258                }
259                // Disconnect the observer for the current element (optional)
260                observer.unobserve(entry.target);
261            }
262        });
263    }
264
265    // Options for the Intersection Observer
266    const options = {
267        root: null, // Use the viewport as the root
268        threshold: 0.5, // 50% of the element must be visible
269    };
270
271    // Elements to observe
272    const targetElements = document.querySelectorAll(".cta-shop-product-placement");
273    const g4aObserveElements = document.querySelectorAll(".g4a-to-observe");
274    const planturaCtaObserveElements = document.querySelectorAll(".plantura-cta-wrap");
275    const prpmCardObserveElements = document.querySelectorAll(".prpm-product-card");
276    const quizObserveElements = document.querySelectorAll(".ga4-quiz-link");
277    const navObserveElements = document.querySelectorAll(".menu-item a, #announcement a, #header-ups__scroll .header-ups__text, .shop-nav #plantura-logo, .header-ups__hook a, #shopify-section-header-bar-v2 .header-btn-v2, .shop-nav .site-nav__mega .nav-recommendation__image a, .shop-nav .site-nav__mega .flex-grow-1 a, .shop-nav .site-nav__list > a, .shop-nav .site-nav-v2__child > a, .shop-nav .site-nav-grandchild__link > a, .shop-nav .announcement-bar-v2__text, footer.shop-nav a");
278    const searchObserveElements = document.querySelectorAll(".search-v2 form");
279    const articleShopTextlinkObserveElements = document.querySelectorAll(".single-blog-article a");
280    const appPromotionSelector = ".ga4-home-app-link, .ga4-article-app-link";
281
282    function observeElements(selector) {
283        document.querySelectorAll(selector).forEach((element) => {
284            observer.observe(element);
285        });
286    }
287
288    // Create a new Intersection Observer
289    const observer = new IntersectionObserver(handleVisibility, options);
290
291    // Start observing each target element
292    targetElements.forEach((element) => {
293        observer.observe(element);
294    });
295    g4aObserveElements.forEach((element) => {
296        observer.observe(element);
297    });
298    planturaCtaObserveElements.forEach((element) => {
299        observer.observe(element);
300    });
301    prpmCardObserveElements.forEach((element) => {
302        observer.observe(element);
303    });
304    quizObserveElements.forEach((element) => {
305        observer.observe(element);
306    });
307    navObserveElements.forEach((element) => {
308        observer.observe(element);
309    });
310    searchObserveElements.forEach((element) => {
311        observer.observe(element);
312    });
313    articleShopTextlinkObserveElements.forEach((element) => {
314        observer.observe(element);
315    });
316    observeElements(appPromotionSelector);
317    setTimeout(function () {
318        const cprsTargetElements = document.querySelectorAll(".prpm-wrap");
319        // Start observing each target element
320        cprsTargetElements.forEach((element) => {
321            observer.observe(element);
322        });
323        observeElements(appPromotionSelector);
324    }, 2000);
325
326
327    $('body').on('click', '.cta-shop-product-placement ', function (e) {
328        var dl_key = $(this).data("dl-key");
329        var dl_obj = dataLayerObjects[dl_key];
330        pushEcommerceEvent(dl_obj, 'select_promotion');
331
332        if ($(e.target).closest('a').length) {
333            return;
334        }
335
336        var link = $(this).data('product-detail-url');
337        window.open(link, '_blank');
338        e.stopPropagation();
339    });
340
341    $('.prpm-wrap a').attr('target', '_blank');
342    $('body').on('click', '.prpm-cta', function () {
343        var dl_key = $(this).closest('.prpm-wrap').data("dl-key");
344        var dl_obj = dataLayerObjects[dl_key];
345        pushEcommerceEvent(dl_obj, 'select_promotion');
346
347    });
348    $('body').on('click', '.plantura-cta-wrap a', function () {
349        var dl_key = $(this).closest('.plantura-cta-wrap').data("dl-key");
350        var dl_obj = dataLayerObjects[dl_key];
351        pushEcommerceEvent(dl_obj, 'select_promotion');
352
353    });
354    $('body').on('click', '.g4a-click-trigger', function () {
355        var dl_key = $(this).closest('.g4a-to-observe').data("dl-key");
356        var dl_obj = dataLayerObjects[dl_key];
357        pushEcommerceEvent(dl_obj, 'select_promotion');
358
359    });
360    $('body').on('click', '.prpm-product-card a', function () {
361        var dl_key = $(this).closest('.prpm-product-card').data("dl-key");
362        var dl_obj = dataLayerObjects[dl_key];
363        pushEcommerceEvent(dl_obj, 'select_promotion');
364
365    });
366
367    $('.single-blog-article a').click(function (e) {
368        var data_layer_obj = buildArticleShopTextlinkPayload($(this), 'select_promotion');
369        if (data_layer_obj) {
370            pushEcommerceEvent(data_layer_obj, 'select_promotion');
371        }
372    });
373    $('.static-product-placement').click(function (e) {
374        var href = $(this).find('a.plantura-content-bypass-link').attr('href');
375        if (href.includes('shop.plantura.garden')) {
376
377            if (href.includes('products')) {
378
379                var clean_product_url = href.split('?');
380                clean_product_url = clean_product_url[0];
381                var href_array = clean_product_url.split('/');
382                var product_handle = href_array[href_array.length - 1];
383                var shop_api_json = $('.ph-shop-api-json-response').html();
384                shop_api_json = $.parseJSON(shop_api_json);
385                // console.log(shop_api_json.products);
386                for (var i = 0; i < shop_api_json.products.length; i++) {
387                    if (shop_api_json.products[i].handle == product_handle) {
388                        var promotion_id = (shop_api_json.products[i].campaignInfo) ? shop_api_json.products[i].campaignInfo : 'general';
389                    }
390                }
391                var device_type = getDeviceType();
392                var primary_category = $('.ph-parent-category').val();
393                var data_layer_obj = {
394                    event: "select_shop_textlink",
395                    ecommerce: {
396                        creative_name: "Textlink",
397                        creative_slot: primary_category,
398                        promotion_id,
399                        promotion_name: product_handle
400                    },
401                    user: {
402                        status: "Not logged in",
403                        digital_product: "Magazine",
404                        device_type: device_type,
405                        page_type: "article"
406                    }
407                };
408                pushEcommerceEvent(data_layer_obj, 'select_shop_textlink');
409
410                window.open(href, '_blank');
411            }
412            if (href.includes('collections')) {
413                // for the collection URL
414            }
415        }
416    });
417
418    $('body').on('click', '.menu-item a', function (e) {
419        var data_layer_obj = buildMenuItemPayload($(this));
420        pushEcommerceEvent(data_layer_obj, 'select_promotion');
421
422    });
423
424    $('body').on('click', '#announcement a', function () {
425        var data_layer_obj = buildTopBarPayload($(this));
426        pushEcommerceEvent(data_layer_obj, 'select_promotion');
427
428    });
429
430    $('#header-ups__scroll .header-ups__text').click(function (e) {
431        if (new_layout_debug) {
432            e.preventDefault();
433        }
434        var data_layer_obj = buildHeaderUspPayload($(this));
435        pushEcommerceEvent(data_layer_obj, 'select_promotion');
436
437    });
438
439    $('.shop-nav #plantura-logo').click(function (e) {
440        if (new_layout_debug) {
441            e.preventDefault();
442        }
443        var data_layer_obj = buildHeaderLogoPayload();
444        pushEcommerceEvent(data_layer_obj, 'select_promotion');
445
446    });
447
448    $('.header-ups__hook a, #shopify-section-header-bar-v2 .header-btn-v2').click(function (e) {
449        if (new_layout_debug) {
450            e.preventDefault();
451        }
452        var data_layer_obj = buildHeaderServicePayload($(this));
453        pushEcommerceEvent(data_layer_obj, 'select_promotion');
454
455    });
456
457    $('.shop-nav .site-nav__mega .nav-recommendation__image a, .shop-nav .site-nav__mega .flex-grow-1 a').click(function (e) {
458        if (new_layout_debug) {
459            e.preventDefault();
460        }
461        var data_layer_obj = buildHeaderHighlightPayload($(this));
462        pushEcommerceEvent(data_layer_obj, 'select_promotion');
463
464    });
465
466    $('.shop-nav .site-nav__list > a, .shop-nav .site-nav-v2__child > a, .shop-nav .site-nav-grandchild__link > a').click(function (e) {
467        if (new_layout_debug) {
468            e.preventDefault();
469        }
470        var data_layer_obj = buildHeaderShopPayload($(this));
471        pushEcommerceEvent(data_layer_obj, 'select_promotion');
472
473    });
474    $('.shop-nav .announcement-bar-v2__text').click(function (e) {
475        if (new_layout_debug) {
476            e.preventDefault();
477        }
478        var data_layer_obj = buildHeaderAnnouncementPayload($(this));
479        pushEcommerceEvent(data_layer_obj, 'select_promotion');
480
481    });
482
483    $('footer.shop-nav a').click(function (e) {
484        if ($(this).hasClass('social-icons__link')) {
485            return;
486        }
487        if (new_layout_debug) {
488            e.preventDefault();
489        }
490        var data_layer_obj = buildFooterPayload($(this));
491        pushEcommerceEvent(data_layer_obj, 'select_promotion');
492
493    });
494
495    $('body').on('submit', '.search-v2 form', function () {
496        var search_term = $(this).find('.search-v2__input').val();
497        var data_layer_obj = buildSearchPayload(search_term);
498        pushEcommerceEvent(data_layer_obj, 'select_promotion');
499
500    });
501    $('body').on('click', '.ga4-quiz-link', function () {
502        var device_type = getDeviceType();
503        var data_layer_obj = {
504            event: "select_promotion",
505            ecommerce: {
506                creative_name: "quiz",
507                creative_slot: "quiz",
508                promotion_id: "quiz",
509                promotion_name: "quiz"
510            },
511            user: {
512                status: "Not logged in",
513                digital_product: "Magazine",
514                device_type: device_type,
515                page_type: "article"
516            }
517        };
518        pushEcommerceEvent(data_layer_obj, 'select_promotion');
519        console.log(dataLayer);
520    });
521    $('body').on('click', '.ga4-home-app-link', function () {
522        var data_layer_obj = buildHomeAppPayload();
523        pushEcommerceEvent(data_layer_obj, 'select_promotion');
524        console.log(dataLayer);
525    });
526    $('body').on('click', '.ga4-article-app-link', function () {
527        var data_layer_obj = buildArticleAppPayload();
528        pushEcommerceEvent(data_layer_obj, 'select_promotion');
529        console.log(dataLayer);
530    });
531
532
533});

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.