/* Scroll-triggered discount popup -- auto-pulls its content from the page itself (hook line, hero image, pricing, CTA) so the same script can drop into any product site in this template family without per-site edits. Shows once the visitor scrolls past 50% of the page, once per session. */ (function () { "use strict"; var TIMER_MINUTES = 17; var SCROLL_TRIGGER = 0.5; var SESSION_KEY = "wp_popup_shown"; var DEADLINE_KEY = "wp_popup_deadline"; if (sessionStorage.getItem(SESSION_KEY)) return; function text(el) { return el ? el.textContent.replace(/\s+/g, " ").trim() : ""; } function pickHook() { var h1 = document.querySelector("h1"); var t = text(h1) || document.title.split("|")[0].trim(); return t.length > 90 ? t.slice(0, 87).trim() + "…" : t; } function pickHeroImage() { var hero = document.querySelector( "[class*='hero'] img, [id*='hero'] img" ); if (hero) return hero.src; var og = document.querySelector('meta[property="og:image"]'); if (og) return og.content; var any = document.querySelector("img"); return any ? any.src : ""; } function pickPricing() { var priceRe = /\$\s?\d+(?:\.\d{1,2})?/g; // Preferred: an explicit "Regular $X / Today $Y" style block -- common // copy pattern for the per-bottle before/after price, and more reliable // than the first in a pricing grid (which is often a pack TOTAL, // not the per-bottle price). var all = document.querySelectorAll("body *"); for (var i = 0; i < all.length; i++) { var t = all[i].textContent || ""; if (/regular/i.test(t) && /today/i.test(t) && t.length < 200) { var prices = t.match(priceRe); if (prices && prices.length >= 2) { return { before: prices[0], single: prices[1] }; } } } var scope = document.querySelector("[id*='pric'], [class*='pric']") || document.body; var before = ""; var struck = scope.querySelector("del, s, strike"); if (struck) { var m = struck.textContent.match(priceRe); if (m) before = m[0]; } var single = ""; var perBottle = scope.textContent.match(/\$\s?\d+(?:\.\d{1,2})?\s*\/\s*bottle/i); if (perBottle) { single = perBottle[0].match(priceRe)[0]; } else { var bold = scope.querySelectorAll("b, strong"); for (var j = 0; j < bold.length; j++) { var bm = bold[j].textContent.match(priceRe); if (bm && bold[j].textContent !== before) { single = bm[0]; break; } } } if (!single) { var rest = (scope.textContent.match(priceRe) || []).filter(function (p) { return p !== before; }); if (rest.length) single = rest[rest.length - 1]; } return { before: before, single: single }; } function pickButton() { var primary = document.querySelector( "[class*='pric'] a[class*='btn'], [class*='hero'] a[class*='btn']" ) || document.querySelector("a[href*='order'], a[class*='btn--pri'], a[class*='btn-primary']"); if (primary) return { text: text(primary) || "Order Now", href: primary.href }; var any = document.querySelector("a[class*='btn']"); return any ? { text: text(any) || "Order Now", href: any.href } : { text: "Order Now", href: "/order" }; } function fmtTime(ms) { var total = Math.max(0, Math.floor(ms / 1000)); var m = Math.floor(total / 60); var s = total % 60; return (m < 10 ? "0" : "") + m + ":" + (s < 10 ? "0" : "") + s; } function buildPopup() { var hook = pickHook(); var img = pickHeroImage(); var price = pickPricing(); var btn = pickButton(); var deadline = sessionStorage.getItem(DEADLINE_KEY); if (!deadline) { deadline = Date.now() + TIMER_MINUTES * 60 * 1000; sessionStorage.setItem(DEADLINE_KEY, deadline); } else { deadline = parseInt(deadline, 10); } var style = document.createElement("style"); style.textContent = ".wp-ovl{position:fixed;inset:0;background:rgba(15,15,15,.6);z-index:99998;" + "display:flex;align-items:center;justify-content:center;padding:16px;" + "opacity:0;transition:opacity .25s ease}" + ".wp-ovl.wp-on{opacity:1}" + ".wp-box{background:#fff;max-width:420px;width:100%;border-radius:14px;" + "position:relative;padding:28px 22px 24px;text-align:center;" + "box-shadow:0 20px 60px rgba(0,0,0,.35);transform:scale(.92);" + "transition:transform .25s ease;font-family:inherit}" + ".wp-ovl.wp-on .wp-box{transform:scale(1)}" + ".wp-close{position:absolute;top:10px;right:12px;background:none;border:none;" + "font-size:22px;line-height:1;cursor:pointer;color:#888}" + ".wp-close:hover{color:#222}" + ".wp-hook{font-size:1.15rem;font-weight:800;margin:0 0 12px;line-height:1.3}" + ".wp-img{max-width:150px;height:auto;margin:0 auto 14px;display:block}" + ".wp-price{margin:0 0 6px}" + ".wp-price del{color:#999;font-size:1rem;margin-right:8px}" + ".wp-price b{font-size:1.6rem;color:#c0392b}" + ".wp-timer{font-weight:700;color:#c0392b;margin:6px 0 16px;font-size:.95rem;" + "letter-spacing:.02em}" + ".wp-btn{display:inline-block;background:#c0392b;color:#fff;text-decoration:none;" + "font-weight:700;padding:13px 26px;border-radius:8px;font-size:1rem}" + ".wp-btn:hover{opacity:.92}"; document.head.appendChild(style); var ovl = document.createElement("div"); ovl.className = "wp-ovl"; ovl.innerHTML = '
' + '' + (img ? '' : "") + '

' + hook + "

" + '

' + (price.before ? "" + price.before + "" : "") + (price.single ? "" + price.single + "" : "") + "

" + '
Offer reserved for
' + '' + btn.text + "" + "
"; document.body.appendChild(ovl); var countdownEl = ovl.querySelector(".wp-countdown"); var tick = setInterval(function () { var left = deadline - Date.now(); countdownEl.textContent = fmtTime(left); if (left <= 0) clearInterval(tick); }, 1000); countdownEl.textContent = fmtTime(deadline - Date.now()); function close() { ovl.classList.remove("wp-on"); setTimeout(function () { ovl.remove(); }, 250); } ovl.querySelector(".wp-close").addEventListener("click", close); ovl.addEventListener("click", function (e) { if (e.target === ovl) close(); }); requestAnimationFrame(function () { ovl.classList.add("wp-on"); }); sessionStorage.setItem(SESSION_KEY, "1"); } function scrollPct() { var doc = document.documentElement; var scrolled = window.scrollY || doc.scrollTop; var max = (doc.scrollHeight || document.body.scrollHeight) - window.innerHeight; return max > 0 ? scrolled / max : 0; } function onScroll() { if (scrollPct() >= SCROLL_TRIGGER) { window.removeEventListener("scroll", onScroll); buildPopup(); } } window.addEventListener("scroll", onScroll, { passive: true }); })();