<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
  <meta http-equiv="Pragma" content="no-cache">
  <meta http-equiv="Expires" content="0">
  <!-- SEO Meta (angelehnt an bense.ai) -->
<title>robby – Push-Alerts für relevante Ereignisse</title>
<meta name="description" content="Keine wichtigen Termine und Events verpassen: robby sendet Push-Benachrichtigungen zu Kalender, Sport, Formel 1 und mehr.">
<meta name="keywords" content="robby, Push-Alerts, Kalender, Events, Benachrichtigungen, Termine, Sport, Formel 1">
<meta name="author" content="robby">
<meta name="robots" content="index, follow">

<!-- Open Graph -->
<meta property="og:title" content="robby – Push-Alerts für relevante Ereignisse">
<meta property="og:description" content="Keine wichtigen Termine und Events verpassen: robby sendet Push-Benachrichtigungen zu Kalender, Sport, Formel 1 und mehr.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://rob.by/index.php?lang=de&amp;view=calendar">
<meta property="og:site_name" content="robby">
<meta property="og:image" content="https://rob.by/images/robot/rObby.png">
<meta property="og:locale" content="de_DE">

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="robby – Push-Alerts für relevante Ereignisse">
<meta name="twitter:description" content="Keine wichtigen Termine und Events verpassen: robby sendet Push-Benachrichtigungen zu Kalender, Sport, Formel 1 und mehr.">
<meta name="twitter:image" content="https://rob.by/images/robot/rObby.png">

<!-- Canonical -->
<link rel="canonical" href="https://rob.by/index.php?lang=de&amp;view=calendar">

<!-- Language Alternates (Hreflang) -->
<link rel="alternate" hreflang="de" href="https://rob.by/index.php?lang=de&amp;view=calendar">
<link rel="alternate" hreflang="en" href="https://rob.by/index.php?lang=en&amp;view=calendar">
<link rel="alternate" hreflang="fr" href="https://rob.by/index.php?lang=fr&amp;view=calendar">
<link rel="alternate" hreflang="es" href="https://rob.by/index.php?lang=es&amp;view=calendar">
<link rel="alternate" hreflang="it" href="https://rob.by/index.php?lang=it&amp;view=calendar">
<link rel="alternate" hreflang="pt" href="https://rob.by/index.php?lang=pt&amp;view=calendar">
<link rel="alternate" hreflang="nl" href="https://rob.by/index.php?lang=nl&amp;view=calendar">
<link rel="alternate" hreflang="pl" href="https://rob.by/index.php?lang=pl&amp;view=calendar">
<link rel="alternate" hreflang="ru" href="https://rob.by/index.php?lang=ru&amp;view=calendar">
<link rel="alternate" hreflang="zh" href="https://rob.by/index.php?lang=zh&amp;view=calendar">

<!-- JSON-LD (Organization + WebApplication) -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebApplication",
  "name": "robby",
  "url": "https://rob.by",
  "description": "Keine wichtigen Termine und Events verpassen: robby sendet Push-Benachrichtigungen zu Kalender, Sport, Formel 1 und mehr.",
  "applicationCategory": "Utilities",
  "operatingSystem": "Web"
}
</script>
  <!-- Icon für „Zum Home-Bildschirm“ (iPhone/Safari): rObby-Roboter -->
  <link rel="apple-touch-icon" sizes="180x180" href="images/robot/rObby.png">
  <link rel="apple-touch-icon" href="images/robot/rObby.png">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="css/robby.css?v=1774077710">
  <link rel="stylesheet" href="css/robby-views.css?v=1774261891">
      <script src="js/robby-init.js"></script>
  <script src="js/robby-sounds.js"></script>
    <script>
  window.robbyConfig = {
    lang: "de",
    defaultLang: 'de',
    translationsLoaded: true,
    loggedIn: false,
    geoTracking: false,
    page: 'robby',
    sessionId: "da965774ec23\u2026",
    sessionRestore: {
      sessionActive: true,
      hasUserId: false,
      userId: null,
      gender: null,
      sessionRestored: false,
      loginTime: null,
      debug: {"lastRun":"no_token","note":"Kein session_token\/token in URL","loginHint":"Nach Login: Redirect mit session_token in URL erwartet."}    },
    robby: { loggedIn: false, userIcon: "login_72.png" },
    dbEnvMasked: {"env":"prod","PROD_DB_HOST":"17***79","PROD_DB_NAME":"ol***go","PROD_DB_USER":"u5***56","PROD_DB_PASS":"***(18 Zeichen)"},
    firebaseEnvMasked: {"FIREBASE_SENDER_ID":"46***24","FIREBASE_VAPID_KEY":"BG***e4","FIREBASE_SERVICE_ACCOUNT_JSON":"pr***on"}  };
  </script>
  <script src="js/robby-log.js"></script>
</head>
<body class="robby robby-app">
        <header class="robby-app-header" role="banner">
  <div class="robby-app-header__inner">
    <div class="robby-app-header__logo">
      <a href="index.php" class="robby-app-logo-link">
        <img src="images/robot/rObby_finds.gif" alt="robby" class="robby-app-logo">
      </a>
    </div>
    <div class="robby-app-header__left">
          <div class="robby-app-lang-wrap" aria-label="Sprache wählen">
      <button type="button" class="robby-app-lang-trigger" id="robby-app-lang-trigger" aria-label="Sprache wählen" aria-expanded="false" aria-controls="robby-app-lang-list">
                <img src="images/flags_png/Germany.png" alt="Deutsch" width="24" height="18">
      </button>
      <div class="robby-app-lang-dropdown" id="robby-app-lang-list" role="listbox">
                                  <a href="index.php?lang=de&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag robby-app-lang-flag--active" title="Deutsch" aria-current="true">
          <img src="images/flags_png/Germany.png" alt="" width="24" height="18">
          <span>Deutsch</span>
        </a>
                                  <a href="index.php?lang=en&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="English">
          <img src="images/flags_png/United_Kingdom.png" alt="" width="24" height="18">
          <span>English</span>
        </a>
                                  <a href="index.php?lang=fr&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Français">
          <img src="images/flags_png/France.png" alt="" width="24" height="18">
          <span>Français</span>
        </a>
                                  <a href="index.php?lang=es&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Español">
          <img src="images/flags_png/Spain.png" alt="" width="24" height="18">
          <span>Español</span>
        </a>
                                  <a href="index.php?lang=it&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Italiano">
          <img src="images/flags_png/Italy.png" alt="" width="24" height="18">
          <span>Italiano</span>
        </a>
                                  <a href="index.php?lang=pt&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Português">
          <img src="images/flags_png/Portugal.png" alt="" width="24" height="18">
          <span>Português</span>
        </a>
                                  <a href="index.php?lang=nl&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Nederlands">
          <img src="images/flags_png/Netherlands.png" alt="" width="24" height="18">
          <span>Nederlands</span>
        </a>
                                  <a href="index.php?lang=pl&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Polski">
          <img src="images/flags_png/Poland.png" alt="" width="24" height="18">
          <span>Polski</span>
        </a>
                                  <a href="index.php?lang=ru&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="Русский">
          <img src="images/flags_gif/RUS.gif" alt="" width="24" height="18">
          <span>Русский</span>
        </a>
                                  <a href="index.php?lang=zh&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-lang-flag" title="中文">
          <img src="images/flags_png/China.png" alt="" width="24" height="18">
          <span>中文</span>
        </a>
              </div>
    </div>
            <a href="https://rob.by/keycloak-login.php" class="robby-btn robby-btn--primary robby-btn--touch-min robby-app-login-btn" id="robby-app-login-link">Anmelden</a>
            <a href="index.php?lang=de&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation#settings" class="robby-app-settings-icon robby-app-user-icon robby-app-doc-open" data-doc-modal="robby-settings-modal" aria-label="Einstellungen" title="Einstellungen">
        <img src="images/icons/support_72px.png" alt="">
      </a>
                  <a href="index.php?lang=de&amp;view=channels&amp;channels=fussball,formel1,presentation" class="robby-app-channels-icon robby-app-user-icon" id="robby-app-channels-icon" aria-label="Kanäle" title="Kanäle">
        <img src="images/icons/puzzle_72px.png" alt="">
      </a>
          </div>
    <div class="robby-app-header__nav-wrap">
      <button type="button" class="robby-app-burger" id="robby-app-burger" aria-label="Menü öffnen" aria-expanded="false" aria-controls="robby-app-menu">
        <span aria-hidden="true"></span>
        <span aria-hidden="true"></span>
        <span aria-hidden="true"></span>
      </button>
      <nav class="robby-app-nav" id="robby-app-menu" aria-label="Hauptmenü">
        <div class="robby-app-nav__scroll">
          <ul class="robby-app-nav__list">
                                    <li><a href="index.php?lang=de&amp;view=channels&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/puzzle_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Kanäle</span></a></li>
                        <li><a href="index.php?lang=de&amp;view=contact&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/chat_72.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Kontakt</span></a></li>
                        <li><a href="index.php?lang=de&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation#settings" class="robby-app-nav__link robby-app-doc-open" data-doc-modal="robby-settings-modal" aria-haspopup="dialog"><img src="images/icons/support_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Einstellungen</span></a></li>
            <li><a href="index.php?lang=de&amp;view=plans&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/book_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Meine Lizenz</span></a></li>
            <li class="robby-app-nav__sep" aria-hidden="true"><hr class="robby-app-nav__hr"></li>
            <li><a href="index.php?lang=de&amp;view=help&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/doctor_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Help</span></a></li>
            <li><a href="index.php?lang=de&amp;view=faq&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/news_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>FAQ</span></a></li>
            <li><a href="index.php?lang=de&amp;view=downloads&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/download_72.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Downloads</span></a></li>
                        <li><a href="https://rob.by/keycloak-login.php" class="robby-app-nav__link" id="robby-nav-login"><img src="images/icons/login_72.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Anmelden</span></a></li>
                        <li class="robby-app-nav__sep" aria-hidden="true"><hr class="robby-app-nav__hr"></li>
            <li><a href="index.php?lang=de&amp;view=terms&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/book_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>AGB</span></a></li>
            <li><a href="index.php?lang=de&amp;view=imprint&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/factory_72px.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Impressum</span></a></li>
            <li><a href="index.php?lang=de&amp;view=privacy&amp;channels=fussball,formel1,presentation" class="robby-app-nav__link"><img src="images/icons/login_72.png" alt="" class="robby-app-nav__icon" width="24" height="24"><span>Datenschutz</span></a></li>
          </ul>
        </div>
      </nav>
    </div>
  </div>
</header>
  <script src="js/robby-modal-stub.js"></script>

    <main class="robby-app-content" id="robby-app-content" role="main">
  <div class="robby-container robby-app-content-inner">
    <div class="robby-cards-wrap">
      <div class="robby-cards robby-cards--channel-headline" role="list">
        <article class="robby-card robby-card--channel-headline robby-channel-headline--with-toggle" role="listitem">
                    <div class="robby-card__line">
            <span class="robby-channel-headline__title">Kalender</span>
                                                                        <span class="robby-calendar-channels" id="robby-calendar-channels" data-base-url="/index.php?lang=de&amp;view=calendar&amp;channels=fussball,formel1,presentation&amp;q=feed">
              <label class="robby-calendar-channel-cb-wrap"><input type="checkbox" class="robby-calendar-channel-cb" value="fussball" checked aria-label="Fussball"> <span>Fussball</span></label>
                            <label class="robby-channel-headline__teamfilter" for="robby-calendar-teamfilter">
                <input type="checkbox" class="robby-teams-filter-checkbox" id="robby-calendar-teamfilter" data-href-on="/index.php?lang=de&amp;view=calendar&amp;channels=fussball,formel1,presentation&amp;q=feed&amp;teamfilter=1" data-href-off="/index.php?lang=de&amp;view=calendar&amp;channels=fussball,formel1,presentation&amp;q=feed"  aria-label="Teams filtern">
                <span>Teams filtern</span>
              </label>
                            <label class="robby-calendar-channel-cb-wrap"><input type="checkbox" class="robby-calendar-channel-cb" value="formel1" checked aria-label="Formel 1"> <span>Formel 1</span></label>
              <label class="robby-calendar-channel-cb-wrap"><input type="checkbox" class="robby-calendar-channel-cb" value="presentation" checked aria-label="Events"> <span>Events</span></label>
                                        </span>
                                  </div>
        </article>
      </div>
    </div>
            <div class="robby-cards-wrap">
      <div class="robby-cards robby-cards--calendar" role="list">
              </div>
                  <div class="robby-cards">
        <article class="robby-card robby-card--info robby-card--compact" role="listitem">
          <div class="robby-card__line">
            <p class="robby-cards-empty robby-card__text">Keine Einträge für die Suche nach <span class="robby-cards-empty__searchkeys">feed</span>.</p>
                        <a href="index.php?lang=de&amp;view=calendar" class="robby-btn robby-btn--primary robby-card__action">Ohne Suchfilter anzeigen</a>
          </div>
        </article>
      </div>
                      </div>
      </div>
</main>
<script>
(function(){
  var d = {"step":"before_output","loaded":true,"debugMode":false,"GET":{"view":"calendar","q":"feed"},"currentView":"calendar","debug_mode":false,"get_view":"calendar","get_q":"feed","get_debug":null,"get_offset":null,"robbyCurrentView":"calendar","db_file_exists":true,"iso3_file_exists":true,"robby_get_pdo_exists":true,"pdo":"ok","db_error":"","locationFilter":"feed","todayFilter":"2026-06-09 00:00:00","isCalendarView":true,"calendarLeague":"","calendarChannels":["fussball","formel1","presentation"],"eventsTotal":0,"eventsFromEvent":0,"eventsFromSoccer":0,"eventsCount":0,"whereSql":" WHERE UNIX_TIMESTAMP(`start`) >= UNIX_TIMESTAMP(:today) AND ((cty_name LIKE :q_term_0 OR cntr_name LIKE :q_term_0 OR loc_name LIKE :q_term_0 OR title LIKE :q_term_0 OR provider_name LIKE :q_term_0 OR COALESCE(description, '') LIKE :q_term_0 OR COALESCE(categories, '') LIKE :q_term_0))","geo_loggedIn":false,"geo_userId":"","geo_userLat_before":null,"geo_userLon_before":null,"geo_userLat_after":null,"geo_userLon_after":null,"geo_kmColumnShown":false,"offset":0,"prevOffset":null,"nextOffset":null};
  var debugMode = d.debug_mode === true || d.debug_mode === 'true' || (d.get_debug != null && d.get_debug !== '' && d.get_debug !== '0');
  /* SQL immer in Konsole ausgeben */
  if (d.sqlDisplay) {
    console.log('%c[events.php] SQL:', 'font-weight:bold; color:#063;');
    console.log(d.sqlDisplay);
  } else {
    console.log('[events.php] whereSql:', d.whereSql);
    console.log('[events.php] paramsList:', d.paramsList);
  }
  if (debugMode) {
    console.log('%c[events.php] === DEBUG (debug=true) ===', 'font-weight:bold; color:#06c;');
    console.log('[events.php] GET view:', d.get_view);
    console.log('[events.php] GET q (Suchfilter):', d.get_q);
    console.log('[events.php] GET debug:', d.get_debug);
    console.log('[events.php] GET offset:', d.get_offset);
    console.log('[events.php] robbyCurrentView:', d.robbyCurrentView);
    console.log('[events.php] step:', d.step);
    console.log('[events.php] locationFilter (aus q):', d.locationFilter);
    console.log('[events.php] todayFilter:', d.todayFilter);
    console.log('[events.php] whereSql:', d.whereSql);
    console.log('[events.php] paramsCount:', d.paramsCount);
    console.log('[events.php] paramsList:', d.paramsList);
    console.log('[events.php] eventsLimit:', d.eventsLimit);
    console.log('[events.php] eventsOffset:', d.eventsOffset);
    console.log('[events.php] eventsTotal:', d.eventsTotal);
    console.log('[events.php] eventsCount:', d.eventsCount);
    if (d.event_categories) console.log('[events.php] event_categories:', d.event_categories);
    if (d.event_ids) console.log('[events.php] event_ids (erste 20):', d.event_ids.slice(0, 20));
    console.log('[events.php] pdo:', d.pdo);
    console.log('[events.php] db_error:', d.db_error);
    if (d.queryError) console.error('[events.php] queryError:', d.queryError);
    console.log('[events.php] === Ende DEBUG ===');
  }
  console.log('[events.php]', d);
  if (d.error) console.error('[events.php] Fehler:', d.error, d.file ? (d.file + ':' + d.line) : '');
  if (d.db_error && d.db_error !== '') console.warn('[events.php] DB:', d.db_error);
  if (d.geo_loggedIn !== undefined) {
    console.log('[events.php] km-Spalte: loggedIn=' + d.geo_loggedIn + ', userId=' + (d.geo_userId || '') + ', userLat=' + d.geo_userLat_after + ', userLon=' + d.geo_userLon_after + ', kmColumnShown=' + d.geo_kmColumnShown);
    if (d.geo_userQueryError) console.warn('[events.php] User lat/lon Abfrage fehlgeschlagen:', d.geo_userQueryError);
    if (d.geo_rowUser && d.geo_userLat_after === null) console.warn('[events.php] User-Zeile vorhanden, aber lat/lon nicht gesetzt. rowUser lat=' + d.geo_rowUser_lat + ', lon=' + d.geo_rowUser_lon);
  }
})();
</script>
<script>
function robbyClockTick() {
  var hEl = document.getElementById('robby-clock-hour');
  var mEl = document.getElementById('robby-clock-min');
  var sEl = document.getElementById('robby-clock-sec');
  if (!hEl || !mEl || !sEl) return;
  var d = new Date();
  var h = d.getHours() % 12;
  var m = d.getMinutes();
  var s = d.getSeconds();
  var hDeg = h * 30 + m * 0.5;
  var mDeg = m * 6 + s * 0.1;
  var sDeg = s * 6;
  hEl.setAttribute('transform', 'rotate(' + hDeg + ' 16 16)');
  mEl.setAttribute('transform', 'rotate(' + mDeg + ' 16 16)');
  sEl.setAttribute('transform', 'rotate(' + sDeg + ' 16 16)');
}
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', function() {
    robbyClockTick();
    setInterval(robbyClockTick, 1000);
  });
} else {
  robbyClockTick();
  setInterval(robbyClockTick, 1000);
}
document.querySelectorAll('.robby-channel-subscribe-checkbox[data-auto-submit]').forEach(function(cb) {
  cb.addEventListener('change', function() { this.closest('form').submit(); });
});
document.querySelectorAll('.robby-teams-filter-checkbox').forEach(function(cb) {
  cb.addEventListener('change', function() {
    var href = this.checked ? (this.getAttribute('data-href-on') || '') : (this.getAttribute('data-href-off') || '');
    if (href) window.location = href;
  });
});
(function(){
  var container = document.getElementById('robby-calendar-channels');
  if (!container) return;
  var baseUrl = container.getAttribute('data-base-url') || '';
  var settingsSaveUrl = container.getAttribute('data-settings-save-url') || '';
  var checkboxes = container.querySelectorAll('.robby-calendar-channel-cb');
  function getChecked() {
    var arr = [];
    checkboxes.forEach(function(cb) { if (cb.checked) arr.push(cb.getAttribute('value') || ''); });
    return arr;
  }
  function buildCalendarUrl(channelsArr) {
    var withoutChannels = baseUrl.replace(/([?&])channels=[^&]*/g, function(m, p) { return p === '?' ? '?' : ''; }).replace(/&$/, '').replace(/\?$/, '');
    var sep = withoutChannels.indexOf('?') !== -1 ? '&' : '?';
    return withoutChannels + sep + 'channels=' + channelsArr.join(',');
  }
  checkboxes.forEach(function(cb) {
    cb.addEventListener('change', function() {
      var checked = getChecked();
      if (checked.length === 0) {
        this.checked = true;
        return;
      }
      var newUrl = buildCalendarUrl(checked);
      if (settingsSaveUrl) {
        fetch(settingsSaveUrl, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ channels: checked }),
          credentials: 'same-origin'
        }).then(function() { window.location = newUrl; }).catch(function() { window.location = newUrl; });
      } else {
        window.location = newUrl;
      }
    });
  });
})();
(function(){
  var container = document.getElementById('robby-presentation-channels');
  if (!container) return;
  var baseUrl = container.getAttribute('data-base-url') || '';
  var openCfpActive = container.getAttribute('data-open-cfp') === '1';
  var checkboxes = container.querySelectorAll('.robby-presentation-category-cb');
  var openCfpCb = document.getElementById('robby-presentation-opencfp');
  function getChecked() {
    var arr = [];
    checkboxes.forEach(function(cb) { if (cb.checked) arr.push(cb.getAttribute('value') || ''); });
    return arr;
  }
  function buildUrl(channels, withOpenCfp) {
    var sep = baseUrl.indexOf('?') !== -1 ? '&' : '?';
    var url = baseUrl + sep + 'channels=' + channels.join(',');
    if (withOpenCfp) url += '&open_cfp=1';
    return url;
  }
  checkboxes.forEach(function(cb) {
    cb.addEventListener('change', function() {
      var checked = getChecked();
      if (checked.length === 0) { this.checked = true; return; }
      window.location = buildUrl(checked, openCfpCb ? openCfpCb.checked : openCfpActive);
    });
  });
  if (openCfpCb) {
    openCfpCb.addEventListener('change', function() {
      window.location = buildUrl(getChecked(), this.checked);
    });
  }
})();
</script>
  <div class="robby-app-bottom">
<div class="robby-app-search" role="search">
  <form class="robby-app-search__form" action="index.php" method="get" aria-label="Suche">
        <input type="hidden" name="lang" value="de">
                <input type="hidden" name="view" value="calendar">
                            <div class="robby-app-search-channel" aria-label="Channel wählen">
      <span class="robby-app-search-channel__icon robby-app-search-channel__icon--default">
        <img src="images/icons/calender_36px.png" alt="Channel" width="36" height="36">
      </span>
      <div class="robby-app-search-channel__dropdown">
                <a href="index.php?lang=de&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item robby-app-search-channel__item--active" title="Kalender" aria-current="true">
          <img src="images/icons/calender_36px.png" alt="" width="36" height="36">
          <span>Kalender</span>
        </a>
                <a href="index.php?lang=de&amp;view=formel1&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Formel 1">
          <img src="images/icons/f1_48px.png" alt="" width="36" height="36">
          <span>Formel 1</span>
        </a>
                <a href="index.php?lang=de&amp;view=soccer&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Fussball">
          <img src="images/icons/soccer_36px.png" alt="" width="36" height="36">
          <span>Fussball</span>
        </a>
                <a href="index.php?lang=de&amp;view=event&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Events">
          <img src="images/icons/shares_72px.png" alt="" width="36" height="36">
          <span>Events</span>
        </a>
                <a href="index.php?lang=de&amp;view=teams&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Teams">
          <img src="images/icons/alarm_36px.png" alt="" width="36" height="36">
          <span>Teams</span>
        </a>
                <a href="index.php?lang=de&amp;view=event_location&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Veranstaltungsort">
          <img src="images/icons/place_world_72px.png" alt="" width="36" height="36">
          <span>Veranstaltungsort</span>
        </a>
                <a href="index.php?lang=de&amp;view=business&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-search-channel__item" title="Geschäftsbeziehungen">
          <img src="images/icons/shares_72px.png" alt="" width="36" height="36">
          <span>Geschäftsbeziehungen</span>
        </a>
              </div>
    </div>
    <label for="robby-search-input" class="robby-visually-hidden">Suche</label>
    <div class="robby-app-search__input-wrap">
      <input type="search" id="robby-search-input" name="q" class="robby-app-search__input" placeholder="Stadt, Land, Arena / Stadion" value="feed" autocomplete="off">
      <button type="button" class="robby-app-search__clear" id="robby-search-clear" aria-label="Suche zurücksetzen" title="Suche zurücksetzen">
        <svg class="robby-icon" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
          <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
        </svg>
      </button>
    </div>
    <button type="submit" class="robby-app-search__btn" aria-label="Suchen">
      <img src="images/icons/search_36px.png" alt="" width="36" height="36">
    </button>
  </form>
  <div id="robby-search-msg" class="robby-search-msg" aria-live="polite"></div>
</div>
<script>
(function() {
  var searchInput = document.getElementById('robby-search-input');
  var clearBtn = document.getElementById('robby-search-clear');
  var searchForm = searchInput ? searchInput.closest('form') : null;
  
  if (!searchInput || !searchForm) return;
  
  // Funktion zum Zurücksetzen der Suche
  function clearSearch() {
    var url = new URL(window.location.href);
    url.searchParams.delete('q');
    window.location.href = url.toString();
  }
  
  // Clear-Button Event
  if (clearBtn) {
    clearBtn.addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      clearSearch();
    });
  }
  
  // Clear-Button anzeigen/verstecken basierend auf Eingabe
  if (searchInput && clearBtn) {
    function toggleClearButton() {
      var hasValue = searchInput.value.trim() !== '';
      if (hasValue) {
        clearBtn.classList.remove('robby-app-search__clear--hidden');
      } else {
        clearBtn.classList.add('robby-app-search__clear--hidden');
      }
    }
    
    searchInput.addEventListener('input', toggleClearButton);
    searchInput.addEventListener('keyup', toggleClearButton);
    toggleClearButton(); // Initial check
  }
})();
</script>
<nav class="robby-app-channel-bar" aria-label="Channel wählen">
    <a href="index.php?lang=de&amp;view=calendar&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-channel-bar__item robby-app-channel-bar__item--active" title="Kalender" aria-current="true">
    <img src="images/icons/calender_36px.png" alt="Kalender" width="36" height="36">
  </a>
    <a href="index.php?lang=de&amp;view=formel1&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-channel-bar__item" title="Formel 1">
    <img src="images/icons/f1_48px.png" alt="Formel 1" width="36" height="36">
  </a>
    <a href="index.php?lang=de&amp;view=soccer&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-channel-bar__item" title="Fussball">
    <img src="images/icons/soccer_36px.png" alt="Fussball" width="36" height="36">
  </a>
    <a href="index.php?lang=de&amp;view=event&amp;q=feed&amp;channels=fussball,formel1,presentation" class="robby-app-channel-bar__item" title="Events">
    <img src="images/icons/shares_72px.png" alt="Events" width="36" height="36">
  </a>
  </nav>
</div>  <script>
  window.robbyPageLog = { view: "calendar", contentFile: "\/homepages\/u55997\/projects\/robby\/events.php", exists: true, viewDone: true, searchDone: true };
    </script>

  <div class="robby-modal" id="robby-profile-modal" role="dialog" aria-modal="true" aria-labelledby="robby-user-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-profile-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close" id="robby-profile-close" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-user-content">
    <h2 class="robby-user__title" id="robby-user-title">Profil <span class="robby-text--muted robby-profile-session-id">da965774ec23ce56740013baf9a2eb98</span></h2>
    <p class="robby-user__error">Bitte anmelden.</p>
    </div>
      </div>
    </div>
  </div>

  <!-- Todo 016: Gäste „Folgen“ → Modal (Alias-Spezifikation follow_Modal) -->
  <div class="robby-modal" id="robby-follow-login-modal" data-follow-modal="follow_Modal" role="dialog" aria-modal="true" aria-labelledby="robby-follow-login-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-follow-login-backdrop" onclick="if(typeof window.robbyCloseDocModal==='function'){window.robbyCloseDocModal('robby-follow-login-modal');}"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close" id="robby-follow-login-close" onclick="if(typeof window.robbyCloseDocModal==='function'){window.robbyCloseDocModal('robby-follow-login-modal');}" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--follow-login">
        <h2 id="robby-follow-login-title" class="robby-content-title robby-content-title--primary">Anmeldung nötig</h2>
        <p class="robby-follow-login-modal__text">Du kannst dem Kanal nur als angemeldeter Benutzer folgen.</p>
        <p class="robby-follow-login-modal__actions">
          <a href="https://rob.by/keycloak-login.php" class="robby-btn robby-btn--primary">Anmelden</a>
          <a href="https://rob.by/keycloak-registration.php" class="robby-btn robby-btn--secondary">Kostenlos registrieren</a>
        </p>
      </div>
    </div>
  </div>

  <!-- Todo 019: Limit erreicht bei „Kanal anlegen“ -->
  <div class="robby-modal" id="robby-channels-limit-modal" role="dialog" aria-modal="true" aria-labelledby="robby-channels-limit-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-channels-limit-backdrop" onclick="if(typeof window.robbyCloseDocModal==='function'){window.robbyCloseDocModal('robby-channels-limit-modal');}"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close" id="robby-channels-limit-close" onclick="if(typeof window.robbyCloseDocModal==='function'){window.robbyCloseDocModal('robby-channels-limit-modal');}" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--follow-login">
        <h2 id="robby-channels-limit-title" class="robby-content-title robby-content-title--primary">Kanal-Limit</h2>
        <p class="robby-follow-login-modal__text">Maximale Anzahl von Kanälen erreicht.</p>
        <p class="robby-follow-login-modal__actions">
          <a href="index.php?view=plans&amp;lang=de" class="robby-btn robby-btn--primary">Tarife ansehen</a>
        </p>
      </div>
    </div>
  </div>

  <div class="robby-modal" id="robby-edit-subscription-modal" role="dialog" aria-modal="true" aria-labelledby="robby-edit-subscription-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-edit-subscription-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close" id="robby-edit-subscription-close" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body">
        <div class="robby-edit-subscription" id="robby-edit-subscription-content">
  <h2 class="robby-edit-subscription__title" id="robby-edit-subscription-title">subscriptions_edit</h2>
    <form method="post" action="/api/subscription-update.php" class="robby-edit-subscription__form">
    <input type="hidden" name="id" value="0">
    <div class="robby-form-group">
      <label for="robby-sub-minutes" class="robby-label">Min.</label>
      <input type="number" id="robby-sub-minutes" name="notify_before_minutes" value="60" min="0" max="1440" step="1" class="robby-input">
    </div>
    <div class="robby-form-group">
      <label for="robby-sub-days" class="robby-label">Tage</label>
      <input type="number" id="robby-sub-days" name="notify_before_days" value="1" min="0" max="365" step="1" class="robby-input">
    </div>
    <div class="robby-form-group">
      <label for="robby-sub-months" class="robby-label">Monate</label>
      <input type="number" id="robby-sub-months" name="notify_before_months" value="0" min="0" max="12" step="1" class="robby-input">
    </div>
    <div class="robby-edit-subscription__actions">
      <button type="submit" class="robby-btn robby-btn--primary">subscriptions_save</button>
      <button type="button" class="robby-btn robby-btn--ghost robby-modal__close">Schließen</button>
    </div>
  </form>
</div>
      </div>
    </div>
  </div>

    <div class="robby-modal robby-modal--doc" id="robby-help-modal" role="dialog" aria-modal="true" aria-labelledby="robby-help-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-help-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-help-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--doc">
        <div class="robby-doc-modal-content" id="robby-help-content">
  <div class="robby-doc-header">
    <h1 class="robby-content-title robby-content-title--primary" id="robby-help-title">Hilfe</h1>
    <h2 class="robby-doc-subtitle">Bedienungsanleitung robby</h2>
  </div>
  <p class="robby-doc-block">robby ist eine App für Push-Benachrichtigungen zu relevanten Ereignissen (z. B. Kalender, Sport, Formel 1).</p>
  <h3 class="robby-heading--2 robby-doc-block">Anmeldung</h3>
  <p>Über den Login-Link oben links meldest Du Dich an. Nach der Anmeldung stehen Profil, Abos und weitere Funktionen zur Verfügung.</p>
  <h3 class="robby-heading--2 robby-doc-block">Kalender &amp; Suche</h3>
  <p>Die Standardansicht zeigt den Kalender mit Events. Über die Suche kannst Du nach Begriffen filtern. Über die Channel-Icons (Kalender, Formel 1, Fussball, Handball, Teams) wechselst Du die Ansicht.</p>
  <h3 class="robby-heading--2 robby-doc-block">Teams &amp; Abos</h3>
  <p>Unter „Teams“ siehst Du verfügbare Mannschaften (z. B. Bundesliga). Mit einem Klick auf die Checkbox abonnierst Du ein Team und erhältst Push-Hinweise vor Spielbeginn. Deine Abos verwaltest Du unter dem Glocken-Icon („Meine Abos“): dort kannst Du Abos pausieren, bearbeiten oder löschen.</p>
  <h3 class="robby-heading--2 robby-doc-block">Sprache</h3>
  <p>Oben links kannst Du die Sprache wechseln (Deutsch, English, Français, u. a.).</p>
  <h3 class="robby-heading--2 robby-doc-block">Eigene Kanäle</h3>
  <p>Akkreditierte Editoren können einen eigenen Kanal für die Benachrichtigung von Vereinen, Parteien oder Interessengemeinschaften erstellen und die Mitglieder in ihrer Downline durch robby automatisch über künftige Ereignisse und Veranstaltungen benachrichtigen lassen.</p>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-faq-modal" role="dialog" aria-modal="true" aria-labelledby="robby-faq-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-faq-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-faq-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--doc">
        <div class="robby-doc-modal-content" id="robby-faq-content">
  <div class="robby-faq-header">
    <h1 class="robby-content-title robby-content-title--primary" id="robby-faq-title">FAQ</h1>
    <h2 class="robby-faq-subtitle">Häufig gestellte Fragen</h2>
  </div>
  <div class="robby-cards robby-cards--faq" role="list">
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Was ist robby?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">robby ist eine App für Push-Benachrichtigungen zu relevanten Ereignissen (<a href="index.php?view=calendar" class="robby-link">Kalender</a>, Sport, Formel 1). Du kannst <a href="index.php?view=teams" class="robby-link">Teams</a> abonnieren und erhältst Hinweise vor Spielbeginn.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Ist robby kostenlos?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Die Nutzung von robby ist derzeit kostenfrei. Eine Registrierung ist für Abos und Push-Benachrichtigungen erforderlich.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Wie abonniere ich ein Team?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Unter <a href="index.php?view=teams" class="robby-link">„<a href="index.php?view=teams" class="robby-link">Teams</a>“</a> (Fussball-Icon) kannst Du Mannschaften auswählen. Klicke auf die leere Checkbox neben einem Team, um es zu abonnieren. <a href="index.php?view=subscriptions" class="robby-link">Deine Abos</a> verwaltest Du unter dem <a href="index.php?view=subscriptions" class="robby-link">Glocken-Icon</a>.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Wie ändere ich die Sprache?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Oben links kannst Du mit der Flagge die Sprache wechseln (Deutsch, English, Français, u. a.).</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Wie kann ich akkredierter Editor werden, um einen eigenen Benachrichtigungskanal für meine Community zu erstellen?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Verwende das <a href="index.php?view=contact" class="robby-link">Kontaktformular</a> und schicke eine kurze Anfrage, in der Du Dein Projekt kurz beschreibst.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Was ist eine Downline?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Deine Downline enthält die von Dir direkt empfohlenen Benutzer, die die Anmeldung bestätigt haben. Für diese Benutzer kannst Du dann eigene Benachrichtigungskanäle erstellen, über die die Benutzer automatisch mit Push-Nachrichten versorgt werden können.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Was ist eine Push-Nachricht?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Je nach Einstellung erhält ein Benutzer eine Push-Nachricht auf seinem Mobilgerät über den Beginn einer Veranstaltung, z. B. 1 h oder 1 Tag oder eine Woche vor dem Termin. Dazu muss der Benutzer auf seinem Mobilgerät unter iOS oder Android die entsprechenden Einstellungen erlauben.</p>
      </div>
    </article>
        <article class="robby-card robby-card--faq robby-card--compact" role="listitem">
      <header class="robby-card__header">
        <h4 class="robby-faq-q">Warum sollte ich die Abfrage meines Standortes erlauben?</h4>
      </header>
      <div class="robby-card__body">
        <p class="robby-faq-a">Wir speichern die Koordinaten der Veranstaltungsorte. Damit kannst Du dann direkt sehen, wie weit der Ort von Dir entfernt ist und auf dieser Basis entscheiden, ob Du vor Ort daran teilnehmen möchtest. Wenn andere User ihren Standort freigegeben haben, kannst Du sehen, wie weit andere User von Dir entfernt sind und ggf. Dich mit ihnen persönlich treffen.</p>
      </div>
    </article>
      </div>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-imprint-modal" role="dialog" aria-modal="true" aria-labelledby="robby-imprint-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-imprint-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-imprint-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--doc">
        <div class="robby-doc-modal-content" id="robby-imprint-content">
  <div class="robby-doc-header">
    <h1 class="robby-content-title robby-content-title--primary" id="robby-imprint-title">Impressum</h1>
    <h2 class="robby-doc-subtitle">Rechtliche Informationen (§ 5 TMG)</h2>
  </div>
  <div class="robby-about robby-doc-block">
    <p><strong>textOmatic AG</strong></p>
    <p>Schwarze-Brüder-Str. 1, 44137 Dortmund, Deutschland</p>
    <p>Vorstand: Dipl.-Inform. Hermann Bense</p>
    <p>Tel. +49 231 476432-12, Fax +49 231 476432-13</p>
    <p>USt-IdNr. DE302366766, AG Dortmund HRB 27810</p>
    <p><a href="https://textomatic.ag" target="_blank" rel="noopener">https://textomatic.ag</a> · <a href="mailto:textomatic.ag">E-Mail</a></p>
  </div>
  <p class="robby-text--small robby-text--muted robby-doc-block">Dieses Impressum gilt für die App robby (Push-Alerts für relevante Ereignisse). Verantwortlich im Sinne von § 5 TMG und § 55 RStV ist die oben genannte Gesellschaft.</p>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-privacy-modal" role="dialog" aria-modal="true" aria-labelledby="robby-privacy-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-privacy-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-privacy-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--doc">
        <div class="robby-doc-modal-content" id="robby-privacy-content">
  <div class="robby-doc-header">
    <h1 class="robby-content-title robby-content-title--primary" id="robby-privacy-title">Datenschutz</h1>
    <h2 class="robby-doc-subtitle">Informationen zum Datenschutz (DSGVO)</h2>
  </div>
  <div class="robby-doc-block">
    <p>Diese Datenschutzerklärung gilt für die App robby. Verantwortlicher ist die textOmatic AG. Wir erheben und verarbeiten personenbezogene Daten nur im erforderlichen Umfang (z. B. Anmeldung, Abos, Push-Benachrichtigungen, optional Geo-Koordinaten). Rechtsgrundlage: Vertragserfüllung, berechtigtes Interesse, Einwilligung. Du hast die Rechte auf Auskunft, Berichtigung, Löschung, Einschränkung, Widerspruch und Datenübertragbarkeit. Kontakt: <a href="mailto:textomatic.ag">textomatic.ag</a>.</p>
  </div>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-terms-modal" role="dialog" aria-modal="true" aria-labelledby="robby-terms-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-terms-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-terms-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--doc">
        <div class="robby-doc-modal-content" id="robby-terms-content">
  <div class="robby-doc-header">
    <h1 class="robby-content-title robby-content-title--primary" id="robby-terms-title">AGB</h1>
    <h2 class="robby-doc-subtitle">Allgemeine Geschäftsbedingungen</h2>
  </div>
  <div class="robby-doc-block">
    <p>Die Nutzung von robby ist bis auf weiteres kostenfrei. Eine Registrierung ist jedoch erforderlich, um bestimmte Funktionen zu nutzen (z. B. Abos, Push-Benachrichtigungen, Profil).</p>
  </div>
  <div class="robby-doc-block">
    <p>Personen, die robby missbräuchlich nutzen – etwa durch Aufforderung zu kriminellen Handlungen, Verbreitung von Kinderpornographie oder politischer bzw. religiöser Propaganda – können nach freier Einschätzung durch den Betreiber (textOmatic AG) von der Nutzung ausgeschlossen werden.</p>
  </div>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-contact-modal" role="dialog" aria-modal="true" aria-labelledby="robby-contact-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-contact-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-contact-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-contact-content">
  <h2 class="robby-user__title" id="robby-contact-title">Kontakt</h2>
  <p class="robby-text--muted robby-user__subtitle">Nachricht an robby senden</p>
  <div id="robby-contact-message" class="robby-form-message robby-user__message" role="alert" aria-live="polite" hidden></div>
  <form id="robby-contact-form" class="robby-form" method="post" action="" novalidate data-success="Nachricht wurde gesendet." data-error="Fehler beim Senden.">
    <div class="robby-user__table-wrap">
      <table class="robby-user__table">
        <tbody>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-contact-firstname">Vorname <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="text" id="robby-contact-firstname" name="firstname" class="robby-form-input" required autocomplete="given-name" aria-labelledby="lbl-contact-firstname"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-contact-lastname">Nachname <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="text" id="robby-contact-lastname" name="lastname" class="robby-form-input" required autocomplete="family-name" aria-labelledby="lbl-contact-lastname"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-contact-email">E-Mail <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="email" id="robby-contact-email" name="email" class="robby-form-input" required autocomplete="email" aria-labelledby="lbl-contact-email"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-contact-subject">Betreff <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="text" id="robby-contact-subject" name="subject" class="robby-form-input" required aria-labelledby="lbl-contact-subject"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-contact-message">Nachricht <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><textarea id="robby-contact-message-field" name="message" class="robby-form-input robby-form-textarea" rows="4" required aria-labelledby="lbl-contact-message"></textarea></td>
          </tr>
        </tbody>
      </table>
    </div>
    <div class="robby-user__actions">
      <button type="submit" class="robby-btn robby-btn-primary" id="robby-contact-submit">Senden</button>
    </div>
  </form>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-recommend-modal" role="dialog" aria-modal="true" aria-labelledby="robby-recommend-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-recommend-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-recommend-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-recommend-content" data-recommender="null">
  <h2 class="robby-user__title" id="robby-recommend-title">Empfehlen</h2>
  <p class="robby-text--muted robby-user__subtitle">robby an jemanden empfehlen</p>
  <p class="robby-text--muted robby-user__subtitle">Der Benutzer wird in Deine Community-Downline eingetragen, wenn er noch nicht registriert ist.</p>
  <div id="robby-recommend-message" class="robby-form-message robby-user__message" role="alert" aria-live="polite" hidden></div>
  <form id="robby-recommend-form" class="robby-form" method="post" action="" novalidate data-success="Empfehlung wurde gesendet." data-error="Fehler beim Senden.">
    <div class="robby-user__table-wrap">
      <table class="robby-user__table">
        <tbody>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row">Deine E-Mail</th>
            <td class="robby-user__td">—</td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-salutation">Anrede</th>
            <td class="robby-user__td"><select id="robby-recommend-salutation" name="salutation" class="robby-form-input" aria-labelledby="lbl-recommend-salutation">
              <option value="">—</option>
              <option value="Herr">Herr</option>
              <option value="Frau">Frau</option>
              <option value="Divers">Divers</option>
            </select></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-title">Titel</th>
            <td class="robby-user__td"><input type="text" id="robby-recommend-title" name="title" class="robby-form-input" autocomplete="off" aria-labelledby="lbl-recommend-title" placeholder="(optional)"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-firstname">Vorname <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="text" id="robby-recommend-firstname" name="firstname" class="robby-form-input" required autocomplete="off" aria-labelledby="lbl-recommend-firstname"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-surname">Nachname <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="text" id="robby-recommend-surname" name="surname" class="robby-form-input" required autocomplete="off" aria-labelledby="lbl-recommend-surname"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-email">E-Mail der Person <span class="robby-form-required">*</span></th>
            <td class="robby-user__td"><input type="email" id="robby-recommend-email" name="email" class="robby-form-input" required autocomplete="off" aria-labelledby="lbl-recommend-email"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-mobile">Mobil</th>
            <td class="robby-user__td"><input type="tel" id="robby-recommend-mobile" name="mobile" class="robby-form-input" autocomplete="tel" aria-labelledby="lbl-recommend-mobile" placeholder="(optional)"></td>
          </tr>
          <tr class="robby-user__row">
            <th class="robby-user__th" scope="row" id="lbl-recommend-remark">Empfehlung</th>
            <td class="robby-user__td"><textarea id="robby-recommend-remark" name="recommendation" class="robby-form-input robby-form-textarea" rows="4" aria-labelledby="lbl-recommend-remark" placeholder="Hier persönlichen Empfehlungstext ergänzen …"></textarea></td>
          </tr>
        </tbody>
      </table>
    </div>
    <div class="robby-user__actions">
      <button type="submit" class="robby-btn robby-btn-primary" id="robby-recommend-submit">Empfehlung senden</button>
    </div>
  </form>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-dashboard-modal" role="dialog" aria-modal="true" aria-labelledby="robby-dashboard-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-dashboard-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-dashboard-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-dashboard-content">
  <h2 class="robby-user__title" id="robby-dashboard-title">Dashboard</h2>
    <p class="robby-user__error">Bitte anmelden, um das Dashboard zu sehen.</p>
  </div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-login-modal" role="dialog" aria-modal="true" aria-labelledby="robby-login-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-login-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-login-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-login-content" data-title-login="Anmeldung" data-title-register="Registrierung">
  <h2 class="robby-user__title" id="robby-login-title">Anmeldung</h2>

  <div id="robby-login-panel" class="robby-login-panel" aria-hidden="false">
    <p class="robby-text--muted robby-user__subtitle">Mit E-Mail und Passwort anmelden</p>
    <form id="robby-login-form" class="robby-form" method="post" action="" novalidate data-forgot-success="Es wurde ein neues Passwort vergeben und per E-Mail zugesendet. Bitte ggf. auch Spam-Ordner checken." data-forgot-not-found="Kein Konto mit dieser E-Mail-Adresse gefunden.">
      <div class="robby-user__table-wrap">
        <table class="robby-user__table">
          <tbody>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-login-email">E-Mail <span class="robby-form-required">*</span></th>
              <td class="robby-user__td"><input type="email" id="robby-login-email" name="email" class="robby-form-input" required autocomplete="email" aria-labelledby="lbl-login-email"></td>
            </tr>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-login-password">Passwort</th>
              <td class="robby-user__td">
                <div class="robby-password-wrap">
                  <input type="password" id="robby-login-password" name="password" class="robby-form-input" autocomplete="current-password" aria-labelledby="lbl-login-password">
                  <button type="button" class="robby-password-toggle" id="robby-login-password-toggle" aria-label="Passwort anzeigen" title="Passwort anzeigen" data-show-label="Passwort anzeigen" data-hide-label="Passwort verbergen">
                    <span class="robby-password-toggle-icon robby-password-toggle-icon--show" aria-hidden="true"><svg class="robby-icon-eye" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" focusable="false"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg></span>
                    <span class="robby-password-toggle-icon robby-password-toggle-icon--hide" aria-hidden="true" hidden><svg class="robby-icon-eye-slash" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" focusable="false"><path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l1.74 1.74c.57-.23 1.18-.36 1.83-.36zm-1.71-2.14c.38-.11.78-.19 1.21-.19 2.76 0 5 2.24 5 5 0 .43-.08.83-.19 1.21l-6.02-6.02zM2.51 2.49L1.44 3.56 4.26 6.38C3.01 7.78 2.02 9.5 1.44 11.5 3.17 15.89 7.27 19 12 19c1.94 0 3.76-.55 5.31-1.49l2.93 2.93 1.07-1.07L2.51 2.49zM12 17c-2.76 0-5-2.24-5-5 0-1.19.42-2.28 1.1-3.16l6.06 6.06c-.88.68-1.97 1.1-3.16 1.1z"/></svg></span>
                  </button>
                </div>
              </td>
            </tr>
          </tbody>
        </table>
      </div>
      <div id="robby-login-message" class="robby-form-message robby-user__message" role="alert" aria-live="polite" hidden></div>
      <div class="robby-user__actions robby-login-actions robby-login-actions--row">
        <button type="submit" class="robby-btn robby-btn--secondary robby-login-btn-submit" id="robby-login-submit">Login</button>
        <button type="button" class="robby-btn robby-btn--primary robby-login-btn-forgot" id="robby-login-forgot">Passwort vergessen</button>
        <button type="button" class="robby-btn robby-btn--gray robby-login-btn-register" id="robby-login-show-register">Registrierung</button>
      </div>
    </form>
  </div>

  <div id="robby-register-panel" class="robby-login-panel" aria-hidden="true" hidden>
    <p class="robby-text--muted robby-user__subtitle">Neues Konto anlegen</p>
    <form id="robby-register-form" class="robby-form" method="post" action="registration.php?lang=de&amp;app=robby" target="_top" novalidate>
      <input type="hidden" name="action" value="register">
      <input type="hidden" name="lang" value="de">
      <input type="hidden" name="app" value="robby">
      <div class="robby-user__table-wrap">
        <table class="robby-user__table">
          <tbody>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-reg-salutation">Anrede</th>
              <td class="robby-user__td">
                <select id="robby-reg-salutation" name="salutation" class="robby-form-input" aria-labelledby="lbl-reg-salutation">
                  <option value="Herr">Herr</option>
                  <option value="Frau">Frau</option>
                </select>
              </td>
            </tr>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-reg-firstname">Vorname <span class="robby-form-required">*</span></th>
              <td class="robby-user__td"><input type="text" id="robby-reg-firstname" name="firstname" class="robby-form-input" required autocomplete="given-name" aria-labelledby="lbl-reg-firstname"></td>
            </tr>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-reg-surname">Nachname <span class="robby-form-required">*</span></th>
              <td class="robby-user__td"><input type="text" id="robby-reg-surname" name="surname" class="robby-form-input" required autocomplete="family-name" aria-labelledby="lbl-reg-surname"></td>
            </tr>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-reg-email">E-Mail <span class="robby-form-required">*</span></th>
              <td class="robby-user__td"><input type="email" id="robby-reg-email" name="email" class="robby-form-input" required autocomplete="email" aria-labelledby="lbl-reg-email"></td>
            </tr>
            <tr class="robby-user__row">
              <th class="robby-user__th" scope="row" id="lbl-reg-mobile">Mobilnummer</th>
              <td class="robby-user__td"><input type="tel" id="robby-reg-mobile" name="mobile" class="robby-form-input" autocomplete="tel" aria-labelledby="lbl-reg-mobile"></td>
            </tr>
          </tbody>
        </table>
      </div>
      <div class="robby-user__actions robby-login-actions robby-login-actions--row">
        <button type="submit" class="robby-btn robby-btn--secondary" id="robby-register-submit">Registrieren</button>
        <button type="button" class="robby-btn robby-btn--gray" id="robby-register-back">Zurück zur Anmeldung</button>
      </div>
    </form>
  </div>

  </div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-settings-modal" role="dialog" aria-modal="true" aria-labelledby="robby-settings-title" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-settings-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-settings-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
        <div class="robby-user" id="robby-settings-content">
  <h2 class="robby-user__title" id="robby-settings-title">Einstellungen</h2>
  <p class="robby-text--muted robby-user__subtitle">Schriftgröße der Oberfläche</p>
  <div class="robby-settings-font-size" role="group" aria-labelledby="robby-settings-font-label">
    <span id="robby-settings-font-label" class="robby-visually-hidden">Schriftgröße der Oberfläche</span>
    <div class="robby-settings-font-size__btns">
      <button type="button" class="robby-settings-font-btn" data-font-size="xs">Sehr klein</button>
      <button type="button" class="robby-settings-font-btn" data-font-size="sm">Klein</button>
      <button type="button" class="robby-settings-font-btn robby-settings-font-btn--active" data-font-size="base">Normal</button>
      <button type="button" class="robby-settings-font-btn" data-font-size="lg">Groß</button>
      <button type="button" class="robby-settings-font-btn" data-font-size="xl">Sehr groß</button>
    </div>
  </div>
  <hr class="robby-settings-divider">
  <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-geo-input" id="robby-settings-geo-input"> <span>Standort Tracking erlauben</span></label>
  <hr class="robby-settings-divider">
  <h3 class="robby-user__subtitle robby-text--muted">Fussball / Soccer</h3>
    <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-all-leagues" id="robby-settings-soccer-all-leagues" checked> <span>Alle Ligen</span></label>
  <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-teamfilter" id="robby-settings-soccer-teamfilter"> <span>Teams filtern</span></label>
  <p class="robby-text--muted robby-settings-channels-hint">Ligen (Mehrfachauswahl)</p>
  <div class="robby-settings-soccer-league" role="group" id="robby-settings-soccer-league-wrap">
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="bl1" disabled> <span>bl1</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="bl2" disabled> <span>bl2</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="bl3" disabled> <span>bl3</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="NT" disabled> <span>NT</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="CL" disabled> <span>CL</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="SA" disabled> <span>SA</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="PL" disabled> <span>PL</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="PD" disabled> <span>PD</span></label>
        <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-soccer-league-input" name="robby_soccer_league[]" value="FL1" disabled> <span>FL1</span></label>
      </div>
  <hr class="robby-settings-divider">
  <h3 class="robby-user__subtitle robby-text--muted robby-settings-channels-subtitle">Channels im Kalender</h3>
  <p class="robby-text--muted robby-settings-channels-hint">Mindestens einer der folgenden Kanäle muss ausgewählt werden.</p>
  <div class="robby-settings-calendar-channels" role="group" aria-labelledby="robby-settings-channels-label">
    <span id="robby-settings-channels-label" class="robby-visually-hidden">Channels im Kalender</span>
    <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-channel-input" name="calendar_channel" value="fussball" checked> <span>Fussball</span></label>
    <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-channel-input" name="calendar_channel" value="formel1" checked> <span>Formel 1</span></label>
    <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-channel-input" name="calendar_channel" value="presentation" checked> <span>Events</span></label>
    <label class="robby-settings-channel-cb"><input type="checkbox" class="robby-settings-channel-input" name="calendar_channel" value="conference"> <span>Konferenzen</span></label>
  </div>
    <hr class="robby-settings-divider">
  <h3 class="robby-user__subtitle robby-text--muted">Ort / Land</h3>
  <p class="robby-settings-place-country">
    <span class="robby-settings-place-country__label">Ort:</span>
    <strong>–</strong>
    <br>
    <span class="robby-settings-place-country__label">Land:</span>
    <strong>–</strong>
  </p>
  <p class="robby-text--muted robby-settings-channels-hint">Ort und Land können im Profil gesetzt werden.</p>
  <div class="robby-settings-actions">
    <button type="button" class="robby-settings-apply-btn" id="robby-settings-apply-btn">Übernehmen</button>
  </div>
  <hr class="robby-settings-divider">
  <div class="robby-settings-about-logo">
    <img src="images/logos/robby_logo_antenna_out.png" alt="robby" class="robby-settings-about-logo__img">
  </div>
  <h3 class="robby-settings-about-title">Über robby</h3>
  <p class="robby-settings-about-meta">
    Version: <strong>4.2.11</strong>
    &nbsp;·&nbsp;
    Stand: <strong>20.03.2026</strong>
  </p>
  <div class="robby-settings-about-features">
    <p class="robby-settings-about-features__title">Neue Funktionen</p>
    <ul class="robby-settings-about-features__list">
          </ul>
  </div>
</div>
      </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-set-password-modal" role="dialog" aria-labelledby="robby-set-password-title" aria-modal="true" aria-hidden="true" hidden>
    <div class="robby-modal__backdrop" id="robby-set-password-backdrop"></div>
    <div class="robby-modal__dialog">
      <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-set-password-modal" aria-label="Schließen">&times;</button>
      <div class="robby-modal__body robby-modal__body--profile">
              </div>
    </div>
  </div>
  <div class="robby-modal robby-modal--doc" id="robby-location-finder-modal" role="dialog" aria-modal="true" aria-labelledby="robby-location-finder-title" aria-hidden="true" hidden>
  <div class="robby-modal__backdrop"></div>
  <div class="robby-modal__dialog robby-modal__dialog--wide">
    <button type="button" class="robby-modal__close robby-doc-modal-close" data-doc-modal="robby-location-finder-modal" aria-label="Schließen">&times;</button>
    <div class="robby-modal__body robby-location-finder">
      <h2 id="robby-location-finder-title" class="robby-location-finder__title">Veranstaltungsort suchen</h2>
      <p class="robby-location-finder__hint">Mehrere Begriffe werden mit UND verknüpft. Die Suche entspricht der Tabelle „event_location“. Vorbefüllung aus Land, Stadt und Straße.</p>
      <div class="robby-location-finder__search-row">
        <label class="robby-location-finder__search-label">
          <span class="robby-location-finder__search-label-text">Suchbegriffe</span>
          <input type="search" id="robby-location-finder-q" class="robby-form-input" autocomplete="off" placeholder="z. B. Deutschland Köln Messe">
        </label>
        <button type="button" id="robby-location-finder-run" class="robby-btn robby-btn--primary">Suchen</button>
      </div>
      <div id="robby-location-finder-status" class="robby-location-finder__status" aria-live="polite"></div>
      <div id="robby-location-finder-results" class="robby-location-finder__results"></div>
    </div>
  </div>
</div>
<script>
(function() {
  var apiUrl = "\/api\/event_location.php";
  var msgEmpty = "Keine Treffer.";
  var msgError = "Suche fehlgeschlagen.";
  var labelApply = "\u00dcbernehmen";

  function esc(s) {
    if (s == null) return '';
    var d = document.createElement('div');
    d.textContent = String(s);
    return d.innerHTML;
  }

  function buildStreet(streetName, strNbr) {
    var a = (streetName || '').trim();
    var b = (strNbr || '').trim();
    if (a && b) return a + ' ' + b;
    return a || b;
  }

  function applyRow(row) {
    var idEl = document.getElementById('robby-event-editor-loc-id');
    var zipEl = document.querySelector('input[name="zip"]');
    var cntrEl = document.querySelector('input[name="cntr_name"]');
    var streetEl = document.querySelector('input[name="street"]');
    var ctyEl = document.querySelector('input[name="cty_name"]');
    var latEl = document.getElementById('robby-event-editor-lat');
    var lonEl = document.getElementById('robby-event-editor-lon');
    var locEl = document.querySelector('input[name="loc_name"]');
    var iso2El = document.getElementById('robby-event-editor-iso2');
    var iso3El = document.getElementById('robby-event-editor-iso3');
    if (idEl) idEl.value = row.id != null ? String(row.id) : '';
    if (zipEl) zipEl.value = row.zip != null ? String(row.zip).trim() : '';
    if (cntrEl) cntrEl.value = row.cntr_name != null ? String(row.cntr_name).trim() : '';
    if (ctyEl) ctyEl.value = row.cty_name != null ? String(row.cty_name).trim() : '';
    if (streetEl) streetEl.value = buildStreet(row.street_name, row.str_nbr);
    if (locEl) locEl.value = row.loc_name != null ? String(row.loc_name).trim() : '';
    if (latEl && row.lat != null && row.lat !== '') {
      var la = parseFloat(row.lat);
      if (!isNaN(la)) latEl.value = la.toFixed(6);
    }
    if (lonEl && row.lon != null && row.lon !== '') {
      var lo = parseFloat(row.lon);
      if (!isNaN(lo)) lonEl.value = lo.toFixed(6);
    }
    if (iso3El && row.iso3 != null && String(row.iso3).trim() !== '') {
      iso3El.value = String(row.iso3).trim().toUpperCase().substring(0, 3);
    }
    if (iso2El) {
      iso2El.value = '';
    }
    if (typeof window.robbyCloseDocModal === 'function') {
      window.robbyCloseDocModal('robby-location-finder-modal');
    }
  }

  function renderRows(data) {
    var box = document.getElementById('robby-location-finder-results');
    if (!box) return;
    box.innerHTML = '';
    if (!data || !data.length) {
      box.innerHTML = '<p class="robby-location-finder__empty">' + esc(msgEmpty) + '</p>';
      return;
    }
    data.forEach(function(row) {
      var line = [
        row.loc_name,
        row.cty_name,
        row.cntr_name,
        buildStreet(row.street_name, row.str_nbr),
        row.zip
      ].filter(function(x) { return x != null && String(x).trim() !== ''; }).map(function(x) { return String(x).trim(); }).join(' · ');
      var wrap = document.createElement('div');
      wrap.className = 'robby-location-finder__row';
      wrap.innerHTML = '<div class="robby-location-finder__row-main"><span class="robby-location-finder__row-id">ID ' + esc(row.id) + '</span> ' + esc(line) + '</div>';
      var btn = document.createElement('button');
      btn.type = 'button';
      btn.className = 'robby-btn robby-btn--secondary robby-location-finder__apply';
      btn.textContent = labelApply;
      btn.addEventListener('click', function() { applyRow(row); });
      wrap.appendChild(btn);
      box.appendChild(wrap);
    });
  }

  function runSearch() {
    var qIn = document.getElementById('robby-location-finder-q');
    var st = document.getElementById('robby-location-finder-status');
    var box = document.getElementById('robby-location-finder-results');
    if (!qIn || !apiUrl) return;
    var q = qIn.value.trim();
    if (st) st.textContent = '';
    if (box) box.innerHTML = '';
    var url = apiUrl + '?limit=40&q=' + encodeURIComponent(q);
    fetch(url, { credentials: 'same-origin' })
      .then(function(r) { return r.json(); })
      .then(function(j) {
        if (!j || !j.success) {
          if (st) st.textContent = msgError;
          return;
        }
        renderRows(j.data || []);
      })
      .catch(function() {
        if (st) st.textContent = msgError;
      });
  }

  var runBtn = document.getElementById('robby-location-finder-run');
  if (runBtn) runBtn.addEventListener('click', runSearch);

  var qInput = document.getElementById('robby-location-finder-q');
  if (qInput) {
    qInput.addEventListener('keydown', function(e) {
      if (e.key === 'Enter') {
        e.preventDefault();
        runSearch();
      }
    });
  }

  function prefillFromEditor() {
    var inp = document.getElementById('robby-location-finder-q');
    if (!inp) return;
    var c = (document.querySelector('input[name="cntr_name"]') || {}).value || '';
    var city = (document.querySelector('input[name="cty_name"]') || {}).value || '';
    var st = (document.querySelector('input[name="street"]') || {}).value || '';
    inp.value = [c, city, st].map(function(x) { return String(x).trim(); }).filter(Boolean).join(' ');
  }

  window.addEventListener('load', function() {
    var orig = window.robbyOpenDocModal;
    if (typeof orig !== 'function') return;
    window.robbyOpenDocModal = function(id) {
      if (id === 'robby-location-finder-modal') {
        prefillFromEditor();
        var st = document.getElementById('robby-location-finder-status');
        var box = document.getElementById('robby-location-finder-results');
        if (st) st.textContent = '';
        if (box) box.innerHTML = '';
      }
      return orig.apply(this, arguments);
    };
  });
})();
</script>

    <script>
    window.robbyModalsConfig = {
      mailerMasked: {"VARIOMEDIA_MAILER_EMAIL":"in***@***.ag","VARIOMEDIA_MAILER_USER":"in***@***.ag","VARIOMEDIA_MAILER_SMTP":"sm***","VARIOMEDIA_MAILER_PORT":"46***","VARIOMEDIA_MAILER_PASSWORD":"***"},
      hashToModal: { 'help': 'robby-help-modal', 'faq': 'robby-faq-modal', 'imprint': 'robby-imprint-modal', 'privacy': 'robby-privacy-modal', 'terms': 'robby-terms-modal', 'contact': 'robby-contact-modal', 'recommend': 'robby-recommend-modal', 'dashboard': 'robby-dashboard-modal', 'settings': 'robby-settings-modal', 'login': 'robby-login-modal', 'register': 'robby-login-modal' },
      docModalIds: ['robby-profile-modal', 'robby-follow-login-modal', 'robby-channels-limit-modal', 'robby-help-modal', 'robby-faq-modal', 'robby-imprint-modal', 'robby-privacy-modal', 'robby-terms-modal', 'robby-contact-modal', 'robby-recommend-modal', 'robby-dashboard-modal', 'robby-settings-modal', 'robby-set-password-modal', 'robby-location-finder-modal']
    };
    window.robbySettingsConfig = {
      calendarChannelsValid: ["fussball","formel1","presentation"],
      loggedIn: false,
      settingsSaveUrl: "\/api\/settings-save.php"    };
  </script>
  <script src="js/robby-doc-modals.js"></script>
  <script src="js/robby-profile-modal.js"></script>
  <script src="js/robby-settings.js"></script>
  <script src="js/robby-login.js"></script>
  <script src="js/robby-profile-save.js"></script>
  <script src="js/robby-set-password.js"></script>
  <script src="js/robby-forms.js"></script>
  <script src="js/robby-profile-upload.js"></script>
  <script src="js/robby-geo.js"></script>
  <script src="js/robby-search-form.js"></script>
  <script src="js/robby-debug.js"></script>
  <!-- Analytics: b2b-explorer.net (cookiefrei, DSGVO-konform; Seiten-Tracking via visit.php, nicht visits.php-Statistik-API) -->
  <script>
  (function(){
    var p = encodeURIComponent(window.location.href);
    var r = encodeURIComponent(document.referrer);
    new Image().src = 'https://b2b-explorer.net/api/visit.php?sid=rob-by&url='+p+'&ref='+r;
  })();
  </script>
</body>
</html>
