{"id":48468,"date":"2025-12-25T13:52:35","date_gmt":"2025-12-25T12:52:35","guid":{"rendered":"https:\/\/blickpunkt-lokalsport.de\/?page_id=48468"},"modified":"2026-04-07T22:55:34","modified_gmt":"2026-04-07T20:55:34","slug":"interaktive-karte","status":"publish","type":"page","link":"https:\/\/blickpunkt-lokalsport.de\/english\/interaktive-karte\/","title":{"rendered":"Interactive route"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"48468\" class=\"elementor elementor-48468\" data-elementor-settings=\"{&quot;element_pack_global_tooltip_width&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_width_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_width_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;element_pack_global_tooltip_padding&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_padding_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_padding_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;element_pack_global_tooltip_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true}}\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5af5c87c e-con-full e-flex e-con e-parent\" data-id=\"5af5c87c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-619960e6 elementor-widget elementor-widget-bdt-advanced-heading\" data-id=\"619960e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"bdt-advanced-heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"619960e6\" class=\"bdt-ep-advanced-heading\" data-settings=\"{&quot;titleMultiColor&quot;:&quot;no&quot;}\"><div class=\"bdt-ep-advanced-heading-content bdt-visible@m\"><div class=\"bdt-transform-origin-top-left\">Interaktive Karte<\/div><\/div><div class=\"bdt-ep-advanced-heading-sub-title\"><div class=\"bdt-ep-advanced-heading-sub-title-content\">N\u00e4chste Termine<\/div><\/div><h2 class=\"bdt-ep-advanced-heading-title\"><span class=\"bdt-ep-advanced-heading-main-title\"><span class=\"bdt-ep-advanced-heading-main-title-inner\">Interaktive Karte<\/span><\/span><\/h2><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48219aeb elementor-widget elementor-widget-spacer\" data-id=\"48219aeb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8016b47 e-flex e-con-boxed e-con e-parent\" data-id=\"8016b47\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9d10e3c elementor-widget elementor-widget-html\" data-id=\"9d10e3c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n:root{--bg:#f5f6f2;--card:#ffffff;--text:#243128;--muted:#65736a;--green1:#b7e4a8;--green2:#2e7d32;--yellow:#f2c94c;--orange:#f2994a;--blue:#4f86c6;}\r\n.bls-map-widget *{box-sizing:border-box}\r\n.bls-map-widget{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text)}\r\n.bls-map-widget .wrap{display:grid;grid-template-columns:minmax(380px,34%) minmax(0,66%);gap:18px;min-height:100vh;padding:18px}\r\n.bls-map-widget .sidebar{position:relative;z-index:20;padding:20px 20px 24px;background:linear-gradient(180deg,#f7faf6,#eef3ee);border:1px solid #d7e0d7;border-radius:16px;overflow:auto;max-height:calc(100vh - 36px)}\r\n.bls-map-widget h1{margin:0 0 8px;font-size:26px;line-height:1.2}\r\n.bls-map-widget p{margin:0 0 10px;color:var(--muted);line-height:1.5}\r\n.bls-map-widget small{color:var(--muted);font-size:12px}\r\n.bls-map-widget .legend{display:grid;gap:8px;margin:18px 0}\r\n.bls-map-widget .legend-item{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--muted)}\r\n.bls-map-widget .swatch{width:18px;height:18px;border-radius:5px;border:1px solid rgba(0,0,0,.12)}\r\n.bls-map-widget .note{margin-top:12px;padding:14px 16px;background:var(--card);border-radius:12px;border:1px solid #d7e0d7;box-shadow:0 4px 12px rgba(0,0,0,.04);font-size:14px}\r\n.bls-map-widget .note strong{color:var(--text)}\r\n.bls-map-widget .table-wrap{margin-top:18px;background:var(--card);border-radius:12px;border:1px solid #d7e0d7;overflow:hidden}\r\n.bls-map-widget .table-wrap h2{font-size:16px;margin:12px 16px 4px}\r\n.bls-map-widget .table-wrap p{margin:0 16px 12px;font-size:13px}\r\n.bls-map-widget .layout-main{display:grid;grid-template-rows:minmax(520px,68vh) auto;gap:18px;min-width:0}\r\n.bls-map-widget .map-card,.bls-map-widget .route-panel{background:#fff;border:1px solid #d7e0d7;border-radius:16px;overflow:hidden}\r\n.bls-map-widget .map-card{position:relative}\r\n.bls-map-widget .map-inner{position:relative;height:100%}\r\n.bls-map-widget .table-scroll{border-top:1px solid #e3ebe3;max-height:46vh;overflow:auto}\r\n.bls-map-widget table{width:100%;border-collapse:collapse;font-size:13px;table-layout:fixed}\r\n.bls-map-widget th,.bls-map-widget td{padding:8px 10px;border-bottom:1px solid #eef2ee;text-align:left;vertical-align:top;white-space:normal;overflow-wrap:anywhere;word-break:break-word}\r\n.bls-map-widget th{background:#f5f8f5;font-weight:600;color:#45544b;position:sticky;top:0;z-index:1}\r\n.bls-map-widget tr:nth-child(even) td{background:#fafcf9}\r\n.bls-map-widget .map-host,.bls-map-widget .fullscreen-map-host{position:relative;z-index:1;height:100%;width:100%}\r\n.bls-map-widget .map-host{min-height:520px}\r\n.bls-map-widget .leaflet-popup-content-wrapper{border-radius:12px}\r\n.bls-map-widget .club-label{font-size:11px;line-height:1.15;color:#123326;background:rgba(255,255,255,.92);padding:2px 5px;border-radius:4px;border:1px solid rgba(0,0,0,.12);white-space:nowrap;pointer-events:none;box-shadow:0 1px 4px rgba(0,0,0,.08)}\r\n.bls-map-widget .map-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-start;position:relative;z-index:1005}\r\n.bls-map-widget .map-toolbar-outside{position:sticky;top:0;padding:12px 12px 0 12px;justify-content:flex-end;background:#f7f7f7;z-index:1010}\r\n.bls-map-widget .map-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 12px;border-radius:10px;background:#fff;color:#173d2b;border:1px solid rgba(0,0,0,.12);font:600 13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer;box-shadow:0 4px 12px rgba(0,0,0,.08);text-decoration:none;white-space:nowrap}\r\n.bls-map-widget .map-btn:hover{background:#f6faf6}\r\n.bls-map-widget .map-shell{position:relative;min-width:0}\r\n.bls-map-widget .route-panel{margin-top:0;padding:16px 18px;background:var(--card);border-radius:16px;border:1px solid #d7e0d7;box-shadow:0 4px 12px rgba(0,0,0,.04);clear:both}\r\n.bls-map-widget .route-panel h3,.bls-map-widget .fullscreen-route-panel h3{margin:0 0 8px;font-size:16px}\r\n.bls-map-widget .route-panel p,.bls-map-widget .fullscreen-route-panel p{font-size:13px;margin:0 0 10px}\r\n.bls-map-widget .route-actions{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}\r\n.bls-map-widget .route-list{display:grid;gap:6px;margin-top:10px}\r\n.bls-map-widget .route-item{display:flex;justify-content:space-between;gap:10px;padding:8px 10px;border:1px solid #e6ece6;border-radius:10px;background:#fafcf9;font-size:13px}\r\n.bls-map-widget .route-item.leg-item{background:#f0f6f0;border-color:#d0e6d0;font-size:12px;padding:6px 10px}\r\n.bls-map-widget .route-summary,.bls-map-widget .fullscreen-summary{margin-top:10px;padding:10px 12px;border-radius:10px;background:#f5f8f5;border:1px solid #e2e9e2;font-size:13px;color:#3b4a42}\r\n.bls-map-widget .route-tag{display:inline-block;margin-left:6px;padding:2px 6px;border-radius:999px;background:#eaf4ea;border:1px solid #d6e6d6;font-size:11px;color:#35503f}\r\n.bls-map-widget .leg-arrow{color:#2e7d32;margin:0 4px;font-size:12px}\r\n.bls-map-widget .leg-dist{color:#173d2b;font-weight:600;white-space:nowrap}\r\n.bls-map-widget .select-btn{margin-top:8px;padding:8px 10px;border-radius:8px;border:1px solid rgba(0,0,0,.1);background:#fff;color:#173d2b;cursor:pointer;font:600 12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}\r\n.bls-map-widget .leaflet-routing-container{max-width:320px;font-size:12px}\r\n.bls-map-widget .fullscreen-map-modal{position:fixed;inset:0;z-index:99999;background:#f4f7f4;display:none}\r\n.bls-map-widget .fullscreen-map-modal.active{display:block}\r\n.bls-map-widget .fullscreen-route-panel{position:absolute;top:12px;left:12px;bottom:12px;width:min(360px,calc(100vw - 24px));z-index:1002;background:rgba(255,255,255,.97);border:1px solid rgba(0,0,0,.12);border-radius:16px;box-shadow:0 8px 24px rgba(0,0,0,.12);padding:16px 16px 14px;overflow:auto}\r\n.bls-map-widget .fullscreen-map-modal .leaflet-top.leaflet-right{top:0;right:0;z-index:1003}\r\n.bls-map-widget .fullscreen-map-modal .leaflet-top.leaflet-right .leaflet-control-layers{margin-top:12px}\r\n\r\n@media (max-width:1200px){.bls-map-widget .wrap{grid-template-columns:minmax(340px,36%) minmax(0,64%);padding:14px}}\r\n@media (max-width:980px){.bls-map-widget .wrap{grid-template-columns:1fr;padding:12px}.bls-map-widget .layout-main{order:1}.bls-map-widget .sidebar{order:2;max-height:none}.bls-map-widget .map-host{min-height:420px}.bls-map-widget .table-scroll{max-height:none}}\r\n@media (max-width:840px){.bls-map-widget .fullscreen-route-panel{top:auto;left:12px;right:12px;bottom:66px;width:auto;max-height:42vh}.bls-map-widget .fullscreen-map-modal .leaflet-top.leaflet-right .leaflet-control-layers{margin-top:64px}}\r\n@media (max-width:700px){.bls-map-widget .sidebar{padding:18px 16px 24px}.bls-map-widget table{font-size:12px}.bls-map-widget th,.bls-map-widget td{padding:7px 8px}.bls-map-widget .club-label{font-size:10px}.bls-map-widget .layout-main{grid-template-rows:minmax(360px,56vh) auto}}\r\n<\/style>\r\n\r\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" crossorigin=\"\"\/>\r\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet-routing-machine@3.2.12\/dist\/leaflet-routing-machine.css\" \/>\r\n\r\n<div class=\"bls-map-widget\" id=\"blsMapWidget\">\r\n  <div class=\"wrap\">\r\n    <aside class=\"sidebar\">\r\n      <h1>OWL-Fotoreichweite ab Bielefeld<\/h1>\r\n      <p>Karte mit Entfernungszonen, Vereinen und groben Fahrwerten f\u00fcr deine Einsatzplanung ab Bielefeld.<\/p>\r\n      <div class=\"legend\">\r\n        <div class=\"legend-item\"><span class=\"swatch\" style=\"background:var(--green1)\"><\/span><span>bis 10 km \u2013 sehr nah, schnell erreichbare Spiele<\/span><\/div>\r\n        <div class=\"legend-item\"><span class=\"swatch\" style=\"background:var(--green2)\"><\/span><span>ab 15 km \u2013 gut machbar im Alltag<\/span><\/div>\r\n        <div class=\"legend-item\"><span class=\"swatch\" style=\"background:var(--yellow)\"><\/span><span>ab 20 km \u2013 bewusst einplanen<\/span><\/div>\r\n        <div class=\"legend-item\"><span class=\"swatch\" style=\"background:var(--orange)\"><\/span><span>ab 30 km \u2013 eher gr\u00f6\u00dfere Spiele \/ besondere Anl\u00e4sse<\/span><\/div>\r\n        <div class=\"legend-item\"><span class=\"swatch\" style=\"background:var(--blue)\"><\/span><span>ab 40 bis 50 km \u2013 selten, viel Fahrzeit<\/span><\/div>\r\n      <\/div>\r\n      <div class=\"note\"><strong>Hinweis:<\/strong> Die Kilometer und Fahrzeiten in der Tabelle werden aus der Luftlinie mit einem typischen Stra\u00dfenfaktor grob gesch\u00e4tzt. Die Route selbst wird unten separat \u00fcber Stra\u00dfen berechnet.<\/div>\r\n      <div class=\"table-wrap\">\r\n        <h2>Vereine & Entfernungen<\/h2>\r\n        <p>Aus der aktuellen KML, nach Entfernung berechnet.<\/p>\r\n        <div class=\"table-scroll\">\r\n          <table>\r\n            <thead>\r\n              <tr><th>Verein<\/th><th>Adresse<\/th><th>ca. km<\/th><th>Fahrzeit<\/th><\/tr>\r\n            <\/thead>\r\n            <tbody class=\"clubs-tbody\"><\/tbody>\r\n          <\/table>\r\n        <\/div>\r\n      <\/div>\r\n    <\/aside>\r\n\r\n    <section class=\"layout-main\">\r\n      <div class=\"map-card\" style=\"position:relative;z-index:5\">\r\n        <div class=\"map-toolbar map-toolbar-outside\">\r\n          <button class=\"map-btn open-fullscreen-map\" type=\"button\">Karte gro\u00df anzeigen<\/button>\r\n          <button class=\"map-btn clear-route-btn\" type=\"button\">Route l\u00f6schen<\/button>\r\n        <\/div>\r\n        <div class=\"map-shell map-inner main-map-shell\"><div class=\"map-host\"><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"route-panel\">\r\n        <h3>Routenplanung<\/h3>\r\n        <p>Klicke bei Vereinen auf <strong>\u201eZur Route hinzuf\u00fcgen\u201c<\/strong>. Die Teilstrecken zwischen den Vereinen werden einzeln ausgewiesen.<\/p>\r\n        <div class=\"route-actions\">\r\n          <button class=\"map-btn clear-route-btn-panel\" type=\"button\">Route zur\u00fccksetzen<\/button>\r\n          <button class=\"map-btn build-route-btn\" type=\"button\">Route berechnen<\/button>\r\n          <button class=\"map-btn optimize-route-btn\" type=\"button\">Route optimieren<\/button>\r\n        <\/div>\r\n        <div class=\"route-list main-route-list\"><\/div>\r\n        <div class=\"route-summary main-route-summary\">Noch keine Route gew\u00e4hlt.<\/div>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n\r\n  <div class=\"fullscreen-map-modal\" aria-hidden=\"true\">\r\n    <div class=\"fullscreen-map-host\"><\/div>\r\n    <div class=\"fullscreen-route-panel\">\r\n      <div class=\"route-actions\" style=\"justify-content:flex-end;margin-top:0;margin-bottom:12px\">\r\n        <button class=\"map-btn close-fullscreen-map\" type=\"button\">Schlie\u00dfen<\/button>\r\n      <\/div>\r\n      <h3>Routenplanung im Vollbild<\/h3>\r\n      <p>Du kannst Vereine direkt im Vollbild \u00fcber die Marker-Popups zur Route hinzuf\u00fcgen.<\/p>\r\n      <div class=\"route-actions\">\r\n        <button class=\"map-btn fs-clear-route-btn\" type=\"button\">Route zur\u00fccksetzen<\/button>\r\n        <button class=\"map-btn fs-build-route-btn\" type=\"button\">Route berechnen<\/button>\r\n        <button class=\"map-btn fs-optimize-route-btn\" type=\"button\">Route optimieren<\/button>\r\n      <\/div>\r\n      <div class=\"route-list fs-route-list\"><\/div>\r\n      <div class=\"fullscreen-summary fs-route-summary\">Noch keine Route gew\u00e4hlt.<\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\" crossorigin=\"\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/leaflet-routing-machine@3.2.12\/dist\/leaflet-routing-machine.js\"><\/script>\r\n<script>\r\n(function(){\r\n  const widget = document.getElementById('blsMapWidget');\r\n  if(!widget || widget.dataset.initialized === '1') return;\r\n  widget.dataset.initialized = '1';\r\n\r\n  const MAPTILER_KEY = '4gvIZxQ3krW057nMSX1B';\r\n  const origin = [52.0089, 8.5706];\r\n\r\n  function haversine(lat1, lon1, lat2, lon2){\r\n    const R = 6371;\r\n    const dLat = (lat2-lat1)*Math.PI\/180, dLon = (lon2-lon1)*Math.PI\/180;\r\n    const a = Math.sin(dLat\/2)**2 + Math.cos(lat1*Math.PI\/180)*Math.cos(lat2*Math.PI\/180)*Math.sin(dLon\/2)**2;\r\n    return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\r\n  }\r\n  function estimateFromHome(lat, lon){\r\n    const km = haversine(origin[0], origin[1], lat, lon) * 1.18;\r\n    return { km: Math.round(km*10)\/10, mins: Math.max(1, Math.round((km\/45)*60)) };\r\n  }\r\n\r\n  const rawPlaces = [\r\n    {name:'VfB Fichte Bielefeld', addr:'M\u00fchlenstra\u00dfe 121, 33607 Bielefeld', lon:8.5630235, lat:52.0199558},\r\n    {name:'TuS Eintracht Bielefeld', addr:'Graudenzer Str 18, 33604 Bielefeld', lon:8.554422, lat:52.006845},\r\n    {name:'VfL Theesen', addr:'Gaudigstra\u00dfe 29, 33739 Bielefeld', lon:8.5235827, lat:52.0681899},\r\n    {name:'SV Ubbedissen', addr:'Pyrmonter Str 9, 33699 Bielefeld', lon:8.6349867, lat:51.9868287},\r\n    {name:'DSC Arminia Bielefeld', addr:'Stapenhorststra\u00dfe 100, 33615 Bielefeld', lon:8.5148078, lat:52.0316107},\r\n    {name:'TuS Dornberg', addr:'Kirchdornberger Str 46, 33619 Bielefeld', lon:8.4461487, lat:52.045895},\r\n    {name:'VfR Wellensiek', addr:'Erfahrung 20, 33619 Bielefeld', lon:8.4974104, lat:52.0392019},\r\n    {name:'TuS Hoberge-Uerentrup', addr:'Bergstra\u00dfe 17, 33619 Bielefeld', lon:8.4656257, lat:52.0222818},\r\n    {name:'SC Halle', addr:'Wasserwerkstra\u00dfe 1b, 33790 Halle (Westfalen)', lon:8.3531112, lat:52.0494873},\r\n    {name:'VfL Schildesche', addr:'Talbr\u00fcckenstra\u00dfe 130, 33609 Bielefeld', lon:8.5705793, lat:52.0527548},\r\n    {name:'TuS Einigkeit Hillegossen', addr:'Selhausenstra\u00dfe 102, 33699 Bielefeld', lon:8.6019146, lat:51.9857454},\r\n    {name:'TuS 08 Senne I', addr:'Am Waldbad 72, 33659 Bielefeld', lon:8.5266708, lat:51.9619498},\r\n    {name:'SC Peckeloh', addr:'Am Wiedenfeld 4, 33775 Versmold', lon:8.1319193, lat:52.018464},\r\n    {name:'SC 04\/26 Bielefeld', addr:'Am Meierteich, 33613 Bielefeld', lon:8.5257874, lat:52.0438467},\r\n    {name:'SC Verl', addr:'Sender Str 36, 33415 Verl', lon:8.5135835, lat:51.8843441},\r\n    {name:'TuS J\u00f6llenbeck', addr:'Naturstadion 12b, 33739 Bielefeld', lon:8.5278124, lat:52.0865546},\r\n    {name:'TuS Quelle', addr:'Gottfriedstra\u00dfe 10, 33649 Bielefeld', lon:8.4899939, lat:51.9997654},\r\n    {name:'SV Heepen', addr:'L\u00fcbrasser Weg 31, 33719 Bielefeld', lon:8.616958, lat:52.026885},\r\n    {name:'TuS Ost', addr:'Radrennbahnweg 50A, 33609 Bielefeld', lon:8.5815211, lat:52.0346887},\r\n    {name:'TuS Brake', addr:'Lohrenkamp 37, 33729 Bielefeld', lon:8.5917887, lat:52.0743582},\r\n    {name:'VfL Ummeln', addr:'Tr\u00fcggelbachstra\u00dfe 28, 33649 Bielefeld', lon:8.4621148, lat:51.9680783},\r\n    {name:'Spvg. Steinhagen', addr:'Am Cronsbach 10, 33803 Steinhagen', lon:8.4231925, lat:51.9987135},\r\n    {name:'FC Altenhagen', addr:'Milser Str 132, 33729 Bielefeld', lon:8.6342478, lat:52.0557012},\r\n    {name:'SV R\u00f6dinghausen', addr:'Auf d Drift 36, 32289 R\u00f6dinghausen', lon:8.5066959, lat:52.2499652},\r\n    {name:'TV Friesen Milse', addr:'Milser Str 40, 33729 Bielefeld', lon:8.6085219, lat:52.0574447},\r\n    {name:'SV Avenwedde', addr:'Gazellenweg 16, 33335 G\u00fctersloh', lon:8.446701, lat:51.9304111},\r\n    {name:'TuS Langenheide', addr:'Langenheider Str 33, 33824 Werther (Westfalen)', lon:8.3931561, lat:52.1006012},\r\n    {name:'SV Eidinghausen-Werste', addr:'Jahnstra\u00dfe 46, 32549 Bad Oeynhausen', lon:8.77051, lat:52.20933},\r\n    {name:'VfL Oldentrup', addr:'Kr\u00e4henwinkel 4, 33719 Bielefeld', lon:8.6068968, lat:52.0104094},\r\n    {name:'TuS GW Podinghausen', addr:'Am Sportpl 6, 32130 Enger', lon:8.5423124, lat:52.1180611},\r\n    {name:'VfB Schloss Holte 1919', addr:'Oerlinghauser Str. 37, 33758 Schlo\u00df Holte-Stukenbrock', lon:8.6090765, lat:51.9141008},\r\n    {name:'BV Werther', addr:'Teutoburger-Wald-Weg, 33824 Werther', lon:8.4092322, lat:52.0655363},\r\n    {name:'BW 98 G\u00fctersloh', addr:'Pavenst\u00e4dter Weg, 33334 G\u00fctersloh', lon:8.3398131, lat:51.9096257},\r\n    {name:'SV H\u00e4ger', addr:'Schr\u00f6ttinghausener Str 14, 33824 Werther (Westfalen)', lon:8.452828, lat:52.0940885},\r\n    {name:'SpVg. Versmold', addr:'Schulstra\u00dfe 14, 33775 Versmold', lon:8.1515125, lat:52.0418881},\r\n    {name:'SC GW Espeln', addr:'Heideweg 41, 33161 H\u00f6velhof', lon:8.5937513, lat:51.8201668},\r\n    {name:'FC GW Kirchlengern', addr:'Schelmenbrink 17, 32278 Kirchlengern', lon:8.6552284, lat:52.1933166},\r\n    {name:'FC G\u00fctersloh', addr:'Alter Hellweg, 33334 G\u00fctersloh', lon:8.3648184, lat:51.8840168},\r\n    {name:'SV Spexard', addr:'Bruder-Konrad-Stra\u00dfe 100, 33334 G\u00fctersloh', lon:8.4097334, lat:51.8817527},\r\n    {name:'SV Werl-Aspe', addr:'Paul-Schneider-Stra\u00dfe, 32107 Bad Salzuflen-Werl-Aspe', lon:8.7317832, lat:52.0634785},\r\n    {name:'TSV Amshausen', addr:'Amshausener Str 87, 33803 Steinhagen', lon:8.4050668, lat:52.0268659},\r\n    {name:'SpVg Oelde', addr:'Kreuzstra\u00dfe 22, 59302 Oelde', lon:8.1592658, lat:51.8241018},\r\n    {name:'SV Gadderbaum', addr:'An d Rehwiese 64, 33617 Bielefeld', lon:8.5238, lat:52.00437}\r\n  ];\r\n\r\n  const places = rawPlaces.map(p => {\r\n    const est = estimateFromHome(p.lat, p.lon);\r\n    return {...p, km: est.km, mins: est.mins};\r\n  }).sort((a,b) => a.km - b.km);\r\n\r\n  const zones = [\r\n    {r:10000,color:'#b7e4a8',fillOpacity:0.35},\r\n    {r:15000,color:'#2e7d32',fillOpacity:0.18},\r\n    {r:20000,color:'#f2c94c',fillOpacity:0.18},\r\n    {r:30000,color:'#f2994a',fillOpacity:0.16},\r\n    {r:50000,color:'#4f86c6',fillOpacity:0.14}\r\n  ];\r\n\r\n  const tbody = widget.querySelector('.clubs-tbody');\r\n  const mapHost = widget.querySelector('.map-host');\r\n  const fullscreenMapHost = widget.querySelector('.fullscreen-map-host');\r\n  const mainRouteList = widget.querySelector('.main-route-list');\r\n  const mainRouteSummary = widget.querySelector('.main-route-summary');\r\n  const fsRouteList = widget.querySelector('.fs-route-list');\r\n  const fsRouteSummary = widget.querySelector('.fs-route-summary');\r\n  const fullscreenModal = widget.querySelector('.fullscreen-map-modal');\r\n\r\n  function createMapLayers(targetMap){\r\n    targetMap.createPane('routeLabels');\r\n    targetMap.getPane('routeLabels').style.zIndex = 650;\r\n    targetMap.getPane('routeLabels').style.pointerEvents = 'none';\r\n\r\n    const common = {\r\n      tileSize: 512,\r\n      zoomOffset: -1,\r\n      minZoom: 1,\r\n      maxZoom: 20,\r\n      attribution: '<a href=\"https:\/\/www.maptiler.com\/copyright\/\" target=\"_blank\" rel=\"noopener noreferrer\">&copy; MapTiler<\/a> <a href=\"https:\/\/www.openstreetmap.org\/copyright\" target=\"_blank\" rel=\"noopener noreferrer\">&copy; OpenStreetMap-Mitwirkende<\/a>',\r\n      crossOrigin: true\r\n    };\r\n\r\n    const streets = L.tileLayer(`https:\/\/api.maptiler.com\/maps\/streets-v2\/{z}\/{x}\/{y}.png?key=${MAPTILER_KEY}`, common);\r\n    const satellite = L.tileLayer(`https:\/\/api.maptiler.com\/maps\/satellite\/{z}\/{x}\/{y}.jpg?key=${MAPTILER_KEY}`, common);\r\n    const outdoor = L.tileLayer(`https:\/\/api.maptiler.com\/maps\/outdoor-v2\/{z}\/{x}\/{y}.png?key=${MAPTILER_KEY}`, common);\r\n    const labels = L.tileLayer(`https:\/\/api.maptiler.com\/maps\/hybrid\/{z}\/{x}\/{y}.jpg?key=${MAPTILER_KEY}`, {...common, pane:'routeLabels'});\r\n    const satelliteWithLabels = L.layerGroup([satellite, labels]);\r\n\r\n    return { streets, satellite, satelliteWithLabels, outdoor };\r\n  }\r\n\r\n  function addBaseLayerControl(targetMap, layers){\r\n    L.control.layers(\r\n      {\r\n        'Stra\u00dfenkarte': layers.streets,\r\n        'Satellit': layers.satellite,\r\n        'Satellit + Stra\u00dfennamen': layers.satelliteWithLabels,\r\n        'Outdoor': layers.outdoor\r\n      },\r\n      null,\r\n      { collapsed: false }\r\n    ).addTo(targetMap);\r\n  }\r\n\r\n  function addZones(targetMap){\r\n    const zoneLayer = L.layerGroup();\r\n    zones.slice().reverse().forEach(z => L.circle(origin,{radius:z.r,color:z.color,weight:2,fillColor:z.color,fillOpacity:z.fillOpacity}).addTo(zoneLayer));\r\n\r\n    function syncZoneVisibility(){\r\n      const zoom = targetMap.getZoom();\r\n      const shouldShow = zoom <= 13;\r\n      if(shouldShow && !targetMap.hasLayer(zoneLayer)) targetMap.addLayer(zoneLayer);\r\n      if(!shouldShow && targetMap.hasLayer(zoneLayer)) targetMap.removeLayer(zoneLayer);\r\n    }\r\n\r\n    targetMap.on('zoomend', syncZoneVisibility);\r\n    syncZoneVisibility();\r\n    return zoneLayer;\r\n  }\r\n\r\n  function buildPopupHtml(place, useFullscreenAdd){\r\n    const safeName = place.name.replace(\/'\/g, \"\\\\'\");\r\n    const addAction = useFullscreenAdd\r\n      ? `<br><button class=\"select-btn\" type=\"button\" onclick=\"window.__blsAddClubFs('${safeName}')\">Zur Route hinzuf\u00fcgen<\/button>`\r\n      : `<br><button class=\"select-btn\" type=\"button\" onclick=\"window.__blsAddClubMain('${safeName}')\">Zur Route hinzuf\u00fcgen<\/button>`;\r\n    return `<strong>${place.name}<\/strong><br>${place.addr}${addAction}<br><small>ca. ${place.km} km \u00b7 etwa ${place.mins} Min. ab Bielefeld<\/small>`;\r\n  }\r\n\r\n  function addMarkers(targetMap, useFullscreenAdd){\r\n    const group = L.layerGroup().addTo(targetMap);\r\n    places.forEach(p => {\r\n      const popupHtml = buildPopupHtml(p, useFullscreenAdd);\r\n      const m = L.circleMarker([p.lat,p.lon],{radius:6,color:'#173d2b',fillColor:'#ffffff',fillOpacity:1,weight:2}).addTo(group);\r\n      const lbl = L.marker([p.lat,p.lon],{icon:L.divIcon({className:'club-label',html:p.name,iconSize:null,iconAnchor:[-6,10]})}).addTo(group);\r\n      m.bindPopup(popupHtml);\r\n      lbl.bindPopup(popupHtml);\r\n    });\r\n  }\r\n\r\n  const map = L.map(mapHost, {zoomControl:true}).setView(origin, 11);\r\n  const mainBaseLayers = createMapLayers(map);\r\n  mainBaseLayers.streets.addTo(map);\r\n  addBaseLayerControl(map, mainBaseLayers);\r\n  addZones(map);\r\n  addMarkers(map, false);\r\n\r\n  tbody.innerHTML = places.map(p => `<tr><td>${p.name}<\/td><td>${p.addr}<\/td><td>${p.km}<\/td><td>${p.mins} Min.<\/td><\/tr>`).join('');\r\n\r\n  let selectedRoute = [];\r\n  let routeReady = false;\r\n  let legData = [];\r\n  let routeControlInstance = null;\r\n  let fullscreenRouteControl = null;\r\n  let fullscreenMapInstance = null;\r\n\r\n  function fmtKm(m){ return (m\/1000).toFixed(1).replace('.',',')+' km'; }\r\n  function fmtMin(s){ return Math.round(s\/60)+' Min.'; }\r\n\r\n  window.__blsAddClubMain = function(name){\r\n    const club = places.find(p => p.name === name);\r\n    if(club) addToRoute(club);\r\n  };\r\n  window.__blsAddClubFs = function(name){\r\n    const club = places.find(p => p.name === name);\r\n    if(club) addToRoute(club, true);\r\n  };\r\n\r\n  function renderRouteListInto(container){\r\n    container.innerHTML='';\r\n    if(selectedRoute.length === 0){\r\n      container.innerHTML='<div style=\"color:var(--muted);font-size:13px;padding:6px 2px;\">Noch keine Vereine hinzugef\u00fcgt.<\/div>';\r\n      return;\r\n    }\r\n    selectedRoute.forEach((item, index) => {\r\n      const isFirst = index === 0;\r\n      const isLast = index === selectedRoute.length - 1;\r\n      const tag = isFirst ? 'Start' : (isLast ? 'Ziel' : 'Stopp');\r\n      const row = document.createElement('div');\r\n      row.className = 'route-item';\r\n      row.innerHTML = `<div><strong>${index+1}. ${item.name}<\/strong><span class=\"route-tag\">${tag}<\/span><br><small style=\"color:var(--muted)\">${item.addr}<\/small><\/div><div><button class=\"select-btn\" data-remove=\"${index}\">Entfernen<\/button><\/div>`;\r\n      container.appendChild(row);\r\n      if(!isLast){\r\n        const leg = legData[index];\r\n        const legRow = document.createElement('div');\r\n        legRow.className = 'route-item leg-item';\r\n        if(leg){\r\n          legRow.innerHTML = `<div style=\"display:flex;align-items:center;gap:4px;flex-wrap:wrap;\"><span style=\"font-size:11px;color:var(--muted);\">${item.name}<\/span><span class=\"leg-arrow\">\u2192<\/span><span style=\"font-size:11px;color:var(--muted);\">${selectedRoute[index+1].name}<\/span><\/div><span class=\"leg-dist\">${fmtKm(leg.dist)} \u00b7 ${fmtMin(leg.time)}<\/span>`;\r\n        } else {\r\n          legRow.innerHTML = `<div style=\"display:flex;align-items:center;gap:4px;\"><span class=\"leg-arrow\">\u2193<\/span><span style=\"font-size:11px;color:var(--muted);\">Teilstrecke wird berechnet \u2026<\/span><\/div>`;\r\n        }\r\n        container.appendChild(legRow);\r\n      }\r\n    });\r\n    container.querySelectorAll('[data-remove]').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        selectedRoute.splice(Number(btn.dataset.remove), 1);\r\n        legData = [];\r\n        routeReady = false;\r\n        syncUiAfterSelectionChange();\r\n      });\r\n    });\r\n  }\r\n\r\n  function renderBothRouteLists(){\r\n    renderRouteListInto(mainRouteList);\r\n    renderRouteListInto(fsRouteList);\r\n  }\r\n\r\n  function updateBothSummaries(text, html=false){\r\n    if(html){\r\n      mainRouteSummary.innerHTML = text;\r\n      fsRouteSummary.innerHTML = text;\r\n    } else {\r\n      mainRouteSummary.textContent = text;\r\n      fsRouteSummary.textContent = text;\r\n    }\r\n  }\r\n\r\n  function clearMainRouteControl(){\r\n    if(routeControlInstance){\r\n      try{ map.removeControl(routeControlInstance); }catch(e){}\r\n      routeControlInstance = null;\r\n    }\r\n    widget.querySelectorAll('.map-card .leaflet-routing-container,.map-card .leaflet-routing-alt,.map-card .leaflet-routing-error').forEach(el=>el.remove());\r\n  }\r\n\r\n  function clearFullscreenRouteControl(){\r\n    if(fullscreenMapInstance && fullscreenRouteControl){\r\n      try{ fullscreenMapInstance.removeControl(fullscreenRouteControl); }catch(e){}\r\n      fullscreenRouteControl = null;\r\n    }\r\n    fullscreenModal.querySelectorAll('.leaflet-routing-container,.leaflet-routing-alt,.leaflet-routing-error').forEach(el=>el.remove());\r\n  }\r\n\r\n  async function fetchLegs(route){\r\n    const results = [];\r\n    for(let i = 0; i < route.length - 1; i++){\r\n      const a = route[i], b = route[i+1];\r\n      try{\r\n        const url = `https:\/\/router.project-osrm.org\/route\/v1\/driving\/${a.lon},${a.lat};${b.lon},${b.lat}?overview=false`;\r\n        const res = await fetch(url);\r\n        const data = await res.json();\r\n        if(data.routes && data.routes[0]) results.push({ dist: data.routes[0].distance, time: data.routes[0].duration });\r\n        else results.push(null);\r\n      } catch(e){ results.push(null); }\r\n    }\r\n    return results;\r\n  }\r\n\r\n  function syncUiAfterSelectionChange(){\r\n    renderBothRouteLists();\r\n    clearMainRouteControl();\r\n    clearFullscreenRouteControl();\r\n    if(selectedRoute.length < 1){\r\n      updateBothSummaries('Noch keine Route gew\u00e4hlt. F\u00fcge Vereine hinzu, um eine Route zu planen.');\r\n      return;\r\n    }\r\n    if(!routeReady){\r\n      updateBothSummaries('Vereine ausgew\u00e4hlt. Klicke auf \u201eRoute berechnen\u201c, um Strecken und Fahrzeiten zu sehen.');\r\n      return;\r\n    }\r\n    if(selectedRoute.length < 2){\r\n      updateBothSummaries('F\u00fcr eine Route werden mindestens zwei Vereine ben\u00f6tigt.');\r\n      return;\r\n    }\r\n    updateBothSummaries('Berechne Teilstrecken \u2026');\r\n    buildMainRoute();\r\n    buildFullscreenRoute();\r\n    fetchLegs(selectedRoute).then(legs => {\r\n      legData = legs;\r\n      renderBothRouteLists();\r\n      const totalDist = legs.reduce((s, l) => s + (l ? l.dist : 0), 0);\r\n      const totalTime = legs.reduce((s, l) => s + (l ? l.time : 0), 0);\r\n      if(totalDist > 0) updateBothSummaries(`<strong>Gesamt:<\/strong> ${fmtKm(totalDist)} \u00b7 ${fmtMin(totalTime)}`, true);\r\n      else updateBothSummaries('Teilstrecken konnten nicht berechnet werden.');\r\n    });\r\n  }\r\n\r\n  function buildMainRoute(){\r\n    routeControlInstance = L.Routing.control({\r\n      show:false,\r\n      waypoints:selectedRoute.map(p=>L.latLng(p.lat,p.lon)),\r\n      routeWhileDragging:false,\r\n      addWaypoints:false,\r\n      draggableWaypoints:false,\r\n      fitSelectedRoutes:true,\r\n      showAlternatives:false,\r\n      lineOptions:{styles:[{color:'#1a1a1a',opacity:0.35,weight:12},{color:'#ffffff',opacity:0.96,weight:8},{color:'#ff6d00',opacity:0.98,weight:5}]},\r\n      createMarker:()=>null,\r\n      router:L.Routing.osrmv1({serviceUrl:'https:\/\/router.project-osrm.org\/route\/v1'})\r\n    }).addTo(map);\r\n    routeControlInstance.on('routingerror',()=>{ updateBothSummaries('Route konnte gerade nicht berechnet werden.'); });\r\n  }\r\n\r\n  function initFullscreenMap(){\r\n    if(fullscreenMapInstance) return;\r\n    fullscreenMapInstance = L.map(fullscreenMapHost, {zoomControl:true}).setView(origin, 11);\r\n    const fullscreenBaseLayers = createMapLayers(fullscreenMapInstance);\r\n    fullscreenBaseLayers.streets.addTo(fullscreenMapInstance);\r\n    addBaseLayerControl(fullscreenMapInstance, fullscreenBaseLayers);\r\n    addZones(fullscreenMapInstance);\r\n    addMarkers(fullscreenMapInstance, true);\r\n  }\r\n\r\n  function buildFullscreenRoute(){\r\n    if(!fullscreenMapInstance) return;\r\n    fullscreenRouteControl = L.Routing.control({\r\n      show:false,\r\n      waypoints:selectedRoute.map(p=>L.latLng(p.lat,p.lon)),\r\n      routeWhileDragging:false,\r\n      addWaypoints:false,\r\n      draggableWaypoints:false,\r\n      fitSelectedRoutes:true,\r\n      showAlternatives:false,\r\n      lineOptions:{styles:[{color:'#1a1a1a',opacity:0.35,weight:12},{color:'#ffffff',opacity:0.96,weight:8},{color:'#ff6d00',opacity:0.98,weight:5}]},\r\n      createMarker:()=>null,\r\n      router:L.Routing.osrmv1({serviceUrl:'https:\/\/router.project-osrm.org\/route\/v1'})\r\n    }).addTo(fullscreenMapInstance);\r\n    fullscreenRouteControl.on('routingerror',()=>{ updateBothSummaries('Route konnte im Vollbild nicht berechnet werden.'); });\r\n  }\r\n\r\n  function addToRoute(place, keepFullscreenOpen=false){\r\n    if(selectedRoute.some(p => p.name === place.name)){\r\n      updateBothSummaries('Der Verein ist bereits in der Route enthalten.');\r\n      return;\r\n    }\r\n    selectedRoute.push(place);\r\n    legData = [];\r\n    routeReady = false;\r\n    renderBothRouteLists();\r\n    updateBothSummaries('Verein hinzugef\u00fcgt. Klicke auf \u201eRoute berechnen\u201c, um Strecken zu berechnen.');\r\n    if(keepFullscreenOpen && fullscreenMapInstance){\r\n      setTimeout(() => fullscreenMapInstance.invalidateSize(), 100);\r\n    }\r\n  }\r\n\r\n  function resetRoute(){\r\n    selectedRoute = [];\r\n    legData = [];\r\n    routeReady = false;\r\n    clearMainRouteControl();\r\n    clearFullscreenRouteControl();\r\n    renderBothRouteLists();\r\n    updateBothSummaries('Route zur\u00fcckgesetzt. W\u00e4hle Vereine aus, um eine neue Route zu planen.');\r\n  }\r\n\r\n  async function optimizeRouteOrder(){\r\n    if(selectedRoute.length < 2){\r\n      updateBothSummaries('F\u00fcr eine Optimierung werden mindestens zwei Vereine ben\u00f6tigt.');\r\n      return;\r\n    }\r\n    const coords = selectedRoute.map(p => `${p.lon},${p.lat}`).join(';');\r\n    const url = `https:\/\/router.project-osrm.org\/trip\/v1\/driving\/${coords}?source=first&destination=last&roundtrip=false&steps=false&geometries=geojson&overview=full`;\r\n    updateBothSummaries('Optimiere Route \u2026');\r\n    try{\r\n      const res = await fetch(url);\r\n      const data = await res.json();\r\n      if(!data.trips || !data.trips.length || !data.waypoints){\r\n        updateBothSummaries('Optimierung konnte nicht berechnet werden.');\r\n        return;\r\n      }\r\n      const ordered = data.waypoints.slice().sort((a,b) => a.waypoint_index - b.waypoint_index).map(wp => selectedRoute[wp.trip_index]);\r\n      selectedRoute = ordered.filter(Boolean);\r\n      legData = [];\r\n      routeReady = true;\r\n      syncUiAfterSelectionChange();\r\n    }catch(err){\r\n      updateBothSummaries('Optimierung gerade nicht verf\u00fcgbar.');\r\n    }\r\n  }\r\n\r\n  function calculateRoute(){\r\n    if(selectedRoute.length < 2){\r\n      updateBothSummaries('Bitte mindestens zwei Vereine zur Route hinzuf\u00fcgen.');\r\n      return;\r\n    }\r\n    legData = [];\r\n    routeReady = true;\r\n    syncUiAfterSelectionChange();\r\n  }\r\n\r\n  function openFullscreen(){\r\n    fullscreenModal.classList.add('active');\r\n    fullscreenModal.setAttribute('aria-hidden','false');\r\n    document.body.style.overflow='hidden';\r\n    initFullscreenMap();\r\n    setTimeout(() => {\r\n      fullscreenMapInstance.invalidateSize();\r\n      if(routeReady && selectedRoute.length >= 2){\r\n        clearFullscreenRouteControl();\r\n        buildFullscreenRoute();\r\n      }\r\n    }, 220);\r\n  }\r\n\r\n  function closeFullscreen(){\r\n    fullscreenModal.classList.remove('active');\r\n    fullscreenModal.setAttribute('aria-hidden','true');\r\n    document.body.style.overflow='';\r\n  }\r\n\r\n  widget.querySelector('.clear-route-btn').addEventListener('click', resetRoute);\r\n  widget.querySelector('.clear-route-btn-panel').addEventListener('click', resetRoute);\r\n  widget.querySelector('.fs-clear-route-btn').addEventListener('click', resetRoute);\r\n  widget.querySelector('.build-route-btn').addEventListener('click', calculateRoute);\r\n  widget.querySelector('.fs-build-route-btn').addEventListener('click', calculateRoute);\r\n  widget.querySelector('.optimize-route-btn').addEventListener('click', optimizeRouteOrder);\r\n  widget.querySelector('.fs-optimize-route-btn').addEventListener('click', optimizeRouteOrder);\r\n  widget.querySelector('.open-fullscreen-map').addEventListener('click', openFullscreen);\r\n  widget.querySelector('.close-fullscreen-map').addEventListener('click', closeFullscreen);\r\n  fullscreenModal.addEventListener('click', e => { if(e.target === fullscreenModal) closeFullscreen(); });\r\n  document.addEventListener('keydown', e => { if(e.key === 'Escape' && fullscreenModal.classList.contains('active')) closeFullscreen(); });\r\n\r\n  renderBothRouteLists();\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Interaktive KarteN\u00e4chste Termine Interaktive Karte OWL-Fotoreichweite ab Bielefeld Karte mit Entfernungszonen, Vereinen und groben Fahrwerten f\u00fcr deine Einsatzplanung ab Bielefeld. bis 10 km \u2013 sehr nah, schnell erreichbare Spiele ab 15 km \u2013 gut machbar im Alltag ab 20 km \u2013 bewusst einplanen ab 30 km \u2013 eher gr\u00f6\u00dfere Spiele \/ besondere Anl\u00e4sse ab 40 &#8230; <a title=\"Interactive route\" class=\"read-more\" href=\"https:\/\/blickpunkt-lokalsport.de\/english\/interaktive-karte\/\" aria-label=\"Read more about Interaktive Karte\">Read more<\/a><\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-48468","page","type-page","status-publish"],"acf":[],"_links":{"self":[{"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/pages\/48468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/comments?post=48468"}],"version-history":[{"count":10,"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/pages\/48468\/revisions"}],"predecessor-version":[{"id":52265,"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/pages\/48468\/revisions\/52265"}],"wp:attachment":[{"href":"https:\/\/blickpunkt-lokalsport.de\/english\/wp-json\/wp\/v2\/media?parent=48468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}