{"id":237,"date":"2026-03-03T16:49:05","date_gmt":"2026-03-03T16:49:05","guid":{"rendered":"https:\/\/rettungstormarn.wenk-hh.de\/?page_id=237"},"modified":"2026-03-03T20:32:21","modified_gmt":"2026-03-03T20:32:21","slug":"kfz2026","status":"publish","type":"page","link":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/kfz2026\/","title":{"rendered":"KFZ2026"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Reservefahrzeug-Management im Rettungsdienst<\/title>\n    <style>\n        :root {\n            --primary-color: #002741;\n            --bg-color: #f0f2f5;\n            --column-bg: #e2e8f0;\n            --card-bg: #ffffff;\n            --text-main: #333333;\n            --text-muted: #64748b;\n            \n            \/* Ampel Farben *\/\n            --status-green: #22c55e;\n            --status-yellow: #eab308;\n            --status-red: #ef4444;\n            --status-dimmed: #cbd5e1;\n        }\n\n        * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n            background-color: var(--bg-color);\n            color: var(--text-main);\n            height: 100vh;\n            display: flex;\n            flex-direction: column;\n            overflow: hidden;\n        }\n\n        \/* Header *\/\n        header {\n            background-color: var(--primary-color);\n            color: white;\n            padding: 1rem 2rem;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n            z-index: 10;\n        }\n\n        header h1 {\n            font-size: 1.5rem;\n            font-weight: 600;\n        }\n\n        .btn {\n            background-color: white;\n            color: var(--primary-color);\n            border: none;\n            padding: 0.5rem 1rem;\n            border-radius: 6px;\n            cursor: pointer;\n            font-weight: 600;\n            transition: background-color 0.2s;\n            display: inline-flex;\n            align-items: center;\n            gap: 0.5rem;\n        }\n\n        .btn:hover { background-color: #e2e8f0; }\n        .btn-primary { background-color: #3b82f6; color: white; }\n        .btn-primary:hover { background-color: #2563eb; }\n        .btn-danger { background-color: var(--status-red); color: white; }\n        .btn-danger:hover { background-color: #dc2626; }\n\n        \/* Board Area (Horizontal Scrolling) *\/\n        .board {\n            display: flex;\n            flex: 1;\n            overflow-x: auto;\n            overflow-y: hidden;\n            padding: 1.5rem;\n            gap: 1.5rem;\n            align-items: flex-start;\n        }\n\n        \/* Scrollbar Styling *\/\n        .board::-webkit-scrollbar { height: 10px; }\n        .board::-webkit-scrollbar-track { background: var(--bg-color); }\n        .board::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 5px; }\n        .board::-webkit-scrollbar-thumb:hover { background: #94a3b8; }\n\n        \/* Column (Rettungswache) *\/\n        .column {\n            background-color: var(--column-bg);\n            border-radius: 12px;\n            min-width: 320px;\n            width: 320px;\n            max-height: 100%;\n            display: flex;\n            flex-direction: column;\n            box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n        }\n\n        .column-header {\n            padding: 1rem;\n            font-weight: bold;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            border-bottom: 2px solid var(--bg-color);\n        }\n\n        .column-body {\n            padding: 1rem;\n            overflow-y: auto;\n            flex: 1;\n            min-height: 100px;\n        }\n\n        \/* Card (Fahrzeug) *\/\n        .card {\n            background-color: var(--card-bg);\n            border-radius: 10px;\n            padding: 1rem;\n            margin-bottom: 1rem;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.08);\n            cursor: grab;\n            transition: transform 0.1s, box-shadow 0.1s;\n            border-left: 5px solid transparent;\n        }\n\n        .card:active { cursor: grabbing; }\n        .card:hover { box-shadow: 0 4px 8px rgba(0,0,0,0.12); transform: translateY(-2px); }\n        .card.dragging { opacity: 0.5; }\n\n        .card-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: flex-start;\n            margin-bottom: 0.75rem;\n        }\n\n        .card-title {\n            font-weight: bold;\n            font-size: 1.1rem;\n        }\n\n        \/* Ampel *\/\n        .traffic-light {\n            display: flex;\n            gap: 4px;\n            background: #333;\n            padding: 4px;\n            border-radius: 12px;\n        }\n\n        .light {\n            width: 12px;\n            height: 12px;\n            border-radius: 50%;\n            background-color: var(--status-dimmed);\n            box-shadow: inset 0 1px 2px rgba(0,0,0,0.5);\n        }\n\n        .light.green.active { background-color: var(--status-green); box-shadow: 0 0 5px var(--status-green); }\n        .light.yellow.active { background-color: var(--status-yellow); box-shadow: 0 0 5px var(--status-yellow); }\n        .light.red.active { background-color: var(--status-red); box-shadow: 0 0 5px var(--status-red); }\n\n        .card-meta {\n            font-size: 0.85rem;\n            color: var(--text-muted);\n            margin-bottom: 0.5rem;\n            display: flex;\n            justify-content: space-between;\n        }\n\n        .card-tags {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 4px;\n            margin-bottom: 0.5rem;\n        }\n\n        .tag {\n            background-color: var(--primary-color);\n            color: white;\n            font-size: 0.7rem;\n            padding: 2px 6px;\n            border-radius: 4px;\n        }\n\n        .checklist-progress {\n            font-size: 0.8rem;\n            color: var(--text-muted);\n            display: flex;\n            align-items: center;\n            gap: 5px;\n            margin-top: 0.5rem;\n            padding-top: 0.5rem;\n            border-top: 1px solid #f1f5f9;\n        }\n\n        \/* Modal Generell *\/\n        .modal-overlay {\n            position: fixed;\n            top: 0; left: 0; right: 0; bottom: 0;\n            background: rgba(0,0,0,0.5);\n            display: none;\n            justify-content: center;\n            align-items: center;\n            z-index: 100;\n        }\n\n        .modal-overlay.active { display: flex; }\n\n        .modal {\n            background: white;\n            border-radius: 12px;\n            width: 90%;\n            max-width: 600px;\n            max-height: 90vh;\n            overflow-y: auto;\n            box-shadow: 0 10px 25px rgba(0,0,0,0.2);\n            display: flex;\n            flex-direction: column;\n        }\n\n        .modal-header {\n            padding: 1.5rem;\n            border-bottom: 1px solid #e2e8f0;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n        .modal-body {\n            padding: 1.5rem;\n            display: flex;\n            flex-direction: column;\n            gap: 1rem;\n        }\n\n        .modal-footer {\n            padding: 1rem 1.5rem;\n            border-top: 1px solid #e2e8f0;\n            display: flex;\n            justify-content: flex-end;\n            gap: 1rem;\n            background: #f8fafc;\n            border-radius: 0 0 12px 12px;\n        }\n\n        .form-group {\n            display: flex;\n            flex-direction: column;\n            gap: 0.5rem;\n        }\n\n        .form-row {\n            display: flex;\n            gap: 1rem;\n        }\n        .form-row > * { flex: 1; }\n\n        label { font-weight: 600; font-size: 0.9rem; }\n        input[type=\"text\"], input[type=\"date\"], select {\n            padding: 0.75rem;\n            border: 1px solid #cbd5e1;\n            border-radius: 6px;\n            font-family: inherit;\n        }\n\n        \/* Rich Text Editor *\/\n        .editor-toolbar {\n            display: flex;\n            gap: 5px;\n            padding: 5px;\n            background: #f1f5f9;\n            border: 1px solid #cbd5e1;\n            border-bottom: none;\n            border-radius: 6px 6px 0 0;\n        }\n        .editor-btn {\n            background: white;\n            border: 1px solid #cbd5e1;\n            padding: 4px 8px;\n            border-radius: 4px;\n            cursor: pointer;\n            font-weight: bold;\n        }\n        .editor-btn:hover { background: #e2e8f0; }\n        .rich-editor {\n            border: 1px solid #cbd5e1;\n            border-radius: 0 0 6px 6px;\n            min-height: 100px;\n            padding: 0.75rem;\n            outline: none;\n        }\n        .rich-editor:focus { border-color: var(--primary-color); }\n\n        \/* Checklist Editor *\/\n        .checklist-items { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 0.5rem; }\n        .checklist-item { display: flex; align-items: center; gap: 0.5rem; }\n        .checklist-item input[type=\"text\"] { flex: 1; padding: 0.5rem; }\n        .remove-cl-btn { background: none; border: none; color: var(--status-red); cursor: pointer; font-weight: bold; font-size: 1.2rem;}\n\n        \/* Connection Status *\/\n        .connection-status {\n            font-size: 0.8rem;\n            display: flex;\n            align-items: center;\n            gap: 5px;\n            margin-right: 15px;\n        }\n        .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--status-yellow); }\n        .status-dot.online { background-color: var(--status-green); box-shadow: 0 0 5px var(--status-green); }\n        .status-dot.offline { background-color: var(--status-red); box-shadow: 0 0 5px var(--status-red); }\n\n        \/* Mobile specific adjustments *\/\n        @media (max-width: 768px) {\n            .board { padding: 1rem; }\n            .column { min-width: 280px; width: 280px; }\n            .form-row { flex-direction: column; }\n            .connection-status span { display: none; }\n        }\n    <\/style>\n<\/head>\n<body>\n\n    <header>\n        <h1>\ud83d\ude91 Reservefahrzeuge<\/h1>\n        <div style=\"display: flex; align-items: center; gap: 10px;\">\n            <div class=\"connection-status\" id=\"connStatus\" title=\"Verbindungsstatus\">\n                <div class=\"status-dot\" id=\"connDot\"><\/div>\n                <span id=\"connText\">Verbinde&#8230;<\/span>\n            <\/div>\n            <button class=\"btn\" onclick=\"openStationModal()\">+ Wache<\/button>\n            <button class=\"btn\" onclick=\"openModal()\">+ Fahrzeug<\/button>\n        <\/div>\n    <\/header>\n\n    <div class=\"board\" id=\"board\">\n        <!-- Spalten werden hier dynamisch gerendert -->\n    <\/div>\n\n    <!-- Edit\/Create Vehicle Modal -->\n    <div class=\"modal-overlay\" id=\"modalOverlay\">\n        <div class=\"modal\">\n            <div class=\"modal-header\">\n                <h2 id=\"modalTitle\">Fahrzeug bearbeiten<\/h2>\n                <button class=\"btn\" onclick=\"closeModal()\" style=\"padding: 0.2rem 0.5rem;\">\u2715<\/button>\n            <\/div>\n            <div class=\"modal-body\">\n                <input type=\"hidden\" id=\"vehicleId\">\n                \n                <div class=\"form-group\">\n                    <label>Fahrzeug Kennung \/ Name<\/label>\n                    <input type=\"text\" id=\"vehicleName\" placeholder=\"z.B. RTW 1\/83-1 (Reserve)\">\n                <\/div>\n\n                <div class=\"form-row\">\n                    <div class=\"form-group\">\n                        <label>Einsatzstatus (Ampel)<\/label>\n                        <select id=\"vehicleStatus\">\n                            <option value=\"green\">Einsatzbereit (Gr\u00fcn)<\/option>\n                            <option value=\"yellow\">Bedingt einsatzbereit (Gelb)<\/option>\n                            <option value=\"red\">Nicht einsatzbereit (Rot)<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"form-group\">\n                        <label>Aktueller Standort (Verschieben)<\/label>\n                        <select id=\"vehicleStation\">\n                            <!-- Wird dynamisch gef\u00fcllt -->\n                        <\/select>\n                    <\/div>\n                <\/div>\n\n                <div class=\"form-row\">\n                    <div class=\"form-group\">\n                        <label>Verantwortliche Person<\/label>\n                        <input type=\"text\" id=\"vehiclePerson\" placeholder=\"Max Mustermann\">\n                    <\/div>\n                    <div class=\"form-group\">\n                        <label>Datum \/ Frist<\/label>\n                        <input type=\"date\" id=\"vehicleDate\">\n                    <\/div>\n                <\/div>\n\n                <div class=\"form-group\">\n                    <label>Tags (kommagetrennt)<\/label>\n                    <input type=\"text\" id=\"vehicleTags\" placeholder=\"T\u00dcV f\u00e4llig, Desinfiziert, Werkstatt\">\n                <\/div>\n\n                <div class=\"form-group\">\n                    <label>Notizen \/ \u00dcbergabeprotokoll<\/label>\n                    <div>\n                        <div class=\"editor-toolbar\">\n                            <button class=\"editor-btn\" type=\"button\" onclick=\"formatText('bold')\" title=\"Fett\">B<\/button>\n                            <button class=\"editor-btn\" type=\"button\" onclick=\"formatText('italic')\" title=\"Kursiv\">I<\/button>\n                            <button class=\"editor-btn\" type=\"button\" onclick=\"formatText('underline')\" title=\"Unterstrichen\">U<\/button>\n                            <button class=\"editor-btn\" type=\"button\" onclick=\"formatText('insertUnorderedList')\" title=\"Liste\">\u2022 Liste<\/button>\n                        <\/div>\n                        <div id=\"vehicleNotes\" class=\"rich-editor\" contenteditable=\"true\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"form-group\">\n                    <label>Checkliste<\/label>\n                    <div id=\"checklistContainer\" class=\"checklist-items\">\n                        <!-- Checklisten-Items dynamisch -->\n                    <\/div>\n                    <button class=\"btn\" onclick=\"addChecklistItem()\" style=\"align-self: flex-start; font-size: 0.8rem; padding: 0.4rem 0.8rem;\">+ Item hinzuf\u00fcgen<\/button>\n                <\/div>\n\n            <\/div>\n            <div class=\"modal-footer\" style=\"justify-content: space-between;\">\n                <button class=\"btn btn-danger\" id=\"btnDeleteVehicle\" onclick=\"promptDeleteVehicle()\">L\u00f6schen<\/button>\n                <div style=\"display: flex; gap: 10px;\">\n                    <button class=\"btn\" onclick=\"closeModal()\">Abbrechen<\/button>\n                    <button class=\"btn btn-primary\" onclick=\"saveVehicle()\">Speichern<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Create Station Modal -->\n    <div class=\"modal-overlay\" id=\"stationModalOverlay\" style=\"z-index: 150;\">\n        <div class=\"modal\" style=\"max-width: 400px;\">\n            <div class=\"modal-header\">\n                <h2>Neue Wache anlegen<\/h2>\n                <button class=\"btn\" onclick=\"closeStationModal()\" style=\"padding: 0.2rem 0.5rem;\">\u2715<\/button>\n            <\/div>\n            <div class=\"modal-body\">\n                <div class=\"form-group\">\n                    <label>Name der Wache \/ Werkstatt<\/label>\n                    <input type=\"text\" id=\"newStationName\" placeholder=\"z.B. Rettungswache S\u00fcd\">\n                <\/div>\n            <\/div>\n            <div class=\"modal-footer\">\n                <button class=\"btn\" onclick=\"closeStationModal()\">Abbrechen<\/button>\n                <button class=\"btn btn-primary\" onclick=\"saveNewStation()\">Speichern<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Custom Alert\/Confirm Dialog Modal -->\n    <div class=\"modal-overlay\" id=\"dialogOverlay\" style=\"z-index: 200;\">\n        <div class=\"modal\" style=\"max-width: 400px;\">\n            <div class=\"modal-header\">\n                <h2 id=\"dialogTitle\">Hinweis<\/h2>\n            <\/div>\n            <div class=\"modal-body\">\n                <p id=\"dialogMessage\"><\/p>\n            <\/div>\n            <div class=\"modal-footer\" id=\"dialogFooter\">\n                <!-- Buttons dynamically injected here -->\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script type=\"module\">\n        \/\/ --- 1. FIREBASE KONFIGURATION ---\n        \/\/ Wenn du die Datei auf deinem eigenen PC\/Server f\u00fcr mehrere Personen nutzbar\n        \/\/ machen willst, erstelle ein Projekt auf firebase.google.com und ersetze \n        \/\/ die leeren Strings mit deinen Schl\u00fcsseln.\n        const myOwnFirebaseConfig = {\n            apiKey: \"AIzaSyC740GFtauRUF3kwc8yy1JDbRS2IxYUMT0\",\n            authDomain: \"reservefahrzeuge.firebaseapp.com\",\n            projectId: \"reservefahrzeuge\",\n            storageBucket: \"reservefahrzeuge.firebasestorage.app\",\n            messagingSenderId: \"561256534062\",\n            appId: \"1:561256534062:web:71b745686a55448f200fbf\",\n            measurementId: \"G-XHSNBYL748\"\n        };\n\n        \/\/ --- Logik zur Bestimmung des Speichermodus (Cloud oder Lokal) ---\n        let useCloudSync = false;\n        let finalFirebaseConfig = null;\n        let currentAppId = 'rettungsdienst-app-v1';\n        let customAuthToken = null;\n\n        if (myOwnFirebaseConfig.apiKey !== \"\") {\n            \/\/ Eigene Konfiguration wurde eingetragen\n            useCloudSync = true;\n            finalFirebaseConfig = myOwnFirebaseConfig;\n        } else if (typeof __firebase_config !== 'undefined') {\n            \/\/ Wird im Editor\/Canvas Vorschaufenster ausgef\u00fchrt\n            useCloudSync = true;\n            finalFirebaseConfig = JSON.parse(__firebase_config);\n            currentAppId = typeof __app_id !== 'undefined' ? __app_id : currentAppId;\n            customAuthToken = typeof __initial_auth_token !== 'undefined' ? __initial_auth_token : null;\n        } else {\n            \/\/ Offline\/Lokal-Modus (Datei wurde einfach auf dem PC ge\u00f6ffnet)\n            useCloudSync = false;\n        }\n\n        let db = null;\n        let auth = null;\n        let currentUser = null;\n        let unsubscribeSnapshot = null;\n        \n        \/\/ Initialer Standard-Datenbestand\n        let data = {\n            stations: [\n                { id: 'station-1', name: 'Rettungswache Mitte' },\n                { id: 'station-2', name: 'Rettungswache Nord' },\n                { id: 'station-3', name: 'Werkstatt' }\n            ],\n            vehicles: [\n                {\n                    id: 'veh-1', stationId: 'station-1', name: 'RTW 1\/83-2 (Ersatz)', status: 'green',\n                    person: 'Schmid, A.', date: '2026-03-04', tags: ['Gereinigt', 'Vollgetankt'],\n                    notes: '<b>Bereit f\u00fcr \u00dcbernahme.<\/b><br>Alle Ger\u00e4te gepr\u00fcft.',\n                    checklist: [{ text: 'EKG gecheckt', done: true }, { text: 'Medikamente gepr\u00fcft', done: true }]\n                }\n            ]\n        };\n\n        \/\/ --- UI Hilfsfunktionen ---\n        function setConnectionStatus(status) {\n            const dot = document.getElementById('connDot');\n            const span = document.getElementById('connText');\n            dot.className = 'status-dot'; \n            \n            if (status === 'online') {\n                dot.classList.add('online');\n                span.innerText = 'Live synchronisiert';\n            } else if (status === 'local') {\n                dot.classList.add('yellow'); \/\/ Gelb f\u00fcr lokal\n                span.innerText = 'Lokaler Modus (Offline)';\n            } else if (status === 'offline') {\n                dot.classList.add('offline');\n                span.innerText = 'Fehler bei Verbindung';\n            } else {\n                span.innerText = 'Verbinde...';\n            }\n        }\n\n        \/\/ --- Startpunkt der Anwendung ---\n        async function initApp() {\n            setConnectionStatus('connecting');\n\n            if (!useCloudSync) {\n                \/\/ LOKALER MODUS (Ohne Firebase)\n                const savedData = localStorage.getItem('rettungsdienst-lokal-data');\n                if (savedData) {\n                    data = JSON.parse(savedData);\n                }\n                renderBoard();\n                setConnectionStatus('local');\n                return; \/\/ Skript hier abbrechen, kein Firebase laden\n            }\n\n            \/\/ CLOUD MODUS (Mit Firebase)\n            try {\n                \/\/ Firebase Module dynamisch laden (so st\u00fcrzt das Skript im Offline-Modus nicht ab)\n                const { initializeApp } = await import('https:\/\/www.gstatic.com\/firebasejs\/11.6.1\/firebase-app.js');\n                const { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } = await import('https:\/\/www.gstatic.com\/firebasejs\/11.6.1\/firebase-auth.js');\n                const { getFirestore, doc, onSnapshot, setDoc, collection } = await import('https:\/\/www.gstatic.com\/firebasejs\/11.6.1\/firebase-firestore.js');\n\n                const app = initializeApp(finalFirebaseConfig);\n                auth = getAuth(app);\n                db = getFirestore(app);\n\n                \/\/ Authentifizierung\n                if (customAuthToken) {\n                    await signInWithCustomToken(auth, customAuthToken);\n                } else {\n                    await signInAnonymously(auth);\n                }\n                \n                currentUser = auth.currentUser;\n                if (!currentUser) throw new Error(\"Kein Benutzer angemeldet.\");\n\n                \/\/ Pfad zur Datenbank: Unterst\u00fctzt das strenge Format des Canvas oder einen regul\u00e4ren Pfad f\u00fcr eigene Projekte\n                let boardDocRef;\n                if (typeof __firebase_config !== 'undefined') {\n                    boardDocRef = doc(db, 'artifacts', currentAppId, 'public', 'data', 'boardState', 'main');\n                } else {\n                    boardDocRef = doc(db, 'boardState', 'main');\n                }\n                \n                \/\/ Echtzeit-Verbindung aufbauen\n                unsubscribeSnapshot = onSnapshot(boardDocRef, \n                    (docSnap) => {\n                        setConnectionStatus('online');\n                        if (docSnap.exists()) {\n                            data = docSnap.data();\n                            renderBoard();\n                        } else {\n                            \/\/ Wenn Datenbank noch komplett leer ist, Startdaten speichern\n                            saveDataCloud(boardDocRef, setDoc);\n                            renderBoard();\n                        }\n                    }, \n                    (error) => {\n                        console.error(\"Firestore Sync Error:\", error);\n                        setConnectionStatus('offline');\n                        showDialog(\"Netzwerkfehler\", \"Verbindung zur Cloud unterbrochen.\", false);\n                    }\n                );\n\n            } catch (error) {\n                console.error(\"Init Error:\", error);\n                setConnectionStatus('offline');\n                showDialog(\"Datenbank-Fehler\", \"Cloud-Verbindung fehlgeschlagen. \u00dcberpr\u00fcfe die Firebase Konfiguration.\", false);\n            }\n        }\n\n        \/\/ App Initialisieren\n        initApp();\n\n\n        \/\/ --- Datenspeicherung (Weiche) ---\n        async function saveData() {\n            if (useCloudSync && db && currentUser) {\n                \/\/ Cloud Sync\n                try {\n                    const { doc, setDoc } = await import('https:\/\/www.gstatic.com\/firebasejs\/11.6.1\/firebase-firestore.js');\n                    let boardDocRef;\n                    if (typeof __firebase_config !== 'undefined') {\n                        boardDocRef = doc(db, 'artifacts', currentAppId, 'public', 'data', 'boardState', 'main');\n                    } else {\n                        boardDocRef = doc(db, 'boardState', 'main');\n                    }\n                    await setDoc(boardDocRef, data);\n                } catch(e) {\n                    console.error(\"Speichern fehlgeschlagen\", e);\n                }\n            } else {\n                \/\/ Lokaler Speicher\n                localStorage.setItem('rettungsdienst-lokal-data', JSON.stringify(data));\n            }\n        }\n\n        \/\/ Hilfsfunktion f\u00fcr Init\n        async function saveDataCloud(ref, setDocFn) {\n            try { await setDocFn(ref, data); } catch (e) { console.error(e); }\n        }\n\n        \/\/ --- Custom Dialog System ---\n        function showDialog(title, message, isConfirm, onConfirmCallback) {\n            document.getElementById('dialogTitle').innerText = title;\n            document.getElementById('dialogMessage').innerText = message;\n            const footer = document.getElementById('dialogFooter');\n            footer.innerHTML = '';\n\n            if (isConfirm) {\n                const btnCancel = document.createElement('button');\n                btnCancel.className = 'btn';\n                btnCancel.innerText = 'Abbrechen';\n                btnCancel.onclick = closeDialog;\n                \n                const btnOk = document.createElement('button');\n                btnOk.className = 'btn btn-primary';\n                btnOk.innerText = 'OK';\n                btnOk.onclick = () => { closeDialog(); if(onConfirmCallback) onConfirmCallback(); };\n                \n                footer.appendChild(btnCancel);\n                footer.appendChild(btnOk);\n            } else {\n                const btnOk = document.createElement('button');\n                btnOk.className = 'btn btn-primary';\n                btnOk.innerText = 'OK';\n                btnOk.onclick = closeDialog;\n                footer.appendChild(btnOk);\n            }\n            document.getElementById('dialogOverlay').classList.add('active');\n        }\n\n        function closeDialog() {\n            document.getElementById('dialogOverlay').classList.remove('active');\n        }\n\n        \/\/ --- Rendering ---\n        const board = document.getElementById('board');\n\n        function renderBoard() {\n            board.innerHTML = '';\n            \n            if(!data.stations) data.stations = [];\n            if(!data.vehicles) data.vehicles = [];\n\n            data.stations.forEach(station => {\n                const col = document.createElement('div');\n                col.className = 'column';\n                col.dataset.id = station.id;\n                \n                col.addEventListener('dragover', handleDragOver);\n                col.addEventListener('drop', handleDrop);\n\n                const header = document.createElement('div');\n                header.className = 'column-header';\n                header.innerHTML = `\n                    <span>${station.name}<\/span>\n                    <button class=\"btn\" style=\"padding: 2px 6px; font-size: 0.8rem;\" onclick=\"promptDeleteStation('${station.id}')\" title=\"Wache l\u00f6schen\">\ud83d\uddd1\ufe0f<\/button>\n                `;\n\n                const body = document.createElement('div');\n                body.className = 'column-body';\n\n                const stationVehicles = data.vehicles.filter(v => v.stationId === station.id);\n                \n                stationVehicles.forEach(veh => {\n                    const card = createCard(veh);\n                    body.appendChild(card);\n                });\n\n                col.appendChild(header);\n                col.appendChild(body);\n                board.appendChild(col);\n            });\n        }\n\n        function createCard(vehicle) {\n            const card = document.createElement('div');\n            card.className = 'card';\n            card.draggable = true;\n            card.dataset.id = vehicle.id;\n            \n            if(vehicle.status === 'green') card.style.borderLeftColor = 'var(--status-green)';\n            if(vehicle.status === 'yellow') card.style.borderLeftColor = 'var(--status-yellow)';\n            if(vehicle.status === 'red') card.style.borderLeftColor = 'var(--status-red)';\n\n            card.addEventListener('dragstart', handleDragStart);\n            card.addEventListener('dragend', handleDragEnd);\n            \n            card.addEventListener('click', (e) => {\n                if(e.target.tagName !== 'BUTTON' && e.target.tagName !== 'INPUT') {\n                    openModal(vehicle.id);\n                }\n            });\n\n            let tagsHtml = '';\n            if (vehicle.tags && vehicle.tags.length > 0) {\n                tagsHtml = `<div class=\"card-tags\">` + \n                    vehicle.tags.map(t => `<span class=\"tag\">${t}<\/span>`).join('') + \n                    `<\/div>`;\n            }\n\n            let checklistHtml = '';\n            if (vehicle.checklist && vehicle.checklist.length > 0) {\n                const doneCount = vehicle.checklist.filter(c => c.done).length;\n                checklistHtml = `\n                    <div class=\"checklist-progress\">\n                        \u2611 Checkliste: ${doneCount} \/ ${vehicle.checklist.length}\n                    <\/div>\n                `;\n            }\n\n            let dateStr = vehicle.date ? new Date(vehicle.date).toLocaleDateString('de-DE') : 'Kein Datum';\n\n            card.innerHTML = `\n                <div class=\"card-header\">\n                    <div class=\"card-title\">${vehicle.name}<\/div>\n                    <div class=\"traffic-light\">\n                        <div class=\"light green ${vehicle.status === 'green' ? 'active' : ''}\"><\/div>\n                        <div class=\"light yellow ${vehicle.status === 'yellow' ? 'active' : ''}\"><\/div>\n                        <div class=\"light red ${vehicle.status === 'red' ? 'active' : ''}\"><\/div>\n                    <\/div>\n                <\/div>\n                ${tagsHtml}\n                <div class=\"card-meta\">\n                    <span>\ud83d\udc64 ${vehicle.person || '-'}<\/span>\n                    <span>\ud83d\udcc5 ${dateStr}<\/span>\n                <\/div>\n                ${checklistHtml}\n            `;\n\n            return card;\n        }\n\n        \/\/ --- Drag & Drop Logik ---\n        let draggedCardId = null;\n\n        function handleDragStart(e) {\n            draggedCardId = this.dataset.id;\n            this.classList.add('dragging');\n            e.dataTransfer.effectAllowed = 'move';\n            e.dataTransfer.setData('text\/plain', this.dataset.id);\n        }\n\n        function handleDragEnd(e) {\n            this.classList.remove('dragging');\n            draggedCardId = null;\n        }\n\n        function handleDragOver(e) {\n            e.preventDefault();\n            e.dataTransfer.dropEffect = 'move';\n        }\n\n        function handleDrop(e) {\n            e.preventDefault();\n            const stationId = this.dataset.id;\n            const cardId = e.dataTransfer.getData('text\/plain') || draggedCardId;\n            \n            if (cardId && stationId) {\n                const vehicle = data.vehicles.find(v => v.id === cardId);\n                if (vehicle && vehicle.stationId !== stationId) {\n                    vehicle.stationId = stationId;\n                    saveData();\n                    if(!useCloudSync) renderBoard(); \/\/ Lade Board neu bei lokaler Speicherung\n                }\n            }\n        }\n\n        \/\/ --- Modals: Vehicle ---\n        const modalOverlay = document.getElementById('modalOverlay');\n\n        function openModal(vehicleId = null) {\n            populateStationDropdown();\n            \n            if (vehicleId) {\n                const vehicle = data.vehicles.find(v => v.id === vehicleId);\n                document.getElementById('modalTitle').innerText = 'Fahrzeug bearbeiten';\n                document.getElementById('vehicleId').value = vehicle.id;\n                document.getElementById('vehicleName').value = vehicle.name;\n                document.getElementById('vehicleStatus').value = vehicle.status;\n                document.getElementById('vehicleStation').value = vehicle.stationId;\n                document.getElementById('vehiclePerson').value = vehicle.person || '';\n                document.getElementById('vehicleDate').value = vehicle.date || '';\n                document.getElementById('vehicleTags').value = (vehicle.tags || []).join(', ');\n                document.getElementById('vehicleNotes').innerHTML = vehicle.notes || '';\n                \n                renderChecklistEditor(vehicle.checklist || []);\n                document.getElementById('btnDeleteVehicle').style.display = 'block';\n            } else {\n                document.getElementById('modalTitle').innerText = 'Neues Fahrzeug anlegen';\n                document.getElementById('vehicleId').value = '';\n                document.getElementById('vehicleName').value = '';\n                document.getElementById('vehicleStatus').value = 'green';\n                \n                if(data.stations && data.stations.length > 0) {\n                    document.getElementById('vehicleStation').value = data.stations[0].id;\n                }\n                \n                document.getElementById('vehiclePerson').value = '';\n                document.getElementById('vehicleDate').value = new Date().toISOString().split('T')[0];\n                document.getElementById('vehicleTags').value = '';\n                document.getElementById('vehicleNotes').innerHTML = '';\n                \n                renderChecklistEditor([]);\n                document.getElementById('btnDeleteVehicle').style.display = 'none';\n            }\n\n            modalOverlay.classList.add('active');\n        }\n\n        function closeModal() {\n            modalOverlay.classList.remove('active');\n        }\n\n        function populateStationDropdown() {\n            const select = document.getElementById('vehicleStation');\n            select.innerHTML = '';\n            (data.stations || []).forEach(st => {\n                const opt = document.createElement('option');\n                opt.value = st.id;\n                opt.textContent = st.name;\n                select.appendChild(opt);\n            });\n        }\n\n        function saveVehicle() {\n            const id = document.getElementById('vehicleId').value;\n            const name = document.getElementById('vehicleName').value.trim();\n            if (!name) {\n                showDialog(\"Fehlende Angabe\", \"Bitte einen Namen f\u00fcr das Fahrzeug eingeben.\", false);\n                return;\n            }\n\n            const tagsInput = document.getElementById('vehicleTags').value;\n            const tags = tagsInput.split(',').map(t => t.trim()).filter(t => t.length > 0);\n\n            const checklist = [];\n            document.querySelectorAll('.checklist-item').forEach(item => {\n                const text = item.querySelector('input[type=\"text\"]').value.trim();\n                const done = item.querySelector('input[type=\"checkbox\"]').checked;\n                if (text) checklist.push({ text, done });\n            });\n\n            const vehicleData = {\n                name: name,\n                status: document.getElementById('vehicleStatus').value,\n                stationId: document.getElementById('vehicleStation').value,\n                person: document.getElementById('vehiclePerson').value,\n                date: document.getElementById('vehicleDate').value,\n                tags: tags,\n                notes: document.getElementById('vehicleNotes').innerHTML,\n                checklist: checklist\n            };\n\n            if (id) {\n                const index = data.vehicles.findIndex(v => v.id === id);\n                if (index > -1) {\n                    data.vehicles[index] = { ...data.vehicles[index], ...vehicleData };\n                }\n            } else {\n                vehicleData.id = 'veh-' + Date.now();\n                data.vehicles.push(vehicleData);\n            }\n\n            saveData();\n            if(!useCloudSync) renderBoard();\n            closeModal();\n        }\n\n        function promptDeleteVehicle() {\n            showDialog(\"L\u00f6schen\", \"M\u00f6chten Sie dieses Fahrzeug wirklich l\u00f6schen?\", true, () => {\n                const id = document.getElementById('vehicleId').value;\n                if (id) {\n                    data.vehicles = data.vehicles.filter(v => v.id !== id);\n                    saveData();\n                    if(!useCloudSync) renderBoard();\n                    closeModal();\n                }\n            });\n        }\n\n        \/\/ --- Modals: Station ---\n        const stationModalOverlay = document.getElementById('stationModalOverlay');\n\n        function openStationModal() {\n            document.getElementById('newStationName').value = '';\n            stationModalOverlay.classList.add('active');\n            document.getElementById('newStationName').focus();\n        }\n\n        function closeStationModal() {\n            stationModalOverlay.classList.remove('active');\n        }\n\n        function saveNewStation() {\n            const name = document.getElementById('newStationName').value.trim();\n            if (name) {\n                const newStation = {\n                    id: 'station-' + Date.now(),\n                    name: name\n                };\n                data.stations.push(newStation);\n                saveData();\n                if(!useCloudSync) renderBoard();\n                closeStationModal();\n            } else {\n                showDialog(\"Fehlende Angabe\", \"Bitte einen Namen f\u00fcr die Wache eingeben.\", false);\n            }\n        }\n\n        function promptDeleteStation(id) {\n            const hasVehicles = data.vehicles.some(v => v.stationId === id);\n            if (hasVehicles) {\n                showDialog(\"Aktion nicht m\u00f6glich\", \"Diese Wache kann nicht gel\u00f6scht werden, da ihr noch Fahrzeuge zugewiesen sind. Bitte verschieben Sie die Fahrzeuge zuerst.\", false);\n                return;\n            }\n\n            showDialog(\"Wache l\u00f6schen\", \"M\u00f6chten Sie diesen Standort wirklich dauerhaft l\u00f6schen?\", true, () => {\n                data.stations = data.stations.filter(s => s.id !== id);\n                saveData();\n                if(!useCloudSync) renderBoard();\n            });\n        }\n\n        \/\/ --- Checkliste Logik ---\n        const checklistContainer = document.getElementById('checklistContainer');\n\n        function renderChecklistEditor(items) {\n            checklistContainer.innerHTML = '';\n            items.forEach(item => addChecklistItemToDOM(item.text, item.done));\n        }\n\n        function addChecklistItem() {\n            addChecklistItemToDOM('', false);\n        }\n\n        function addChecklistItemToDOM(text, done) {\n            const div = document.createElement('div');\n            div.className = 'checklist-item';\n            div.innerHTML = `\n                <input type=\"checkbox\" ${done ? 'checked' : ''}>\n                <input type=\"text\" value=\"${text}\" placeholder=\"Aufgabe \/ Pr\u00fcfpunkt\">\n                <button type=\"button\" class=\"remove-cl-btn\" onclick=\"this.parentElement.remove()\">\u2715<\/button>\n            `;\n            checklistContainer.appendChild(div);\n        }\n\n        \/\/ --- Rich Text Editor Logik ---\n        function formatText(command) {\n            document.execCommand(command, false, null);\n            document.getElementById('vehicleNotes').focus();\n        }\n\n        \/\/ Klick au\u00dferhalb der Modals schlie\u00dft diese\n        modalOverlay.addEventListener('click', (e) => { if (e.target === modalOverlay) closeModal(); });\n        stationModalOverlay.addEventListener('click', (e) => { if (e.target === stationModalOverlay) closeStationModal(); });\n\n        \/\/ --- Globale Zuordnung f\u00fcr HTML Inline-Events ---\n        window.openModal = openModal;\n        window.closeModal = closeModal;\n        window.saveVehicle = saveVehicle;\n        window.promptDeleteVehicle = promptDeleteVehicle;\n        \n        window.openStationModal = openStationModal;\n        window.closeStationModal = closeStationModal;\n        window.saveNewStation = saveNewStation;\n        window.promptDeleteStation = promptDeleteStation;\n\n        window.addChecklistItem = addChecklistItem;\n        window.formatText = formatText;\n        window.closeDialog = closeDialog;\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reservefahrzeug-Management im Rettungsdienst \ud83d\ude91 Reservefahrzeuge Verbinde&#8230; + Wache + Fahrzeug Fahrzeug bearbeiten \u2715 Fahrzeug Kennung \/ Name Einsatzstatus (Ampel) Einsatzbereit (Gr\u00fcn)Bedingt einsatzbereit (Gelb)Nicht einsatzbereit (Rot) Aktueller Standort (Verschieben) Verantwortliche Person Datum \/ Frist Tags (kommagetrennt) Notizen \/ \u00dcbergabeprotokoll B I U \u2022 Liste Checkliste + Item hinzuf\u00fcgen L\u00f6schen Abbrechen Speichern Neue Wache anlegen \u2715 Name [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-237","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/pages\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":6,"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/pages\/237\/revisions"}],"predecessor-version":[{"id":243,"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/pages\/237\/revisions\/243"}],"wp:attachment":[{"href":"https:\/\/rettungstormarn.wenk-hh.de\/index.php\/wp-json\/wp\/v2\/media?parent=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}