Direkt zum Inhalt

(function(){ function qs(id){ return document.getElementById(id); } function rootEl(){ return document.getElementById('nlp-popup-root'); } const KEY = 'nlp-newsletter-state'; const IMG_KEY = 'nlp-newsletter-image'; function getCfg(){ const el = rootEl(); if (!el) return null; return { delay: Number(el.dataset.delay || 2500), freq: Number(el.dataset.frequency || 14), exit: el.dataset.exit === 'true', force: el.dataset.force === 'true', enablePicker: el.dataset.enablePicker === 'true', defaultImage: el.dataset.defaultImage || '', homeOnly: el.dataset.showHomeOnly === 'true' }; } function getState(){ try { return JSON.parse(localStorage.getItem(KEY)) || {}; } catch(e){ return {}; } } function setState(o){ localStorage.setItem(KEY, JSON.stringify(o)); } function isCapped(cfg){ if (cfg.force) return false; const { until } = getState(); return until && Date.now() < until; } function capForDays(days){ if (days <= 0) { localStorage.removeItem(KEY); return; } const until = Date.now() + days*24*60*60*1000; setState({ until }); } function saveImage(source){ try{ localStorage.setItem(IMG_KEY, JSON.stringify(source)); }catch(e){} } function loadImage(){ try{ const raw = localStorage.getItem(IMG_KEY); return raw? JSON.parse(raw): null; }catch(e){ return null; } } function openModal(modal, overlay, form){ modal.classList.add('is-visible'); overlay.hidden = false; overlay.classList.add('is-visible'); const email = form && form.querySelector('input[type="email"]'); setTimeout(()=>{ try{ email && email.focus(); }catch(e){} }, 50); document.addEventListener('keydown', onKey); function onKey(e){ if (e.key === 'Escape') close(); } function close(){ modal.classList.remove('is-visible'); overlay.classList.remove('is-visible'); setTimeout(()=>{ overlay.hidden = true; }, 120); document.removeEventListener('keydown', onKey); } overlay.addEventListener('click', close, { once:true }); const closeBtn = qs('nlp-close'); closeBtn && closeBtn.addEventListener('click', ()=>{ capForDays(getCfg().freq); close(); }, { once:true }); } function init(){ const cfg = getCfg(); if (!cfg) return; // Nur Startseite? if (cfg.homeOnly && (window.location.pathname !== '/' && !window.location.pathname.match(/^\/[a-z]{2}(-[A-Z]{2})?\/?$/))) { return; } const modal = qs('nlp-modal'); const overlay = qs('nlp-overlay'); const form = qs('nlp-form'); const submitBtn = qs('nlp-submit'); const message = qs('nlp-message'); const imageWrap = qs('nlp-image-wrap'); const imageEl = qs('nlp-image'); const fileInput = qs('nlp-file'); const urlInput = qs('nlp-url'); const applyBtn = qs('nlp-apply'); // Default-Bild anzeigen (aus Editor) if (cfg.defaultImage) { imageEl.src = cfg.defaultImage; imageWrap.hidden = false; } // Bereits gespeichert? const saved = loadImage(); if (saved && saved.src) { imageEl.src = saved.src; imageWrap.hidden = false; } // Öffnungslogik const show = ()=> openModal(modal, overlay, form); if (!isCapped(cfg)) { setTimeout(show, Math.max(0, cfg.delay)); if (cfg.exit){ let armed = true; document.addEventListener('mouseout', (e)=>{ if (!armed) return; if (e.clientY <= 0 || e.relatedTarget === null){ armed = false; show(); } }); } } else if (cfg.force) { show(); } // Submit: weich form && form.addEventListener('submit', async (e)=>{ e.preventDefault(); message && (message.textContent = ''); submitBtn && (submitBtn.disabled = true); const fd = new FormData(form); try { const res = await fetch(form.action, { method:'POST', headers:{'Accept':'text/html,application/xhtml+xml'}, body:fd, credentials:'same-origin' }); if (!res.ok) throw new Error('Netzwerkfehler'); capForDays(365); message && (message.textContent = 'Danke! Bitte prüfe deine E-Mails zur Bestätigung.'); setTimeout(()=>{ const overlay = qs('nlp-overlay'); overlay && (overlay.hidden = true); }, 1400); } catch(err){ form.submit(); } finally { submitBtn && (submitBtn.disabled = false); } }, { passive:false }); // Bildauswahl if (cfg.enablePicker){ fileInput && fileInput.addEventListener('change', ()=>{ const file = fileInput.files && fileInput.files[0]; if (!file) return; const url = URL.createObjectURL(file); urlInput && (urlInput.value = ''); imageEl.src = url; imageWrap.hidden = false; saveImage({ src: url, name: file.name }); }); applyBtn && applyBtn.addEventListener('click', ()=>{ const url = (urlInput && urlInput.value || '').trim(); if (!url) return; try { new URL(url); } catch(e){ alert('Bitte gültige Bild-URL eingeben.'); return; } imageEl.src = url; imageWrap.hidden = false; saveImage({ src: url }); }); } } if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init, { once:true }); } else { init(); } })();