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.