/*
 * mnlisten - Modifizierbare Tabellen bzw. Listen, wo Einträge
 * - erstellt
 * - gelöscht
 * - aus Hinterlegung/Datatable ausgewählt
 * werden können.
 */

$(function () {
  // TODO evtl. statt Ready-Handler eine normale Funktion, welche von WssFieldKursplanungKooperationspartner::initJS augerufen wird
  var koopList = new KooperationspartnerMnList();
  koopList.init();

  var dozList = new DozentenauswahlMnList();
  dozList.init();

  var dokuList = new DokumenteMnList();
  dokuList.init();

  var kursortList = new KursortMnList();
  kursortList.init();

  var einsatzbezirkeList = new EinsatzbezirkeMnList();
  einsatzbezirkeList.init();

  var dozentAusbildungenList = new DozentAusbildungenMnList();
  dozentAusbildungenList.init();

  var dozentQualifikationenList = new DozentQualifikationenMnList();
  dozentQualifikationenList.init();
});



/**
 * Folgender Teil wird später dann ausgelagert. Dieser soll allgemein für verschiedene Mn-Listen genutzt werden können
 * @abstract
 */
class MnListBasis {
  constructor() {
    /** @member {Object[]} */
    this.eintraege = [];
    /** @member {Number} */
    this.eintragImFokus = 0;
  }

  /**
   * @abstract
   * @method getSelector4FieldContainer
   * @returns {jQuery}
   */
  getSelector4FieldContainer() {
    return $('');
  }

  /**
   * @abstract
   * @returns
   */
  getNewTrElement() {
    return '';
  }

  /**
   * @abstract
   * @returns
   */
  initHook() {
    return '';
  }

  getSelector4TableBody() {
    return this.getSelector4FieldContainer().find('.mnlisttable tbody');
  }

  getSelector4HiddenField() {
    return this.getSelector4FieldContainer().find('.mnlist_hidden');
  }

  /**
   * @function
   */
  init() {
    var myThis = this;
    this.getSelector4FieldContainer().on('click', '.mnzeile', function (event) {
      myThis.setMarkedEntryIndex($(this).data('index'));
      myThis.renderTable();
    });

    this.initHook();

    this.renderTable();
  }

  renderTable() {
    var $tableBody = this.getSelector4TableBody();
    $tableBody.html('');
    var len = this.eintraege.length;
    var trs = [];
    var markedIndex = this.getMarkedEntryIndex();

    for (var i = 0; i < len; i++) {
      trs[trs.length] = this.getNewTrElement(this.eintraege[i], i, i == markedIndex); // Parameter prüfen, in wieweit notwendig. Eventuell nur true oder false übergeben, ob die Zeile markiert ist, um eine bestimmte Klasse zu vergeben?
    }
    $tableBody.append(trs);
    this.fillHiddenField();
    // Damit die Pflichtfeldprüfung neu durchgeführt wird
    this.getSelector4FieldContainer().find('.mnlist').trigger('change');
  }

  fillHiddenField() {
    var $field = this.getSelector4HiddenField();
    $field.val(KuferTools.Utils.getJsonFromObjectBase64(this.eintraege));
  }

  /**
   *
   * @returns {(null|Object)}
   */
  getMarkedEntry() {
    if (typeof (this.eintraege[this.eintragImFokus]) !== 'undefined') {
      return this.eintraege[this.eintragImFokus];
    }
    return null; // TODO erste Zeile zurückgeben und Fokus auf 0 setzen? Und wenn es gar keinen Eintrag gibt?
  }

  /**
   * @returns {number}
   */
  getMarkedEntryIndex() {
    // TODO 0 zurückgeben, falls keine Zahl?
    return this.eintragImFokus;
  }

  setMarkedEntryToLast() {
    this.setMarkedEntryIndex(this.eintraege.length - 1);
  }

  setMarkedEntryIndex(index) {
    this.eintragImFokus = index;
  }

  insertSingleEntry(eintrag) {
    this.eintraege[this.eintraege.length] = eintrag;
  }

  /**
   *
   * @param {Object[]} eintragAry
   */
  insertMultipleEntries(eintragAry) {
    this.eintraege = this.eintraege.concat(eintragAry);
  }

  /**
   * @param {Object} eintrag
   * @param {number} index
   */
  updateEntry(eintrag, index) {
    this.eintraege[index] = eintrag;
  }

  deleteEntry(index) {
    this.eintraege.splice(index, 1);
    if (this.eintragImFokus >= index) { // TODO verbessern. Es kann noch immer vorkommen, das nach dem Löschen keine Zeile markiert ist
      this.eintragImFokus--;
    }
  }

  clearEntries() {
    this.eintraege = [];
  }

  /**
   *
   * @returns {number}
   */
  getEntryCount() {
    return this.eintraege.length;
  }
}




/**
 * @class
 * @augments MnListBasis
 */
class KursortMnList extends MnListBasis {
  constructor() {
    super();
  }

  getSelector4FieldContainer() {
    return $('#kursplanung_kursort_mit_neu').parent();
  }

  /**
   * Überschreibt insertSingleEntry, damit nur maximal 1 element angegeben werden kann.
   *
   * @param {Object} eintrag
   * @returns
   */
  insertSingleEntry(eintrag) {
    this.clearEntries();
    super.insertSingleEntry.call(this, eintrag);
  }

  getEmptyEntry() {
    return {
      mktext: '',
      bez: '',
      strasse: '',
      plz: '',
      ort: '',
      gemeinde: '',
      stadtteil: '',
      bezirk: '',
      bundesland: '',
      internet: '',
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '"><td class="blockimg"></td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.mktext) + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular() {
    var eintrag = this.getEmptyEntry();
    eintrag.mktext = $('#kursort_mktext').val();
    eintrag.bez = $('#kursort_bez').val();

    eintrag.strasse = $('#kursort_strasse').val();
    eintrag.plz = $('#kursort_plz').val();
    eintrag.ort = $('#kursort_ort').val();
    eintrag.gemeinde = $('#kursort_gemeinde').val();
    eintrag.stadtteil = $('#kursort_stadtteil').val();
    eintrag.bezirk = $('#kursort_bezirk').val();
    eintrag.bundesland = $('#kursort_bundesland').val();
    eintrag.internet = $('#kursort_internet').val();

    eintrag = this.transformGemeindeEintrag(eintrag);

    this.insertSingleEntry(eintrag);
  }

  updateEintragByFormular() {
    var eintrag = this.getMarkedEntry();
    eintrag.mktext = $('#kursort_mktext').val();
    eintrag.bez = $('#kursort_bez').val();

    eintrag.strasse = $('#kursort_strasse').val();
    eintrag.plz = $('#kursort_plz').val();
    eintrag.ort = $('#kursort_ort').val();
    eintrag.gemeinde = $('#kursort_gemeinde').val();
    eintrag.stadtteil = $('#kursort_stadtteil').val();
    eintrag.bezirk = $('#kursort_bezirk').val();
    eintrag.bundesland = $('#kursort_bundesland').val();
    eintrag.internet = $('#kursort_internet').val();

    eintrag = this.transformGemeindeEintrag(eintrag);

    this.updateEntry(eintrag, this.getMarkedEntryIndex());
  }

  transformGemeindeEintrag(eintrag) {
    var regexPLZBeiGemeinde = /^[ ]*([A-Z]-)?[0-9]{2,6}[ \t]/;
    if ($('#kursort_gemeinde').is(':visible') && regexPLZBeiGemeinde.test(eintrag.gemeinde) && eintrag.plz.trim() === '') {
      // Bei dem Feld "PLZ Gemeinde" steht die PLZ vorne dran, bei PLZ eintragen
      eintrag.plz = eintrag.gemeinde.match(regexPLZBeiGemeinde)[0].trim();
      eintrag.ort = eintrag.gemeinde.replace(regexPLZBeiGemeinde, '').trim();
    }

    return eintrag;
  }

  getInsertOrUpdateZeile(name, value, label, hint, isPflichtfeld, zusatz, isHidden) {

    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }

    var zus = ''
    if (zusatz) {
      zus = zusatz;
    }

    var hide = ''
    if (isHidden) {
      hide = 'display: none;';
    }

    var labelTitle = '';
    var inputHint = '';
    if (hint && hint != '') {
      hint = KuferTools.Utils.htmlEncode(hint);
      labelTitle = 'title="' + hint + '" data-toggle="tooltip"';
      //inputHint = 'placeholder="'+hint+'"';
    }

    value = KuferTools.Utils.htmlEncode(value);

    return '  <div style="position: relative;' + hide + '">' +
      '    <label class="mnlabel" for="kursort_' + name + '"' + labelTitle + '>' + label + ':</label>' +
      '    <input type="text" id="kursort_' + name + '" value="' + value + '" class="form-control' + pflichtClass + '"' + inputHint + '>' +
      zus +
      '  </div>';
  }

  getInsertOrUpdateFormular(entry, showInfo) {
    var hinterlegungsbuttonGemeinde = '<button style="cursor:pointer; position: absolute; right: 5px; top: 20px; font-size: 27px; color: #555;" class="no-button-style" type="button">' +
      '<i class="fa fa-hand-o-down hl_gemeinden_kursort hinterlegung-button-icon" aria-hidden="true"></i>' +
      '</button>';

    var hinweis = '';
    if (showInfo) {
      hinweis = '<div role="status" class="alert alert-info">Hinweis: Es kann nur ein Veranstaltungsort angegeben werden. <br>Falls Sie versuchen einen zweiten hinzuzufügen wird der vorhandene Eintrag ersetzt.</div>';
    }

    return '<div id="koop_dialog_insertorupdate">' +
      hinweis +

      this.getInsertOrUpdateZeile('mktext', entry.mktext, 'Name', '', true) +

      this.getInsertOrUpdateZeile('strasse', entry.strasse, 'Straße', '', true) +
      this.getInsertOrUpdateZeile('plz', entry.plz, 'PLZ', '', false, '', true) +
      this.getInsertOrUpdateZeile('ort', entry.ort, 'Ort', '', false, '', true) +

      this.getInsertOrUpdateZeile('gemeinde', entry.gemeinde,
        'PLZ Gemeinde',
        'z.B. 5020 Salzburg', true, hinterlegungsbuttonGemeinde) +
      this.getInsertOrUpdateZeile('stadtteil', entry.stadtteil, 'Stadtteil', '', false, '', true) +
      this.getInsertOrUpdateZeile('bezirk', entry.bezirk, 'Bezirk', '', false, '', true) +
      this.getInsertOrUpdateZeile('bundesland', entry.bundesland, 'Bundesland', '', false, '', true) +

      this.getInsertOrUpdateZeile('internet', entry.internet, 'Weblink', 'z.B. https://example.org') +
      '</div>';
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var myThis = this;

    $('.button_new_kursort', this.getSelector4FieldContainer()).on('click', function () {
      var message = myThis.getInsertOrUpdateFormular(myThis.getEmptyEntry(), myThis.getEntryCount() > 0);

      var buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            myThis.insertEintragByFormular();
            myThis.setMarkedEntryToLast();
            $(this).dialog("close");
            myThis.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Neuen Veranstaltungsort angeben'
      });
    });

    $('.button_update_kursort', this.getSelector4FieldContainer()).on('click', function () {
      var message = myThis.getInsertOrUpdateFormular(myThis.getMarkedEntry());

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            myThis.updateEintragByFormular();
            $(this).dialog("close");
            myThis.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Veranstaltungsort ändern'
      });

    });

    $('.button_delete_kursort', this.getSelector4FieldContainer()).on('click', function () {
      myThis.deleteEntry(myThis.getMarkedEntryIndex());
      myThis.renderTable();
    });


    $('.button_kursort_auswahl', this.getSelector4FieldContainer()).on('click', function () {

      var showHinweis = '';
      if (myThis.getEntryCount() > 0) {
        showHinweis = '&showHinweis=1';
      }

      var kursorteProSeite = KuferTools.KursorteProSeite || 6

      KuferTools.Utils.AjaxLadebildschirm.Start();
      var buttons = undefined;
      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=kursortauswahl' + showHinweis, function (data) {
        KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax($(data), 'Kursort auswählen', buttons, 'auto', undefined,
          '.dataTable_kursortUebersicht', kursorteProSeite, '300px',
          'index.php?tool_id=' + KuferTools.ToolId + '&action=handleKursortDataTable&dataTable=1');
        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
    });

    // Evtl ist der Name doof? Auch zu allgemein mit dokument?
    // Auch doof: Kein Zugriff auf den Dialog
    $(document).on('click', '.choose_kursort', function () {
      var kursortBase64 = $(this).data('kursort');
      var kursort = KuferTools.Utils.getObjectFromJsonBase64(kursortBase64);

      var eintrag = myThis.getEmptyEntry();
      eintrag.mktext = kursort.mktext;
      eintrag.bez = kursort.bez;

      eintrag.strasse = kursort.strasse;
      eintrag.plz = kursort.plz;
      eintrag.ort = kursort.ort;
      eintrag.gemeinde = kursort.gemeinde;
      eintrag.stadtteil = kursort.stadtteil;
      eintrag.bezirk = kursort.bezirk;
      eintrag.bundesland = kursort.bundesland;
      eintrag.internet = kursort.internet;

      if (eintrag.gemeinde === '') {
        eintrag.gemeinde = (eintrag.plz + ' ' + eintrag.ort).trim();
      }

      myThis.insertSingleEntry(eintrag);
      myThis.renderTable();

      $('.tn_uebersicht_dialog').dialog('close');
    });
  }
}








/**
 * @class
 * @augments MnListBasis
 */
class KooperationspartnerMnList extends MnListBasis {
  constructor() {
    super();
  }

  getSelector4FieldContainer() {
    return $('#kursplanung_kooperationspartner').parent();
  }

  getEmptyEntry() {
    return {
      id: '',
      name: '',
      vorname: '',
      strasse: '',
      plz: '',
      ort: '',
      gemeinde: '',
      stadtteil: '',
      bezirk: '',
      bundesland: '',
      festnetzPrivat: '',
      festnetzDienstlich: '',
      mobilPrivat: '',
      mobilDienstlich: '',
      emailPrivat: '',
      emailDienstlich: '',
      weblink: '', // ist das www bzw. Homepage?
      anredetitel: ''
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '"><td class="blockimg">' + AryElem.id + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.name) + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.vorname) + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular() {
    var eintrag = this.getEmptyEntry();
    eintrag.name = $('#koop_name').val();
    eintrag.vorname = $('#koop_vorname').val();

    eintrag.strasse = $('#koop_strasse').val();
    eintrag.plz = $('#koop_plz').val();
    eintrag.ort = $('#koop_ort').val();
    eintrag.gemeinde = $('#koop_gemeinde').val();
    eintrag.stadtteil = $('#koop_stadtteil').val();
    eintrag.bezirk = $('#koop_bezirk').val();
    eintrag.bundesland = $('#koop_bundesland').val();
    eintrag.festnetzPrivat = $('#koop_festnetzPrivat').val();
    eintrag.festnetzDienstlich = $('#koop_festnetzDienstlich').val();
    eintrag.mobilPrivat = $('#koop_mobilPrivat').val();
    eintrag.mobilDienstlich = $('#koop_mobilDienstlich').val();
    eintrag.emailPrivat = $('#koop_emailPrivat').val();
    eintrag.emailDienstlich = $('#koop_emailDienstlich').val();
    eintrag.weblink = $('#koop_weblink').val();
    eintrag.anredetitel = $('#koop_anredetitel').val();

    this.insertSingleEntry(eintrag);
  }

  updateEintragByFormular() {
    var eintrag = this.getMarkedEntry(); // eventuell doch als Parameter oder so übergeben?
    if (eintrag.name != $('#koop_name').val() || eintrag.vorname != $('#koop_vorname').val()) {
      eintrag.id = ''; // Wenn ein Eintrag geändert wird, ist das nicht mehr der aus der Hinterlegung ausgewählte Dozent
    }
    eintrag.name = $('#koop_name').val();
    eintrag.vorname = $('#koop_vorname').val();

    eintrag.strasse = $('#koop_strasse').val();
    eintrag.plz = $('#koop_plz').val();
    eintrag.ort = $('#koop_ort').val();
    eintrag.gemeinde = $('#koop_gemeinde').val();
    eintrag.stadtteil = $('#koop_stadtteil').val();
    eintrag.bezirk = $('#koop_bezirk').val();
    eintrag.bundesland = $('#koop_bundesland').val();
    eintrag.festnetzPrivat = $('#koop_festnetzPrivat').val();
    eintrag.festnetzDienstlich = $('#koop_festnetzDienstlich').val();
    eintrag.mobilPrivat = $('#koop_mobilPrivat').val();
    eintrag.mobilDienstlich = $('#koop_mobilDienstlich').val();
    eintrag.emailPrivat = $('#koop_emailPrivat').val();
    eintrag.emailDienstlich = $('#koop_emailDienstlich').val();
    eintrag.weblink = $('#koop_weblink').val();
    eintrag.anredetitel = $('#koop_anredetitel').val();

    this.updateEntry(eintrag, this.getMarkedEntryIndex());
  }

  getInsertOrUpdateZeile(name, value, label, isPflichtfeld, zusatz, isHidden, maxlength) {

    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }

    var zus = ''
    if (zusatz) {
      zus = zusatz;
    }

    var hide = ''
    if (isHidden) {
      hide = 'display: none;';
    }

    var maxLengthHtml = '';
    if (maxlength) {
      maxLengthHtml = ' maxlength="' + maxlength + '"';
    }

    return '  <div style="position: relative;' + hide + '">' +
      '    <label class="mnlabel" for="koop_' + name + '">' + label + ':</label>' +
      '    <input type="text" id="koop_' + name + '" value="' + value + '" class="form-control' + pflichtClass + '"' +
      maxLengthHtml +
      '>' +
      zus +
      '  </div>';
  }

  getInsertOrUpdateFormular(entry) {
    var hinterlegungsbuttonAnredetitel = '<button style="cursor:pointer; position: absolute; right: 5px; top: 18px; font-size: 27px; color: #555;" class="no-button-style" type="button">' +
      '<i class="fa fa-hand-o-down hl_anredetitel_koop hinterlegung-button-icon" aria-hidden="true"></i>' +
      '</button>';

    var hinterlegungsbuttonGemeinde = '<button style="cursor:pointer; position: absolute; right: 5px; top: 18px; font-size: 27px; color: #555;" class="no-button-style" type="button">' +
      '<i class="fa fa-hand-o-down hl_gemeinden_koop hinterlegung-button-icon" aria-hidden="true"></i>' +
      '</button>';

    return '<div id="koop_dialog_insertorupdate">' +
      this.getInsertOrUpdateZeile('name', entry.name, 'Name/Organisation', true, undefined, undefined, 35) +
      this.getInsertOrUpdateZeile('vorname', entry.vorname, 'Vorname', undefined, undefined, undefined, 35) +

      this.getInsertOrUpdateZeile('anredetitel', entry.anredetitel, 'Anredetitel', false, hinterlegungsbuttonAnredetitel, undefined, 100) +

      this.getInsertOrUpdateZeile('strasse', entry.strasse, 'Straße', true, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('plz', entry.plz, 'PLZ', false, '', true) +
      this.getInsertOrUpdateZeile('ort', entry.ort, 'Ort', false, '', true) +

      this.getInsertOrUpdateZeile('gemeinde', entry.gemeinde, 'PLZ Gemeinde', true, hinterlegungsbuttonGemeinde) +
      this.getInsertOrUpdateZeile('stadtteil', entry.stadtteil, 'Stadtteil', false, '', true) +
      this.getInsertOrUpdateZeile('bezirk', entry.bezirk, 'Bezirk', false, '', true) +
      this.getInsertOrUpdateZeile('bundesland', entry.bundesland, 'Bundesland', false, '', true) +

      this.getInsertOrUpdateZeile('festnetzPrivat', entry.festnetzPrivat, 'Festnetz Privat', undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('festnetzDienstlich', entry.festnetzDienstlich, 'Festnetz Dienstlich', undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('mobilPrivat', entry.mobilPrivat, 'Mobil Privat', false, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('mobilDienstlich', entry.mobilDienstlich, 'Mobil Dienstlich', false, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('emailPrivat', entry.emailPrivat, 'E-Mail Privat', undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('emailDienstlich', entry.emailDienstlich, 'E-Mail Dienstlich', undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('weblink', entry.weblink, 'Weblink', undefined, undefined, undefined, 100) +
      '</div>';
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var koopList = this;

    $('.button_new_koop', this.getSelector4FieldContainer()).on('click', function () {
      var message = koopList.getInsertOrUpdateFormular(koopList.getEmptyEntry());

      var buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            koopList.insertEintragByFormular();
            koopList.setMarkedEntryToLast();
            $(this).dialog("close");
            koopList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Neuen Kooperationspartner erstellen'
      });
    });

    $('.button_update_koop', this.getSelector4FieldContainer()).on('click', function () {
      var message = koopList.getInsertOrUpdateFormular(koopList.getMarkedEntry());

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            koopList.updateEintragByFormular();
            $(this).dialog("close");
            koopList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Kooperationspartner ändern'
      });

    });

    $('.button_delete_koop', this.getSelector4FieldContainer()).on('click', function () {
      koopList.deleteEntry(koopList.getMarkedEntryIndex());
      koopList.renderTable();
    });


    $('.button_new_koop_test', this.getSelector4FieldContainer()).on('click', function () {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      var buttons = undefined;

      var kooperationspartnerProSeite = KuferTools.TeilnehmerProSeite || 20

      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=koopauswahl', function (data) {
        KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax($(data), 'Kooperationspartner auswählen', buttons, 'auto', undefined,
          '.dataTable_dozUebersicht', kooperationspartnerProSeite, '300px',
          'index.php?tool_id=' + KuferTools.ToolId + '&action=handleKoopDataTable&dataTable=1');
        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
    });

    // Evtl ist der Name doof? Auch zu allgemein mit dokument?
    // Auch doof: Kein Zugriff auf den Dialog
    $(document).on('click', '.choose_koop', function () {
      var dozBase64 = $(this).data('doz');
      var doz = KuferTools.Utils.getObjectFromJsonBase64(dozBase64);

      var eintrag = koopList.getEmptyEntry();
      eintrag.id = doz.id;
      eintrag.name = doz.name;
      eintrag.vorname = doz.vorname;

      eintrag.strasse = doz.strasse;
      eintrag.plz = doz.plz;
      eintrag.ort = doz.ort;
      eintrag.gemeinde = doz.gemeinde;
      eintrag.stadtteil = doz.stadtteil;
      eintrag.bezirk = doz.bezirk;
      eintrag.bundesland = doz.bundesland;
      eintrag.festnetzPrivat = doz.festnetzPrivat;
      eintrag.festnetzDienstlich = doz.festnetzDienstlich;
      eintrag.mobilPrivat = doz.mobilPrivat;
      eintrag.mobilDienstlich = doz.mobilDienstlich;
      eintrag.emailPrivat = doz.emailPrivat;
      eintrag.emailDienstlich = doz.emailDienstlich;
      eintrag.weblink = doz.weblink;
      eintrag.anredetitel = doz.anredetitel;
      koopList.insertSingleEntry(eintrag);
      koopList.renderTable();
    });
  }
}







/**
 * DozentenauswahlMnList - Dozentenauswahl bei Kursvorschlag
 * 
 * @class
 * @augments MnListBasis
 */
class DozentenauswahlMnList extends MnListBasis {
  constructor() {
    super();
  }

  getSelector4FieldContainer() {
    return $('#kursplanung_dozauswahl').parent();
  }

  getEmptyEntry() {
    return {
      id: '',
      name: '',
      vorname: '',
      strasse: '',
      plz: '',
      ort: '',
      gemeinde: '',
      stadtteil: '',
      bezirk: '',
      bundesland: '',
      festnetzPrivat: '',
      festnetzDienstlich: '',
      mobilPrivat: '',
      mobilDienstlich: '',
      emailPrivat: '',
      emailDienstlich: '',
      weblink: '',
      dienstst: '',
      honorar: '',
      anredetitel: '',
      fahrtkostenNachKm: false
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '"><td class="blockimg">' + AryElem.id + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.name) + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.vorname) + '</td>' +
      '<td>Honorar: ' + KuferTools.Utils.Math.floatToString(AryElem.honorar) + ' &euro;</td>' +
      '<td>Erstattung der Fahrtkosten: ' + (AryElem.fahrtkostenNachKm ? 'Ja' : 'Nein') + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular() {
    var eintrag = this.getEmptyEntry();
    eintrag.name = $('#doz_name').val();
    eintrag.vorname = $('#doz_vorname').val();

    eintrag.strasse = $('#doz_strasse').val();
    eintrag.plz = $('#doz_plz').val();
    eintrag.ort = $('#doz_ort').val();
    eintrag.gemeinde = $('#doz_gemeinde').val();
    eintrag.stadtteil = $('#doz_stadtteil').val();
    eintrag.bezirk = $('#doz_bezirk').val();
    eintrag.bundesland = $('#doz_bundesland').val();
    eintrag.festnetzPrivat = $('#doz_festnetzPrivat').val();
    eintrag.festnetzDienstlich = $('#doz_festnetzDienstlich').val();
    eintrag.mobilPrivat = $('#doz_mobilPrivat').val();
    eintrag.mobilDienstlich = $('#doz_mobilDienstlich').val();
    eintrag.emailPrivat = $('#doz_emailPrivat').val();
    eintrag.emailDienstlich = $('#doz_emailDienstlich').val();
    eintrag.weblink = $('#doz_weblink').val();
    eintrag.dienstst = $('#doz_dienstst').val();
    eintrag.honorar = KuferTools.Utils.Math.stringToFloat($('#doz_honorar').val());
    eintrag.anredetitel = $('#doz_anredetitel').val();
    eintrag.fahrtkostenNachKm = $('#doz_fahrtkostenNachKm:checked').length > 0;

    this.insertSingleEntry(eintrag);
  }

  updateEintragByFormular() {
    const eintrag = this.getMarkedEntry(); // eventuell doch als Parameter oder so übergeben?
    if (eintrag.name != $('#doz_name').val() || eintrag.vorname != $('#doz_vorname').val()) {
      eintrag.id = ''; // Wenn ein Eintrag geändert wird, ist das nicht mehr der aus der Hinterlegung ausgewählte Dozent
    }
    eintrag.name = $('#doz_name').val();
    eintrag.vorname = $('#doz_vorname').val();

    eintrag.strasse = $('#doz_strasse').val();
    eintrag.plz = $('#doz_plz').val();
    eintrag.ort = $('#doz_ort').val();
    eintrag.gemeinde = $('#doz_gemeinde').val();
    eintrag.stadtteil = $('#doz_stadtteil').val();
    eintrag.bezirk = $('#doz_bezirk').val();
    eintrag.bundesland = $('#doz_bundesland').val();
    eintrag.festnetzPrivat = $('#doz_festnetzPrivat').val();
    eintrag.festnetzDienstlich = $('#doz_festnetzDienstlich').val();
    eintrag.mobilPrivat = $('#doz_mobilPrivat').val();
    eintrag.mobilDienstlich = $('#doz_mobilDienstlich').val();
    eintrag.emailPrivat = $('#doz_emailPrivat').val();
    eintrag.emailDienstlich = $('#doz_emailDienstlich').val();
    eintrag.weblink = $('#doz_weblink').val();
    eintrag.dienstst = $('#doz_dienstst').val();
    eintrag.honorar = KuferTools.Utils.Math.stringToFloat($('#doz_honorar').val());
    eintrag.anredetitel = $('#doz_anredetitel').val();
    eintrag.fahrtkostenNachKm = $('#doz_fahrtkostenNachKm:checked').length > 0;

    this.updateEntry(eintrag, this.getMarkedEntryIndex());
  }

  getInsertOrUpdateZeile(name, value, label, isPflichtfeld, zusatz, validationClass, isHidden, isCheckbox, isChecked, maxlength) {
    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }

    var zus = '';
    if (zusatz) {
      zus = zusatz;
    }

    var validation = '';
    if (validationClass) {
      validation = validationClass;
    }

    var hide = '';
    if (isHidden) {
      hide = 'display: none;';
    }

    var checked = '';
    if (isChecked) {
      checked = 'checked';
    }

    var maxLengthHtml = '';
    if (maxlength) {
      maxLengthHtml = 'maxlength="' + maxlength + '"';
    }

    var result = '<div style="position: relative; padding-top: 10px;' + hide + '">' +
      '  <label class="mnlabel" for="doz_' + name + '">' + label + ':</label>';
    if (isCheckbox) {
      result += '  <input type="checkbox" id="doz_' + name + '" value="' + value + '" class="' + pflichtClass + validation + '" ' + checked + '>';
    } else {
      result += '  <input type="text" id="doz_' + name + '" value="' + value + '" class="form-control ' + pflichtClass + validation + '"' + maxLengthHtml + '>';
    }
    result += zus +
      '</div>';

    return result;
  }

  getInsertOrUpdateFormular(entry) {
    var hinterlegungsbuttonAnredetitel = '<button style="cursor:pointer; position: absolute; right: 5px; top: 30px; font-size: 27px; color: #555;" class="no-button-style" type="button">' +
      '<i class="fa fa-hand-o-down hl_anredetitel hinterlegung-button-icon" aria-hidden="true"></i>' +
      '</button>';

    var hinterlegungsbuttonGemeinde = '<button style="cursor:pointer; position: absolute; right: 5px; top: 30px; font-size: 27px; color: #555;" class="no-button-style" type="button">' +
      '<i class="fa fa-hand-o-down hl_gemeinden hinterlegung-button-icon" aria-hidden="true"></i>' +
      '</button>';

    return '<div id="dozentenauswahl_dialog_insertorupdate">' +
      this.getInsertOrUpdateZeile('name', entry.name, 'Name', true, undefined, undefined, undefined, undefined, undefined, 35) +
      this.getInsertOrUpdateZeile('vorname', entry.vorname, 'Vorname', true, undefined, undefined, undefined, undefined, undefined, 35) +

      this.getInsertOrUpdateZeile('anredetitel', entry.anredetitel, 'Anredetitel', false, hinterlegungsbuttonAnredetitel, undefined, undefined, undefined, undefined, 100) +

      this.getInsertOrUpdateZeile('strasse', entry.strasse, 'Straße', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('plz', entry.plz, 'PLZ', false, '', '', true) +
      this.getInsertOrUpdateZeile('ort', entry.ort, 'Ort', false, '', '', true) +

      this.getInsertOrUpdateZeile('gemeinde', entry.gemeinde, 'PLZ Gemeinde', false, hinterlegungsbuttonGemeinde) +
      this.getInsertOrUpdateZeile('stadtteil', entry.stadtteil, 'Stadtteil', false, '', '', true) +
      this.getInsertOrUpdateZeile('bezirk', entry.bezirk, 'Bezirk', false, '', '', true) +
      this.getInsertOrUpdateZeile('bundesland', entry.bundesland, 'Bundesland', false, '', '', true) +

      this.getInsertOrUpdateZeile('festnetzPrivat', entry.festnetzPrivat, 'Festnetz Privat', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('festnetzDienstlich', entry.festnetzDienstlich, 'Festnetz Dienstlich', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('mobilPrivat', entry.mobilPrivat, 'Mobil Privat', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('mobilDienstlich', entry.mobilDienstlich, 'Mobil Dienstlich', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('emailPrivat', entry.emailPrivat, 'E-Mail Privat', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('emailDienstlich', entry.emailDienstlich, 'E-Mail Dienstlich', true, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile('weblink', entry.weblink, 'Weblink', false, undefined, undefined, undefined, undefined, undefined, 100) +
      this.getInsertOrUpdateZeile(
        'dienstst',
        entry.dienstst, (KuferTools.IsSalzburgBildungswerk ?? false) ? 'Referentenbeschreibung kurz' : 'Dienststelle',
        false, undefined,
        undefined, undefined,
        undefined,
        2048
      ) +
      this.getInsertOrUpdateZeile('honorar', KuferTools.Utils.Math.floatToString(entry.honorar), 'Honorar', true, '', 'val_float') +
      this.getInsertOrUpdateZeile('fahrtkostenNachKm', '1', 'Erstattung der Fahrtkosten', false, '', '', false, true, entry.fahrtkostenNachKm) +
      '</div>';
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var myThis = this;

    $('.button_new_dozentenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      const message = myThis.getInsertOrUpdateFormular(myThis.getEmptyEntry());

      const buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#dozentenauswahl_dialog_insertorupdate'))) {
            myThis.insertEintragByFormular();
            myThis.setMarkedEntryToLast();
            $(this).dialog("close");
            myThis.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Neue(n) Referenten/in erstellen'
      });
    });

    $('.button_update_dozentenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      const markedEntry = myThis.getMarkedEntry() ?? undefined;
      if (typeof markedEntry === 'undefined') {
        return;
      }

      const message = myThis.getInsertOrUpdateFormular(myThis.getMarkedEntry());

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#dozentenauswahl_dialog_insertorupdate'))) {
            myThis.updateEintragByFormular();
            $(this).dialog("close");
            myThis.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'ReferentIn ändern'
      });
    });

    $('.button_delete_dozentenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      myThis.deleteEntry(myThis.getMarkedEntryIndex());
      myThis.renderTable();
    });


    $('.button_new_dozentenauswahl_test', this.getSelector4FieldContainer()).on('click', function () {
      KuferTools.Utils.AjaxLadebildschirm.Start();
      var buttons = undefined;

      var dozentenProSeite = KuferTools.TeilnehmerProSeite || 20

      jQuery.post('index.php?tool_id=' + KuferTools.ToolId + '&action=dozentenauswahl', function (data) {
        KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax($(data), 'ReferentIn auswählen', buttons, 'auto', undefined,
          '.dataTable_dozUebersicht', dozentenProSeite, '300px',
          'index.php?tool_id=' + KuferTools.ToolId + '&action=handleDozDataTable&dataTable=1');


        KuferTools.Utils.AjaxLadebildschirm.Stop();
      });
    });

    $(document).on('click', '.choose_doz', function () {
      const dozBase64 = $(this).data('doz');
      const doz = KuferTools.Utils.getObjectFromJsonBase64(dozBase64);

      const buttons = {
        'Honorar festlegen': function () {
          if (KuferTools.ValidateFormInput($('#honorar_festlegen'))) {
            var eintrag = myThis.getEmptyEntry();
            eintrag.id = doz.id;
            eintrag.name = doz.name;
            eintrag.vorname = doz.vorname;

            eintrag.strasse = doz.strasse;
            eintrag.plz = doz.plz;
            eintrag.ort = doz.ort;
            eintrag.gemeinde = doz.gemeinde;
            eintrag.stadtteil = doz.stadtteil;
            eintrag.bezirk = doz.bezirk;
            eintrag.bundesland = doz.bundesland;

            eintrag.festnetzPrivat = doz.festnetzPrivat;
            eintrag.festnetzDienstlich = doz.festnetzDienstlich;
            eintrag.mobilPrivat = doz.mobilPrivat;
            eintrag.mobilDienstlich = doz.mobilDienstlich;
            eintrag.emailPrivat = doz.emailPrivat;
            eintrag.emailDienstlich = doz.emailDienstlich;
            eintrag.weblink = doz.weblink;
            eintrag.dienstst = doz.dienstst;
            eintrag.anredetitel = doz.anredetitel;
            eintrag.honorar = KuferTools.Utils.Math.stringToFloat($('#doz_honorar').val());
            eintrag.fahrtkostenNachKm = $('#doz_fahrtkostenNachKm:checked').length > 0;

            myThis.insertSingleEntry(eintrag);
            myThis.renderTable();

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

      KuferTools.showMessage({
        title: 'Honorar festlegen',
        buttons: buttons,
        meldung: '<div id="honorar_festlegen">' +
          myThis.getInsertOrUpdateZeile('honorar', '', 'Honorar', true, '', 'val_float') +
          myThis.getInsertOrUpdateZeile('fahrtkostenNachKm', '1', 'Erstattung der Fahrtkosten', false, '', '', false, true) +
          '</div>'
      });
    });
  }
}


class DokumenteMnList extends MnListBasis {
  constructor() {
    super();
  }

  getSelector4FieldContainer() {
    return $('#kursplanung_dokumente').parent();
  }

  getEmptyEntry() {
    return {
      id: '',
      beschreibung: '',
      bemerkung: '',
      dateiname: '',
      dateiinhalt: ''
      // Dateiname separat? Ist wohl nicht in Datei enthalten, oder?
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '"><td class="blockimg">' + AryElem.id + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.beschreibung) + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.dateiname) + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular() {
    var eintrag = this.getEmptyEntry();
    eintrag.beschreibung = $('#fileupload_beschreibung').val();
    eintrag.bemerkung = $('#fileupload_bemerkung').val();

    eintrag.dateiname = $('#fileupload_dateiname').val();
    eintrag.dateiinhalt = $('#fileupload_dateiinhalt').val();

    this.insertSingleEntry(eintrag);
  }

  updateEintragByFormular() {
    var eintrag = this.getMarkedEntry();
    eintrag.beschreibung = $('#fileupload_beschreibung').val();
    eintrag.bemerkung = $('#fileupload_bemerkung').val();

    this.updateEntry(eintrag, this.getMarkedEntryIndex());
  }

  getInsertOrUpdateZeile(name, value, label, type, isPflichtfeld) {

    var inputType = 'text';
    if (typeof (type) != 'undefined' && type != '') {
      inputType = type;
    }

    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }

    return '  <div>' +
      '    <label class="mnlabel" for="fileupload_' + name + '">' + label + ':</label>' +
      '    <input type="' + inputType + '" id="fileupload_' + name + '" value="' + value + '" class="form-control' + pflichtClass + '">' +
      '  </div>';
  }

  getInsertFormular(entry) {
    return '<div id="fileupload_dialog_insertorupdate">' +
      this.getInsertOrUpdateZeile('beschreibung', entry.beschreibung, 'Beschreibung', 'text', true) +
      this.getInsertOrUpdateZeile('datei', '', 'Datei', 'file', true) +
      this.getInsertOrUpdateZeile('bemerkung', entry.bemerkung, 'Quelle') +
      '<input type="hidden" name="dateiname" id="fileupload_dateiname">' +
      '<input type="hidden" name="dateiinhalt" id="fileupload_dateiinhalt">' +
      '</div>';
  }

  getUpdateFormular(entry) {
    return '<div id="fileupload_dialog_insertorupdate">' +
      this.getInsertOrUpdateZeile('beschreibung', entry.beschreibung, 'Beschreibung', 'text', true) +
      '  <div>' +
      '    <label class="mnlabel" for="fileupload_datei">Datei:</label>' +
      '    <span class="form-control form_nichtbearbeitbar">' + entry.dateiname + '</span>' +
      '  </div>' +
      this.getInsertOrUpdateZeile('bemerkung', entry.bemerkung, 'Quelle') +
      '</div>';
  }

  initHook() {

    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var dokumenteList = this;

    $('.button_new_dokument', this.getSelector4FieldContainer()).on('click', function () {
      var message = dokumenteList.getInsertFormular(dokumenteList.getEmptyEntry());

      var buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#fileupload_dialog_insertorupdate'))) {
            dokumenteList.insertEintragByFormular();
            dokumenteList.setMarkedEntryToLast();
            $(this).dialog("close");
            dokumenteList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Dokument hinzufügen'
      });

    });

    $('.button_update_dokument', this.getSelector4FieldContainer()).on('click', function () {
      var message = dokumenteList.getUpdateFormular(dokumenteList.getMarkedEntry());

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#fileupload_dialog_insertorupdate'))) {
            dokumenteList.updateEintragByFormular();
            $(this).dialog("close");
            dokumenteList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Dokument ändern'
      });

    });

    $('.button_delete_dokument', this.getSelector4FieldContainer()).on('click', function () {
      dokumenteList.deleteEntry(dokumenteList.getMarkedEntryIndex());
      dokumenteList.renderTable();
    });

    $(document).on('change', '#fileupload_datei', function () {
      // mögliche Fehler vorbäugen?
      var file = this.files[0];
      var fr = new FileReader(); // geht evtl so in IE nicht

      // DateiReader in Utils auslagern?

      fr.onload = function () {
        console.log(fr.result);

        // fr.readAsBinaryString funktioneirt nicht im IE. Daher readAsArrayBuffer verwendet
        // und das ByteArray manuell in ein Binary-String umgewandelt
        var binary = "";
        var bytes = new Uint8Array(fr.result);
        var length = bytes.byteLength;
        for (var i = 0; i < length; i++) {
          binary += String.fromCharCode(bytes[i]);
        }

        $('#fileupload_dateiname').val(file.name);
        $('#fileupload_dateiinhalt').val(base64.encode(binary));
      };

      fr.readAsArrayBuffer(file);

    });
  }
}

class EinsatzbezirkeMnList extends MnListBasis {
  constructor() {
    super();
  }

  getSelector4FieldContainer() {
    return $('#dozent_einsatzbezirkeauswahl').parent();
  }

  getEmptyEntry() {
    return {
      bezirk: ''
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '">' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.bezirk) + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular(value) {
    var eintrag = this.getEmptyEntry();
    eintrag.bezirk = value;

    this.insertSingleEntry(eintrag);
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var einsatzbezirkeList = this;

    $(document).on('click', '#hlbezirke_div .hl_zeile', function () {
      var value = $(this).data("value")[0];
      $("#hlbezirke_div").dialog("close");
      einsatzbezirkeList.insertEintragByFormular(value);
      einsatzbezirkeList.renderTable();
    });

    $('.button_delete_einsatzbezirkeauswahl', this.getSelector4FieldContainer()).on('click', function () {
      einsatzbezirkeList.deleteEntry(einsatzbezirkeList.getMarkedEntryIndex());
      einsatzbezirkeList.renderTable();
    });
  }
}

/**
 * @class
 */
class DozentAusbildungenMnList extends MnListBasis {
  constructor(props) {
    super(props);

  }

  getSelector4FieldContainer() {
    return $('#dozent_ausbildungenauswahl').parent();
  }

  getEmptyEntry() {
    return {
      id: '',
      ausb_stud: '',
      fachrichtung: '',
      abschluss: '',
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '">' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.ausb_stud) + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.fachrichtung) + '</td>' +
      '<td>' + (AryElem.abschluss != 'J' ? '' : '<i class="fas fa-check"></i>') + '</td>' +
      '</tr>';
    return newtr;
  }

  insertEintragByFormular(value) {
    var eintrag = this.getEmptyEntry();
    eintrag.ausb_stud = value[0];
    eintrag.fachrichtung = value[1];
    eintrag.abschluss = value[2];

    this.insertSingleEntry(eintrag);
  }

  updateEintragByFormular(value) {
    var eintrag = this.getMarkedEntry();
    eintrag.ausb_stud = value[0];
    eintrag.fachrichtung = value[1];
    eintrag.abschluss = value[2];

    this.updateEntry(eintrag, this.getMarkedEntryIndex);
  }

  getInsertOrUpdateFormular(entry, showInfo) {
    var hinweis = '';
    if (showInfo) {
      hinweis = '';
    }

    return '<div id="koop_dialog_insertorupdate">' +
      hinweis +
      this.getInsertOrUpdateZeile('ausb_stud', entry.ausb_stud, 'Art', true) +
      this.getInsertOrUpdateZeile('fachrichtung', entry.fachrichtung, 'Fachrichtung', true) +
      this.getInsertOrUpdateZeile('abschluss', entry.abschluss, 'Abschluss', false, '', false, 'checkbox') +
      '</div>';
  }

  getInsertOrUpdateZeile(name, value, label, isPflichtfeld, zusatz, isHidden, type) {
    if (!type) {
      type = 'text';
    }
    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }

    var zus = ''
    if (zusatz) {
      zus = zusatz;
    }

    var hide = ''
    if (isHidden) {
      hide = 'display: none;';
    }

    var checked = '';
    if (type == 'checkbox' && value == "J") {
      checked = 'checked';
    }

    return '  <div style="position: relative;' + hide + '">' +
      '    <label class="mnlabel" for="ausbildung_' + name + '">' + label + ':</label>' +
      '    <input type="' + type + '" id="ausbildung_' + name + '" value="' + value + '" class="form-control' + pflichtClass + '" ' + checked + '>' +
      zus +
      '  </div>';
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    var ausbildungenList = this;

    $(document).on('click', '#hlausbildungen_div .hl_zeile', function () {
      var value = $(this).data("value");
      $("#hlausbildungen_div").dialog("close");
      ausbildungenList.insertEintragByFormular(value);
      ausbildungenList.renderTable();
    });


    $('.button_new_ausbildungenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      var message = ausbildungenList.getInsertOrUpdateFormular(ausbildungenList.getEmptyEntry(), ausbildungenList.getEntryCount() > 0);

      var buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            ausbildungenList.insertEintragByFormular([$('#ausbildung_ausb_stud').val(),
              $('#ausbildung_fachrichtung').val(),
              $('#ausbildung_abschluss').prop('checked') ? 'J' : 'N',
              '']);
            ausbildungenList.setMarkedEntryToLast();
            $(this).dialog("close");
            ausbildungenList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Neue Ausbildung angeben'
      });
    });

    $('.button_update_ausbildungenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      var message = ausbildungenList.getInsertOrUpdateFormular(ausbildungenList.getMarkedEntry(), false, true);

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#koop_dialog_insertorupdate'))) {
            ausbildungenList.updateEintragByFormular([$('#ausbildung_ausb_stud').val(),
              $('#ausbildung_fachrichtung').val(),
              $('#ausbildung_abschluss').prop('checked') ? 'J' : 'N',
              '']);
            $(this).dialog("close");
            ausbildungenList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Qualifikation ändern'
      });

    });

    $('.button_delete_ausbildungenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      ausbildungenList.deleteEntry(ausbildungenList.getMarkedEntryIndex());
      ausbildungenList.renderTable();
    });
  }
}

/**
 * @class
 * @augments MnListBasis
 */
class DozentQualifikationenMnList extends MnListBasis {
  constructor(props) {
    super(props);
  }

  getSelector4FieldContainer() {
    return $('#dozent_qualifikationenauswahl').parent();
  }

  /**
   * @returns {{anbieter: string, qualiid: string, bemerkung: string, id: string, text: string}}
   */
  getEmptyEntry() {
    return {
      id: '',
      qualiid: '',
      text: '',
      bemerkung: '',
      anbieter: '',
    };
  }

  getNewTrElement(AryElem, index, marked) {
    var markedClass = (marked) ? 'mnhighlight' : '';
    var newtr = '<tr class="mnzeile ' + markedClass + '" data-index="' + index + '">' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.text) + '</td>' +
      '<td>' + KuferTools.Utils.htmlEncode(AryElem.bemerkung) + '</td>' +
      '</tr>';
    return newtr;
  }

  getValidQualiId(text, qualiid) {
    if (qualiid === '') {
      return '';
    }

    for (var i = 0; i < KuferToolsHinterlegunghlqualifikationen_div.length; ++i) {
      var data = KuferToolsHinterlegunghlqualifikationen_div[i];
      if (data[1] == qualiid) {
        // Stimmt der Text der Hinterlegung mit dem Qualitextfeld berein?
        return data[0] == text ? qualiid : '';
      }
    }

    return ''; // Referenzierter Eintrag existiert nicht
  };


  getValidQuali(text, quali) {
    if (quali === '') {
      return '';
    }

    for (var i = 0; i < KuferToolsHinterlegunghlqualifikationen_div.length; ++i) {
      var data = KuferToolsHinterlegunghlqualifikationen_div[i];
      if (data[2] == quali) {
        // Stimmt der Text der Hinterlegung mit dem Qualitextfeld überein?
        return data[0] == text ? quali : '';
      }
    }

    return ''; // Referenzierter Eintrag existiert nicht
  }

  updateEintragByFormular() {
    if (KuferTools.ValidateFormInput($('#qualifikationenauswahl_dialog_insertorupdate'))) {
      var eintrag = this.getMarkedEntry();
      eintrag.id = ''; // Alten Eintrag löschen, neuen erstellen
      eintrag.text = $('#qualifikationenauswahl_dialog_insertorupdate #qualifikation_text').val();
      eintrag.qualiid = this.getValidQualiId(eintrag.text, $('#qualifikationenauswahl_dialog_insertorupdate #qualifikation_qualiid').val());
      eintrag.quali = this.getValidQuali(eintrag.text, $('#qualifikationenauswahl_dialog_insertorupdate #qualifikation_quali').val());
      eintrag.bemerkung = $('#qualifikationenauswahl_dialog_insertorupdate #qualifikation_bemerkung').val();
      eintrag.anbieter = $('#qualifikationenauswahl_dialog_insertorupdate #qualifikation_anbieter').val();

      this.updateEntry(eintrag, this.getMarkedEntryIndex());
    }
  }

  getInsertOrUpdateFormular(entry, showInfo) {
    var hinweis = '';
    if (showInfo) {
      hinweis = '';
    }

    return '<div id="qualifikationenauswahl_dialog_insertorupdate">' +
      hinweis +
      this.getInsertOrUpdateZeile('text', entry.text, 'Qualifikation', true) +
      this.getInsertOrUpdateZeile('qualiid', entry.qualiid, '', false, '', true) +
      this.getInsertOrUpdateZeile('quali', entry.quali, '', false, '', true) +
      this.getInsertOrUpdateZeile('bemerkung', entry.bemerkung, 'Bemerkung', false, '', true) +
      this.getInsertOrUpdateZeile('anbieter', entry.anbieter, 'Anbieter', false, '', true) +
      '</div>';
  }

  getInsertOrUpdateZeile(name, value, label, isPflichtfeld, zusatz, isHidden, type, addFieldClass) {
    if (!type) {
      type = 'text';
    }
    if (!addFieldClass) {
      addFieldClass = '';
    }
    var pflichtClass = '';
    if (isPflichtfeld) {
      pflichtClass = ' form_mandatory ';
    }
    if (addFieldClass != '') {
      pflichtClass += ' ' + addFieldClass;
    }

    var zus = ''
    if (zusatz) {
      zus = zusatz;
    }

    var hide = ''
    if (isHidden) {
      hide = 'display: none;';
    }

    return '  <div style="position: relative;' + hide + '">' +
      '    <label class="mnlabel" for="qualifikation_' + name + '">' + label + ':</label>' +
      '    <input type="' + type + '" id="qualifikation_' + name + '" value="' + value + '" class="form-control' + pflichtClass + '">' +
      zus +
      '  </div>';
  }

  insertEintragByFormular(value) {
    const eintrag = this.getEmptyEntry();
    eintrag.text = value[0];
    eintrag.id = value[1];
    eintrag.qualiid = value[2];
    eintrag.bemerkung = value[3];
    eintrag.anbieter = value[4];

    this.insertSingleEntry(eintrag);
  }

  initHook() {

    // TODO evtl in oberKlasse auslagern?
    var $hiddenField = this.getSelector4HiddenField();
    if ($hiddenField.length > 0) {
      this.insertMultipleEntries(KuferTools.Utils.getObjectFromJsonBase64($hiddenField.val()));
      this.renderTable();
    }

    const qualifikationenList = this;

    $(document).on('click', '#hlqualifikationen_div .hl_zeile', function () {
      var value = $(this).data("value");
      $("#hlqualifikationen_div").dialog("close");

      value[3] = ''; // Bemerkung und Anbieter gibt es nicht in der Hinterlegung
      value[4] = '';

      qualifikationenList.insertEintragByFormular(value);
      qualifikationenList.renderTable();
    });

    $('.button_update_qualifikationenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      var message = qualifikationenList.getInsertOrUpdateFormular(qualifikationenList.getMarkedEntry(), false, true);

      var buttons = {
        'Ändern': function () {
          if (KuferTools.ValidateFormInput($('#qualifikation_dialog_insertorupdate'))) {
            qualifikationenList.updateEintragByFormular();
            $(this).dialog("close");
            qualifikationenList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Qualifikation ändern'
      });

    });

    $('.button_new_qualifikationenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      var message = qualifikationenList.getInsertOrUpdateFormular(qualifikationenList.getEmptyEntry(), qualifikationenList.getEntryCount() > 0, false);

      var buttons = {
        'Einfügen': function () {
          if (KuferTools.ValidateFormInput($('#qualifikationenauswahl_dialog_insertorupdate'))) {
            var text = $('#qualifikation_text').val();
            qualifikationenList.insertEintragByFormular([text,
              qualifikationenList.getValidQualiId(text, $('#qualifikation_qualiid').val()),
              qualifikationenList.getValidQuali(text, $('#qualifikation_quali').val()),
              $('#qualifikation_bemerkung').val(),
              $('#qualifikation_anbieter').val()]);
            qualifikationenList.setMarkedEntryToLast();
            $(this).dialog("close");
            qualifikationenList.renderTable();
          }
        },
        'Abbrechen': function () {
          $(this).dialog("close");
        }
      };

      KuferTools.showMessage({
        meldung: message,
        buttons: buttons,
        title: 'Neue Qualifikation angeben'
      });
    });

    $('.button_delete_qualifikationenauswahl', this.getSelector4FieldContainer()).on('click', function () {
      qualifikationenList.deleteEntry(qualifikationenList.getMarkedEntryIndex());
      qualifikationenList.renderTable();
    });
  }
}