(function () { const API_BASE = '/api'; const printerSelect = document.getElementById('printerSelect'); const printerCompare = document.getElementById('printerCompare'); const matBody = document.getElementById('matBody'); const tableHead = document.getElementById('tableHead'); const statusEl = document.getElementById('status'); const errorBox = document.getElementById('errorBox'); if (!printerSelect || !printerCompare || !matBody || !tableHead) { return; } function setStatus(text) { if (statusEl) { statusEl.textContent = text; } } function showError(msg) { if (!errorBox) return; errorBox.hidden = false; errorBox.textContent = msg; } function clearError() { if (!errorBox) return; errorBox.hidden = true; errorBox.textContent = ''; } function escapeHtml(value) { return String(value ?? '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } async function fetchJSON(path) { const res = await fetch(API_BASE + path, { headers: { 'Accept': 'application/json' } }); if (!res.ok) throw new Error('HTTP ' + res.status + ' for ' + path); return await res.json(); } async function loadPrinters() { try { setStatus('Lade Drucker ...'); const data = await fetchJSON('/printers'); printerSelect.innerHTML = ''; printerCompare.innerHTML = ''; if (!Array.isArray(data) || data.length === 0) { printerSelect.innerHTML = ''; setStatus('Keine Drucker gefunden'); return; } data.forEach(p => { printerSelect.appendChild(new Option(p.name, p.id)); printerCompare.appendChild(new Option(p.name, p.id)); }); loadSinglePrinter(data[0].id); setStatus('Drucker geladen'); } catch (err) { console.error(err); showError('Konnte Drucker nicht laden.'); setStatus('Fehler'); } } async function loadSinglePrinter(id) { if (!id) return; clearError(); setStatus('Lade Materialien ...'); try { const data = await fetchJSON('/printer-materials?id=' + encodeURIComponent(id)); renderTable([data]); setStatus('Fertig'); } catch (err) { console.error(err); showError('Konnte Materialien für den Drucker nicht laden.'); setStatus('Fehler'); } } async function loadMultiplePrinters(ids) { if (!ids.length) return; clearError(); setStatus('Lade Vergleich ...'); try { const datasets = await Promise.all( ids.map(id => fetchJSON('/printer-materials?id=' + encodeURIComponent(id))) ); renderTable(datasets); setStatus('Vergleich geladen'); } catch (err) { console.error(err); showError('Konnte einen der gewählten Drucker nicht laden.'); setStatus('Fehler'); } } function renderTable(datasets) { const baseHead = [ 'Material', 'Eigenschaften', 'Anwendung', 'Kinder ', 'Emission ' ].map(label => `