 /**
 *  Stellt Methoden und  Handler für das Weitermelden und Ummelden im Tool Kurse MA ( Kursdetails / Reiter Teilnehmer ) bereit. Funktionen 
 *  - Beim Klick auf Button weitermelden öffnet sich ein jQuery Anzeige Dialog, der die zum Weitermelden ausgewählten Teilnehmer anzeigt.
 *  
 *  
 *  - Beim Klick auf Button ummelden öffnet sich zunächst ein dialog zur Auswahl des Folgekurses; klickt man
 *    dann auf das Symbol zur Kursauswahl, so öffnet sich ein jQuery Anzeige Dialog, der die für da Ummelden ausgewählten 
 *    Teilnehmer anzeigt. 
 *    
 *  - Sind bereits Teilnehmer im Folgekurs vorhanden, so erscheint beim Um- u. Weitermelden (vor Ausgabe des Anzeigedialogs)
 *    eine eine Sequenz von Bestätigungsdialogen (pro im Folgekurs vorhandenem Teiln. 1 Dialog), um zu bestätigen, ob der Teilnehmer
 *    wirklich um- bzw. weitergemeldet werden soll.
 *    
 * - Beim Bestätigen des Dialogs wird ein Request mit den ausgewählten Teilnehmerobjekten an den Server geschickt und dort 
 *   entspr. verarbeitet (in handleUmmeldenTN() bzw. handleWeitermeldenTN()).
 *    
 */  
 
 // jQuery(function() {  oder
 $(document).ready( function() {
 
   //Dialog zur Kursauswahl für das Ummelden initialisieren (und zwar schon beim Laden der Seite)
   var $kursauswahlDialog = $('.kurs_uebersicht_dialog');
   initKursAuswahlDialog4Ummelden($kursauswahlDialog);
   initKursAuswahlDialog4Weitermelden($kursauswahlDialog);
   $kursauswahlDialog.detach();
 
 // Klickhandler zum Anzeigen des Ummeldedialogs nach dem Auswählen des Kurses (im Data-Tables Dialog)
 jQuery(document).on('click', '.ummeldeKurs', function() {
   
   var $aktButton = jQuery(this);
   var selectedBelegIds = KuferTools.GetSelectedIds();  //Array-Objekt
   // id lautet z.B. 121-3205 d.h. id enthält die Kursnr
   var ummeldeKurs = $aktButton.prop('id');
  
   var ajaxData = { kurs: KuferTools.KursDetails.Kurs.Knr, 
                    ummeldekurs: ummeldeKurs, 
                    belegIds: selectedBelegIds };
    
   // var testdata = KuferTools.Utils.getJsonFromObject(ajaxData);
    var $dialog = $('.kurs_uebersicht_dialog');
    $dialog.dialog('close');
    $dialog.detach(); 
    
    
    var ajaxLink = 'usertools.php?tool_id=' +  KuferTools.ToolId +  '&toolsection_id=' + KuferTools.ToolSectionId + '&currentIndex=' + KuferTools.CurrentIndex + '&action=ummeldenTN';
    //TODO: Teilnehmer zu den selektierten Belegungs Ids per Ajax ermitteln
    // zusätzlich Kursgebühren (teilnehmerabhängig für den Folgekurs ermitteln) in Tool 8; section: 377
    
    KuferTools.Utils.AjaxLadebildschirm.Start();
     
    // var tnDisplayAry = [];
     //Ajax-Handling (entspricht jQuery.Ajax) zum Anfordern der benötigten Teilnehmerdaten
    jQuery.post(ajaxLink, ajaxData, function(msg) {
      //SuccessHandling beim Empfang der Ajax-Response vom Server 
      
      
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      
      var responseData = KuferTools.Utils.getObjectFromJson(msg);
      // Enthält Objekte der Form
      //array('id' => $teilnehmer->id, 'name'=> $teilnehmer->name,'vorname'=> $teilnehmer->vorname, 'strasse'=> $teilnehmer->strasse, 
      //     'ort'=> $teilnehmer->ort, 'isInFolgeKurs'=>$isInFolgeKurs, 'gebuehr'=>$gebuehr, 'vonBelegId'=>$belId)
      KuferTools.KursDetails.handleAjaxResponse4UmOrWeiterMelden('ummelden',responseData, KuferTools.KursDetails.TabId, ummeldeKurs);
    }); //end $post(..)
     
 }); //end jQuery('.ummeldeKurs').live(...)
 
 jQuery(document).on('click', '.weitermeldeKurs', function() {
   var tabId = KuferTools.Utils.Tabs.GetIdFromActiveTab();
   var folgekurs = $(this).prop('id');
   KuferTools.KursDetails.showWeitermeldenDialog(tabId, KuferTools.KursDetails.Kurs.Knr, folgekurs);
 });
 
  /**
   * Weitermelden eines Teilnehmers
   * Klick auf den Weitermeldebutton öffnet einen Dialog, in dem noch einmal die gewählten Teilnehmer angezeigt werden
   *  und die Weitermeldung via Formular abgesendet werden kann (vgl. maanmelden.js )
   */
  jQuery(document).on('click', "#teilnehmerWeitermelden", function() {
    var tabId = $(this).parents('.content.tab').prop('id');
    KuferTools.KursDetails.showWeitermeldenDialog(tabId, KuferTools.KursDetails.Kurs.Knr, KuferTools.KursDetails.Kurs.Folgekurs);
  });
 
 KuferTools.KursDetails.showWeitermeldenDialog = function(tabId, aktKnr, folgeKnr){
    var selectedBelegIds = KuferTools.GetSelectedIds(); //Array-Objekt
    if (selectedBelegIds.length < 1) {
      showMessage('Es muss mindestens ein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' markiert werden.', 'Achtung');
      return false;
    } 
    
    var ajaxData = { kurs: aktKnr, 
                     folgekurs: folgeKnr, 
                     belegIds: selectedBelegIds };
    
   // var testdata = KuferTools.Utils.getJsonFromObject(ajaxData);
    
    var ajaxLink = 'usertools.php?tool_id=' +  KuferTools.ToolId +  '&toolsection_id=' + KuferTools.ToolSectionId + '&currentIndex=' + KuferTools.CurrentIndex + '&action=weitermeldenTN';
    //TODO: Teilnehmer zu den selektierten Belegungs Ids per Ajax ermitteln
    // zusätzlich Kursgebühren (teilnehmerabhängig für den Folgekurs ermitteln) und ggf. Newsletterinfos des TN
    //Tool 8; section: 377
    // var ajaxData= 'tool_id=' +  KuferTools.ToolId +  '&toolsection_id=' + KuferTools.ToolSectionId + '&action=weitermeldenTN'; 
     //       '&kurs=' + kurs + '&folgekurs=' + folgekurs + '&belegIds[]=' + ;
    
    KuferTools.Utils.AjaxLadebildschirm.Start();
    
    // var tnDisplayAry = [];
     //Ajax-Handling (entspricht jQuery.Ajax) zum Anfordern der benötigten Teilnehmerdaten
    jQuery.post(ajaxLink, ajaxData, function(msg) {
      //SuccessHandling beim Empfang der Ajax-Response vom Server  
      
      
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      
      var responseData = KuferTools.Utils.getObjectFromJson(msg);
      // Enthält Objekte der Form
      //array('id' => $teilnehmer->id, 'name'=> $teilnehmer->name,'vorname'=> $teilnehmer->vorname, 'strasse'=> $teilnehmer->strasse, 
      // 'ort'=> $teilnehmer->ort, 'isInFolgeKurs'=>$isInFolgeKurs, 'newsLetter'=>$newsLetter, 'gebuehr'=>$gebuehr)
      KuferTools.KursDetails.handleAjaxResponse4UmOrWeiterMelden('weitermelden', responseData, tabId, folgeKnr);

   }); //end jQuery.post (Ajax Call)
   
 };
 
 /**
   * Handelt die AjaxResponse für das Ummelden bzw. Weitermelden
   * Gibt zunächst zu allen Teilnehmer, die bereits im Folgekurs angemeldet sind, einen Dialog mit der Frage aus,
   * ob dieser Teiln. umgemeldet bzw. weitergemeldet werden soll. startet dann via Methode showMeldeDialog(.) den Dialog 
   * zur Ausgabe der weiter - bzw. umzumeldenden Teilnehmer  
   * 
   * @param string pAction 'ummelden' oder 'weitermelden'
   * @param Array(TeilnehmerObjekt) pData
   * @param int $pTabId
   * @param string pUmmeldeKurs
   */
  KuferTools.KursDetails.handleAjaxResponse4UmOrWeiterMelden = function(pAction, pData,  $pTabId, pZielKurs) {
    try {
      
      // pData enthält bereits das passende Array von teilnehmerObjekten der Form  { tnId: 895,  vorname: 'Hans' , name:  'Huber', 
      // 'vonBelegId'=>24994, isInFolgeKurs:  false,  newsLetterAnzeige: true}, wobei Newsletterinfos nur für das 
      // Weitermelden enthalten sind. Das Array wurde bereits in der Ajax Response Methode _handleAjaxUmOrWeitermeldenTN() zusammengebaut .
      
      var tnIndex = 0; //wg Rekursionsaufrufs
      // Jetzt Rekursiv das MeldeTnObjAry - Array der Teiln. die nach den User Interaktionen noch für die Weitermeldung übrig bleiben -
      // aufbauen; diese globale Variable könnte auch als Parameter übergeben werden
      KuferTools.KursDetails.meldeTnObjAry = [];
      var newKurs = pZielKurs;
      KuferTools.KursDetails.handleConfirmDialogFolge(pData.teilnehmer, tnIndex, pAction, $pTabId, newKurs, pData.xsrf, pData.kurseInfos);
      // ruft dann u.a. den Dialog zum Um- bzw. Weitermelden auf via: 
      // KuferTools.KursDetails.showMeldeDialog(pAction, pData,  $pTabId, pUmmeldeKurs);  

    } //end try
    catch(e) {
      showMessage(e.message,e.name + ' Exception');
    }      
  };  //end handleAjaxResponse4UmOrWeiterMelden
 
 
  /**
   * Baut rekursiv das Array von Teiln. Objekten für die Um- bzw. Weitermeldung via User Interaktionen auf
   * Gibt für den User eine Folge von Bestätigungsdialogen aus, um die Teiln. für die UM-/Weitermeldung auszuwählen;
   * ein Dialog erscheint nur, wenn ein Teil bereits im Folgekurs enthalten ist; ansonsten wird der Teiln. ins Array
   * für die Weiter-/Ummeldung aufgenommen
   * 
   * @param Array(TeilnehmerObjekt) pTnAry 
   * @param int pIndex
   * @param string pAction 'ummelden' oder 'weitermelden'
   * @param int $pTabId
   * @param string pNewKurs Kurs zu dem hin um- oder weitergmeldet wird
   * @param string pXsrf
   * @param Array pKurseInfos
   */
  KuferTools.KursDetails.handleConfirmDialogFolge = function (pTnAry, pIndex, pAction, $pTabId, pNewKurs, pXsrf, pKurseInfos) {
    var teilnObj = pTnAry[pIndex];
    
    var  hinweis = 'Teilnehmer ' + teilnObj.name + ', ' + teilnObj.vorname + ' ist bereits im Kurs ' + 
         pNewKurs + ' enthalten. Trotzdem ' +  pAction + '?';
             
    var buttons =  { 'Ja' : function() {
                                 //Bei Erscheinen des Dialogs mit den Buttons ist das Teiln. Objekt bereits im Folgekurs
                                 KuferTools.KursDetails.meldeTnObjAry.push(teilnObj);
                                 $(this).dialog("close");
                                 //Rekursion: nächstes TN Objekt, nur falls da letzte Array Element noch nicht erreicht wurde
                                 if (pIndex < pTnAry.length - 1)
                                   KuferTools.KursDetails.handleConfirmDialogFolge(pTnAry, pIndex + 1, pAction, $pTabId,  pNewKurs, pXsrf, pKurseInfos);
                                 else {
                                   if (KuferTools.KursDetails.meldeTnObjAry.length > 0)   
                                     // Nach Bestätigen des Dialogs für den letzten Teiln. zum Dialog für UM- bzw. Weitermelden weiterleiten
                                     KuferTools.KursDetails.showMeldeDialog(pAction,  $pTabId,  pNewKurs, pXsrf, pKurseInfos);
                                   else
                                     showMessage('Es wurde kein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' zum ' + KuferTools.Utils.ucFirst(pAction) + ' ausgewählt.', 'Achtung');
                                 }
                           },
              
                      'Nein' : function() {
                                 //Bei Erscheinen des Dialogs mit den Buttons ist das Teiln. Objekt bereits im Folgekurs
                                 $(this).dialog("close");
                                 //Rekursion: nächstes TN Objekt, nur falls da letzte Array Element noch nicht erreicht wurde
                                 if (pIndex < pTnAry.length - 1)
                                   KuferTools.KursDetails.handleConfirmDialogFolge(pTnAry, pIndex + 1, pAction, $pTabId, pNewKurs, pXsrf, pKurseInfos);
                                 else {
                                   if (KuferTools.KursDetails.meldeTnObjAry.length > 0)     
                                     // Nach Bestätigen des Dialogs für den letzten Teiln. zum Dialog für UM- bzw. Weitermelden weiterleiten
                                     KuferTools.KursDetails.showMeldeDialog(pAction,  $pTabId, pNewKurs, pXsrf, pKurseInfos);
                                   else
                                     showMessage('Es wurde kein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' zum ' + KuferTools.Utils.ucFirst(pAction) + ' ausgewählt.', 'Achtung');
                                 }
                                 
                      } 
                    }; //end buttons          

    //Ausgabe des einzelnen Bestätigungsdialogs; der via Dialog Interaktionen mit dem User ermöglicht
    if (teilnObj.isInFolgeKurs)
      //Weitere Verarbeitung und damit Rekursion erfolgt im Bestätigungsdialog, nach Klicken eines Buttons 
      showMessage(hinweis, KuferTools.Spracheinstellungen.Teilnehmer.Plural.Akkusativ + ' ' + pAction, buttons, 750);
    else {
      //Teiln.  Objekt in jedem Fall mit ins array aufnehmmen
      KuferTools.KursDetails.meldeTnObjAry.push(teilnObj);
      //Rekursion: Gleich ohne Bestätigungsdialog zum nächsten Teilnehmer weitergehen
      if (pIndex < pTnAry.length - 1)  
        
        KuferTools.KursDetails.handleConfirmDialogFolge(pTnAry, pIndex + 1, pAction, $pTabId, pNewKurs, pXsrf, pKurseInfos);
      else {  //ende der Rekursion
        // Nach Aufnahme des letzten  Teiln. Objekts ins Array:  zum Dialog für UM- bzw. Weitermelden weiterleiten
        if (KuferTools.KursDetails.meldeTnObjAry.length > 0)     
          KuferTools.KursDetails.showMeldeDialog(pAction,  $pTabId, pNewKurs, pXsrf, pKurseInfos);
        else
          showMessage('Es wurde kein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' zum ' + KuferTools.Utils.ucFirst(pAction) + ' ausgewählt.', 'Achtung');
      } //end else 
    }

  }; //end handleConfirmDialogFolge(..)
 
 
 
  /**
   * Gibt den Dialog für das Ummelden bzw. Weitermelden aus
   * Listet die Teilnehmer für das Weitermelden in einer Tabelle auf und sendet das Formular
   * beim Klick auf Button Weitermelden ab
   * @param string pAction 'ummelden' oder 'weitermelden'
   * @param int $pTabId
   * @param string pNewKurs Zielkurs für die Um- bzw. Weitermeldung
   * @param string pXsrf
   * @param Array pKurseInfos
   * @returns Boolean
   */
  KuferTools.KursDetails.showMeldeDialog = function(pAction, $pTabId, pNewKurs, pXsrf, pKurseInfos) {
    try {
      
      // KuferTools.KursDetails.meldeTnObjAry enthält bereits  das passende Array mit den via Userinteraktion ausgewählten Teilnehmer
      // Objekten; diese haben die Form { tnId: 895,  vorname: 'Hans' , name:  'Huber',  'vonBelegId'=>24994, isInFolgeKurs:  false,   
      //  newsLetterAnzeige: true}, wobei Newsletterinfos nur für das Weitermelden enthalten sind. 
      //Global speichern, weil durch Klickhandler die Checkbox Werte für newsletter verändert werden

     var meldeFormClass = 'weitermeldeformular';
     if (pAction === 'ummelden') {          // && pUmmeldeKurs !== '')
       //der Parameter soll nicht in die History für die URL aufgenommen werden; damit wird das Ausgeben einer Statusmeldung
       // nach Rückkehr von einer anderen Seite verhindert ((siehe ToolsAPI::setHistoryEntry))
       meldeFormClass = 'ummeldeformular'; 
     }
      
      //Klick auf Button Weitermelden: Abschicken des formulars mit den Teilnehmerdaten
      var buttons = {};
      // Der Funktionsaufruf für Buttons liefert z.B. buttons['Weitermelden'] (Achtung: die anonyme Fkt. muß via () auch 
      // aufgerufen werden also z.B. function() {.... } ()
      buttons[function() { return KuferTools.Utils.ucFirst(pAction); } ()] = function() {
        // var buttons = { 'Weitermelden': function() {
        //es reicht nicht,  die Teilnehmer Ids mitzuschicken, zumindest die Info inFolgeKurs ist nötig
        var isOk = true;
        jQuery('.austritt, .eintritt').each(function () {
          isOk = validateInput( $(this) ) && isOk;
        });
        if (!isOk) {
          showMessage('Bitte geben Sie die Daten im Format dd.mm.yyyy an.', 'Hinweis', undefined, 'auto');
          //Beim Umzug zu den responsiven Tools das hier verwenden:
          //KuferTools.showMessage({meldung: 'Bitte geben Sie das Datum im Format dd.mm.yyyy an.', title: 'Hinweis', width: 'auto'});
        }
        else {
          var teilnehmerObjAry = KuferTools.KursDetails.meldeTnObjAry;
          
          var xsrf = '&xsrf='+pXsrf;
          var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + xsrf + '#' + $pTabId;
          
          var postObj = { ummeldenTN_nohistory: 1, knr: pNewKurs, teilnehmerObjAry: KuferTools.Utils.getJsonFromObjectBase64( teilnehmerObjAry ) };
          //BUG-Fix zum Test von p14714 (Weitermelden): Link zum Weitermelden korrigiert
          if (pAction == 'weitermelden') {
            postObj = { weitermeldenTN_nohistory: 1, knr: pNewKurs, teilnehmerObjAry: KuferTools.Utils.getJsonFromObjectBase64( teilnehmerObjAry ) };
          }
          
          KuferTools.Utils.AjaxLadebildschirm.Start();
          
          KuferTools.Utils.Post(actionLink, postObj);
          
          $(this).dialog("close");
        }
      };
      buttons['Abbrechen'] = function(){ $(this).dialog('close'); };
      
      //statt:
      /***
       var buttons = { Weitermelden: function() {
                       .... 
                      },
                      'Abbrechen' : function(){ $(this).dialog('close'); }
                    }; //end buttons   ***/
          
      // Aufbau der Tabelle mit den usgewählten Teilnehmerobjekt Einträgen für die Ausgabe
      var meldeTable = 'dialogTNWeitermelden';
      var meldeText = 'die Weitermeldung an den Folgekurs ';
      if ( pAction === 'ummelden' ) { 
        meldeTable = 'dialogTNUmmelden';
        meldeText = 'die Ummeldung nach Kurs ';
      }
      var inhalt = '<div class="meldeDialogText">Folgende ' + KuferTools.Spracheinstellungen.Teilnehmer.Plural.Akkusativ + 
                   ' sind für ' + meldeText +  pNewKurs + ' ausgew&auml;hlt: </div>'; 
      inhalt += "<table id='" + meldeTable + "'>";
      //inhalt += "<tr><th colspan='5'></th></tr>\n";
      inhalt += "<tr><th>Nr.</th><th>Name</th><th>Vorname</th><th>bereits <br /> angemeldet</th><th>Geb&uuml;hr</th>"; 
      // IOm weitermeldedialog zusätzlich Newletterinfos ausgeben
      if (pAction === 'weitermelden') {
        inhalt += "<th>Newsletter <br /> derzeit</th><th>Newsletter <br /> zulassen</th>";
      }
      if (pKurseInfos.alterKursHatAboGebuehren && pAction === 'ummelden') {
        inhalt += "<th>Austritt<br />(alter Kurs)</th>";
      }
      if (pKurseInfos.neuerKursHatAboGebuehren) {
        var zusatz = pAction === 'ummelden' ? '(neuer Kurs)' : '';
        inhalt += "<th>Eintritt<br />" + zusatz + "</th>";
      }
      inhalt += "</tr>\n";
      
      for (var tnIndex in KuferTools.KursDetails.meldeTnObjAry) {    
        //nur anhängen, falls es eine eigene Eigenschaft ist z.B. 0,1,..; schließt irgendwelche ererbten
        //Prototypen Eigenschaften aus
       
        if (KuferTools.KursDetails.meldeTnObjAry.hasOwnProperty(tnIndex)) {
          var tnObj = KuferTools.KursDetails.meldeTnObjAry[tnIndex];   
          //Newsletterinfos nur im Falle einer Weitermeldung ausgeben
          if (pAction === 'weitermelden') {
            var checked = '';
            // if (tnObj.newsLetter === 'erlaubt')
            if (tnObj.newsLetterAllow === 'J')
              checked = 'checked="checked"';    
            var newsLetterCheckbox = '<input id="' + tnObj.id + '" type="checkbox" name="newsl_erlaubt" ' + checked + '>';
          } //end if (pAction ...)
          inhalt  += "<tr><td>"  + tnObj.id + "</td><td>" + tnObj.name + "</td><td>"  + tnObj.vorname   + 
                       "</td><td>" + (tnObj.isInFolgeKurs?'ja':'nein') + "</td><td>"  + 
                       tnObj.gebuehr + "&nbsp;&euro;</td>";
               // (tnObj.isInFolgeKurs===true?'ja':'nein')
          //Newsletterinfos nur im Falle einer Weitermeldung ausgeben
          if (pAction === 'weitermelden') {
            inhalt  += "<td>" + (tnObj.newsLetter?'erlaubt':'storniert') + "</td><td>"  +  newsLetterCheckbox + "</td>";
          }
          if (pKurseInfos.alterKursHatAboGebuehren && pAction === 'ummelden') {
            inhalt += '<td><input type="text" id="austritt_' + tnObj.id + '" class="val_date" name="austritt" maxlength="10" style="width: 80px;"></td>';
          }
          if (pKurseInfos.neuerKursHatAboGebuehren) {
            inhalt += '<td><input type="text" id="eintritt_' + tnObj.id + '" class="val_date" name="eintritt" maxlength="10" style="width: 80px;"></td>';
          }
          inhalt  +=  "</tr>\n";   
        }
      } //end for (var tnIndex...)
      inhalt += "</table>\n";
      
      //pAction ist weitermelden oder ummelden
      showMessage(inhalt, KuferTools.Spracheinstellungen.Teilnehmer.Plural.Akkusativ + ' ' + pAction, buttons, 750); 
    
      //ist notwendig, damit die Seite nicht neu geladen wird und der Showmessage Dialog stehen bleibt
      return false;
    } //end try
    catch(e) {
      showMessage(e.message,e.name + ' Exception');
    }      
  }; //end showMeldeDialog(..)
 
  //Changehandler zum Ändern der Newsletter-Einträge im Array der Teilnehmerobjekte, das als Response zurückgeschickt wird
  jQuery(document).on('change', '#dialogTNWeitermelden input[type=checkbox]', function() {
    
    try {  
      var $this = jQuery(this);
      var aktIndex = -1;
      var aktId = $this.prop('id'); // z.B. 897
      
      //Ermittelt den Index zum Teilnehmerobjekt der angehakten Checkbox für die Spalte "Newsletter zulassen" im Dialog
      $.each(KuferTools.KursDetails.meldeTnObjAry, function(index,tnObj) {
        //hier: tnObj ist ein TN Objekt der Form  { id: 877, vorname:'Hans', name: 'huber' , strasse: 'Erlstr.' , newsletter: 'ja',...};
        if (aktId === tnObj.id ) {
          aktIndex = index;
          //false bricht die Schleife ab
          return false;
        }
      }); //end $.each(selTeilnehmerIds...
      
      //Falls keine passender Index gefunden wurde => Exception
      if (aktIndex === -1) {
        //Abbruch mit Exception
        throw { name:'IndexError', message: 'ID der markierten Checkbox konnte nicht gefunden werden.' }; 
      }
      //Das aktuelle TeilnehmerObjekt umbesetzen; dieses wird ja im Formular an den Server gesendet und dort in Methode
      //_handleWeitermeldenTN() (in toolmitarbeiter) verarbeitet
      var aktTnObj = KuferTools.KursDetails.meldeTnObjAry[aktIndex];
      if( $this.is(':checked')) {    //statt:  if ($this.prop('checked'));
        aktTnObj.newsLetterAllow = 'J';
      }
      else {
        //Wenn's hier nicht erlaubt wird, ist ja im Fall von 'K' und '' schon richtig vorbesetzt  
        if ( aktTnObj.newsLetterAllow === 'J') {
          aktTnObj.newsLetterAllow = '';
        }
      }
    } //end try
    catch(e) {
      console.log(e.name + ' Exception: ' + e.message);
      var $dialogText = $('.meldeDialogText');
      var warnung = '<div class="faultmess">Achtung: Das Setzen des Hakens für "Newsletter zulassen" funktioniert nicht korrekt.</div>';
      //Warnausgabe vorne hinhängen
      $dialogText.before(warnung);
    }
  }); // end Changehandler zum Ändern der Newslettereinträge
  
  //Changehandler zum Hinzufügen von Eintritt/Austritt im Array der Teilnehmerobjekte, das als Response zurückgeschickt wird
  jQuery(document).on('change', 'input[id^="eintritt_"], input[id^="austritt_"]', function () {
    try {
      var $this = jQuery(this);
      var aktIndex = -1;
      var aktId = $this.prop('id').split('_')[1]; // z.B. 897
      var name = $this.prop('name');
      
      //Ermittelt den Index zum Teilnehmerobjekt der angehakten Checkbox für die Spalte Eintritt und/oder Austritt im Dialog
      jQuery.each(KuferTools.KursDetails.meldeTnObjAry, function(index,tnObj) {
        //hier: tnObj ist ein TN Objekt der Form  { id: 877, vorname:'Hans', name: 'huber' , strasse: 'Erlstr.' , eintritt: '', ... };
        if (aktId === tnObj.id ) {
          aktIndex = index;
          return false; //false bricht die Schleife ab
        }
      }); //end $.each(selTeilnehmerIds...
      
      //Falls keine passender Index gefunden wurde => Exception
      if (aktIndex === -1) {
        //Abbruch mit Exception
        throw { name:'IndexError', message: 'ID der markierten Checkbox konnte nicht gefunden werden.' }; 
      }
      //Das aktuelle TeilnehmerObjekt umbesetzen; dieses wird ja im Formular an den Server gesendet.
      var aktTnObj = KuferTools.KursDetails.meldeTnObjAry[aktIndex];
      var value = $this.val();
      if (name === 'eintritt') {
        aktTnObj.eintritt = value;
      } else if (name === 'austritt') {
        aktTnObj.austritt = value;
      }
    } //end try
    catch(e) {
      console.log(e.name + ' Exception: ' + e.message);
      var $dialogText = $('.meldeDialogText');
      var warnung = '<div class="faultmess">Achtung: Das Setzen des Eintritts-/Austrittsdatums funktioniert nicht korrekt.</div>';
      //Warnausgabe vorne hinhängen
      $dialogText.before(warnung);
    }
  }); //end Changehandler
}); //end ready()
 
 
 /**
 * Initialisiert den Dialog für die Kursauswahl zum Ummelden von Teilnehmern.
 * 
 * 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 initKursAuswahlDialog4Ummelden($kursAuswahlDialog)
{
  var $dialog = $kursAuswahlDialog;
  var buttons = { 'Abbrechen' : function() { $(this).dialog("close"); } };
 
  // Klick auf Ummelden öffnet einen Dialog zum Auswählen der Kurse, der via Datatables und AjaxRequest die 
  // Kursmenge einschränkt (vgl. maanmelden.js,  button_span.maAnmeld_KursDiv_KursAuswahl )
  jQuery(document).on('click', "#teilnehmerUmmelden", function() {

    //Var. global setzen, da sie für den Klickhandler zum Auswählen des Kurses gebraucht wird 
    KuferTools.KursDetails.TabId = $(this).parents('.content.tab').prop('id');
    var selectedBelegIds = KuferTools.GetSelectedIds(); //Array-Objekt
    if (selectedBelegIds.length < 1) {
      showMessage('Es muss mindestens ein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' markiert werden.', 'Achtung');
      return false;
    }
    //showMessageWithDataTable4Ajax = function ( pMessage, pTitle, pButtons, pWidth, pPosition, pDataTable, pDataPerPage, pScrollY, pUrl4Ajax )
    // im Gegensatz. zum Anmelden wird beim Ummelden die action=Ummelden mitgeschickt umd im Dialog nach Klick auf den Button
    // für die Auswahl eines einzelnen Kurses einen Dialog zu erzwingen (statt einer Ausgabe im Anmeldefenster von Tool 6)
    // Kurse zur Auswahl für's Ummelden werden aus Tool6; section 19 angefordert (d.h. auch dortige Z.E.gelten)
    var ajaxUrl = 'usertools.php?tool_id=' + KuferTools.ToolId4KursAuswahl + '&toolsection_id=' + KuferTools.ToolSectionId4KursAuswahl + 
       '&dataTable=1&action=Ummelden';
    
    //Fordert die Kursdaten per Ajax u. Datatable von Tool 6 und Toolsection 19 (Kursübersicht im Anmeldetool) an
    KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax( $dialog.clone(), 'Kursauswahl', buttons, 680, undefined,
       '.dataTable_kursUebersicht', KuferTools.KurseProSeite, '300px', ajaxUrl );
  
  // In dem angezeigten Dialog wird je Kurs in der 1ten Spalte ein Symbol zum Auswählen des Kurses für die Ummeldung ausgegeben; dieses 
  // hat die Klasse ummeldeKurs -> weiterer Dialog zum Ummelden via Klickhandler auf Klasse ummeldeKurs. 
  });
  
} // initKursAuswahlDialog4Ummelden

 /**
 * Initialisiert den Dialog für die Kursauswahl zum Weitermelden von Teilnehmern.
 * 
 * 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 initKursAuswahlDialog4Weitermelden($kursAuswahlDialog)
{
  var $dialog = $kursAuswahlDialog;
  var buttons = { 'Abbrechen' : function() { $(this).dialog("close"); } };
 
  // Klick auf Ummelden öffnet einen Dialog zum Auswählen der Kurse, der via Datatables und AjaxRequest die 
  // Kursmenge einschränkt (vgl. maanmelden.js,  button_span.maAnmeld_KursDiv_KursAuswahl )
  jQuery(document).on('click', "#teilnehmerWeitermelden_kursauswahl", function() {

    //Var. global setzen, da sie für den Klickhandler zum Auswählen des Kurses gebraucht wird 
    KuferTools.KursDetails.TabId = $(this).parents('.content.tab').prop('id');
    var selectedBelegIds = KuferTools.GetSelectedIds(); //Array-Objekt
    if (selectedBelegIds.length < 1) {
      showMessage('Es muss mindestens ein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' markiert werden.', 'Achtung');
      return false;
    }
    //showMessageWithDataTable4Ajax = function ( pMessage, pTitle, pButtons, pWidth, pPosition, pDataTable, pDataPerPage, pScrollY, pUrl4Ajax )
    // im Gegensatz. zum Anmelden wird beim Ummelden die action=Ummelden mitgeschickt umd im Dialog nach Klick auf den Button
    // für die Auswahl eines einzelnen Kurses einen Dialog zu erzwingen (statt einer Ausgabe im Anmeldefenster von Tool 6)
    // Kurse zur Auswahl für's Ummelden werden aus Tool6; section 19 angefordert (d.h. auch dortige Z.E.gelten)
    var ajaxUrl = 'usertools.php?tool_id=' + KuferTools.ToolId4KursAuswahl + '&toolsection_id=' + KuferTools.ToolSectionId4KursAuswahl + 
       '&dataTable=1&action=Weitermelden'
    
    //Fordert die Kursdaten per Ajax u. Datatable von Tool 6 und Toolsection 19 (Kursübersicht im Anmeldetool) an
    KuferTools.Utils.DataTables.showMessageWithDataTable4Ajax( $dialog.clone(), 'Kursauswahl', buttons, 680, undefined,
       '.dataTable_kursUebersicht', KuferTools.KurseProSeite, '300px', ajaxUrl );
  
    // Falls der Folgekurs gesetzt ist, wird der Filter mit diesem vorbelegt.
    if(KuferTools.KursDetails.Kurs.Folgekurs !== '') {
      var knrAb = KuferTools.KnrAbStelle - 1; // KnrAbStelle startet mit 1, nicht 0
      $('#kurs_search_knr').val(KuferTools.KursDetails.Kurs.Folgekurs.substr(knrAb));
      $('.kurs_search_start.dataTableSearchButton').click();
    }
  // In dem angezeigten Dialog wird je Kurs in der 1ten Spalte ein Symbol zum Auswählen des Kurses für die Ummeldung ausgegeben; dieses 
  // hat die Klasse ummeldeKurs -> weiterer Dialog zum Ummelden via Klickhandler auf Klasse ummeldeKurs. 
  });
  
} // initKursAuswahlDialog4Ummelden
