(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(); }
})();