registerNamespace('KuferTools.Anmeldung');
registerNamespace('KuferTools.Nachlass');

jQuery(function () {
  jQuery('a.dropdown-item').on('click', function () {
    const input = jQuery(this).closest('.input-group').find('input.form-control');
    input.val(jQuery(this).text())
  });

  /**
   * Objekt zum Füllen von KuferTools.Anmeldung.AnmeldeForm.
   */
  KuferTools.Anmeldung.AnmFormObj = { 'Normal': 0, 'ElternKind': 1, 'Firma': 2, 'Mehrfach': 4, 'Kind': 6 };
  const isKinderKurs50UndKindAnmAllowed = typeof KuferTools.Kurs !== 'undefined' && KuferTools.Kurs.IsKinderKurs50 && KuferTools.Kurs.IsKindAnmAllowedForUebermittlungsart;

  let detailsObj = {};
  let abwZahlwegObj = {};
  let nachlassObj = {};
  let kinder = [];
  let mitarbeiter = [];
  let weitereTn = [];
  KuferTools.Anmeldung.AnmeldeForm = KuferTools.Anmeldung.AnmFormObj.Normal;
  if (isKinderKurs50UndKindAnmAllowed) {
    KuferTools.Anmeldung.AnmeldeForm = KuferTools.Anmeldung.AnmFormObj.Kind;
  }
  KuferTools.Anmeldung.AnmeldeFormDialog = -1;
  KuferTools.Anmeldung.AnzahlWeitere = 0;

  if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen) != 'undefined' && KuferTools.Anmeldung.AusgewaehlteOptionen != '') {
    if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.Details) == 'object') {
      detailsObj = KuferTools.Anmeldung.AusgewaehlteOptionen.Details;
    }
    if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.AbwZahlweg) == 'object') {
      abwZahlwegObj = KuferTools.Anmeldung.AusgewaehlteOptionen.AbwZahlweg;
    }
    if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.Nachlass) == 'object') {
      nachlassObj = KuferTools.Anmeldung.AusgewaehlteOptionen.Nachlass;
    }
    if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.AnmForm) != 'undefined'
      && isFinite(KuferTools.Anmeldung.AusgewaehlteOptionen.AnmForm)) {
      let weitere = [];
      if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.WeitereAnmeldungen) == 'object') {
        weitere = KuferTools.Anmeldung.AusgewaehlteOptionen.WeitereAnmeldungen;
      }
      KuferTools.Anmeldung.AnmeldeForm = parseInt(KuferTools.Anmeldung.AusgewaehlteOptionen.AnmForm);

      switch (KuferTools.Anmeldung.AnmeldeForm) {
        case KuferTools.Anmeldung.AnmFormObj.ElternKind:
        case KuferTools.Anmeldung.AnmFormObj.Kind:
          kinder = weitere;
          break;
        case KuferTools.Anmeldung.AnmFormObj.Firma:
          mitarbeiter = weitere;
          break;
        case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
          weitereTn = weitere;
          break;
      }
      if (KuferTools.Anmeldung.AnmeldeForm !== KuferTools.Anmeldung.AnmFormObj.Normal) {
        KuferTools.Anmeldung.AnzahlWeitere = weitere.length;
        KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmeldeForm, KuferTools.Anmeldung.AnzahlWeitere);
      }
    }
    if (typeof (KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar) == 'object') {
      jQuery('#maAnmeld_input_bemerkung').val(KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.Bemerkung);
      jQuery('#newsl_erlaubt').prop('checked', KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.Newsl_erlaubt === 'W');
      jQuery('input[name=anm_zahlart][value="' + KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.Zahlart + '"]').prop('checked', true);
      jQuery('#anmeldeArt').val(KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.anmeldeArt);
      jQuery('#belegungsStatus').val(KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.belegungsStatus);
      jQuery('#maAnmeld_input_eintritt').val(KuferTools.Anmeldung.AusgewaehlteOptionen.InputsSettingsBar.eintritt);
    }
  }

  // Die Init-Funktionen für Details- AbwZahlweg- Kinder-, Firmen-, und Mehrfach-Dialog
  // geben je eine Funktion zurück, mit der die aktuelle Data ausgelesen werden kann.
  const getDetailsObj4Json = initDetailsDialog(detailsObj);
  const getAbwZahlwegObj4Json = initAbwZahlwegDialog(abwZahlwegObj);

  const okHandler4Anmeld = function () {
    KuferTools.Anmeldung.okHandler(jQuery(this));
  };
  const abbruchHandler4Anmeld = function () {
    KuferTools.Anmeldung.abbruchHandler(jQuery(this));
  };
  // verwendet Methode zum Initialisieren des Nachlassdialogs in nachlass.js
  const getNachlassObj4Json = KuferTools.Nachlass.initNachlassDialog(nachlassObj, okHandler4Anmeld, abbruchHandler4Anmeld);
  const getChildrenObj4Json = initKinderDialog(kinder);
  const getFirmaObj4Json = initFirmaDialog(mitarbeiter);
  const getMehrfachObj4Json = initMehrfachDialog(weitereTn);

  initAnmArtDialog();
  initKursUebersichtDialog();
  initTnUebersichtDialog();
  initEinzelveranstaltungDialog();

  /**
   * Gibt die gewählten Einstellungen in einem einzelnen Objekt zurück.
   *
   * Das Obj wird z. B. verwendet, um die Einstellungen in der Session zwischenzuspeichern,
   * um später wieder geladen zu werden, sowei bei der Durchführung der Anmeldung.
   * @returns obj
   */
  function createChoosedOptionsObj() {
    let weitere = [];
    // Je nach Anmeldeart werden die weiteren Anmeldungen besetzt.
    switch (KuferTools.Anmeldung.AnmeldeForm) {
      default:
      case KuferTools.Anmeldung.AnmFormObj.Normal:
        // Anmeldeform Normal: keine weiteren Personen
        break;
      case KuferTools.Anmeldung.AnmFormObj.ElternKind:
      case KuferTools.Anmeldung.AnmFormObj.Kind:
        weitere = getChildrenObj4Json();
        break;
      case KuferTools.Anmeldung.AnmFormObj.Firma:
        weitere = getFirmaObj4Json();
        break;
      case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
        weitere = getMehrfachObj4Json();
        break;
    }
    const inputsSettingsBar = {
      Bemerkung: jQuery('#maAnmeld_input_bemerkung').val(),
      // Statt true/false nun 'W'/'', da beim Zwischenspeichern und Laden false zu "false" wurde.
      Newsl_erlaubt: (jQuery('#newsl_erlaubt').is(':checked') ? 'W' : ''),
      Zahlart: jQuery('input[name=anm_zahlart]:checked').val(),
      anmeldeArt: jQuery('#anmeldeArt').val(),
      belegungsStatus: KuferTools.Anmeldung.getBelegungsStatus(),
      eintritt: jQuery('#maAnmeld_input_eintritt').val()
    };

    return {
      ausgewaehlteOptionen: {
        Details: getDetailsObj4Json(),             // Details-Dialog
        AbwZahlweg: getAbwZahlwegObj4Json(),       // Abweichender Zahlweg-Dialog
        Nachlass: getNachlassObj4Json(),           // Nachlass-Dialog
        AnmForm: KuferTools.Anmeldung.AnmeldeForm, // Anmeldeform (Eltern-Kind, ...)
        WeitereAnmeldungen: weitere,               // Weitere Anmeldungen
        InputsSettingsBar: inputsSettingsBar       // Weitere Einstellungen auf der Seite
      }
    };
  }

  if (jQuery('#maAnmeld_input_gebuehr').length > 0) {
    KuferTools.Anmeldung.updateAktGebuehr(false, nachlassObj);
  }

  /**
   * Der Anmeldebutton. Offnet einen Dialog, wo noch einmal die getroffenen Einstellungen
   * angezeigt werden, und die Anmeldung abgesendet werden kann.
   */
  jQuery(document).on('click', '#maAnmeld_anmelden', function () {
    const buttons = {};
    buttons['Anmelden'] = function () {
      const anmSettingsObj = createChoosedOptionsObj();
      const $form = jQuery('form');
      $form.append(KuferTools.Anmeldung.getJsonHiddenInput(anmSettingsObj, 'anmSettings'));
      KuferTools.Utils.AjaxLadebildschirm.Start();
      $form.trigger('submit');
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };

    let anmForm = '';
    let weitereTnBezeichnung = '';

    switch (KuferTools.Anmeldung.AnmeldeForm) {
      case KuferTools.Anmeldung.AnmFormObj.Normal:
        anmForm = 'normal';
        break;
      case KuferTools.Anmeldung.AnmFormObj.ElternKind:
        anmForm = 'Eltern-Kind-Anmeldung';
        weitereTnBezeichnung = 'Kinder';
        break;
      case KuferTools.Anmeldung.AnmFormObj.Kind:
        anmForm = 'Kind-Anmeldung (ohne Elternteil!)';
        weitereTnBezeichnung = 'Kinder';
        break;
      case KuferTools.Anmeldung.AnmFormObj.Firma:
        anmForm = 'Firmenanmeldung';
        weitereTnBezeichnung = 'Mitarbeiter';
        break;
      case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
        anmForm = 'Mehrfachanmeldung';
        weitereTnBezeichnung = 'weitere Teilnehmer';
        break;
    }
    // KuferTools.Teilnehmer und KuferTools.Kurs sind bereits HtmlEncoded
    let anmeldeText = "<div id=''><h1>Hiermit melden Sie den Teilnehmer " + KuferTools.Teilnehmer.Name + " verbindlich an:</h1></div>";
    anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
      "<span><label for='kalwochnr' class=''>Teilnehmer:</label></span>" +
      "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
      "<span>" + KuferTools.Teilnehmer.Name + ' ' + KuferTools.Teilnehmer.Vorname + "</span></div><div class='clearfix'></div>";

    anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
      "<span><label for='kalwochnr' class=''>Nr.:</label></span>" +
      "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
      "<span>" + KuferTools.Kurs.NrAnzeige + "</span></div><div class='clearfix'></div>";

    anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
      "<span><label for='kalwochnr' class=''>Titel:</label></span>" +
      "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
      "<span>" + KuferTools.Kurs.Titel + "</span></div><div class='clearfix'></div>";

    anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
      "<span><label for='kalwochnr' class=''>Anmeldeform:</label></span>" +
      "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
      "<span>" + anmForm + "</span></div><div class='clearfix'></div>";

    if (weitereTnBezeichnung !== '') {
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>" + weitereTnBezeichnung + ":</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>" + KuferTools.Anmeldung.AnzahlWeitere + "</span></div><div class='clearfix'></div>";
    }

    const belegungsStatus = KuferTools.Anmeldung.getBelegungsStatus();
    let neueGebuehrText = "";
    let gebuehr = "";
    if (belegungsStatus === 'W' || belegungsStatus === 'P' || belegungsStatus === 'I') {
      gebuehr = "0,00";
    } else {
      if (KuferTools.Anmeldung.AktGebuehr !== KuferTools.Anmeldung.BasisGebuehr) {
        neueGebuehrText = KuferTools.Anmeldung.AktGebuehr + ' &euro; anstatt ';
      }
      gebuehr = KuferTools.Anmeldung.BasisGebuehr;
    }
    const abwKontoObj = getAbwZahlwegObj4Json();
    let abwBankdaten = '';
    if ((typeof (abwKontoObj.abw_konto) !== 'undefined' && abwKontoObj.abw_konto !== '') ||
      (typeof (abwKontoObj.abw_iban) !== 'undefined' && abwKontoObj.abw_iban !== '')) {
      abwBankdaten += " (abweichende Bankdaten)";
    }
    // Gebühr ausblenden, falls es im Formular aus der Sicht genommen wurde
    if (jQuery('#maAnmeld_input_gebuehr').length > 0) {
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>Geb&uuml;hr:</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>" + neueGebuehrText + gebuehr + abwBankdaten + "</span></div><div class='clearfix'></div>";
    }

    if (jQuery('input[name=anm_zahlart]').length > 0) {
      const zahlart = jQuery('input[name=anm_zahlart]:checked').val();
      let zahlartText = '';
      switch (zahlart) {
        default:
        case 'L':
          zahlartText = 'Lastschrift';
          break;
        case 'Ü':
          zahlartText = '&Uuml;berweisung';
          break;
      }
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>Zahlart:</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>" + zahlartText + "</span></div><div class='clearfix'></div>";
    }
    if (jQuery('#anmeldeArt').length > 0) {
      const anmeldeArt = jQuery('#anmeldeArt').val();
      if (trim(anmeldeArt) !== '') {
        anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
          "<span><label for='kalwochnr' class=''>Anmeldeart:</label></span>" +
          "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
          "<span>" + KuferTools.Utils.htmlEncode(anmeldeArt) + "</span></div><div class='clearfix'></div>";
      }
    }
    anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
      "<span><label for='kalwochnr' class=''>Status:</label></span>" +
      "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
      "<span>" + KuferTools.Utils.htmlEncode(belegungsStatus) + "</span></div><div class='clearfix'></div>";

    const newsletter = jQuery('#newsl_erlaubt').is(':checked');
    if (newsletter) {
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>Newsletter:</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>Ja</span></div><div class='clearfix'></div>";
    }

    const eintritt = jQuery('#maAnmeld_input_eintritt').val();
    if (typeof (eintritt) !== 'undefined' && trim(eintritt) !== '') {
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>Eintritt:</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>" + KuferTools.Utils.htmlEncode(eintritt) + "</span></div><div class='clearfix'></div>";
    }

    const bemerkung = jQuery('#maAnmeld_input_bemerkung').val();
    if (typeof (bemerkung) !== 'undefined' && trim(bemerkung) !== '') {
      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>" +
        "<span><label for='kalwochnr' class=''>Bemerkung:</label></span>" +
        "</div><div class='col-md-9 col-sm-9 col-xs-12'>" +
        "<span>" + KuferTools.Utils.htmlEncode(bemerkung) + "</span></div><div class='clearfix'></div>";
    }

    // Array von zusätzlichen Hinweisen, welche der Mitarbeiter bei der Anmeldung berücksichtigen sollte
    let hinweise = [];

    // Anmeldeende erreicht
    if (KuferTools.Kurs.AnmeldeendeErreicht) {
      hinweise[hinweise.length] = 'Das Anmeldeende wurde erreicht';
    }
    // Kurs hat bereits begonnen
    if (KuferTools.Kurs.KursbeginnErreicht) {
      hinweise[hinweise.length] = 'Der Kurs hat bereits begonnen';
    }

    if (KuferTools.Anmeldung.getAnzAnmPersonen() > KuferTools.Kurs.Teil_frei) {
      if (belegungsStatus === 'A' && KuferTools.Anmeldung.UeberbuchenErlaubt) {
        hinweise[hinweise.length] = 'Es werden mehr Teilnehmer als freie Plätze angemeldet';
      } else if (belegungsStatus === 'P' && KuferTools.Anmeldung.UeberbuchenErlaubt) {
        hinweise[hinweise.length] = 'Es werden mehr Plätze für Teilnehmer reserviert als freie vorhanden sind';
      } else if (belegungsStatus === 'I') {
        hinweise[hinweise.length] = 'Es werden alle Teilnehmer als Interessent/en eingetragen.';
      } else { //Status W
        hinweise[hinweise.length] = 'Es werden alle Teilnehmer auf Warteliste gebucht';
      }
    }
    // Mehr als Kinder_Max
    if ((KuferTools.Anmeldung.AnmeldeForm === KuferTools.Anmeldung.AnmFormObj.ElternKind
      || KuferTools.Anmeldung.AnmeldeForm === KuferTools.Anmeldung.AnmFormObj.Kind)
      && KuferTools.Anmeldung.AnzahlWeitere > KuferTools.Kurs.Kinder_frei) {
      if (belegungsStatus === 'P') {
        hinweise[hinweise.length] = 'Es werden mehr Kinderplätze reserviert als freie vorhanden sind';
      } else {
        hinweise[hinweise.length] = 'Es werden mehr Kinder als freie Kinderplätze angemeldet';
      }
    }

    if (!KuferTools.Anmeldung.NachlassAufteilbar) {
      hinweise[hinweise.length] = 'Aufteilung des Nachlasses in Einzelpreise nicht möglich! Passen Sie ggf. den Betrag des Nachlasses an.';
    }

    const countHinweise = hinweise.length;
    for (let i = 0; i < countHinweise; i++) {

      let hinweisTxt = '', hinweisTxtClass = '';
      if (i === 0) {
        hinweisTxtClass = 'maAnmeld_hinweise';
        hinweisTxt = 'Hinweise:';
      }

      anmeldeText += "  <div class='col-md-3 col-sm-3 col-xs-12'>";
      if (i === 0) {
        anmeldeText += "<span><label for='kalwochnr' class=' " + hinweisTxtClass + "'>" + hinweisTxt + "</label></span>";
      }
      anmeldeText += "</div><div class='col-md-9 col-sm-9 col-xs-12' style='margin-bottom: 5px;'>" +
        "<span>" + hinweise[i] + "</span></div><div class='clearfix'></div>";
    }

    showMessage(anmeldeText, 'Teilnehmer Anmelden', buttons);
  });

  /**
   * Seitenwechsel zu Kurs- oder Teilnehmerdetails
   *
   * Sendet vor dem Seitenwechsel ein AJAX-Request mit den getroffenen Einstellungen ab,
   * welches in die Session zwischengespeichert wird.
   */
  jQuery('.tn_details_button, .kurs_details_button').on('click', function (event) {
    // Im Readonly-Modus werden keine Daten abgesendet.
    if (KuferTools.Anmeldung.ReadOnly) {
      return true;
    }

    const obj4Ajax = createChoosedOptionsObj();
    const linkZiel = jQuery(this).prop('href');
    KuferTools.Utils.AjaxLadebildschirm.Start();

    jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleSaveSettingsAjax&savesettings=1', obj4Ajax, function () {
      document.location.href = linkZiel;
    });

    return false;
  });

  jQuery('#belegungsStatus').on('change', function (event) {
    const $belegungStatusSelected = jQuery('#belegungsStatus option:selected');
    const $inputGebuehr = jQuery('#maAnmeld_input_gebuehr');
    if ($belegungStatusSelected.val() === 'W' || $belegungStatusSelected.val() === 'P' || $belegungStatusSelected.val() === 'I') {
      $inputGebuehr.val('0,00');
    } else {
      $inputGebuehr.val(KuferTools.Anmeldung.AktGebuehr);
    }
  });

  jQuery(document).on('click', '.bestaetigungsemailDialog', function () {
    const buttons = {
      'Ausdrucken': function () {
        PrintPartOfPage('printable');
        jQuery(this).dialog('close');
      },
      'Abbrechen': function () {
        jQuery(this).dialog('close');
      }
    };
    const url = 'index.php?tool_id=' + KuferTools.ToolId + '&action=anmeldebestaetigungDialog';
    jQuery.ajax({
      type: "POST",
      url: url,
      success: function (pData) {
        const emailBestaetigung = '<div id="printable">' + KuferTools.Utils.getObjectFromJson(pData) + '</div>';
        KuferTools.showMessage({
          meldung: emailBestaetigung,
          title: 'Anmeldebestätigung',
          buttons: buttons,
          width: '800'
        });
      },
      error: function () {
      }
    });
  });

  jQuery(document).on('click', '.bestaetigungEmailSenden', function () {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      jQuery(this).dialog('close');
    };
    const url = 'index.php?tool_id=' + KuferTools.ToolId + '&action=sendAnmeldebestaetigung';
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.ajax({
      type: "POST",
      url: url,
      success: function (pData) {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
        const sendInfoMail = KuferTools.Utils.getObjectFromJson(pData);
        let message = '';
        let title = 'Versand fehlgeschlagen';
        if (!sendInfoMail.valid) {
          message += 'Die E-Mail-Adresse des Teilnehmers ist ungültig.';
        } else if (!sendInfoMail.sent) {
          message += 'Die Anmeldebestätigung konnte nicht versendet werden.';
        } else {
          message += 'Die Anmeldebestätigung wurde erfolgreich versendet.';
          title = 'Versand erfolgreich';
        }

        KuferTools.showMessage({meldung: message, title: title, buttons: buttons});
      },
      error: function () {
      }
    });
  });

  if (!KuferTools.Anmeldung.ReadOnly) {
    if (KuferTools.Anmeldung.AnmeldeForm === KuferTools.Anmeldung.AnmFormObj.Kind
        || !KuferTools.Anmeldung.Allowed.includes(KuferTools.Anmeldung.AnmeldeForm)) {
      jQuery('#maAnmeld_anmelden').prop('disabled', true);
      jQuery('.maAnmeld_anmArt').click();
    } else {
      jQuery('#maAnmeld_anmelden').prop('disabled', false);
    }
  }

  if (KuferTools.Anmeldung.AnmeldeForm === KuferTools.Anmeldung.AnmFormObj.Kind) {
    jQuery('.maAnmeld_abwZahlweg').prop('disabled', true);
  } else {
    jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
  }
});

/**
 * Eventhandler für die Teilnehmerauswahl per Dialog.
 *
 * Das Dialogdiv wird nicht direkt zum Dialog gemacht, sondern aus den Dom gehängt, und
 * später per ShowMessage angezeigt. Hintergund: das Datatable versucht sonst sofort per
 * Ajax die Teilnehmer anzufordern.
 */
function initTnUebersichtDialog() {
  const $dialog = jQuery('.tn_uebersicht_dialog');
  $dialog.detach();

  const hrefTnUebersichtDialog = 'index.php?tool_id=' + KuferTools.ToolId + '&action=teilnehmerauswahl';
  const tnUebersichtDialogForm = jQuery.ajax({
    url: hrefTnUebersichtDialog,
    method: 'GET',
    dataType: 'html'
  }).fail(function () {
    if (!KuferTools.IsUnloading) {
      KuferTools.Utils.showAjaxErrorDialog(undefined, hrefTnUebersichtDialog);
    }
  });

  const buttons = {};
  if (KuferTools.Anmeldung.TnAnlegenAllowed) {
    buttons["Neuen Teilnehmer anlegen"] = getTeilnehmerAnlegenCallBackFunction();
  }
  buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
    jQuery(this).dialog("close");
  };

  const $maAnmeldTnAuswahl = jQuery('.maAnmeld_tnAuswahl');
  $maAnmeldTnAuswahl.on('click', function () {
    KuferTools.Utils.AjaxLadebildschirm.Start();
    tnUebersichtDialogForm.done(function (data) {
      KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Teilnehmerauswahl', buttons, 'auto', undefined,
        '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px',
        'index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&dataTable=1');
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });
  $maAnmeldTnAuswahl.prop('disabled', false);

  jQuery(document).on('click', '.abw_tn_auswahl', function () {
    if (KuferTools.Anmeldung.TnAnlegenAllowed) {
      buttons["Neuen Teilnehmer anlegen"] = getTeilnehmerAnlegenCallBackFunction(true);
    }

    KuferTools.Utils.AjaxLadebildschirm.Start();
    tnUebersichtDialogForm.done(function (data) {
      KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Teilnehmerauswahl', buttons, 'auto', undefined,
        '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px',
        'index.php?tool_id=' + KuferTools.ToolId +
        '&action=handleTnDataTable&dataTable=1&tnAuswahlForAbwZahlweg=1');
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });

  /**
   * Gibt die Callback-Funktion für den "Neuen Teilnehmer anlegen"-Button im Teilnehmerauswahl-Dialog zurück.
   *
   * return function
   */
  function getTeilnehmerAnlegenCallBackFunction(pkeepCurrentTnr) {
    return function () {
      const buttons = {};
      buttons['Teilnehmer anlegen'] = getTeilnehmerDatenSendenCallBack(pkeepCurrentTnr);
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
        // Das ist ja kacke, wenn das hier so spezifisch angegeben werden muss. Ist bereits in personendetails.js genau so.
        KuferTools.removeHinterlegungen();
      };

      let newTnToolId = 6;
      if (KuferTools.ToolId === 53) {
        newTnToolId = 53;
      }

      KuferTools.Utils.AjaxLadebildschirm.Start();
      let href = 'index.php?tool_id=' + newTnToolId + '&action=newTeilnehmer';
      const appendIfNotEmpty = function ($field, queryKey) {
        if ($field.length === 1 && $field.val() !== '') {
          href += '&' + queryKey + '=' + encodeURIComponent($field.val());
        }
      };

      appendIfNotEmpty(jQuery(this).find('#tn_search_name'), 'nachname');
      appendIfNotEmpty(jQuery(this).find('#tn_search_vorname'), 'vorname');

      jQuery.ajax(href)
        .done(function (data) {
          KuferTools.showMessage({
            meldung: data,
            title: 'Details zum neuen Teilnehmer',
            buttons: buttons,
            width: '800',
            pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
          });

          jQuery('#histKritDialog').on('click', 'a.dropdown-item', function () {
            const input = jQuery(this).closest('.input-group').find('input.form-control');
            input.val(jQuery(this).text());
          });
        }).fail(function () {
        KuferTools.showMessage({meldung: KuferTools.Utils.htmlEncode('Ein technischer Fehler ist aufgetreten.')});
      }).always(function () {
        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
    };
  }

  /**
   * Gibt die Callback-Function für den "Teilnehmer anlegen"-Button für das Formular
   * mit den Eingabefeldern des neuen Teilnehmers zurück.
   *
   * @returns function
   */
  function getTeilnehmerDatenSendenCallBack(pkeepCurrentTnr) {
    return function () {
      let $form = jQuery(this);
      if ($form.is(':not(form)')) {
        $form = $form.find('form');
      }

      const validSuccess = function (pkeepCurrentTnr) {
        pkeepCurrentTnr = pkeepCurrentTnr || false;
        if (pkeepCurrentTnr) {
          $form.append('<input type="hidden" name="keepCurrentTnr" value="1">');
        }
        $form.append('<input type="hidden" name="action" value="newTeilnehmer">');
        // Nicht einfach nur SelfLink, da bestimmte Get-Parameter sonst was durcheinander bringen können.
        $form.prop('action', 'index.php?tool_id=' + KuferTools.ToolId + '&action=anmeldeformular&xsrf=' + KuferTools.TabPageXsrf);
        $form.trigger('submit');
      };

      const validError = function () {
        showMessage('Bitte geben Sie gültige Werte in die als Pflichtfelder gekennzeichneten Eingabefelder ein.', 'Validierung fehlgeschlagen');
      };

      validateNewTeilnehmerForm($form, validSuccess, validError, pkeepCurrentTnr);
    };
  }

  /**
   * Handelt die Validierung des Formulars zur Eingabe eines neuen Teilnehmers.
   *
   * @param Selector $pForm abzusendenden Formular
   * @param function pSuccessFunc wird aufgerufen, wenn die Validierung erfolgreich war
   * @param function pErrorFunc wird aufgerifen, wenn die Validierung fehl schlug.
   */
  function validateNewTeilnehmerForm($pForm, pSuccessFunc, pErrorFunc, pkeepCurrentTnr) {
    // Zunächst Validation per JS
    const formValid = validateForm($pForm.find('input, select, textarea'));

    if (!formValid) {
      pErrorFunc();
    } else {
      // Validation der Bankfelder per AJAX
      const $bankDaten = $pForm.find('input').filter('input[name$=_blz], input[name$=_konto], input[name$=_bic], input[name$=_iban]');

      const successFunc = function (bankdatenAry) {
        const bankdatenAryLength = bankdatenAry.length;
        for (let i = 0; i < bankdatenAryLength; i++) {
          const bezeichnung = bankdatenAry[i];
          $bankDaten.filter('input[name$=_' + bezeichnung + ']').removeClass('form_error');
        }
        pSuccessFunc(pkeepCurrentTnr);
      };

      const errorFunc = function (fehlerhafteBankdatenAry) {

        KuferTools.Utils.AjaxLadebildschirm.Stop();

        const fehlerhafteBankdatenAryLength = fehlerhafteBankdatenAry.length;
        for (let i = 0; i < fehlerhafteBankdatenAryLength; i++) {
          const bezeichnung = fehlerhafteBankdatenAry[i];
          $bankDaten.filter('input[name$=_' + bezeichnung + ']').addClass('form_error');
        }
        pErrorFunc();
      };

      KuferTools.Utils.AjaxLadebildschirm.Start();

      let newTnToolId = 11;
      if (KuferTools.ToolId === 53) {
        newTnToolId = 53;
      }

      validateBankDatenPerAjax($bankDaten, successFunc, errorFunc, 'index.php?tool_id=' + newTnToolId + '&action=validate');
    }
  } //end validateNewTeilnehmerForm

  jQuery(document).on('click', '.tn_uebersicht_dialog .dataTableSearchAdvancedButton', function () {
    showFilterDialog(jQuery('.tn_uebersicht_dialog .tn_search'), jQuery('.dataTable_tnUebersicht'), 'index.php?tool_id=' + KuferTools.ToolId + '&action=tnUebersichtDialogFilter');
  });
} // initTnUebersichtDialog

/**
 * Eventhandler für die Kursauswahl per Dialog.
 *
 * Das Dialogdiv wird nicht direkt zum Dialog gemacht, sondern aus den Dom gehängt, und
 * später per ShowMessage angezeigt. Hintergund: das Datatable versucht sonst sofort per
 * Ajax die Kurse anzufordern.
 */
function initKursUebersichtDialog() {
  const buttons = {};
  buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
    jQuery(this).dialog("close");
  };

  const hrefKursauswahlDialog = 'index.php?tool_id=' + KuferTools.ToolId + '&action=kursauswahl';
  const kursauswahlDialogForm = jQuery.ajax({
    url: hrefKursauswahlDialog,
    method: 'GET',
    dataType: 'html'
  }).fail(function () {
    if (!KuferTools.IsUnloading) {
      KuferTools.Utils.showAjaxErrorDialog(undefined, hrefKursauswahlDialog);
    }
  });

  jQuery('.maAnmeld_kursAuswahl').on('click', function () {
    KuferTools.Utils.AjaxLadebildschirm.Start();
    kursauswahlDialogForm.done(function (data) {
      KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Kursauswahl', buttons, 'auto', undefined,
        '.dataTable_kursUebersicht', KuferTools.KurseProSeite, '300px',
        'index.php?tool_id=' + KuferTools.ToolId + '&action=handleKursDataTable&dataTable=1');
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });
  jQuery('.maAnmeld_kursAuswahl').prop('disabled', false);

  jQuery(document).on('click', '.kurs_uebersicht_dialog .dataTableSearchAdvancedButton', function () {
    showFilterDialog(jQuery('.kurs_uebersicht_dialog .kurs_search'), jQuery('.dataTable_kursUebersicht'), 'index.php?tool_id=' + KuferTools.ToolId + '&action=kursauswahlFilter');
  });
} // initKursUebersichtDialog

function setHiddenSearchDataTable($suchForm, ary) {
  // Alte Hidden-Inputs entfernen
  $suchForm.find('.dataTableSearch.dataTableSearchHidden').detach();
  // Sichtbare Filter-Felder separat setzen und kein Hidden-Input erstellen
  ary = ary.filter(function (obj) {
    const $visibleField = jQuery('input.dataTableSearch[name="' + obj.name + '"], select.dataTableSearch[name="' + obj.name + '"]');
    if ($visibleField.length === 1) {
      $visibleField.val(obj.value).trigger('change');
      return false;
    }

    return true;
  });
  // Hidden-Inputs für alle nicht sichtbaren Feldereinstellungen setzen
  $suchForm.append(ary.map(function (obj) {
    return '<input name="' + obj.name + '" class="dataTableSearch dataTableSearchHidden" value="' + KuferTools.Utils.htmlEncode(obj.value) + '" hidden>';
  }).join(''));
}

function showFilterDialog($suchForm, $dataTable, hrefFilter) {
  KuferTools.Utils.AjaxLadebildschirm.Start();
  const buttons = {
    'Filter setzen': function () {
      setHiddenSearchDataTable($suchForm, jQuery(this).find('#suchformDiv').serializeArray());
      jQuery(this).dialog('close');
      jQuery('.dataTableSearchButton').trigger('click');
    },
    'Filter leeren': function () {
      jQuery(this).dialog('close');

      jQuery('.dataTableSearch').val('');
      setHiddenSearchDataTable($suchForm, [{name: 'clearFilter', value: '1'}]);
      jQuery('.dataTableSearchButton').trigger('click');
    },
    'Schließen': function () {
      jQuery(this).dialog('close');
    }
  };
  jQuery.ajax({
    url: hrefFilter,
    method: 'GET',
    dataType: 'html'
  }).fail(function () {
    if (!KuferTools.IsUnloading) {
      KuferTools.Utils.showAjaxErrorDialog(undefined, hrefFilter);
    }
  }).done(function (data) {
    KuferTools.showMessage({
      meldung: data,
      title: 'Filter',
      buttons: buttons
    });
    KuferTools.Utils.AjaxLadebildschirm.Stop();
  });
}

let warnungEinzelveranstaltungAlreadyShown = false;

function initEinzelveranstaltungDialog() {
  jQuery('.maAnmeld_einzelveranstaltung').on('click', function () {
    if (KuferTools.Kurs.NormaleAnmeldungenVorhanden && !warnungEinzelveranstaltungAlreadyShown) {
      warnungEinzelveranstaltungAlreadyShown = true;
      const msg = 'In diesem Kurs sind bereits normale Anmeldungen vorhanden! Verbuchung abbrechen?';
      const buttons = {};
      buttons['Ja'] = function () {
        jQuery(this).dialog('close');
      };
      buttons['Nein'] = function () {
        showEinzelveranstaltungDialog();
        jQuery(this).dialog('close');
      };
      KuferTools.showMessage({meldung: msg, title: 'Warnung', buttons: buttons, width: '450px'});
    } else {
      showEinzelveranstaltungDialog();
    }
  });
  jQuery('.maAnmeld_einzelveranstaltung').prop('disabled', false);

  jQuery(document).on('input', '#kurs_teinzel_m, #kurs_teinzel_w, #kurs_teinzel_u', function () {
    if (jQuery('#kurs_teinzel').length > 0) {
      let anzahlTn = 0;
      jQuery('#kurs_teinzel_m, #kurs_teinzel_w, #kurs_teinzel_u').each(function () {
        let value = parseInt(jQuery(this).val());
        if (isNaN(value)) {
          value = 0;
        }
        anzahlTn += value;
      });

      jQuery('#kurs_teinzel').val(anzahlTn);
    }
  });

  jQuery(document).on('input', '#kurs_keinzel_m, #kurs_keinzel_w, #kurs_keinzel_u', function () {
    if (jQuery('#kurs_kinder_ev').length > 0) {
      let anzahlKinder = 0;
      jQuery('#kurs_keinzel_m, #kurs_keinzel_w, #kurs_keinzel_u').each(function () {
        let value = parseInt(jQuery(this).val());
        if (isNaN(value)) {
          value = 0;
        }
        anzahlKinder += value;
      });

      jQuery('#kurs_kinder_ev').val(anzahlKinder);
    }
  });

  jQuery(document).on('change', '#kurs_zahlart', function () {
    const value = jQuery(this).val();
    const $belegNrVerbuchung = jQuery('#kurs_belegnr_verbuchung');
    if ($belegNrVerbuchung.length > 0) {
      if (value === 'B') {
        $belegNrVerbuchung.val('b');
      } else if (value === 'U') {
        $belegNrVerbuchung.val('k');
      }
    }
  });
}

function showEinzelveranstaltungDialog() {
  KuferTools.Utils.AjaxLadebildschirm.Start();
  jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=showEinzelveranstaltungDialog&knr=' + KuferTools.Kurs.Nr, function (data) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
      if (KuferTools.ValidateFormInput(jQuery('#einzelveranstaltungForm'))) {
        const $zahlartPflicht = jQuery('.zahlart_pflicht');
        if (jQuery('#kurs_zuseinn').length > 0) {
          const $zusatzEinnahme = jQuery('#kurs_zuseinn');
          const zusatzEinnahmeBetrag = parseFloat($zusatzEinnahme.val().replace(',', '.'));

          //ist Zahlart ein Pflichtfeld und ein Betrag bei zusätzl. Einnahmen angegeben? => Meldung ausgeben
          if ($zahlartPflicht.length > 0 && jQuery.trim($zahlartPflicht.val()) === ''
            && jQuery.trim($zusatzEinnahme.val()) !== '' && zusatzEinnahmeBetrag !== 0) {
            if (!$zahlartPflicht.hasClass('form_error')) {
              $zahlartPflicht.addClass('form_error');
            }
            KuferTools.showMessage({meldung: 'Die Zahlart ist noch offen!', title: 'Information'});
            return;
          } else {
            $zahlartPflicht.removeClass('form_error');
          }

          if (zusatzEinnahmeBetrag < 0) {
            const meldung = '<span><b>Es wurde ein negativer Betrag eingegeben. Wie soll er verbucht werden?</b></span><br /><br />' +
              '<label><input type="radio" name="verbuchung_art" value="ausgabe" checked="checked" /> als Ausgabe</label><br />' +
              '<label><input type="radio" name="verbuchung_art" value="einnahme" /> als Korrektur einer Einnahme</label><br />' +
              '<label><input type="radio" name="verbuchung_art" value="abbrechen" /> Abbrechen</label>';
            const buttons = {};
            buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
              if (jQuery('input[name="verbuchung_art"]').length > 0) {
                const verbuchungArt = jQuery('input[name="verbuchung_art"]:checked').val();
                const hiddenInput = '<input type="hidden" name="verbuchung_art" value="' + verbuchungArt + '" />';
                jQuery('#einzelveranstaltungForm').append(hiddenInput);
              }
              jQuery('#einzelveranstaltungForm').trigger('submit');
              jQuery(this).dialog('close');
            };
            buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
              jQuery(this).dialog("close");
            };
            KuferTools.showMessage({meldung: meldung, title: 'Hinweis', buttons: buttons});
            return;
          }
        }
        jQuery('#einzelveranstaltungForm').trigger('submit');
        jQuery(this).dialog('close');
      }
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog("close");
    };

    KuferTools.showMessage({
      meldung: data,
      title: 'Einzelveranstaltung',
      buttons: buttons,
      width: '800px',
      pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.Ok]
    });
    KuferTools.InitValidate(jQuery('#einzelveranstaltungForm'));
    KuferTools.Utils.AjaxLadebildschirm.Stop();
  });
}

/**
 * Initialisiert den Dialog für den Details-Button mit den frei wählbaren Eingabefeldern
 */
function initDetailsDialog(pKursauswahl) {
  let _kursauswahl = {};
  if (typeof (pKursauswahl) == 'object') {
    _kursauswahl = pKursauswahl;
  }

  jQuery("#maAnmeld_histKrit").on('click', function () {
    const openFunc = function () {
      setInputsByObj();
    };
    const buttons = {};

    if (KuferTools.Anmeldung.ReadOnly) {
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    } else {
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        jQuery(this).find('input').each(function () {
          if (!validateInput(jQuery(this))) {
            jQuery(this).addClass('form_error');
          }
        });
        if (jQuery(this).find('input').hasClass('form_error')) {
          showMessage('Bitte überprüfen Sie die markierten Felder, ob sie im korreten Format gefüllt sind.', 'Fehlerhafte Eingaben');
        } else {
          setObjByInputs();
          jQuery(this).dialog('close');
        }
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    }
    // ein jQuery-Dialog öffnen
    // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=histKritDialog', function (data) {
      KuferTools.showMessage({
        meldung: data,
        title: 'Details für die Anmeldung zum Kurs',
        buttons: buttons,
        width: '800',
        height: 'auto',
        pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
      }, openFunc);
      KuferTools.Utils.AjaxLadebildschirm.Stop();

      jQuery('#histKritDialog').on('click', 'a.dropdown-item', function () {
        const $input = jQuery(this).closest('.input-group').find('input.form-control');
        $input.val(jQuery(this).text())
      });
    });
  });
  jQuery("#maAnmeld_histKrit").prop('disabled', false);

  if (KuferTools.Anmeldung.ReadOnly) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };
    jQuery('#histKritDialog').dialog("option", "buttons", buttons);
  }

  function setInputsByObj() {
    jQuery('#histKritDialog input, #histKritDialog select').each(function () {
      if (jQuery(this).is(':checkbox')) {
        jQuery(this).prop('checked', _kursauswahl[jQuery(this).prop('id')] == 'W');
      } else {
        jQuery(this).val(_kursauswahl[jQuery(this).prop('id')]);
      }
    });
  }

  function setObjByInputs() {
    jQuery('#histKritDialog input, #histKritDialog select').each(function () {
      if (jQuery(this).is(':checkbox')) {
        _kursauswahl[jQuery(this).prop('id')] = (jQuery(this).is(':checked')) ? 'W' : '';
      } else {
        _kursauswahl[jQuery(this).prop('id')] = jQuery(this).val();
      }
    });
  }

  jQuery('.maAnmeld_histKrit').on('click', function () {
    jQuery('#histKritDialog').dialog('open');
  });

  function getObj4Server() {
    return _kursauswahl;
  }

  return getObj4Server;
} // initDetailsDialog

/**
 * Initialisiert den Dialog für den abweichenden Zahlweg
 */
function initAbwZahlwegDialog(pAbwZahlweg) {
  let _abwZahlweg = {};
  if (typeof (pAbwZahlweg) == 'object') {
    _abwZahlweg = pAbwZahlweg;
  }

  jQuery("#maAnmeld_abwZahlweg").on('click', function () {
    const openFunc = function () {
      setInputsByObj();

      // Falls noch kein abw. Zahler eingetragen ist, soll gleich der Dialog zur Teilnehmerauswahl geöffnet werden.
      // andernfalls wird die Teilnehmerauswahl nicht aufgeklappt.
      if (KuferTools.Anmeldung.ReadOnly !== true && jQuery('#abwZahlweg_Inhaber').val() === '') {
        jQuery('button.abw_tn_auswahl').trigger('click');
      }
    };
    const buttons = {};

    if (KuferTools.Anmeldung.ReadOnly) {
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    } else {
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        // 1. Prüfen, ob es allgemeine Eingabefehler im Formular gibt
        jQuery(this).find('input:visible').each(function () {
          if (!validateInput(jQuery(this))) {
            jQuery(this).addClass('form_error:');
          }
        });
        if (jQuery(this).find('input:visible').hasClass('form_error')) {
          showMessage('Bitte überprüfen Sie, ob Sie alle Formularfelder ausgefüllt haben.', 'Fehlerhafte Eingaben');
        } else {
          const bic = jQuery('#abwZahlweg_BIC').val();
          const iban = jQuery('#abwZahlweg_IBAN').val();
          let fehlerTextBic = '';
          // 2. Prüfen, ob die eingegebenen Kontodaten korrekt sind
          let toValidate = {
            iban: iban
          };
          if (bic !== '') {
            toValidate.bic = bic;
            fehlerTextBic = 'BIC und ';
          }
          const fehlerText = 'Bitte überprüfen Sie die ' + fehlerTextBic + 'IBAN.';

          toValidate = KuferTools.Utils.getJsonFromObjectBase64(toValidate);

          KuferTools.Utils.AjaxLadebildschirm.Start();
          jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleValidateAjaxFunc', {'toValidate': toValidate}, function (JsonMessage) {
            const wrongFields = KuferTools.Utils.getObjectFromJson(JsonMessage);
            if (wrongFields.length > 0) {
              showMessage('Ihre Bankdaten konnten nicht verifiziert werden. ' + fehlerText, 'Bankdaten konnten nicht verifiziert werden');
            } else {
              setObjByInputs();
              jQuery('#abwZahlwegDialog').parent('.ui-dialog-content').dialog('close');
            }
            KuferTools.Utils.AjaxLadebildschirm.Stop();
          });
        }
      };
      // Bankdaten des TNs verwenden. Die Buttonbezeichnung muss Kurz sein, da die Buttons sonst zweizeilig werden.
      buttons['Leeren'] = function () {
        jQuery(this).find('input').val('');
        setObjByInputs();
        jQuery(this).dialog('close');
      };

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

    }
    // ein jQuery-Dialog öffnen
    // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=abwZahlweg', function (data) {
      KuferTools.showMessage({
        meldung: data,
        title: 'Abweichender Zahlweg',
        buttons: buttons,
        width: 'auto',
        pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
      }, openFunc);
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });

  const $maAnmeldAbwZahlweg = jQuery("#maAnmeld_abwZahlweg");
  $maAnmeldAbwZahlweg.prop('disabled', false);

  if (KuferTools.Anmeldung.ReadOnly) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };
    jQuery('#abwZahlwegDialog').dialog("option", "buttons", buttons);
  }
  $maAnmeldAbwZahlweg.on('click', function () {
    jQuery('#abwZahlweg_betrag').trigger('change'); // Damit der vom TN zu zahlende Betrag aktualisiert wird
    jQuery('#abwZahlwegDialog').dialog('open');
  });

  /**
   * Wird im Dialog der abweichende Betrag geändert, muss der vom TN zu zahlende Betrag
   * ebenfalls geändert werden.
   */
  jQuery(document).on('change', '#abwZahlweg_betrag', function () {
    const kursGeb = KuferTools.Utils.Math.stringToFloat(KuferTools.Anmeldung.AktGebuehr);
    const abwGeb = KuferTools.Utils.Math.stringToFloat(jQuery(this).val());
    jQuery('#anteil_tn').html(KuferTools.Utils.Math.floatToString(kursGeb - abwGeb));
  });

  function setInputsByObj() {
    jQuery('#abwZahlwegDialog input').each(function () {
      jQuery(this).val(_abwZahlweg[jQuery(this).prop('name')]);
    });

    const $abwZahlwegBetrag = jQuery('#abwZahlweg_betrag');
    if ($abwZahlwegBetrag.val() === '') {
      $abwZahlwegBetrag.val('0,00');
    }
    // Damit der vom TN zu zahlende Betrag aktualisiert wird
    $abwZahlwegBetrag.trigger('change');
  }


  function setObjByInputs() {
    jQuery('#abwZahlwegDialog input').each(function () {
      _abwZahlweg[jQuery(this).prop('name')] = jQuery(this).val();
    });
  }

  function getObj4Server() {
    return _abwZahlweg;
  }

  return getObj4Server;

} // initAbwZahlwegDialog

/**
 * Initiallisiert den Dialog zur Auswahl der Anmeldeart
 */
function initAnmArtDialog() {
  const maAnmeld_anmArt = document.getElementById('maAnmeld_anmArt');
  if (!maAnmeld_anmArt) {
    return;
  }

  if (KuferTools.Anmeldung.ReadOnly) {
    maAnmeld_anmArt.addEventListener('click', function () {
      switch (KuferTools.Anmeldung.AnmeldeForm) {
        default:
        case KuferTools.Anmeldung.AnmFormObj.Normal:
          showMessage('Es wurden keine weiteren Teilnehmer zur Anmeldung angegeben.', 'Anmeldeart: Normal');
          break;
        case KuferTools.Anmeldung.AnmFormObj.ElternKind:
        case KuferTools.Anmeldung.AnmFormObj.Kind:
          jQuery('#kinderDialog').dialog('open');
          break;
        case KuferTools.Anmeldung.AnmFormObj.Firma:
          jQuery('#firmenDialog').dialog('open');
          break;
        case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
          jQuery('#mehrfachDialog').dialog('open');
          break;
      }
    });
  } else {
    maAnmeld_anmArt.addEventListener('click', function () {
      const openFunc = function () {
        jQuery(this).data('htmlBeimOeffnen', jQuery(this).children().clone());
      };
      const buttons = {};
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
      // ein jQuery-Dialog öffnen
      // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=anmeldeart&knr=' + KuferTools.Kurs.Nr, function (data) {
        KuferTools.showMessage({
          meldung: data,
          title: 'Anmeldeart auswählen',
          buttons: buttons,
          width: '250',
          pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
        }, openFunc);
        KuferTools.Utils.AjaxLadebildschirm.Stop();

        jQuery('#anmArtDialog .anmArt_normal').on('click', function () {
          KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmFormObj.Normal);
          jQuery('#anmArtDialog').parent('.ui-dialog-content').dialog('close');
          jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
          jQuery('#maAnmeld_anmelden').prop('disabled', false);
        });
      });
    });
  }
  maAnmeld_anmArt.disabled = false;
} // initAnmArtDialog

/**
 * Eventhandler für den Dialog zum Hinzufügen von Kindern zur Anmeldung.
 *
 * Gibt eine Funktion zurück, mit der die Kinder als Hidden-Inputs zurückgegeben werden.
 *
 * _kinder repräsentiert die Kinder-Tabelle, und ist ein Array von _kindObjPrototype-Objekten
 * Zum bearbeiten der Kindertabelle bitte das _kinder-Array bearbeiten, und anschließend redrawChildrenTable() aufrufen
 *
 * @return function
 */
function initKinderDialog(pKinder) {
  /**
   * Array von Kinder-Objekten. Repräsentiert die Kinder-Tabelle.
   */
  let _kinder = [];
  if (typeof (pKinder) == 'object') {
    _kinder = pKinder;
  }

  // aktualisiert die Kinderzeile bei der Teilnehmerinfo
  aktualisiereKinderZeile();

  /**
   * Beim öffnen des Dialogs wird _kinder hier zwischengespeichert, damit man diese wiederherstellen kann, falls
   * das Dialog abgebrochen wird.
   */
  let _kinder_vorm_oeffnen;
  /**
   * Prototyp eines Kindobjektes
   */
  const _kindObjPrototype = { tnr: undefined, name: '', vorname: '', geburtsdatum: '', bemerkung: '' };

  jQuery(document).on('click', ".anmArt_elternKind, #anmArt_elternKind, .anmArt_kind, #anmArt_kind", function () {
    const isElternKind = jQuery(this).hasClass('anmArt_elternKind') || jQuery(this).hasId('anmArt_elternKind');
    function openFunc(ui) {
      const kinderAusTnStammBtn = document.body.querySelector('#kinderMaAuswahlTnStamm');
      const kinderAusElternKindBtn = document.body.querySelector('#kinderElternKindAuswahl');
      if (KuferTools.Anmeldung.AllowKinderFunktionen) {
        function createTnUebersichtDialogUrl() {
          const urlTnUebersichtDialog = new URL(window.location.origin + window.location.pathname);
          urlTnUebersichtDialog.searchParams.set('tool_id', KuferTools.ToolId);
          urlTnUebersichtDialog.searchParams.set('action', 'tnUebersichtDialog');
          urlTnUebersichtDialog.searchParams.set('kinderAnm', '1');

          return urlTnUebersichtDialog;
        }

        kinderAusTnStammBtn && kinderAusTnStammBtn.addEventListener('click', _ => {
          const urlTnUebersichtDialog = createTnUebersichtDialogUrl();

          KuferTools.Utils.AjaxLadebildschirm.Start();
          fetch(urlTnUebersichtDialog)
            .then(resp => resp.text())
            .then(data => {
              const urlDataTable = new URL(window.location.origin + window.location.pathname);
              urlDataTable.searchParams.set('tool_id', KuferTools.ToolId);
              urlDataTable.searchParams.set('action', 'handleTnDataTable');
              urlDataTable.searchParams.set('dataTable', '1');
              urlDataTable.searchParams.set('kinderAnm', '1');

              KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Kinder auswählen', buttons, 'auto', undefined,
                '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px', urlDataTable)
                .then(() => {
                  KuferTools.Utils.AjaxLadebildschirm.Stop();
                });
            });
        });

        kinderAusElternKindBtn && kinderAusElternKindBtn.addEventListener('click', _ => {
          const urlTnUebersichtDialog = createTnUebersichtDialogUrl();

          KuferTools.Utils.AjaxLadebildschirm.Start();
          fetch(urlTnUebersichtDialog)
            .then(resp => resp.text())
            .then(data => {
              const urlDataTable = new URL(window.location.origin + window.location.pathname);
              urlDataTable.searchParams.set('tool_id', `${KuferTools.ToolId}`);
              urlDataTable.searchParams.set('action', 'handleTnDataTable');
              urlDataTable.searchParams.set('dataTable', '1');
              urlDataTable.searchParams.set('kinderAnmRestricted', '1');

              KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Kinder auswählen', buttons, 'auto', undefined,
                '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px',  urlDataTable)
                .then(() => {
                  KuferTools.Utils.AjaxLadebildschirm.Stop();
                });
            });
        });
      }

      KuferTools.Anmeldung.kinderDataTable = jQuery('.tab_kinder').dataTable({
        //"oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
        "sScrollY": "140px",
        "bFilter": false,
        "bInfo": false, //z.B. showing 1 to 10 from 57 entries
        "bScrollCollapse": true,
        "bPaginate": false,
        "bAutoWidth": false,
        "bSort": false
      });
      resetKinderEingabefelder();
      redrawChildrenTable(KuferTools.Anmeldung.kinderDataTable);
      _kinder_vorm_oeffnen = deepObjCopy(_kinder);
    }

    const buttons = {};

    if (KuferTools.Anmeldung.ReadOnly) {
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    } else {
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        if (_kinder.length === 0) {
          showMessage('Sie haben keine Kinder angegeben.<br><br>Bitte geben Sie für eine '
            + (isElternKind ? 'Eltern-' : '') + 'Kind-Anmeldung die Daten der Kinder unter "Daten des Kindes" an, '
            + 'und klicken anschließend auf "Kind hinzufügen". <br><br>Klicken Sie auf "Abbrechen", um die bisherige '
            + 'Anmeldeart beizubehalten.', 'Keine Kinder angegeben');
          //Falls nur der Name des Kindes im Textfeld steht und der Name dem der Eltern entspricht, wird das ignoriert.
          //Hintergrund: Da es eine Einstellung zur automatischen Ausfüllung des Namens der Kinder gibt, sollte nach dem Hinzufügen
          //und anschließendem Drücken auf den Ok-Button nicht immer die Meldung kommen, dass noch Angaben zu einem weiteren Kind vorhanden sind.
        } else if (jQuery('#kinderDialog .weiterePersonHinzufuegen input').filter(function () {
            return jQuery(this).val() !== "";
          }).length > 1 ||
          (jQuery('#kinderDialog .weiterePersonHinzufuegen input').filter(function () {
              return jQuery(this).val() !== "";
            }).length === 1 &&
            jQuery('#kinderDialog .weiterePersonHinzufuegen input#kindName').val() != KuferTools.Teilnehmer.Name)) {
          const buttons = {
            "Weiter, Kind nicht hinzufügen": function () {
              resetKinderEingabefelder();
              jQuery('#anmArtDialog').parent('.ui-dialog-content').dialog('close');
              const anmForm = isElternKind ? KuferTools.Anmeldung.AnmFormObj.ElternKind : KuferTools.Anmeldung.AnmFormObj.Kind;
              KuferTools.Anmeldung.setAnmForm(anmForm, _kinder.length);
              jQuery(this).dialog('close');
              // Aktualisiert die Kinderzeile bei der Teilnehmerinfo
              aktualisiereKinderZeile();
              jQuery('#kinderDialog').parent('.ui-dialog-content').dialog('close');
              // "jetzt anmelden"-Button ist standardmäßig disabled, wenn es ein Kinderkurs ist,
              // damit die Normalanmeldung nicht durchgeführt werden kann.
              jQuery('#maAnmeld_anmelden').prop('disabled', false);
              if (anmForm === KuferTools.Anmeldung.AnmFormObj.Kind) {
                jQuery('.maAnmeld_abwZahlweg').prop('disabled', true);
              } else {
                jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
              }
            },
            "Zurück zur Kindeingabe": function () {
              jQuery(this).dialog('close');
            }
          };
          showMessage('Sie haben unter "Daten des Kindes" noch Angaben zu einem Kind, welches noch nicht per "Kind hinzufügen" zur Anmeldung hinzugefügt wurde.<br><br>' +
            'Klicken Sie auf "Weiter, Kind nicht hinzufügen", um die Anmeldung, ohne die noch nicht zur Anmeldung hinzugefügten Kinddaten, fortzusetzen.<br><br>' +
            'Klicken Sie auf "Zurück zur Kindeingabe", wenn Sie das Kind noch hinzufügen möchten.', 'Nicht gesicherte Kinddaten', buttons);
        } else {
          resetKinderEingabefelder();
          const anmForm = isElternKind ? KuferTools.Anmeldung.AnmFormObj.ElternKind : KuferTools.Anmeldung.AnmFormObj.Kind;
          KuferTools.Anmeldung.setAnmForm(anmForm, _kinder.length);
          // Aktualisiert die Kinderzeile bei der Teilnehmerinfo
          aktualisiereKinderZeile();
          jQuery(this).dialog('close');
          jQuery('#anmArtDialog').parent('.ui-dialog-content').dialog('close');
          // "jetzt anmelden"-Button ist standardmäßig disabled, wenn es ein Kinderkurs ist,
          // damit die Normalanmeldung nicht durchgeführt werden kann.
          jQuery('#maAnmeld_anmelden').prop('disabled', false);
          if (anmForm === KuferTools.Anmeldung.AnmFormObj.Kind) {
            jQuery('.maAnmeld_abwZahlweg').prop('disabled', true);
          } else {
            jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
          }
        }
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        _kinder = _kinder_vorm_oeffnen;
        jQuery(this).dialog('close');
      };
    }

    // ein jQuery-Dialog öffnen
    // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
    KuferTools.Utils.AjaxLadebildschirm.Start();
    fetch('index.php?tool_id=' + KuferTools.ToolId + '&action=kinderDialog')
      .then(resp => resp.text())
      .then(data => {
        KuferTools.showMessage({
          meldung: data,
          title: 'Anmelden von Kindern',
          buttons: buttons,
          width: '750',
          pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
        })
          .then(openFunc);

        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
  });
  jQuery(".anmArt_elternKind, #anmArt_elternKind, .anmArt_kind, #anmArt_kind" ).prop('disabled', false);

  if (KuferTools.Anmeldung.ReadOnly) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };
    jQuery('#kinderDialog').dialog("option", "buttons", buttons);
  }

  jQuery('.anmArt_elternKind').on('click', function () {
    jQuery('#kinderDialog').dialog('open');
  });
  jQuery('.anmArt_kind').on('click', function () {
    jQuery('#kinderDialog').dialog('open');
  });

  /**
   * Setzt die Eingabefelder bei der Eltern-Kind-Anmeldung zurück.
   * Besetzt ggf. den Nachnamen des Kindes mit dem Nachnamen des Hauptteilnehmers,
   * sofern unter "zentr. Einstellungen / Anmeldung (Mitarbeiter) / Anmeldung"
   * die entsprechende Option gesetzt ist. (Standardäßig aktiviert)
   */
  function resetKinderEingabefelder() {
    jQuery('#kinderDialog .weiterePersonHinzufuegen input').filter(function () {
      return jQuery(this).val() !== "";
    }).val('');
    jQuery('#kinderDialog .weiterePersonHinzufuegen #kindName').val(KuferTools.Anmeldung.KindNameVorbelegung);
  }

  /**
   * Zeichnet die Kinder-Tabelle mit den Werten aus _kinder neu
   */
  function redrawChildrenTable(kinderDataTable) {
    kinderDataTable.fnClearTable();
    const kinderCount = _kinder.length;
    if (kinderCount > 0) {
      for (let i = 0; i < kinderCount; i++) {
        // In JS x || y entspricht ( x ) ? x : y;
        kinderDataTable.fnAddData([
          KuferTools.Utils.htmlEncode(_kinder[i].name) || '&nbsp',
          KuferTools.Utils.htmlEncode(_kinder[i].vorname) || '&nbsp',
          KuferTools.Utils.htmlEncode(_kinder[i].geburtsdatum) || '&nbsp',
          KuferTools.Utils.htmlEncode(_kinder[i].bemerkung) || '&nbsp',
          (KuferTools.Anmeldung.ReadOnly ? '' : '<i class="fa fa-trash removeChild row_' + i + '" style="cursor:pointer; font-size:1.3em;" alt="Kind entfernen" title="Kind entfernen"></i>')
        ], false);
      }
      kinderDataTable.fnDraw(false);
    } else {
      kinderDataTable.fnAddData([
        '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;',
        // '<img src="images/kindplus.gif" class="addChild" alt="Kind hinzuf&uuml;gen" title="Kind hinzuf&uuml;gen">'
        '&nbsp;'
      ], true);
    }

    const $kinderDialogWeitere = jQuery('#kinderDialog .weiterePersonenAnzahl .weiterePersonenAnzahlInt');
    $kinderDialogWeitere.text(kinderCount);

    // Falls mehr Kinder als freie Kinderplätze? Kinderanzahl rot färben
    if (kinderCount > KuferTools.Kurs.Kinder_frei) {
      $kinderDialogWeitere.css('color', '#FF0000');
    } else {
      $kinderDialogWeitere.css('color', '#000000');
    }
    // Falls nicht überbucht werden darf wird ggf. die Möglichkeit zum Hinzufügen neuer Kinder gesperrt.
    aktuallisiereHinzufuegenErlaubt();
  } // redrawChildrenTable

  function aktuallisiereHinzufuegenErlaubt() {
    // Nur falls nicht überbucht werden darf, muss das hier berücksichtigt werden.
    if (!KuferTools.Anmeldung.UeberbuchenErlaubt) {
      if (KuferTools.Kurs.Kinder_frei <= _kinder.length) {
        jQuery('#kinderDialog .weiterePersonHinzufuegen').css('display', 'none');
        jQuery('#kinderDialog .weiterePersonenVoll').css('display', 'block');
      } else {
        jQuery('#kinderDialog .weiterePersonHinzufuegen').css('display', 'block');
        jQuery('#kinderDialog .weiterePersonenVoll').css('display', 'none');
      }
    }
  }

  /**
   * Die Kinder-Zeile, welche in der Teilnehmer-Info-Box unten zu sehen ist, wird anhand den hinterlegten Kinderdaten aktualisiert.
   *
   * Fall keine Kinder: nichts anzeigen. Falls ein Kind: Vor- und Nachname + Bemerkung anzeigen.
   * Falls mehrere Kinder: die Vornamen auflisten.
   *
   * Die Kinderzeile wird durch ein Span mit der Klasse infozeile_kinder angesprochen
   */
  function aktualisiereKinderZeile() {
    const kinderCount = _kinder.length;
    const $kinderInfoZeile = jQuery('span.infozeile_kinder');
    const $kinderInfoLabel = jQuery('.infozeile_kinder_label');

    if (kinderCount === 0) {
      $kinderInfoZeile.html('');
      $kinderInfoLabel.html('');
    } else if (kinderCount === 1) {
      $kinderInfoLabel.text('Kind');
      $kinderInfoZeile.text(_kinder[0].vorname + ' ' + _kinder[0].name + ' ' + _kinder[0].bemerkung + ' ');
    } else {
      let kinderVornamen = '';
      for (let i = 0; i < kinderCount; i++) {
        if (i > 0) {
          kinderVornamen += ', ';
        }
        kinderVornamen += _kinder[i].vorname;
      }
      $kinderInfoLabel.text('Kinder');
      $kinderInfoZeile.text(kinderVornamen);
    }
  }

  /**
   * Mit einem Klick auf das Löschen-Symbol in der Kinderzeile wird das entsprechende Kind aus der Anmeldung entfernt.
   */
  jQuery(document).on('click', '.removeChild', function () {
    if (matches = jQuery(this).prop('class').match(/row_(\d)/)) {
      const index = matches[1];
      _kinder.splice(index, 1);
      redrawChildrenTable(KuferTools.Anmeldung.kinderDataTable);
    }
  });

  /**
   * Eventhandler für den Button zum Hinzufügen eines Kindes anhand der gefüllten Input-Felder
   */
  jQuery(document).on('click', '#kinderDialog #kindHinzufuegen', function () {
    jQuery('#kinderDialog .weiterePersonHinzufuegen input').removeClass('form_error');
    // Validierung der Eingaben
    const filter = KuferTools.Utils.Filter;
    const filterObj = filter.FilterSelector();
    const $mandatoryFields = jQuery("input.form_mandatory:text");
    $mandatoryFields.each(function () {
      filterObj.addSelector(jQuery(this), filter.Mandatory);
    });

    filterObj.addSelector(jQuery('#kindGeburtsdatum'), filter.Date);
    const fieldsWithWrongInput = filterObj.filter();
    const wrongFieldsLength = fieldsWithWrongInput.length;

    if (wrongFieldsLength !== 0) {
      let message = '<div class = "anmeldeart_abstand">Folgende (Pflicht-)Felder wurden nicht korrekt angegeben:</div>';
      for (let i = 0; i < wrongFieldsLength; i++) {
        fieldsWithWrongInput[i].addClass('form_error');
        if (fieldsWithWrongInput[i].prop('id') === 'kindGeburtsdatum') {
          message += '<div>- Geburtsdatum (Format: TT.MM.JJJJ)</div>';
        } else {
          const id = fieldsWithWrongInput[i].prop('id');
          const label = jQuery.trim(jQuery('label[for=' + id + ']').text());
          if (label !== '') {
            message += '<div>- ' + label.replace(':', '') + '</div>';
          } else {
            message += '<div>- rot markierte Pflichtfelder</div>';
          }
        }
      }
      showMessage(message, 'Bitte prüfen Sie Ihre Eingaben');
      return;
    }
    const kindObj = deepObjCopy(_kindObjPrototype);
    kindObj.name = jQuery('#kindName').val();
    kindObj.vorname = jQuery('#kindVorname').val();
    kindObj.geburtsdatum = jQuery('#kindGeburtsdatum').val();
    kindObj.bemerkung = jQuery('#kindBemerkung').val();
    _kinder.push(kindObj);
    redrawChildrenTable(KuferTools.Anmeldung.kinderDataTable);
    resetKinderEingabefelder();
  });

  function getObj4Server() {
    return _kinder;
  }

  jQuery(document).on('click', '.tn_auswahl_kinderdialog .tnBuchen', function (event) {
    event.preventDefault();

    const tnr = jQuery(this).find('.hiddenTnr').val();

    KuferTools.Utils.AjaxLadebildschirm.Start();
    fetch('index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&getTn=' + tnr, {
      'method': 'POST'
    })
      .then(resp => resp.json())
      .then(teilnehmer => {
      const mitarbeiterObj = deepObjCopy(_kindObjPrototype);
      mitarbeiterObj.tnr = teilnehmer.tnr;
      mitarbeiterObj.name = teilnehmer.name;
      mitarbeiterObj.vorname = teilnehmer.vorname;
      mitarbeiterObj.geschlecht = teilnehmer.geschlecht;
      mitarbeiterObj.ort = teilnehmer.ort;
      mitarbeiterObj.strasse = teilnehmer.strasse;
      mitarbeiterObj.telefon = teilnehmer.telefon;
      mitarbeiterObj.email = teilnehmer.email;
      mitarbeiterObj.geburtsdatum = teilnehmer.gebdat;
      _kinder.push(mitarbeiterObj);

      KuferTools.Utils.AjaxLadebildschirm.Stop();
      redrawChildrenTable(KuferTools.Anmeldung.kinderDataTable);
      jQuery('.tn_auswahl_kinderdialog').dialog('close');
    });
  });

  return getObj4Server;
} // initKinderDialog

function deepObjCopy(dupeObj) {
  let retObj = {};
  if (typeof (dupeObj) == 'object') {
    if (typeof (dupeObj.length) != 'undefined')
      retObj = [];
    for (const objInd in dupeObj) {
      if (typeof (dupeObj[objInd]) == 'object') {
        retObj[objInd] = deepObjCopy(dupeObj[objInd]);
      } else if (typeof (dupeObj[objInd]) == 'string') {
        retObj[objInd] = dupeObj[objInd];
      } else if (typeof (dupeObj[objInd]) == 'number') {
        retObj[objInd] = dupeObj[objInd];
      } else if (typeof (dupeObj[objInd]) == 'boolean') {
        ((dupeObj[objInd] == true) ? retObj[objInd] = true : retObj[objInd] = false);
      }
    }
  }
  return retObj;
}

/**
 * Initialisiert den Dialog für die Mehrfachanmeldung
 */
function initMehrfachDialog(pWeitereTn) {
  jQuery(document).on('click', '#mehrfachAnonym', function () {
    showAnzahlWeitereTnDialog();
  });
  initTnUebersichtDialog4Mehrfach();

  /**
   * Array von Teilnehmer-Objekten. Repräsentiert die Teilnehmer-Tabelle.
   */
  let _teilnehmer = [];
  if (typeof (pWeitereTn) == 'object') {
    _teilnehmer = pWeitereTn;
  }

  /**
   * Beim Öffnen des Dialogs wird _teilnehmer zwischengespeichert, damit beim Abbrechen
   * diese wiederhergestellt werden kann.
   */
  let _teilnehmer_vorm_oeffnen;
  /**
   * Prototyp eines Teilnehmer-Objekts
   */
  const _teilnehmerObjPrototype = {
    tnr: -1,
    name: '',
    vorname: '',
    geschlecht: '',
    ort: '',
    strasse: '',
    telefon: '',
    email: ''
  };

  jQuery(document).on('click', ".anmArt_mehrfach, #anmArt_mehrfach", function () {

    const openFunc = function () {
      KuferTools.Anmeldung.teilnehmerDataTable = jQuery('.tab_mehrfach').dataTable({
        //"oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
        "sScrollY": "140px", //Scrollbalken nach unten, angezeigt: 300px (IE)
        "bFilter": false,
        "bInfo": false, //z.B. showing 1 to 10 from 57 entries
        "bScrollCollapse": true,
        "bPaginate": false,
        "bAutoWidth": false,
        "bSort": false
      });
      redrawTnTable(KuferTools.Anmeldung.teilnehmerDataTable);
      _teilnehmer_vorm_oeffnen = deepObjCopy(_teilnehmer);
      jQuery('#mehrfachDialog .weiterePersonHinzufuegen input').removeClass('form_error');
    };

    const buttons = {};
    if (KuferTools.Anmeldung.ReadOnly) {
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    } else {
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        if (_teilnehmer.length === 0) {
          showMessage('Sie haben keine weiteren Teilnehmer angegeben.<br><br>Bitte geben Sie für eine Mehrfachanmeldung die ' +
            'Daten der weiteren Teilnehmer unter "Daten des weiteren Teilnehmers" an, und klicken anschließend auf "Teilnehmer hinzufügen", ' +
            'oder Klicken Sie auf "Hinzufügen aus Teilnehmerstamm", um einen bereits erfassten Teilnehmer mit anzumelden. ' +
            '<br><br>Klicken Sie auf "Abbrechen", um die bisherige Anmeldeart beizubehalten.', 'Keine Teilnehmer angegeben');
        } else if (jQuery('#mehrfachDialog .weiterePersonHinzufuegen input').filter(function () {
          return jQuery(this).val() !== "";
        }).length > 0) {
          const buttons = {
            "Weiter, Teilnehmer nicht hinzufügen": function () {
              resetFirmaEingabefelder();
              jQuery('#anmArtDialog').dialog('close');
              KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmFormObj.Mehrfach, _teilnehmer.length);
              jQuery(this).dialog('close');
              jQuery('#mehrfachDialog').parent('.ui-dialog-content').dialog('close');
              jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
              jQuery('#maAnmeld_anmelden').prop('disabled', false);
            },
            "Zurück zur Teilnehmereingabe": function () {
              jQuery(this).dialog('close');
            }
          };
          showMessage('Sie haben unter "Daten des weiteren Teilnehmers" noch Angaben zu einem Teilnehmer, welcher noch nicht per "Hinzufügen aus Eingabefelder" zur Anmeldung hinzugefügt wurde.<br><br>' +
            'Klicken Sie auf "Weiter, Teilnehmer nicht hinzufügen", um die Anmeldung, ohne die noch nicht zur Anmeldung hinzugefügten Teilnehmerdaten, fortzusetzen.<br><br>' +
            'Klicken Sie auf "Zurück zur Teilnehmereingabe", wenn Sie den Teilnehmer noch hinzufügen möchten.', 'Nicht gesicherte Teilnehmerdaten', buttons);

        } else {
          KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmFormObj.Mehrfach, _teilnehmer.length);
          jQuery(this).dialog('close');
          jQuery('#anmArtDialog').parent('.ui-dialog-content').dialog('close');
          jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
          jQuery('#maAnmeld_anmelden').prop('disabled', false);
        }
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        _teilnehmer = _teilnehmer_vorm_oeffnen;
        jQuery(this).dialog('close');
      };
    }
    // ein jQuery-Dialog öffnen
    // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=mehrfachDialog', function (data) {
      KuferTools.showMessage({
        meldung: data,
        title: 'Anmelden von weiteren Teilnehmern',
        buttons: buttons,
        width: 'auto',
        pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
      }, openFunc);
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });
  jQuery(".anmArt_mehrfach, #anmArt_mehrfach").prop('disabled', false);

  if (KuferTools.Anmeldung.ReadOnly) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };
    jQuery('#mehrfachDialog').dialog("option", "buttons", buttons);
  }
  jQuery('.anmArt_mehrfach').on('click', function () {
    jQuery('#mehrfachDialog').dialog('open');
  });

  /**
   * Dialog zum Hinzufügen weiterer Teilnehmer: Auswahl, ob die Teilnehmer aus TN-Stamm,
   * aoder als neue Teilnehmer angelegt werden.
   */
  const buttons = {};
  buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
    jQuery(this).dialog('close');
  };
  jQuery('#mehrfachDispatchDialog').dialog({
    modal: true,
    autoOpen: false,
    resizable: false,
    width: 290,
    title: 'Weiteren Teilnehmer anmelden',
    buttons: buttons
  });

  /**
   * Leert die Eingabefelder für Mitarbeiter
   */
  function resetFirmaEingabefelder() {
    jQuery('#mehrfachDialog .weiterePersonHinzufuegen input').val('');
    jQuery('#mehrfachDialog .weiterePersonHinzufuegen select').val('');
  }

  /**
   * Zeichnet die Teilnehmertabelle anhand _teilnehmer neu
   */
  function redrawTnTable(teilnehmerDataTable) {
    teilnehmerDataTable.fnClearTable();
    const tnCount = _teilnehmer.length;
    if (tnCount > 0) {
      for (let i = 0; i < tnCount; i++) {
        // In JS x || y entspricht ( x ) ? x : y;
        teilnehmerDataTable.fnAddData([
          KuferTools.Utils.htmlEncode(_teilnehmer[i].name) || '&nbsp',
          KuferTools.Utils.htmlEncode(_teilnehmer[i].vorname) || '&nbsp',
          KuferTools.Utils.htmlEncode(KuferTools.Anmeldung.Geschlecht[_teilnehmer[i].geschlecht]) || '&nbsp',
          KuferTools.Utils.htmlEncode(_teilnehmer[i].ort) || '&nbsp',
          KuferTools.Utils.htmlEncode(_teilnehmer[i].strasse) || '&nbsp',
          KuferTools.Utils.htmlEncode(_teilnehmer[i].telefon) || '&nbsp',
          KuferTools.Utils.htmlEncode(_teilnehmer[i].email) || '&nbsp',
          (KuferTools.Anmeldung.ReadOnly ? '' : '<i class="fa fa-trash removeTn row_' + i + '" style="cursor:pointer; font-size:1.3em;" alt="Teilnehmer entfernen" title="Teilnehmer entfernen"></i>')
        ], false);
      }
      teilnehmerDataTable.fnDraw(false);
    } else {
      teilnehmerDataTable.fnAddData([
        '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;',
        //'<img src="images/weiteretnplus.gif" class="addTn" alt="Teilnehmer hinzuf&uuml;gen" title="Teilnehmer hinzuf&uuml;gen">'
        '&nbsp;'
      ], true);
    }
    const $mehrfachDialogWeitere = jQuery('#mehrfachDialog .weiterePersonenAnzahl .weiterePersonenAnzahlInt');
    $mehrfachDialogWeitere.text(tnCount);

    // Falls mehr weitere Teilnehmer (Haupttn berücksichtigt) als freie Plätze? Teilnehmeranzahl rot färben
    if (tnCount > (KuferTools.Kurs.Teil_frei - 1)) {
      $mehrfachDialogWeitere.css('color', '#FF0000');
    } else {
      $mehrfachDialogWeitere.css('color', '#000000');
    }
  } // redrawTnTable

  /**
   * Klick auf den Löschenbutton in einer Mitarbeiterzeile entfernt diesen aus der Anmeldung
   */
  jQuery(document).on('click', '.removeTn', function () {
    if (matches = jQuery(this).prop('class').match(/row_(\d)/)) {
      const index = matches[1];
      _teilnehmer.splice(index, 1);
      redrawTnTable(KuferTools.Anmeldung.teilnehmerDataTable);
    }
  });

  /**
   * Hinzufügen eines Mitarbeiter: Ruft den Dialog für die Auswahl "aus TN-Stamm, PauschalTN..." auf.
   */
  jQuery(document).on('click', '.addTn', function () {
    jQuery('#mehrfachDispatchDialog').dialog('open');
  });

  /**
   * Dialog für die manuelle Angabe von Namen, Vornamen usw. des Firmenteilnehmers
   */
  jQuery(document).on('click', '#mehrfachDialog #mehrfachTnManuell', function () {
    jQuery('#mehrfachDialog .weiterePersonHinzufuegen input').removeClass('form_error');
    const filter = KuferTools.Utils.Filter;
    const filterObj = filter.FilterSelector();
    const $mandatoryFields = jQuery("input.form_mandatory:text");
    $mandatoryFields.each(function () {
      filterObj.addSelector(jQuery(this), filter.Mandatory);
    });

    filterObj.addSelector(jQuery('#tnName'), filter.NeutralerTN).addSelector(jQuery('#tnEmail'), filter.Email);
    const fieldsWithWrongInput = filterObj.filter();
    const wrongFieldsLength = fieldsWithWrongInput.length;
    if (wrongFieldsLength !== 0) {
      let message = '<div class = "anmeldeart_abstand">Folgende (Pflicht-)Felder wurden nicht korrekt angegeben:</div>';
      for (let i = 0; i < wrongFieldsLength; i++) {
        fieldsWithWrongInput[i].addClass('form_error');
        const id = fieldsWithWrongInput[i].prop('id');
        const label = jQuery.trim(jQuery('label[for=' + id + ']').text());
        if (label !== '') {
          message += '<div>- ' + label.replace(':', '') + '</div>';
        } else {
          message += '<div>- rot markierte Pflichtfelder</div>';
        }
      }
      showMessage(message, 'Bitte prüfen Sie Ihre Eingaben');
    } else {
      const teilnehmerObj = deepObjCopy(_teilnehmerObjPrototype);
      teilnehmerObj.name = jQuery('#tnName').val();
      teilnehmerObj.vorname = jQuery('#tnVorname').val();
      teilnehmerObj.geschlecht = jQuery('#tnGeschlecht').val();
      teilnehmerObj.telefon = jQuery('#tnTelefon').val();
      teilnehmerObj.ort = jQuery('#tnOrt').val();
      teilnehmerObj.strasse = jQuery('#tnStrasse').val();
      teilnehmerObj.email = jQuery('#tnEmail').val();
      _teilnehmer.push(teilnehmerObj);
      redrawTnTable(KuferTools.Anmeldung.teilnehmerDataTable);
      resetFirmaEingabefelder();
    }
  }); // jQuery('#mehrfachTnManuell').click

  /**
   * Eventhandler für die weiteren Teilnehmer per Dialog.
   *
   * Das Dialogdiv wird nicht direkt zum Dialog gemacht, sondern aus den Dom gehängt, und
   * später per ShowMessage angezeigt.
   */
  function initTnUebersichtDialog4Mehrfach() {
    const $dialog = jQuery('.tn_auswahl_mehrfach');
    $dialog.detach();
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog("close");
    };

    jQuery(document).on('click', '#mehrfachTnStamm', function () {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=tnUebersichtDialog&mehrfachAnm=1', function (data) {
        KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Teilnehmer auswählen', buttons, 'auto', undefined,
          '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px',
          'index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&dataTable=1&mehrfachAnm=1');
        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });


    });
    jQuery(document).on('click', '.tn_auswahl_mehrfach .tnBuchen', function (event) {
      event.preventDefault();
      const tnr = jQuery(this).find('.hiddenTnr').val();

      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&getTn=' + tnr, {}, function (teilnehmerJson) {
        const teilnehmer = KuferTools.Utils.getObjectFromJson(teilnehmerJson);

        const teilnehmerObj = deepObjCopy(_teilnehmerObjPrototype);
        teilnehmerObj.tnr = teilnehmer.tnr;
        teilnehmerObj.name = teilnehmer.name;
        teilnehmerObj.vorname = teilnehmer.vorname;
        teilnehmerObj.geschlecht = teilnehmer.geschlecht;
        teilnehmerObj.ort = teilnehmer.ort;
        teilnehmerObj.strasse = teilnehmer.strasse;
        teilnehmerObj.telefon = teilnehmer.telefon;
        teilnehmerObj.email = teilnehmer.email;
        _teilnehmer.push(teilnehmerObj);

        KuferTools.Utils.AjaxLadebildschirm.Stop();

        redrawTnTable(KuferTools.Anmeldung.teilnehmerDataTable);
        jQuery('.tn_auswahl_mehrfach').dialog('close');
        jQuery('#mehrfachDispatchDialog').dialog('close');
      });

    });
  } // initTnUebersichtDialog4Mehrfach

  function getObj4Server() {
    return _teilnehmer;
  }

  function showAnzahlWeitereTnDialog() {
    const $content = '<div id="anzahlWeitereTnDialog"><div><span>Zusätzliche anonyme Teilnehmer hinzufügen: </span>\n\
                      <input id="anzahlWeitereTnDialog_anzahl" value="1" size="2" maxlength="2"></div><div><small>\n\
                      (Die weiteren Teilnehmer werden mit den Daten des Hauptteilnehmers hinzugefügt)</small>\n\
                    </div></div>';

    const $meldung = jQuery('<div>' + $content + '</div>');

    const buttons = {};
    buttons['Hinzufügen'] = function () {
      const anzahl = jQuery('#anzahlWeitereTnDialog_anzahl').val();
      if (KuferTools.Utils.Filter.IsInt(anzahl) && parseInt(anzahl) > 0) {
        const anzahlInt = parseInt(anzahl);
        for (let i = 0; i < anzahlInt; i++) {
          fuegeHauptTnHinzu();
        }
        jQuery(this).dialog('close');
      } else {
        showMessage('Bitte geben Sie für die Anzahl nur positive Ganzzahl an', 'Ungültige Eingabe');
      }
    };
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };

    $meldung.dialog({
      modal: true,
      autoOpen: false,
      resizable: false,
      width: 405,
      title: 'Weitere Personen hinzufügen',
      open: function () {
        jQuery(this).data('htmlBeimOeffnen', jQuery(this).children().clone())
      },
      close: function () {
        jQuery(this).html(jQuery(this).data('htmlBeimOeffnen'))
      },
      buttons: buttons
    });
    $meldung.dialog('open');
  }

  function fuegeHauptTnHinzu() {
    const teilnehmerObj = deepObjCopy(_teilnehmerObjPrototype);
    teilnehmerObj.tnr = KuferTools.Teilnehmer.Tnr;
    teilnehmerObj.name = KuferTools.Teilnehmer.Name;
    teilnehmerObj.vorname = KuferTools.Teilnehmer.Vorname;
    teilnehmerObj.geschlecht = KuferTools.Teilnehmer.Geschlecht;
    teilnehmerObj.ort = KuferTools.Teilnehmer.Ort;
    teilnehmerObj.strasse = KuferTools.Teilnehmer.Strasse;
    teilnehmerObj.telefon = KuferTools.Teilnehmer.Telefon;
    teilnehmerObj.email = KuferTools.Teilnehmer.Email;

    _teilnehmer.push(teilnehmerObj);
    redrawTnTable(KuferTools.Anmeldung.teilnehmerDataTable);
  }

  return getObj4Server;
} // initMehrfachDialog

/**
 * Eventhandler für den Dialog zum Hinzufügen von Firmenmitarbeitern.
 *
 * Gibt eine Funktion zurück, mit der die Mitarbeiter als Hidden-Inputs zurückgegeben werden.
 *
 * _mitarbeiter repräsentiert die Mitarbeiter-Tabelle, und ist ein Array von _mitarbeiterObjPrototype-Objekten
 * Zum bearbeiten der Mitarbeitertabelle bitte das _kinder-Array bearbeiten, und anschließend redrawChildrenTable() aufrufen
 *
 * @return function
 */
function initFirmaDialog(pMitarbeiter) {
  // Initialisiert die Dialog zur Auswahl von Firmenmitarbeitern aus dem Teilnehmerstamm oder den bisherigen Firmenmitarbeitern
  initTnUebersichtDialog4Firmen();
  /**
   * Array von Mitarbeiter-Objekten. Repräsentiert die Mitarbeiter-Tabelle.
   */
  let _mitarbeiter = [];
  if (typeof (pMitarbeiter) == 'object') {
    _mitarbeiter = pMitarbeiter;
  }

  /**
   * Beim Öffnen des Dialogs wird _mitarbeiter zwischengespeichert, damit beim Abbrechen
   * diese wiederhergestellt werden kann.
   */
  let _mitarbeiter_vorm_oeffnen;
  /**
   * Prototyp eines Mitarbeiterobjektes
   */
  const _mitarbeiterObjPrototype = {
    tnr: -1,
    name: '',
    vorname: '',
    geschlecht: '',
    ort: '',
    strasse: '',
    telefon: '',
    email: ''
  };

  jQuery(document).on('click', ".anmArt_firma, #anmArt_firma", function () {
    const openFunc = function () {
      KuferTools.Anmeldung.mitarbeiterDataTable = jQuery('.tab_firma').dataTable({
        //"oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
        "sScrollY": "140px",
        "bFilter": false,
        "bInfo": false, //z.B. showing 1 to 10 from 57 entries
        "bScrollCollapse": true,
        "bPaginate": false,
        "bAutoWidth": false,
        "bSort": false
      });
      redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
      _mitarbeiter_vorm_oeffnen = deepObjCopy(_mitarbeiter);
      jQuery('#firmenDialog .weiterePersonHinzufuegen input').removeClass('form_error');
    };
    const buttons = {};

    if (KuferTools.Anmeldung.ReadOnly) {
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        jQuery(this).dialog('close');
      };
    } else {
      buttons[KuferTools.Button.Bezeichnung.Ok] = function () {
        if (_mitarbeiter.length == 0) {
          showMessage('Sie haben keine Mitarbeiter angegeben.<br><br>Bitte geben Sie für eine Firmenanmeldung die ' +
            'Daten der Mitarbeiter unter "Daten des Mitarbeiters" an, und klicken anschließend auf "Hinzufügen". ' +
            '<br><br>Klicken Sie auf "Abbrechen", um die bisherige Anmeldeart beizubehalten.', 'Keine Mitarbeiter angegeben');

        } else if (jQuery('#firmenDialog .weiterePersonHinzufuegen input').filter(function () {
          return jQuery(this).val() !== "";
        }).length > 0) {
          const buttons = {
            "Weiter, Mitarbeiter nicht hinzufügen": function () {
              resetFirmaEingabefelder();
              jQuery('#anmArtDialog').dialog('close');
              KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmFormObj.Firma, _mitarbeiter.length);
              jQuery(this).dialog('close');
              jQuery('#firmenDialog').dialog('close');
              jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
              jQuery('#maAnmeld_anmelden').prop('disabled', false);
            },
            "Zurück zur Mitarbeitereingabe": function () {
              jQuery(this).dialog('close');
            }
          };
          showMessage('Sie haben unter "Daten des Mitarbeiters" noch Angaben zu einem Mitarbeiter, welcher noch nicht per "Hinzufügen" zur Anmeldung hinzugefügt wurde.<br><br>' +
            'Klicken Sie auf "Weiter, Mitarbeiter nicht hinzufügen", um die Anmeldung, ohne die noch nicht zur Anmeldung hinzugefügten Mitarbeiterdatendaten, fortzusetzen.<br><br>' +
            'Klicken Sie auf "Zurück zur Mitarbeitereingabe", wenn Sie den Mitarbeiter noch hinzufügen möchten.', 'Nicht gesicherte Mitarbeiterdaten', buttons);

        } else {
          KuferTools.Anmeldung.setAnmForm(KuferTools.Anmeldung.AnmFormObj.Firma, _mitarbeiter.length);

          jQuery(this).dialog('close');
          jQuery('#anmArtDialog').parent('.ui-dialog-content').dialog('close');
          jQuery('.maAnmeld_abwZahlweg').prop('disabled', false);
          jQuery('#maAnmeld_anmelden').prop('disabled', false);
        }
      };
      buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
        _mitarbeiter = _mitarbeiter_vorm_oeffnen;
        jQuery(this).dialog('close');
      };
    }
    // ein jQuery-Dialog öffnen
    // davor über Ajax ein Paar infos holen, wie was freigegeben ist? Oder einfach wie bisher per Ajax den kompletten inhalt laden?
    KuferTools.Utils.AjaxLadebildschirm.Start();
    jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=firmaDialog', function (data) {
      KuferTools.showMessage({
        meldung: data,
        title: 'Anmelden von Firmen-Mitarbeitern',
        buttons: buttons,
        width: 'auto',
        pressEnterFunc: buttons[KuferTools.Button.Bezeichnung.FilterSetzen]
      }, openFunc);
      KuferTools.Utils.AjaxLadebildschirm.Stop();
    });
  });
  jQuery(".anmArt_firma, #anmArt_firma").prop('disabled', false);

  if (KuferTools.Anmeldung.ReadOnly) {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog('close');
    };
    jQuery('#firmenDialog').dialog("option", "buttons", buttons);
  }
  jQuery('.anmArt_firma').on('click', function () {
    jQuery('#firmenDialog').dialog('open');
  });

  /**
   * Leert die Eingabefelder für Mitarbeiter
   */
  function resetFirmaEingabefelder() {
    jQuery('#firmenDialog .weiterePersonHinzufuegen input').val('');
    jQuery('#firmenDialog .weiterePersonHinzufuegen select').val('');
  }

  /**
   * Zeichnet die Mitarbeitertabelle anhand _mitarbeiter neu
   */
  function redrawMaTable(mitarbeiterDataTable) {
    mitarbeiterDataTable.fnClearTable();
    const maCount = _mitarbeiter.length;
    if (maCount > 0) {
      for (let i = 0; i < maCount; i++) {
        // In JS x || y entspricht ( x ) ? x : y;
        mitarbeiterDataTable.fnAddData([
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].name) || '&nbsp',
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].vorname) || '&nbsp',
          KuferTools.Utils.htmlEncode(KuferTools.Anmeldung.Geschlecht[_mitarbeiter[i].geschlecht]) || '&nbsp',
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].ort) || '&nbsp',
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].strasse) || '&nbsp',
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].telefon) || '&nbsp',
          KuferTools.Utils.htmlEncode(_mitarbeiter[i].email) || '&nbsp',
          (KuferTools.Anmeldung.ReadOnly ? '' : '<i class="fa fa-trash removeMa row_' + i + '" style="cursor:pointer; font-size:1.3em;" title="Mitarbeiter entfernen"></i>')
        ], false);
      }
      mitarbeiterDataTable.fnDraw(false);
    } else {
      mitarbeiterDataTable.fnAddData(['&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;'], true);
    }
    jQuery('#firmenDialog .weiterePersonenAnzahl .weiterePersonenAnzahlInt').text(maCount);
    // Falls mehr Mitarbeiter als freie Plätze? Mitarbeiteranzahl rot färben
    if (maCount > KuferTools.Kurs.Teil_frei) {
      jQuery('#firmenDialog .weiterePersonenAnzahl .weiterePersonenAnzahlInt').css('color', '#FF0000');
    } else {
      jQuery('#firmenDialog .weiterePersonenAnzahl .weiterePersonenAnzahlInt').css('color', '#000000');
    }
  } // redrawMaTable

  /**
   * Klick auf den Löschenbutton in einer Mitarbeiterzeile entfernt diesen aus der Anmeldung
   */
  jQuery(document).on('click', '.removeMa', function () {
    if (matches = jQuery(this).prop('class').match(/row_(\d)/)) {
      const index = matches[1];
      _mitarbeiter.splice(index, 1);
      redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
    }
  });

  /**
   * Für die manuelle Angabe von Namen, Vornamen usw. des Firmenteilnehmers
   */
  jQuery(document).on('click', '#mehrfachMaManuell', function () {
    jQuery('#firmenDialog .weiterePersonHinzufuegen input').removeClass('form_error');
    const filter = KuferTools.Utils.Filter;
    const filterObj = filter.FilterSelector();
    filterObj.addSelector(jQuery('#maEmail'), filter.Email);

    const $mandatoryFields = jQuery("input.form_mandatory:text");
    $mandatoryFields.each(function () {
      filterObj.addSelector(jQuery(this), filter.Mandatory);
    });

    const fieldsWithWrongInput = filterObj.filter();
    const wrongFieldsLength = fieldsWithWrongInput.length;

    if (wrongFieldsLength !== 0) {
      let message = '<div class = "anmeldeart_abstand">Folgende (Pflicht-)Felder wurden nicht korrekt angegeben:</div>';
      for (let i = 0; i < wrongFieldsLength; i++) {
        fieldsWithWrongInput[i].addClass('form_error');

        const id = fieldsWithWrongInput[i].prop('id');
        let label = jQuery.trim(jQuery('label[for=' + id + ']').text());
        if (label !== '') {
          message += '<div>- ' + label.replace(':', '') + '</div>';
        } else {
          message += '<div>- rot markierte Pflichtfelder</div>';
        }
      }
      showMessage(message, 'Bitte prüfen Sie Ihre Eingaben');
      return;
    }
    const mitarbeiterObj = deepObjCopy(_mitarbeiterObjPrototype);
    mitarbeiterObj.name = jQuery('#maName').val();
    mitarbeiterObj.vorname = jQuery('#maVorname').val();
    mitarbeiterObj.geschlecht = jQuery('#maGeschlecht').val();
    mitarbeiterObj.ort = jQuery('#maOrt').val();
    mitarbeiterObj.strasse = jQuery('#maStrasse').val();
    mitarbeiterObj.telefon = jQuery('#maTelefon').val();
    mitarbeiterObj.email = jQuery('#maEmail').val();
    _mitarbeiter.push(mitarbeiterObj);
    redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
    resetFirmaEingabefelder();
  }); // jQuery('#firmenMaAuswahlManuell').click

  jQuery(document).on('click', '#firmenMaPauschalWeiblich, #firmenMaPauschalMaennlich, #firmenMaPauschalNeutral', function () {
    let name;
    let geschlecht = '';

    switch (jQuery(this).prop('id')) {
      case 'firmenMaPauschalWeiblich':
        name = 'TN W';
        geschlecht = 'W'
        break;
      case 'firmenMaPauschalMaennlich':
        name = 'TN M';
        geschlecht = 'M';
        break;
      case 'firmenMaPauschalNeutral':
        name = 'TN N';
        break;
    }
    const mitarbeiterObj = deepObjCopy(_mitarbeiterObjPrototype);
    mitarbeiterObj.name = name;
    mitarbeiterObj.geschlecht = geschlecht;
    _mitarbeiter.push(mitarbeiterObj);
    redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
  });

  /**
   * Fügt den Hauptteilnehmer (Firma) zusätzlich als Pauschalteilnehmer ein
   */
  jQuery(document).on('click', '#firmenMaPauschalFirma', function () {
    const mitarbeiterObj = deepObjCopy(_mitarbeiterObjPrototype);
    mitarbeiterObj.tnr = KuferTools.Teilnehmer.Tnr;
    mitarbeiterObj.name = KuferTools.Teilnehmer.Name;
    mitarbeiterObj.vorname = KuferTools.Teilnehmer.Vorname;
    mitarbeiterObj.geschlecht = KuferTools.Teilnehmer.Geschlecht;
    mitarbeiterObj.ort = KuferTools.Teilnehmer.Ort;
    mitarbeiterObj.strasse = KuferTools.Teilnehmer.Strasse;
    mitarbeiterObj.telefon = KuferTools.Teilnehmer.Telefon;
    mitarbeiterObj.email = KuferTools.Teilnehmer.Email;

    _mitarbeiter.push(mitarbeiterObj);
    redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
  });

  /**
   * Eventhandler für die Firmenmitarbeiter per Dialog.
   *
   * Das Dialogdiv wird nicht direkt zum Dialog gemacht, sondern aus den Dom gehängt, und
   * später per ShowMessage angezeigt.
   *
   * Abhängig davon, welcher Button gedrückt wurde, werden die Daten aus dem Teilnehmerstamm, oder
   * aus den Firmenmitarbeitern des Hauptteilnehmers geladen.
   */
  function initTnUebersichtDialog4Firmen() {
    const buttons = {};
    buttons[KuferTools.Button.Bezeichnung.Abbrechen] = function () {
      jQuery(this).dialog("close");
    };

    jQuery(document).on('click', '#firmenMaAuswahlTnStamm, #firmenMaAuswahlFirma', function () {
      // Wenn firmenMaAuswahlFirma gedrückt wurde, werden nur die Firmenmitarbeiter des Hauptteilnehmers angezeigt. Sonst alle TN
      const addGetParam = (jQuery(this).prop('id') === 'firmenMaAuswahlTnStamm') ? 'firmenAnm=1' : 'firmenAnmRestricted=1';

      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.get('index.php?tool_id=' + KuferTools.ToolId + '&action=tnUebersichtDialog&firmenAnm=1', function (data) {

        KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax(jQuery(data), 'Firmen-Mitarbeiter auswählen', buttons, 'auto', undefined,
          '.dataTable_tnUebersicht', KuferTools.TeilnehmerProSeite, '300px',
          'index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&dataTable=1&' + addGetParam);
        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
    });

    jQuery(document).on('click', '.tn_auswahl_firmendialog .tnBuchen', function (event) {
      event.preventDefault();
      const tnr = jQuery(this).find('.hiddenTnr').val();

      KuferTools.Utils.AjaxLadebildschirm.Start();
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=handleTnDataTable&getTn=' + tnr, {}, function (teilnehmerJson) {
        const teilnehmer = KuferTools.Utils.getObjectFromJson(teilnehmerJson);

        const mitarbeiterObj = deepObjCopy(_mitarbeiterObjPrototype);
        mitarbeiterObj.tnr = teilnehmer.tnr;
        mitarbeiterObj.name = teilnehmer.name;
        mitarbeiterObj.vorname = teilnehmer.vorname;
        mitarbeiterObj.geschlecht = teilnehmer.geschlecht;
        mitarbeiterObj.ort = teilnehmer.ort;
        mitarbeiterObj.strasse = teilnehmer.strasse;
        mitarbeiterObj.telefon = teilnehmer.telefon;
        mitarbeiterObj.email = teilnehmer.email;
        _mitarbeiter.push(mitarbeiterObj);

        KuferTools.Utils.AjaxLadebildschirm.Stop();
        redrawMaTable(KuferTools.Anmeldung.mitarbeiterDataTable);
        jQuery('.tn_auswahl_firmendialog').dialog('close');
        jQuery('#firmenMaAuswahlDispatch').dialog('close');
      });
    });
  } // initTnUebersichtDialog4Firmen
  function getObj4Server() {
    return _mitarbeiter;
  }

  return getObj4Server;
} // initFirmaDialog

/**
 * Liefert den Belegungsstatus.
 *
 * @returns {String}
 */
KuferTools.Anmeldung.getBelegungsStatus = function () {
  let belegungsStatus = 'A';
  const $belegungStatus = jQuery('#belegungsStatus');
  if ($belegungStatus.length > 0) {
    belegungsStatus = $belegungStatus.val();
  }
  if (!KuferTools.Anmeldung.UeberbuchenErlaubt && KuferTools.Anmeldung.getAnzAnmPersonen() > KuferTools.Kurs.Teil_frei
    && (belegungsStatus === 'A' || belegungsStatus === 'P')) {
    belegungsStatus = 'W';
  }
  return belegungsStatus;
};

/**
 * Liefert die Anzahl der anzumeldenden Personen.
 *
 * @return {Number}
 */
KuferTools.Anmeldung.getAnzAnmPersonen = function () {
  let anzAnmPersonen = 1;
  switch (KuferTools.Anmeldung.AnmeldeForm) {
    case KuferTools.Anmeldung.AnmFormObj.Firma:
      anzAnmPersonen = KuferTools.Anmeldung.AnzahlWeitere;
      break;
    case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
      anzAnmPersonen = KuferTools.Anmeldung.AnzahlWeitere + 1;
      break;
    case KuferTools.Anmeldung.AnmFormObj.Kind:
      anzAnmPersonen = 0;
      break;
  }
  return anzAnmPersonen;
};

/**
 * Funktion zum Ändern der Anmeldeform.
 *
 * Setzt die entsprechenden Parameter, passt das HTML auf der Seite an
 * und berechnet die neue Kursgebühr.
 *
 * @param int pAnmForm für KuferTools.Anmeldung.AnmeldeForm. Zum Setzen kann KuferTools.Anmeldung.AnmFormObj.ANMART verwendet werden.
 * @param int pAnzWeitere Anzahl der weiteren Teilnehmer
 */
KuferTools.Anmeldung.setAnmForm = function (pAnmForm, pAnzWeitere) {
  // Bezeichnung im Button "Anmeldeform"
  let anmFormBezeichnung = '';
  switch (parseInt(pAnmForm)) {
    case KuferTools.Anmeldung.AnmFormObj.Normal:
      anmFormBezeichnung = 'normal';
      break; // Plurale
    case KuferTools.Anmeldung.AnmFormObj.ElternKind:
      anmFormBezeichnung = 'Eltern-Kind mit ' + pAnzWeitere + ' Kind';
      if (pAnzWeitere > 1) {
        anmFormBezeichnung += 'er';
      }
      break;
    case KuferTools.Anmeldung.AnmFormObj.Kind:
      anmFormBezeichnung = 'Kind mit ' + pAnzWeitere + ' Kind';
      if (pAnzWeitere > 1) {
        anmFormBezeichnung += 'er';
      }
      break;
    case KuferTools.Anmeldung.AnmFormObj.Firma:
      anmFormBezeichnung = 'Firmen mit ' + pAnzWeitere + ' Mitarbeiter';
      break;
    case KuferTools.Anmeldung.AnmFormObj.Mehrfach:
      anmFormBezeichnung = 'Mehrfach mit ' + pAnzWeitere + ' weitere';
      if (pAnzWeitere > 1) {
        anmFormBezeichnung += ' Teilnehmer';
      } else {
        anmFormBezeichnung += 'n Teilnehmer';
      }
      break;
    default:
      throw 'invalide Anmeldeform.';
  }
  KuferTools.Anmeldung.AnmeldeForm = pAnmForm;
  KuferTools.Anmeldung.AnzahlWeitere = pAnzWeitere || 0; // Bei undefined: 0
  KuferTools.Anmeldung.updateAktGebuehr(true);

  const $maAnmeldAnmArtDerzeit = jQuery('.maAnmeld_anmArt_derzeit');
  $maAnmeldAnmArtDerzeit.text('(derzeit: ' + anmFormBezeichnung + ')');
  // Aktualisiert die Kinder-Infozeile beim Teilnehmerdiv. Die Zeile soll nur bei einer Eltern-Kind-Anmeldung
  // angezeigt werden.
  if (parseInt(pAnmForm) !== KuferTools.Anmeldung.AnmFormObj.ElternKind
    && parseInt(pAnmForm) !== KuferTools.Anmeldung.AnmFormObj.Kind) {
    jQuery('.infozeile_kinder_label').html('');
    jQuery('span.infozeile_kinder').html('');
  }
  $maAnmeldAnmArtDerzeit.prop('disabled', false);
}; // setAnmForm

/**
 * Updatet die aktuelle Gebühr.
 */
KuferTools.Anmeldung.updateAktGebuehr = function (pShowAjaxLoader, pNachlass) {
  // Ermittelt die Gebühr anhand der Anmeldeart.
  if (typeof (pNachlass) !== "undefined" && typeof (pNachlass['nachlassBetrag']) !== "undefined") {
    KuferTools.Anmeldung.NachlassFloat = -1 * KuferTools.Utils.Math.stringToFloat(pNachlass['nachlassBetrag']);
  }
  if (pShowAjaxLoader) {
    KuferTools.Utils.AjaxLadebildschirm.Start();
  }
  const href = 'index.php?tool_id=' + KuferTools.ToolId + '&action=getGebuehr&anmForm=' + KuferTools.Anmeldung.AnmeldeForm + '&weitereTN=' + KuferTools.Anmeldung.AnzahlWeitere + '&nachlass=' + KuferTools.Anmeldung.NachlassFloat;
  const $gebuehrenDialogForm = jQuery.ajax({
    url: href,
    method: 'GET'
  }).fail(function () {
    if (!KuferTools.IsUnloading) {
      KuferTools.Utils.showAjaxErrorDialog(undefined, href);
    }
  });

  $gebuehrenDialogForm.done(function (gebuehrAryJson) {
    KuferTools.Utils.AjaxLadebildschirm.Stop();

    const gebuehrAry = KuferTools.Utils.getObjectFromJson(gebuehrAryJson);
    KuferTools.Anmeldung.BasisGebuehr = gebuehrAry[0];
    KuferTools.Anmeldung.NachlassAufteilbar = gebuehrAry[1];
    let neueGebuehr = KuferTools.Anmeldung.BasisGebuehr;
    if (KuferTools.Anmeldung.NachlassFloat != 0.0) {
      const basisGebuehrFloat = KuferTools.Utils.Math.stringToFloat(KuferTools.Anmeldung.BasisGebuehr);
      const neueGebuehrFloat = basisGebuehrFloat + KuferTools.Anmeldung.NachlassFloat;
      neueGebuehr = KuferTools.Utils.Math.floatToString(neueGebuehrFloat);
    }
    KuferTools.Anmeldung.AktGebuehr = neueGebuehr;
    KuferTools.Anmeldung.updateInputFields();
  });
};

/**
 * Updatet Werte in Eingabefeldern.
 * Aktualisiert die Anzeige der aktuellen Gebühr und den ausgewählten Belegungsstatus.
 */
KuferTools.Anmeldung.updateInputFields = function () {
  const $belegungStatus = jQuery('#belegungsStatus');
  const $maAnmeldInputGebuehr = jQuery('#maAnmeld_input_gebuehr');
  if (!KuferTools.Anmeldung.UeberbuchenErlaubt) {
    if (KuferTools.Anmeldung.getAnzAnmPersonen() > KuferTools.Kurs.Teil_frei) {
      $maAnmeldInputGebuehr.val('0,00');

      const belStatus = $belegungStatus.val();
      if (belStatus === 'A' || belStatus === 'P') {
        $belegungStatus.val('W');
      }

      $belegungStatus.find('option[value="A"]').prop('disabled', true);
      $belegungStatus.find('option[value="P"]').prop('disabled', true);
    } else {
      if ($belegungStatus.val() === 'P' || $belegungStatus.val() === 'I') {
        $maAnmeldInputGebuehr.val('0,00');
      } else {
        $maAnmeldInputGebuehr.val(KuferTools.Anmeldung.AktGebuehr);
      }
      $belegungStatus.find('option[value="A"]').prop('disabled', false);
      $belegungStatus.find('option[value="P"]').prop('disabled', false);
    }
  } else {
    if ($belegungStatus.val() === 'W' || $belegungStatus.val() === 'P' || $belegungStatus.val() === 'I') {
      $maAnmeldInputGebuehr.val('0,00');
    } else {
      $maAnmeldInputGebuehr.val(KuferTools.Anmeldung.AktGebuehr);
    }
  }
};

/**
 * Gibt ein Hidden-Input-Feld zurück, mit welchen das übergebene Objekt JSON- und BASE64-encoded als
 * value enthält.
 *
 * @param pObj
 * @param pName
 * @return
 */
KuferTools.Anmeldung.getJsonHiddenInput = function (pObj, pName) {
  return '<input type="hidden" name="' + pName + '" value="' + KuferTools.Utils.getJsonFromObjectBase64(pObj) + '">';
};


function setAbwZahlweg(pInhaber, pBankBez, pBic, pIban, pTnr) {
  jQuery('input[name="abw_inhaber"]').val(pInhaber);
  jQuery('input[name="abw_bank"]').val(pBankBez);
  jQuery('input[name="abw_bic"]').val(pBic);
  jQuery('input[name="abw_iban"]').val(pIban);
  jQuery('input[name="abw_zahler"]').val(pTnr);
  jQuery(".tn_uebersicht_dialog").dialog("close");
}

function PrintPartOfPage(pPrintable) {
  const prtContent = document.getElementById(pPrintable);
  const winPrint = window.open('', 'Anmeldebestätigung', 'left=100,top=100,width=600,height=600');
  winPrint.document.write(prtContent.innerHTML);
  winPrint.document.close();
  //WinPrint.trigger('focus');
  winPrint.print();

  //Geöffnetes Fenster nach dem Ausdruck des Dokuments wieder schließen.
  winPrint.close();
}