/**
 * spezielles Handling für die Kursdetails für dasResponsive Layout
 * Pfad: ../kufertools/settings/sys/layout/js
 */
// registerNamespace('KuferTools');
// registerNamespace('KuferTools.ToolId');

$(function () {
  /**
   * @returns {Storage}
   */
   function getStorageForReiter() {
    return window.sessionStorage;
  }

  /**
   * Speichert den selektierten Menüpunkt ab
   * @param {string} href
   * @param {HTMLElement} reiterButton
   * @param {boolean} doNotSaveInStore Soll der offene Reiter nicht permanent gespeichert werden?
   * @returns void
   */
  function saveReiter(href, reiterButton, doNotSaveInStore) {
    if (!getStorageForReiter() && !doNotSaveInStore) { // Fallback der nie eintreten sollte
      // AJAX-Aufruf für Speichern des aktuell ausgewählten Reiters
      const hrefMerkeReiter = href.replace('action=', 'actionReiter=') + '&action=' + KuferTools.ActionMerkeReiter;
      // Ajax Request zum Merken des angeklickten Reiters; wird in der Session gespeichert
      fetch(hrefMerkeReiter, { method: "POST" });
    }

    const toolIdAndAction = getStorageIdentifierForReiter();
    for (const reiterButtonClass of reiterButton.classList) { // reiter-Klasse/Namen aus Klassen extrahieren
      if (reiterButtonClass.startsWith('reiter')) {
        setActiveReiterInStore(toolIdAndAction, reiterButtonClass, doNotSaveInStore);
        return;
      }
    }

    const reiterName = /[&?]action=([a-zA-Z0-9]+)/i.exec(href)[1];
    setActiveReiterInStore(toolIdAndAction, reiterName, doNotSaveInStore);
  }

  function setActiveReiterInStore(toolIdAndAction, reiterName, doNotSaveInStore) {
    if (typeof window.history !== 'undefined' && typeof window.history.replaceState !== 'undefined') {
      const href = window.location.href;
      let newhref = href;
      const regendhash = /#.*$/;
      if (regendhash.test(href)) {
        newhref = newhref.replace(regendhash, '#' + reiterName);
      } else {
        newhref = newhref + '#' + reiterName;
      }

      window.history.replaceState({ switchedReiterKursdetails: true }, '', newhref);
    }

    if (getStorageForReiter() && !doNotSaveInStore) {
      getStorageForReiter().setItem(getReiterPath(toolIdAndAction), reiterName);
    }
  }

  function getReiterPath(toolIdAndAction) {
    return 'kufertools_kursdetails_reiter_' + toolIdAndAction;
  }

  function getSavedReiter() {
    if (getStorageForReiter()) {
      return getStorageForReiter().getItem(getReiterPath(getStorageIdentifierForReiter()));
    }
  }

  /**
   * @param {HTMLElement} reiter
   * @param {string} href
   * @returns {Promise<string>}
   */
  async function fetchReiter(reiter, href) {
    if ('loading' in reiter.dataset && reiter.dataset.loading === '1') {
      throw 'Still loading';
    }

    function setLoading(isLoading) {
      reiter.dataset.loading = isLoading ? '1' : '0';
    }

    let data;
    try {
      setLoading(true);
      const resp = await fetch(href, {
        method: 'GET',
        headers: new Headers({
          'Accept': 'text/html',
          'X-Requested-With': 'XMLHttpRequest'
        })
      });
      data = await resp.text();
    } catch (err) {
      setLoading(false);
      data = '<div role="status" class="alert alert-error">Es ist ein technischer Fehler aufgetreten.</div>';
    }

    reiter.dataset.content = data;
    return data;
  }

  /**
   * @param {HTMLAnchorElement|HTMLElement} ajaxReiter
   * @return {string}
   */
  function findAjaxReiterHref(ajaxReiter) {
    if (ajaxReiter.dataset.href) {
      return ajaxReiter.dataset.href;
    }

    return ajaxReiter.href;
  }

  function getStorageIdentifierForReiter() {
    const href = findAjaxReiterHref(document.querySelector('.ajax_reiter'));

    const toolIdMatch = /tool_id=([0-9]+)/i.exec(href);
    let toolId = KuferTools.ToolId;
    if (toolIdMatch !== null && toolIdMatch.length === 2) {
      toolId = toolIdMatch[1];
    }

    const actionMatch = /action=([a-zA-Z0-9]+)/i.exec(href);
    let action = '';
    if (actionMatch !== null && actionMatch.length === 2) {
      action = actionMatch[1];
    }

    return toolId + '_' + action;
  }

  for (const reiter of document.body.querySelectorAll('.reiter:not(.active) .ajax_reiter:not(.reiterFotos)')) {
    function prefetchReiterInhalt() {
      const href = findAjaxReiterHref(reiter);

      if (('content' in reiter.dataset) || (reiter.dataset.loading) === '1') {
        return false;
      }

      let reiterClass = reiter.classList[1];
      reiterClass = (typeof (reiterClass) !== 'undefined') ? reiterClass + '_content' : '';

      fetchReiter(reiter, href)
        .catch(err => {
          console.error(err);
        })
        .then(data => {
          if (!reiter.closest('.reiter.active')) {
            return;
          }

          KuferTools.fadeInReiterContent(data, reiterClass);
          KuferTools.Utils.AjaxLadebildschirm.Stop();
        });
    }

    reiter.addEventListener('mousedown', prefetchReiterInhalt, { passive: true });
    reiter.addEventListener('mouseover', prefetchReiterInhalt, { passive: true });
    reiter.addEventListener('touchstart', prefetchReiterInhalt, { passive: true });
  }

  /**
   * @param {HTMLAnchorElement} reiter jQuery Elemenet des Reitersbuttons (.ajax_reiter)
   * @param {Boolean} first
   * @returns {Boolean}
   */
  function loadReiter(reiter, first) {
    const reiterContent = document.body.querySelector('.reiter_content');
    if (reiter.parentElement.matches('.active') && reiterContent.innerHtml !== '') {
      return false;
    }

    // Beim Wechseln den Reitern, den zugehörigen Inhalt mit der vorherigen Reiter speichern
    // Jedoch nicht bei den Fotos, da es sonst Probleme beim erneuten Initialisieren der Gallerie gibt.
    /** @var {HTMLElement|null} */
    const prevReiter = document.body.querySelector('.reiter.active .ajax_reiter:not(.reiterFotos)');
    if (prevReiter) {
      let prevReiterClass = prevReiter.classList[1];
      prevReiterClass = (typeof (prevReiterClass) !== 'undefined') ? prevReiterClass : '';
      const innerReiterContent = reiterContent.querySelector('.reiter_content #reiter_content_class.' + prevReiterClass + '_content');
      if (innerReiterContent) {
        prevReiter.dataset.content = innerReiterContent.innerHTML;
      }
    }

    let reiterActive = document.body.querySelector('.reiter.active')
    if (reiterActive) {
      reiterActive.classList.remove('active');
      reiterActive.querySelector('.ajax_reiter')?.setAttribute('aria-selected', 'false');
    }

    reiter.closest('.reiter').classList.add('active');
    reiter.setAttribute("aria-selected", "true");

    let reiterClass = reiter.classList[1];
    reiterClass = (typeof (reiterClass) !== 'undefined') ? reiterClass + '_content' : '';
    const href = findAjaxReiterHref(reiter);

    saveReiter(href, reiter, first);

    // Falls der Inhalt bereits heruntergeladen wurde, muss er nicht ein 2. mal per Ajax geholt werden.
    if (typeof (reiter.dataset.content) !== 'undefined') {
      reiterContent.parentElement.setAttribute('aria-busy', 'true');
      KuferTools.fadeInReiterContent(reiter.dataset.content, reiterClass);
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      return false;
    }

    KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery(reiterContent.parentElement));
    reiterContent.parentElement.setAttribute('aria-busy', 'true');

    if (!('loading' in reiter.dataset) || reiter.dataset.loading === '0') { // bei mouseover wird der Reiter noch geladen
      //Nachladen der Daten des entsprechenden Reiters; dazu: Ajax Response mit den Daten zur entspr. Action
      fetchReiter(reiter, href)
        .then(data => {
          KuferTools.fadeInReiterContent(data, reiterClass);
        })
        .catch(() => {})
        .finally(() => {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
        });
    }

    return false;
  }

  if (window.history && typeof window.history.replaceState !== 'undefined') {
    window.addEventListener('popstate', function (event) {
      if (window.location.hash.length > 1 && event.state && event.state.switchedReiterKursdetails) {
        event.preventDefault();
        const reiterButton = document.body.querySelector('.ajax_reiter.' + window.location.hash.substring(1));
        if (reiterButton) {
          loadReiter(reiterButton, true);
        }
      }
    });
  }

  //Klickhandler für alle Reiter der Kursdetails
  for (const ajaxReiter of document.body.querySelectorAll('.ajax_reiter')) {
    ajaxReiter.addEventListener('click', event => {
      event.preventDefault();
      return loadReiter(ajaxReiter, false);
    });
    /*
     * Warum wird hier auf das Fokus-Element gehöhrt?
     *
     * Scheinbar erwarten (einige) Screenreader das ein Tab sofort aktiv geschalten wird, sobald dieser ausgewählt wird.
     */
    ajaxReiter.addEventListener('focus', () => {
      ajaxReiter.click();
    });
  }

  //Buttons, die als HTML-Klasse "ajax_button_reiter" und "reiter..." besitzen, öffnen bei Klick den entsprechenden Reiter mit der gleichen HTML-Klasse
  //Z. B. der Button mit den Klassen "ajax_button_reiter reiterTermine" öffnet den Reiter Termine.
  jQuery(document).on('click', '.ajax_button_reiter', function (event) {
    const buttonClass = jQuery(this).attr('class');
    const regex = /reiter[a-zA-Z0-9]+/;
    const match = regex.exec(buttonClass);
    const reiterClass = '.ajax_reiter.' + match[0];

    jQuery(reiterClass).trigger('click');

    return false;
  });

  let oeffneReiter;
  if (window.location.hash.length > 1) {
    oeffneReiter = document.body.querySelector('.ajax_reiter.' + window.location.hash.substring(1));
  }
  else if (typeof getSavedReiter() != 'undefined') {
    oeffneReiter = document.body.querySelector('.ajax_reiter.' + getSavedReiter());
  } else if (typeof KuferTools.OeffneReiter != 'undefined' && KuferTools.OeffneReiter != '') {
    //beim Reload (F5-Taste) oder bei Reiterwechsel ist  KuferTools.OeffneReiter schon besetzt
    oeffneReiter = document.body.querySelector('.ajax_reiter.' + KuferTools.OeffneReiter);
  } else {
    //Beim Neuladen ist KuferTools.OeffneReiter undefined
    oeffneReiter = document.body.querySelector('.ajax_reiter');
  }
  if (oeffneReiter) {
    loadReiter(oeffneReiter, true);
  } else {
    loadReiter(document.body.querySelector('.ajax_reiter'), true);
  }

  //Dialog zum Bearbeiten eines Kurses
  jQuery(document).on('click', '.kursbearbeiten', function (event) {
    //verhindert Abschicken und Ausgabe auf neuer Seite
    event.preventDefault();
    //der Link ist schon im angeklickten Button enthalten und zwar im Elternelement
    //<a href="index.php?tool_id=8&action=kursbearbeiten&knr=161-3208>; er wird im entspr. UseCase z.B  MaKursDetailsUseCase
    //mit der Methode getButtons() bereitgestellt
    var link = jQuery(this).prop('href');
    handleKursBearbeiten(link);
    //statt mit preventDefault()  kann das Absenden des Links auch mit Rückgabe von false verhindert werden
    //return false;
  });



  jQuery('.icsButton').on('click', function (event) {
    //event.preventDefault(); Wird durch das false am Ende abgedeckt?
    var href = jQuery(this).prop('href');
    KuferTools.createIcsDialog(href);
    return false;
  });

  jQuery(document).on('click', '#terminvon, #terminbis', function () {
    jQuery('#nichtalletermine').prop('checked', true);
  });


  //Clickhandler für das Hochladen von Dokumenten (UploadHandler)
  jQuery(document).on('click', '.upload', function () {
    //Achtung: prop funktioniert hier beim Button Element nicht!!
    var href = jQuery(this).attr('href');
    var buttons = {};

    buttons['Hochladen'] = function () {
      if ($('#detail_original_dokumente').val() == '') {
        KuferTools.showMessage({
          title: "Keine Datei ausgewählt",
          meldung: "Sie haben noch keine Datei ausgewählt.<br>Bitte wählen Sie eine Datei zum Hochladen aus!",
          width: 'auto'
        });
      } else if ($('.dokudownload_detail:checked').length == 0) {
        KuferTools.showMessage({
          title: "Keine Teilnehmergruppe ausgewählt",
          meldung: "Bitte wählen Sie aus, welche Teilnehmergruppe das Dokument herunterladen können soll.",
          width: 'auto'
        });
      } else if (KuferTools.ValidateFormInput($('#detailsDokumente'))) {
        KuferTools.Utils.AjaxLadebildschirm.Start();


        //  Hier könnte ggf. ein Ajax Mechanismus zum Nachladen nur eines Reiters (Download Reiter) verwendet werden, anstatt
        // das Formular abzuschicken und die ganze Kursdetails Seite neu zu laden. Das funktioniert leider nicht für den
        // Upload von Dateien, da standardmäßig via Ajax keine files hochgeladen werden können; d.h. die input <type="file" ..>
        // Elemente können nicht mitgeschickt werden. Das führt zum Fehler in UploadOperations::doUploadFiles(..) (keine Files
        // vorhanden).
        // Eine Lösung wäre folgendes jQuery Form Plugin: http://malsup.github.com/jquery.form.js, das XML HTTP Request Level 2
        // (XHR2) verwendet.  Dieses ermöglicht ein Absenden eines  Formulars via Ajax; hier z.B. via
        //    $('#detailsDokumente').ajaxForm(function(msg) {
        //          ...;KuferTools.fadeInReiterContent(msg, activeReiterClass);...
        //          })
        // Mit diesem Mechanismus können auch Files mitgeschickt werden;
        // Problem: XHR2 wird nicht von allen Browswern unterstützt, insbesondere nicht vom Internet Explorer < 10;
        //Deshalb kann es mit dem Einsatz dieses Plugins bei einigen Kunden zu Problemen kommen.
        //Daher wie bisher: ganze Kursdetails Seite nachladen via Submit().
        /**
        var link = $('#detailsDokumente').attr('action');
        //enthält die Formularelemente als String in der Form  <input#detail_bezeichnung_dokumente> etc.
        var data = $('#detailsDokumente').serialize();

        var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
        jQuery.post(link, data, function (msg) {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
          KuferTools.fadeInReiterContent(msg, activeReiterClass);
          KuferTools.InitValidate($('.validate_form'));
        });
         **/
        jQuery('#detailsDokumente').trigger('submit');
        jQuery(this).dialog('close');
      } // Else-Fall ist indirekt abgefangen. ValidateFormInput gibt eine entsprechende Meldung aus

    };

    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };

    // Die Daten werden in der Ajax Response hier in Form eines Objektes {'inhalt':'Inhalt der Sicht', 'jsdeclarations':....}
    // gesendet; dieses enhält neben dem Inhalt der Sicht bearbeiteDoku.sgt zusätzlich noch die jsdeclarations, die nötig sind
    //  zum Besetzen der Variablen KuferTools.userBen etc. Die Ajax Response enthält aber keine anderen
    // Attribute mehr  (wie z.B. jsfiles); daher Ausgabe via Methode KuferTools.Utils.loadAndDisplayPage4Ajax

    KuferTools.Utils.loadAndDisplayPage4Ajax(href, buttons, 'auto', undefined, initValidate4Dokumente);

  });

  /**
   * Wird als Callback Funktion für loadAndDisplayPage4Ajax benötigt; kann nur ohne Parameter als
   * Funktionsparameter übergeben werden
   */
  function initValidate4Dokumente() {
    KuferTools.InitValidate($('#detailsDokumente'));
  }


  //Clickhandler für das Bearbeiten von Dokumenten
  jQuery(document).on('click', '.bearbeiteDoku', function (event) {
    event.preventDefault();
    //href enthält den Bearbeiten Link, die Kursnr und die aktuelle DokumentenId; also z.B.
    //index.php?tool_id=8&action=bearbeiteDoku&knr=161-3210&dokumentId=120
    var href = jQuery(this).prop('href');
    var buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };

    buttons['Absenden'] = function () {

      // Anmerkung: beim Bearbeiten wird kein neues Dokument hochgeladen!!!!!!!!
      if ($('.dokudownload_detail:checked').length == 0) {
        KuferTools.showMessage({
          title: "Keine Teilnehmergruppe ausgewählt",
          meldung: "Bitte wählen Sie aus, welche Teilnehmergruppe das Dokument herunterladen können soll.",
          width: 'auto'
        });
      } else if (KuferTools.ValidateFormInput($('#detailsDokumente'))) {
        KuferTools.Utils.AjaxLadebildschirm.Start();

        // noch die Reihenfolge als hidden Input mitsenden; die JS Variable hierfür wurde vorher im entspr. Presenter
        // (z.B.  BearbeiteDokuFormularPresenter bzw. UploadFormularPresenter) gesetzt
        var $dokumentForm = jQuery('#detailsDokumente');
        var reihenfolgeInput = '<input id="detail_reihenfolge_dokumente" type="hidden" name="detail_reihenfolge_dokumente" value="' +
          KuferTools.DokuReihenfolge + '">';
        $dokumentForm.append(reihenfolgeInput);


        /* Weiterleiten auf den einzelnen Downloadreiter via Ajax ( statt Form submit()); führt zu Layoutproblemen; daher
         * wird diese Technik hier nicht genutzt; obwohl sie in anderen Fällen eingesetzt wird     */
        /*
        var link = $dokumentForm.attr('action');
        //enthält die Formularelemente als String in der Form  <input#detail_bezeichnung_dokumente> etc.
        var data = $dokumentForm.serialize();
        var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
        jQuery.post(link, data, function (msg) {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
          KuferTools.fadeInReiterContent(msg, activeReiterClass);
          KuferTools.InitValidate($('.validate_form'));
        });          **/

        $dokumentForm.trigger('submit');
        jQuery(this).dialog('close');
      } // Else-Fall ist indirekt abgefangen. ValidateFormInput gibt eine entsprechende Meldung aus
    };

    // Die Daten werden in der Ajax Response hier in Form eines Objektes {'inhalt':'Inhalt der Sicht', 'jsdeclarations':....}
    // gesendet; dieses enhält neben dem Inhalt der Sicht bearbeiteDoku.sgt zusätzlich noch die jsdeclarations, die nötig sind
    //  zum Besetzen der Variablen KuferTools.userBen etc. Die Ajax Response enthält aber keine anderen
    // Attribute mehr  (wie z.B. jsfiles); daher Ausgabe via Methode KuferTools.Utils.loadAndDisplayPage4Ajax
    KuferTools.Utils.loadAndDisplayPage4Ajax(href, buttons, 'auto', undefined, initValidate4Dokumente);
  });


  //Clickhandler für das Übertragen von Dokumenten auf andere Kurse
  jQuery(document).on('click', '.downloadZuWeitereKurse', function (event) {
    event.preventDefault();
    //href enthält den Download Link, die Kursnr und die aktuelle DokumentenId; also z.B.
    //index.php?tool_id=8&action=downloadZuWeitereKurse&knr=161-3210&dokumentId=120
    var href = jQuery(this).prop('href');
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.post(href, function (data) {
      var buttons = {};
      //Falls kein oder ein fehlerhaftes Objekt zurückgegeben wird, wird eine Fehlermeldung ausgegeben.
      if (KuferTools.Utils.showAccessDeniedDialog(data) || KuferTools.Utils.showNotLoggedInDialog(data))
        return;

      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };

      buttons['Dokument bei weiteren Kursen anbieten'] = function () {
        if ($('.kurse4release:checked').length == 0) {
          KuferTools.showMessage({
            title: "Keinen Kurs ausgewählt",
            meldung: "Sie haben keine Kurse ausgewählt, an die das Dokument übertragen werden soll.",
            width: 'auto'
          });
        } else {
          var $dialog = jQuery(this);
          KuferTools.Utils.doAjaxPost(jQuery('.downloadZuWeitereKurseForm'), jQuery('.downloadZuWeitereKurseForm').prop('action'))
            .then(resp => resp.json())
            .then(function (jsonSuccess) {
              $dialog.dialog('close');
              var success = KuferTools.Utils.getObjectFromJson(jsonSuccess);
              if (success) {
                KuferTools.showMessage({
                  title: "Dokument erfolgreich übertragen",
                  meldung: "Das Dokument wurde erfolgreich an die anderen Kurse übertragen.",
                  width: 'auto'
                });
              } else {
                KuferTools.showMessage({
                  title: "Fehler beim Übertragen des Dokuments",
                  meldung: "Beim Übertragen des Dokuments an die anderen Kurse ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder wenden Sie sich an die Einrichtung.",
                  width: 'auto'
                });
              }
            });
        }
      };

      KuferTools.showMessage({ meldung: data, title: 'Dokument bei weiteren Kurse zum Download anbieten', buttons: buttons, width: 'auto' });
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });

  // Klickhandler für die Freigabe von Dokumenten (nur im MA Tool möglich)
  // Der Klick auf den Freigabe Button enabled die Inputfelder freigabeam und freigabevon
  jQuery(document).on('click', '#freigabe', function () {
    // $('#detailsDokumente').find('#freigabe').on('click', function() {
    //Das ist ein Hidden Input Feld mit der Mitarbeiter Id (Datenbankfeld user->ben)
    var $freigabeVon = $('#detail_freigabevon_dokumente', '#detailsDokumente');
    var $freigabeAm = $('#detail_freigabeam_dokumente', '#detailsDokumente');
    var $freigabeAnzeige = $('span.freigabeAnzeige');
    // Hier ist das UserKuerzel enthalten z.B. M2)
    var $freigabeVonSpan = $('span.freigabeVon');

    //Achtung: das aktuelle Objekt ist hier der Button; wird momentan nicht gebraucht
    // var $aktObj = $(this);
    // $aktObj.prop('title','Dokument freigeben');
    // $aktObj.find('.button_text').text('Freigeben');
    var currentDate = new Date();
    $freigabeAm.val(KuferTools.Utils.Date.getDateString(currentDate));
    // $freigabeVon.val('Meier');
    $freigabeVon.val(KuferTools.UserBen);
    $freigabeVonSpan.text(KuferTools.UserKuerzel);
    // $freigabeVonSpan.text('M2');
    $freigabeAnzeige.text('');
  }); //end Klickhandler Button


  //changeHandler für das Inputfeld FreigabeAm: beim Leeren des Felds wird auch Feld freigabeVon geleert
  // (Handler ist nur im MA Tool aktiviert, da Inputfeld für FreigabeAm nur dort erscheint)
  jQuery(document).on('change', '#detail_freigabeam_dokumente', function () {
    // $ziel.find('#detail_freigabeam_dokumente').on('change', function() {
    var $freigabeVon = $('#detail_freigabevon_dokumente', '#detailsDokumente');
    var $freigabeVonSpan = $('span.freigabeVon');
    var $freigabeAnzeige = $('span.freigabeAnzeige');
    var $freigabeNoetig = $('#detail_freigabenoetig_dokumente');
    //Achtung: das aktuelle Objekt ist hier das Inputfeld sebst
    var $aktObj = $(this);
    $freigabeAnzeige.text('');
    if ($aktObj.val() !== '') {
      // $freigabeVon.val('Mueller');
      $freigabeVon.val(KuferTools.UserBen);
      $freigabeVonSpan.text(KuferTools.UserKuerzel);
      //$freigabeVonSpan.text('M3');
    }
    else {
      $freigabeVon.val('');
      $freigabeVonSpan.text('');
      if ($freigabeNoetig.val() === "W")
        $freigabeAnzeige.text('Freigabe nötig!');
    }
  }); // end changeHandler für freigabeam


  //Clickhandler für das Hochladen von Dokumenten im Reiter Dokumente (nicht Downloads)
  jQuery(document).on('click', '.uploadDokument', function () {
    //Achtung: prop funktioniert hier beim Button Element nicht!!
    var href = jQuery(this).attr('href');
    var buttons = {};

    buttons['Hochladen'] = function () {
      if ($('#detail_original_dokumente').val() == '') {
        KuferTools.showMessage({
          title: "Keine Datei ausgewählt",
          meldung: "Sie haben noch keine Datei ausgewählt.<br>Bitte wählen Sie eine Datei zum Hochladen aus!",
          width: 'auto'
        });
      } else if (KuferTools.ValidateFormInput($('#uploadDokumentForm'))) {
        KuferTools.Utils.AjaxLadebildschirm.Start();

        jQuery('#uploadDokumentForm').trigger('submit');
        jQuery(this).dialog('close');
      } // Else-Fall ist indirekt abgefangen. ValidateFormInput gibt eine entsprechende Meldung aus

    };

    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };

    KuferTools.Utils.loadAndDisplayPage4Ajax(href, buttons, '50%', undefined, initValidate4Dokumente);
  });



  // Vorsicht: Geht nur wenn kein Anker in der Action ist.
  // Das sind die Buttons in den Kursdetails, nicht für das Absenden des Formulars selbst.
  // Hier kann man für Teilnehmer und Dozentenreiter dieselbe Klasse und damit denselben action Param.
  // SammelEmail bzw. SammelSms verwenden, da die actions ja wieder von unterschiedlichen Controllern bearbeitet werden
  jQuery(document).on('click', '.submitSammelEMail', function () {
    submitForm(this.closest('form'), 'sammelEMail');
  });

  jQuery(document).on('click', '.submitBescheinigung', function () {
    submitForm(this.closest('form'), 'bescheinigung', '_blank');
  });

  $(document).on('click', 'a.kurs_email_anzeigen_url', function (event) {
    event.preventDefault();
    var url = $(this).prop('href');
    loadKursEmail(url);
  });

  var kursEMailCache = [];
  function loadKursEmail(url) {
    if (url in kursEMailCache) {
      showKursEmail(kursEMailCache[url]);
      return;
    }
    KuferTools.Utils.AjaxLadebildschirm.Start();
    $.ajax({
      type: 'GET',
      url: url,
      cache: true,
      dataType: 'html'
    }).always(function () {
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    }).done(function (data) {
      kursEMailCache[url] = data;
      showKursEmail(data);
    }).fail(function () {
      KuferTools.showMessage({
        title: 'Fehler',
        meldung: 'Fehler beim laden der E-Mail'
      });
    });
  }

  function showKursEmail(data) {
    $data = $('<div></div>').append($.parseHTML(data));
    KuferTools.showMessage({
      title: $data.find('.email_anzeigen .email_title').html(),
      meldung: $data.find('.email_anzeigen .email_body').html()
    });
  }

  function checkForStatusWartendNichtWarteliste() {
    let isFalschMakiert = getMarkierteBelegungen().some(function (belegung) {
      let status = belegung.status;
      return status !== "G";
    });

    if (isFalschMakiert) {
      KuferTools.showMessage({
        meldung: 'Nur noch nicht bereits akzeptierte/abgelehnte Kinder (Status "G") können auf die Warteliste gesetzt werden.',
        title: 'Statusänderung nicht möglich', width: 'auto'
      });
      return false;
    }

    return true;
  }

  function checkForStatusWartend() {
    let isFalschMakiert = getMarkierteBelegungen().some(function (belegung) {
      let status = belegung.status;
      return status !== "G" && status !== "W";
    });

    if (isFalschMakiert) {
      KuferTools.showMessage({
        meldung: 'Nur noch nicht bereits akzeptierte/abgelehnte Kinder (Status "G" oder "W") können akzeptiert oder abgelehnt werden.',
        title: 'Statusänderung nicht möglich', width: 'auto'
      });
      return false;
    }

    return true;
  }

  // Gibt zurück, ob ein Teilnehmer abgehakt werden soll, wenn auf
  // 'Anmeldung Aktzeptieren/Ablehnen' gedrückt worden ist.
  function shouldBelegungBeCheckedAkzeptierenAblehnen(belegung, tnstatus) {
    return belegung.status === tnstatus;
  }

  // Gibt das jQuery ('.teilnehm'-checkbox) Element in der Belegungstabelle
  // zurück, das die Belegungs-Id 'id' hat.
  function getBelegungCheckbox(id) {
    return $('.teilnehm .markable[value="' + id + '"]');
  }

  // Gibt Belegungsobjekt zurück für Belegungs-ID
  function getBelegung(id) {
    return KuferTools.BelegungenAry[id];
  }

  function getMarkierteBelegungen() {
    return $('.teilnehm .markable:checked:visible').map(function () {
      let belegid = parseInt($(this).val(), 10);
      return getBelegung(belegid);
    }).get();
  }

  // Alle Element in Array a einzigartig im Array machen. Dieser Array
  // wird dann zurückgegeben. Die Schlüssel von a werden nicht beachtet und
  // somit nicht mehr enthalten im Ergebnissarray.
  function MakeArrayElementsUnique(a) {
    if (!Array.from) {
      var temp = {};
      // Benutze alle Werte aus a als Schlüssel in temp
      // Da alle Schlüssel einzigartig, folgt dass jedes element in result
      // einzigartig ist
      for (var i = 0; i < a.length; i++) {
        temp[a[i]] = true;
      }
      var result = [];
      for (var k in temp) {
        result.push(k);
      }
      return result;
    } else {
      return Array.from(new Set(a));
    }
  }

  // Gibt alle Belegungs-IDs zurück die durch eine Firma (Familie) angemeldet
  // worden sind und mindestens eine Belegung der Firma makiert ist deren Status
  // in statuscheck enthalten ist (falls statuscheck leer, dann wird der Status
  // der makierten Belegung nicht geprüft). Jede dieser Belegungen wird auch nur
  // im Ergebnisarray zurückgegeben, wenn für sie fnshouldbechecked true
  // zurückgibt.
  //
  // fnshouldbechecked: function(belegungsid, statusMakierteBelegung)
  function getShouldBeMarkedBelegungen(statuscheck, fnshouldbechecked) {
    let beziehungen = [];

    getMarkierteBelegungen().filter(function (belegung) {
      return belegung.firma !== null
        && (statuscheck.length === 0
          || statuscheck.some(function (e) { return e === belegung.status; }));
    }).forEach(function (belegung) {
      // belegung hat eine Firma und hat deren Status ist in statuscheck
      belegungenVonFirma(belegung.firma).forEach(function (e) {
        if (!isBelegungChecked(e.id) && fnshouldbechecked(e, belegung.status)) {
          beziehungen.push(e.id);
        }
      });
    });

    // Mache jedes element in beziehungen einzigartig
    return MakeArrayElementsUnique(beziehungen);
  }

  // Ersetzung für Object.values ('cause IE)
  function ObjectValues(obj) {
    if (!Object.values) {
      // Is IE
      return Object.keys(obj).map(function (key) {
        return obj[key];
      });
    } else {
      return Object.values(obj);
    }
  }

  function belegungenVonFirma(firmenTnr) {
    // Belegungen, die die momentane Belegung angemeldet haben
    return ObjectValues(KuferTools.BelegungenAry).filter(function (e) {
      return e.firma === firmenTnr;
    });
  }

  function doAllRequiredCheckboxesExistForBelegungen(belegungsIds) {
    // prüft ob alle checkboxen existieren (length des jQuery Resultats
    // darf niemals 0 sein!)
    return belegungsIds.every(function (id) {
      return getBelegungCheckbox(id).length !== 0;
    });
  }

  function showRequiredCheckboxesNotExistsMessage() {
    let buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      $(this).dialog('close');
    };

    KuferTools.showMessage({
      buttons: buttons,
      title: "Fehler",
      meldung: "Eine Belegung, die hierfür benögt wurde, wird nicht angezeigt (Tipp: Filter ausstellen)!",
      width: 'auto'
    });
  }

  function showFamilienGemeinsamMessage(beziehungenBelegIds, annehmenOderAblehnen) {
    let beziehungennamen = beziehungenBelegIds
      .map(function (id) {
        let belegung = getBelegung(id);
        return '<li>' + trim(belegung.namevornamefirma) + ': Status ' + belegung.status + '</li>';
      })
      .join("\n");
    beziehungennamen = "<ul>" + beziehungennamen + "</ul>";

    // Dialogfeld anzeigen
    var buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      $(this).dialog('close');

      KuferTools.Utils.AjaxLadebildschirm.Start();

      checkCheckboxesVonBelegungen(beziehungenBelegIds);

      if (annehmenOderAblehnen === 0) {
        submitFormAnmAkzeptieren(document.body.querySelector('.submitAnmAkzeptieren').closest('form'));
      } else if (annehmenOderAblehnen === 1) {
        submitFormAnmAblehnen(document.body.querySelector('.submitAnmAblehnen').closest('form'));
      } else if (annehmenOderAblehnen === 2) {
        submitFormAnmWarteliste(document.body.querySelector('.submitAnmWarteliste').closest('form'));
      }
    };

    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      $(this).dialog('close');
    };

    let strTeilnehmerArtikel = beziehungenBelegIds.length === 1 ?
      KuferTools.Spracheinstellungen.Teilnehmer.Singular_mit_Artikel.Nominativ
      : KuferTools.Spracheinstellungen.Teilnehmer.Plural_mit_Artikel.Nominativ;

    var aktionsname = '';
    if (annehmenOderAblehnen === 0) {
      aktionsname = 'akzeptiert';
    } else if (annehmenOderAblehnen === 1) {
      aktionsname = 'abgelehnt';
    } else if (annehmenOderAblehnen === 2) {
      aktionsname = 'auf die Warteliste gesetzt';
    }

    KuferTools.showMessage({
      buttons: buttons,
      meldung: "Familien können nur gemeinsam akzeptiert, abgelehnt oder auf die Warteliste gesetzt werden. "
        + "Es " + (beziehungenBelegIds.length === 1 ?
          "muss " + strTeilnehmerArtikel : "müssen " + strTeilnehmerArtikel)
        + " " + beziehungennamen + " ausgewählt werden, damit fortgefahren werden kann. "
        + "Soll die Familie gemeinsam "
        + aktionsname + " werden?",
      title: KuferTools.Spracheinstellungen['Teilnehmer'][beziehungenBelegIds.length === 1 ? 'Singular' : 'Plural']['Nominativ'] + " auswählen",
      width: 'auto'
    });
  }

  // Gibt true zurück, falls andere Personen ausgewählt werden müssen.
  // In diesem Fall sollte submitForm nicht aufgerufen werden. Anderfalls wird
  // false zurückgegeben, submitForm kann danach aufgerufen werden.
  //
  // annehmenOderAblehnen: 0 falls 'Anmeldung Akzeptiert' gedrückt wurde
  // oder 1, falls 'Anmeldung Abgelehnt' gedrückt wurde
  // oder 2, falls 'Anmeldung auf Warteliste gedrückt wurde
  function checkForCheckingOthers(annehmenOderAblehnen) {
    if (KuferTools.InnsbruckStadt.isFamilienVeranstaltung !== true) {
      return true;
    }

    let beziehungenBelegIds = getShouldBeMarkedBelegungen(['W', 'G'], shouldBelegungBeCheckedAkzeptierenAblehnen);

    // Kein Dialog, wenn niemand abgehakt werden muss
    if (beziehungenBelegIds.length == 0) {
      return true;
    }

    if (!doAllRequiredCheckboxesExistForBelegungen(beziehungenBelegIds)) {
      showRequiredCheckboxesNotExistsMessage()
      return false;
    }

    showFamilienGemeinsamMessage(beziehungenBelegIds, annehmenOderAblehnen);

    return false;
  }

  /**
   * Für den Button 'Anmeldung Akzeptieren'
   * form: Submit form
   * @param {HTMLFormElement} form
   */
  function submitFormAnmAkzeptieren(form) {
    submitForm(form, 'submitAnmAkzeptieren&' + anmAkzeptierenXsrf);
  }

  /**
   * Für den Button 'Anmeldung Ablehnen'
   * form: Submit form
   * @param {HTMLFormElement} form
   */
  function submitFormAnmAblehnen(form) {
    submitForm(form, 'submitAnmAblehnen&' + anmAblehnenXsrf);
  }

  /**
   * Für den Button 'Anmeldung auf Warteliste'
   * form: Submit form
   * @param {HTMLFormElement} form
   */
  function submitFormAnmWarteliste(form) {
    submitForm(form, 'submitAnmWarteliste&' + anmWartelisteXsrf);
  }

  jQuery(document).on('click', '.submitAnmAkzeptieren', function () {
    if (checkForStatusWartend() && checkForCheckingOthers(0)) {
      submitFormAnmAkzeptieren(this.closest('form'));
    }
  });

  jQuery(document).on('click', '.submitAnmAblehnen', function () {
    if (checkForStatusWartend() && checkForCheckingOthers(1)) {
      submitFormAnmAblehnen(this.closest('form'));
    }
  });

  jQuery(document).on('click', '.submitAnmWarteliste', function () {
    if (checkForStatusWartendNichtWarteliste() && checkForCheckingOthers(2)) {
      submitFormAnmWarteliste(this.closest('form'));
    }
  });

  jQuery(document).on('click', '.submitSammelSms', function () {
    submitForm(this.closest('form'), 'sammelSms');
  });

  //Für den Dozentenreiter
  jQuery(document).on('click', '.submitDozSammelEMail', function () {
    const form = this.closest('form');
    changeDozKursIdsToDnrs4DozentenInput(form);
    submitForm(form, 'dozSammelEMail');
  });

  jQuery(document).on('click', '.submitDozSammelSms', function () {
    const form = this.closest('form');
    changeDozKursIdsToDnrs4DozentenInput(form);
    submitForm(form, 'dozSammelSms');
  });

  /**
   * Ändert die DozKursIds zu Dnrs der Input-Felder mit dem Namen "dozenten[]".
   * @param {HTMLFormElement} form
   */
  function changeDozKursIdsToDnrs4DozentenInput(form) {
    Array.from(form.querySelectorAll('input[name="dozenten[]"]'))
      .filter(input => window.getComputedStyle(input).display !== 'none')
      .forEach((element) => {
        const dozKursId = parseInt(element.value);
        const dnr = KuferTools.KursDetails.DozKursIdZuDnrMapping[dozKursId] ?? undefined;
        if (dnr) {
          element.value = dnr;
        }
      });
  }

  //Für den Honorarreiter

  jQuery(document).on('click', '.dozentDelete', function () {
    handleDozentDelete(this.closest('form'), 'dozentDelete');
  });


  jQuery(document).on('click', '.honorarDozent', function (event) {
    //verhindert Abschicken und Ausgabe auf neuer Seite
    event.preventDefault();
    getDozentenHonorarDialog(jQuery(this).parents('form'), 'dozentenHonorarDialog');
  });

  jQuery(document).on('click', '.vertragDozent', function (event) {
    //verhindert Abschicken und Ausgabe auf neuer Seite
    event.preventDefault();
    getDozentenHonorarDialog(jQuery(this).parents('form'), 'dozentenVertragDialog');
  });

  /**
   * @param {HTMLFormElement} form
   * @param {string} actionParam
   * @param {string|undefined} target
   */
  function submitForm(form, actionParam, target) {
    KuferTools.SubmitForm(form, actionParam, target);
  }

  jQuery(document).on('click', '.alleMarkieren_reiter', function () {
    jQuery(this).parents('.reiter_content').find('.markable:visible').prop('checked', true);
  });

  jQuery(document).on('click', '.keinenMarkieren_reiter', function () {
    jQuery(this).parents('.reiter_content').find('.markable:visible').prop('checked', false);
  });


  jQuery(document).on('change', '#tnStatusAlle', function () {
    if ($(this).prop('checked')) {
      jQuery('.tnStatus').prop('checked', true);
    }
    else {
      jQuery('.tnStatus').prop('checked', false);
    }
  });

  jQuery(document).on('change', '.tnStatus', function () {
    if (jQuery('.tnStatus:not(:checked)').length > 0) {
      jQuery('#tnStatusAlle').prop('checked', false);
    }
    else {
      jQuery('#tnStatusAlle').prop('checked', true);
    }
  });

  var tnStatus = '';
  var tnMobil = 'alle';
  var tnTelefon = 'alle';
  var tnTelMobil = 'alle';
  var tnEmail = 'alle';

  //Klickhandler für Filter im Teilnehmer Reiter der Kursdetails
  jQuery(document).on('click', '.filterTn', function () {
    //Im Hausmeistertool ist zusätzlich eine Raumnr vorhanden => Link dafür besetzen; das ist nötig, weil bei jeder Aktion (also
    // auch beim Filtern) überprüft wird,  ob der aktuelle Kurs für den Raum zulgelassen ist

    var link4RaumNr = typeof KuferTools.raumNr !== 'undefinded' ? '&rnr=' + KuferTools.raumNr : '';
    var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';

    var buttons = {};
    buttons[KuferTools.Button.Bezeichnung.FilterSetzen] = function () {
      KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
      // Nur im Hausmeistertool: zusätzlich den Link zur Raumnummer anhängen
      var href = 'index.php?tool_id=' + KuferTools.ToolId + '&action=setFilterTeilnehmer&knr=' + KuferTools.Knr + link4RaumNr;

      if (typeof KuferTools.BelegId !== 'undefined') {
        href += '&belid=' + KuferTools.BelegId;
      }

      //Belegungsstatus
      tnStatus = '';
      if (jQuery('#tnStatusAlle:checked').length === 0) {
        jQuery('.tnStatusFilter.tnStatus:checked').each(function (index, element) {
          tnStatus += element.value;
        });
      }

      //Telefon, Mobiltel, E-Mail
      tnMobil = jQuery('.tnMobil:checked').val();
      tnTelefon = jQuery('.tnTelefon:checked').val();
      tnTelMobil = jQuery('.tnTelMobil:checked').val();
      tnEmail = jQuery('.tnEmail:checked').val();

      var data = {
        tnStatus: tnStatus,
        tnMobil: tnMobil,
        tnTelefon: tnTelefon,
        tnTelMobil: tnTelMobil,
        tnEmail: tnEmail
      };

      jQuery.post(href, data, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        KuferTools.fadeInReiterContent(msg, activeReiterClass);
      });

      jQuery(this).dialog('close');
    };

    buttons[KuferTools.Button.Bezeichnung.FilterLeeren] = function () {
      jQuery(this).dialog('close');
      KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));

      tnStatus = '';
      tnMobil = 'alle';
      tnTelefon = 'alle';
      tnTelMobil = 'alle';
      tnEmail = 'alle';
      // Nur im Hausmeistertool: zusätzlich den Link zur Raumnummer anhängen
      var href = 'index.php?tool_id=' + KuferTools.ToolId + '&action=resetFilterTeilnehmer&knr=' + KuferTools.Knr + link4RaumNr;

      if (typeof KuferTools.BelegId !== 'undefined') {
        href += '&belid=' + KuferTools.BelegId;
      }

      jQuery.post(href, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        KuferTools.fadeInReiterContent(msg, activeReiterClass);
      });
    };

    buttons[KuferTools.Button.Bezeichnung.Schliessen] = function () {
      jQuery(this).dialog('close');
    };

    //zuletzt eingestellte Filterdaten
    var data = {
      tnStatus: tnStatus,
      tnMobil: tnMobil,
      tnTelefon: tnTelefon,
      tnTelMobil: tnTelMobil,
      tnEmail: tnEmail
    };

    KuferTools.Utils.AjaxLadebildschirm.Start();
    // Nur im Hausmeistertool: zusätzlich den Link zur Raumnummer anhängen
    jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=showFilterTeilnehmer&knr=' + KuferTools.Knr + link4RaumNr, data, function (msg) {
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      KuferTools.showMessage({ meldung: msg, title: 'Filter für die Anzeige der ' + KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ + ' zum Kurs ' + KuferTools.Knr, buttons: buttons, width: 'auto', pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen] });
      if (tnStatus === '') {
        jQuery('#tnStatusAlle').prop('checked', true);
      }
    });

  });

  /*********************************************************************************************************
  *  Dialog für die Auswahl der Einstellungen zum Ausdrucken eine Terminkalenders
  *  Der Dialog wird durch Klick auf den Button <button class="terminKalenderTn"..> ausgegeben, der
  *  im Teilnehmerreiter des Dozententools (Sicht teilnehmerreiter.sgt) vorhanden ist.TerminAuswahlView
  *  als Template bereitgestellt wird. Hier wird der gleiche Mechanismus wie bei der  Auswahl einer Verhaltensliste
  *  in settings/sys/layout/js/pdfDruck.js (siehe dort verhaltensListeDialog) verwendet.
  ************************************************************************************************************/
  var $terminKalenderDialog;
  var terminKalenderObj = {
    ktVon: '',
    ktBis: '',
    isBemerkFach: false,
    isAnwKontroll: false,
    anwesenheitsAry: {},
    belIds: ''
  };

  //Klickhandler zum Ausgeben des Auswahldialogs für einen Terminkalender
  jQuery(document).on('click', '.terminKalenderTn', function () {

    //alle Teilnhemer auf der Seite, die selektiert werden können
    var allTns2Select = jQuery('.teilnehmer .markable:visible');
    if (allTns2Select.length === 0) {
      var message = 'Es ist kein(e) ' + KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ
        + ' zum Markieren vorhanden. Pr&uuml;fen Sie ggf. Ihre ' + 'Filtereinstellungern.';
      KuferTools.showMessage({ meldung: message, title: 'Achtung', width: 'auto' });
      return false;
    }

    var markedTns = jQuery('.teilnehmer .markable:checked');

    //Falls Teilnehmer zum Selektieren vorhanden sind, aber kein Teilnehmer markiert wurde, werden einfach alle TN auf der Seite selektiert
    if (markedTns.length < 1) {
      markedTns = allTns2Select;
    }

    var buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      if (KuferTools.ValidateFormInput($('#FormTerminKalenderTn'))) {
        var $form = jQuery('#FormTerminKalenderTn');
        var markedIds = [];
        markedTns.each(function (index, elem) {
          markedIds.push(jQuery(elem).val());
        });

        var anwesenheitsAry = {};
        jQuery('.anwStatus:checked').each(function (index, elem) {
          var $elem = jQuery(elem);
          var status = $elem.parent().find('.status').text(); //z. B. 'A'
          var schluessel = $elem.parent().find('.schluessel').text(); //z. B. 'Anwesend'
          anwesenheitsAry[status] = schluessel;
        });

        terminKalenderObj.ktVon = jQuery('#ktVon').val();
        terminKalenderObj.ktBis = jQuery('#ktBis').val();
        terminKalenderObj.isBemerkFach = jQuery('#bemerkungFach').is(':checked');
        terminKalenderObj.isAnwKontroll = jQuery('#anwKontrolle').is(':checked');
        terminKalenderObj.anwesenheitsAry = anwesenheitsAry;
        terminKalenderObj.belIds = markedIds.join(":");

        $terminKalenderDialog = jQuery(this).clone();

        var encodedObj = KuferTools.Utils.getJsonFromObjectBase64(terminKalenderObj);
        var objInputStr = '<input type="hidden" name="terminkalobj" value="' + encodedObj + '">';

        $form.append(objInputStr);
        $form.trigger('submit');

        jQuery(this).dialog('close');
      }
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      $terminKalenderDialog = jQuery(this).clone();
      jQuery(this).dialog('close');
    };

    if (typeof $terminKalenderDialog === 'undefined') {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=showTerminAuswahl&knr=' + KuferTools.Knr, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        KuferTools.showMessage({ meldung: msg, title: 'Einstellungen zum Terminkalender für Teilnehmer', buttons: buttons, width: '550px' });
        KuferTools.InitValidate_notooltip($('#FormTerminKalenderTn'));
      });
    }
    else {
      KuferTools.showMessage({ meldung: $terminKalenderDialog, title: 'Einstellungen zum Terminkalender für Teilnehmer', buttons: buttons, width: '550px' });
      KuferTools.InitValidate_notooltip($('#FormTerminKalenderTn'));
    }
  });

  var filterAnwesenheiten;
  var filterAnwesenheitenOrig;

  jQuery(document).on('click', '.filterAnwesenheiten', function () {
    var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
    var buttons = {};

    buttons[KuferTools.Button.Bezeichnung.FilterSetzen] = function () {
      if (KuferTools.ValidateFormInput($('#anwesenheitenFilterForm'))) {
        KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
        filterAnwesenheiten = jQuery(this).clone();
        var $form = jQuery(this).find('#anwesenheitenFilterForm');
        var link = $form.prop('action');

        //Im Hausmeistertool ist zusätzlich eine Raumnr  vorhanden=> diese an die Filter action anhängen
        if (typeof KuferTools.raumNr !== 'undefinded') {
          link += '&rnr=' + KuferTools.raumNr;
        }

        KuferTools.Utils.doAjaxPost($form, link)
          .then(resp => resp.text())
          .then(function (msg) {
            KuferTools.Utils.AjaxLadebildschirm.Stop();
            KuferTools.fadeInReiterContent(msg, activeReiterClass);
          });
        jQuery(this).dialog('close');
      }
    };

    buttons[KuferTools.Button.Bezeichnung.FilterLeeren] = function () {
      KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
      filterAnwesenheiten = filterAnwesenheitenOrig;
      jQuery(this).dialog('close');
      var link = 'index.php?tool_id=' + KuferTools.ToolId + '&action=resetFilterAnwesenheiten&knr=' +
        KuferTools.Knr + (typeof KuferTools.BelegId !== 'undefined' ? '&belid=' + KuferTools.BelegId : '');
      //Im Hausmeistertool ist zusätzlich eine Raumnr vorhanden=> diese anhängen
      if (typeof KuferTools.raumNr !== 'undefinded') {
        link += '&rnr=' + KuferTools.raumNr;
      }

      jQuery.post(link, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        KuferTools.fadeInReiterContent(msg, activeReiterClass);
      });
    };

    buttons[KuferTools.Button.Bezeichnung.Schliessen] = function () {
      filterAnwesenheiten = jQuery(this).clone();
      jQuery(this).dialog('close');
    };

    if (typeof filterAnwesenheiten === 'undefined') {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=showFilterAnwesenheiten&knr=' + KuferTools.Knr +
        (typeof KuferTools.BelegId !== 'undefined' ? '&belid=' + KuferTools.BelegId : ''), function (msg) {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
          filterAnwesenheitenOrig = msg;
          KuferTools.showMessage({ meldung: msg, title: 'Filter für die Anzeige der Anwesenheiten zum Kurs ' + KuferTools.Knr, buttons: buttons, width: 'auto', pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen] });
          KuferTools.InitValidate_notooltip($('#anwesenheitenFilterForm'));
        });
    }
    else {
      KuferTools.showMessage({ meldung: filterAnwesenheiten, title: 'Filter für die Anzeige der Anwesenheiten zum Kurs ' + KuferTools.Knr, buttons: buttons, width: 'auto', pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen] });
      KuferTools.InitValidate_notooltip($('#anwesenheitenFilterForm'));
    }
  });


  var filterJournal;
  var filterJournalOrig;

  jQuery(document).on('click', '.filterJournal', function () {
    var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
    var buttons = {};

    buttons[KuferTools.Button.Bezeichnung.FilterSetzen] = function () {
      KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
      filterJournal = jQuery(this).clone();
      var $form = jQuery(this).find('#journalFilterForm');
      var link = $form.prop('action');

      KuferTools.Utils.doAjaxPost($form, link)
        .then(resp => resp.text())
        .then(function (msg) {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
          KuferTools.fadeInReiterContent(msg, activeReiterClass);
        });
      jQuery(this).dialog('close');
    };

    buttons[KuferTools.Button.Bezeichnung.FilterLeeren] = function () {
      KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
      filterJournal = filterJournalOrig;
      jQuery(this).dialog('close');
      var link = 'index.php?tool_id=' + KuferTools.ToolId + '&action=resetFilterJournal&knr=' + KuferTools.Knr + '&belid=' + KuferTools.BelegId;

      jQuery.post(link, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        KuferTools.fadeInReiterContent(msg, activeReiterClass);
      });
    };

    buttons[KuferTools.Button.Bezeichnung.Schliessen] = function () {
      filterJournal = jQuery(this).clone();
      jQuery(this).dialog('close');
    };

    if (typeof filterJournal === 'undefined') {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=showFilterJournal&knr=' + KuferTools.Knr + '&belid=' + KuferTools.BelegId, function (msg) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        filterJournalOrig = msg;
        KuferTools.showMessage({ meldung: msg, title: 'Filter für das Journal zu ' + KuferTools.Spracheinstellungen.Kurs.Singular_mit_Artikel.Dativ + ' ' + KuferTools.Knr, buttons: buttons, width: 'auto' });
      });
    }
    else {
      KuferTools.showMessage({ meldung: filterJournal, title: 'Filter für das Journal zu ' + KuferTools.Spracheinstellungen.Kurs.Singular_mit_Artikel.Dativ + ' ' + KuferTools.Knr, buttons: buttons, width: 'auto' });
    }
  });

   jQuery(document).on('click', '#termineDatumVon, #termineDatumBis', function () {
    $('#termineDatumZwischen').prop('checked', true);
  });

  jQuery(document).on('click', '#termineUhrzeitVon, #termineUhrzeitBis', function () {
    $('#termineUhrzeitZwischen').prop('checked', true);
  });

  jQuery(document).on('click', '#journalvon, #journalbis', function () {
    $('#nichtalleZeitenjournal').prop('checked', true);
  });

  $('.reiter_content').on('click', '#tn_belinfo_bearbtn', function () {
    beleginfoBearbeiten(true);
  })

  $('.reiter_content').on('click', '#tn_belinfo_abrechnen', function () {
    beleginfoBearbeiten(false);
  });

  $('.reiter_content').on('click', '#save_tn_belinfo', function () {
    beleginfoSpeichern($(this));
  });

  $('.abmeld_firmaanmel').tooltip({
    tooltipClass: "anmeldenButton_tooltip"
  });
  // makes a carriage return in the tooltip when line breaks are found in the title attribute
  $('.abmeld_firmaanmel').each(function () {
    var title = $(this).prop('title');
    var formattedTitle = title.replace(/<br ?\/?>/g, '\n');
    $(this).prop('title', formattedTitle);
  });

  // Terminbearbeitung in Kursdetails der Tool MA
  $('.reiter_content').on('click', '.terminUpdate', function () {

    var selectedKtIds = KuferTools.GetSelectedIds();
    var abrechenbareKtIds = [];
    var nichtAbrechenbareKtIds = [];

    jQuery.each(selectedKtIds, function (index, ktId) {
      if ($('#kt_rs_abrechenbar_' + ktId).length > 0) {
        abrechenbareKtIds[abrechenbareKtIds.length] = ktId;
      } else {
        nichtAbrechenbareKtIds[nichtAbrechenbareKtIds.length] = ktId;
      }
    });

    if (selectedKtIds.length == 0) {
      KuferTools.showMessage({
        title: 'Achtung',
        meldung: 'Es muss mindestens ein ' + KuferTools.Spracheinstellungen.Kurstag.Singular.Nominativ + ' markiert werden.'
      });
    } else if (selectedKtIds.length < 2) {
      window.location.href = 'index.php?tool_id=' + KuferTools.ToolId + '&action=terminbearbeiten&ktId=' + selectedKtIds.toString() + '&knr=' + KuferTools.Knr;
    } else {
      var buttons = {
        'Speichern': function () {
          var $form = jQuery(this).find('form');
          var data = $('form').serialize();
          $(this).dialog('close');

          var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
          KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
          var url = $form.attr('action');

          jQuery.post(url, data, function (msg) {
            msg = KuferTools.ShowInformiereTeilnehmerDialog($('<div>' + msg + '</div>'));
            msg = KuferTools.ShowKursAendernDialog($('<div>' + msg + '</div>'));
            KuferTools.Utils.AjaxLadebildschirm.Stop();
            KuferTools.fadeInReiterContent(msg, activeReiterClass);
          });
        },
        'Abbrechen': function () {
          $(this).dialog('close');
          // Das ist ja kacke, wenn das hier so spezifisch angegeben werden muss. Ist bereits in personendetails.js genau so.
          // KuferTools.removeHinterlegungen();
        }
      };

      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=termineSammelBearbeiten&updateDozent=1&ktIds=' + selectedKtIds.join(':')
        + '&knr=' + KuferTools.Knr, function (data) {
        KuferTools.showMessage({
          meldung: data, title: 'Sammeländerung von ' + selectedKtIds.length + ' ' + KuferTools.Spracheinstellungen.KurstagVon.Plural.von + ' für Kurs ' + KuferTools.Knr,
          buttons: buttons, width: '800', pressEnterFunc: buttons['Speichern']
        });
        KuferTools.Utils.AjaxLadebildschirm.Stop();

        var ckbBeginn = '#kurstagSammelaenderung #wt_kt_changeBeginn';
        var ckbEnde = '#kurstagSammelaenderung #wt_kt_changeEnde';
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeDate_val', '#kurstagSammelaenderung #wt_kt_changeDate');
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeBeginn_val', ckbBeginn + ', ' + ckbEnde, true);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeUe_val', ckbBeginn + ', ' + ckbEnde);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeEnde_val', ckbEnde, true);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeMinuten_val', ckbBeginn + ', ' + ckbEnde);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changePause_val', ckbBeginn + ', ' + ckbEnde);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeAusfall_val', '#kurstagSammelaenderung #wt_kt_changeAusfall');
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeBemerkung_val', '#kurstagSammelaenderung #wt_kt_changeBemerkung');
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeKursort_val', '#kurstagSammelaenderung #wt_kt_changeKursort', true);
        KuferTools.Utils.UiFunctions.setzeCheckboxNachChanged('#kurstagSammelaenderung #wt_kt_changeDozent_val', '#kurstagSammelaenderung #wt_kt_changeDozent');

        //Aktualisiert Minuten und UE, nachdem die Uhrzeiten durch die Hinterlegung geändert wurden.
        jQuery('#kurstagSammelaenderung #wt_kt_changeEnde_val').on('fromHLwindow', function () {
          $('#kurstagSammelaenderung #wt_kt_changeEnde_val').trigger('change');
        });
      });
    }
  });

  function shouldBelegungBeCheckedStornoBegleitperson(belegung) {
    var statusAry = ['A', 'G', 'W'];
    if (!belegung.isBegleitperson || statusAry.indexOf(belegung.status) === -1) {
      return false;
    }

    // Array der alle angemeldeten Belegungen enthält, die auch
    // mit derselben Firma wie belegung angemeldet sind und nicht Begleiter sind
    let belegungenDerFamilieAry = ObjectValues(KuferTools.BelegungenAry).filter(function (e) {
      return e.firma === belegung.firma && statusAry.indexOf(e.status) !== -1 && !e.isBegleitperson;
    });

    if (belegungenDerFamilieAry.length === 0) {
      return false;
    }

    // Mapped belegungenAry zu den Werten der Checkboxen der Oberfläche
    // Es mindestens eine Checkbox nicht ausgewählt sein, damit diese Funktion
    // false zurückgibt, d.h. ein "Kind" nicht ausgewählt ist.
    return belegungenDerFamilieAry.every(function (e) {
      return isBelegungChecked(e.id);
    });
  }

  function isBelegungChecked(belegId) {
    let checkbox = getBelegungCheckbox(belegId);
    return checkbox.length !== 0 && checkbox.prop("checked") === true;
  }

  function checkCheckboxesVonBelegungen(belegungenIds) {
    belegungenIds.forEach(function (id) {
      getBelegungCheckbox(id).prop('checked', true);
    });
  }

  function showInnsbruckStadtStornoBegleitpersonen(beziehungenBelegIds) {
    let buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      $(this).dialog('close');

      checkCheckboxesVonBelegungen(beziehungenBelegIds);

      teilnehmerStornoBase();
    };

    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      $(this).dialog('close');
    };

    let strTeilnehmer = beziehungenBelegIds.length === 1 ?
      KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ
      : KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ;

    KuferTools.showMessage({
      buttons: buttons,
      meldung: 'Es können nicht alle Kinder einer Familie stoniert werden ohne die Begleitperson(en) mit abzumelden. '
        + (beziehungenBelegIds.length === 1 ? '' : beziehungenBelegIds.length + ' ')
        + (beziehungenBelegIds.length === 1 ? ' Eine Begleitperson muss ' : ' Begleitpersonen müssen')
        + ' auch stoniert werden. Auswählen und fortfahren?',
      title: strTeilnehmer + " auswählen",
      width: 'auto'
    });
  }

  function innsbruckStadtStornoException() {
    // InnsbruckStadt: Wenn alle Kinder einer Familie ausgewählt sind,
    // muss auch die Begleitperson(en) ausgewählt sein
    let beziehungenBelegIds = getShouldBeMarkedBelegungen(['A', 'G', 'W'], shouldBelegungBeCheckedStornoBegleitperson);

    if (beziehungenBelegIds.length === 0) {
      return false;
    }

    if (!doAllRequiredCheckboxesExistForBelegungen(beziehungenBelegIds)) {
      showRequiredCheckboxesNotExistsMessage();
      return true;
    }

    showInnsbruckStadtStornoBegleitpersonen(beziehungenBelegIds);

    return true;
  }

  function teilnehmerStorno() {
    if (KuferTools.isInnsbruckStadt && KuferTools.InnsbruckStadt.isFamilienVeranstaltung) {
      if (innsbruckStadtStornoException())
        return false;
    }

    return teilnehmerStornoBase();
  }

  function teilnehmerStornoBase() {
    var $pTab = $('.teilnehmerStorno').parents('.reiter_content');
    var selectedBelegIds = [];
    $pTab.find('.markable:checked').each(function () {
      selectedBelegIds[selectedBelegIds.length] = $(this).val();
    });

    if (selectedBelegIds.length < 1) {
      var dataName = KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ;
      showMessage('Es muss mindestens ein ' + dataName + ' für die Stornierung markiert werden.', 'Achtung');
      return false;
    }

    var buttons = {};
    buttons['Stornieren'] = function () {
      //KuferTools.Utils.AjaxLadebildschirm.Start();
      sendeStornieren(selectedBelegIds);
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      $(this).dialog('close');
    };

    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=abmeldenDialog&knr=' + KuferTools.Knr + '&belIds=' + selectedBelegIds, function (data) {
      KuferTools.showMessage({ meldung: data, title: 'Storniere TeilnehmerInnen', buttons: buttons, width: 'auto', pressEnterFunc: buttons['Stornieren'] });
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      KuferTools.InitValidate($('.validate_form'));
    });
  }

  /**
   * Clickhandler für den Abmelden-Button. Öffnet einen Dialog, welcher die angehakten
   * Teilnehmer anzeigt
   */
  $('.reiter_content').on('click', '.teilnehmerStorno', teilnehmerStorno);

  /**
  * Clickhandler für den Barzahlungs-Button. Öffnet einen Dialog, welcher die angehakten Teilnehmer  für eine Barzahlung anzeigt
  */
  $('.reiter_content').on('click', '.barZahlung', function () {

    var $pTab = $(this).parents('.reiter_content');
    var selectedBelegIds = [];
    var relevantBelegIds = [];
    var selectedAndRelevantBelegIds = [];

    // die angehakten Teilnehmer im Array aufsammeln
    $pTab.find('.markable:checked').each(function () {
      selectedBelegIds[selectedBelegIds.length] = $(this).val();
    });

    //alle Teilnehmer selektieren, für die eine Barzahlung durchgeführt werden kann; hierfür ist Attribut data-zahlbar
    // für die Checkbox gesetzt
    $pTab.find('.teilnehm.table_row').each(function (index, elem) {
      var $inputElem = $(elem).find('input.markable');
      var zahlbar = $inputElem.attr('data-zahlbar');

      // Falls noch ein Saldo offen ist, Checkbox dazu selektieren
      if (typeof (zahlbar) !== "undefined" && zahlbar == '1') {


        relevantBelegIds[relevantBelegIds.length] = $inputElem.val();
        //Die relevanten Beleg Ids nur auswählen, falls vorher keine Teilnehmer selektiert wurden
        if (selectedBelegIds.length < 1) {
          $inputElem.prop('checked', true);
        }
      }
    }); //end each

    //Es wurde noch kein Teilnehmer selektiert
    if (selectedBelegIds.length < 1 && relevantBelegIds.length < 1) {

      var dataName = KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ;
      showMessage('Es ist kein ' + dataName + ' vorhanden, für den eine Barzahlung durchgeführt werden kann.', 'Achtung');
      // showMessage('Es muss mindestens ein ' + dataName + ' zum Durchführen der Barzahlung markiert werden.', 'Achtung');
      return false;
    }
    else if (selectedBelegIds.length < 1) {
      selectedAndRelevantBelegIds = relevantBelegIds;
    } //end if (selectedBelegIds.length < 1)
    //beide sind > 1: die ausgewählten mit den selektierten Belegungen abgleichen; d.h. nur die Belegungen aus den selektierten
    //verwenden, die auch für eine Barzahlung in Frage kommen (also die mit Saldo > 0)
    else {

      selectedAndRelevantBelegIds = arrayIntersect(selectedBelegIds, relevantBelegIds);
    }

    //Nach dem Abgleich mit den relevanten Teilnehmer ist keiner mehr vorhanden => Meldung: Barzahlung nicht möglich
    if (selectedAndRelevantBelegIds.length < 1) {
      var msgPartTeiln = '';
      if (selectedBelegIds.length > 1) {
        msgPartTeiln = 'Für die ausgewählten ' + KuferTools.Spracheinstellungen.Teilnehmer.Plural.Akkusativ;
      }
      else {
        msgPartTeiln = 'Für den ausgewählten ' + KuferTools.Spracheinstellungen.Teilnehmer.Singular.Akkusativ;
      }

      showMessage(msgPartTeiln + ' kann keine Barzahlung mehr durchgeführt werden, da kein Saldo mehr vorhanden ist.', 'Achtung');
      return false;
    }

    var buttons = {};
    buttons['OK'] = function () {
      sendeBarzahlungDaten(selectedAndRelevantBelegIds);
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      $(this).dialog('close');
    };

    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=barzahlenDialog&knr=' + KuferTools.Knr + '&belIds=' + selectedAndRelevantBelegIds, function (data) {
      KuferTools.showMessage({ meldung: data, title: 'Barzahlung durchführen', buttons: buttons, width: 'auto', pressEnterFunc: buttons['OK'] });
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      KuferTools.InitValidate($('.validate_form'));
    });
  });   //end Click handler Barzahlung


  // Bildet die Vereinigung zweier Arrays
  function arrayIntersect(a, b) {
    var t;
    if (b.length > a.length) {
      t = b;
      b = a;
      a = t;
    }
    // indexOf to loop over shorter


    return a.filter(function (e) {
      return b.indexOf(e) > -1;
    });
  } //end arrayIntersect(..)


  /**
   * Clickhandler für den Anmeldebestätigungs-Button. Läßt Ausgabe der Anmeldebestätigungs PDF Liste nur zu, falls
   * Teilnehmer mit einem Status für angemeldet (A, T oder P) angehakt wurden. Ansonsten wird ein entspr. Meldungs-
   * Dialog ausgegeben.
   */
  $('.reiter_content').on('click', '.submitAnmeldeBestaetigung', function () {
    var $actTab = $(this).parents('.reiter_content');
    var selectedBelegIds = [];
    var relevantBelegIds = [];

    // die angehakten Teilnehmer im Array aufsammeln; aber nur
    // Teilnehmer mit Belegungsstatus A, T, P oder '' selektieren

    $actTab.find('.markable:checked').each(function (index, elem) {
      // selectedBelegIds[selectedBelegIds.length] = $(this).val();
      $elem = $(elem);
      selectedBelegIds[selectedBelegIds.length] = $elem.val();
      var status = $elem.attr('data-status');
      // Falls Status angemeldet ist, dann die selektierte Belegung zu den relevanten Belegungen hinzufügen

      //statt:
      // if (status == 'T' || status == 'A' || status == 'P' || status.trim() == '') {
      statusAry = ['A', 'T', 'P', 'F', ''];
      if ($.inArray(status.trim(), statusAry) != -1) {
        relevantBelegIds[relevantBelegIds.length] = $elem.val();
      }
    });  //end each

    //Es wurde noch kein Teilnehmer mit passendem Status "Angemeldet" gefunden
    if (relevantBelegIds.length < 1) {

      var dataName = KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ;
      showMessage('Eine Anmeldebestätigung kann nicht ausgedruckt werden, da kein(e) ' + dataName + ' mit Status "angemeldet" oder "Firma" ausgewählt wurde.', 'Achtung');
      return false;
    }
    submitForm(this.closest('form'), 'anmeldebestaetigung', '_blank');
  });

  $('.nachweisLinkUpload_blak').on('click', function () {
    KuferTools.uploadNachweisBlakBglu();
  });

  jQuery(document).on('click', '.ma_reiter_teilnehmer_anmelden_button', function (event) {
    event.preventDefault();
    var href = jQuery(this).attr('href');
    window.location = href;
  });

  //Dialog zum Setzen eines Kursausfalls
  jQuery(document).on('click', '.kursausfallSetzen', function (event) {
    event.preventDefault();
    var link = jQuery(this).prop('href');
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.post(link, function (msg) {
      var buttons = {};
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        var $form = jQuery('#kursausfall_setzen_form');
        if (KuferTools.ValidateFormInput($form)) {
          $form.trigger('submit');
          KuferTools.Utils.AjaxLadebildschirm.Start();
          jQuery(this).dialog('close');
        }
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () { $(this).dialog("close"); };
      KuferTools.Utils.AjaxLadebildschirm.Stop();

      KuferTools.showMessage({ meldung: msg, title: 'Aktionen für den Kursausfall von Kurs ' + KuferTools.Knr, buttons: buttons, width: 'auto', pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.Ok] },
        function () { KuferTools.InitValidate(jQuery('#kursausfall_setzen_form')); });
    });
  });

  jQuery(document).on('change', '.raum_freigeben', function (event) {
    if (jQuery(this).is(':checked')) {
      jQuery('input.kt_loeschen').prop('disabled', false);
      jQuery('input.medien_loeschen').prop('disabled', false);
    }
    else {
      jQuery('input.kt_loeschen').prop('disabled', true);
      jQuery('input.medien_loeschen').prop('disabled', true);
    }
  });

  $('.reiter_content').on('click', '.vertragsformularButton.dozinfo', function (event) {
    event.preventDefault();
    KuferTools.HandleVertragsformular(
      'Vertragsformular von ' + KuferTools.Spracheinstellungen.Dozent.Singular.Nominativ + ' ' + KuferTools.PersonDetails.Name,
      'index.php?tool_id=' + KuferTools.ToolId + '&action=showVertragsformularSettings&dnr=' + KuferTools.Dnr + '&knr=' + KuferTools.GetSelectedIds(),
      '',
      '22%');
  });

  $('.reiter_content').on('click', '.vertragsformularButton.kursdetails', function (event) {
    event.preventDefault();
    var $form = jQuery(this).parents('form');
    var $dnrs = $form.find('input.markable:checked');
    if ($dnrs.length !== 1) {
      var additionalText = '';
      if ($dnrs.length > 1) {
        additionalText = 'nur ';
      }
      KuferTools.showMessage({ title: 'Hinweis', meldung: 'Bitte wählen Sie ' + additionalText + 'einen Dozenten aus.' });
      return;
    }

    var dnr = $dnrs.prop('id').replace('dozent_', '');

    KuferTools.HandleVertragsformular(
      'Vertragsformular',
      'index.php?tool_id=12&action=showVertragsformularSettings&dnr=' + dnr + '&knr=' + KuferTools.Knr,
      '',
      '22%');
  });

  $(document).on('click', '.druck_Anwesenheitsliste', function (event) {
    event.preventDefault();
    var href = $(this).prop('href');
    if (KuferTools.IsMvhs) {
      var regexSpecialKnrs = /.*6(3[1-9][0-9]{3}|4[0-9]{4})$/;
      var regexKnr = /nr=([^&]*)/;
      var match = regexKnr.exec(href);
      var knrs = match[1].split(':');
      var onlySpecialKnrs = true;

      $.each(knrs, function (index, knr) {
        onlySpecialKnrs = regexSpecialKnrs.test(knr);
        if (!onlySpecialKnrs) {
          return false;
        }
      });

      if (onlySpecialKnrs && KuferTools.ToolId == 1) {
        href = href.replace('Anwesenheitsliste', 'AnwesenheitslisteDeutschkurse');
      }
    }

    window.open(href, '_blank');
  });

  document.addEventListener('KursdetailsReiterLoaded', event => {
    /** @type {HTMLElement} */
    const reiter = document.body.querySelector('.reiter_content');

    /*
     * Mechanismus zum Toggeln der Sichtbarkeit von Kindzeilen
     * Das Parent muss die Klassen table_row, table_row_parent und
     * table_row_parent_{id} haben. Das Kind muss die Klassen table_row_child und
     * table_row_parent_{id} besitzen.
     */
    for (const parentRow of reiter.querySelectorAll('.table_row.table_row_parent')) {
      /** @type {HTMLElement|undefined} */
      const toggleBtn = parentRow.querySelector('.table_content > button.show_table_row_child, .table_content > button.show_table_row_child') ?? undefined;

      const classParent = Array.from(parentRow.classList).filter(str => {
        return str.startsWith('table_row_parent_');
      })[0] ?? undefined;

      const datamodulName = parentRow.dataset.datamodulName;
      const datamodulId = parentRow.dataset.datamodulId;
      const showLabel = parentRow.querySelector('#aria_label_show_' + datamodulName + '_' + datamodulId).textContent.trim();
      const hideLabel = parentRow.querySelector('#aria_label_hide_' + datamodulName + '_' + datamodulId).textContent.trim();

      /** @type {HTMLElement[]} */
      const children = classParent ? Array.from(reiter.querySelectorAll('.table_row_child.' + classParent)) : []
      parentRow.addEventListener('click', () => {
        if (toggleBtn) {
          /** @type {HTMLElement|undefined} */
          const faIcon = toggleBtn.querySelector('i.fa.fa-plus, i.fa.fa-minus') ?? undefined;

          // Toggle icon
          if (faIcon) {
            faIcon.classList.toggle('fa-plus');
            faIcon.classList.toggle('fa-minus');
          }

          // Toggle aria-state und Titel
          if (toggleBtn.title === showLabel) {
            toggleBtn.title = hideLabel;
          } else {
            toggleBtn.title = showLabel;
          }

          toggleBtn.setAttribute('aria-expanded', toggleBtn.getAttribute('aria-expanded') === 'true' ? 'false' : 'true');
        }

        children.forEach(childRow => childRow.classList.toggle('table_row_child_hidden'));
      });

      if (toggleBtn && children.length > 0) {
        toggleBtn.setAttribute('aria-controls',
          children.filter(childRow => childRow.id && childRow.id !== '')
            .map(childRow => childRow.id)
            .join(' ')
        );
      }
    }
  });

  $(document).on('click', '.showTerminVerschiebenWunschButton', function (event) {
    event.preventDefault();

    var markedTermine = $('.termine .markable:checked');
    if (markedTermine.length !== 1) {
      KuferTools.showMessage({ meldung: 'Bitte wählen Sie ' + (markedTermine.length > 1 ? 'nur ' : '') + 'einen Termin aus.', title: 'Termin verschieben', width: 'auto' });
      return false;
    }

    var ktId = markedTermine.val();

    KuferTools.Utils.AjaxLadebildschirm.Start();

    var href = 'index.php?tool_id=' + KuferTools.ToolId + '&belid=' + KuferTools.BelegId + '&ktId=' + ktId + '&action=showTerminVerschiebenWunschDialog';
    $.ajax({
      url: href,
      dataType: 'html'
    }).done(function (data) {
      var title = 'Termin verschieben';
      var buttons = {};
      var $data = $(data);
      if ($data.find('input[name="newKurstag"]').length === 0) {
        // Kurs hat hat keine Verschiebungstermine
        KuferTools.showMessage({ meldung: data, title: title, width: 500 });
        return;
      }

      buttons['Wunsch absenden'] = function () {
        $(this).find('#termin_verschieben_dialog_error').css('display', 'none');

        var $kurstagRadio = $(this).find('input[name="newKurstag"]:checked');
        if ($kurstagRadio.length === 0) {
          $(this).find('#termin_verschieben_dialog_error').css('display', 'block');
          return;
        }

        var kurstagId = $kurstagRadio.val();

        KuferTools.Utils.AjaxLadebildschirm.Start();

        var href = $data.find('form#termin_verschiebenwunsch_dialog').attr('action');
        $.ajax({
          url: href,
          dataType: 'html',
          method: 'POST',
          data: {
            newKurstag: kurstagId
          }
        }).done(function (data) {
          KuferTools.showMessage({ meldung: data, title: 'Termin verschoben', width: 'auto' });
        }).fail(function () {
          KuferTools.Utils.showAjaxErrorDialog(undefined, href);
        }).always(function () {
          KuferTools.Utils.AjaxLadebildschirm.Stop();
        });
        $(this).dialog('close');
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        $(this).dialog('close');
      };

      KuferTools.showMessage({ meldung: data, title: title, buttons: buttons, width: 500 });
    }).fail(function () {
      KuferTools.Utils.showAjaxErrorDialog(undefined, href);
    }).always(function () {
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });

  jQuery('button.fa_kursdetailsterminenachoutlooklink, button.tn_kursdetailsterminenachoutlooklink').on('click', function () {
    KuferTools.OpenIcsDialogFor('belnummern', [KuferTools.BelegId]);
  });
}); // end jQuery(function() {})


/**
 * @param {string} reiterName
 * @param {HTMLElement} reiter
 */
let postLoadReiter = function(reiterName, reiter) {
  const event = new CustomEvent('KursdetailsReiterLoaded', {
    bubbles: false,
    cancelable: false,
    detail: {
      element: reiter,
      reiterName: reiterName
    }
  });

  // Dies ist ein Hack. Es wird hiermit darauf gewartet, dass alles JavaScript ausgeführt wurde
  // (z.B. Seite wird gerade geladen). Siehe https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop.
  setTimeout(() => {
    document.dispatchEvent(event);
  }, 0);
};

KuferTools.fotoNurEinmal = 0;
KuferTools.fadeInReiterContent = function (newContent, className, ...functions) {
  // Name für das Klassenattribut, wenn vorhanden, wird dem ReiterContent hinzugefügt.
  className = className || '';

  const reiterContent = document.querySelector('.reiter_content');

  // 1. unsichtbar machen
  // 2. content austauschen
  // 3. höhe anpassen
  // 4. wieder sichtbar machen.

  // Skript-Tags ausführen (dies wird nicht gemacht wenn HTML mit innerHTML ersetzt wird)
  function loadScripts() {
    reiterContent.querySelectorAll('script')
      .forEach(element => {
        const newScriptElement = document.createElement("script");
        Array.from(element.attributes).forEach(attr => {
          newScriptElement.setAttribute(attr.name, attr.value);
        });

        newScriptElement.appendChild(document.createTextNode(element.innerHTML));

        element.parentNode.replaceChild(newScriptElement, element);
      });
  }

  function setJustContent() {
    reiterContent.innerHTML = '<div id="reiter_content_class" class="' + className + '" role="none">' + newContent + '</div>';
  }

  function setContent() {
    setJustContent();
    loadScripts();
  }

  function doPostProcessing() {
    KuferTools.InitTooltip(document.body.querySelectorAll('.reiter_content .hasToolTip'));
    KuferTools.InitStatusFarbeToolTip();
    if (document.querySelector('.maennlich_innsbruck_mehr')) {
      initMitveranstalter();
    }

    // call each of the passed functions
    if (functions) {
      for (const fnFinished of functions) {
        if (fnFinished) {
          fnFinished();
        }
      }
    }

    postLoadReiter(className, reiterContent);
    reiterContent.parentElement.setAttribute('aria-busy', 'false');
  }

  if (!document.startViewTransition) {
    KuferTools.Utils.AjaxLadebildschirm.Stop();
    setContent();
    doPostProcessing();
  } else {
    KuferTools.Utils.AjaxLadebildschirm.Stop();

    document.startViewTransition(() => {
      setJustContent();
      loadScripts();
      doPostProcessing();
    });
  }
};

function initMitveranstalter() {
  var maennlich_innsbruck_change = 0;
  var maennlich_auswaerts_change = 0;
  var weiblich_innsbruck_change = 0;
  var weiblich_auswaerts_change = 0;

  $('.maennlich_innsbruck_mehr').on('click', function () {
    maennlich_innsbruck_change += 1;
    renderAdditionalTn();
  });

  $('.maennlich_innsbruck_weniger').on('click', function () {
    if (maennlich_innsbruck_change + KuferTools.KursDetails.Mitveranstalter.MaennlichInnsbruck > 0) {
      maennlich_innsbruck_change -= 1;
    }
    renderAdditionalTn();
  });

  $('.maennlich_auswaerts_mehr').on('click', function () {
    maennlich_auswaerts_change += 1;
    renderAdditionalTn();
  });

  $('.maennlich_auswaerts_weniger').on('click', function () {
    if (maennlich_auswaerts_change + KuferTools.KursDetails.Mitveranstalter.MaennlichAuswaerts > 0) {
      maennlich_auswaerts_change -= 1;
    }
    renderAdditionalTn();
  });

  $('.weiblich_innsbruck_mehr').on('click', function () {
    weiblich_innsbruck_change += 1;
    renderAdditionalTn();
  });

  $('.weiblich_innsbruck_weniger').on('click', function () {
    if (weiblich_innsbruck_change + KuferTools.KursDetails.Mitveranstalter.WeiblichInnsbruck > 0) {
      weiblich_innsbruck_change -= 1;
    }
    renderAdditionalTn();
  });

  $('.weiblich_auswaerts_mehr').on('click', function () {
    weiblich_auswaerts_change += 1;
    renderAdditionalTn();
  });

  $('.weiblich_auswaerts_weniger').on('click', function () {
    if (weiblich_auswaerts_change + KuferTools.KursDetails.Mitveranstalter.WeiblichAuswaerts > 0) {
      weiblich_auswaerts_change -= 1;
    }
    renderAdditionalTn();
  });

  $('.maennlich_innsbruck_change').on('input', function () {
    KuferTools.Utils.Focus.InputForbidPattern($(this), /[^-0123456789]|^0/g);

    if (validateInput($(this)) && $(this).val().length > 0) {
      maennlich_innsbruck_change = parseInt($(this).val(), 10);
      renderAdditionalTn();
    } else {
      maennlich_innsbruck_change = 0;
      renderAdditionalTnGesamt();
    }
  });

  $('.maennlich_auswaerts_change').on('input', function () {
    KuferTools.Utils.Focus.InputForbidPattern($(this), /[^-0123456789]|^0/g);

    if (validateInput($(this)) && $(this).val().length > 0) {
      maennlich_auswaerts_change = parseInt($(this).val(), 10);
      renderAdditionalTn();
    } else {
      maennlich_auswaerts_change = 0;
      renderAdditionalTnGesamt();
    }
  });

  $('.weiblich_innsbruck_change').on('input', function () {
    KuferTools.Utils.Focus.InputForbidPattern($(this), /[^-0123456789]|^0/g);

    if (validateInput($(this)) && $(this).val().length > 0) {
      weiblich_innsbruck_change = parseInt($(this).val(), 10);
      renderAdditionalTn();
    } else {
      weiblich_innsbruck_change = 0;
      renderAdditionalTnGesamt();
    }
  });

  $('.weiblich_auswaerts_change').on('input', function () {
    KuferTools.Utils.Focus.InputForbidPattern($(this), /[^-0123456789]|^0/g);

    if (validateInput($(this)) && $(this).val().length > 0) {
      weiblich_auswaerts_change = parseInt($(this).val(), 10);
      renderAdditionalTn();
    } else {
      weiblich_auswaerts_change = 0;
      renderAdditionalTnGesamt();
    }
  });

  function renderAdditionalTnDiff() {
    renderAdditionalTnInput($('.maennlich_innsbruck_change'), maennlich_innsbruck_change)
    renderAdditionalTnInput($('.maennlich_auswaerts_change'), maennlich_auswaerts_change)
    renderAdditionalTnInput($('.weiblich_innsbruck_change'), weiblich_innsbruck_change)
    renderAdditionalTnInput($('.weiblich_auswaerts_change'), weiblich_auswaerts_change)
  }

  function renderAdditionalTnInput($input, tnChange) {
    if (tnChange != 0) {
      if (tnChange > 0) {
        $input.val(Math.abs(tnChange));
      } else {
        $input.val('-' + Math.abs(tnChange));
      }
    } else {
      $input.val(0);
    }
    validateInput($input);
  }

  function renderAdditionalTnGesamt() {
    renderAdditionalTnGesamtText($('.maennlich_innsbruck_gesamt'), KuferTools.KursDetails.Mitveranstalter.MaennlichInnsbruck, maennlich_innsbruck_change)
    renderAdditionalTnGesamtText($('.maennlich_auswaerts_gesamt'), KuferTools.KursDetails.Mitveranstalter.MaennlichAuswaerts, maennlich_auswaerts_change)
    renderAdditionalTnGesamtText($('.weiblich_innsbruck_gesamt'), KuferTools.KursDetails.Mitveranstalter.WeiblichInnsbruck, weiblich_innsbruck_change)
    renderAdditionalTnGesamtText($('.weiblich_auswaerts_gesamt'), KuferTools.KursDetails.Mitveranstalter.WeiblichAuswaerts, weiblich_auswaerts_change)
  }

  function renderAdditionalTnGesamtText($pTarget, tnAngemeldet, tnChange) {
    var gesamt = (tnChange * 1 + tnAngemeldet);
    if (tnChange != 0) {
      var color = '';
      if (gesamt < 0) {
        color = ' style="color:red;" ';
      }

      $pTarget.html(' = ' + '<span class="mv_gesamt_zahl" ' + color + '>' + gesamt + '</span>');
    } else {
      $pTarget.html('');
    }
  }

  function renderAdditionalTn() {
    renderAdditionalTnDiff();
    renderAdditionalTnGesamt();
  }

  $('.mitveranstalter_save').on('click', function () {
    if (maennlich_innsbruck_change == 0 &&
      maennlich_auswaerts_change == 0 &&
      weiblich_innsbruck_change == 0 &&
      weiblich_auswaerts_change == 0) {
      KuferTools.showMessage({
        'title': 'Keine Änderungen vorgenommen',
        'meldung': 'Sie haben keine Änderungen an den Teilnehmerzahlen vorgenommen.<br>Sie können mit <span class="fa fa-plus mv_button_plus"></span> und <span class="fa fa-minus mv_button_minus"></span> die Teilnehmerzahlen ändern oder direkt in die Eingabefelder die relative Änderung angeben.'
      });
      return;
    } else if (maennlich_innsbruck_change * 1 + KuferTools.KursDetails.Mitveranstalter.MaennlichInnsbruck < 0 ||
      maennlich_auswaerts_change * 1 + KuferTools.KursDetails.Mitveranstalter.MaennlichAuswaerts < 0 ||
      weiblich_innsbruck_change * 1 + KuferTools.KursDetails.Mitveranstalter.WeiblichInnsbruck < 0 ||
      weiblich_auswaerts_change * 1 + KuferTools.KursDetails.Mitveranstalter.WeiblichAuswaerts < 0) {
      KuferTools.showMessage({
        'title': 'Negative Gesamtzahl',
        'meldung': 'Bei mindestens einer Teilnehmergruppe sollen mehr Teilnehmer als vorhanden entfernt werden. Bitte korrigieren Sie Ihre eingaben.'
      });
    } else {
      var data = {
        'maennlich_innsbruck_change': maennlich_innsbruck_change,
        'maennlich_auswaerts_change': maennlich_auswaerts_change,
        'weiblich_innsbruck_change': weiblich_innsbruck_change,
        'weiblich_auswaerts_change': weiblich_auswaerts_change
      };
      KuferTools.Utils.AjaxLadebildschirm.Start();
      KuferTools.Utils.Post('index.php?tool_id=' + KuferTools.ToolId + '&knr=' + KuferTools.Knr + '&action=saveTnMitveranstalter&' + KuferTools.KursDetails.Mitveranstalter.Xsrf, data);
    }
  });
}

/**
 * Returns the class name of the current active reiter
 * @returns {String}
 */
KuferTools.getActiveReiterClass = function () {
  var $activeReiter = $('.reiter.active .ajax_reiter');
  var activeReiterClass = '';
  if ($activeReiter.length) {
    var reiterClass = $activeReiter.prop('class').split(' ')[1];
    activeReiterClass = (typeof (reiterClass) !== 'undefined') ? reiterClass : '';
  }
  return activeReiterClass;
}

function beleginfoBearbeiten(bearbeiten) {
  var $reiter = $('.reiter.active .ajax_reiter');
  var reiterClass = $reiter.prop('class').split(' ')[1];
  reiterClass = (typeof (reiterClass) !== 'undefined') ? reiterClass + '_content' : '';
  var href = $reiter.prop('href');
  href += (bearbeiten) ? '&bearbeiten=true' : '';

  KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content').parent());
  if (bearbeiten) {
    var initiateBearbeitenForm = function () {
      KuferTools.InitDatePicker($('.datepicker'))
      KuferTools.InitValidate($('.validate_form'));
    }
  }
  jQuery.post(href, function (data) {
    KuferTools.fadeInReiterContent(data, reiterClass, initiateBearbeitenForm);
    $reiter.data('content', data);
    KuferTools.Utils.AjaxLadebildschirm.Stop();
  });
  return false;
}

function beleginfoSpeichern($saveButton) {
  if (!KuferTools.ValidateFormInput($('.validate_form'))) {
    return false;
  }
  var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
  KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));

  var form = $saveButton.parents().find('form');
  var url = form.prop('action');
  var data = form.serialize()

  jQuery.post(url, data, function (msg) {
    KuferTools.Utils.AjaxLadebildschirm.Stop();
    KuferTools.fadeInReiterContent(msg, activeReiterClass);
    KuferTools.InitValidate($('.validate_form'));
  });
} //end beleginfoSpeichern(..)


/**
 *  Oeffnet den Ajax Dialog zum Bearbeiten eines Kurses
 *  der Dialog enthält ein Formular zum Eingeben der Kursdaten, das mit Hilfe der Sicht kursbearbeiten.sgt aufgebaut wird;
 *  ist relevant in den Kursdetails von Tool Kurse MA (Tool 8)
 */
function handleKursBearbeiten(pLink) {
  // pLink ist hier: 'index.php?tool_id= 8&action=kursBearbeiten &knr=' + KuferTools.Knr;
  //KuferTools.ToolId = 8 und KuferTools.ToolSectionId = 377;
  var weite = 950;

  var buttons = {};
  buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
    //Das via loadAndDisplayPage4Ajax(..) aufgebaute Formular validieren und abschicken; hat die Form
    // <form id="kursBearbeitenForm" name="kursBearbeiten"...>...

    var $form = KuferTools.Inhalt;
    //der actionlink ist schon in der Sicht kursbearbeiten.sgt dabei und sieht so aus:
    // var actionLink =  'index.php?tool_id=' + KuferTools.ToolId + '&action=kursBearbeitenAbsenden&knr=' + KuferTools.Knr +

    //Validiert derzeit nur einige Werte (wie z.B. Datumswerte, Wochentage) auf Korrektheit; prüft bei den anderen
    //Einträgen nur, ob Pflichtfelder nicht leer sind
    if (KuferTools.ValidateFormInput($form)) {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      $form.trigger('submit');
    }
    //Dialog close ist hier nicht nötig, da Seite sowieso neu geladen wird
  };
  buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () { $(this).dialog("close"); };

  //Hier erfolgt das Laden der Seiteninhalts via Ajax und die Ausgabe des Dialogs via showMessage()
  KuferTools.Utils.loadAndDisplayPage4Ajax(pLink, buttons, weite);
} //end handleKursBearbeiten(..)

/**
 * Sendet die ausgewählten Belegungs-Ids und die dazugehörigen Stornogründe per Post ab.
 *
 * @param pBelegungIdsAry Array von Belegungs-Ids
 */
function sendeStornieren(pBelegungIdsAry) {
  var postObj = { "belIdsToStorno": pBelegungIdsAry.join(';') };
  jQuery.each(pBelegungIdsAry, function (key, belid) {
    var grund = $('input#storno_grund_' + belid, '#stornodialog').val();
    if (grund) {
      postObj['storno_grund_' + belid] = grund;
    } else { // Wenn Grund leer oder undefined
      postObj['storno_grund_' + belid] = '';
    }

    var austritt = jQuery('input#austritt_' + belid, '#stornodialog').val();
    if (austritt) {
      postObj['austritt_' + belid] = austritt;
    } else { // Wenn Austritt leer oder undefined
      postObj['austritt_' + belid] = '';
    }

    var stornoStatus = jQuery('select#storno_status_' + belid, '#stornodialog').val();
    if (stornoStatus) {
      postObj['storno_status_' + belid] = stornoStatus;
    } else { // Wenn Storno-Status leer oder undefined
      postObj['storno_status_' + belid] = 'S';
    }
  });
  if (!KuferTools.ValidateFormInput($('.validate_form'))) {
    return false;
  }
  KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
  var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
  jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleAbmedlung&knr=' + KuferTools.Knr, postObj,
    function (msg) {
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      KuferTools.fadeInReiterContent(msg, activeReiterClass);
      KuferTools.InitValidate($('.validate_form'));
    });
  $('#stornodialog').parent('.ui-dialog-content').dialog('close');
}

/**
 * Sendet die Daten aus dem Dialog für die Barzahlung per Post ab
 * Sendet insbesondere die  ausgewählten Belegungs-Ids; ggf. können noch andere Daten hinzukommen (wie z.B. Entgeltdaten)
 *
 * @param pBelegungIdsAry Array von Belegungs-Ids
 */
function sendeBarzahlungDaten(pBelegungIdsAry) {
  var postObj = { "belegIds": pBelegungIdsAry.join(';') };

  //Das PostObjekt ggf. noch erweitern, wenn evtl. noch zusätzliche Werte mitgeschickt werden
  /*****************
  jQuery.each(pBelegungIdsAry, function (key, belid) {
    //ggf. noch für Entgelt Eingaben erweitern, falls nötig
    var entgelt = jQuery('input#entgelt_' + belid, '#barzahlungdialog').val();
    if (entgelt) {
      postObj['entgelt_' + belid] = entgelt;
    } else { // Wenn Entgelt leer oder undefined
      postObj['entgelt_' + belid] = '';
    }
  }); ********************/

  if (!KuferTools.ValidateFormInput($('.validate_form'))) {
    return false;
  }
  KuferTools.Utils.AjaxLadebildschirm.Partial(jQuery('.reiter_content'));
  var activeReiterClass = KuferTools.getActiveReiterClass() + '_content';
  jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleBarzahlung&knr=' + KuferTools.Knr, postObj,
    function (msg) {
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      KuferTools.fadeInReiterContent(msg, activeReiterClass);
      KuferTools.InitValidate($('.validate_form'));
    });
  $('#barzahlungdialog').parent('.ui-dialog-content').dialog('close');
} //Ende sendeBarzahlungDaten(..)



//Funktion zum Upload eines Nachweis bei BLAK und BGLU
KuferTools.uploadNachweisBlakBglu = function () {

  var buttons = {
    "Senden": function () {
      var uploadfileValue = $('#uploadfileBlak').val();
      var nachweisartValue = $('#nachweisart option:selected').val();
      var nachweisartText = $('#nachweisart option:selected').text();
      var fileExtAry = KuferTools.Kontakt.FileExtStr;
      var additionalText = ' <div>Außerdem darf der Dateiname keine Sonderzeichen außer Bindestrich (-) Unterstrich (_) Punkt (.) enthalten.</div>';

      if (checkIfDateiFormatNichtErlaubt() === true && nachweisartValue === '') {
        showMessage('<div>Bitte wählen Sie die Art des nachzuweisenden Dokuments sowie eine Datei mit erlaubten Format aus.</div>' +
          '<div> <br>Folgende Dateiendungen sind erlaubt: ' +
          '<div>' + fileExtAry + '</div><div><br>' + additionalText + '</div>', 'Nachweisart nicht ausgewählt, Dateiendung nicht erlaubt');
      }
      else if (uploadfileValue !== '' && nachweisartValue === '') {
        showMessage('<div>Bitte wählen Sie die Art des nachzuweisenden Dokuments aus.</div>', 'Nachweisart nicht ausgewählt');
      }
      else if (uploadfileValue === '' && nachweisartValue !== '') {
        showMessage('<div>Bitte wählen Sie die Datei aus.</div>', 'Keine Datei ausgewählt');
      }
      else if (uploadfileValue === '' && nachweisartValue === '') {
        showMessage('<div>Bitte wählen Sie die Art des nachzuweisenden Dokuments und die Datei aus.</div>', 'Weder Nachweisart noch Datei ausgewählt');
      }

      else if (checkIfDateiFormatNichtErlaubt() === true) {
        showMessage('<div>Bitte wählen Sie eine Datei mit einem erlaubten Format aus.</div>' + '<div> Folgende Dateiendungen sind erlaubt: ' +
          '<div>' + fileExtAry + '</div><div><br>' + additionalText + '</div>', 'Nicht erlaubtes Dateiformat');
      }
      else {
        KuferTools.Utils.AjaxLadebildschirm.Start();
        var closeFirstDialog = this;

        jQuery.ajax({
          url: 'index.php?tool_id=20&action=uploadBglu&belid=' + KuferTools.BelegId,
          type: 'POST',
          data: getFormData(),
          processData: false,
          contentType: false,
          success: function (data) {
            $(closeFirstDialog).dialog('close');
            var objekt = KuferTools.Utils.getObjectFromJsonBase64(data);
            if (objekt.DMZ === 'sendDone' && objekt.EMail === '1') {
              showMessage('<div class = "nachweisart_blak"><strong>Art des nachzuweisenden Dokuments:</strong> ' + nachweisartText + '</div>' +
                '<div><strong>Datei:</strong> ' + uploadfileValue + '</div>', 'Das Dokument wurde erfolgreich versendet.');
            }
            else if (objekt.DMZ === 'sendDone' && objekt.EMail === '0') {
              showMessage('<div class = "farbe_rot">Die Datei wurde erfolgreich hochgeladen aber es ist beim Informieren des zuständigen Mitarbeiters \n\
                                      ein Fehler aufgetreten. Bitte wenden Sie sich an die Einrichtung.</div>'   , 'Fehler beim Versenden des Dokuments.');
            }
            else {
              showMessage('<div class = "farbe_rot">Beim Versenden des Dokuments ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.</div>', 'Fehler beim Versenden des Dokuments.');
            }
            KuferTools.Utils.AjaxLadebildschirm.Stop();
          }
        });
      }
    },

    "Abbrechen": function () {
      $(this).dialog('close');
    }
  };

  var nachweisartOptions = '<option value="">-------- Bitte wählen --------</option>';
  $.each(KuferTools.NachweisartMap, function (index, value) {
    nachweisartOptions += '<option value="' + index + '">' + value + '</option>';
  });

  var meldung = '<div>\
                        <div class = "nachweisart_blak form-row">\
                            <div class = "col-md-9 col-sm-9 col-xs-12"><label for="nachweisart" class="control-label">Art des nachzuweisenden Dokumments:</label></div>\
                            <div class = "col-md-9 col-sm-9 col-xs-12"><select name="nachweisart" size="1" id = "nachweisart" class="form-control" >\
                            '+ nachweisartOptions + '</select></div>\
                        </div>\n\
                        <div class="clearfix"></div>\
                        <div class = "uploadfileBlak form-row">\
                            <div class = "col-md-9 col-sm-9 col-xs-12"><label for="uploadfileBlak" class="control-label">Datei:</label></div>\
                            <div class = "col-md-9 col-sm-9 col-xs-12"><input type="file" name="uploadfileBlak" id="uploadfileBlak" class="form-control" value=""></div>\
                            <div class = "col-md-9 col-sm-9 col-xs-12"><span></span></div>\
                        </div>';

  showMessage(meldung, 'Nachweis für begleitenden Unterricht nachreichen', buttons);
  checkFileFormat();

  function getFormData() {
    var data = new FormData();
    data.append('nachweisart', $('#nachweisart option:selected').val());
    data.append('uploadfileBlak', files = $('#uploadfileBlak')[0].files[0]);
    return data;
  };

  function checkFileFormat() {
    $('#uploadfileBlak').on('change', function () {
      if (checkIfDateiFormatNichtErlaubt() === true) {
        checkDateiNichtOk();
      }
      else {
        removeAddedHmlBycheckDateiNichtOk();
      }
    });
  }

  function checkDateiNichtOk() {
    var $dateiformat = $('.uploadfileBlak > div > span');
    $dateiformat.html('');
    $dateiformat.addClass('farbe_rot');
    $dateiformat.html('<div class="absatndZuInput">Der Dateiname ist unzulässig: \
                            <span><a href="#" class="allowExt"><strong>siehe erlaubte Kriterien</strong></a></span></div>');
  }

  function removeAddedHmlBycheckDateiNichtOk() {
    $('.uploadfileBlak > div > span').empty();
    $('.uploadfileBlak > div > span').removeClass('farbe_rot');
  }

  function checkIfDateiFormatNichtErlaubt() {

    if (typeof $('#uploadfileBlak')[0].files[0] !== 'undefined') {
      var fileName = $('#uploadfileBlak')[0].files[0].name;

      if (KuferTools.Kontakte.isInvalidFiletype(fileName) === true) {
        return true;
      }
      else {
        return false;
      }
    }
  }
}

