(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