/* InstantAdPay session pop-up (Marty, 2026-09-24). One card, once per browser session, on every page that loads common.js. It exists because the dashboard card was too easy to scroll past: this one is a proper overlay you have to dismiss. It leads with WHAT THE SITE IS, not the promotion, because the ask was "remind them what it is about". Five Dollar Friday rides along underneath as the reason to act this week, and the card reads the live /api/friday so it says "tomorrow", "today" or nothing at all without anyone editing copy. Rules it follows: - once per SESSION, not per day: sessionStorage, so closing the tab resets it - a new `key` (change of promo, new campaign) shows it again even in the same session - never on the sign-up or sign-in flow: an overlay in the middle of joining costs sign-ups - Escape and the backdrop both close it, and focus is trapped while it is open - if sessionStorage is unavailable (private mode) it simply shows once and does not throw */ (function () { var KEY = 'iap.welcome.v1'; // Pages where an overlay would get in the way of something more important. // /join is the sign-up flow and /admin is staff only; an overlay on either is pure friction. var SKIP = /^\/(join|signup|register|login|auth|admin)(\/|$)/i; function seen() { try { return sessionStorage.getItem(KEY) === '1'; } catch (e) { return false; } } function mark() { try { sessionStorage.setItem(KEY, '1'); } catch (e) {} } function fridayLine(f) { if (!f || !f.on) return null; if (f.live) return { tag: 'TODAY', text: 'It is Five Dollar Friday right now. Every package of $5 or more gets 20% bonus credits, automatically, until midnight Central.' }; if (f.nextLabel) return { tag: f.nextLabel, text: 'Five Dollar Friday: any package of $5 or more gets ' + (f.pct || 20) + '% bonus credits, automatically. No code, nothing to claim.' }; return null; } function show(f) { if (document.querySelector('.iap-welcome')) return; var fri = fridayLine(f); var back = document.createElement('div'); back.className = 'iap-welcome'; back.setAttribute('role', 'dialog'); back.setAttribute('aria-modal', 'true'); back.setAttribute('aria-label', 'About InstantAdPay'); back.style.cssText = 'position:fixed;inset:0;z-index:400;background:rgba(2,6,5,.72);' + 'display:flex;align-items:center;justify-content:center;padding:18px;overflow:auto;' + '-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);'; var card = document.createElement('div'); card.style.cssText = 'position:relative;width:100%;max-width:470px;background:#0b1512;color:#eef7f3;' + 'border:1px solid rgba(67,232,195,.28);border-radius:18px;padding:26px 24px 22px;' + 'box-shadow:0 26px 70px rgba(0,0,0,.6);font-size:15px;line-height:1.55;'; var html = '' + '
InstantAdPay
' + '

The ad spend in your line pays you, in the same transaction.

' + '

You buy advertising you were going to buy anyway. When someone in your line buys a package, the contract splits it and your share lands in your wallet before the page reloads. No back office, no payday to wait for.

' + ''; if (fri) { html += '
' + '
' + fri.tag + '
' + '
' + fri.text + '
'; } html += '
' + 'See the packages' + 'Live ledger' + '
'; card.innerHTML = html; back.appendChild(card); document.body.appendChild(back); mark(); var prev = document.activeElement; var closeBtn = card.querySelector('.iap-w-x'); function close() { back.remove(); document.removeEventListener('keydown', onKey); try { if (prev && prev.focus) prev.focus(); } catch (e) {} } function onKey(e) { if (e.key === 'Escape') { close(); return; } if (e.key !== 'Tab') return; var f = card.querySelectorAll('button,a[href]'); if (!f.length) return; var first = f[0], last = f[f.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } } closeBtn.addEventListener('click', close); back.addEventListener('click', function (e) { if (e.target === back) close(); }); // following a link is a deliberate exit, so let it through but tidy up card.querySelectorAll('.iap-w-go').forEach(function (a) { a.addEventListener('click', close); }); document.addEventListener('keydown', onKey); try { closeBtn.focus(); } catch (e) {} } function boot() { if (seen() || SKIP.test(location.pathname)) return; // the Friday state decides one paragraph; a failure there must not stop the card fetch('/api/friday').then(function (r) { return r.ok ? r.json() : null; }) .catch(function () { return null; }) .then(function (f) { show(f); }); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot(); })();