Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


<?php
/*
 * Event-Kalender - kalenderform.php (utf-8)
 * - https://werner-zenk.de

  Dieses Script wird in der Hoffnung verteilt, dass es nützlich sein wird, aber ohne irgendeine Garantie;
  ohne auch nur die implizierte Gewährleistung der Marktgängigkeit oder Eignung für einen bestimmten Zweck.
  Weitere Informationen finden Sie in der GNU General Public License.
  Siehe Datei: license.txt - http://www.gnu.org/licenses/gpl.html

  Diese Datei und der gesamte "Event-Kalender" ist urheberrechtlich geschützt (c) Werner Zenk alle Rechte vorbehalten.
  Sie können diese Datei unter den Bedingungen der GNU General Public License frei verwenden und weiter verbreiten.
 */

// modify RaHa ->
// Modifikation SENDE-EVENT-MAIL
function sendeeventmail() {
 global $db, $TABLE_PREFIX, $startMonat, $startTag, $startJahr, $volltag, $HTML_TAGS, $name, $gruppe, $wiederholung, $benachrichtigung, $privat, $KATEGORIEN, $KATEGORIE_EMAIL, $PRIORITAET, $PRIORITAET_KATEGORIE_FARBE, $ABSENDER;
 
    if ($benachrichtigung !== 1) { return; }
    
    if (strpos($_POST["ort"], "@") > 0 ) {
         $MAIL_EMPFAENGER = trim($_POST["ort"]); 
         // hier sollte noch eine Überprüfung hin, ob die Adresse vorhanden ist
    } else {
         $ist_kategorie = $_POST["kategorie"];
         $ist_kategorie = array_keys($KATEGORIEN, $ist_kategorie);
         if (isset($ist_kategorie[0])) { $ist_kategorie = $ist_kategorie[0]; } else { return; }
    
         if (!isset($KATEGORIE_EMAIL[$ist_kategorie])) { return; }
    
          $MAIL_EMPFAENGER = $KATEGORIE_EMAIL[$ist_kategorie];
     }     

     if (isset($_POST["eintragen"])) {
         // Datum zusammensetzen
         $start = $startJahr . '-' . sprintf("%02s", $startMonat) . '-' . sprintf("%02s", $startTag) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde"] . ':' . $_POST["minute"]);
         $ende = $startJahr . '-' . sprintf("%02s", $startMonat) . '-' . sprintf("%02s", $startTag) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde2"] . ':' . $_POST["minute2"]);
         
     } else {
         // Datum zusammensetzen
         $start = $_POST["jahr"] . '-' . sprintf("%02s", $_POST["monat"]) . '-' . sprintf("%02s", $_POST["tag"]) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde"] . ':' . $_POST["minute"]);
             $ende = $_POST["jahr"] . '-' . sprintf("%02s", $_POST["monat"]) . '-' . sprintf("%02s", $_POST["tag"]) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde2"] . ':' . $_POST["minute2"]);
     }
     
        $start = str_replace("00:00", "", $start);
        $ende = str_replace("00:00", "", $ende);

     include_once "kalendersende-event-mail.php";
     
     return;
     
}
// <- modify RaHa


/*
 * Anmeldung
 */
if (isset($_POST["anmelden"])) {

  // Benutzer überprüfen
  if (
    isset($NAME_PASS[trim($_POST["name"])]) &&
    $NAME_PASS[trim($_POST["name"])] === $_POST["passwort"]
  ) {
    $_SESSION["name"] = $_POST["name"];
    echo  '<!-- P -->'; // OK
  } else {
    echo  '<!-- X -->'; // KO
  }
}


/*
 * Abmeldung
 */
if (isset($_POST["abmelden"])) {

  if (session_destroy()) {
    $_SESSION = [];
    echo  '<!-- O -->'; // Die Abmeldung war erfolgreich.
  }
}


/*
 * Event eintragen
 */

if (isset($_POST["eintragen"])) {

  // Benutzer überprüfen
  if (BENUTZER == true) {

    // Datum überprüfen
    if (
      checkdate($_POST["monat"], $_POST["tag"], $_POST["jahr"]) &&
      $_POST["jahr"] >= $JAHR_MIN &&
      $_POST["jahr"] <= $JAHR_MAX
    ) {

      // Ganztägig / Wiederholung / Benachrichtigung / Privat
      $_POST["beschreibung"] = strip_tags(trim($_POST["beschreibung"]), $HTML_TAGS);
      $volltag = isset($_POST["volltag"]) ? 1 : 0;
      $wiederholung = isset($_POST["wiederholung"]) ? 1 : 0;
      $benachrichtigung = isset($_POST["benachrichtigung"]) ? 1 : 0;
      $privat = isset($_POST["privat"]) ? 1 : 0;

      // Name ermitteln
      if (isset($_POST["name"])) {
        $name = $_POST["name"];

        // Wenn der Name fehlt
        if (empty($_POST["name"])) {
          $name = $_SESSION["name"];
        }
      } else {
        $name = $_SESSION["name"];
      }

      // Dauer des Events
      $dauer = !ctype_digit($_POST["dauer"]) ? '1' : $_POST["dauer"];


      // Serienevents
      if (
        $dauer >= 1 &&
        $dauer <= $SERIENEVENTS
      ) {

        $startTag = $_POST["tag"];
        $startMonat = $_POST["monat"];
        $startJahr = $_POST["jahr"];
        $zaehler = 0;
        $gruppe = date("YmdHis") . mt_rand(100, 999);
        $starttime = mktime(0, 0, 0, $startMonat, $startTag, $startJahr);

        if (!isset($_POST["tageauswahl"])) {

          for ($i = 0; $i < $_POST["repeatcount"]; $i++) {

            $startJahr = date("Y", $starttime);
            $startMonat = date("m", $starttime);
            $startTag = date("d", $starttime);
            $everyTime = intval($_POST["repeatnr"]);
            $everyTime = ($everyTime < 1) ? 1 : $everyTime;

            if ($_POST["repeat"] == "NORMAL") {
              $_POST["repeatnr"] = 1;
              $_POST["repeatcount"] = 1;
            } else {
              eventEintragen();
              $tagtime = $starttime;
              for ($y = 1; $y < $dauer; $y++) {
                $tagtime = strtotime("+ 1 day", $tagtime);
                $startJahr = date("Y", $tagtime);
                $startMonat = date("m", $tagtime);
                $startTag = date("d", $tagtime);
                eventEintragen();
              }
            }

            switch ($_POST["repeat"]) {

              case "NORMAL":
                for ($y = 0; $y < $dauer; $y++) {
                  eventEintragen();
                  $starttime = strtotime("+ 1 day", $starttime);
                  $startJahr = date("Y", $starttime);
                  $startMonat = date("m", $starttime);
                  $startTag = date("d", $starttime);
                }
                break;

              case "TAG":
                $days = "+" . strval($everyTime) . " day";
                $starttime = strtotime($days, $starttime);
                break;

              case "WOCHE":
                $weeks =  "+" . $everyTime . " week";
                $starttime = strtotime($weeks, $starttime);
                break;

              case "MONAT4W":
                $everyTime = intval($_POST["repeatnr"]) * 4;
                $everyTime = ($everyTime < 1) ? 1 : $everyTime;
                $weeks =  "+" . $everyTime . " week";
                $starttime = strtotime($weeks, $starttime);
                break;

              case "MONAT":
                $months =  "+" . $everyTime . " month";
                $starttime = strtotime($months, $starttime);
                break;

              case "MONTAG":
                $monday =  "+" . $everyTime . " Monday";
                $starttime = strtotime($monday, $starttime);
                break;

              case "DIENSTAG":
                $tuesday =  "+" . $everyTime . " Tuesday";
                $starttime = strtotime($tuesday, $starttime);
                break;

              case "MITTWOCH":
                $wednesday =  "+" . $everyTime . " Wednesday";
                $starttime = strtotime($wednesday, $starttime);
                break;

              case "DONNERSTAG":
                $thursday =  "+" . $everyTime . " Thursday";
                $starttime = strtotime($thursday, $starttime);
                break;

              case "FREITAG":
                $friday =  "+" . $everyTime . " Friday";
                $starttime = strtotime($friday, $starttime);
                break;

              case "SAMSTAG":
                $saturday =  "+" . $everyTime . " Saturday";
                $starttime = strtotime($saturday, $starttime);
                break;

              case "SONNTAG":
                $sunday =  "+" . $everyTime . " Sunday";
                $starttime = strtotime($sunday, $starttime);
                break;
            }
          }
        } else {

          // Tageauswahl (mehrere Tage wurden ausgewählt)
          if (isset($_POST["tage"])) {

            // Eintragen
            foreach ($_POST["tage"] as $tag) {

              // Datum zusammensetzen
              $start = $tag . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde"] . ':' . $_POST["minute"]) . ':' . '01';
              $ende = $tag . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde2"] . ':' . $_POST["minute2"]) . ':' . '00';

              // Farben tauschen
              tauschePrioritaetFarbe_kategorieFarbe();

              $insert = $db->prepare("INSERT INTO `" . $TABLE_PREFIX . "_kalender`
                                            SET
                                              `start`= :start,
                                              `ende`= :ende,
                                              `volltag`= :volltag,
                                              `name`= :name,
                                              `event`= :event,
                                              `beschreibung`= :beschreibung,
                                              `adresse`= :adresse,
                                              `prioritaet`= :prioritaet,
                                              `gruppe`= :gruppe,
                                              `benachrichtigung`= :benachrichtigung,
                                              `privat`= :privat,
                                              `aufgabe`= :aufgabe,
                                              `kategorie`= :kategorie");

              $insert->execute([
                ':start' => $start,
                ':ende' => $ende,
                ':volltag' => $volltag,
                ':name' => $name,
                ':event' => strip_tags($_POST["event"]),
                ':beschreibung' => strip_tags(trim($_POST["beschreibung"]), $HTML_TAGS),
                ':adresse' => $_POST["adresse"],
                ':prioritaet' => $_POST["prioritaet"],
                ':gruppe' => $gruppe,
                ':benachrichtigung' => $benachrichtigung,
                ':privat' => $privat,
                ':aufgabe' => $_POST["aufgabe"],
                ':kategorie' => $_POST["kategorie"]
              ]);
            }
            $dauer = count($_POST["tage"]);
          } else {
            die('<!-- X2 -->'); // Ungültiges Datum
          }
        }

        $ef = ($dauer == 1) ? 'E' : 'F';
        echo  $_POST["jahr"] . '|' . $_POST["monat"] . '|' . $ef;
          // modify RaHa ->
          // Modifikation SENDE-EVENT-MAIL
              sendeeventmail(); 
          // <- modify RaHa
     } else {
        echo  '<!-- X6 -->'; // Die Anzahl der Tage benötigt einen gültigen Wert!
      }
    } else {
      echo  '<!-- X2 -->'; // Ungültiges Datum
    }
  }
}


/*
 * Event kopieren oder bearbeiten
 */
if (isset($_POST["bearbeiten"])) {

  // Datum überprüfen
  if (
    checkdate($_POST["monat"], $_POST["tag"], $_POST["jahr"]) &&
    $_POST["jahr"] >= $JAHR_MIN &&
    $_POST["jahr"] <= $JAHR_MAX
  ) {

    // Benutzer überprüfen
    if (BENUTZER == true) {

      // Name und Gruppe aus der DB-Tabelle holen
      $select = $db->prepare("SELECT `name`, `gruppe`
                                       FROM `" . $TABLE_PREFIX . "_kalender`
                                       WHERE `id` = :id");

      $select->execute([':id' => $_POST["id"]]);
      $status = $select->fetch();

      // Berechtigung des Benutzers überprüfen
      if (
        $_SESSION["name"] === $status["name"] ||
        $_SESSION["name"] === $NAME
      ) { // Admin.

        // Datum zusammensetzen
        $start = $_POST["jahr"] . '-' . zZ($_POST["monat"]) . '-' . zZ($_POST["tag"]) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde"] . ':' . $_POST["minute"]) . ':' . '01';
        $ende = $_POST["jahr"] . '-' . zZ($_POST["monat"]) . '-' . zZ($_POST["tag"]) . ' ' . (isset($_POST["volltag"]) ? '00:00' : $_POST["stunde2"] . ':' . $_POST["minute2"]) . ':' . '00';


        // Ganztägig / Wiederholung / Benachrichtigung / Privat
        $volltag = isset($_POST["volltag"]) ? 1 : 0;
        $wiederholung = isset($_POST["wiederholung"]) ? 1 : 0;
        $benachrichtigung = isset($_POST["benachrichtigung"]) ? 1 : 0;
        $privat = isset($_POST["privat"]) ? 1 : 0;

        // Name ermitteln
        if (isset($_POST["name"])) {
          $name = $_POST["name"];

          if (empty($_POST["name"])) {
            $name = $_SESSION["name"];
          }
        } else {
          $name = $_SESSION["name"];
        }

        // Event kopieren
        if (isset($_POST["kopieren"])) {

          // Gruppe zuweisen
          $gruppe = $status["gruppe"];
          if (isset($_POST["neuegruppe"])) {
            $gruppe = date("YmdHis") . mt_rand(100, 999);
          }

          $insert = $db->prepare("INSERT INTO `" . $TABLE_PREFIX . "_kalender`
                                           SET
                                             `start`= :start,
                                             `ende`= :ende,
                                             `volltag`= :volltag,
                                             `name`= :name,
                                             `event`= :event,
                                             `beschreibung`= :beschreibung,
                                             `adresse`= :adresse,
                                             `prioritaet`= :prioritaet,
                                             `gruppe`= :gruppe,
                                             `wiederholung`= :wiederholung,
                                             `benachrichtigung`= :benachrichtigung,
                                             `privat`= :privat,
                                             `aufgabe`= :aufgabe,
                                             `kategorie`= :kategorie");

          if ($insert->execute([
            ':start' => $start,
            ':ende' => $ende,
            ':volltag' => $volltag,
            ':name' => $name,
            ':event' => strip_tags($_POST["event"]),
            ':beschreibung' => strip_tags(trim($_POST["beschreibung"]), $HTML_TAGS),
            ':adresse' => $_POST["adresse"],
            ':prioritaet' => $_POST["prioritaet"],
            ':gruppe' => $gruppe,
            ':wiederholung' => $wiederholung,
            ':benachrichtigung' => $benachrichtigung,
            ':privat' => $privat,
            ':aufgabe' => $_POST["aufgabe"],
            ':kategorie' => $_POST["kategorie"]
          ])) {
            echo  intval($_POST["jahr"]) . '|' . intval($_POST["monat"]) . '|K';
          }
        }

        // Event bearbeiten
        else {

          // Farben tauschen
          tauschePrioritaetFarbe_kategorieFarbe();

          $update = $db->prepare("UPDATE `" . $TABLE_PREFIX . "_kalender`
                                             SET
                                               `start`= :start,
                                               `ende`= :ende,
                                               `volltag`= :volltag,
                                               `name`= :name,
                                               `event`= :event,
                                               `beschreibung`= :beschreibung,
                                               `adresse`= :adresse,
                                               `prioritaet`= :prioritaet,
                                               `wiederholung`= :wiederholung,
                                               `benachrichtigung`= :benachrichtigung,
                                               `privat`= :privat,
                                               `aufgabe`= :aufgabe,
                                               `kategorie`= :kategorie
                                              WHERE
                                               `id` = :id");

          if ($update->execute([
            ':start' => $start,
            ':ende' => $ende,
            ':volltag' => $volltag,
            ':name' => $name,
            ':event' => strip_tags($_POST["event"]),
            ':beschreibung' => $_POST["beschreibung"],
            ':adresse' => $_POST["adresse"],
            ':prioritaet' => $_POST["prioritaet"],
            ':wiederholung' => $wiederholung,
            ':benachrichtigung' => $benachrichtigung,
            ':privat' => $privat,
            ':aufgabe' => $_POST["aufgabe"],
            ':kategorie' => $_POST["kategorie"],
            ':id' => $_POST["id"]
          ])) {
            echo  intval($_POST["jahr"]) . '|' . intval($_POST["monat"]) . '|A';
          }
        }
          // modify RaHa ->
          // Modifikation SENDE-EVENT-MAIL
              sendeeventmail(); 
          // <- modify RaHa
      } else {
        echo  '<!-- X3 -->'; // Keine Berechtigung zum ändern
      }
    }
  } else {
    echo  '<!-- X2 -->'; // Ungültiges Datum
  }
}


/*
 * Event löschen
 */
if (
  isset(
    $_POST["loeschen"],
    $_POST["bestaetigung"]
  ) || // Bestätigung zum löschen
  isset($_POST["gruppe_del"])
) {

  // Benutzer überprüfen
  if (BENUTZER == true) {

    // Jahr, Monat und Name aus der DB-Tabelle holen
    $select = $db->prepare("SELECT YEAR(`start`) AS jahr, MONTH(`start`) AS monat, `name`
                                        FROM `" . $TABLE_PREFIX . "_kalender`
                                        WHERE `id` = :id");

    $select->execute([':id' => $_POST["id"]]);
    $status = $select->fetch();

    // Berechtigung des Benutzers überprüfen
    if (
      $_SESSION["name"] === $status["name"] ||
      $_SESSION["name"] === $NAME
    ) { // Admin.

      // Löschen
      if (isset($_POST["gruppe_del"])) {
        $delete = $db->prepare("DELETE FROM `" . $TABLE_PREFIX . "_kalender`
                                           WHERE `gruppe`= :gruppe");

        if ($delete->execute([':gruppe' => $_POST["gruppe"]])) {
          echo  $status["jahr"] . '|' . $status["monat"] . '|M';
        }
      } else {
        $delete = $db->prepare("DELETE FROM `" . $TABLE_PREFIX . "_kalender`
                                           WHERE `id`= :id");

        if ($delete->execute([':id' => $_POST["id"]])) {
          echo  $status["jahr"] . '|' . $status["monat"] . '|L';
        }
      }
    } else {
      echo  '<!-- X4 -->'; // Sie haben keine Berechtigung diesen Event zu löschen!
    }
  }
}


/*
 * Suche
 */
if (isset($_POST["suchbegriff"])) {

  // Nach dem Marker (*) suchen und entfernen
  $asterisk = substr_count($_POST["suchbegriff"], '*') > 0 ? true : false;
  $suchbegriff = trim(str_replace("*", "", $_POST["suchbegriff"]));

  // Ungültige HTML-Zeichen umwandeln
  $suchbegriff = trim(htmlspecialchars($suchbegriff, ENT_HTML5, 'UTF-8'));

  if ($suchbegriff != "") {

    // Tipps zur Suche
    $tippsZurSuche = '<details>
<summary>Tipps zur Suche</summary>

 <p>Es kann nach einem <em>Event</em>, einer <em>Beschreibung</em> einem <em>Namen</em> einer <em>Kategorie</em>, einer <em>URL</em>, <br>
 einer <em>Adresse</em>, einem <em>Schlüsselwort</em>, einem <em>Datum</em>, einer <em>Uhrzeit</em> oder einem Emoji &#128521;<br>
 gesucht werden.</p>
 <p>Beachten Sie dabei die Groß.- und Kleinschreibung sowie die Rechtschreibung!</p>
 <p>Fügen  Sie ein <span style="color: var(--highlight-color)">*</span> (Sternchen) hinzu, um im gesamten Kalender zu suchen.</p>

 <p>Ein <span style="color: var(--highlight-color)">%</span> (Prozent-Zeichen) als Platzhalter für ein oder mehrere Zeichen, <br>
 wenn Sie den Suchbegriff nicht genau kennen (z. B.: <em>Ph</em><span style="color: var(--highlight-color)">%</span><em>onie</em> für <em>Philharmonie</em>)<br>
 oder einen <span style="color: var(--highlight-color)">_</span> (Unterstrich) für ein einzelnes Zeichen.</p>

 <p>Um nach einem bestimmten Datum zu suchen geben Sie: <span style="color: var(--highlight-color)"><span title="Jahr">YYYY</span>-<span title="Monat">MM</span>-<span title="Tag">DD</span></span> ein<br>
 (z. B.: <strong>' . date("Y-m-d") . '</strong>). Einen Monatstag erhalten Sie mit: <span style="color: var(--highlight-color)">-<span title="Monat">MM</span>-<span title="Tag">DD</span></span> (z. B.: <strong>' . date("-m-d") . '</strong>)<br>
 oder: <span style="color: var(--highlight-color)">-%-<span title="Tag">DD</span></span> für einen Tag (z. B.: <strong>-%-' . date("d") . '</strong>).</p>

 <p>Eine bestimmte Uhrzeit finden Sie mit: <span style="color: var(--highlight-color)"><span title="Stunden">HH</span>:<span title="Minuten">II</span></span> (z. B.: <strong>' . date("H:i") . '</strong>) oder <span style="color: var(--highlight-color)"><span title="Stunden">HH</span>:%</span><br>
 (z. B.: <strong>' . date("H:") . '%</strong>) wenn die Minuten unbekannt sind.<br>
 Das Komplette Datumsformat schaut folgend aus: <span style="color: var(--highlight-color)"><span title="Jahr (Y, 4-stellig)">YYYY</span>-<span title="Monat (M, 2-stellig)">MM</span>-<span title="Tag (D, 2-stellig)">DD</span> <span title="Stunden (H, 2-stellig)">HH</span>:<span title="Minuten (I, 2-stellig)">II</span>:<span title="Sekunden (S, 2-stellig)">SS</span></span>.</p>
</details>';


    // Anzahl der Wörter ermitteln
    $search = preg_split('/[\s]+/', $suchbegriff);

    // Nur im ausgewählten Jahr oder im gesamten Kalender suchen
    $arrays = isset($_POST["genau"]) ? [":suchbegriff" => $suchbegriff] : [":suchbegriff" => '%' . $suchbegriff . '%'];
    $sqlAndYear = $asterisk == true ? '' : "AND YEAR(`start`) = :jahr";
    $asterisk == false ? $arrays[":jahr"] = $_POST["jahr"] : null;
    $ascdesc = isset($_POST["absteigend"]) ? 'DESC' : 'ASC';
    $sqlOrderByLimit = " ORDER BY `" . $_POST["sortierung"] . "` " . $ascdesc . " LIMIT 250";
    $sqlAlike = isset($_POST["genau"]) ? "=" : "LIKE";

    // Nach mehreren Wörtern suchen
    if (
      count($search) > 1 &&
      count($search) < 13 &&
      mb_strlen($suchbegriff) >= 5 &&
      !isset($_POST["genau"])
    ) {

      // Wörter mit der Stopwortliste filtern
      $stoppwortliste = array("anderes", "beides", "braucht", "darüber", "des", "dort", "einen", "etwas", "gekonnt", "hätte", "ich", "innerhalb", "ist", "kann", "konnten", "mein", "möchten", "nachdem", "nutzt", "seine", "solange", "somit", "unser", "vorher", "was", "wen", "wieder", "würde", "zwischen", "ab", "aber", "abgerufen", "abgerufene", "abgerufener", "abgerufenes", "acht", "ähnlich", "alle", "allein", "allem", "allen", "aller", "allerdings", "allerlei", "alles", "allgemein", "allmählich", "allzu", "als", "alsbald", "also", "am", "an", "ander", "andere", "anderem", "anderen", "anderer", "andererseits", "anderes", "anderm", "andern", "andernfalls", "anders", "anerkannt", "anerkannte", "anerkannter", "anerkanntes", "anfangen", "anfing", "angefangen", "angesetze", "angesetzt", "angesetzten", "angesetzter", "ansetzen", "anstatt", "arbeiten", "auch", "auf", "aufgehört", "aufgrund", "aufhören", "aufhörte", "aufzusuchen", "aus", "ausdrücken", "ausdrückt", "ausdrückte", "ausgenommen", "außen", "ausser", "außer", "ausserdem", "außerdem", "außerhalb", "author", "autor", "bald", "bearbeite", "bearbeiten", "bearbeitete", "bearbeiteten", "bedarf", "bedürfen", "bedurfte", "befragen", "befragte", "befragten", "befragter", "begann", "beginnen", "begonnen", "behalten", "behielt", "bei", "beide", "beiden", "beiderlei", "beides", "beim", "beinahe", "beitragen", "beitrugen", "bekannt", "bekannte", "bekannter", "bekennen", "benutzt", "bereits", "berichten", "berichtet", "berichtete", "berichteten", "besonders", "besser", "bestehen", "besteht", "beträchtlich", "bevor", "bezüglich", "bietet", "bin", "bis", "bisher", "bislang", "bist", "bleiben", "blieb", "bloß", "bloss", "böden", "brachte", "brachten", "brauchen", "braucht", "bräuchte", "bringen", "bsp.", "bzw", "ca.", "da", "dabei", "dadurch", "dafür", "dagegen", "daher", "dahin", "damals", "damit", "danach", "daneben", "dank", "danke", "danken", "dann", "dannen", "daran", "darauf", "daraus", "darf", "darfst", "darin", "darüber", "darüberhinaus", "darum", "darunter", "das", "dass", "daß", "dasselbe", "davon", "davor", "dazu", "dein", "deine", "deinem", "deinen", "deiner", "deines", "dem", "demnach", "demselben", "den", "denen", "denn", "dennoch", "denselben", "der", "derart", "derartig", "derem", "deren", "derer", "derjenige", "derjenigen", "derselbe", "derselben", "derzeit", "des", "deshalb", "desselben", "dessen", "desto", "deswegen", "dich", "die", "diejenige", "dies", "diese", "dieselbe", "dieselben", "diesem", "diesen", "dieser", "dieses", "diesseits", "dinge", "dir", "direkt", "direkte", "direkten", "direkter", "doch", "doppelt", "dort", "dorther", "dorthin", "drauf", "drei", "dreißig", "drin", "dritte", "drüber", "drunter", "du", "dunklen", "durch", "durchaus", "dürfen", "durfte", "dürfte", "durften", "eben", "ebenfalls", "ebenso", "ehe", "eher", "eigenen", "eigenes", "eigentlich", "ein", "einbaün", "eine", "einem", "einen", "einer", "einerseits", "eines", "einfach", "einführen", "einführte", "einführten", "eingesetzt", "einig", "einige", "einigem", "einigen", "einiger", "einigermaßen", "einiges", "einmal", "eins", "einseitig", "einseitige", "einseitigen", "einseitiger", "einst", "einstmals", "einzig", "ende", "entsprechend", "entweder", "er", "ergänze", "ergänzen", "ergänzte", "ergänzten", "erhält", "erhalten", "erhielt", "erhielten", "erneut", "eröffne", "eröffnen", "eröffnet", "eröffnete", "eröffnetes", "erst", "erste", "ersten", "erster", "es", "etc", "etliche", "etwa", "etwas", "euch", "euer", "eure", "eurem", "euren", "eurer", "eures", "fall", "falls", "fand", "fast", "ferner", "finde", "finden", "findest", "findet", "folgende", "folgenden", "folgender", "folgendes", "folglich", "fordern", "fordert", "forderte", "forderten", "fortsetzen", "fortsetzt", "fortsetzte", "fortsetzten", "fragte", "frau", "frei", "freie", "freier", "freies", "fuer", "fünf", "für", "gab", "gängig", "gängige", "gängigen", "gängiger", "gängiges", "ganz", "ganze", "ganzem", "ganzen", "ganzer", "ganzes", "gänzlich", "gar", "gbr", "geb", "geben", "geb
lieben", "gebracht", "gedurft", "geehrt", "geehrte", "geehrten", "geehrter", "gefallen", "gefälligst", "gefällt", "gefiel", "gegeben", "gegen", "gehabt", "gehen", "geht", "gekommen", "gekonnt", "gemacht", "gemäß", "gemäss", "gemocht", "genommen", "genug", "gern", "gesagt", "gesehen", "gestern", "gestrige", "getan", "geteilt", "geteilte", "getragen", "gewesen", "gewissermaßen", "gewollt", "geworden", "ggf", "gib", "gibt", "gleich", "gleichwohl", "gleichzeitig", "glücklicherweise", "gmbh", "gratulieren", "gratuliert", "gratulierte", "gut", "gute", "guten", "hab", "habe", "haben", "haette", "halb", "hallo", "hast", "hat", "hätt", "hatte", "hätte", "hatten", "hätten", "hattest", "hattet", "hen", "heraus", "herein", "heute", "heutige", "hier", "hiermit", "hiesige", "hin", "hinein", "hinten", "hinter", "hinterher", "hoch", "höchstens", "hundert", "ich", "igitt", "ihm", "ihn", "ihnen", "ihr", "ihre", "ihrem", "ihren", "ihrer", "ihres", "im", "immer", "immerhin", "important", "in", "indem", "indessen", "info", "infolge", "innen", "innerhalb", "ins", "insofern", "inzwischen", "irgend", "irgendeine", "irgendwas", "irgendwen", "irgendwer", "irgendwie", "irgendwo", "ist", "ja", "jährig", "jährige", "jährigen", "jähriges", "je", "jede", "jedem", "jeden", "jedenfalls", "jeder", "jederlei", "jedes", "jedoch", "jemand", "jene", "jenem", "jenen", "jener", "jenes", "jenseits", "jetzt", "kam", "kann", "kannst", "kaum", "kein", "keine", "keinem", "keinen", "keiner", "keinerlei", "keines", "keineswegs", "klar", "klare", "klaren", "klares", "klein", "kleinen", "kleiner", "kleines", "koennen", "koennt", "koennte", "koennten", "komme", "kommen", "kommt", "konkret", "konkrete", "konkreten", "konkreter", "konkretes", "könn", "können", "könnt", "konnte", "könnte", "konnten", "könnten", "künftig", "lag", "lagen", "langsam", "längst", "längstens", "lassen", "laut", "lediglich", "leer", "legen", "legte", "legten", "leicht", "leider", "lesen", "letze", "letzten", "letztendlich", "letztens", "letztes", "letztlich", "lichten", "liegt", "liest", "links", "mache", "machen", "machst", "macht", "machte", "machten", "mag", "magst", "mal", "man", "manche", "manchem", "manchen", "mancher", "mancherorts", "manches", "manchmal", "mann", "margin", "mehr", "mehrere", "mein", "meine", "meinem", "meinen", "meiner", "meines", "meist", "meiste", "meisten", "meta", "mich", "mindestens", "mir", "mit", "mithin", "mochte", "möchte", "möchten", "möchtest", "mögen", "möglich", "mögliche", "möglichen", "möglicher", "möglicherweise", "morgen", "morgige", "muessen", "muesst", "muesste", "muss", "muß", "müssen", "musst", "mußt", "müßt", "musste", "müsste", "müßte", "mussten", "müssten", "nach", "nachdem", "nacher", "nachhinein", "nächste", "nacht", "nahm", "nämlich", "natürlich", "neben", "nebenan", "nehmen", "nein", "neu", "neue", "neuem", "neuen", "neuer", "neues", "neun", "nicht", "nichts", "nie", "niemals", "niemand", "nimm", "nimmer", "nimmt", "nirgends", "nirgendwo", "noch", "nötigenfalls", "nun", "nur", "nutzen", "nutzt", "nützt", "nutzung", "ob", "oben", "oberhalb", "obgleich", "obschon", "obwohl", "oder", "oft", "ohne", "per", "pfui", "plötzlich", "pro", "reagiere", "reagieren", "reagiert", "reagierte", "rechts", "regelmäßig", "rief", "rund", "sage", "sagen", "sagt", "sagte", "sagten", "sagtest", "sämtliche", "sang", "sangen", "schätzen", "schätzt", "schätzte", "schätzten", "schlechter", "schließlich", "schnell", "schon", "schreibe", "schreiben", "schreibens", "schreiber", "schwierig", "sechs", "sect", "sehe", "sehen", "sehr", "sehrwohl", "seht", "sei", "seid", "sein", "seine", "seinem", "seinen", "seiner", "seines", "seit", "seitdem", "seite", "seiten", "seither", "selber", "selbst", "senke", "senken", "senkt", "senkte", "senkten", "setzen", "setzt", "setzte", "setzten", "sich", "sicher", "sicherlich", "sie", "sieben", "siebte", "siehe", "sieht", "sind", "singen", "singt", "so", "sobald", "sodaß", "soeben", "sofern", "sofort", "sog", "sogar", "solange", "solc", "solch", "solche", "solchem", "solchen", "solcher",
 "solches", "soll", "sollen", "sollst", "sollt", "sollte", "sollten", "solltest", "somit", "sondern", "sonst", "sonstwo", "sooft", "soviel", "soweit", "sowie", "sowohl", "später", "spielen", "startet", "startete", "starteten", "statt", "stattdessen", "steht", "steige", "steigen", "steigt", "stets", "stieg", "stiegen", "such", "suchen", "tages", "tat", "tät", "tatsächlich", "tatsächlichen", "tatsächlicher", "tatsächliches", "tausend", "teile", "teilen", "teilte", "teilten", "titel", "toll", "total", "trage", "tragen", "trägt", "trotzdem", "trug", "tun", "tust", "tut", "txt", "übel", "über", "überall", "überallhin", "überdies", "übermorgen", "übrig", "übrigens", "ueber", "um", "ums", "umso", "unbedingt", "und", "ungefähr", "unmöglich", "unmögliche", "unmöglichen", "unmöglicher", "unnötig", "uns", "unse", "unsem", "unsen", "unser", "unsere", "unserem", "unseren", "unserer", "unseres", "unserm", "unses", "unten", "unter", "unterbrach", "unterbrechen", "unterhalb", "unwichtig", "usw", "vergangen", "vergangene", "vergangener", "vergangenes", "vermag", "vermögen", "vermutlich", "veröffentlichen", "veröffentlicher", "veröffentlicht", "veröffentlichte", "veröffentlichten", "veröffentlichtes", "verrate", "verraten", "verriet", "verrieten", "version", "versorge", "versorgen", "versorgt", "versorgte", "versorgten", "versorgtes", "viel", "viele", "vielen", "vieler", "vieles", "vielleicht", "vielmals", "vier", "völlig", "vollständig", "vom", "von", "vor", "voran", "vorbei", "vorgestern", "vorher", "vorne", "vorüber", "wachen", "waere", "während", "währenddessen", "wann", "war", "wär", "wäre", "waren", "wären", "warst", "warum", "was", "weder", "weg", "wegen", "weil", "weiß", "weiter", "weitere", "weiterem", "weiteren", "weiterer", "weiteres", "weiterhin", "welche", "welchem", "welchen", "welcher", "welches", "wem", "wen", "wenig", "wenige", "weniger", "wenigstens", "wenn", "wenngleich", "wer", "werde", "werden", "werdet", "weshalb", "wessen", "weswegen", "wichtig", "wie", "wieder", "wieso", "wieviel", "wiewohl", "will", "willst", "wir", "wird", "wirklich", "wirst", "wo", "wodurch", "wogegen", "woher", "wohin", "wohingegen", "wohl", "wohlweislich", "wolle", "wollen", "wollt", "wollte", "wollten", "wolltest", "wolltet", "womit", "woraufhin", "woraus", "worin", "wurde", "würde", "wurden", "würden", "z.B.", "zahlreich", "zehn", "zeitweise", "ziehen", "zieht", "zog", "zogen", "zu", "zudem", "zuerst", "zufolge", "zugleich", "zuletzt", "zum", "zumal", "zur", "zurück", "zusammen", "zuviel", "zwanzig", "zwar", "zwei", "zwischen", "zwölf");
      $searchfield = array();

      foreach ($search as $s) {

        // Hinzufügen wenn es nicht in der Stoppwortliste ist
        if (
          mb_strlen($s) >= 1 &&
          !in_array(mb_strtolower($s), $stoppwortliste)
        ) {
          $searchfield[] = $s;
        }
      }

      // Platzhalter
      $total_words = count($searchfield);
      $placeholder = [":p1", ":p2", ":p3", ":p4", ":p5", ":p6", ":p7", ":p8", ":p9", ":p10", ":p11", ":p12"];

      if (
        $total_words > 0 &&
        $total_words <= count($placeholder)
      ) {

        // SQL zusammensetzen ...
        $SQL = "SELECT `start`, `ende`, `volltag`, `name`, `event`, `beschreibung`, `adresse`, `prioritaet`, `wiederholung`, `benachrichtigung`, `privat`, `aufgabe`, `kategorie`, `gruppe`, `id` FROM `" . $TABLE_PREFIX . "_kalender` WHERE (";

        foreach ($searchfield as $key => $searchword) {
          $SQL .= "`event` LIKE " . $placeholder[$key] . " OR ";
          $SQL .= "`beschreibung` LIKE " . $placeholder[$key];

          if ($key != ($total_words - 1)) {
            $SQL .= " OR ";
          }
        }

        // ... und ausführen
        $select = $db->prepare($SQL . ") " . SQL_AND_INDIVIDUAL . SQL_AND_PRIVATE . $sqlAndYear . $sqlOrderByLimit);

        foreach ($searchfield as $key => $wort) {
          $like = "%" . $wort . "%";
          $select->bindValue($placeholder[$key], $like);
        }

        if ($asterisk == false) {
          $select->bindValue(":jahr", $_POST["jahr"]);
        }
        $select->execute();
        $events = $select->fetchAll();
      }
    }

    // Nach einem Wort suchen
    else {
      if (isset($_POST["aktuell"])) {

        $select = $db->prepare("SELECT `start`, `ende`, `volltag`, `name`, `event`, `beschreibung`, `adresse`, `prioritaet`, `wiederholung`, `benachrichtigung`, `privat`, `aufgabe`, `kategorie`, `gruppe`, `id`
                                          FROM `" . $TABLE_PREFIX . "_kalender` 
                                          WHERE ((TO_DAYS(`start`) - TO_DAYS(NOW())) >= 0
                                          AND (
                                              `name` " . $sqlAlike . " :suchbegriff OR
                                              `event` " . $sqlAlike . " :suchbegriff OR
                                              `beschreibung` " . $sqlAlike . " :suchbegriff OR 
                                              `adresse` " . $sqlAlike . " :suchbegriff OR 
                                              `kategorie` " . $sqlAlike . " :suchbegriff) 
                                          " . SQL_AND_INDIVIDUAL . SQL_AND_PRIVATE . " " . $sqlAndYear . ")
                                          " . $sqlOrderByLimit);
      } else {

        $select = $db->prepare("SELECT `start`, `ende`, `volltag`, `name`, `event`, `beschreibung`, `adresse`, `prioritaet`, `wiederholung`, `benachrichtigung`, `privat`, `aufgabe`, `kategorie`, `gruppe`, `id`
                                          FROM `" . $TABLE_PREFIX . "_kalender` 
                                          WHERE (
                                              `start` " . $sqlAlike . " :suchbegriff OR
                                              `ende` " . $sqlAlike . " :suchbegriff OR
                                              `name` " . $sqlAlike . " :suchbegriff OR
                                              `event` " . $sqlAlike . " :suchbegriff OR
                                              `beschreibung` " . $sqlAlike . " :suchbegriff OR
                                              `adresse` " . $sqlAlike . " :suchbegriff OR
                                              `gruppe` " . $sqlAlike . " :suchbegriff OR
                                              `kategorie` " . $sqlAlike . " :suchbegriff) 
                                          " . SQL_AND_INDIVIDUAL . SQL_AND_PRIVATE . " " . $sqlAndYear . "
                                          " . $sqlOrderByLimit);
      }

      // Abfrage ausführen
      $select->execute($arrays);
      $events = $select->fetchAll();
    }

    // Anzahl der gefundenen Events
    $gefunden = $select->rowCount();

    // Navigation
    echo  sprintf(NAVIGATION, '', '', '', KOPIEREN, AUSGABEX) .
      '<div id="aktevents"><mark class="mark">Suche:</mark> <q><em style="' . ($gefunden == 0 ? 'text-decoration: Underline Wavy Red;' : '') . ' letter-spacing: 1px;">' .
      htmlspecialchars($suchbegriff, ENT_HTML5, 'UTF-8') . '</em></q>';

    // Wurde etwas gefunden
    if ($gefunden > 0) {

      $begrenzung = ($gefunden >= 15) ? '<br>' . auswahlBegrenzung($gefunden) : '';
      $gruppenoptionen = (BENUTZER == true) ? '<br><span class="optionLink print" onPointerDown="gruppenOptionEinAus()" title="Gruppenoptionen anzeigen&#10;Taste: G">Gruppenoptionen</span>' : '';

      echo  '<br><mark class="mark">' . $gefunden . ($gefunden == 1 ? ' Ergebnis' : ' Ergebnisse') . ($asterisk == false ? ' für das Jahr ' . $_POST["jahr"] : ' im Kalender')  . '</mark>' . $begrenzung . $gruppenoptionen;
      echo  '<form id="eKmarkierung" method="post" class="counter"><div class="flex">';

      foreach ($events as $nr => $event) {

        if (in_array($nr, range(25, 5000, 25))) {
          echo  '</div><hr><div class="flex">';
        }

        echo  anzeigen(
          false,
          $event["start"],
          $event["ende"],
          $event["volltag"],
          $event["name"],
          $event["event"],
          $event["beschreibung"],
          $event["adresse"],
          $event["prioritaet"],
          $event["wiederholung"],
          $event["benachrichtigung"],
          $event["privat"],
          $event["aufgabe"],
          $event["kategorie"],
          $event["gruppe"],
          $event["id"],
          $PRIORITAET,
          $BENUTZER,
          $KALENDERBLATT,
          $_POST["jahr"],
          ADMIN
        );
      }
      echo  '</div></form>' . OPTIONEN . $tippsZurSuche . '</div>';
    } else {
      echo  '<p><mark class="mark">&#10149;</mark> Keine Events' . ($asterisk == false ? ' im Jahr ' . $_POST["jahr"] : ' im Kalender') . ' gefunden die dem Suchbegriff entsprechen.</p>';

      // Meinten Sie ...
      $select = $db->query("SELECT `name`, `event`, `beschreibung`, `kategorie`, `adresse`
                                      FROM `" . $TABLE_PREFIX . "_kalender`
                                      WHERE " . (BENUTZER == true ? '`privat` >= 0' : '`privat` = 0'));

      $events = $select->fetchAll();

      if ($select->rowCount() > 0) {

        // Das Ergebnis einer Zeichenkette hinzufügen
        $text = "";

        foreach ($events as $event) {
          $text .= " " . $event["name"] . " " . $event["event"] . " " . $event["beschreibung"] . " " . $event["kategorie"] . " " . $event["adresse"];
        }

        // Zeichen entfernen
        $text = str_replace(['"', "'", '?', '!', '%', '.', ':', ',', ';', '+', '#', '@', '*', '^', '°', '(', ')', '[', ']', '<', '>', '/', '\\'], " ", $text);

        $brain = [];
        $woerter = explode(" ", $text);
        $woerter = array_map('strip_tags', $woerter);
        $woerter = array_map('entferneBBcodes', $woerter);
        $woerter = array_map('trim', $woerter);
        $woerter = array_unique($woerter);

        // Wörter vergleichen
        foreach ($woerter as $wort) {

          // Mit metaphone() und soundex()
          if (
            metaphone($suchbegriff) == metaphone($wort) ||
            soundex($suchbegriff) == soundex($wort)
          ) {

            if (mb_strlen($wort) > 1) {
              if (
                !is_numeric($wort) &&
                $wort != "*1."
              ) {
                $brain[] = $wort;
              }
            }
          }
        }

        // Suchbegriff entfernen
        $index = array_search($suchbegriff, $brain);

        if ($index !== false) {
          array_splice($brain, $index, 1);
        }

        // Wörter anzeigen
        $anzahl = count($brain);

        if ($anzahl > 0) {
          $zaehler = 0;
          echo  '<p>Meinten Sie ';

          foreach ($brain as $think) {
            echo  '<span class="suchenLink" onPointerDown="sucheStarten(`' . $think .
              ($asterisk == true ? '*' : '') . '`)" title="Events mit dem Begriff ' . $think . ' anzeigen">' . $think . '</span>';

            if (($zaehler + 2) == $anzahl) {
              echo  ' oder ';
            } elseif (($zaehler + 1) < $anzahl) {
              echo  ', ';
            }
            $zaehler++;
          }

          echo  '?</p>';
        }
      }

      echo  $tippsZurSuche . '</div>';
    }
  }
}


/*
 * Formulare zeigen
 */
if (isset($_GET["form"])) {
  $lokalesDatum = '<span title="Lokales Datum und Uhrzeit&#10;Wecker anzeigen&#10;Taste: V" id="datumLokal" class="mobile" onPointerDown="wecker()"><span id="eKdatum"></span><span id="eKzeit"></span></span>';
  switch ($_GET["form"]) {

      // Eintragen
    case 'eintragen':
      if (!BENUTZER) return false;

      // Navigation
      echo  sprintf(NAVIGATION, $lokalesDatum, '', '', '', AUSGABEX) .
        '<form id="eKform" method="post" enctype="application/x-www-form-urlencoded" accept-charset="utf-8" lang="de-DE">';

      $datalist = datenliste($_GET["jahr"], $db, $TABLE_PREFIX);
      $volltag = $_GET["stunde"] > 0 ? false : true;
      $pflichtfeldBeschreibung = (in_array('beschreibung', $PLICHTFELDER)) ? ' required="required"' : '';
      $pflichtfeldTitel = (in_array('beschreibung', $PLICHTFELDER)) ? '(Erforderlich)' : '(Optional)';

      echo  '<div><mark class="mark">Event eintragen</mark></div>
            <p>' .
        auswahlTag($_GET["tag"], true) . auswahlMonat($_GET["monat"]) . auswahlJahr($_GET["jahr"]) . '
            </p>

            <p class="formLineHeight">
            <label title="Event eintragen oder auswählen (Erforderlich)&#10;Zugriffstaste: E"><span class="mobile">Event: </span><input type="text" name="event" id="event" list="datenliste" size="28" maxlength="100" required="required" placeholder="Event eintragen oder auswählen" spellcheck="true" accesskey="e"></label>
            ' . $datalist .
        '<span class="volltag ausblenden_volltag">' . auswahlUhrzeit($volltag, zZ($_GET["stunde"]), zZ($_GET["minute"])) . auswahlUhrzeit2() . ' <span id="eKdifferenz"></span></span></span>
            </p>


            <details class="formLineHeight">
            <summary accesskey="o"><u>O</u>ptionen</summary>
            <span class="ausblenden_dauer"><label title="Dauer des Events (Optional)&#10;Anzahl in Tagen (Maximal ' . $SERIENEVENTS . ' Tage).&#10;Zugriffstaste: T"><u>T</u>age: <input type="number" name="dauer" id="dauer" value="1" min="1" max="' . $SERIENEVENTS . '" required="required" placeholder="Zahl!" onInput="mehrTage(this.value)" onwheel="eingabefeldMrAendern(event, `dauer`, 1);mehrTage(this.value)" accesskey="t"></label></span>
            <span id="eKmehrtage"></span> &nbsp;
            <span class="ausblenden_wiederholung"><input type="checkbox" name="wiederholung" id="wiederholung" accesskey="j"> <label for="wiederholung" title="Jährlicher Event (Optional)&#10;Für Geburtstage, Feiertage etc.&#10;Zugriffstaste: J"><u>J</u>ährlicher Event</label></span>
            <span class="ausblenden_adresse">' . adresseEintragen("", $db, $TABLE_PREFIX, $ADRESSDATENBANK) . '</span>
            <span class="ausblenden_prioritaet">' . auswahlPrioritaet($PRIORITAET, $_GET["jahr"], false, true, 0) . '</span>
            <span class="ausblenden_aufgabe">' . auswahlAufgabe("0", false) . '</span><br>
            <span class="ausblenden_kategorie">' . auswahlKategorien('') . '</span>&emsp;
            <span class="ausblenden_privat"><input type="checkbox" name="privat" id="privat"' . ($EINZELPERSON_ANZEIGE == "ja" ? ' checked="checked"' : '') . ' accesskey="p"> <label for="privat" title="Privater Event (Optional).&#10;Diesen Event nicht öffentlich anzeigen.&#10;Zugriffstaste: P"><u>P</u>rivat</label></span>
            ' . checkboxBenachrichtigung($ABSENDER, 0) . '
            ' . benutzerEintragen($BENUTZER_EDIT, $_SESSION["name"], $NAME, $db, $TABLE_PREFIX) . '
            ' . auswahlWiederholung() . '
            </details>

            <span id="formVorschau"></span>
            <p class="formLineHeight"><label><u>B</u>eschreibung:<br>
            <textarea name="beschreibung" id="textarea" class="textarea ausblenden_beschreibung"' . $pflichtfeldBeschreibung . ' placeholder="Eine Beschreibung des Events ' . $pflichtfeldTitel . '" accesskey="b"  onInput="beschreibungAlsEvent();textCounter();"></textarea></label>
            </p>

            <input type="hidden" name="eintragen">';
      break;

      // Bearbeiten
    case 'bearbeiten':
      if (!BENUTZER) return false;

      // Navigation
      echo  sprintf(NAVIGATION, $lokalesDatum, '', '', '', AUSGABEX) .
        '<form id="eKform" method="post" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">';

      $select = $db->prepare("SELECT `start`, `ende`, `volltag`, `name`, `event`, `beschreibung`, `adresse`,  `prioritaet`, `wiederholung`, `benachrichtigung`, `privat`, `aufgabe`, `kategorie`, `id`
                                          FROM `" . $TABLE_PREFIX . "_kalender`
                                          WHERE `id` = :id
                                          LIMIT 1");

      $select->execute([':id' => $_GET["id"]]);
      $event = $select->fetch();

      sscanf($event["start"], "%4s-%2s-%2s %2s:%2s", $dbJahr, $dbMonat, $dbTag, $dbStunde, $dbMinute);
      sscanf($event["ende"], "%4s-%2s-%2s %2s:%2s", $a, $b, $c, $dbStunde2, $dbMinute2);

      $differenz = stundenDifferenz(substr($event["start"], 11, 5), substr($event["ende"], 11, 5));
      $wiederholung = $event["wiederholung"] == 1 ? ' checked="checked"' : '';
      $privat = $event["privat"] == 1 ? ' checked="checked"' : '';
      $volltag = $event["volltag"] == 1 ? true : false;
      $datalist = datenliste($dbJahr, $db, $TABLE_PREFIX);
      $berechtigung = ($_SESSION["name"] === $event["name"] || $_SESSION["name"] === $NAME) ? '' : '<p id="berechtigung">Sie haben keine Berechtigung diesen Event zu bearbeiten!</p>';
      $pflichtfeldBeschreibung = (in_array('beschreibung', $PLICHTFELDER)) ? ' required="required"' : '';
      $pflichtfeldTitel = (in_array('beschreibung', $PLICHTFELDER)) ? '(Erforderlich)' : '(Optional)';

      echo  '<div><mark class="mark">Event bearbeiten</mark>&nbsp; 
    <span class="navLink ig_loeschen" onPointerDown="zeigeFormular(`loeschen`,' . abs($dbTag) . ',' . abs($dbMonat) . ',' . $dbJahr . ',' . $event["id"] . ')" title="Event löschen"></span>
    <span class="navLink ig_neu" onPointerDown="zeigeFormular(`eintragen`,' . abs($dbTag) . ',' . abs($dbMonat) . ',' . $dbJahr . ',null)" title="Event für diesen Tag eintragen"></span></div>
            ' . $berechtigung . '
            <p>' .
        auswahlTag($dbTag, false) . auswahlMonat($dbMonat) . auswahlJahr($dbJahr) . '
            </p>

            <p class="formLineHeight">
            <label title="Event eintragen oder auswählen (Erforderlich)&#10;Zugriffstaste: E"><span class="mobile">Event: </span><input type="text" name="event" id="event" list="datenliste" value="' . htmlspecialchars($event["event"], ENT_HTML5, 'UTF-8') . '" size="28" maxlength="100" required="required" placeholder="Event eintragen oder auswählen" spellcheck="true" accesskey="e"></label>
            ' . $datalist . '
            <span class="volltag ausblenden_volltag">' . auswahlUhrzeit($volltag, $dbStunde, $dbMinute) . auswahlUhrzeit2($dbStunde2, $dbMinute2) . ' <span id="eKdifferenz">' . $differenz . '</span></span></span>
            </p>

            <details class="formLineHeight">
            <summary accesskey="o"><u>O</u>ptionen</summary>
            <span class="ausblenden_kopieren"><input type="checkbox" name="kopieren" id="kopieren" accesskey="k" onClick="mehrAnzeigen(`neueGruppeOption`);kopierenAnzeigen()">  <label for="kopieren" title="Event zum ausgewählten Datum kopieren (Optional,&#10;die Gruppe wird beibehalten).&#10;Zugriffstaste: K"><u>K</u>opieren</label>&emsp; </span>
            <span class="nowrap ausblenden_wiederholung"><input type="checkbox" name="wiederholung" id="wiederholung"' . $wiederholung . ' accesskey="j"> <label for="wiederholung" title="Jährlicher Event (Optional)&#10;Für Geburtstage, Feiertage etc.&#10;Zugriffstaste: J"><u>J</u>ährlicher Event</label></span>
            <span id="neueGruppeOption" style="display:none"><input type="checkbox" name="neuegruppe" id="neuegruppe" accesskey="g"> <label for="neuegruppe" title="Eine neue Gruppe für diesen Event erstellen (Optional).&#10;Zugriffstaste: G">Neue <u>G</u>ruppe erstellen</label></span>
            <span class="ausblenden_adresse">' . adresseEintragen($event["adresse"], $db, $TABLE_PREFIX, $ADRESSDATENBANK) . '</span>
            <span class="ausblenden_prioritaet">' . auswahlPrioritaet($PRIORITAET, $dbJahr, false, true, $event["prioritaet"]) . '</span>
            <span class="ausblenden_aufgabe">' . auswahlAufgabe($event["aufgabe"], true) . '</span><br>
            <span class="ausblenden_kategorie">' . auswahlKategorien($event["kategorie"]) . '</span>&emsp;
            <span class="ausblenden_privat"><input type="checkbox" name="privat" id="privat"' . $privat . ' accesskey="p"> <label for="privat" title="Privater Event (Optional).&#10;Diesen Event nicht öffentlich anzeigen.&#10;Zugriffstaste: P"><u>P</u>rivat</label></span>
            ' . checkboxBenachrichtigung($ABSENDER, $event["benachrichtigung"]) . '
            ' . benutzerEintragen($BENUTZER_EDIT, $_SESSION["name"], $NAME, $db, $TABLE_PREFIX) . '
            </details>

            <span id="formVorschau"></span>
            <p class="formLineHeight"><label><u>B</u>eschreibung:<br>
            <textarea name="beschreibung" id="textarea" class="textarea ausblenden_beschreibung"' . $pflichtfeldBeschreibung . ' placeholder="Eine Beschreibung des Events ' . $pflichtfeldTitel . '" accesskey="b" onInput="beschreibungAlsEvent();textCounter();" onFocus="textCounter();">' . htmlspecialchars($event["beschreibung"], ENT_HTML5, 'UTF-8') . '</textarea></label>
            </p>

            <input type="hidden" name="id" value="' . $event["id"] . '">
            <input type="hidden" name="bearbeiten">';
      break;

      // Löschen
    case 'loeschen':
      if (!BENUTZER) return false;

      // Navigation
      echo  sprintf(NAVIGATION, $lokalesDatum, '', '', '', AUSGABEX) .
        '<form id="eKform" method="post" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">';

      $select = $db->prepare("SELECT `start`, `ende`, `volltag`, `name` , `event`, `beschreibung`, `prioritaet`, `wiederholung`, `benachrichtigung`, `gruppe`, `id`
                                          FROM `" . $TABLE_PREFIX . "_kalender`
                                          WHERE `id` = :id");

      $select->execute([':id' => $_GET["id"]]);
      $event = $select->fetch();

      // Gruppe (Anzahl)
      $select = $db->query("SELECT COUNT(`gruppe`) AS anzahl FROM `" . $TABLE_PREFIX . "_kalender` WHERE `gruppe` = " . $event["gruppe"]);
      $gruppe = $select->fetch();

      sscanf($event["start"], "%4s-%2s-%2s %2s:%2s", $dbJahr, $dbMonat, $dbTag, $dbStunde, $dbMinute);
      $start = substr($event["start"], 11, 8) != "00:00:01" ? substr($event["start"], 11, 5) : '';
      $ende = substr($event["ende"], 11, 8) != "00:00:00" ? ' bis ' . substr($event["ende"], 11, 5) : '';
      $uhr = !empty($start) || !empty($ende) ? '&nbsp;<span class="nowrap ig_uhrzeit" title="' . date("T - e") . '"> ' . $start . $ende . ' Uhr' : '';
      $abgelaufen = eventAktuell($dbTag, $dbMonat, $dbJahr, $dbStunde, $dbMinute, $event["ende"], $event["volltag"]);
      $benachrichtigung = $event["benachrichtigung"] == 1 ? '&nbsp; <span title="E-Mail Benachrichtigung" style="cursor:help" class="ig_benachrichtigung"></span>' : '';
      $kw = kalenderwoche($dbTag, $dbMonat, $dbJahr);
      $woche = ' <span class="navLink selLink" onPointerDown="zeigeKW(' . $dbJahr . ',' . $kw . ')" title="Woche ' . $kw . ' anzeigen">W&nbsp;' . $kw . '</span>';
      $wiederholung = $event["wiederholung"] == 1 ? ' <span title="Jährliche Wiederholung" style="cursor:help" class="ig_wiederhohlung"></span>' : '';
      $name = $BENUTZER == "ja" ? ' [<em title="Erstellt von: ' . $event["name"] . '">' . $event["name"] . '</em>]' : '';
      $prioritaet1 = $event["prioritaet"] > 0 ? '<span style="' . stickyFarbverlauf($PRIORITAET[$event["prioritaet"]]) . 'color:#FFFFFF;">&nbsp;' : '';
      $prioritaet2 = strlen($prioritaet1) > 10 ? '<span title="Priorität ' . $event["prioritaet"] . '" class="prioritaet">| ' . $event["prioritaet"] . '</span>&nbsp;</span>' : '';
      $gruppeCheckbox = $gruppe["anzahl"] > 1 ? '<br><input type="checkbox" name="gruppe_del" id="lbl_gdel" accesskey="g"> <label for="lbl_gdel" class="achtung" title="Das Löschen aller Events kann nicht rückgängig gemacht&#10;werden und bedarf einer Bestätigung.">Alle ' . $gruppe["anzahl"] . ' Events dieser <u>G</u>ruppe löschen</label><br><span class="optionLink" onClick="zeigeGruppe(`' . $event["gruppe"] . '`,`false`)">Gruppe anzeigen</span>' : '';
      $berechtigung = ($_SESSION["name"] === $event["name"] || $_SESSION["name"] === $NAME) ? '' : '<p id="berechtigung">Sie haben keine Berechtigung diesen Event zu löschen!</p>';

      echo  '<div><mark class="mark">Event löschen</mark>&nbsp; 
    <span class="navLink ig_bearbeiten" onPointerDown="zeigeFormular(`bearbeiten`,' . abs($dbTag) . ',' . abs($dbMonat) . ',' . $dbJahr . ',' . $event["id"] . ')" title="Event bearbeiten"></span>
    <span class="navLink ig_neu" onPointerDown="zeigeFormular(`eintragen`,' . abs($dbTag) . ',' . abs($dbMonat) . ',' . $dbJahr . ',null,null,null,true)" title="Event für diesen Tag eintragen"></span></div>
     ' . $berechtigung . '
     <p><span class="ig_kalender"></span>
      <span class="navLink selLink" onPointerDown="zeigeTagesansicht(' .  abs($dbTag) . ',' .  abs($dbMonat) . ',' . $dbJahr . ',event)" title="Tag anzeigen">' . datum($dbTag, $dbMonat, $dbJahr) . '</span>' . $woche . ' ' . $wiederholung . $uhr . $abgelaufen . $benachrichtigung . '</span>
     </p>

     <div>
     ' . $prioritaet1 . '<span class="eventText">' . $event["event"] . '</span>' . $prioritaet2 . $name . '
     ' . (strlen($event["beschreibung"]) > 0 ? '<details class="event_loeschen"><summary>Beschreibung anzeigen</summary><div>' . formatierung($event["beschreibung"]) . '</div></details>' : '')  . '
     </div>
     <p>
     <span title="Das Löschen des Events kann nicht rückgängig gemacht&#10;werden und bedarf einer Bestätigung.">
     <mark class="mark">&#10149;</mark> Bestätigung: <input type="checkbox" name="bestaetigung" id="lbl_del" accesskey="e">
     <label for="lbl_del" class="achtung">Diesen <u>E</u>vent löschen</label></span>
     ' . $gruppeCheckbox . '
    </p>

    <input type="hidden" name="gruppe" value="' . $event["gruppe"] . '">
    <input type="hidden" name="id" value="' . $event["id"] . '">
    <input type="hidden" name="loeschen">';
      break;

      // Anmeldung und Abmeldung
    case 'anmelden':

      // Navigation
      echo  sprintf(NAVIGATION, $lokalesDatum, '', '', '', AUSGABEX) .
        '<form id="eKform" method="post" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">';

      if (!BENUTZER == true) :
        echo  '<div><mark class="mark" title="Anmeldedaten für den Event-Kalender eingeben">Anmeldung</mark></div>
     <p class="formLineHeight">
      <label for="benutzername" title="Benutzername&#10;Bitte füllen Sie dieses Feld aus.">Benutzername:
        <input type="text" name="name" id="benutzername" required="required" autocomplete="username" tabindex="1" spellcheck="false" tabindex="1"></label><br>
      <label for="passwort" title="Passwort (Kennwort)&#10;Bitte füllen Sie dieses Feld aus.">Passwort:&emsp;&emsp;&nbsp;&nbsp;
        <input type="password" name="passwort" id="passwort" required="required" autocomplete="current-password" tabindex="2"></label>
      <input type="hidden" name="anmelden">
     </p>';
      else :
        echo  '<div id="buttons"><mark class="mark"><em>' . $_SESSION["name"] . '</em> abmelden?</mark></div>
         <input type="hidden" name="abmelden">';
      endif;
      break;
  }

  // Abbrechen und Absenden
  if (isset($_GET["form"])) {
    switch ($_GET["form"]) {
      case 'eintragen':
        $absendenButton = ' title="Event eintragen.&#10;Zugriffstaste: E" accesskey="e"><u>E</u>intragen';
        break;
      case 'bearbeiten':
        $absendenButton = ' title="Event aktualisieren.&#10;Zugriffstaste: A" accesskey="a"><u>A</u>ktualisieren';
        break;
      case 'loeschen':
        $absendenButton = ' title="Event löschen ausführen.&#10;Zugriffstaste: A" accesskey="a"><u>A</u>usführen';
        break;
      case 'anmelden':
        $absendenButton = (BENUTZER == true) ? ' title="Benutzer abmelden&#10;Zugriffstaste: A" accesskey="a" autofocus="autofocus"><u>A</u>bmelden' : ' title="Benutzer anmelden&#10;Zugriffstaste: A" accesskey="a"><u>A</u>nmelden';
        break;
    }
  }

  echo  '<div id="buttons">' .
    (($_GET["form"] == "eintragen" || $_GET["form"] == "bearbeiten") && $VORSCHAU_BUTTON == "ja" ? bbCode() : '') .
    '<button type="reset" title="Vorgang abbrechen.&#10;Bitte doppelt klicken!&#10;Taste: ESC" onDblClick="anzeigeBeenden(`anzeige`);scrollToDo(`kalender`)">Abbrechen</button> &emsp;
  <button type="button" id="okbutton" class="senden" onClick="sendeFormular()"' . $absendenButton . '</button>
 </div>
</form>';
}