From b630956b9e09bb9226b621c83680618bc4a40e25 Mon Sep 17 00:00:00 2001 From: "daniel.reimann" Date: Wed, 28 Oct 2026 09:02:48 +0100 Subject: [PATCH] Upload files to "assets/js" --- assets/js/app.js | 1027 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1027 insertions(+) create mode 100644 assets/js/app.js diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100644 index 0000000..4496a1e --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,1027 @@ +(function(){ + "use strict"; + + /* ===================== BILDER (echte Fotos von feuerwehr-melle.de) ===================== */ + const PIC = { + grund: {card:"assets/img/grundausbildung.jpg", thumb:"assets/img/grundausbildung-thumb.jpg", hero:"assets/img/grundausbildung.jpg"}, + ehrung: {card:"assets/img/verbandstag25.jpg", thumb:"assets/img/verbandstag25-thumb.jpg"}, + versammlung:{card:"assets/img/verbandstag26.jpg", thumb:"assets/img/verbandstag26-thumb.jpg"}, + atemschutz: {card:"assets/img/atemschutz.jpg", thumb:"assets/img/atemschutz-thumb.jpg", hero:"assets/img/atemschutz.jpg"}, + gefahrgut: {card:"assets/img/gefahrgut.jpg", thumb:"assets/img/gefahrgut-thumb.jpg", hero:"assets/img/gefahrgut.jpg"}, + lehrgang: {card:"assets/img/ausbildung-celle.jpg",thumb:"assets/img/ausbildung-celle-thumb.jpg"}, + kinder: {card:"assets/img/jugendflamme.jpg", thumb:"assets/img/jugendflamme-thumb.jpg"}, + jugend: {card:"assets/img/leistungsspange.jpg", thumb:"assets/img/leistungsspange-thumb.jpg"}, + fahrzeug: {card:"assets/img/gruppenbild.jpg", thumb:"assets/img/gruppenbild-thumb.jpg", hero:"assets/img/gruppenbild.jpg"}, + auszeichnung:{card:"assets/img/altenmelle.jpg", thumb:"assets/img/altenmelle-thumb.jpg"}, + fuehrung: {card:"assets/img/riemsloh.jpg", thumb:"assets/img/riemsloh-thumb.jpg"}, + foerder: {card:"assets/img/pavillon.jpg", thumb:"assets/img/pavillon-thumb.jpg"}, + partner: {card:"assets/img/partner.jpg", thumb:"assets/img/partner-thumb.jpg"}, + technik: {card:"assets/img/defi.jpg", thumb:"assets/img/defi-thumb.jpg"}, + verein: {card:"assets/img/entenrennen.jpg", thumb:"assets/img/entenrennen-thumb.jpg"}, + /* Originalbanner der Ortsfeuerwehr Bakum von feuerwehr-melle.de */ + bakum: {card:"assets/img/bakum-banner.jpg", thumb:"assets/img/bakum-banner-thumb.jpg", hero:"assets/img/bakum-banner.jpg"}, + fztsfw: {card:"assets/img/fz-tsfw.jpg", thumb:"assets/img/fz-tsfw-thumb.jpg"}, + fzelw: {card:"assets/img/fz-elw.jpg", thumb:"assets/img/fz-elw-thumb.jpg"}, + fzfwa: {card:"assets/img/fz-fwa.jpg", thumb:"assets/img/fz-fwa-thumb.jpg"} + }; + function src(key, size){ + const p = PIC[key] || PIC.grund; + return p[size] || p.card; + } + function shot(key, size, cls, style){ + return '
'; + } + + /* ===================== ICONS ===================== */ + const I = { + siren:'', + doc:'', + + /* Gefuellte Varianten fuer die Sektions-Ueberschriften (wie Vorlage) */ + sirenF:'', + star:'', + docF:'', + calF:'', + cal:'', + calSmall:'', + pin:'', + pinFill:'', + map:'', + chevR:'', + chevL:'', + chevD:'', + arrowR:'', + home:'', + flame:'', + news:'', + users:'', + helmet:'', + heart:'', + file:'', + phone:'', + mail:'', + search:'', + clock:'', + cam:'', + info:'', + check:'' + }; + + const MAP_BG = ''; + + /* ===================== DEMO-DATEN ===================== */ + const EINSAETZE = [ + {id:'e1', time:'02:51', date:'16.09.2026', type:'Brandeinsatz', title:'Auslösung Brandmeldeanlage', + ort:'Westlandstraße, Westerhausen', zust:'Ortsfeuerwehr Oldendorf', alarm:'Funkmeldeempfänger', pic:'atemschutz', + einheiten:[{name:'OrtsFw Oldendorf'}, {name:'WerkFw Westland/Assmann'}], + bilder:['atemschutz','fahrzeug','bakum']}, + {id:'e2', time:'22:58', date:'15.09.2026', type:'Technische Hilfeleistung', title:'Unterstützung Rettungsdienst', + ort:'Poggenort, Eicken-Bruche', zust:'Ortsfeuerwehr Bakum', alarm:'Funkmeldeempfänger', pic:'gefahrgut', + einheiten:[{name:'OrtsFw Bakum', fz:['ELW','TSF-W']}, {name:'DRK Rettungswache Melle', fz:['RTW']}], + bilder:['gefahrgut','fzelw','atemschutz','fztsfw']}, + {id:'e3', time:'21:56', date:'15.09.2026', type:'Brandeinsatz', title:'Auslösung Brandmeldeanlage', + ort:'Westlandstraße, Westerhausen', zust:'Ortsfeuerwehr Oldendorf', alarm:'Funkmeldeempfänger', pic:'atemschutz', + einheiten:[{name:'OrtsFw Oldendorf'}, {name:'WerkFw Westland/Assmann'}]}, + {id:'e4', time:'18:24', date:'14.09.2026', type:'Technische Hilfeleistung', title:'Baum auf Fahrbahn', + ort:'Bahnhofstraße, Buer', zust:'Ortsfeuerwehr Buer', alarm:'Funkmeldeempfänger', pic:'fahrzeug', + einheiten:[{name:'OrtsFw Buer', fz:['LF 10','MTW']}]}, + {id:'e5', time:'09:12', date:'13.09.2026', type:'Brandeinsatz', title:'Kleinbrand Mülltonne', + ort:'Grönenbergstraße, Melle-Mitte', zust:'Ortsfeuerwehr Melle-Mitte', alarm:'Funkmeldeempfänger', pic:'atemschutz', + einheiten:[{name:'OrtsFw Melle-Mitte', fz:['LF 20']}]}, + {id:'e6', time:'03:47', date:'12.09.2026', type:'Technische Hilfeleistung', title:'Türöffnung – Person in Notlage', + ort:'Ravensberger Straße, Gesmold', zust:'Ortsfeuerwehr Gesmold', alarm:'Funkmeldeempfänger', pic:'gefahrgut', + einheiten:[{name:'OrtsFw Gesmold', fz:['TSF-W']}, {name:'DRK Rettungswache Melle', fz:['RTW']}]}, + {id:'e7', time:'14:03', date:'10.09.2026', type:'Brandeinsatz', title:'Brandmeldeanlage ausgelöst', + ort:'Industriestraße, Neuenkirchen', zust:'Ortsfeuerwehr Neuenkirchen', alarm:'Funkmeldeempfänger', pic:'fahrzeug', + einheiten:[{name:'OrtsFw Neuenkirchen', fz:['LF 10']}]}, + {id:'e8', time:'20:15', date:'08.09.2026', type:'Technische Hilfeleistung', title:'Ölspur beseitigt', + ort:'Osnabrücker Straße, Wellingholzhausen', zust:'Ortsfeuerwehr Wellingholzhausen', alarm:'Funkmeldeempfänger', pic:'fahrzeug', + einheiten:[{name:'OrtsFw Wellingholzhausen', fz:['LF 16/12']}, {name:'OrtsFw Altenmelle', fz:['GW-L']}]}, + {id:'e9', time:'17:42', date:'06.09.2026', type:'Technische Hilfeleistung', title:'Tragehilfe für den Rettungsdienst', + ort:'Bakumer Straße, Bakum', zust:'Ortsfeuerwehr Bakum', alarm:'Funkmeldeempfänger', pic:'gefahrgut', + einheiten:[{name:'OrtsFw Bakum', fz:['TSF-W']}, {name:'DRK Rettungswache Melle', fz:['RTW']}]}, + {id:'e10', time:'11:20', date:'02.09.2026', type:'Brandeinsatz', title:'Rauchentwicklung in Gebäude', + ort:'Drantumer Weg, Drantum', zust:'Ortsfeuerwehr Bakum', alarm:'Sirene und Funkmeldeempfänger', pic:'atemschutz', + einheiten:[{name:'OrtsFw Bakum', fz:['TSF-W','ELW']}, {name:'OrtsFw Melle-Mitte', fz:['LF 20']}], + bilder:['atemschutz','fztsfw','bakum','fahrzeug']}, + {id:'e11', time:'06:15', date:'27.08.2026', type:'Technische Hilfeleistung', title:'Ölspur nach Verkehrsunfall', + ort:'Eicken-Bruche', zust:'Ortsfeuerwehr Bakum', alarm:'Funkmeldeempfänger', pic:'fzelw', + einheiten:[{name:'OrtsFw Bakum', fz:['TSF-W']}]} + ]; + + const NEWS = [ + {id:'n1', cat:'Ausbildung', pic:'ehrung', date:'16.09.2026', + title:'Ehrung und Abschluss der 60. Grundausbildung in Melle', + exc:'21 neue Einsatzkräfte haben ihre Grundausbildung erfolgreich abgeschlossen. Bei einer Feierstunde wurden sie für ihr Engagement ausgezeichnet.', + body:['21 neue Einsatzkräfte haben in Melle ihre Grundausbildung erfolgreich abgeschlossen und verstärken ab sofort die Einsatzabteilungen der Ortsfeuerwehren.', + 'Über mehrere Monate hinweg durchliefen die Teilnehmerinnen und Teilnehmer die theoretische und praktische Ausbildung — von Löscheinsatz und technischer Hilfeleistung bis zu Erster Hilfe und Gerätekunde.', + 'Bei einer Feierstunde wurden die Absolventinnen und Absolventen für ihr Engagement geehrt.']}, + {id:'n2', cat:'Auszeichnung', pic:'auszeichnung', date:'12.09.2026', + title:'Feuerwehr Melle ehrt langjährige Mitglieder', + exc:'Für langjährige, treue Dienstzeiten wurden mehrere Mitglieder der Ortsfeuerwehren ausgezeichnet.', + body:['Für ihre langjährige, treue Dienstzeit wurden mehrere Mitglieder der Ortsfeuerwehren im Rahmen einer Feierstunde ausgezeichnet.', + 'Die Ehrungen würdigen ehrenamtlichen Einsatz, der oft über Jahrzehnte hinweg geleistet wird — bei Einsätzen ebenso wie in Ausbildung, Jugendarbeit und Vereinsleben.']}, + {id:'n3', cat:'Ausbildung', pic:'gefahrgut', date:'09.09.2026', + title:'Realistische Einsatzübungen für die Einsatzkräfte', + exc:'In einer groß angelegten Übung trainierten mehrere Ortsfeuerwehren den Ernstfall unter realistischen Bedingungen.', + body:['In einer groß angelegten gemeinsamen Übung trainierten mehrere Ortsfeuerwehren den Ernstfall unter möglichst realistischen Bedingungen.', + 'Im Fokus standen Menschenrettung, Löschangriff und die Zusammenarbeit mit Rettungsdienst und Führungsdienst.']}, + {id:'n4', cat:'Fahrzeuge & Technik', pic:'fahrzeug', date:'01.09.2026', + title:'Neues Löschfahrzeug für die Ortsfeuerwehren', + exc:'Ein neues Löschfahrzeug wurde offiziell in Dienst gestellt und verstärkt ab sofort den Fuhrpark.', + body:['Ein neues Löschfahrzeug wurde offiziell in Dienst gestellt und verstärkt ab sofort den Fuhrpark der Ortsfeuerwehren.', + 'Das Fahrzeug verfügt über moderne Beladung für Brandbekämpfung und technische Hilfeleistung und ersetzt ein älteres Modell im Bestand.']}, + {id:'n5', cat:'Jugendfeuerwehr', pic:'kinder', date:'05.09.2026', + title:'Erfolgreicher Berufsfeuerwehrtag der Jugendfeuerwehr Melle', + exc:'Mitglieder der Jugendfeuerwehren erhielten spannende Einblicke in den Alltag einer Feuerwache.', + body:['Mitglieder der Jugendfeuerwehren erhielten spannende Einblicke in den Alltag einer Feuerwache.', + 'Vom Fahrzeugcheck bis zur Übung konnten die Jugendlichen selbst Hand anlegen und viele Fragen stellen.']}, + {id:'n6', cat:'Einsätze', pic:'atemschutz', date:'02.09.2026', + title:'Brand in Garage – schnelle Hilfe durch die Feuerwehr', + exc:'Ein Garagenbrand konnte durch den schnellen Einsatz der Ortsfeuerwehr rasch unter Kontrolle gebracht werden.', + body:['Ein Garagenbrand konnte durch den schnellen Einsatz der zuständigen Ortsfeuerwehr rasch unter Kontrolle gebracht werden.', + 'Verletzt wurde niemand. Die Einsatzstelle wurde nach Abschluss der Löscharbeiten an die Polizei übergeben.']}, + {id:'n7', cat:'Ortsfeuerwehren', pic:'fuehrung', date:'28.08.2026', + title:'Neue Führungskräfte in den Ortsfeuerwehren', + exc:'Mehrere Ortsfeuerwehren haben neue Führungskräfte gewählt und in ihre Ämter eingeführt.', + body:['Mehrere Ortsfeuerwehren haben im Rahmen ihrer Jahreshauptversammlungen neue Führungskräfte gewählt.', + 'Die gewählten Kameradinnen und Kameraden wurden feierlich in ihre Ämter eingeführt.']}, + {id:'n8', cat:'Ausbildung', pic:'lehrgang', date:'25.08.2026', + title:'Drohne unterstützt bei Waldbrandübung', + exc:'Bei einer Übung zur Waldbrandbekämpfung kam die Drohnenstaffel unterstützend zum Einsatz.', + body:['Bei einer Übung zur Waldbrandbekämpfung kam die Drohnenstaffel unterstützend zum Einsatz.', + 'Aus der Luft lassen sich Glutnester und Ausbreitungsrichtungen deutlich schneller erkennen.']}, + {id:'n9', cat:'Jugendfeuerwehr', pic:'jugend', date:'20.08.2026', + title:'Jugendfeuerwehren erhalten die Leistungsspange', + exc:'Zahlreiche Jugendliche stellten ihr Können unter Beweis und erhielten die Leistungsspange.', + body:['Zahlreiche Jugendliche der Meller Jugendfeuerwehren stellten ihr Können unter Beweis und erhielten die Leistungsspange.', + 'Geprüft werden unter anderem Schnelligkeit, Ausdauer und feuerwehrtechnisches Können im Team.']}, + {id:'n10', cat:'Förderverein', pic:'foerder', date:'14.08.2026', + title:'Förderverein unterstützt die Jugendarbeit', + exc:'Eine Spende kommt direkt der Arbeit der Kinder- und Jugendfeuerwehren zugute.', + body:['Eine Spende kommt direkt der Arbeit der Kinder- und Jugendfeuerwehren zugute.', + 'Angeschafft werden davon Ausrüstung und Material für die regelmäßigen Dienste.']}, + {id:'n11', cat:'Ortsfeuerwehren', pic:'versammlung', date:'07.08.2026', + title:'Jahreshauptversammlung der Feuerwehr Melle', + exc:'Rückblick auf das vergangene Jahr, Ehrungen und ein Ausblick auf kommende Vorhaben.', + body:['Rückblick auf das vergangene Jahr, Ehrungen und ein Ausblick auf kommende Vorhaben standen im Mittelpunkt der Jahreshauptversammlung.', + 'Im Berichtsjahr wurden zahlreiche Einsätze abgearbeitet und viele Stunden in Aus- und Fortbildung investiert.']}, + {id:'n12', cat:'Ortsfeuerwehren', pic:'technik', date:'30.07.2026', + title:'Defibrillator für die Ortsfeuerwehr', + exc:'Ein neuer Defibrillator steht ab sofort für den Ernstfall bereit.', + body:['Ein neuer Defibrillator steht ab sofort im Gerätehaus für den Ernstfall bereit.', + 'Die Einsatzkräfte wurden in die Handhabung des Geräts eingewiesen.']} + ]; + + /* Autoren — Platzhalter fuer die Demo. Echte Namen und Portraitfotos + lassen sich hier direkt eintragen (foto: 'assets/img/…' ergaenzen). */ + const AUTOREN = { + presse: {name:'Presseteam Feuerwehr Melle', rolle:'Öffentlichkeitsarbeit'}, + jugend: {name:'Redaktion Jugendfeuerwehr', rolle:'Stadtjugendfeuerwehr Melle'}, + mitte: {name:'Pressewart Melle-Mitte', rolle:'Ortsfeuerwehr Melle-Mitte'} + }; + const AUTOR_ZU = {n5:'jugend', n9:'jugend', n10:'jugend', n6:'mitte', n12:'mitte'}; + NEWS.forEach(n => { n.autor = AUTOREN[AUTOR_ZU[n.id] || 'presse']; }); + + const TERMINE = [ + {d:'20', m:'SEP', title:'Tag der offenen Tür', ort:'Ortsfeuerwehr Melle', zeit:'10:00–16:00 Uhr'}, + {d:'25', m:'SEP', title:'Atemschutz-Übungsstrecke', ort:'Feuerwehrhaus Melle', zeit:'19:00 Uhr'}, + {d:'03', m:'OKT', title:'Jugendfeuerwehr Dienst', ort:'Gerätehaus Melle', zeit:'17:30 Uhr'}, + {d:'10', m:'OKT', title:'Kreisfeuerwehrtag', ort:'Landkreis Osnabrück', zeit:'09:00 Uhr'}, + {d:'17', m:'OKT', title:'Gemeinschaftsdienst Ortsfeuerwehren', ort:'Gerätehaus Gesmold', zeit:'18:30 Uhr'}, + {d:'01', m:'NOV', title:'Übung Wasserförderung über lange Strecke', ort:'Else, Buer', zeit:'09:00 Uhr'} + ]; + + const slugify = s => s.toLowerCase().replace(/ä/g,'ae').replace(/ö/g,'oe').replace(/ü/g,'ue').replace(/ß/g,'ss').replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,''); + + const PICS_ROT = ['fahrzeug','auszeichnung','fuehrung','kinder','grund','technik','versammlung','jugend','atemschutz','gefahrgut','lehrgang','foerder','partner','verein','ehrung','fahrzeug']; + const ORTE = ['Altenmelle','Bakum','Bruchmühlen','Buer','Gesmold','Groß Aschen','Hoyel','Markendorf','Melle-Mitte','Neuenkirchen','Niederholsten','Oldendorf','Riemsloh','Sankt Annen','Tittingdorf','Wellingholzhausen'] + .map((name,i)=>({name, pic:PICS_ROT[i], slug:slugify(name)})); + + /* Ausgebaute Beispielseite — Inhalte von feuerwehr-melle.de/feuerwehren/bakum */ + ORTE.find(o => o.slug === 'bakum').pic = 'bakum'; + ORTE.find(o => o.slug === 'bakum').detail = { + lead:'Die Geschichte der Ortsfeuerwehr Bakum reicht bis in den Sommer 1906 zurück. Angefangen mit einer Handdruckspritze, sind heute ein TSF-W und ein ELW in Bakum stationiert.', + art:'Feuerwehr mit Grundausstattung', + gegruendet:'1906', + gebiet:['Bakum','Eicken-Bruche','Drantum','Teile von Laer','angrenzende Bereiche zu Melle-Mitte'], + schwerpunkte:['Mehrere Industrieparks','Ein Hotel','Teile der Eisenbahnlinie Osnabrück–Hannover','GrönegauBad Melle', + 'Altenheim mit Kurzzeitpflege','Mehrere Schulen','Ausgedehnte Waldgebiete inkl. der Meller Berge'], + fahrzeuge:[ + {k:'TSF-W', t:'Tragkraftspritzenfahrzeug-Wasser', sub:'MAN TGL 8.180 · Baujahr 2017 · Besatzung 1/5', pic:'fztsfw'}, + {k:'ELW', t:'Einsatzleitwagen', sub:'Volkswagen T5', pic:'fzelw'}, + {k:'FwA', t:'Feuerwehranhänger', sub:'mit Notstromaggregat', pic:'fzfwa'} + ], + technik:['Hochleistungslüfter','Wasserstaubsauger','Wärmebildkamera'], + haus:'Das Feuerwehrhaus besitzt zwei Stellplätze für die Einsatzfahrzeuge, eine Garage mit Feuerwehranhänger und Notstromaggregat, einen Gruppenraum für Aus- und Weiterbildung, eine Teeküche sowie sanitäre Anlagen.', + alarm:'Ab dem Alarmstichwort „Feuer 3“ wird die Alarmeinheit aus Altenmelle, Bakum und Melle-Mitte über Sirene alarmiert.', + adresse:'Bakumer Straße 98, 49324 Melle', + tel:'05422 43329', + mail:'ortsfeuerwehr.bakum@feuerwehr-melle.de', + leitung:[{n:'Mirco Brinkmann', r:'Ortsbrandmeister', m:'ortsbm.bakum@feuerwehr-melle.de'}, + {n:'Sebastian Krämer', r:'Stellv. Ortsbrandmeister', m:'stellv.ortsbm.bakum@feuerwehr-melle.de'}] + }; + + /* Sieben Jugendfeuerwehren + Kinderfeuerwehr (Stand feuerwehr-melle.de) */ + const JF_PICS = ['kinder','jugend','foerder','kinder','jugend','foerder','jugend','kinder']; + const JUGEND = ['Buer','Elsetal','Gesmold','Melle-Mitte','Neuenkirchen','Niederholsten/Oldendorf','Wellingholzhausen'] + .map((name,i)=>({name, slug:slugify(name), pic:JF_PICS[i]})); + JUGEND.unshift({name:'Kinderfeuerwehr Melle-Mitte', slug:'kinderfeuerwehr-melle-mitte', pic:'kinder', kinder:true}); + + /* Welche Ortsfeuerwehr gehoert zu welcher Jugendfeuerwehr (Stand feuerwehr-melle.de) */ + const JF_VON_ORT = { + 'bakum':'melle-mitte', 'melle-mitte':'melle-mitte', + 'riemsloh':'elsetal', 'bruchmuehlen':'elsetal', 'gross-aschen':'elsetal', 'hoyel':'elsetal', + 'buer':'buer', 'gesmold':'gesmold', 'neuenkirchen':'neuenkirchen', + 'niederholsten':'niederholsten-oldendorf', 'oldendorf':'niederholsten-oldendorf', + 'wellingholzhausen':'wellingholzhausen' + }; + const ORTE_VON_JF = {}; + Object.keys(JF_VON_ORT).forEach(ort => { + const jf = JF_VON_ORT[ort]; + (ORTE_VON_JF[jf] = ORTE_VON_JF[jf] || []).push(ort); + }); + ORTE_VON_JF['kinderfeuerwehr-melle-mitte'] = ['melle-mitte']; + + const jfBySlug = s => JUGEND.find(j => j.slug === s); + const ortBySlug = s => ORTE.find(o => o.slug === s); + + /* Kurzprofile der uebrigen Jugendfeuerwehren (Inhalte von feuerwehr-melle.de) */ + jfBySlug('kinderfeuerwehr-melle-mitte').detail = { + lead:'Möchtest du Spiel, Spaß und Aktion? Und bist du zwischen 6 und 10 Jahre alt? Dann bist du bei den Meller Feuerflöhen genau richtig.', + text:['Wir treffen uns vierzehntägig am Montagnachmittag von 16:15 Uhr bis 17:45 Uhr und erleben zusammen viele tolle Sachen. In spielerischer Form behandeln wir Feuerwehrthemen wie Erste Hilfe, Brandschutz, Schlauchkunde und das Absetzen eines Notrufs.'], + alter:'6–10 Jahre', dienst:'14-tägig montags, 16:15–17:45 Uhr', + themen:['Erste Hilfe','Brandschutz','Schlauchkunde','Notruf absetzen'] + }; + jfBySlug('melle-mitte').detail = { + lead:'Seit knapp vier Jahrzehnten setzt die Ortsfeuerwehr Melle-Mitte auf Jugendarbeit zur Nachwuchsgewinnung – mit Erfolg.', + text:['Etwa zwei Drittel aller derzeit in der Einsatzabteilung aktiven Kameradinnen und Kameraden sind „durch die Jugendfeuerwehr gegangen“. Neben dem Thema Feuerwehr nimmt auch die allgemeine Jugendarbeit einen großen Raum ein.'], + alter:'10–18 Jahre', dienst:'Regelmäßige Dienstabende' + }; + jfBySlug('neuenkirchen').detail = { + lead:'Die Jugendfeuerwehr Neuenkirchen wurde im Jahr 1971 gegründet und ist damit eine der ältesten Jugendfeuerwehren im Stadtgebiet.', + text:['Sie bestand viele Jahre nur aus männlichen Mitgliedern – erst 1995 trat das erste Mädchen ein. Mit 18 Jahren wechseln die Mitglieder in die Einsatzabteilung.'], + gegruendet:'1971', alter:'10–17 Jahre', dienst:'Regelmäßige Dienstabende' + }; + jfBySlug('gesmold').detail = { + lead:'Du bist zwischen zehn und 18 Jahre alt und interessiert? Dann mach mit bei der Jugendfeuerwehr Gesmold.', + text:['Wir treffen uns alle 14 Tage dienstags um 17:30 Uhr. Die genauen Termine stehen im Dienstplan.'], + alter:'10–18 Jahre', dienst:'14-tägig dienstags, 17:30 Uhr' + }; + jfBySlug('wellingholzhausen').detail = { + lead:'Herzlich willkommen bei der Jugendfeuerwehr Wellingholzhausen.', + text:['Wir treffen uns jeden zweiten Freitag von 17:00 Uhr bis 19:00 Uhr im neuen Feuerwehrhaus Wellingholzhausen.'], + alter:'10–18 Jahre', dienst:'14-tägig freitags, 17:00–19:00 Uhr' + }; + jfBySlug('buer').detail = { + lead:'Die Jugendfeuerwehr Buer ist ein wichtiger Baustein unserer Ortsfeuerwehr.', + text:['Unsere Mitglieder sind zwischen 10 und 18 Jahren alt. Bei der Jugendfeuerwehr erleben die Jugendlichen, was es heißt, Kameradschaft zu pflegen und mit technischem Wissen und Geschick zu helfen.'], + alter:'10–18 Jahre', dienst:'Regelmäßige Dienstabende' + }; + jfBySlug('niederholsten-oldendorf').detail = { + lead:'Mit der Gründung der Jugendfeuerwehr Niederholsten/Oldendorf besitzt die Feuerwehr Melle ein flächendeckendes Netz an Jugendfeuerwehren.', + text:['Sie ist die jüngste der sieben Meller Jugendfeuerwehren — der letzte weiße Fleck auf der Landkarte ist damit verschwunden.'], + alter:'10–18 Jahre', dienst:'Regelmäßige Dienstabende' + }; + + /* Ausgebaute Beispielseite — Inhalte von feuerwehr-melle.de/kinder-jugendfeuerwehren/jugendfeuerwehr-elsetal */ + JUGEND.find(j => j.slug === 'elsetal').detail = { + lead:'Schon seit 2002 setzt sich die Jugendfeuerwehr Elsetal aus den Ortsfeuerwehren Riemsloh, Bruchmühlen, Groß Aschen und Hoyel zusammen. Gemeinsam sind wir ein Team aus zehn- bis 18-jährigen Jugendlichen und natürlich den Jugendwarten und Betreuern.', + text:['Neben der feuerwehrtechnischen Ausbildung an unseren Dienstabenden legen wir auch viel Wert auf Spiel, Spaß und allgemeine Jugendarbeit. Wir werden gemeinsam kreativ, testen und erweitern unser Wissen und bilden eine starke Truppe. Das WIR zählt bei uns!', + 'Du willst auch ein Teil vom WIR sein und bist mindestens zehn Jahre alt? Dann melde dich gerne bei unseren Ansprechpartnern.'], + claim:'WIR sind die Zukunft der Feuerwehr!', + gegruendet:'2002', + alter:'10–18 Jahre', + dienst:'14-tägig donnerstags, 18:00 Uhr', + ortsfw:['Riemsloh','Bruchmühlen','Groß Aschen','Hoyel'], + leitung:[{n:'Lars Fluchtmann', r:'Jugendfeuerwehrwart'},{n:'Marvin Landwehr', r:'Stellv. Jugendfeuerwehrwart'}, + {n:'Frank Beer', r:'Stellv. Jugendfeuerwehrwart'},{n:'Michael Wötzel', r:'Stellv. Jugendfeuerwehrwart'}] + }; + + /* ===================== HELFER ===================== */ + const $ = (s,el)=> (el||document).querySelector(s); + const $$ = (s,el)=> Array.from((el||document).querySelectorAll(s)); + const main = $('#main'); + const esc = s => String(s).replace(/[&<>"]/g, c => ({'&':'&','<':'<','>':'>','"':'"'}[c])); + + const crumbs = items => '
Startseite'+ + items.map(it => I.chevR + (it.href ? ''+esc(it.label)+'' : ''+esc(it.label)+'')).join('') + '
'; + + const dateMeta = d => ''+I.calSmall+esc(d)+''; + + function evRow(e){ + return ''+ + ''+ + ''+e.date+', '+e.time+' Uhr'+esc(e.type)+''+ + (e.bilder && e.bilder.length > 1 + ? ''+I.cam+e.bilder.length+'' : '')+ + ''+ + ''+esc(e.title)+''+ + ''+I.pinFill+esc(e.ort)+''+ + ''+I.helmet+'zuständig: '+esc(e.zust)+''+ + ''+ + ''+I.chevR+''; + } + function miniRow(n){ + return ''+shot(n.pic,'thumb','shot')+ + ''+esc(n.cat)+''+ + '
'+esc(n.title)+'
'+dateMeta(n.date)+'
'; + } + function wmRow(n){ + return ''+shot(n.pic,'thumb','shot')+ + ''+esc(n.cat)+''+ + '
'+esc(n.title)+'
'+dateMeta(n.date)+'
'; + } + function tmRow(t){ + return '
'+t.d+'
'+t.m+'
'+ + '
'+esc(t.title)+'
'+ + '
'+esc(t.ort)+'
'+esc(t.zeit)+'
'; + } + function newsCard(n){ + return ''+shot(n.pic,'card','shot')+ + '
'+esc(n.cat)+'

'+esc(n.title)+'

'+ + '

'+esc(n.exc)+'

'+dateMeta(n.date)+'
'; + } + + /* ===================== SEITEN ===================== */ + const P = {}; + let heroIdx = 0; + const HERO_SLIDES = [ + {pic:'grund', cat:'Aktuell', date:'16.09.2026', id:'n1', + title:'21 neue Einsatzkräfte starten in den aktiven Feuerwehrdienst', + desc:'In Melle haben 21 Teilnehmerinnen und Teilnehmer erfolgreich die Grundausbildung abgeschlossen und verstärken ab sofort die Einsatzabteilungen der Ortsfeuerwehren.'}, + {pic:'gefahrgut', cat:'Ausbildung', date:'09.09.2026', id:'n3', + title:'Realistische Einsatzübungen für die Einsatzkräfte', + desc:'Mehrere Ortsfeuerwehren trainierten gemeinsam den Ernstfall — von der Menschenrettung bis zur Zusammenarbeit mit dem Rettungsdienst.'}, + {pic:'fahrzeug', cat:'Fahrzeuge & Technik', date:'01.09.2026', id:'n4', + title:'Neues Löschfahrzeug für die Ortsfeuerwehren', + desc:'Das Fahrzeug verfügt über moderne Beladung für Brandbekämpfung und technische Hilfeleistung und ersetzt ein älteres Modell im Bestand.'} + ]; + + function heroHTML(){ + const s = HERO_SLIDES[heroIdx]; + return ''+ + '
'+ + '
'+esc(s.cat)+''+ + '

'+esc(s.title)+'

'+esc(s.desc)+'

'+ + ''+I.calSmall+s.date+'
'+ + ''+ + ''+ + '
'+HERO_SLIDES.map((x,i)=>'').join('')+'
'; + } + + P['/'] = () => ` +
+
${heroHTML()}
+
+
+ ${I.sirenF}Wir im EinsatzEinsätze + Alle Einsätze ${I.arrowR} +
+
${EINSAETZE.slice(0,3).map(evRow).join('')}
+
+
+ +
+ + +
+
+ ${I.docF}Weitere Meldungen + Alle Meldungen ${I.arrowR} +
+ ${[NEWS[4],NEWS[5],NEWS[6],NEWS[7]].map(wmRow).join('')} +
+ +
+
+
+ ${I.calF}Termine + Alle Termine ${I.arrowR} +
+ ${TERMINE.slice(0,3).map(tmRow).join('')} +
+
+
${MAP_BG}
+
+ ${I.pinFill}Einsatzkarte +

Alle aktuellen Einsätze auf einen Blick.

+ Zur Einsatzkarte ${I.arrowR} +
+
+
+
`; + + P['/einsaetze'] = () => ` +
${crumbs([{label:'Einsätze'}])}

Einsätze

+

Eine Übersicht der jüngsten Einsätze der Ortsfeuerwehren Melle.

+
${I.info}Demo-Ansicht: Im Livebetrieb würde diese Liste automatisch aus dem Einsatzleitsystem befüllt.
+
${EINSAETZE.map(evRow).join('')}
`; + + /* Bildergalerie: bei mehreren Fotos Hauptbild + Vorschauleiste, sonst ein Bild */ + let galIdx = 0; + function galerie(e){ + const pics = e.bilder && e.bilder.length > 1 ? e.bilder : null; + if (!pics) return shot(e.pic, 'hero', 'detail-hero'); + if (galIdx >= pics.length) galIdx = 0; + return '' + + '
' + pics.map((p,i) => + '').join('') + '
'; + } + + P['/einsaetze/:id'] = id => { + const e = EINSAETZE.find(x => x.id === id) || EINSAETZE[0]; + return `${I.chevL}Zurück zu Einsätze +
${galerie(e)}
+ ${detailHead(e.type, e.title, '')} +
+
+ ${block(I.info, 'Einsatzverlauf', `
+

Am ${e.date} um ${e.time} Uhr wurde die ${zustSlug(e) ? ortLink(zustSlug(e), e.zust) : ''+esc(e.zust)+''} zu einem Einsatz in ${esc(e.ort)} alarmiert.

+

Vor Ort wurde die Lage durch den Einsatzleiter erkundet und die notwendigen Maßnahmen wurden eingeleitet. Die Einsatzstelle konnte im weiteren Verlauf gesichert und übergeben werden.

+

Demo-Eintrag zur Veranschaulichung einer Einsatzmeldung.

`)} + ${block(I.sirenF, 'Im Einsatz', '
' + e.einheiten.map(u => { + const s = einheitSlug(u.name); + return '
' + + (s ? ''+esc(u.name)+'' : ''+esc(u.name)+'') + + (u.fz && u.fz.length ? ''+u.fz.map(f => ''+esc(f)+'').join('')+'' : '') + + '
'; + }).join('') + '
')} +
+
+ ${sideCard('Einsatzdetails', + `
${I.clock}${e.date} · ${e.time} Uhr
+
${I.pin}${esc(e.ort)}
+
${I.siren}${esc(e.type)}
+
${I.helmet}Zuständig:
${zustSlug(e) ? ortLink(zustSlug(e), e.zust) : esc(e.zust)}
+
${I.info}Alarmierung: ${esc(e.alarm)}
`)} +
+
`; + }; + + P['/aktuelles'] = () => ` +
${crumbs([{label:'Aktuelles'}])}

Aktuelles

+

Neuigkeiten aus den Ortsfeuerwehren, der Jugendfeuerwehr und dem Vereinsleben.

+
${NEWS.map(newsCard).join('')}
`; + + P['/aktuelles/:id'] = id => { + const n = NEWS.find(x => x.id === id) || NEWS[0]; + return `${I.chevL}Zurück zu Aktuelles + ${shot(n.pic,'hero','detail-hero')} +
+ ${esc(n.cat)} +

${esc(n.title)}

+
${dateMeta(n.date)}
+
+
+
+
${n.body.map(p => '

'+esc(p)+'

').join('')}
+ +
+ ${n.autor.foto ? '' : I.flame} + + Ein Artikel von + ${esc(n.autor.name)} + ${esc(n.autor.rolle)} ${I.calSmall} ${n.date} + +
+
+
+ ${sideCard('Weitere Meldungen', NEWS.filter(x => x.id !== n.id).slice(0,4).map(x => + ''+ + ''+esc(x.title)+''+ + ''+x.date+'').join(''))} +
+
`; + }; + + P['/termine'] = () => ` +
${crumbs([{label:'Termine'}])}

Termine

+

Übungsdienste, Veranstaltungen und Termine der Ortsfeuerwehren Melle.

+
${TERMINE.map(tmRow).join('')}
`; + + P['/ortsfeuerwehren'] = () => ` +
${crumbs([{label:'Ortsfeuerwehren'}])}

Ortsfeuerwehren

+

Die Feuerwehr Melle gliedert sich in ${ORTE.length} Ortsfeuerwehren, die gemeinsam den Brand- und Katastrophenschutz im Stadtgebiet sicherstellen.

+
${ORTE.map(o => ` + ${shot(o.pic,'thumb','shot')} +

Ortsfeuerwehr ${esc(o.name)}

+

Freiwillige Einsatzabteilung im Ortsteil ${esc(o.name)}.

`).join('')}
`; + + /* Bausteine der Detailseiten */ + const initials = n => n.split(/\s+/).filter(w => /^[A-ZÄÖÜ]/.test(w)).map(w => w[0]).join('').slice(0,2); + const personCard = p => '
'+esc(initials(p.n))+''+ + ''+esc(p.n)+''+esc(p.r)+''+ + (p.m ? ''+esc(p.m)+'' : '')+'
'; + const chipList = a => '
'+a.map(x => ''+esc(x)+'').join('')+'
'; + const chipLinks = a => '
'+a.map(x => + ''+esc(x.label)+'').join('')+'
'; + const tickList = (a, two) => ''; + const subSec = (icon, title, body) => '
'+icon+esc(title)+''+body+'
'; + + /* Bausteine des einheitlichen Detailseiten-Rasters */ + const detailHead = (eyebrow, title, lead) => '
'+esc(eyebrow)+''+ + '

'+esc(title)+'

'+(lead ? '

'+esc(lead)+'

' : '')+'
'; + const block = (icon, title, body) => '

'+icon+''+esc(title)+'

'+body+'
'; + const factTile = (icon, k, v) => '
'+icon+esc(k)+'
'+esc(v)+'
'; + const factRow = a => '
'+a.join('')+'
'; + const sideCard = (title, body) => '

'+esc(title)+'

'+body+'
'; + + /* Einheit bzw. Zuständigkeit auf die passende Ortsfeuerwehr-Seite abbilden */ + const ortSlugAus = (text, prefix) => { + const m = new RegExp('^' + prefix + '\\s+(.+)$').exec(text || ''); + if (!m) return null; + const s = slugify(m[1]); + return ortBySlug(s) ? s : null; + }; + const einheitSlug = name => ortSlugAus(name, 'OrtsFw'); + const zustSlug = e => ortSlugAus(e.zust, 'Ortsfeuerwehr'); + const ortLink = (slug, label) => ''+esc(label)+''; + + /* Einsaetze, an denen eine Ortsfeuerwehr beteiligt war */ + const einsaetzeVonOrt = slug => EINSAETZE.filter(e => + zustSlug(e) === slug || (e.einheiten || []).some(u => einheitSlug(u.name) === slug)); + + const letzteEinsaetzeCard = slug => { + const list = einsaetzeVonOrt(slug).slice(0, 4); + if (!list.length) return ''; + return sideCard('Letzte Einsätze', + '
' + list.map(e => + ''+ + shot((e.bilder && e.bilder[0]) || e.pic, 'thumb', 'shot')+ + ''+esc(e.type)+''+ + ''+esc(e.title)+''+ + ''+e.date+' · '+e.time+' Uhr'+ + '').join('') + '
' + + 'Alle Einsätze '+I.arrowR+''); + }; + + /* Abschnitt „Jugendfeuerwehr“ auf einer Ortsfeuerwehr-Seite */ + const jfBlock = o => { + const slug = JF_VON_ORT[o.slug]; + if (!slug) return block(I.helmet, 'Jugendfeuerwehr', '

Den Nachwuchs fördern die ' + + 'Kinder- und Jugendfeuerwehren der Stadt Melle.

'); + const j = jfBySlug(slug), jd = j.detail || {}; + return block(I.helmet, 'Jugendfeuerwehr', + '

Der Nachwuchs der Ortsfeuerwehr '+esc(o.name)+' ist in der Jugendfeuerwehr '+esc(j.name)+ + ' organisiert'+(jd.alter ? ' — Alter: '+esc(jd.alter) : '')+'.'+ + (jd.dienst && jd.dienst.indexOf('Regelmäßige') !== 0 ? ' Die Dienste finden '+esc(jd.dienst)+' statt.' : '')+'

'+ + 'Zur Jugendfeuerwehr '+esc(j.name)+' '+I.arrowR+''); + }; + + P['/ortsfeuerwehren/:slug'] = slug => { + const o = ORTE.find(x => x.slug === slug) || ORTE[0]; + const d = o.detail; + const main = d ? [ + factRow([ + factTile(I.flame, 'Gegründet', d.gegruendet), + factTile(I.sirenF, 'Fahrzeuge', d.fahrzeuge.length + ' im Dienst'), + factTile(I.pinFill, 'Einsatzgebiet', d.gebiet.length + ' Bereiche'), + factTile(I.helmet, 'Einstufung', 'Grundausstattung') + ]), + block(I.pinFill, 'Einsatzgebiet', chipList(d.gebiet)), + block(I.info, 'Gefahrenschwerpunkte', tickList(d.schwerpunkte, true)), + block(I.sirenF, 'Fahrzeuge', '
' + d.fahrzeuge.map(f => + '
' + shot(f.pic, 'card', 'ratio') + + '
'+esc(f.k)+''+esc(f.t)+''+ + (f.sub ? ''+esc(f.sub)+'' : '')+'
').join('') + '
'), + jfBlock(o), + block(I.helmet, 'Ausstattung & Feuerwehrhaus', + chipList(d.technik) + '

'+esc(d.haus)+'

'), + block(I.siren, 'Alarmierung', '

'+esc(d.alarm)+'

') + ].join('') : [ + block(I.helmet, 'Die Ortsfeuerwehr ' + o.name, '
'+ + '

Die Ortsfeuerwehr '+esc(o.name)+' ist eine von '+ORTE.length+' Einsatzabteilungen der Freiwilligen Feuerwehr Melle und stellt gemeinsam mit den übrigen Ortsfeuerwehren die Gefahrenabwehr im Stadtgebiet sicher.

'+ + '

Zu den Aufgaben zählen Brandbekämpfung, technische Hilfeleistung sowie die Mitwirkung im Katastrophenschutz. Regelmäßige Übungsdienste sichern die Einsatzbereitschaft.

'+ + '

Demo-Inhalt — vollständig ausgebaut ist beispielhaft die Ortsfeuerwehr Bakum.

'), + jfBlock(o) + ].join(''); + + const side = d + ? sideCard('Kontakt', + `
${I.helmet}${esc(d.art)}
+
${I.pin}${esc(d.adresse)}
+
${I.phone}${esc(d.tel)}
+
${I.mail}${esc(d.mail)}
`) + + sideCard('Ansprechpartner', '
'+d.leitung.map(personCard).join('')+'
') + : sideCard('Auf einen Blick', + `
${I.pin}Gerätehaus ${esc(o.name)}
+
${I.users}Freiwillige Einsatzabteilung
+
${I.phone}Notruf: 112
`); + + const sideAll = side + letzteEinsaetzeCard(o.slug); + + return `${I.chevL}Zurück zu Ortsfeuerwehren + ${shot(o.pic,'hero','detail-hero')} + ${detailHead('Ortsfeuerwehr', o.name, d ? d.lead : '')} +
${main}
${sideAll}
`; + }; + + const JF_LEITUNG = [ + {n:'Jan Petering', r:'Stadtjugendfeuerwehrwart'}, + {n:'Malte von Bachmann', r:'Stellv. Stadtjugendfeuerwehrwart'}, + {n:'Mattis Kappelmann', r:'Stellv. Stadtjugendfeuerwehrwart'} + ]; + + P['/jugendfeuerwehr'] = () => { + const kf = JUGEND.find(j => j.kinder), kd = kf.detail; + const jfs = JUGEND.filter(j => !j.kinder); + return ` +
${crumbs([{label:'Kinder- und Jugendfeuerwehren'}])}

Kinder- und Jugendfeuerwehren

+

In der Stadt Melle gibt es sieben Jugendfeuerwehren und eine Kinderfeuerwehr, die den Nachwuchs der ${ORTE.length} Ortsfeuerwehren fördern. Seit der Gründung der jüngsten Jugendfeuerwehr Niederholsten/Oldendorf sind die Gruppen flächendeckend über das Stadtgebiet verteilt — so können sich Kinder und Jugendliche ohne weite Anfahrtswege bei der Feuerwehr engagieren.

+ + ${factRow([ + factTile(I.helmet, 'Kinderfeuerwehr', '1 Gruppe'), + factTile(I.users, 'Jugendfeuerwehren', '7 Gruppen'), + factTile(I.flame, 'Einstieg', 'ab 6 Jahren'), + factTile(I.pinFill, 'Verteilt auf', ORTE.length + ' Ortsfeuerwehren') + ])} + +
+ ${I.helmet}Kinderfeuerwehr — die Meller Feuerflöhe + + ${shot(kf.pic,'card','ratio')} +
+ Kinderfeuerwehr Melle-Mitte +

Für Kinder von 6 bis 10 Jahren

+

${esc(kd.lead)}

+ ${chipList([kd.alter, kd.dienst])} + Zur Kinderfeuerwehr ${I.arrowR} +
+
+
+ +
+ ${I.users}Die sieben Jugendfeuerwehren + +
+ +
+
+ ${block(I.news, 'Aus der Jugendarbeit', + '
'+NEWS.filter(n => n.cat === 'Jugendfeuerwehr' || n.cat === 'Förderverein').slice(0,2).map(newsCard).join('')+'
')} +
+
+ ${sideCard('Ansprechpartner', '
'+JF_LEITUNG.map(personCard).join('')+'
')} + ${sideCard('Mitmachen', + `
${I.users}Jugendfeuerwehr ab 10 Jahren
+
${I.helmet}Kinderfeuerwehr ab 6 Jahren
+ Kontakt aufnehmen ${I.arrowR}`)} +
+
`; + }; + + P['/jugendfeuerwehr/:slug'] = slug => { + const j = JUGEND.find(x => x.slug === slug) || JUGEND[0]; + const d = j.detail; + const titel = j.kinder ? j.name : 'Jugendfeuerwehr ' + j.name; + const main = d ? [ + factRow([ + d.gegruendet ? factTile(I.flame, 'Gegründet', d.gegruendet) : '', + factTile(I.users, 'Alter', d.alter), + factTile(I.cal, 'Dienst', d.dienst), + (ORTE_VON_JF[j.slug] || []).length + ? factTile(I.helmet, j.kinder ? 'Getragen von' : 'Ortsfeuerwehren', String(ORTE_VON_JF[j.slug].length)) : '' + ].filter(Boolean)), + block(I.helmet, 'Über uns', '

'+esc(d.lead)+'

'+ + (d.text || []).map(p => '

'+esc(p)+'

').join('')+'
'+ + (d.claim ? '

'+esc(d.claim)+'

' : '')), + d.themen ? block(I.check, 'Das machen wir', chipList(d.themen)) : '', + (ORTE_VON_JF[j.slug] || []).length + ? block(I.users, j.kinder ? 'Getragen von' : 'Beteiligte Ortsfeuerwehren', + chipLinks(ORTE_VON_JF[j.slug].map(s => ({label:'Ortsfeuerwehr ' + ortBySlug(s).name, href:'#/ortsfeuerwehren/'+s})))) + : '', + block(I.cal, 'Dienstbetrieb', '

Die Dienste finden '+esc(d.dienst)+' statt. Alle Termine stehen im '+ + 'Dienstplan.

') + ].join('') : [ + block(I.helmet, titel, '
'+ + '

Die '+esc(titel)+' gehört zu den sieben Jugendfeuerwehren der Stadt Melle. Neben der feuerwehrtechnischen Ausbildung stehen Teamgeist, gemeinsame Aktionen und Jugendarbeit im Mittelpunkt.

'+ + '

Mit dem Übertritt in die Einsatzabteilung steht der Weg in den aktiven Feuerwehrdienst offen.

'+ + '

Demo-Inhalt — vollständig ausgebaut ist beispielhaft die Jugendfeuerwehr Elsetal.

') + ].join(''); + + const side = sideCard('Auf einen Blick', + `
${I.users}${d ? esc(d.alter) : (j.kinder ? 'Ab 6 Jahren' : '10–18 Jahre')}
+
${I.cal}${d ? esc(d.dienst) : 'Regelmäßige Dienstabende'}
+ ${d ? `
${I.flame}Gegründet ${esc(d.gegruendet)}
` : ''} + Mitmachen ${I.arrowR}`) + + sideCard('Ansprechpartner', '
' + + (d && d.leitung ? d.leitung : JF_LEITUNG.slice(0,1)).map(personCard).join('') + '
'); + + return `${I.chevL}Zurück zur Übersicht + ${shot(j.pic,'hero','detail-hero')} + ${detailHead(j.kinder ? 'Kinderfeuerwehr' : 'Jugendfeuerwehr', j.kinder ? 'Melle-Mitte' : j.name, d ? '' : '')} +
${main}
${side}
`; + }; + + P['/foerderverein'] = () => ` +
${crumbs([{label:'Förderverein'}])}

Förderverein

+

Der Förderverein unterstützt die Arbeit der Feuerwehr Melle ideell und finanziell.

+ ${shot('foerder','hero','detail-hero')} +
+

Der Förderverein setzt sich für die Belange der Feuerwehr Melle ein — von zusätzlicher Ausrüstung über die Unterstützung der Jugendarbeit bis zur Pflege der Gemeinschaft im Verein.

+

Mitglied werden kann jede und jeder, die oder der die Arbeit der Feuerwehr Melle unterstützen möchte — auch ohne selbst aktive Einsatzkraft zu sein.

+

Demo-Inhalt — im Livebetrieb stünden hier Satzung, Beitrittsformular und Ansprechpartner.

+
`; + + P['/service'] = () => { + const items = [ + {i:I.file, t:'Formulare & Downloads', x:'Anträge, Merkblätter und Formulare rund um die Feuerwehr Melle.'}, + {i:I.helmet, t:'Brandschutzerziehung', x:'Angebote für Kindergärten, Schulen und Betriebe.'}, + {i:I.info, t:'Brandsicherheitswache', x:'Anfrage einer Sicherheitswache für Veranstaltungen.'}, + {i:I.users, t:'Mitmachen', x:'Interesse am aktiven Dienst? Hier geht es zum Kontakt.'} + ]; + return `
${crumbs([{label:'Service'}])}

Service & Formulare

+

Nützliche Informationen, Formulare und Anlaufstellen rund um die Feuerwehr Melle.

+
${items.map(it => `
+
${it.i}
+

${it.t}

+

${it.x}

`).join('')}
`; + }; + + P['/ueber-uns'] = () => ` +
${crumbs([{label:'Über uns'}])}

Über uns

+

Die Feuerwehr Melle sorgt seit Generationen für Sicherheit im Stadtgebiet — ehrenamtlich, engagiert und rund um die Uhr.

+ ${shot('grund','hero','detail-hero')} +
+

Mit ${ORTE.length} Ortsfeuerwehren, sieben Jugendfeuerwehren und einer Kinderfeuerwehr ist die Feuerwehr Melle flächendeckend im gesamten Stadtgebiet präsent.

+

Die ehrenamtlichen Einsatzkräfte stehen rund um die Uhr bereit — für Brandbekämpfung, technische Hilfeleistung und den Katastrophenschutz. Regelmäßige Aus- und Fortbildung sichert die Einsatzbereitschaft auf hohem Niveau.

+

Demo-Inhalt — im Livebetrieb stünden hier Geschichte, Leitung, Satzung und Struktur der Feuerwehr Melle.

+
`; + + P['/kontakt'] = () => ` +
${crumbs([{label:'Kontakt'}])}

Kontakt

+

Fragen, Anregungen oder Interesse am Mitmachen? Wir freuen uns von Ihnen zu hören.

+
+
+
+
+
+
+
+
+ +
${I.check}Danke! Dies ist eine Demo — es wurde keine Nachricht versendet.
+
+
+

Feuerwehr Melle

+
${I.pin}Hermannstraße 29
49324 Melle
+
${I.mail}info@feuerwehr-melle.de
+
${I.phone}112 – Notruf
nur im Notfall
+
+
`; + + P['/suche'] = () => ` +
${crumbs([{label:'Suche'}])}

Suche

+ +
`; + + P['/einsatzkarte'] = () => ` +
${crumbs([{label:'Einsatzkarte'}])}

Einsatzkarte

+

Alle aktuellen Einsätze auf einen Blick — Demo-Ansicht.

+
${MAP_BG} +
+ ${I.pinFill} + ${I.pinFill} + ${I.pinFill} +
+
+ Brandeinsatz + Technische Hilfeleistung +
`; + + P['/impressum'] = () => `
${crumbs([{label:'Impressum'}])}

Impressum

+

Feuerwehr Melle · Hermannstraße 29 · 49324 Melle

+

Dies ist eine Demo-Webseite. Alle Angaben dienen ausschließlich Anschauungszwecken.

`; + P['/datenschutz'] = () => `
${crumbs([{label:'Datenschutz'}])}

Datenschutz

+

Diese Demo-Webseite verarbeitet keine echten Nutzerdaten. Formulareingaben werden weder übertragen noch gespeichert.

`; + + /* ===================== MENÜ ===================== */ + /* Gleiche Menuepunkte wie die Desktop-Navigation im Header */ + const MENU = [ + {label:'Einsätze', href:'#/einsaetze', icon:I.siren, sub:[ + {label:'Alle Einsätze', href:'#/einsaetze'}, + {label:'Einsatzkarte', href:'#/einsatzkarte'}]}, + {label:'Aktuelles', href:'#/aktuelles', icon:I.news}, + {label:'Ortsfeuerwehren', href:'#/ortsfeuerwehren', icon:I.pin}, + {label:'Kinder- und Jugendfeuerwehren', href:'#/jugendfeuerwehr', icon:I.helmet, sub:[ + {label:'Übersicht', href:'#/jugendfeuerwehr'}, + {label:'Mitmachen', href:'#/kontakt'}]}, + {label:'Termine', href:'#/termine', icon:I.cal}, + {label:'Über uns', href:'#/ueber-uns', icon:I.users, sub:[ + {label:'Die Feuerwehr Melle', href:'#/ueber-uns'}, + {label:'Förderverein', href:'#/foerderverein'}, + {label:'Service & Formulare', href:'#/service'}, + {label:'Kontakt', href:'#/kontakt'}]} + ]; + + $('#menuList').innerHTML = MENU.map((m,i) => { + const hasSub = !!(m.sub && m.sub.length); + return ''; + }).join(''); + + /* ===================== ROUTER ===================== */ + function match(path){ + if (P[path]) return {fn:P[path], arg:null}; + for (const key in P){ + if (key.indexOf(':') === -1) continue; + const a = key.split('/'), b = path.split('/'); + if (a.length !== b.length) continue; + let ok = true, arg = null; + for (let i = 0; i < a.length; i++){ + if (a[i][0] === ':') arg = decodeURIComponent(b[i]); + else if (a[i] !== b[i]) { ok = false; break; } + } + if (ok) return {fn:P[key], arg}; + } + return null; + } + const path = () => { + let h = location.hash.replace(/^#/, '') || '/'; + if (h.length > 1 && h.endsWith('/')) h = h.slice(0, -1); + return h; + }; + /* Unterseiten den sechs Hauptpunkten zuordnen (fuer den Aktiv-Zustand) */ + const SECTIONS = [ + ['/einsatzkarte', '/einsaetze'], ['/einsaetze', '/einsaetze'], + ['/aktuelles', '/aktuelles'], ['/ortsfeuerwehren', '/ortsfeuerwehren'], + ['/jugendfeuerwehr', '/jugendfeuerwehr'], ['/termine', '/termine'], + ['/ueber-uns', '/ueber-uns'], ['/foerderverein', '/ueber-uns'], ['/service', '/ueber-uns'] + ]; + const section = p => { + if (p === '/') return '/'; + for (const [prefix, sec] of SECTIONS) if (p.indexOf(prefix) === 0) return sec; + return p; + }; + + function render(){ + const p = path(), m = match(p); + galIdx = 0; + main.innerHTML = m ? m.fn(m.arg) : P['/'](); + window.scrollTo(0, 0); + const sec = section(p); + $$('nav.primary a[data-nav]').forEach(a => a.classList.toggle('is-active', a.getAttribute('href') === '#' + sec)); + $$('.menu-item').forEach(li => li.classList.toggle('is-active', $('.menu-row', li).getAttribute('data-href') === '#' + sec)); + $$('.tabbar [data-tab]').forEach(b => b.classList.toggle('is-active', b.getAttribute('data-tab') === sec)); + wire(p); + closeMenu(); + } + + function wire(p){ + if (p === '/'){ + const wrap = $('#heroWrap'); + if (wrap){ + const show = i => { + heroIdx = (i + HERO_SLIDES.length) % HERO_SLIDES.length; + wrap.innerHTML = heroHTML(); + }; + wrap.addEventListener('click', ev => { + const dot = ev.target.closest('[data-dot]'), step = ev.target.closest('[data-step]'); + if (!dot && !step) return; + ev.preventDefault(); ev.stopPropagation(); + show(dot ? +dot.getAttribute('data-dot') : heroIdx + Number(step.getAttribute('data-step'))); + }); + /* Wischen am Handy */ + let tx = null; + wrap.addEventListener('touchstart', ev => { tx = ev.touches[0].clientX; }, {passive:true}); + wrap.addEventListener('touchend', ev => { + if (tx === null) return; + const dx = ev.changedTouches[0].clientX - tx; + tx = null; + if (Math.abs(dx) > 45) show(heroIdx + (dx < 0 ? 1 : -1)); + }); + } + } + if (p.indexOf('/einsaetze/') === 0){ + const gw = $('#galWrap'), e = EINSAETZE.find(x => x.id === p.split('/')[2]); + if (gw && e && e.bilder && e.bilder.length > 1){ + const show = i => { galIdx = (i + e.bilder.length) % e.bilder.length; gw.innerHTML = galerie(e); }; + gw.addEventListener('click', ev => { + const step = ev.target.closest('[data-gal]'), set = ev.target.closest('[data-galset]'); + if (!step && !set) return; + ev.preventDefault(); + show(set ? +set.getAttribute('data-galset') : galIdx + Number(step.getAttribute('data-gal'))); + }); + let tx = null; + gw.addEventListener('touchstart', ev => { tx = ev.touches[0].clientX; }, {passive:true}); + gw.addEventListener('touchend', ev => { + if (tx === null) return; + const dx = ev.changedTouches[0].clientX - tx; + tx = null; + if (Math.abs(dx) > 45) show(galIdx + (dx < 0 ? 1 : -1)); + }); + } + } + if (p === '/kontakt'){ + const f = $('#kForm'); + if (f) f.addEventListener('submit', ev => { + ev.preventDefault(); + $('#kOk').classList.add('is-on'); + $$('input,textarea', f).forEach(i => i.value = ''); + }); + } + if (p === '/suche'){ + const inp = $('#sIn'), out = $('#sOut'); + const run = () => { + const q = (inp.value || '').trim().toLowerCase(); + if (!q){ out.innerHTML = '
Geben Sie einen Suchbegriff ein — zum Beispiel „Brand“, „Jugendfeuerwehr“ oder „Ausbildung“.
'; return; } + const nh = NEWS.filter(n => (n.title + n.cat + n.exc).toLowerCase().includes(q)); + const eh = EINSAETZE.filter(e => (e.title + e.type + e.ort).toLowerCase().includes(q)); + if (!nh.length && !eh.length){ out.innerHTML = '
Keine Ergebnisse für „' + esc(inp.value) + '“.
'; return; } + let h = ''; + if (nh.length) h += '
' + I.news + 'Meldungen
' + nh.map(newsCard).join('') + '
'; + if (eh.length) h += '
' + I.sirenF + 'Einsätze
' + eh.map(evRow).join('') + '
'; + out.innerHTML = h; + }; + inp.addEventListener('input', run); + run(); + inp.focus(); + } + } + + /* ===================== MENÜ-VERHALTEN ===================== */ + const scrim = $('#menuScrim'), panel = $('#menuPanel'), burger = $('#burgerBtn'); + function openMenu(){ + scrim.classList.add('is-open'); panel.classList.add('is-open'); + burger.setAttribute('aria-expanded', 'true'); + document.body.style.overflow = 'hidden'; + } + function closeMenu(){ + scrim.classList.remove('is-open'); panel.classList.remove('is-open'); + burger.setAttribute('aria-expanded', 'false'); + document.body.style.overflow = ''; + } + burger.addEventListener('click', openMenu); + $('#menuCloseBtn').addEventListener('click', closeMenu); + $('#tabMenuBtn').addEventListener('click', openMenu); + scrim.addEventListener('click', closeMenu); + document.addEventListener('keydown', e => { if (e.key === 'Escape') closeMenu(); }); + + $('#menuList').addEventListener('click', ev => { + const row = ev.target.closest('[data-toggle]'); + if (!row) return; + ev.preventDefault(); + const li = row.closest('.menu-item'), was = li.classList.contains('is-expanded'); + $$('.menu-item').forEach(x => x.classList.remove('is-expanded')); + if (!was) li.classList.add('is-expanded'); + }); + + $('#tabbar').addEventListener('click', ev => { + const b = ev.target.closest('button[data-tab]'); + if (b) location.hash = '#' + b.getAttribute('data-tab'); + }); + + document.addEventListener('click', ev => { + const a = ev.target.closest('[data-nav]'); + if (!a) return; + const href = a.getAttribute('href'); + if (!href || href === '#') return; + ev.preventDefault(); + if (location.hash === href) render(); else location.hash = href; + }); + + window.addEventListener('hashchange', render); + render(); +})();