(function(){ const SHOW_BEFORE_FADE_MS = 750; // show briefly then fade when just added // --- Collect what's in the cart (from minicart dropdown) --- function getCartSkusFromMini() { const rows = document.querySelectorAll(".cart-dropdown table.minicart tr.item"); const skus = []; rows.forEach(row => { const raw = row.getAttribute("data-itemobj"); if (!raw) return; try { // data-itemobj is HTML-escaped, so convert " → " const json = raw.replace(/"/g, '"'); const item = JSON.parse(json); if (item && item.item_sku) skus.push(String(item.item_sku).trim().toUpperCase()); } catch (e) { // ignore parse errors silently in production // console.warn("minicart itemobj parse failed", e); } }); return skus; } // --- Collect from CART page table rows --- function getCartSkusFromCartTable() { const els = document.querySelectorAll("tr.item .item_sku"); const skus = []; els.forEach(el => { const sku = (el.textContent || "").trim(); if (sku) skus.push(sku.toUpperCase()); }); return skus; } function getCartIdsFromCartTable() { // Look for classes like "item_85724519" on const ids = []; document.querySelectorAll("tr.item").forEach(tr => { tr.classList.forEach(cls => { if (cls.startsWith("item_")) { const id = parseInt(cls.slice(5), 10); if (!Number.isNaN(id)) ids.push(id); } }); }); return ids; } function getAllCartKeys() { // Prefer minicart data if present; otherwise use cart table. const miniSkus = getCartSkusFromMini(); const tableSkus = getCartSkusFromCartTable(); const tableIds = getCartIdsFromCartTable(); return { skus: Array.from(new Set([...miniSkus, ...tableSkus])), ids: Array.from(new Set(tableIds)) }; } function fadeAndHide(banner) { banner.classList.add("fading"); setTimeout(() => { banner.classList.remove("visible", "fading"); banner.style.display = "none"; }, 800); } let updateScheduled = false; function scheduleUpdate() { if (updateScheduled) return; updateScheduled = true; setTimeout(() => { updateScheduled = false; updatePromoBanners(); }, 60); } function updatePromoBanners() { const { skus, ids } = getAllCartKeys(); const onCartPage = location.pathname === "/cart"; document.querySelectorAll(".promo-banner[data-promo-sku], .promo-banner[data-promo-id]").forEach(banner => { const skuAttr = (banner.getAttribute("data-promo-sku") || "").trim().toUpperCase(); const idAttr = parseInt(banner.getAttribute("data-promo-id") || "", 10); const skuMatch = skuAttr && skus.includes(skuAttr); const idMatch = !Number.isNaN(idAttr) && ids.includes(idAttr); const inCart = skuMatch || idMatch; if (inCart) { if (sessionStorage.getItem("justAdded-" + (skuAttr || idAttr)) === "true" && !onCartPage) { // Show briefly then fade out (nice feedback on non-cart pages) banner.classList.add("visible"); banner.style.display = banner.style.display || "flex"; setTimeout(() => { sessionStorage.removeItem("justAdded-" + (skuAttr || idAttr)); fadeAndHide(banner); }, SHOW_BEFORE_FADE_MS); } else { // Hide immediately banner.classList.remove("visible"); banner.style.display = "none"; } } else { // Not in cart → make sure it’s visible banner.classList.add("visible"); banner.style.display = "flex"; banner.style.opacity = "1"; } }); } // Mark "just added" so we can show-then-fade on non-cart pages function wireAddToCartClicks() { document.querySelectorAll(".paratus-add-to-cart-btn").forEach(btn => { btn.addEventListener("click", () => { const sku = (btn.dataset.itemSku || "").trim().toUpperCase(); const id = btn.dataset.itemId ? parseInt(btn.dataset.itemId, 10) : null; if (sku) sessionStorage.setItem("justAdded-" + sku, "true"); if (!Number.isNaN(id) && id) sessionStorage.setItem("justAdded-" + id, "true"); }); }); } // Observe minicart if present function observeMinicart() { const mini = document.querySelector(".minicart_container"); if (!mini) return; const obs = new MutationObserver(scheduleUpdate); obs.observe(mini, { childList: true, subtree: true }); } // Observe the cart table (or fall back to body) for changes on the cart page function observeCartTable() { if (location.pathname !== "/cart") return; const cartRow = document.querySelector("tr.item"); const container = cartRow ? cartRow.closest("table") || cartRow.parentElement || document.body : document.body; const obs = new MutationObserver(scheduleUpdate); obs.observe(container, { childList: true, subtree: true }); } // Start document.addEventListener("DOMContentLoaded", () => { wireAddToCartClicks(); updatePromoBanners(); // Kick a few delayed passes in case the page hydrates content later setTimeout(updatePromoBanners, 200); setTimeout(updatePromoBanners, 800); setTimeout(updatePromoBanners, 2000); observeMinicart(); observeCartTable(); }); })(); // JavaScript Document