1 2(function($) { 3 4 var products = ''; 5 6 let isFramePostedBefore = false; 7 8 function postDataToIframe() { 9 var iframe = $('.svt-embed:visible').get(0); 10 if(typeof iframe == "undefined" || $('.svt-popup-embed:visible').length) { 11 iframe = $('.svt-popup-embed:visible').get(0); 12 } 13 // console.log(iframe); 14 if(typeof iframe != "undefined") { 15 var id = iframe.id; 16 if(id != "search-embed" && id != "category-embed" && id != "product-embed") { 17 selectedLocation = sessionStorage.getItem('ls.location'); 18 selectedPricelist = sessionStorage.getItem('ls.selectedPriceList'); 19 allLocation = sessionStorage.getItem('ls.allLocations'); 20 var payloadData = { 21 selectedLocation: JSON.parse(selectedLocation), 22 selectedPriceList: JSON.parse(selectedPricelist) 23 } 24 let pListName = getUrlParameter('pListName'); 25 if(pListName !== null && id != "popup-login-embed") { 26 pListName = pListName.toLowerCase(); 27 if(pListName == 'catering') { 28 const cateringPricelist = localStorage.getItem('ls.cateringPriceListID'); 29 payloadData.selectedPriceList = JSON.parse(cateringPricelist); 30 } 31 if(pListName == 'deli') { 32 const deliPriceList = localStorage.getItem('ls.deliPriceList'); 33 payloadData.selectedPriceList = JSON.parse(deliPriceList); 34 } 35 } 36 let plist = getUrlParameter('plist'); 37 if(plist !== null && id != "popup-login-embed") { 38 plist = plist.toLowerCase(); 39 if(plist == 'catering') { 40 const cateringPricelist = localStorage.getItem('ls.cateringPriceListID'); 41 payloadData.selectedPriceList = JSON.parse(cateringPricelist); 42 } 43 if(plist == 'deli') { 44 const deliPriceList = localStorage.getItem('ls.deliPriceList'); 45 payloadData.selectedPriceList = JSON.parse(deliPriceList); 46 } 47 } 48 let pricelistData = $(iframe).attr('data-pricelist'); 49 if(pricelistData !== null && typeof pricelistData !== "undefined" && id != "popup-login-embed") { 50 pricelistData = JSON.parse(pricelistData); 51 payloadData.selectedPriceList = pricelistData; 52 } 53 if(allLocation != null) { 54 allLocationData = JSON.parse(allLocation); 55 payloadData.allLocations = allLocationData; 56 } 57 if(id == 'order-detail-embed') { 58 var orderLocation = getUrlParameter('l'); 59 var orderPricelist = getUrlParameter('p'); 60 if(allLocation != null) { 61 allLocationData = JSON.parse(allLocation); 62 payloadData.allLocations = allLocationData; 63 const filteredLocations = allLocationData.filter((location) => location.uniqueName === orderLocation); 64 if(filteredLocations.length) { 65 var orderPlistData = filteredLocations[0].priceLists; 66 const filteredPList = orderPlistData.filter((plist) => plist.uniqueName === orderPricelist); 67 if(filteredPList.length) { 68 payloadData.selectedLocation = filteredLocations[0]; 69 payloadData.selectedPriceList = filteredPList[0]; 70 } 71 } 72 } 73 } 74 user = localStorage.getItem('user'); 75 // console.log(user); 76 const loggedIn = isUserLoggedIn(); 77 if(loggedIn) { 78 const basket = JSON.parse(localStorage.getItem('basket')); 79 const shoppingLists = JSON.parse(sessionStorage.getItem('shoppingLists')); 80 if(user != null) { 81 payloadData.user = JSON.parse(user); 82 }
83 if(basket != null) { 84 payloadData.basket = basket; 85 } 86 if(shoppingLists != null) { 87 payloadData.shoppingLists = shoppingLists; 88 } 89 90 const coupons = JSON.parse(sessionStorage.getItem('buyAgainCoupons')); 91 if(coupons != null && (id == "popup-promotion-embed" || id == "popup-pdp-embed")) { 92 payloadData.birdziCouponList = coupons; 93 } 94 } 95 /*if(id == "category-embed" || id == "search-embed") { 96 payloadData.productList = { 97 products: products.products.products, 98 healthClaims: products.products.healthClaims, 99 promotions: products.products.promotions 100 } 101 }*/ 102 //iframe.onload = function() { 103 $('.svt-embed-wrap .bouncing-loader').hide(); 104 $('.svt-popup-content .bouncing-loader').hide(); 105 console.log('****************** ON READY ***************************'); 106 // if(allProducts && id == "popup-promotion-embed") { 107 // payloadData.productList = allProducts; 108 // } 109 if(Object.keys(productsArr).length > 0) { 110 const priceListID = payloadData.selectedPriceList.uniqueName; 111 console.log(productsArr[priceListID]); 112 if(typeof productsArr[priceListID] != "undefined" && (id == "popup-pdp-embed" || id == "popup-promotion-embed")) { 113 payloadData.productList = productsArr[priceListID]; 114 } 115 // payloadData.productList = allProducts; 116 } 117 // const forterToken = getCookie('forterToken'); 118 // if(forterToken != null) { 119 // payloadData.forterToken = forterToken; 120 // } 121 console.log(payloadData); 122 iframe.contentWindow.postMessage( 123 { 124 type: 'INIT', 125 timestamp: Date.now(), 126 payload: payloadData 127 },'*'); 128 //} 129 } 130 } 131 } 132 133 function loadProductListEmbeds(iframe, productsData, pricelistData) { 134 if (!iframe) { 135 console.error("Iframe not found"); 136 return; 137 } 138 139 const iframeID = iframe.id; 140 let src = iframe.dataset.src; 141 142 if (iframeID === "category-embed" || iframeID == "product-embed" || iframeID === "search-embed") { 143 // Retrieve localStorage and sessionStorage data only once for performance 144 const selectedLocation = sessionStorage.getItem('ls.location'); 145 const selectedPricelist = sessionStorage.getItem('ls.selectedPriceList'); 146 const user = localStorage.getItem('user'); 147 148 if(typeof pricelistData == "undefined" || pricelistData == null || pricelistData == '') { 149 pricelistData = selectedPricelist; 150 } 151 152 const payloadData = { 153 selectedLocation: selectedLocation ? JSON.parse(selectedLocation) : null, 154 selectedPriceList: pricelistData ? JSON.parse(pricelistData) : null, 155 user: user ? JSON.parse(user) : null, 156 productList: { 157 products: productsData.products, 158 healthClaims: productsData.healthClaims, 159 promotions: productsData.promotions 160 } 161 }; 162 163 if(src.indexOf('locName') == -1 && iframeID != "product-embed") { 164 let selectedLocation = sessionStorage.getItem('ls.location'); 165 if(selectedLocation != null) { 166 selectedLocation = JSON.parse(selectedLocation); 167 if(src.indexOf('?') > -1) { 168 src += '&locName='+selectedLocation.locName; 169 } 170 else { 171 src += '?locName='+selectedLocation.locName; 172 } 173 } 174 let selectedPricelist = sessionStorage.getItem('ls.selectedPriceList'); 175 if(typeof pricelistData != "undefined") { 176 selectedPricelist = pricelistData; 177 } 178 if(selectedPricelist != null) { 179 selectedPricelist = JSON.parse(selectedPricelist); 180 // console.log(selectedPricelist); 181 if(src.indexOf('?') > -1) { 182 src += '&pListName='+selectedPricelist.pListName; 183 } 184 else { 185 src += '?pListName='+selectedPricelist.pListName; 186 } 187 } 188 } 189 190 allLocation = sessionStorage.getItem('ls.allLocations'); 191 if(allLocation != null) { 192 allLocationData = JSON.parse(allLocation); 193 payloadData.allLocations = allLocationData; 194 } 195 196 const forterToken = getCookie('forterToken'); 197 if(forterToken != null) { 198 payloadData.forterToken = forterToken; 199 } 200 201 const loggedIn = isUserLoggedIn(); 202 if(loggedIn) { 203 const basket = JSON.parse(localStorage.getItem('basket')); 204 const shoppingLists = JSON.parse(sessionStorage.getItem('shoppingLists')); 205 if(user != null) { 206 payloadData.user = JSON.parse(user); 207 }
208 if(basket != null) { 209 payloadData.basket = basket; 210 } 211 if(shoppingLists != null) { 212 payloadData.shoppingLists = shoppingLists; 213 } 214 215 const coupons = JSON.parse(sessionStorage.getItem('buyAgainCoupons')); 216 if(coupons != null) { 217 payloadData.birdziCouponList = coupons; 218 } 219 } 220 221 iframe.src = src; 222 iframe.onload = () => { 223 isFramePostedBefore = true; 224 console.log('Iframe loaded, posting message to iframe content window.'); 225 console.log(payloadData); 226 $('.svt-embed-wrap .bouncing-loader').hide(); 227 iframe.contentWindow.postMessage({ 228 type: 'INIT', 229 timestamp: Date.now(), 230 payload: payloadData 231 }, '*'); 232 }; 233 } 234 } 235 236 window.addEventListener('CACHE_DATA_READY', function(event) { 237 const iframeEl = document.querySelector('.svt-embed'); 238 if(iframeEl != null) { 239 if(iframeEl.id == "category-embed" || iframeEl.id == "product-embed" || iframeEl.id == "search-embed") { 240 productsData = event.detail.data; 241 const plist = getUrlParameter('plist') || getUrlParameter('pListName'); 242 // console.log('hasPlistParam', hasPlistParam); 243 if(plist != null) { 244 if(plist == 'catering') { 245 const cateringPricelist = localStorage.getItem('ls.cateringPriceListID'); 246 const cateringPricelistID = getCookie('cateringPriceListID'); 247 const priceListType = event.detail.priceListType; 248 if(priceListType == cateringPricelistID) { 249 loadProductListEmbeds(iframeEl, productsData, cateringPricelist); 250 } 251 } 252 if(plist == 'deli') { 253 const deliPriceList = localStorage.getItem('ls.deliPriceList'); 254 const deliPriceListID = getCookie('deliPriceListID'); 255 const priceListType = event.detail.priceListType; 256 // console.log(priceListType == deliPriceListID); 257 if(priceListType == deliPriceListID) { 258 loadProductListEmbeds(iframeEl, productsData, deliPr
258iceList); 259 } 260 } 261 } 262 else { 263 loadProductListEmbeds(iframeEl, productsData); 264 } 265 } 266 } 267 }); 268 269 $(document).ready(function() { 270 271 // Cache DOM selection and variables outside loops 272 const iframeEl = document.querySelector('.svt-embed'); 273 let products = ''; 274 let dataFetched = false; 275 if(iframeEl != null) { 276 if(iframeEl.id == "category-embed" || iframeEl.id == "product-embed" || iframeEl.id == "search-embed") { 277 const plist = getUrlParameter('plist') || getUrlParameter('pListName'); 278 if(plist != null) { 279 if(plist == 'catering') { 280 const cateringPricelistID = getCookie('cateringPriceListID'); 281 console.log('Catering Pricelist Fetch'); 282 loadProductListbyPL( cateringPricelistID ); 283 } 284 if(plist == 'deli') { 285 const deliPricelistID = getCookie('deliPriceListID'); 286 console.log('Deli Pricelist Fetch'); 287 loadProductListbyPL( deliPricelistID ); 288 } 289 } 290 // Optimize by switching from setInterval to requestIdleCallback for performance 291 function checkDataAndLoad() { 292 getDataFromIndexedDB('products') 293 .then(data => { 294 if (data) { 295 products = data.products; 296 // loadProductListEmbeds(iframeEl, products); 297 dataFetched = true; // Mark as fetched to prevent unnecessary checks 298 } 299 }) 300 .catch(error => { 301 console.error("Error fetching data from IndexedDB:", error); 302 }); 303 } 304 305 // Use a one-time polling with a backoff strategy for efficient retries 306 function initiateDataChecker() { 307 let attempts = 0; 308 const maxAttempts = 5; 309 const backoffDelay = 1000; // 1 second delay 310 311 function tryFetchData() { 312 if (!dataFetched && attempts < maxAttempts) { 313 checkDataAndLoad(); 314 attempts++; 315 setTimeout(tryFetchData, backoffDelay); 316 } 317 } 318 tryFetchData(); // Initiate the first fetch attempt 319 } 320 321 initiateDataChecker(); // Start the data checking process 322 } 323 } 324 325 if($('.svt-embed').length) { 326 var id = $('.svt-embed').attr('id'); 327 var src = $('.svt-embed').attr('data-src'); 328 var param = $('.svt-embed').attr('data-param'); 329 if(id != "search-embed" && id != "category-embed" && id != "product-embed") { 330 if(typeof src != "undefined") { 331 if(src.indexOf('[svt_embed_base_url]') > -1) { 332 src = src.replace('[svt_embed_base_url]',embeddata.svt_embed_base_url); 333 } 334 if(typeof param != 'undefined' && (param != 'p' && param != 'l')) { 335 var paramVal = getUrlParameter(param); 336 if(typeof paramVal != 'undefined' && id != "search-embed") { 337 paramVal = paramVal.replace(/[^a-zA-Z0-9\-]/g, ""); 338 paramVal = paramVal.replace('+', ""); 339 src += paramVal; 340 } 341 else if(id == "search-embed") { 342 src += encodeURI(paramVal); 343 } 344 } 345 if(id == "search-embed" || id != "product-embed") { 346 var subcat = getUrlParameter('subcat'); 347 if(typeof subcat != "undefined" && subcat != false && subcat != null) { 348 subcat = subcat.replace(/[^a-zA-Z]/g, ""); 349 subcat = subcat.replace('+', ""); 350 src += '?subcategory='+subcat; 351 } 352 let selectedLocation = sessionStorage.getItem('ls.location'); 353 if(selectedLocation != null && (id != "product-embed" && id != "popup-pdp-embed")) { 354 selectedLocation = JSON.parse(selectedLocation); 355 if(src.indexOf('?') > -1) { 356 src += '&locName='+selectedLocation.locName; 357 } 358 else { 359 src += '?locName='+selectedLocation.locName; 360 } 361 } 362 let selectedPricelist = sessionStorage.getItem('ls.selectedPriceList'); 363 let pListName = getUrlParameter('pListName'); 364 if(pListName == 'catering') { 365 const cateringPricelist = localStorage.getItem('ls.cateringPriceListID'); 366 selectedPricelist = cateringPricelist; 367 } 368 if(selectedPricelist != null && id != "product-embed") { 369 selectedPricelist = JSON.parse(selectedPricelist); 370 console.log(selectedPricelist); 371 if(src.indexOf('?') > -1) { 372 src += '&pListName='+selectedPricelist.pListName; 373 } 374 else { 375 src += '?pListName='+selectedPricelist.pListName; 376 } 377 } 378 } 379 $('.svt-embed').attr('src',src); 380 } 381 // postDataToIframe(); 382 } 383 } 384 385 $(window).on('CACHE_DATA_READY',function(event) { 386 if(allProducts.length == 0) { 387 allProducts = event.detail.data; 388 } 389 }); 390 391 $(window).on('message', function(e) { 392 // Cache commonly accessed elements outside the event 393 var iframeObj = $('iframe'); 394 var iframe = $('#popup-login-embed'); 395 var shortNameElement = $('.short-name'); 396 var popupEmbed = $('.svt-popup-embed'); 397 var popupWrap = $('.svt-popup-wrap'); 398 var addToCartAction = $('.add-to-cart-action'); 399 var hsBestDealsProducts = $('.hs-best-deals-products'); 400 401 // Check origin for security 402 if (e.originalEvent.origin !== embeddata.svt_embed_base_url) { 403 return; 404 } 405 406 if (e.originalEvent.data) { 407 var response = e.originalEvent.data; 408 var user; 409 410 // console.log(response); 411 412 if (response.type === 'LOGIN') { 413 user = response.payload.user; 414 var redirect = iframe.attr('data-redirect'); 415 416 // Store user data in cookies and local/session storage 417 var userString = JSON.stringify(user); 418 // $.cookie('usr', userString); 419 setUserCookie(); 420 $('body').addClass('hs-logged-in'); 421 localStorage.setItem('user', userString); 422 const shortName = user.firstName+' '+(user.lastName).substring(0,1)+'.'; 423 shortNameElement.html(shortName); 424 popupEmbed.removeAttr('src'); 425 popupWrap.fadeOut(); 426 addToCartAction.removeClass('login-required'); 427 updateCartCount(); 428 // console.log(allProducts); 429 // loadBuyAgainProductsData(allProducts); 430 // loadFeaturedProducts(); 431 // loadPointsHistory(); 432 // loadLifetimeSaving(); 433 if (typeof redirect !== 'undefined') { 434 window.location.href = redirect; 435 } 436 else { 437 window.location.reload(); 438 } 439 // sessionStorage.setItem('user', userString); 440 441 // Send user data via fetch 442 /*fetch(sitedata.ajax_url, { 443 method: 'POST', 444 headers: { 445 'Content-Type': 'application/x-www-form-urlencoded', 446 }, 447 body: new URLSearchParams({ 448 action: 'set_user_session', 449 user: userString 450 }) 451 }) 452 .then(response => { 453 if (!response.ok) { 454 throw new Error('Network response was not ok'); 455 } 456 return response.json(); 457 }) 458 .then(response => { 459 $('body').addClass('hs-logged-in'); 460 461 if (response.short_name) { 462 shortNameElement.html(response.short_name); 463 popupEmbed.removeAttr('src'); 464 popupWrap.fadeOut(); 465 addToCartAction.removeClass('login-required'); 466 // sitedata.is_logged_in = 1; 467 // sitedata.userpoints = response.userpoints; 468 // var uid = response.uid; 469 // sessionStorage.setItem('wpid',uid
469); 470 471 updateCartCount(); 472 // console.log(allProducts); 473 loadBuyAgainProductsData(allProducts); 474 loadFeaturedProducts(); 475 476 if (typeof redirect !== 'undefined') { 477 window.location.href = redirect; 478 } 479 } 480 }) 481 .catch(error => { 482 console.error('Fetch error:', error); 483 });*/ 484 } else if(response.type == 'READY') { 485 postDataToIframe(); 486 if(iframeObj.length && isFramePostedBefore == true) { 487 if(iframeObj.attr('id') == 'category-embed' || iframeObj.attr('id') == "product-embed") { 488 iframeObj.trigger('load'); 489 } 490 } 491 } else if(response.type == 'SET_LOCATION_PRICELIST') { 492 var payload = response.payload; 493 let selectedLocation = payload.selectedLocation; 494 let selectedPriceList = payload.selectedPriceList; 495 if(selectedLocation !== null) { 496 let currentLocation = getCookie('selectedLocation'); 497 if(selectedLocation.uniqueName !== currentLocation) { 498 console.log('Updating location from message'); 499 sessionStorage.setItem('ls.location',JSON.stringify(selectedLocation)); 500 document.cookie = `selectedLocation=${selectedLocation.uniqueName}; path=/`; 501 document.cookie = `selectedLocName=${selectedLocation.locName}; path=/`; 502 const priceLists = selectedLocation.priceLists; 503 var cateringPricelist = priceLists.filter(priceList => priceList.pListName == "catering" ); 504 if(cateringPricelist.length) { 505 cateringPricelist = cateringPricelist[0]; 506 document.cookie = `cateringPriceListID=${cateringPricelist.uniqueName}; path=/`; 507 localStorage.setItem('ls.cateringPriceListID',JSON.stringify(cateringPricelist)); 508 } 509 var deliPricelist = priceLists.find(p => p.pListName === "deli"); 510 if(deliPricelist.length) { 511 deliPricelist = deliPricelist[0]; 512 document.cookie = `deliPriceListID=${deliPricelist.uniqueName}; path=/`; 513 localStorage.setItem('ls.deliPriceList', JSON.stringify(deliPricelist)); 514 } 515 localStorage.removeItem('basket'); 516 localStorage.setItem("storeName", selectedLocation.name); 517 document.getElementById('navbar-store-location').innerHTML = selectedLocation.name; 518 document.getElementById('navbar-store-location-tab').innerHTML = selectedLocation.name; 519 if (navigator.serviceWorker.controller) { 520 navigator.serviceWorker.controller.postMessage({ action: 'clear-cache' }); 521 } 522 } 523 } 524 if(selectedPriceList !== null) { 525 let currentPricelist = getCookie('selectedPriceList'); 526 let pListName = getUrlParameter('plist'); 527 if(selectedPriceList.uniqueName !== currentPricelist && pListName == null) { 528 console.log('Updating pricelist from message'); 529 document.cookie = `selectedPriceList=${selectedPriceList.uniqueName}; path=/`; 530 document.cookie = `selectedPListName=${selectedPriceList.pListName}; path=/`; 531 localStorage.removeItem('basket'); 532 if (navigator.serviceWorker.controller) { 533 navigator.serviceWorker.controller.postMessage({ action: 'clear-cache' }); 534 } 535 } 536 } 537 } else if (response.type === 'NAVIGATION') { 538 var payload = response.payload; 539 switch (payload.location) { 540 case 'HOME': 541 window.location.href = embeddata.home_url; 542 break; 543 case 'CART': 544 var pListName = payload.params.pListName; 545 var cartUrl = embeddata.cart; 546 if(typeof pListName != "undefined") { 547 cartUrl += '?pListName='+pListName; 548 } 549 window.location.href = cartUrl; 550 break; 551 case 'CHECKOUT': 552 var pListName = getUrlParameter('pListName'); 553 var checkoutUrl = embeddata.checkout; 554 if(typeof pListName != "undefined") { 555 checkoutUrl += '?pListName='+pListName; 556 } 557 window.location.href = checkoutUrl; 558 break; 559 case 'MY_ORDERS': 560 var params = payload.params; 561 var order = params.order; 562 window.location.href = embeddata.orderDetails+'?order='+encodeURIComponent(order); 563 break; 564 case 'PRODUCTS': 565 window.location.href = embeddata.home_url; 566 break; 567 case 'PRODUCT': 568 var productID = payload.params.productId; 569 openPDPPopup(productID); 570 // window.location.href = embeddata.product + '?product=' + productID; 571 break; 572 case 'PRIVACY': 573 window.location.href = embeddata.home_url+'/privacy-policy/'; 574 break; 575 case 'TERMS': 576 window.location.href = embeddata.home_url+'/terms-of-service/'; 577 break; 578 case 'RECIPES': 579 window.location.href = embeddata.home_url+payload.directLink; 580 break; 581 case 'CONFIRMATION': 582 window.location.href = embeddata.home_url+'/cart/checkout/confirm/'; 583 break; 584 } 585 } else if( response.type == "CART_UPDATE" ) { 586 var payload = response.payload; 587 const cart = payload.cart; 588 localStorage.setItem('basket', JSON.stringify(cart.items)); 589 if(cart.itemsTotal > 0) { 590 jQuery('.hs-cart-count').html(cart.itemsTotal); 591 jQuery('.hs-cart-count').addClass('active'); 592 } 593 else { 594 jQuery('.hs-cart-count').html(''); 595 jQuery('.hs-cart-count').removeClass('active'); 596 } 597 } else if( response.type == "USER_UPDATE" ) { 598 var payload = response.payload; 599 const user = payload.user; 600 localStorage.setItem('user', JSON.stringify(user)); 601 } else if( response.type == "SHOPPING_LISTS_UPDATE" ) { 602 var payload = response.payload; 603 const lists = payload.shoppingLists.lists; 604 sessionStorage.setItem('shoppingLists', JSON.stringify(lists)); 605 } 606 } 607 }); 608 609 setEmbedHeightForMobile(); 610 });
611 612 function setEmbedHeightForMobile() { 613 if(jQuery(window).width() < 768) { 614 const headerHeight = jQuery('.custom_header').outerHeight(); 615 jQuery('#cart-embed').css('height', `calc(100vh - ${headerHeight}px)`); 616 } 617 else { 618 jQuery('#cart-embed').css('height', '100vh'); 619 } 620 } 621 622 $(window).on('resize', function() { 623 setEmbedHeightForMobile(); 624 }); 625})(jQuery); 626 627// window.addEventListener('message', function(event) { 628 629// console.log('Message received from iframe:', event.data); 630// });
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.