const qs = (e, t = document) => t.querySelector(e), qsa = (e, t = document) => Array.from(t.querySelectorAll(e)), navToggle = qs(".nav-toggle"), mainNav = qs(".main-nav"), toastRegion = qs("#toast-region"), downloadStatus = qs("#download-status"), loginForm = qs("#login-form"), loginEmail = qs("#login-email"), loginPassword = qs("#login-password"), loginStatus = qs("#login-status"), dashboard = qs("#dashboard"), dashboardTitle = qs("#dashboard-title"), sessionEmail = qs("#session-email"), logoutButton = qs("#logout-button"), profileForm = qs("#profile-form"), profileStatus = qs("#profile-status"), logoInput = qs("#company-logo"), logoPreview = qs("#logo-preview"), ticketsForm = qs("#tickets-form"), ticketsStatus = qs("#tickets-status"), servicesForm = qs("#services-form"), servicesStatus = qs("#services-status"), badgesForm = qs("#badges-form"), badgesStatus = qs("#badges-status"), requestsPanel = qs("#requests-panel"), requestsList = qs("#requests-list"), requestsStatus = qs("#requests-status"), documentsStatus = qs("#documents-status"); let selectedLogoDataUrl = "", wpBasicAuthHeader = "", portalData, STORAGE_KEY = "etx_portal_session", currentSession = loadSession(); function loadSession() { try { const stored = localStorage.getItem(STORAGE_KEY); if (stored) { const parsed = JSON.parse(stored); const wpId = Number(parsed.wpId || parsed.profile?.wpId || 0) || 0; return { isLoggedIn: parsed.isLoggedIn || false, email: parsed.email || "", profile: parsed.profile || {}, token: parsed.token || (wpId ? "cpt_" + wpId : ""), wpId: wpId, }; } } catch (e) { console.error("Session load error:", e); } const legacyLoggedIn = localStorage.getItem("isLoggedIn") === "true"; const legacyWpId = Number(localStorage.getItem("etx_profile_wp_id") || localStorage.getItem("etx_session_id") || 0) || 0; if (legacyLoggedIn || legacyWpId) { const legacyEmail = localStorage.getItem("userEmail") || ""; return { isLoggedIn: true, email: legacyEmail, profile: { email: legacyEmail, wpId: legacyWpId }, token: legacyWpId ? "cpt_" + legacyWpId : "", wpId: legacyWpId, }; } return { isLoggedIn: false, email: "", profile: {}, token: "", wpId: 0, }; } function saveSession() { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(currentSession)); } catch (e) { console.error("Session save error:", e); } } function clearSession() { try { localStorage.removeItem(STORAGE_KEY); } catch (e) { console.error("Session clear error:", e); } currentSession = { isLoggedIn: false, email: "", profile: {}, token: "", wpId: 0, }; } function setNavigationState(e) { (mainNav.classList.toggle("is-open", e), navToggle.setAttribute("aria-expanded", String(e)), navToggle.setAttribute( "aria-label", e ? "Navigation schließen" : "Navigation öffnen", )); } function updateActiveNavLinks() { const e = window.location.hash || "#home"; qsa(".main-nav a, .footer-links a").forEach((t) => { const a = t.getAttribute("href") === e; (t.toggleAttribute("aria-current", a), a && t.setAttribute("aria-current", "page")); }); } function handleNavToggleClick() { setNavigationState(!mainNav.classList.contains("is-open")); } function handleNavClick(e) { e.target.closest("a") && setNavigationState(!1); } function handleAnchorClick(e) { const t = e.currentTarget.getAttribute("href"); if (!t || "#" === t) return; const a = qs(t); a && (e.preventDefault(), a.scrollIntoView({ behavior: "smooth", block: "start" }), history.pushState(null, "", t), updateActiveNavLinks()); } function handleDownloadClick(e) { const t = e.currentTarget.getAttribute("href").split("/").pop(); downloadStatus.textContent = `Download vorbereitet: ${t}`; } function markFieldValidity(e) { e.setAttribute("aria-invalid", String(!e.validity.valid)); } function clearFieldInvalidState(e) { e.currentTarget.removeAttribute("aria-invalid"); } function validateForm(e, t) { return ( qsa("input, select, textarea", e).forEach(markFieldValidity), !!e.reportValidity() || (showToast(t, "error"), !1) ); } function getEmptyPortalData() { return { profile: {}, ticketRequests: [], serviceRequests: [], badgeRequests: [], documentDownloads: [], contactRequests: [], }; } function normalizePortalData(e) { const t = getEmptyPortalData(); return e && "object" == typeof e ? e.profile || e.ticketRequests || e.serviceRequests || e.badgeRequests || e.documentDownloads || e.contactRequests ? { profile: e.profile || {}, ticketRequests: Array.isArray(e.ticketRequests) ? e.ticketRequests : [], serviceRequests: Array.isArray(e.serviceRequests) ? e.serviceRequests : [], badgeRequests: Array.isArray(e.badgeRequests) ? e.badgeRequests : [], documentDownloads: Array.isArray(e.documentDownloads) ? e.documentDownloads : [], contactRequests: Array.isArray(e.contactRequests) ? e.contactRequests : [], } : ((t.profile = e), t) : t; } function readPortalData() { return portalData || (portalData = getEmptyPortalData()); } function updatePortalData(e) { const t = readPortalData(); return (e(t), t); } function readProfileData() { return currentSession.profile || {}; } function writeProfileData(e) { currentSession.profile = e || {}; updatePortalData((t) => { t.profile = currentSession.profile; }); } function setStatus(e, t, a = "") { ((e.textContent = t), e.classList.toggle("is-error", "error" === a), e.classList.toggle("is-success", "success" === a)); } function showToast(e, t = "") { const a = document.createElement("div"); ((a.className = "toast" + (t ? ` is-${t}` : "")), (a.textContent = e), toastRegion.append(a), window.setTimeout(() => { a.remove(); }, 4200)); } function formatRequestDetailValue(value) { if (Array.isArray(value)) return value.filter(Boolean).join(", "); if (value && "object" == typeof value) return JSON.stringify(value); return String(value || "").trim(); } function buildRequestDetails(request) { const details = []; if (request.anzahl) details.push(["Anzahl", request.anzahl]); if (request.email) details.push(["E-Mail", request.email]); if (request.nachricht) details.push(["Nachricht", request.nachricht]); const payload = request.details && "object" == typeof request.details ? request.details : {}; Object.entries(payload).forEach(([key, value]) => { if ( [ "aussteller_id", "ausstellerId", "wpId", "email", "empfaenger_email", "recipientEmail", "nachricht", "message", "anzahl", "anzahl_tickets", "ticketCount", "badgeCount", ].includes(key) ) return; const detailValue = formatRequestDetailValue(value); if (!detailValue) return; details.push([key.replace(/_/g, " "), detailValue]); }); return details; } function setButtonLoading(e, t, a) { e && (e.dataset.defaultLabel || (e.dataset.defaultLabel = e.textContent), (e.disabled = t), e.classList.toggle("is-loading", t), (e.textContent = t ? a : e.dataset.defaultLabel)); } async function withLoading(e, t, a) { setButtonLoading(e, !0, t); try { return await a(); } finally { setButtonLoading(e, !1, ""); } } function updateLogoPreview(e) { if (((logoPreview.innerHTML = ""), !e)) return void (logoPreview.textContent = "Kein Logo"); const t = document.createElement("img"); ((t.src = e), (t.alt = "Logo-Vorschau"), logoPreview.append(t)); } function fillProfileForm(e) { ((profileForm.elements.companyName.value = e.companyName || ""), (profileForm.elements.contactPerson.value = e.contactPerson || ""), (profileForm.elements.email.value = e.email || currentSession.email || ""), (profileForm.elements.phone.value = e.phone || ""), (profileForm.elements.website.value = e.website || ""), (profileForm.elements.description.value = e.description || ""), (profileForm.elements.category && (profileForm.elements.category.value = e.category || "")), (profileForm.elements.linkedin.value = e.linkedin || ""), (profileForm.elements.instagram.value = e.instagram || ""), (profileForm.elements.facebook.value = e.facebook || ""), (selectedLogoDataUrl = e.logo || ""), updateLogoPreview(selectedLogoDataUrl), updateDescCounter()); } function collectProfileData() { const e = readProfileData() || {}, t = Number.parseInt(e.wpId || currentSession.wpId || "0", 10) || 0; return { companyName: profileForm.elements.companyName.value.trim(), contactPerson: profileForm.elements.contactPerson.value.trim(), email: profileForm.elements.email.value.trim(), category: profileForm.elements.category ? profileForm.elements.category.value.trim() : "", phone: profileForm.elements.phone.value.trim(), website: profileForm.elements.website.value.trim(), description: profileForm.elements.description.value.trim(), logo: selectedLogoDataUrl, linkedin: profileForm.elements.linkedin.value.trim(), instagram: profileForm.elements.instagram.value.trim(), facebook: profileForm.elements.facebook.value.trim(), wpId: t, }; } function collectTicketRequest() { return { ticketCount: Number(ticketsForm.elements.ticketCount.value), recipientEmail: ticketsForm.elements.recipientEmail.value.trim(), message: ticketsForm.elements.message.value.trim(), createdAt: new Date().toISOString(), }; } function collectServiceRequest() { return { electricity: servicesForm.elements.electricity.value, furniture: servicesForm.elements.furniture.value, cleaning: servicesForm.elements.cleaning.value, wlan: servicesForm.elements.wlan.value, parking: Number(servicesForm.elements.parking.value || 0), message: servicesForm.elements.message.value.trim(), createdAt: new Date().toISOString(), }; } function collectBadgeRequest() { return { badgeCount: Number(badgesForm.elements.badgeCount.value), email: badgesForm.elements.email.value.trim() || currentSession.email || "", names: badgesForm.elements.names.value .split(/\n+/) .map((e) => e.trim()) .filter(Boolean), createdAt: new Date().toISOString(), }; } function renderRequests(anfragen = []) { if (!requestsList) return; requestsList.innerHTML = ""; if (!anfragen.length) { const empty = document.createElement("li"); empty.className = "request-item"; empty.textContent = "Noch keine Anfragen vorhanden."; requestsList.append(empty); return; } anfragen.forEach((request) => { const item = document.createElement("li"), head = document.createElement("div"), meta = document.createElement("span"), status = document.createElement("span"), details = document.createElement("dl"), date = request.date ? new Date(request.date) : null; item.className = "request-item"; head.className = "request-head"; meta.textContent = `${request.typeLabel || request.anfrage_typ || "Anfrage"} #${request.id || ""}${date && !Number.isNaN(date.getTime()) ? " · " + date.toLocaleDateString("de-DE") : ""}`; status.className = "request-status"; status.textContent = request.statusLabel || "In Bearbeitung"; head.append(meta, status); details.className = "request-details"; buildRequestDetails(request).slice(0, 8).forEach(([label, value]) => { const term = document.createElement("dt"), desc = document.createElement("dd"); term.textContent = label; desc.textContent = formatRequestDetailValue(value); details.append(term, desc); }); item.append(head); if (details.children.length) item.append(details); requestsList.append(item); }); }