registerNamespace('KuferTools.KursDetails');
registerNamespace('KuferTools.Filter');


var terminTableOrigData = {};
var terminTable = null;
var teilnehmerTable = null;
var journalTable = null;
var journalTableOrigData = {};
var journalTableStyle = null;
/*
* Methoden zum Sortieren nach verschiedenen Kriterien:
* dateShort-time-asc/-desc:     auf-/absteigend nach Datum und Zeit; z.B.  29.04.2011 17:00
* de_date-asc/-desc:            auf-/absteigend nur nach Datum; z.B.  29.04.2011
* weekday-dateShort-asc/-desc:  auf-/absteigend nach Datum mit vorangestelltem Wochentag kurz; z.B. Sa., 29.04.2011
* numeric-comma-asc/-desc:      auf-/absteigend von Kommazahlen z.B. 7,00
*/
if(jQuery.fn.dataTableExt) {
  jQuery.fn.dataTableExt.oSort['dateShort-time-asc'] = KuferTools.Utils.DataTables.oSort.DateAsc;
  jQuery.fn.dataTableExt.oSort['dateShort-time-desc'] = KuferTools.Utils.DataTables.oSort.DateDesc;
  jQuery.fn.dataTableExt.oSort['de_date-asc']  = KuferTools.Utils.DataTables.oSort.DateAsc;
  jQuery.fn.dataTableExt.oSort['de_date-desc'] = KuferTools.Utils.DataTables.oSort.DateDesc;
  jQuery.fn.dataTableExt.oSort['weekday-dateShort-asc'] = KuferTools.Utils.DataTables.oSort.DateAsc;
  jQuery.fn.dataTableExt.oSort['weekday-dateShort-desc'] = KuferTools.Utils.DataTables.oSort.DateDesc;
  
  jQuery.fn.dataTableExt.oSort['numeric-comma-asc']  = function(a,b) {
   a = KuferTools.Utils.stripHTML(a);
   b = KuferTools.Utils.stripHTML(b);
   var x = (a == "-" || a =="") ? 0 : a.replace( /,/, "." );
   var y = (b == "-" || b =="") ? 0 : b.replace( /,/, "." );
   x = parseFloat( x );
   y = parseFloat( y );
   return ((x < y) ? -1 : ((x > y) ?  1 : 0));
  };
   
  jQuery.fn.dataTableExt.oSort['numeric-comma-desc'] = function(a,b) {
   a = KuferTools.Utils.stripHTML(a);
   b = KuferTools.Utils.stripHTML(b);
   var x = (a == "-" || a =="") ? 0 : a.replace( /,/, "." );
   var y = (b == "-" || b =="") ? 0 : b.replace( /,/, "." );
   x = parseFloat( x );
   y = parseFloat( y );
   return ((x < y) ?  1 : ((x > y) ? -1 : 0));
  };
}

/*******************************************************************************
************** Funktionen zur Tabelle im Reiter Journal ************************
*******************************************************************************/
function initJournalTable()
{
  if($('#tab_kjournalId').length != 0) { //Falls die Tabelle überhaupt vorhanden ist
    // Kopieren der Style- und Klassen-Informationen (bevor man .dataTables() ausführt, welches Spalten ausblendet
    journalTableStyle     = getTableStyle('tab_kjournalId');
    
    // Filter-Dialog für das Journal erzeugen
    createJournalFilterDialog();
    
    $('#kdetails_journalLinkFilter').click(function(e) {
      $('#dialogJournalFilter').dialog('open');
      return false;
    });
    
    // DataTable Journal initialisieren 
    createJournalTable();
    
    // Komprimiertes Journal: Filtert alle Einträge mit Markierung "storniert" heraus
    $('#tnJournalAnsichtKomprimiertRadio').click(function() {
      doFilterJournalTable();
    });
    
    // Komprimiertes Journal: hebt die Filterung "storniert" wieder auf
    $('#tnJournalAnsichtKomplettRadio').click(function() {
      doFilterJournalTable();
    });
    
    // Button zum Löschen des Journal-Filters unter der Tabelle
    $("#kdetails_journalAllFilterDelLnk").click(function() {
      removeFilterJournalTable();
    });
    
    // Speichert die originale Tabelle zwischen
    // Den try/catch braucht man, weil man nicht sicher gehen kann,
    // dass die Tabelle im DOM ist. Wenn nicht, würde der Aufruf ohne Abfrage zu einem Fehler führen
    try {
      journalTableOrigData = journalTable.fnGetData();
      calculateSums();
    } catch(err) {}
  }
}

function createJournalTable() {
  if($('#tab_kjournalId').length == 0) {
    return;
  }
  //Rückgabe der Variable journaltable nicht erforderlich, da Tabelle automatisch nach den
  // Datatables Kriterien eingerichtet wird
  journalTable = $('#tab_kjournalId').dataTable({
    "oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
    "sScrollY": "245px", //Scrollbalken nach unten, angezeigt: 310px
    "bFilter": false,
    "bInfo": false, //z.B. showing 1 to 10 from 57 entries
    "bScrollCollapse": true,
    "bPaginate": false,
    "bAutoWidth": false,
    "aoColumnDefs": [
      {"sType": "dateShort-time",    "aTargets": ["zahlung_datumUhrzeit"]},
      {"sType": "de_date",         "aTargets": ["zahlung_faelligkeit", "zahlung_datum"]},
      {"sType": "numeric-comma" , "aTargets": ["zahlung_betrag", "zahlung_betrag_m", "zahlung_betrag_p"]},
      {"bVisible": false,            "aTargets": ["zahlung_invisibleDP"]}]
  });
}

function komprimiereJournal(){
  var journalTableNewData = deepObjCopy(journalTableOrigData);
  var col = getColumnWithClass('zahlung_invisibleDP', journalTableStyle);
  if(col !== undefined){
    var hatStornoBuchung = false;
    // Grep gibt nur die Einträge zurück, die ein S in DP stehen haben
    journalTableNewData = jQuery.grep(journalTableNewData, function (element, zeile) { 
      if(KuferTools.Utils.stripHTML(element[col]) != "S"){ 
        return element;
      } else {
        hatStornoBuchung = true;
      }
    });
    //Behebt einen Bug im Dozententool meine Kurse / Kursdetails / Reiter Honorar.
    //Beim Blättern auf der Reiterseite Honorar warf fnClearTable() eine Exception (journalTable ist gesetzt)
    //und dies führte zu einer leeren Honorarjournal-Tabelle.
    //Als schnelle Lösung hier einen try-catch-Block eingebaut, da der Fehler auch
    //in jQuery selbst liegen kann.
    try {
    // Tabelleninhalt löschen
    journalTable.fnClearTable();
    } catch(e){};
    // neue Daten aus Array einspielen
    journalTable.fnAddData(journalTableNewData);
    // Style wiederherstellen
    setTableStyle('tab_kjournalId', journalTableStyle);
    // Spaltenbreite optimieren
    journalTable.fnAdjustColumnSizing();
    $('#tnJournalAnsichtKomprimiertRadio').prop("checked", true);
    
    if(!hatStornoBuchung){
      $('#kdetails_journalSubControlSpan').css("visibility","hidden");
    }
  }
}


function removeFilterJournalTable(){
  $('#dialogJournalFilter :input[type=radio][value=default]').prop("checked", true);
  $('#dialogJournalFilter :input[type=text]').val("");  
  doFilterJournalTable();
}

// Hier wird die neue Tabelle fürs Journal erstellt, wenn ein Filter gesetzt wird
function doFilterJournalTable(){
  // Kopieren von dem Referenz-Array mit allen Daten, wie sie von der DB kamen
  var journalTableNewData = deepObjCopy(journalTableOrigData);
  // legt fest, ob das Feld "noch Offen" mit der offenen Rechnungssumme gezeigt werden soll
  var versteckeNochOffen = false;
  
  var filterActive       = false;
  // liest die Input-Felder aus
  var komprimiert     = $('#tnJournalAnsichtKomprimiertRadio').prop("checked");
  var nichtalleZeiten = $('#nichtalleZeitenjournal').prop("checked");
  var nurSoll         = $('#solljournal').prop("checked");
  var nurHaben        = $('#habenjournal').prop("checked");
  var von             = $.trim($('#journalvon').val());
  var bis             = $.trim($('#journalbis').val());
  
  if(komprimiert){
    // findet heraus, welche Spalte die Durchlaufenden Posten enthält
    var col = getColumnWithClass('zahlung_invisibleDP', journalTableStyle);
    if(col !== undefined){
      // Grep gibt nur die Einträge zurück, die ein S in DP stehen haben
      journalTableNewData = jQuery.grep(journalTableNewData, function (element, zeile) { 
        if(KuferTools.Utils.stripHTML(element[col]) != "S"){ 
          return element;
        }
      });
    }
  }

  if(nichtalleZeiten){
    var col = getColumnWithClass('zahlung_datumUhrzeit', journalTableStyle);
    if(col !== undefined){
      // Benutzt die Sortiermethoden oben um den Datumsbereich einzuschränken
      journalTableNewData = jQuery.grep(journalTableNewData, function (element, zeile) {
        if(jQuery.fn.dataTableExt.oSort['dateShort-time-asc']( KuferTools.Utils.stripHTML(element[0]), von + ", 00:00 Uhr") >= 0 && 
            jQuery.fn.dataTableExt.oSort['dateShort-time-asc'](bis + ", 23:59 Uhr", KuferTools.Utils.stripHTML(element[0])) >= 0)
        {return element;} 
      });
      versteckeNochOffen = true;
      filterActive = true;
    }
  }

  if(nurSoll){
    var col = getColumnWithClass('zahlung_betrag_p', journalTableStyle);
    if(col !== undefined){
      // Nur Einträge mit Text in der Spalte Soll
      journalTableNewData = jQuery.grep(journalTableNewData, function (element, zeile) {if(KuferTools.Utils.stripHTML(element[col]) != ""){return element;}});
      versteckeNochOffen = true;
      filterActive = true;
    }
  } else if(nurHaben){
    var col = getColumnWithClass('zahlung_betrag_m', journalTableStyle);
    if(col !== undefined){
      // Nur Einträge mit Text in der Spalte Haben
      journalTableNewData = jQuery.grep(journalTableNewData, function (element, zeile) {if(KuferTools.Utils.stripHTML(element[col]) != ""){return element;}});
      versteckeNochOffen = true;
      filterActive = true;
    }
  }
  
  if(versteckeNochOffen){
    $('.journalFooter .footer_row2').css({"visibility":"hidden"});
  } else {
    $('.journalFooter .footer_row2').css({"visibility":"visible"});
  }
  
  if(filterActive){
    $("#kdetails_journalAllFilterDelLnk").css({"visibility":"visible"});
  } else {
    $("#kdetails_journalAllFilterDelLnk").css({"visibility":"hidden"});
  }

  // Tabelleninhalt löschen
  journalTable.fnClearTable();
  // neue Daten aus Array einspielen
  journalTable.fnAddData(journalTableNewData);
  // Style wiederherstellen
  setTableStyle('tab_kjournalId', journalTableStyle);
  // Summen berechnen
  calculateSums();
  // Spaltenbreite optimieren
  journalTable.fnAdjustColumnSizing();
}
/******************************************************************************
*********  Funktionen für Tabelle für Reiter Teilnehmer ***********************
******************************************************************************/
function initTeilnehmerTable()
{
  if($('#tab_kteilnehmer').length != 0) { //Falls die Tabelle überhaupt vorhanden ist
    // Kopieren der Style- und Klassen-Informationen (bevor man .dataTables() ausführt, welches Spalten ausblendet
    teilnehmerTableStyle  = getTableStyle('tab_kteilnehmer');
    
    // Filter-Dialog für die Teilnehmer erzeugen
    createTeilnehmerFilterDialog();
    
    $('#kdetails_teilnehmerLinkFilter').click(function(e) {
      $('#dialogTeilnehmerFilter').dialog('open');
      return false;
    });
    
    //DataTable Teilnehmer initialisieren
    createTeilnehmerTable();
    
    // Button zum Löschen des Teilnehmer-Filters unter der Tabelle 
    $("#kdetails_teilnehmerAllFilterDelLnk").click(function() {
      removeFilterTeilnehmerTable();
    });
    
    // Speichert die originale Tabelle zwischen
    // Den try/catch braucht man, weil man nicht sicher gehen kann,
    // dass die Tabelle im DOM ist. Wenn nicht, würde der Aufruf ohne Abfrage zu einem Fehler führen
    try {
      KuferTools.teilnehmerTableOrigData  = teilnehmerTable.fnGetData();
    } catch(err) {}
  }
}

function createTeilnehmerTable() {
  //Rückgabe der Variable Teilnehmertable nicht erforderlich, da Tabelle automatisch nach den
  // Datatables Kriterien eingerichtet wird (u.a. auch sortiert)
  
  // Sonderfall: Im Mitarbeitertool muss die Tabelle etwas niedriger sein, da die Buttonleiste
  // zweizeilig sein kann.
  var height = ( KuferTools.ToolSectionId !== 377 ? '300px' : '250px' );
  
  teilnehmerTable = $('#tab_kteilnehmer').dataTable({
    "oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
    "sScrollY": height, //Scrollbalken nach unten, angezeigt: 310px
    "bFilter": false,
    "bInfo": false, //z.B. showing 1 to 10 from 57 entries
    "bScrollCollapse": true,
    "bPaginate": false,
    "bAutoWidth": false,
    "aaSorting": [],
    "aoColumnDefs": [
      {"bSortable": false, "aTargets": ["doNotSort","kommunikation_emailgrafik"]}, //z.B. "teilnehmer_name" etc.
      {"sType": "de_date", "aTargets": ["teilnehmer_gebdat"]},
      {"bVisible": false,  "aTargets": ["belegung_invisibleStatus"]}
    ]
  });
}

// Löschen der Teilnehmerfilter
function removeFilterTeilnehmerTable() {
  //Value default ist für Checkbox "alle teilnehmer" gesetzt
  //$('#dialogTeilnehmerFilter :input[type=checkbox][value=default]').prop("checked", true);
  //besser:
  $('#dialogTeilnehmerFilter #teilnehmeralleStati').prop("checked", true);
  // alle anderen Checkboxen werden zurückgesetzt 
  //$('#dialogTeilnehmerFilter :input[type=checkbox][value!=default]').prop("checked", false);
  //besser:
  $('#dialogTeilnehmerFilter .tnStatusFilter').prop("checked", false);
  // $('#dialogTeilnehmerFilter #teilnehmerName').val(""); 
  $('#dialogTeilnehmerFilter #alleMailTeilnehmer').prop("checked", true);
  if ($('#dialogTeilnehmerFilter #alleMobilTeilnehmer') !== undefined)
    $('#dialogTeilnehmerFilter #alleMobilTeilnehmer').prop("checked", true);
  $('#dialogTeilnehmerFilter #alleTelMobilTeilnehmer').prop("checked", true);
  doFilterTeilnehmerTable();
}

//Hier wird die neue Tabelle für die Teilnehmer erstellt, wenn ein Filter gesetzt wird
function doFilterTeilnehmerTable(){
  var teilnehmerTableNewData = deepObjCopy(KuferTools.teilnehmerTableOrigData);
  
  // var teilnehmerName       = $.trim($('#teilnehmerName').val());
  var teilnehmerAlleStati  = $('#teilnehmeralleStati').prop("checked");
  var teilnehmerStatusA    = $('#teilnehmerStatusA').prop("checked");
  var teilnehmerStatusT    = $('#teilnehmerStatusT').prop("checked");
  var teilnehmerStatusP    = $('#teilnehmerStatusP').prop("checked"); 
  var teilnehmerStatusS    = $('#teilnehmerStatusS').prop("checked"); 
  var teilnehmerStatusZ    = $('#teilnehmerStatusZ').prop("checked"); 
  var teilnehmerStatusW    = $('#teilnehmerStatusW').prop("checked"); 
  var teilnehmerStatusI    = $('#teilnehmerStatusI').prop("checked");
  // für Teilnehmer Mail
  var teilnehmerAllMail  = $('#alleMailTeilnehmer').prop("checked");
  var teilnehmerMitMail  = $('#mitMailTeilnehmer').prop("checked");
  var teilnehmerOhneMail = $('#ohneMailTeilnehmer').prop("checked");
  
  // für Teilnehmer Mobilnr.
  var teilnehmerAllMobil  = $('#alleMobilTeilnehmer').prop("checked");
  var teilnehmerMitMobil  = $('#mitMobilTeilnehmer').prop("checked");
  var teilnehmerOhneMobil = $('#ohneMobilTeilnehmer').prop("checked");
  
  // für Teilnehmer Mobilnr. oder Telnr.
  var teilnehmerAllTelMobil  = $('#alleTelMobilTeilnehmer').prop("checked");
  var teilnehmerMitTelMobil   = $('#mitTelMobilTeilnehmer').prop("checked");
  var teilnehmerOhneTelMobil  = $('#ohneTelMobilTeilnehmer').prop("checked");

  var filterActive         = false;
  
  //nach eingegebenen Namensstring filtern: wird NICHT verwendet
  /*
  if(teilnehmerName){
    var col = getColumnWithClass('teilnehmer_name', teilnehmerTableStyle);
    if(col !== undefined){
      //Holt den Inhalt des <td>-Elements  (z.B. ein <span>Name</span>) aus der Teilnehmer Table
      teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) {
        if(KuferTools.Utils.stripHTML(element[col]).indexOf(teilnehmerName)>= 0)
        { return element;} 
      });
      filterActive = true;
    }
  }
  */
  
  //nach angehakten Checkboxen zum TN Status filtern
  if(teilnehmerAlleStati){
    //Kein Filter: Evtl hier andere Filter wieder aufheben 
  }
  else if(teilnehmerStatusA || teilnehmerStatusT || teilnehmerStatusP || teilnehmerStatusS || 
     teilnehmerStatusZ || teilnehmerStatusW || teilnehmerStatusI) {
     
    var col = getColumnWithClass('belegung_invisibleStatus', teilnehmerTableStyle);
    filterActive = true;
    if(col !== undefined){
      var ausdruck = '';
      if(teilnehmerStatusA)
        ausdruck += 'A';
      if(teilnehmerStatusT)
        ausdruck += 'T';
      if(teilnehmerStatusP)
        ausdruck += 'P';
      if(teilnehmerStatusS)
        ausdruck += 'S';
      if(teilnehmerStatusZ)
        ausdruck += 'Z';
      if(teilnehmerStatusW)
        ausdruck += 'W';
      if(teilnehmerStatusI)
        ausdruck += 'I';
      //RegExp Konstruktor nötig zum Erzeugen von regulären Ausdrücken zur Laufzeit; 
      // Achtung BUG in RegExp Klasse für Javaskript: Parameter g bedeutet global search, darf ABER hier NICHT verwendet werden,
      //sonst wird beim Test von 2 identischen Ausdrücken abwechselnd false und true ausgegeben.
      //var regex = new RegExp('['+ausdruck+']','g'); 
      var regex = new RegExp('['+ausdruck+']');     
      teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) {
          //Testet ob der Suchstring dem regulären Ausdruck entspricht also z.B. Vergleich
          // z.B. KuferTools.Utils.stripHTML(element[col] === 'AW'; Rückgabewert: Boolean
          return regex.test(KuferTools.Utils.stripHTML(element[col]));
      }); //end jquery.grep
    } //end if col != undefined
  } //end if tnstati
 
 
  //Nur dann nach Email weiterfiltern, wenn nicht alle TN angezeigt werden sollen
  if (!teilnehmerAllMail) {
    var colgraf = getColumnWithClass('kommunikation_emailgrafik', teilnehmerTableStyle);
    var col = getColumnWithClass('kommunikation_email', teilnehmerTableStyle);
    
    if(teilnehmerMitMail){
      
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) { 
          if(colgraf !== undefined){
            // &nbsp; wurde auf leer (" ") gemappt; nur HTML Tags <img> u.</img> werden stehen gelassen
            if(KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[colgraf],'img')) !== "") {
              return true;
            }
          }
          else if (col !== undefined) {
            // nur HTML Tags <a href...>  und </a> werden stehen gelassen
            var restmail = KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[col],'a'));
             // RestMail String muss mit <a href="mailto:   beginnen
            if (restmail.substring(0,16) === '<a href="mailto:') {
              return true;
            }
          }
        });
      filterActive = true;
    } else if(teilnehmerOhneMail) {
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) {
          if(colgraf !== undefined) {
            //alert("strip ElemCol: " + KuferTools.Utils.stripHTML(element[col]));
            if(KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[colgraf],'img')) === "") {
              return true;
            }
          }
          else if (col !== undefined) {
            // nur HTML Tags <a href...>  und </a> werden stehen gelassen
            var restmail = KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[col],'a'));
            // RestMail String darf nicht mit <a href="mailto:   beginnen
            if (restmail.substring(0,16) !== '<a href="mailto:') {
              return true;
            }
          }
        });
      filterActive = true;
    } //end else
    //Falls keiner der 2 Fälle eintritt, ist nichts zu tun: filterActive bleibt false 
  } //end if (!teilnehmerAllMail)
 
  //Nur dann nach Mobilnr. weiterfiltern, wenn nicht alle TN angezeigt werden sollen
  // Voraussetzung für Anzeige: Mobil Spalte vorhanden und Tel spalte nicht vorhanden
  if (!teilnehmerAllMobil) {
    var col = getColumnWithClass('kommunikation_mobil', teilnehmerTableStyle);
    if(teilnehmerMitMobil){
      if(col !== undefined){
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) { 
          // &nbsp; wurde auf leer (" ") gemappt
          if(KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[col])) !== "") {
            return true;
          }
        });
      }
      filterActive = true;
    } 
    else if(teilnehmerOhneMobil) {
      if(col !== undefined){
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) { 
          if(KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[col])) === ""){
            return true;
          }
        });
      }
      filterActive = true;
    } //end elseif
    //Falls keiner der 2 Fälle eintritt, ist nichts zu tun
  } //end if (!teilnehmerAllMobil)
 
 
 
  //Nur dann nach Tel ODER Mobilnr. weiterfiltern, wenn nicht alle TN angezeigt werden sollen
  //Voraussetzung für Ausgabe dieses Filters: Tel. Spalte vorhanden
  if (!teilnehmerAllTelMobil) {
    var colmob = getColumnWithClass('kommunikation_mobil', teilnehmerTableStyle);
    var coltel = getColumnWithClass('kommunikation_tel', teilnehmerTableStyle);
    var coltel2 = getColumnWithClass('kommunikation_tel2', teilnehmerTableStyle);
    if(teilnehmerMitTelMobil) {
      if(coltel !== undefined){
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) { 
          if (colmob !== undefined) {
            if (coltel2 !== undefined)
              retvalue = trim(KuferTools.Utils.stripHTML(element[coltel])) !== "" || 
                         trim(KuferTools.Utils.stripHTML(element[colmob])) !== "" ||
                         trim(KuferTools.Utils.stripHTML(element[coltel2])) !== "";
            else 
              retvalue = KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[colmob])) !== "" || 
                         KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[coltel])) !== "";
            return retvalue;
          }
          else {          // Anderfalls: Nur Test auf Tel.nr. und ggf. Tel2.nr
            if (coltel2 !== undefined)
              retvalue = trim(KuferTools.Utils.stripHTML(element[coltel])) !== "" || 
                         trim(KuferTools.Utils.stripHTML(element[coltel2])) !== "";
            else
              retvalue = trim(KuferTools.Utils.stripHTML(element[coltel])) !== "";
            return retvalue;
          }
        });
      }
      filterActive = true;
    } 
    else if(teilnehmerOhneTelMobil) {
      if(coltel !== undefined){
        teilnehmerTableNewData = jQuery.grep(teilnehmerTableNewData, function (element, zeile) {   
          if (colmob !==undefined) {
            if (coltel2 !== undefined)
              retvalue = KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[coltel])) === "" && 
                         KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[colmob])) === "" &&
                         KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[coltel2])) === "";
            else
              retvalue = KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[coltel])) === "" && 
                         KuferTools.Utils.trimS(KuferTools.Utils.stripHTML(element[colmob])) === "";                          
            return retvalue;
          }
          else  {// Anderfalls: Nur Test auf Tel.nr. und ggf. Tel2.nr
            if (coltel2 !== undefined)
              retvalue = trim(KuferTools.Utils.stripHTML(element[coltel])) === "" && 
                         trim(KuferTools.Utils.stripHTML(element[coltel2])) === "";
            else
              retvalue = trim(KuferTools.Utils.stripHTML(element[coltel])) === "";
            return retvalue;            
          }  
        });
      }
      filterActive = true;
    } //end elseif
    //Falls keiner der 2 Fälle eintritt, ist nichts zu tun
  } //end if (!teilnehmerAllTelMobil)
 
 
  //Filter_Leeren Button nur anzeigen, wenn Filter gesetzt ist; sonst: ausblenden
  if(filterActive){
    $("#kdetails_teilnehmerAllFilterDelLnk").css({"display":"inline"});
  }
  else {
    $("#kdetails_teilnehmerAllFilterDelLnk").css({"display":"none"});
  }
  if (teilnehmerTable != null) {
    //Tabelle neu mit den gefilterten Element Inhalten und Attributen aufbauen
    teilnehmerTable.fnClearTable();
    //Element Inhalte sind in der teilnehmerTableNewData
    teilnehmerTable.fnAddData(teilnehmerTableNewData);
    // die Attribute (Style, Class) sind in teilnehmerTableStyle
    setTableStyle('tab_kteilnehmer', teilnehmerTableStyle);
    teilnehmerTable.fnAdjustColumnSizing();
  }
  
} //end doFilterTeilnehmerTable



/******************************************************************************
**************** Funktionen für Tabelle im Reiter Termin **********************
*******************************************************************************/
/**
 * Initialisiert die Termin-Tabelle mit dataTable
 */
function initTerminTable() {
  
  if($('#tab_ktermine').length != 0) {  //Falls die Tabelle überhaupt vorhanden ist
    
    // Kopieren der Style- und Klassen-Informationen (bevor man .dataTables() ausführt, welches Spalten ausblendet
    terminTableStyle = getTableStyle('tab_ktermine');
    
    // Filter-Dialog für die Termine erzeugen
    createTermineFilterDialog();
    $('#kdetails_termineLinkFilter').click(function(e) {
      $('#dialogTermineFilter').dialog('open');
      
    //Bei Drücken der Enter-Taste Formular abschicken
    $('#dialogTermineFilter').find('input, select').keypress(function(event) {
      if (event.which === 13) {
        event.preventDefault();
        submitTermineFilter();
      }
    });
      return false;
    });
    
    // DataTable Termine wird erzeugt
    terminTable = createTerminTable();
    
    // Button zum Löschen des Termin-Filters unter der Tabelle 
    $("#kdetails_termineAllFilterDelLnk").click(function() {
      removeFilterTerminTable();
    });
    
    // Speichert die originale Tabelle zwischen
    // Den try/catch braucht man, weil man nicht sicher gehen kann,
    // dass die Tabelle im DOM ist. Wenn nicht, würde der Aufruf ohne Abfrage zu einem Fehler führen
    try {
      terminTableOrigData  = terminTable.fnGetData();
    } catch(err) {}
    
    // Voreinstellungen bei Reload
    $('#kurstageauswahl #ktermine_all').prop("checked", true);
    $('input#ktermine_mehrzeilig').prop("checked", true);
    
    // Einzeilig/Mehrzeilig; Für Radiobuttons braucht man den Click oder Change event
    $('input.ktermine_zeilenauswahl').click(function(e) {
      //e.preventDefault();
      //Den angehakten Radiobutton auswählen 
      //var $checkedRadiobox = $(this).find(':checked');
    	radioEinzeiligMehrzeiligTerminTable($(this));
    });
    
    // Anklicken der Dozentenauswahl für die Termine. Hier erfolgt die  Auswahl zwischen 
    // "nur meine Termine" und "alle Termine"
    $('input.ktermine_dozentenauswahl').click(function(e) {
      radioDozentAlleMeineTerminTable($(this));
    });
  }//TerminTable ende
}

function radioEinzeiligMehrzeiligTerminTable($radio)
{
  if ($radio.val() == 'einezeile') {
    KuferTools.Utils.KuerzeTabelleAufZeile( $('#tab_ktermine'), true );
  }
  else {
    KuferTools.Utils.KuerzeTabelleAufZeile( $('#tab_ktermine'), false );
  }
  terminTable.fnAdjustColumnSizing();
}

function radioDozentAlleMeineTerminTable($radio)
{
  // Nach Anhaken eines Radiobuttons erscheint immer die  mehrzeilige Ausgabe: daher auch die Checkbox dazu setzen
  $('input#ktermine_mehrzeilig').prop("checked", true); 
  var filterActive = false;
  if ($('#kdetails_termineAllFilterDelLnk').css('display') == 'inline')
    filterActive = true;
  
  if (filterActive)
    // var terminTableNewDataOrig = KuferTools.KursDetails.terminTableNewData
    var terminTableNewDataOrig = doFilterTerminTable();
  else
    var terminTableNewDataOrig = deepObjCopy(terminTableOrigData);  
  
  //alert("hier: " + KuferTools.KursDetails.Dnr + "id: " + $radio.prop('id'));
  if ($radio.prop('id') == 'ktermine_own') {
    var col = getColumnWithClass('kurstag_invisibleDnr', terminTableStyle);
  
    if(col !== undefined) {
      terminTableNewData = jQuery.grep(terminTableNewDataOrig, function (element, zeile) {
        // Dnr sind als Integer angegeben, daher casten
        if(parseInt(KuferTools.Utils.stripHTML(element[col])) === KuferTools.KursDetails.Dnr){
          return true;
        }
      });
      //filterActive = true;
    } 
  } //end if
  else { //id: ktermine_all
    //terminTableNewData = deepObjCopy(terminTableOrigData);  
    terminTableNewData = terminTableNewDataOrig; 
  }
  terminTable.fnClearTable();
  terminTable.fnAddData(terminTableNewData);
  setTableStyle('tab_ktermine', terminTableStyle);
  terminTable.fnAdjustColumnSizing();
  
  KuferTools.KursDetails.terminTableOwnData = terminTableNewData;
}

function createTerminTable() {
  //Rückgabe der Variable Termintable nicht unbedingt erforderlich, da Tabelle automatisch nach den
  // Datatables Kriterien eingerichtet wird (u.a. auch sortiert)
  terminTable = $('#tab_ktermine').dataTable({
    "oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
    "sScrollY": "300px", //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,
    "aaSorting": [],
    "aoColumnDefs": [
      {"bSortable": false,           "aTargets": ["doNotSort","kurstag_ausfall" ]}, //, "kurstag_bemerkungen", "kurstag_ort", 
      {"sType": "weekday-dateShort", "aTargets": ["kurstag_datum_komplettkurz_jahrkurz"]},
      {"sType": "de_date",           "aTargets": ["kurstag_datum"]},
      {"bVisible": false,            "aTargets": ["kurstag_invisibleAusfall","kurstag_invisibleDnr"]}
    ]
  });
  return terminTable;
}

function removeFilterTerminTable(){
  // $('#dialogTermineFilter :input[type=radio][value=default]').prop("checked", true);
  // besser:
  $('#dialogTermineFilter #alleStatiTermine').prop("checked", true);
  $('#dialogTermineFilter #termineUhrAlle').prop("checked", true);
  $('#dialogTermineFilter #alleZeitenTermine').prop("checked", true);
  // Beim Entfernen des Filters: alle Termine setzen
  $('#kurstageauswahl #ktermine_all').prop("checked", true);
  //$('#kurstageauswahl #ktermine_own').prop("checked", false);
  $('#dialogTermineFilter :input[type=text]').val("");  
  doFilterTerminTable();
}


//Hier wird die neue Tabelle für die Termine erstellt, wenn ein Filter gesetzt wird
function doFilterTerminTable(){

  // Beim Filtern ist  mehrzeilig eingestellt, daher auch die Checkbox dazu setzen
   $('input#ktermine_mehrzeilig').prop("checked", true); 
  
  //  Für Auswahl "alle Termine": Original Tabellenzustand wiederherstellen
  if  ($('#kurstageauswahl #ktermine_own').prop("checked"))
    var terminTableNewData = KuferTools.KursDetails.terminTableOwnData;
  else
    var terminTableNewData = deepObjCopy(terminTableOrigData);    
 // var terminTableNewData = deepObjCopy(terminTableOrigData);
  var alleTermine        = $('#alleZeitenTermine').prop("checked");
  var termineNurAusfall  = $('#nurAusfallTermine').prop("checked");
  var termineNurStattgef = $('#nurStattgefTermine').prop("checked");
  var termineUhrAlle     = $('#termineUhrAlle').prop("checked");
  var termineUhrVon      = $.trim($('#termineuhrvon').val());
  var termineUhrBis      = $.trim($('#termineuhrbis').val());
  var terminevon         = $.trim($('#terminevon').val());
  var terminebis         = $.trim($('#terminebis').val());
  var termineDozent      = $.trim($('#termineDozent').val());
  var termineOrt         = $.trim($('#termineOrt').val());
  var termineBemerk      = $.trim($('#termineBemerk').val());
  var filterActive       = false;
  
  if(alleTermine){
    // nix zu filtern
  } else {
    var col = getColumnWithClass('kurstag_datum_komplettkurz_jahrkurz', terminTableStyle);
    if(col !== undefined){
      //Vorbesetzen des Datumsbereichs für's Filtern, falls in den Inputfeldern hierfür keine Einträge vorhanden sind
      if (terminevon === '')
        terminevon = '30.12.1899';
      if (terminebis === '')
        terminebis = '31.12.9999';
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) { 
        // hier wird verglichen. Beachten: Man muss vor das Datum einen "Wochentag" schreiben, sonst klappts nicht
        if(jQuery.fn.dataTableExt.oSort['weekday-dateShort-asc'](KuferTools.Utils.stripHTML(element[col]), 'XX., ' + terminevon) >= 0 && 
            jQuery.fn.dataTableExt.oSort['weekday-dateShort-asc']('XX., ' + terminebis, KuferTools.Utils.stripHTML(element[col])) >= 0)
        {return element;} 
      });
      filterActive = true;
    }
  }
  
  if(termineUhrAlle){
    // nix zu filtern
  } else {
    var colBeg = getColumnWithClass('kurstag_zeit_beg', terminTableStyle);
    var colEnd = getColumnWithClass('kurstag_zeit_ende', terminTableStyle);
    if(colBeg !== undefined && colEnd !== undefined){
      //Vorbesetzen des Uhrzeitbereichs für's Filtern, falls in den Inputfeldern hierfür keine Einträge vorhanden sind
      if (termineUhrVon === '')
        termineUhrVon = '00:00';
      if (termineUhrBis === '')
        termineUhrBis = '23:59';
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) {  
        // termineUhrVon termineUhrBis
        if(jQuery.fn.dataTableExt.oSort['string-asc'](KuferTools.Utils.stripHTML(element[colBeg]), termineUhrVon) >= 0 && 
           jQuery.fn.dataTableExt.oSort['string-asc'](termineUhrBis, KuferTools.Utils.stripHTML(element[colEnd])) >= 0)
        {return element;} 
      }); //end jQuery.grep
      
      filterActive = true;
    } //end if(colBeg !== undefined ..)
  }
  
  if(termineNurAusfall){
    var col = getColumnWithClass('kurstag_invisibleAusfall', terminTableStyle);
    if(col !== undefined){
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) { 
        if(KuferTools.Utils.stripHTML(element[col]) === "X" || KuferTools.Utils.stripHTML(element[col]) === "A"){
          return element;
        }
      });
      filterActive = true;
    }
  } else if(termineNurStattgef){
    var col = getColumnWithClass('kurstag_invisibleAusfall', terminTableStyle);
    if(col !== undefined){
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) { 
        if(KuferTools.Utils.stripHTML(element[col]) !== "X" && KuferTools.Utils.stripHTML(element[col]) !== "A"){
          return element;
        }
      });
      filterActive = true;
    }
  }
  
  if(termineOrt){
    var col = getColumnWithClass('kurstag_ort', terminTableStyle);
    if(col !== undefined){
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) {
        if(KuferTools.Utils.stripHTML(element[col].toLowerCase()).indexOf(termineOrt.toLowerCase())>= 0)
        {return element;} 
      });
      filterActive = true;
    }
  }

  if(termineDozent){
    var col = getColumnWithClass('dozent_namevorname', terminTableStyle);
    if(col !== undefined){
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) {
        if(KuferTools.Utils.stripHTML(element[col].toLowerCase()).indexOf(termineDozent.toLowerCase())>= 0)
        {return element;} 
      });
      filterActive = true;
    }
  }

  if(termineBemerk){
    var col = getColumnWithClass('kurstag_bemerkungen', terminTableStyle);
    if(col !== undefined){
      terminTableNewData = jQuery.grep(terminTableNewData, function (element, zeile) {
        if(KuferTools.Utils.stripHTML(element[col].toLowerCase()).indexOf(termineBemerk.toLowerCase())>= 0){
          return element;
        }
      });
      filterActive = true;
    }
  }

  if(filterActive){
    $("#kdetails_termineAllFilterDelLnk").css({"display":"inline"});
  } else {
    $("#kdetails_termineAllFilterDelLnk").css({"display":"none"});
  }
  
  if (terminTable != null)  {
    terminTable.fnClearTable();
    terminTable.fnAddData(terminTableNewData);
    setTableStyle('tab_ktermine', terminTableStyle);
    terminTable.fnAdjustColumnSizing();
    //Am ende des Terminfilters: Zeilenauswahl auf mehrzeilig setzen
    $('#ktermine_mehrzeilig').prop('checked', true);
  }
  return terminTableNewData;
}  //end doFiltertermintable

/******************************************************************************
************ Funktionen zur Tabelle im Reiter Dozenten des Tools Kurse MA *****
*******************************************************************************/
function initDozentenTable()
{
  if($('.tab_dozenten').length != 0) { //Falls die Tabelle überhaupt vorhanden ist
    createDozentenTable();
  }
}

function createDozentenTable() {
  //Rückgabe der Variable dozententable nicht erforderlich, da Tabelle automatisch nach den
  // Datatables Kriterien eingerichtet wird
  dozentenTable = $('.tab_dozenten').dataTable({
    "oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
    "sScrollY": "300px", 
    "bFilter": false,
    "bInfo": false, 
    "bScrollCollapse": true,
    "bAutoWidth": false,
    "bPaginate": false,
    "aaSorting": [],
    "aoColumnDefs":[
   //   {"bSortable": false, "aTargets": ["doNotSort","kommunikation_emailgrafik"]}
      {"bSortable": false, "aTargets": ["doNotSort", "dozentenhonorare_gesamt", "dozentenhonorare_bezahlt", "dozentenhonorare_offen",
          "dozent_zusvertrag", "kommunikation_emailgrafik"]}
    ]
  });
}

// Holt die Style Elemente der einzelnen Tabellenzellen aus der Tabelle und speichert sie
// im Array tableStyle; es werden (style,class) Paare ins Array geschrieben
function getTableStyle(tableID){
  var $this = jQuery(this);
  return KuferTools.Filter.getTableStyle(tableID);
  
}

// Baut ein Stylearray zur jeweiligen table auf z.B. zu Table Termine 
// es werden (style,class) Paare zu jedem vorhandenem TD element in die Tabelle gehängt
function setTableStyle(tableID, styleArray){
  KuferTools.Filter.setTableStyle(tableID, styleArray);
}

 // Prüft ob eine Spalte in eim Style Array vorhanden ist und gibt die position zurück
 // Das Style Array wurde mit Hilfe von getTableStyle vorher aufgebaut
function getColumnWithClass(className, styleArray){
  
  return KuferTools.Filter.getColumnWithClass(className, styleArray);
}

function calculateSums(){
  var summeSoll = 0.0;
  var summeHaben = 0.0;
  var nochOffen = 0.0;
  
  $('#tab_kjournalId tbody td.zahlung_betrag_p').each(function(){
    var temp = $(this).text().replace(',','.');
    temp = parseFloat(temp);
    if(!isNaN(temp))
      summeSoll += temp;
    });
    
  $('#tab_kjournalId tbody td.zahlung_betrag_m').each(function(){
    var temp = $(this).text().replace(',','.');
    temp = parseFloat(temp);
    if(!isNaN(temp))
      summeHaben += temp;
    });
  nochOffen = summeSoll - summeHaben;
  
  // Wenn ein Guthaben besteht soll dieses leserlicher ausgeben werden (statt "noch offen: -1,23" jetzt "Guthaben: 1,23")
  if(nochOffen < 0){
    $('#nochOffenTD').text("Guthaben:");
    nochOffen = nochOffen * -1;
  } else {
    $('#nochOffenTD').text("noch offen:");
  }
  
  summeSoll  = summeSoll.toFixed(2).replace('.',',');
  summeHaben = summeHaben.toFixed(2).replace('.',',');
  nochOffen  = nochOffen.toFixed(2).replace('.',',');
  
  $('.journalFooter_row1_zahlung_betrag_p').text(summeSoll);
  $('.journalFooter_row1_zahlung_betrag_m').text(summeHaben);
  $('.journalFooter_row2_zahlung_betrag_p').text(nochOffen);
}

/********************************************************************************************************/
/*  Funktionen und Dialog zum Filtern des Journals                                                      */  
/********************************************************************************************************/
// Inhalt des Journal Filter Dialogs
function createJournalFilterDialog(){
  var $dialogJournalFilter = $('<div id="dialogJournalFilter"></div>');
  var flagFilterAvailable = false;

  // schaut nach, ob diese Spalte überhaupt existiert
  if( getColumnWithClass('zahlung_datumUhrzeit', journalTableStyle) !== undefined ){ 
    $dialogJournalFilter.append('Zeitraum:<br>');
    $dialogJournalFilter.append('<input type="radio" name="journalterminbereich" value="default" id="alleZeitenjournal" checked="checked">gesamt<br>');
    $dialogJournalFilter.append('<input type="radio" name="journalterminbereich" value="" id="nichtalleZeitenjournal">zwischen ');
    $dialogJournalFilter.append('<input type="text" name="journalvon" id="journalvon" class="date" length="12"> und ');
    $dialogJournalFilter.append('<input type="text" name="journalbis" id="journalbis" class="date" length="12">');
    flagFilterAvailable = true;
  }

  if( getColumnWithClass('zahlung_betrag_p', journalTableStyle) !== undefined && 
      getColumnWithClass('zahlung_betrag_m', journalTableStyle) !== undefined){
    $dialogJournalFilter.append('<br>Buchungen:<br>');
    $dialogJournalFilter.append('<input type="radio" name="journalfilterSollHaben" value="default" id="allejournal" checked="checked">Sollstellungen und Zahlungen<br>');
    $dialogJournalFilter.append('<input type="radio" name="journalfilterSollHaben" value="" id="solljournal">nur Sollstellungen<br>');
    $dialogJournalFilter.append('<input type="radio" name="journalfilterSollHaben" value="" id="habenjournal">nur Zahlungen');
    flagFilterAvailable = true;
  }
  
  if(!flagFilterAvailable){
    $dialogJournalFilter.append('Es sind keine Daten vorhanden, es kann also kein Filter gesetzt werden.');
    $('#kdetails_journalControlDiv').css("visibility","hidden");
  }

  var buttons = { 
      "Schließen":      function() {$(this).dialog("close");},
      "Filter leeren": function() {removeFilterJournalTable();$(this).dialog("close");},
      "Filter setzen":             function() {doFilterJournalTable();
                                      $(this).dialog("close");}
  };
  
  $dialogJournalFilter.dialog({
    modal:       true,
    autoOpen:    false,
    width:       550,
    title:       'Filter für das Journal zu '+KuferTools.Spracheinstellungen.Kurs.Singular_mit_Artikel.Dativ+' ' + KuferTools.KursDetails.Kurs.Knr,
    bgiframe:    true,
    resizable:   false,
    dialogClass: 'dialogwindow',
    buttons:     buttons
  });
  
  KuferTools.InitDatePicker($('#journalvon'));
  $('#journalvon').click(function(){$('#nichtalleZeitenjournal').prop('checked', true);});
  
  KuferTools.InitDatePicker($('#journalbis'));
  $('#journalbis').click(function(){$('#nichtalleZeitenjournal').prop('checked', true);});
}

/********************************************************************************************************/
/*  Funktionen und Dialog zum Filtern der Teilnehmer                                                       */  
/********************************************************************************************************/

function createTeilnehmerFilterDialog(){

  //Erzeugt ein JQUery div Element; das noch nicht im DOM Baum hängt
  var $dialogTeilnehmerFilter = $('<div id="dialogTeilnehmerFilter"></div>');
  var dialogTeilnehmerFilterContent = '';
  
    // Name - nachschauen, ob diese Spalte in der Tabelle überhaupt existiert
  //dialogTeilnehmerFilterContent += getColumnWithClass('teilnehmer_name', teilnehmerTableStyle) === undefined ? "" : '<tr>'+
 //  Name wird nicht verwendet
 //     '<td>Name:</td>'+
 //     '<td nowrap><input type="text" name="teilnehmerName" id="teilnehmerName" style="width: 100%"></td>'+
 //     '</tr>';
  
  
  // Statusauswahl für die Teilnehmer ausgeben, falls ein invisible Statusfeld gesetzt ist
  if (!(getColumnWithClass('belegung_invisibleStatus', teilnehmerTableStyle) === undefined)) {
  
	dialogTeilnehmerFilterContent += '<tr>'+
	  '<td>Status:</td><td><input type="checkbox" name="teilnehmeralleStati" value="default" id="teilnehmeralleStati" checked="checked">&nbsp;alle '+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+'</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusA" value=""  id="teilnehmerStatusA" checked="checked">&nbsp;'+ KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ + ' mit Status A</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusT" value="" id="teilnehmerStatusT" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status T</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusP" value=""  id="teilnehmerStatusP" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status P</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusS" value="" id="teilnehmerStatusS" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status S</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusZ" value=""  id="teilnehmerStatusZ" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status Z</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusW" value="" id="teilnehmerStatusW" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status W</td></tr>'+
	  '<tr><td>&nbsp;</td><td><input class="tnStatusFilter" type="checkbox" name="teilnehmerStatusI" value="" id="teilnehmerStatusI" checked="checked">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Status I</td></tr>';
  }
  
  
  // Filter auf E-Mail nur dann ausgeben, wenn die Emailgrafik oder die Email Spalte erscheint
  if (!(getColumnWithClass('kommunikation_emailgrafik',teilnehmerTableStyle) === undefined) || 
      !(getColumnWithClass('kommunikation_email',teilnehmerTableStyle) === undefined)) {
    dialogTeilnehmerFilterContent += '<tr><td colspan"2">&nbsp;</td></tr>' + '<tr>' +
      '<td>Mail:</td><td><input type="radio" name="teilnehmerEmail" value="default" id="alleMailTeilnehmer" checked="checked">&nbsp;alle '+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+'</td></tr>'+
      '<tr><td   ></td><td><input type="radio" name="teilnehmerEmail" value=""  id="mitMailTeilnehmer">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Mail</td></tr>'+
      '<tr><td   ></td><td><input type="radio" name="teilnehmerEmail" value="" id="ohneMailTeilnehmer">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' ohne Mail</td></tr>';
  }
  
    // Filter auf Mobilnr nur dann ausgeben, wenn die Spalte mit der Mobilnr.  erscheint und die mit der Telnr NICHT erscheint
  if (!(getColumnWithClass('kommunikation_mobil',teilnehmerTableStyle) === undefined)) {
    dialogTeilnehmerFilterContent += '<tr><td colspan"2">&nbsp;</td></tr>' + '<tr>' +
      '<td>Mobil:</td><td><input type="radio" class="tnMobil" name="teilnehmerMobil" value="default" id="alleMobilTeilnehmer" checked="checked">&nbsp;alle '+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+'</td></tr>'+
      '<tr><td   ></td><td><input type="radio" class="tnMobil" name="teilnehmerMobil" value=""  id="mitMobilTeilnehmer">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' mit Mobilnr.</td></tr>'+
      '<tr><td   ></td><td><input type="radio" class="tnMobil" name="teilnehmerMobil" value="" id="ohneMobilTeilnehmer">&nbsp;'+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' ohne Mobilnr.</td></tr>';
  }
  
  // Filter auf Mobilnr oder Telnr. nur dann ausgeben, wenn auch die Spalte mit der Tel.nr erscheint; d.h. alle Teilnehmer,
  // die man anrufen kann
  // Ausgabe des Telefon Filters, falls eine der beiden Spalten für Telefone (Telefon oder Telefon2) angezeigt wird
    if (!(getColumnWithClass('kommunikation_tel',teilnehmerTableStyle) === undefined) || 
        !(getColumnWithClass('kommunikation_tel2',teilnehmerTableStyle) === undefined)) { 
      var teleintrag = 'Tel./ Mobil:'
      if (getColumnWithClass('kommunikation_mobil',teilnehmerTableStyle) === undefined) {
        var telEintrag = 'Telefon:';
        var mitTelText = 'Teilnehmer mit Telefonnr.';
        var ohneTelText = 'Teilnehmer ohne Telefonnr.';
      }
      else {
        var telEintrag = 'Tel./ Mobil:';
        var mitTelText = 'Teilnehmer mit Mobilnr. oder Telefonnr.';
        var ohneTelText = 'Teilnehmer ohne Mobilnr. und Telefonnr.';
      }
      dialogTeilnehmerFilterContent += '<tr><td colspan"2">&nbsp;</td></tr>' + '<tr>' +
        '<td>' + telEintrag + '</td><td><input type="radio" name="teilnehmerTelMobil" value="default" id="alleTelMobilTeilnehmer" checked="checked">&nbsp;alle '+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+'</td></tr>'+
        '<tr><td   ></td><td><input type="radio" name="teilnehmerTelMobil" value=""  id="mitTelMobilTeilnehmer">&nbsp;' + mitTelText +'</td></tr>'+
        '<tr><td   ></td><td><input type="radio" name="teilnehmerTelMobil" value="" id="ohneTelMobilTeilnehmer">&nbsp;' + ohneTelText +'</td></tr>';
  }
  
  

  //Falls eine checkbox mit einem bel. Status angeklickt wird: Checked Status für alle zurücksetzen
      
  var buttons = {
      "Schließen":      function() {$(this).dialog("close");},
      "Filter leeren": function() {removeFilterTeilnehmerTable();$(this).dialog("close");},
      "Filter setzen":             function() {doFilterTeilnehmerTable($('#dialogTeilnehmerFilter input'));
                                      $(this).dialog("close");}
  };
  //Tabelle mit Inhalt anhängen
  if(dialogTeilnehmerFilterContent.length == 0){
    $dialogTeilnehmerFilter.append('Es sind keine Daten vorhanden, es kann also kein Filter gesetzt werden.');
    $('#kdetails_teilnehmerControlDiv').css("visibility","hidden");
  } else {
    // Wenn es filterbare Spalten/Einträge gibt: Den  Content in einer Table anhängen
    $dialogTeilnehmerFilter.append('<table>' + dialogTeilnehmerFilterContent + '</table>');
    /*
     * Verhalten der Teilnehmer-Status-Checkboxen im Filter-Dialog vom Teilnehmer-Tab:
     * Wird "Alle Status" gesetzt, werden alle anderen Checkboxen auch gesetzt,
     * wird "Alle Status" wieder entfernt, werden bei allen anderen Checkboxen der Haken entfernt.
     * Beim Klick auf eine Checkbox wird geprüft, ob alle Checkboxen nun angehakt sind. Wenn ja,
     * wird "Alle Staus" angehakt, wenn nein, wird der haken bei "Alle Status entfernt"
     */
    
    $dialogTeilnehmerFilter.find('input.tnStatusFilter').click(function() {
      // alleChecked ist true, falls alle Checkboxen gesetzt sind, sonst false
      var alleChecked = $('#dialogTeilnehmerFilter input.tnStatusFilter').filter( ':not( :checked )' ).length == 0;
      $('#dialogTeilnehmerFilter input#teilnehmeralleStati').prop("checked", alleChecked);
    });
    //Klickhandler für Anklicken der Checkbox "Alle Stati"
    $dialogTeilnehmerFilter.find('input#teilnehmeralleStati').click(function() {
      var isChecked = $(this).filter(':checked').length != 0;
      $dialogTeilnehmerFilter.find('input.tnStatusFilter').prop( 'checked', isChecked );
    });
  }

  
 $dialogTeilnehmerFilter.dialog({
    modal:       true,
    autoOpen:    false,
    width:       550,
    title:       'Filter für die Anzeige der '+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+' zu '+KuferTools.Spracheinstellungen.Kurs.Singular_mit_Artikel.Dativ+' ' + KuferTools.KursDetails.Kurs.Knr,
    bgiframe:    true,
    resizable:   false,
    dialogClass: 'dialogwindow',
    buttons:     buttons
    }
  );
  
  //Hier noch die Event-Handler für die Checkboxen anhängen
  /*if(dialogTeilnehmerFilterContent.length == 0) {
   // $('#dialogTeilnehmerFilter :input[type=checkbox][value!=default]').click(function() {
     // sucht das input Element im HTML DOM Baum; das geht erst hier nach dem Einhängen durch den Dialog
    $('#dialogTeilnehmerFilter input.tnStatusFilter').click(function() {
      $('#dialogTeilnehmerFilter :input[type=checkbox][value=default]').prop("checked", false);
    });
  }*/
} // end createTeilnehmerFilterDialog


/********************************************************************************************************/
/*  Funktionen und Dialog zum Filtern der Termine                                                       */  
/********************************************************************************************************/

function createTermineFilterDialog(){

  var $dialogTermineFilter = $('<div id="dialogTermineFilter"></div>');
  
  var dialogTermineFilterContent = '';
  // Zeitraum - nachschauen, ob diese Spalte in der Tabelle überhaupt existiert
  dialogTermineFilterContent += getColumnWithClass('kurstag_datum_komplettkurz_jahrkurz', terminTableStyle) === undefined ? "" : '<tr>'+
      '<td>Datum:</td><td><input type="radio" name="terminebereich" value="default" id="alleZeitenTermine" checked="checked">gesamt</td></tr>'+
      '<tr><td></td><td><input type="radio" name="terminebereich" value="" id="nichtalleZeitenTermine">zwischen '+
      '<input type="text" name="terminevon" id="terminevon" class="date" length="12"> und '+
      '<input type="text" name="terminebis" id="terminebis" class="date" length="12"></td>'+
      '</tr>';
  // Uhrzeit  kurstag_zeit_ende  kurstag_zeit_beg
  if( getColumnWithClass('kurstag_zeit_beg', terminTableStyle) !== undefined &&
      getColumnWithClass('kurstag_zeit_ende', terminTableStyle) !== undefined){
    dialogTermineFilterContent += '<tr><td>Uhrzeit:</td><td>'+
            '<input type="radio" name="termineUhrBereich" value="default" id="termineUhrAlle" checked="checked">gesamt</td>'+
            '</tr><tr><td></td><td>'+
            '<input type="radio" name="termineUhrBereich" value="" id="termineUhrZwischen">zwischen '+
            '<input type="text" name="terminevon" id="termineuhrvon" class="date" length="12"> und '+
            '<input type="text" name="terminebis" id="termineuhrbis" class="date" length="12"></td>'+
    '</tr>';
  }
  // Dozent - nachschauen, ob diese Spalte in der Tabelle überhaupt existiert
  dialogTermineFilterContent += getColumnWithClass('dozent_namevorname', terminTableStyle) === undefined ? "" : '<tr>'+
      '<td>Dozent:</td>'+
      '<td nowrap><input type="text" name="termineDozent" id="termineDozent" style="width: 100%"></td>'+
      '</tr>';
  // Ort - nachschauen, ob diese Spalte in der Tabelle überhaupt existiert
  dialogTermineFilterContent += getColumnWithClass('kurstag_ort', terminTableStyle) === undefined ? "" : '<tr>'+
      '<td>Ort:</td>'+
      '<td nowrap><input type="text" name="termineOrt" id="termineOrt" style="width: 100%"></td>'+
      '</tr>';
  // Bemerkung - nachschauen, ob diese Spalte in der Tabelle überhaupt existiert
  dialogTermineFilterContent += getColumnWithClass('kurstag_bemerkungen', terminTableStyle) === undefined ? "" : '<tr>'+
      '<td>Bemerkung:</td>'+
      '<td nowrap><input type="text" name="termineBemerk" id="termineBemerk" style="width: 100%"></td>'+
      '</tr>';
  // Nur ausgefallene oder stattgefundene
  dialogTermineFilterContent += getColumnWithClass('kurstag_invisibleAusfall', terminTableStyle) === undefined ? "" : '<tr>'+
      '<td>Status:</td><td><input type="radio" name="terminestatus" value="default"        id="alleStatiTermine" checked="checked">alle</td></tr>'+
      '<tr><td   ></td><td><input type="radio" name="terminestatus" value=""  id="nurAusfallTermine">nur ausfallende Termine</td></tr>'+
      '<tr><td   ></td><td><input type="radio" name="terminestatus" value="" id="nurStattgefTermine">nur stattfindende Termine</td></tr>';
  
  var array = new Array();
  array[0] = new Object();
  //array[0]['Termine'] = KuferTools.Spracheinstellungen.Kurstermine.Plural.Nominativ;
  
  for (var eigenschaft in array[0]) {
    dialogTermineFilterContent = dialogTermineFilterContent.replace( RegExp(eigenschaft, 'g'), array[0][eigenschaft]);
  }
  
  if(dialogTermineFilterContent.length == 0){
    $dialogTermineFilter.append('Es sind keine Daten vorhanden, es kann also kein Filter gesetzt werden.');
    $('#kdetails_termineControlDiv').css("visibility","hidden");
  } else {
    // Wenn es filterbare Spalten/Einträge gibt
    $dialogTermineFilter.append('<table>' + dialogTermineFilterContent + '</table>');
  }
  
  
  var buttons = {
      "Schließen":      function() {$(this).dialog("close");},
      "Filter leeren": function() {removeFilterTerminTable();$(this).dialog("close");},
      "Filter setzen": submitTermineFilter
  };
  
  $dialogTermineFilter.dialog({
    modal:       true,
    autoOpen:    false,
    width:       550,
    title:       'Filter für die Anzeige der Termine zu '+KuferTools.Spracheinstellungen.Kurs.Singular_mit_Artikel.Dativ+' ' + KuferTools.KursDetails.Kurs.Knr,
    bgiframe:    true,
    resizable:   false,
    dialogClass: 'dialogwindow',
    buttons:     buttons
    }
  );

  var $vonZeit  = $('#terminevon');
  KuferTools.InitDatePicker($vonZeit);
  $vonZeit.click(function(){$('#nichtalleZeitenTermine').prop('checked', true);});

  var $bisZeit = $('#terminebis');
  KuferTools.InitDatePicker($bisZeit);
  $bisZeit.click(function(){$('#nichtalleZeitenTermine').prop('checked', true);});
  
  var $vonUhrZeit = $('#termineuhrbis');
  $vonUhrZeit.timepicker({ });
  $vonUhrZeit.click(function(){$('#termineUhrZwischen').prop('checked', true);});
  
  var $bisUhrZeit = $('#termineuhrvon');
  $bisUhrZeit.timepicker({ });
  $bisUhrZeit.click(function(){$('#termineUhrZwischen').prop('checked', true);});
} //end  createTermineFilterDialog()

function submitTermineFilter() {
  doFilterTerminTable($('#dialogTermineFilter input'));
  $('#dialogTermineFilter').dialog("close");
}

/*************************************************************************************************************
   JQuery Event Handling, das beim Laden des Dokuments bereitgestellt wird  //!!!!!Document.Ready!!!!
***************************************************************************************************************/
$(document).ready(function() {

  //Initialisiert die dataTables der verschiedenen Reiter
  initTerminTable();
  initTeilnehmerTable();
  initJournalTable();
  initDozentenTable();
  
  // Behebt die falsche Berechnung der Spaltenbreite wenn eine DataTable in einem Tab dargestellt wird
  $("#kursdetails").tabs({
	  "activate": function(event, ui) {
      if ( typeof(journalTable) != 'undefined' && journalTable !== null  && journalTable.is(':visible') ) {
        journalTable.fnAdjustColumnSizing();
      }
      if ( typeof(terminTable) != 'undefined' && terminTable !== null  && terminTable.is(':visible') ) {
        terminTable.fnAdjustColumnSizing();
      }
     if ( typeof(teilnehmerTable) != 'undefined' && teilnehmerTable !== null && teilnehmerTable.is(':visible') ) {
        teilnehmerTable.fnAdjustColumnSizing();
      }
     if ( typeof(dozentenTable) != 'undefined' && dozentenTable !== null && dozentenTable.is(':visible') ) {
    	 // Z.B. im Tool Kursplanung durch Doz sind mehrere Dozenten-Datatables auf einer Seite
    	 dozentenTable.filter(':visible').dataTable().fnAdjustColumnSizing();
        }
    }
  });

  //Bildergalerie!!
  if ($('#foto_gallery').length > 0) {
    try {
      Galleria.loadTheme('../jquery/galleria/themes/classic/galleria.classic.min.js');
      $('#foto_gallery').galleria({
        width: 775,
        height: 375,
        imageCrop: false,
        carousel: false
      });
    } catch (err) {}
  }
  
  // Versenden von Sammel-Emails beim TeilnehmerTab 
  
  $("a#teilnehmerSammelmail").click(function() {
    KuferTools.KursDetails.SendeSammelEmail(false);
  });
  $("a#teilnehmerSammelmailOutlook").click(function() {
    KuferTools.KursDetails.SendeSammelEmail(true);
  });
  
  // Belegungs Ids bei diesen Link Ids anhängen
  $("a#teilnehmerBescheinigung,a#teilnehmerNachricht,a#teilnehmerSammelsms").click(function() {
    //bei Klickevents wird mit return false die weitere Verarbeitung am Server gestoppt   
    //Exception Handling muss innerhalb der einzelnen Klickhandler stattfinden
    try {
      //Für teilnehmerBescheinigungen müssen die Belegungs Ids im HexFormat ansonsten im Dezimalformat ausgegeben werden
      var hexFormat = false;
      if ($(this).prop('id') == 'teilnehmerBescheinigung')
        hexFormat = true;
        
        var userKennz = 'teilnehmer';
        var $this = $(this);
        if (KuferTools.KursDetails.AddIDsString2Url($this,hexFormat,userKennz) === true) {
          KuferTools.KursDetails.AddReiterTab2Url($this);
          return true;
        }
        return false;
        
        
     // return KuferTools.KursDetails.AddBelegString2Url($(this),hexFormat);
    }
    catch(e) {
        showMessage(e.message,e.name + ' Exception');
        return false;
      }  
  }); //end clickHandler
  
  $("a#dozentenSammelsms").click(function() {
    try {
      var userKennz = 'dozentenhonorar';
      var $this = $(this);
      if (KuferTools.KursDetails.AddIDsString2Url($this,false,userKennz) === true) {
        KuferTools.KursDetails.AddReiterTab2Url($this);
        return true;
      }
      return false;
    }
    catch(e) {
      showMessage(e.message,e.name + ' Exception');
      return false;
    }
  });
  
   $("#tnListDruckButton4Details").click(function(event){
    event.preventDefault();
    KuferTools.HandleDetailsDruckListenKlick('tnListen', "Druck der "+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+"listen", 
                                             'auto',false);
  });
  
  // Klickhandler auf alle Hrefs Elemente (auf die Klasse emailform) in den Reitern für Dozenten und Teilnehmer 
  // hinzufügen um das richtigen &tab=tab-xx an die URL anzuhängen
  $eMailFormHref = $('.tab_dozenten, #tab_kteilnehmer').find('a.emailform') 
  $eMailFormHref.click(function(event) {
//  $('a.emailform', '#tab_kteilnehmer').click(function(event) {
    //event.preventDefault() muss hier raus, da sonst die weitere Ausführung verhindert wird; d.h. tab-xx wird zwar
    //an den Link im DOM-Baum gehängt, aber Seite wird nach Klick nicht gewechselt
    // this ist hier <a class="emailform" href="... ">
    var $this = $(this);
    KuferTools.KursDetails.AddReiterTab2Url($this);
  });

 
  //Damit beim Klick auf nächsten/vorherigen Kurs der ausgewählte Tab erhalten bleibt
  KuferTools.KursDetails.setAnkerFromURLAnker(); //Wird beim Laden der Seite aufgerufen. Hängt an
                                                 //die Links zum Blättern den aktuellen anker an
  //Ändert bei einem Klick auf einen Reiter den Anker der Blättern-Links
  $('.text_reiter').click(function(){
    KuferTools.KursDetails.setAnkerForTab($(this).prop('href'));
  });
  
  
  $('.buttontab').click(function(e) {
   var $this = $(this);
   var aktLink = $this.prop('href');
   //den aktivierten Tab für den aktuellen Reiter an den Link anhängen z.B. #tab-6
   var tab = $('.text_reiter','li.ui-state-active').prop('href');
   aktLink += tab;
   //Damit den Tab an den Link anhängen also z.B href = usertools.php?tool_id=8&...&deleteDoku=1&dokumentid=322#tabs-6
   $this.prop('href',aktLink);
   return true; //Weiter im PHP Ablauf
}); //End Klickhandler f. delete
  
  //Gibt den Dialog zum Bearbeiten von Kursdaten (nach Anklicken des entspr. Buttons) aus;
  //verwendet den Sightbuilder zum Aufbau des Formulars u. sendet einen Ajax-Request
   $('.kurs_bearbeiten').click(function() {
    
      var link = 'usertools.php';
      //var dozid = 1;
      var actionPart = '&action=updateKurs&knr=';
      var dataStr = "tool_id=" + KuferTools.ToolId + '&toolsection_id=' + KuferTools.ToolSectionId + actionPart +
                   KuferTools.KursDetails.Kurs.Knr;
      var weite = 800;
      var buttons =   {
                     "Speichern": function() {
                       //Das via loadAndDisplayPage(..) aufgebaute Formular validieren und abschicken; hat die Form
                       // <form id="sightbuilderform" class="ui-dialog-content...>...
                       
                       var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + '&xsrf='+KuferTools.TabPageXsrf;
                       var $form = KuferTools.Page;
                       $form.prop('action',actionLink);
                       $form.append('<input type="hidden" name="kursupdate" value="1">');
                       //Validiert derzeit nur einige Werte (wie z.B. Datumswerte, Wochentage) auf Korrektheit; prüft bei den anderen 
                       //Einträgen nur, ob Pflichtfelder nicht leer sind;  z.B. werden Telefonnr. ausreichend validiert
                       if (validateForm($form.find('input, select, textarea')) !== true) {
                         var message = 'Bitte geben Sie gültige Werte in die als Pflichtfelder gekennzeichneten Eingabefelder ein. ';
                         showMessage(message,'Validierung fehlgeschlagen');
                       }
                       else
                        $form.submit();
                        //Dialog close ist hier nicht nötig, da Seite sowieso neu geladen wird
                    },
		     "Abbrechen": function() {$(this).dialog("close");}
		    }; 
    //Hier erfolgt das Nachladen der Seite via Ajax und die Seitenausgabe via showMessage()
    KuferTools.Utils.loadAndDisplayPage(link,dataStr,buttons,weite);
  }); //end Klickhandler f. Bearbeiten eines Kurses
  

/*
 * Changehandler zum Aktualisieren der UEs bei Änderung des Kursbeginns
 * oder Kursendes
 */
   $(document).on('change', '#kurs_beginn, #kurs_ende', function() {
       //Initialisere Zeitobjekt Instanz
       var zeitObj = new KuferTools.KursDetails.ZeitObj();
       if(!zeitObj.getZeiten())
         return;
       
       var beginn = KuferTools.KursDetails.Kurs.Zeitbeg;
       var ende = KuferTools.KursDetails.Kurs.Zeitende;
       var minuten = timeToMinutes(ende) - timeToMinutes(beginn);
       var ue = KuferTools.Utils.minToUe(minuten);
       KuferTools.KursDetails.Kurs.Ue = String(ue).replace(/\./,',');
       
       zeitObj.aktualisiereZeiten();
   });
  
  /*
   * Aktualisiert bei einer Änderung der UEs für den Kurs das Kursende
   */
  $(document).on('change', '#kurs_stundenanz', function() {
    //Initialisere Zeitobjekt Instanz
    var zeitObj = new KuferTools.KursDetails.ZeitObj();
    if(!zeitObj.getZeiten())
      return; 
    var ue = KuferTools.KursDetails.Kurs.Ue;
    
    var ueFloat = ((ue != '') ? ue.replace(/,/,'.') : 0);
    var minuten =  KuferTools.Utils.UeToMin(ueFloat);
    var begMinuten = timeToMinutes(KuferTools.KursDetails.Kurs.Zeitbeg);
    var endeMinuten = begMinuten + minuten;
    KuferTools.KursDetails.Kurs.Zeitende = minutesToTime(endeMinuten);
    
    zeitObj.aktualisiereZeiten();
  });

  KuferTools.KursDetails.InitStornoDialog();
  
  // table.tab_kteilnehmer tbody td.teilnehmer_vorname, table.tab_kteilnehmer tbody td.teilnehmer_name
  $(document).on({
    mouseenter:
            function() {
              var thisTd = this;
              var belid = $(this).parent().first().children().first().children().first().prop('value');
              if (belid) {
                var fotolink = KuferTools.BelidToFotolinkMapping[belid];
                if (fotolink) {
                  var image = new Image();
                  image.onload = function(){ 
                    var newWidth = image.width;
                    var newHeight = image.height;

                    var maxWidth = 320;
                    var maxHeight = 320;

                    if( image.width > image.height ) {
                      // Landscape
                      if(image.width > maxWidth) {
                        var factor =  maxWidth / image.width;
                        newWidth = maxWidth;
                        newHeight = image.height * factor;
                      }
                    } else {
                      // Portrait
                      if(image.height > maxHeight) {
                        var factor = maxHeight / image.height;
                        newWidth = image.width * factor;
                        newHeight = maxHeight;
                      }
                    }

                    thisTd.tip = '<img src="' + fotolink + '" width="' + newWidth + '" height="' + newHeight + '" />';
                    $('body').append(
                            '<div class="toolTipWrapper">'
                            + thisTd.tip
                            + '</div>'
                            );
                    thisTd.title = "";
                    
                    // damit das div der maus folgt
//                    $(document).on('mousemove', function(event){
//                        event = event || window.event; // IE-ism
//                        
//                        $('.toolTipWrapper').css({
//                          // passiert das gleiche
//                          left:  event.pageX,
//                          top:   event.pageY
//                          //left:  event.clientX,
//                          //top:   event.clientY
//                        });
//                    });
                    
                    // .toolTipWrapper
                    $(document).on({ 
                      mouseenter: function() {
                        $('.toolTipWrapper').fadeOut('slow');
                        $('body').children().remove('.toolTipWrapper');
                      }
                    }, '.toolTipWrapper');
                    
                    var $toolTipWrapper = $('.toolTipWrapper').last();
                    var $positionTd = $(thisTd).offset();
                    $toolTipWrapper.css('left', $positionTd.left);
                    $toolTipWrapper.css('top', $positionTd.top + $(thisTd).outerHeight(true));
                    
                    $toolTipWrapper.fadeIn('slow');
                    
                  };
                  
                  // start loading the image
                  image.src = fotolink;
                  
                  
                }

              }

            },
    mouseleave:
            function() {
              $('.toolTipWrapper').fadeOut('slow');
              $('body').children().remove('.toolTipWrapper');
            }}, "table.tab_kteilnehmer tbody td.teilnehmer_vorname, table.tab_kteilnehmer tbody td.teilnehmer_name"
  );
  
  //Gibt für das Teilnehmertool die 'Termine nach Outlook' aus.
    $('.terminenachoutlooklink').click(function(e) {
      
	    e.preventDefault();
      openDialog4TerminButtonsICS( 'Doz','nr',true )
	    return false;
    });
    
  if(KuferTools.ToolId == '20' && KuferTools.isBLAK && KuferTools.isBGLU){
    
    $('#nachweisLinkUpload_blak').click(function(){
      KuferTools.uploadNachweisBlackBglu();
    });
  }
});  //end document ready
/******************************  Ende de Ready Handlers    *********************************************************/



/******************************************************************************************************************
 * Ab hier werden weitere Funktionen und Klassen zu den Kursdetails definiert
 *****************************************************************************************************************/

/**
 * liefert ein Objekt, das die Selektoren zu den Kurszeiten enthält
 * 
 * @returns {kursZeitenObj} 
 **/
 KuferTools.KursDetails.ZeitObj = function() {
  this.$beginn =  $('#kurs_beginn');
  this.$ende =  $('#kurs_ende');
  this.$ue =  $('#kurs_stundenanz');
 }
 
 // statt  this.getZeiten etc. besser Prototyp verwenden, da weniger Speicher dort gebraucht wird
 // als in der Instanz
   /**
    * Speichert die Zeitwerte aus den Inputfeldern in die globalen Javaskript Variablen ab
    * 
    * Validiert die Eingabewerte; danach Abspeichern in KuferTools.KursDetails.Kurs.xxx
    * @return bool isOK true, wenn Validierung OK ist
    */
   KuferTools.KursDetails.ZeitObj.prototype.getZeiten =  function() {
      var $beginn = this.$beginn;
      var $ende = this.$ende;
      var $ue = this.$ue;
      // verhindert falsche Vorbesetzung mit '' (stattdessen Vorbes.: 0) und damit einen Validierungsfehler
      if ($ue.val() == "")
        $ue.val(KuferTools.KursDetails.Kurs.Ue);
        //validInput gibt true zurück, falls das Feld nicht existiert
      var isOk = true;
      isOk = validateInput($beginn)  && isOk;
      isOk = validateInput($ende)    && isOk;
      isOk = validateInput($ue)      && isOk;
      if(isOk) {
        if($beginn.length != 0 ) KuferTools.KursDetails.Kurs.Zeitbeg  = $beginn.val();
        if($ende.length != 0)    KuferTools.KursDetails.Kurs.Zeitende    = $ende.val();
        if($ue.length != 0)      KuferTools.KursDetails.Kurs.Ue      = $ue.val();
      }
      return isOk;    
   } //end prototype.getZeiten
  
  /**
   * Aktualisiert die Zeiten in den Inputfeldern
   * Übernahme aus den JS Variablen hierzu (KuferTools.KursDetails.Kurs.xxx)
   */
  KuferTools.KursDetails.ZeitObj.prototype.aktualisiereZeiten =  function() {
    this.$beginn.val(KuferTools.KursDetails.Kurs.Zeitbeg);
    this.$ende.val(KuferTools.KursDetails.Kurs.Zeitende);
    this.$ue.val(KuferTools.KursDetails.Kurs.Ue);
  } //end aktualisiereZeiten
  
  

// Holt die benötigten Kursdaten per AJAX-Request ab und hängt sie in den Ausgabedialog
// Beim Bestätigen des Dialogs (per OK Button) wird ein Formular mit den ausgewählten Kursen abgeschickt
KuferTools.KursDetails.HandleReleaseKlick = function(dokumentname,dokumentid) {
  var $section4DozKurse = 1;
  
  
  KuferTools.Utils.AjaxLadebildschirm.Start();
  
  $.ajax({
   type: "Get",
   url: "usertools.php",
   data: "tool_id=" + KuferTools.ToolId + "&toolsection_id=" + $section4DozKurse + "&kurse4download=1" + "&aktKnr=" + KuferTools.KursDetails.Kurs.Knr + "&dokumentbez=" + dokumentname,
   success: function(msg){
     var response = msg;
     //Die einzige selektierte id ist die aktuelle Kursnr
     //KuferTools.KursDetails.SelectedIds = KuferTools.KursDetails.Kurs.Knr;
     var $releaseContent = $('<div id="release"></div>');           
    $releaseContent.append(response);
    
    
    KuferTools.Utils.AjaxLadebildschirm.Stop();
    
    var buttons = {"Abbruch": function() { $(this).dialog("close"); },
                   "OK":      function() {  
                                            //wg. Blättern in den Kursdetails nach einer Kurssuche nötig 
                                            var searchkurs = '';
                                            if (KuferTools.KursDetails.SearchKurs)
                                               searchkurs = '&searchkurs=1';
                                            var actionLink = 'usertools.php?tool_id=' + KuferTools.ToolId + '&toolsection_id=' + KuferTools.ToolSectionId + 
                                                              '&nr=' + KuferTools.KursDetails.Kurs.Knr + searchkurs + '&releaseDoku=1';
                                            //aktuell aktivierten Tab für Reiter Download an den Link anhängen z.B. #tab-6
                                            var tab = $('.text_reiter','li.ui-state-active').prop('href');
                                            actionLink += tab;                 
                                        
                                            var $markedKurse = $('#release input.kurse4release:checked')
                                            if  ($markedKurse.length > 0) {
                                              var trenner = ':';
                                              var $form = $('<form name="releaseFormular" action="' + actionLink + '" method="post"></form');
                                              var selectedStr = '';
                                              $markedKurse.each(function(index, item) {
                                                $item = $(item);
                                                selectedStr += $item.val() + trenner;
                                              });
                                              
                                              //letzten Trenner entfernen; charAt verwendet wg. IE7-BUG: der kennt Ausdruck selectedStr[i] nicht
                                             if (selectedStr.charAt(selectedStr.length-1) == trenner) {
                                               selectedStr = selectedStr.substring(0, selectedStr.length-1);
                                             }
                                              // Dokumentenid zum Ermitteln des aktuellen Dokumenteneintrags in PHP notwendig
                                              $form.append($('<input type="hidden" value="'+selectedStr+'" name="kurse4release">'));
                                              $form.append($('<input type="hidden" value="'+dokumentid+'" name="dokumentid">'));
                                              //Hier muss das Formular noch in den DOM Baum gehängt werden
                                             $('body').append($form); 
                                              $form.submit();
                                              $(this).dialog("close"); 
                                            } //end if  ($markedKurse.length > 0)
                                            else {
                                              showMessage('Sie haben keine Kurse ausgewählt.','Achtung');
                                            }
                                          } //end "OK": function()
                   };
     showMessage($releaseContent ,'Dokument "' + dokumentname + '" den folgenden Kursen zuordnen', buttons);
   },
   error: function(a,b,c) {
      
      KuferTools.Utils.AjaxLadebildschirm.Stop();
      
      showMessage("Fehler beim Abschicken des AJAX Requests: Verbindung zum Server ist fehlgeschlagen.");
   }
});};


/* Anwendung der NMList - für den Dialog zum Hochladen von Dokumenten */
DokumenteList = function(){
  this.getNewObject = function() {
     var currentDate = new Date();
     var bezeichnung =  "";
     var anzahlDokusOnPage =  jQuery('div.sightdiv.uebersicht.dokument').length;
     //console.log("dokusonPage: " + anzahlDokusOnPage);
     //var anzahlDokusOnPage = 0;
     return {"bezeichnung":bezeichnung,"stand":FormatDate(currentDate), "bemerkung":"",
     "knr":KuferTools.KursDetails.Kurs.Knr,"original":"","internet":"",
     "kostenbemerkung":"","kosten":"","autor":"","autoram":"",
     "reihenfolge":anzahlDokusOnPage + KuferTools.KursDetails.Dokumente.length+1,
     "id":-1,"freigabenoetig":"","downloadTN":"1","fileInfo":""
     };
  };
  //Detailbildschirm für die Dokumente anzeigen:
  this.showSubscreen = function(pData, pNewItem) { //Detailbildschirm für Bearbeiten/Hinzufügen eines Datensatzes
     var tmpl = $('.templateDetailsDokumente').html();//Template für Dokumente Detail Dialog holen
     var $ziel = $('<div></div>');
     $ziel.append(parseTemplate(tmpl, pData));//template mit dem aktuell ausgewählten Dokument parsen und beim Ziel einhängen
     
     
     //Hinweis beim Klick auf den Labeltext ausgeben
    $ziel.find('.label4select').click(function() {
     var text = 'Diese Einstellung kann vom Administrator in den Zentralen Einstellungen der KuferTools aktiviert bzw. deaktiviert werden.';
     showMessage(text,'Hinweis');
     //return true;
     });

     //$ziel.find('.hasDatePicker').datepicker();//Datepicker für die Datumsauswahl
     
    //HL Button für die Auswahl des Dozenten; Bearbeiten des 2ten Dialogs (Auswahldialog)
    var detailsTitel = pNewItem?'Neues Dokument':'Dokument bearbeiten';
    showMessage($ziel, detailsTitel,
        { "Abbrechen": function() {
                if (pNewItem) {//falls gerade auf hinzufügen geklickt wurde: danach wieder entfernen, wurde nämlich bereits in "data" aufgenommen
                  KuferTools.KursDetails.Dialog.DokumenteList.removeLast();
                  KuferTools.KursDetails.Dialog.DokumenteList.renderData();
                }  
                $(this).dialog("close"); }
          ,"Ok": function() {
               if(jQuery("#dokumentenmList").children("tbody").children().length > KuferTools.KonstantenOderSettings.MAX_ANZAHL_ATTACHMENTS){
                 var dokumente = ' Dokumente';
                 if (KuferTools.KonstantenOderSettings.MAX_ANZAHL_ATTACHMENTS == 1)
                   dokumente = ' Dokument';
                 showMessage("Leider ist es nicht möglich, mehr als "+KuferTools.KonstantenOderSettings.MAX_ANZAHL_ATTACHMENTS + dokumente + " auf einmal hochzuladen.", "Hinweis");  
               } else {
                 $this = $(this);
                 var restoreData = KuferTools.KursDetails.Dialog.DokumenteList.getRestoreInfo();
                 var fehlerbei = "";
                 var inputleer = false;//war evtl. schon vorbelegt
                 var selectedFile = null; 
                 for (var x in restoreData) {
                   $inputElem = $this.find(x);
                   if ($inputElem.hasClass("val_float") && $inputElem.val() == '')
                     //weitermachen beim nächsten Element; float nur validieren wenn es gefüllt ist
                     continue;  
                   if (!validateInput($inputElem)) {
                     fehlerbei += ', '+restoreData[x][0].toUpperCase() + restoreData[x].substring(1);
                   }
                   //Das <Input type="file"..> Element für detail_original_dokumente muss auch im Bearbeiten
                   //Dialog mitgeführt werden, damit fileInfo auch dort besetzt wird (mit dem Inputwert); es
                   // wird aber dann nicht angezeigt (display.none) und hat als Vorgänger ein div#detail_original_dokumente;
                   //nur falls dieser  Vorgäger Nicht vorhanden ist wird das Inputelement ausgewertet, um einen Hinweis
                   //auszugeben (falls kein File eingegeben wurde)
                   if ($inputElem.is("[type=file]")) {
                     if (!$inputElem.prev().is("[id=detail_original_dokumente]"))
                       inputleer = ($inputElem.val() == '');  
                     // Falls die eigegebene Datei bereits in der DokumenteList unter data[i].original existiert
                     // wird es nicht mehr ausgewählt; verhindert Auswahl mehrer gleicher Dateien z.B. index.css
                     selectedFile = getFromArray(KuferTools.KursDetails.Dialog.DokumenteList.data, $inputElem.val(), 'original')
                      
                   } //end if $inputElem.is("[type=file]"))  
                 } //end for
                 
                 
                 // console.log("inputval " +  $inputElem.val() + "  inputleer " + inputleer + "  selfilename: " + selectedFile.original);
                 if (inputleer)
                   showMessage("Sie haben noch keine Datei ausgewählt.<br>Bitte wählen Sie eine Datei zum Hochladen aus!", 'Hinweis');
                 else if (selectedFile != null)
                   showMessage("Sie haben die Datei " + selectedFile.original + "  bereits zum Hochladen ausgewählt.<br>Bitte wählen Sie eine andere Datei aus!", 'Hinweis');
                 else if (fehlerbei == "") {
                   KuferTools.KursDetails.Dialog.DokumenteList.restoreSubscreenData(pData, $this); // jetzt befindet sich die Datei in der Liste
                   var filtered = KuferTools.KursDetails.Dialog.DokumenteList.data.filter(
                     function (element, index, array) {
                                                        return element.original.endsWith('.php');
                                                       });                                                                                 
                   if(filtered.length > 0) {
                     showMessage("Aus Sicherheitsgründen ist es nicht erlaubt Dateien mit der Endung .php hochzuladen.", "Hinweis");
                     KuferTools.KursDetails.Dialog.DokumenteList.removeLast();
                   }
                   KuferTools.KursDetails.Dialog.DokumenteList.renderData();
                   //Um einen Darstellungsfehler zu beheben, welcher bei zu vielen Dokumenten auftreten kann.
                   $('#buttonleiste_vert').css('min-height', $('#dokumentenmList').height() + 'px');
                   $(this).dialog("close");
                 }
                 else {
                   showMessage("Falsches Format!<br>Prüfen Sie bitte den Inhalt von: " + fehlerbei.substring(2), 'Fehler');
                 }
               }
           }
        },
        570  //Breite des Dialogfensters
     );
     $ziel.find('#detail_bezeichnung_dokumente').focus();
  };
  /**
   * Schreibt die Daten aus Dialog $dialog in das Objekt pData zurück
   * pData ist z.B. KuferTools.KursDetails.Dialog.DokumenteList.data[$i] also der i-te
   * Datensatz in der Dokumentenliste
   */
  this.restoreSubscreenData = function(pData, $dialog) {
    var restoreData = this.getRestoreInfo();
    //Checkboxwert wird zur Anzeige  umgesetzt in 'W' bzw. 'F' (Wert in freigabenoetig)
    for (var x in restoreData) {
      $inputElem = $dialog.find(x);
      //if ($inputElem.prop('type') == 'checkbox') {
      if ($inputElem.is("[type=checkbox]")) {
        pData[restoreData[x]] = 'F';
        //if ($inputElem.prop('checked') == true)
        if ($inputElem.is(':checked'))
          pData[restoreData[x]] = 'W';    
      }
      else if ($inputElem.is("[type=file]")) {
        //Hier muss das ganze Input Objekt genommen werden, nur die files kann man aus Sicherheitsgründen nicht setzen
        if (pData[restoreData[x]] == "") {//Wenn schon mal gesetzt: nicht mehr änderbar
          //für restoreData[x] = fileInfo wird das gesamte inputElement (0-tes Element in der fileInfo.FileList) gespeichert 
          pData[restoreData[x]] = $inputElem.get(0);//.files;
          //Original nur mit Wert (z.B. Datei1.txt) besetzen
          // Korrektur: im IE ist der Dateiname mit Pfad angegeben (C:\Hilfe\Beisp\doku1.txt); daher 
          var originalwPfad = $inputElem.val();
          var originalAry =  originalwPfad.split("\\");
          var lastpos1 = originalAry.length-1;
          var original = '';
          if (lastpos1 >=0) {
            var originalLast = originalAry[lastpos1];
            //jetzt das letzte Element nochmals nach "/"  splitten; die Doku könnte ja unter LINUX abgelegt sein und  
            // z.B var/wwe/Beisp/doku1.txt  heißen
            var originalLastAry = originalLast.split("/");
            var lastpos2 = originalLastAry.length-1;
            if (lastpos2 >=0) {
              original = originalLastAry[lastpos2];
            }
          } // end if (lastpos1..)

          pData['original'] = original;
          
         // console.log("input file: " + restoreData[x] + "original: " + pData['original'] + " fileInfo: " +  pData[restoreData[x]]);
        }
      }
      //Hier die Zahlenwerte für die Radiobuttons behalten; Umsetzung in Texte erfolgt im Template in Methode 
      // getDokumenteList() in tabkursdetails.php
      /*
      else if ($inputElem.is("[type=radio]") && $inputElem.hasClass('dokudownload_detail')) {
        switch($inputElem.val()) {
          case '1': 
            pData[restoreData[x]] = 'Alle TN';  
            break; 
          case '2': 
            pData[restoreData[x]] = 'TN mit Login';  
            break; 
          case '3': 
            pData[restoreData[x]] = 'TN im Kurs';  
            break; 
            
          } //end switch
        //console.log("dokudownloadTN: " +  pData[restoreData[x]] + " inputelem: " + $inputElem.val());
      } //end else if
      */
      else {  //alle anderen Inputs also type = radio, text, hidden und  textareas
        pData[restoreData[x]] = $inputElem.val();
      }
    } //end for
  };
  /**
   * Liefert die Info, welche Felder wohin gespeichert werden müssen.
   */
  this.getRestoreInfo = function(){ 
    // input[name=detail_downloadTN_dokumente] liefert 3 Radiobutton Element und davon ist das geheckte zu nehmen
    //Achtung: das Mapping "#detail_original_dokumente":"original" erfolgt nicht hier; sondern in restoreSubscreenData  
    // wird pData['original'] = original gesetzt 
    return {"#detail_bezeichnung_dokumente":"bezeichnung", "#detail_original_dokumente":"fileInfo",  "#detail_bemerkung_dokumente":"bemerkung", 
            "#detail_stand_dokumente":"stand", "#detail_kosten_dokumente":"kosten","#detail_kostenbemerkung_dokumente":"kostenbemerkung",
            "#detail_freigabenoetig_dokumente":"freigabenoetig", "input[name=detail_downloadTN_dokumente]:checked":"downloadTN"
        };
  };
  
};  //end DokumenteList



// Öffnet neues Fenster zum Senden einer Sammel E-Mail and die Emailadr. der ausgewählten Teilnehmer 
KuferTools.KursDetails.SendeSammelEmail = function(pOutlook) {
    //Markierte Teilnehmer auswählen
    var $markableinputs = $('#tab_kteilnehmer input.markable:checked');
    //Sammelemail und emailoutlook Fkt. haben unterschiedl. Trenner
    if ($markableinputs.length>0) {
      var str = '';
      var trenner = ',';
      if (pOutlook)
        trenner = ';';
      //Für jeden markierten teilnehmer die Email an den Email String anhängen  
      $markableinputs.each(function(index, item) {
        var $item = $(item);
        if ($item.data('email') != '')
          str += $item.data('email') + trenner;
      });
      if (str.length > 0) {
        //letzten Trenner entfernen
        if (str[str.length-1] == trenner)
          str = str.substring(0, str.length-1);
        //Mailfenster mit Mailadresse des aktuellen Users(Dozenten) in neuem fenster öffnen  
        var mailwindow = window.open('mailto:' + KuferTools.KursDetails.CurrentUserEmail + "?bcc="+ str , '_blank'); 
        if (mailwindow) 
          mailwindow.close();
      }
      else 
        showMessage('Keiner der ausgewählten Teilnehmer besitzt eine E-Mail Adresse.','Achtung');
    }  //end if markableinputs.length
    else {
      showMessage('Sie haben keine Teilnehmer ausgewählt.','Achtung');
    }
};

// Hängt die Tab-id des aktuellen Reiters an die Url
KuferTools.KursDetails.AddReiterTab2Url = function($pAktAnker) {
  //Aktuelle Tab id zum Button Sammel-Email ermitteln 
  var tabId = $pAktAnker.parents('.content.tab').prop('id');
  // muß hier besetzt werden, um aus dem dem Bearbeiten Fenster wieder zum richtigen Reiter Termine zurückzukehren
  var link = $pAktAnker.prop('href') + '&tab=' + tabId;
  $pAktAnker.prop('href',link);
 };


// Hängt die Ids (belids oder dozids) an die URL für den Bescheinigungs- oder Nachrichtenbutton an wobei diese durch ":"" getrennt sind. 
//Falls pHexFormat = true ist, werden sie im HEX Format dargestelllt, ansonsten im Dezimalformat .z.B. '...&belids=ABF4:ABF5:ABF9', 
// ...&belids= 2944:3567 oder ...&dozids=4:35:434
KuferTools.KursDetails.AddIDsString2Url = function($pAktAnker,pHexFormat,pUserKennz) {
    var $markableInputs = '';
    var userPart4Link = '';
    var userBez = '';
    switch (pUserKennz) {
      //Zweig 'dozent' wird nicht benutzt; wäre später beim Dozenten mit anderer id $('#tab_..') denkbar
       // dozentenhonorar wird wegen Umstellung der Values der Checkboxen auf dozhond Ids benoetigt
      case 'dozentenhonorar':
      case 'dozent':
        $markableInputs = $pAktAnker.parents('.tab.content').find('.tab_dozenten input.markable:checked');
        userPart4Link = '&dozids';
        userBez = 'Dozenten';
      break;
      case 'teilnehmer':
        $markableInputs = $('#tab_kteilnehmer input.markable:checked');
        userPart4Link = '&belids';
        userBez = 'Teilnehmer';      
      break;
      default:
        throw {name: 'TypeError', message: 'Falscher Parameter: Wert ' + pUserKennz + ' passt nicht zu Parameter pUserKennz '};
      // return false;
      break;
    }
    
    // alert("strlen: " + $markableinputs.length);
    if ($markableInputs.length>0) {     
      var idStr = '';
      var trenner = ':';
      //Für jeden markierten Dozenten die DozId im Value Attribut anhängen  
      $markableInputs.each(function(index, item) {
        var $item = $(item);
        var idValue =  $item.val();
        // Für Dozentenhonorar Einträge ist die benötigte dozentenid im Id Attribut gespeichert; dort steht z.B dozent_60 etc.
        if (pUserKennz === 'dozentenhonorar') {
          var attrId = $item.prop('id');
          var attrIdAry = attrId.split('_');
          idValue = attrIdAry[1];
        }
        
        if (idValue !== '')
          //Ids müssen für die Ausgabe in Hex-Werte umgewandelt werden; Dazu: zuerst in Integer casten  und dann mit toString ins Hex 
          //System umwandeln
          var id =  parseInt(idValue);
          if (pHexFormat)
            id = id.toString(16);
          //alert(id + ' und HexWert: ' + id.toString(16));
          idStr += id + trenner;
      });
      
      // Wenn ein InputFeld (Dozent oder TN)  markiert wurde, besitzt er auch eine id; d.h. str != '' 
       //letzten Trenner entfernen
       //charAt verwendet wg. IE7-BUG: der kennt Ausdruck idStr[i] nicht
        if ( idStr.charAt(idStr.length-1) == trenner) {
          idStr = idStr.substring(0, idStr.length-1);
        }
        
        //Den String der Belegungs bzw. Dozenten Ids anhängen an die aktuelle URL; die lautet z.B. 
        //...usertools.php?nr=S3209&tool_id=8&toolsection_id=377; userPart4link ist z.B. '&dozids'
        var ankerLinkAry = $pAktAnker.prop('href').split(userPart4Link);
        // nur der Teil vor dem bisherigen &dozids=.. bzw. &belids=.. ist relevant; dadurch wird ein mehrfaches Anhängen 
        //von &dozids=.. bzw. &belids=.. verhindert
        var relevanterLink = ankerLinkAry[0];
        relevanterLink += userPart4Link + '=' + idStr;
        $pAktAnker.prop('href',relevanterLink);
         // Für die weitere Verarbeitung am Webserver: mit true wird link aufgerufen
        return true;

    } //end if markableInputs.length
    else {
      showMessage('Sie haben keine ' + userBez + ' ausgewählt.','Achtung');
      // mit false wird Linkaufruf gestoppt
      return false;
    }
};


KuferTools.KursDetails.setAnkerForTab = function(tab) {
  $('a.reiterseite_blaettern_vorwaerts_a, a.reiterseite_blaettern_zurueck_a').each(function(){
    var link = $(this).prop('href');
    link = link.split('#')[0]; //Falls bereits ein anker angehängt wurde
    $(this).prop('href', link + tab);
  });
}

KuferTools.KursDetails.setAnkerFromURLAnker = function() {
  var urlteile = document.URL.split('#');
  if(urlteile.length > 1) { //Anker ist nur gesetzt, wenn es mehr als 2 Teile gibt 
	  KuferTools.KursDetails.setAnkerForTab('#' + urlteile.pop());
  }
}

/**
 * Init für den Button und den Dialog zum Abmelden im Reiter Teilnehmer
 */
KuferTools.KursDetails.InitStornoDialog = function()
{
  var $dialog = $('#stornoDialog');
  if($dialog.length == 0) {
    return;
  }
  
  $dialog.detach();
  $('#stornoTnTable',$dialog).dataTable({
    "oLanguage": {"sUrl": "../jquery/plugins/jquery.dataTables.de_DE.txt"},
    "sScrollY": "", 
    "bFilter": false,
    "bInfo": false,
    "bSort": false,
    "bScrollCollapse": true,
    "bAutoWidth": false,
    "bPaginate": false
  });
  
  /**
   * Clickhandler für den Abmelden-Button. Öffnet einen Dialog, welcher die angehakten
   * Teilnehmer anzeigt
   */
  $('#teilnehmerStorno').click(function() {
    var selectedBelegIds = KuferTools.GetSelectedIds();
    if (selectedBelegIds.length < 1) {
      showMessage('Es muss mindestens ein '+ KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ +' für die Stornierung markiert werden.', 'Achtung');
      return false;
    }
    
    // Der Dialog enthält bereits die Teilnehmerinformationen. Nun werden die Teilnehmer ausgeblendet,
    // welche nicht angehakt wurden.
    $('tbody tr', $dialog).hide();
    $(selectedBelegIds).each(function(index, belegId){
      var trClass = 'storno_bel_' + belegId;
      var $row = $('tbody tr.' + trClass, $dialog);
      $row.show();
    });
    
    var buttons = {
      'Stornieren' : function() {
        var isOk = true;
        jQuery('.austritt').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 {
          KuferTools.Utils.AjaxLadebildschirm.Start();
          sendeStornieren( selectedBelegIds );
        }
      },
      'Abbrechen' : function(){
        $(this).dialog('close');
      }
    };
    
    showMessage( $dialog, 'Storniere' + KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ, buttons );
    // Unschön, aber ich hab mit DataTables keine bessere Lösung gefunden: Nachträglich werden bei allen
    // sichtbaren Zeilen odd und even neu vergeben
    var even;
    $('tbody tr:visible', $dialog).each(function(){
      if(even) {
        $(this).addClass('even');
        $(this).removeClass('odd');
        even = false;
      } else {
        $(this).addClass('odd');
        $(this).removeClass('even');
        even = true;
      }
    });
  });
  
  /**
   * Sendet die ausgewählten Belegungs-Ids und die dazugehörigen Stornogründe per Post ab.
   * 
   * @param pBelegungIdsAry Array von Belegungs-Ids
   */
  function sendeStornieren( pBelegungIdsAry )
  {
    var postObj = { "belIdsToStorno": pBelegungIdsAry.join(';') };
    jQuery.each(pBelegungIdsAry, function(key, belid){
      var grund = $('input#storno_grund_' + belid, $dialog).val();
      if(grund) {
        postObj['storno_grund_' + belid] = grund;
      } else { // Wenn Grund leer oder undefined
        postObj['storno_grund_' + belid] = '';
      }
      
      var austritt = jQuery('input#austritt_' + belid, $dialog).val();
      if (austritt) {
        postObj['austritt_' + belid] = austritt;
      } else { // Wenn Austritt leer oder undefined
        postObj['austritt_' + belid] = '';
      }
    });
    
    var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + '&xsrf='+KuferTools.StornoXsrf;
    KuferTools.Utils.Post( actionLink, postObj );
  }
}; //end KuferTools.KursDetails.InitStornoDialog


// Konstruktor für Pseudoklasse MarkedObjDialog 
// muss hier vor Definition der abgeleiteten Klassen in kursteilnehmer.js oder kursdozenten.js definiert werden;
// die hiervon abgeleiteten Klassen werden im Dozenten- und TeilnehmerReiter verwendet:
// z.B. KuferTools.KursDetails.Dozenten.MarkedDozHonDialog.prototype = new KuferTools.KursDetails.MarkedObjDialog();

KuferTools.KursDetails.MarkedObjDialog = function($pMarkableInputs,pAktObj) {
  this.$markableInputs = $pMarkableInputs;
  this.$aktObj = pAktObj;
  this.markedIds = [];
  
  //Gibt die markierten Ids zurück
  this.getMarkedIds = function() { 
    return this.markedIds;
  };
  
  //Diese Methode soll für beliebige Objekte verwendbar sein also z.B. Dozenten, Teilnehmer etc.
  //Setzt die Ids der markierten Input Checkboxen in ein Array also z.B. idAry(4,32,48) etc.
  this.setMarkedIds = function() {
    var hexFormat = false;
    if (this.$markableInputs.length>0) {     
      var idAry = [];
      this.$markableInputs.each(function(index, item) {
        var $item = $(item);
        if ($item.val() != '')
          //Ids müssen für die Ausgabe in Hex-Werte umgewandelt werden; Dazu: zuerst in Integer casten
          // und dann mit toString ins Hex System umwandeln
          var id =  parseInt($item.val());
          if (hexFormat)
            id = id.toString(16);
          //alert(id + ' und HexWert: ' + id.toString(16));
          idAry.push(id);
      }); 
      this.markedIds = idAry;
      return true
    }
    this.markedIds = idAry;
    return false;
  }//end setMarkedIds 

  //Objekt Methode zum Verarbeiten der Markierten Ids für verschiedene Objekt z.B. Dozentendetails, Dozentenhonorardaten, Teilnehmerdaten etc.;
  // unterscheidet sich in den einzelnen erbenden Prototype Klassen je nach Bedarf (z.B eine bzw. mehrere markierte Ids erlauben)
  this.handleMarkedIDs = function() {};
  
  //Methode zum Füllen eines Templates mit den passenden Objektdaten; wird in den abgeleiteten Klassen überschrieben
  this.getFilledTemplate = function() {};
  
  //Methode zum Besetzen des zu sendenden Formulars mit passenden Objektdaten; wird überschrieben
  this.getFormularObj = function() { }
} //end MarkedObjDialog Konstruktor

//Nur zum Test
//  KuferTools.KursDetails.MarkedObjDialog.prototype.getFirstMarkedId = function() {
//    return this.markedIds[0];
//  };

//Funktion zum Upload eines Nachweis bei BLAK und BGLU
KuferTools.uploadNachweisBlackBglu = function (){
            
  var buttons = { 
        "Senden": function() {
              var uploadfileValue = $('#uploadfile').val();
              var nachweisartValue =  $('#nachweisart option:selected').val();
              var nachweisartText =  $('#nachweisart option:selected').text();
              if (uploadfileValue !=='' && nachweisartValue ===  ''){
                showMessage('<div>Bitte wählen Sie die Art des nachzuweisenden Dokuments aus.</div>', 'Nachweisart nicht ausgewählt');
              }
              else if (uploadfileValue === '' && nachweisartValue !== ''){
                showMessage('<div>Bitte wählen Sie die Datei aus.</div>', 'Keine Datei ausgewählt');
              }
              else if (uploadfileValue === '' && nachweisartValue === '' ){
                showMessage('<div>Bitte wählen Sie die Art des nachzuweisenden Dokuments und die Datei aus.</div>', 'Weder Nachweisart noch Datei ausgewählt');
              }
              else if(checkIfDateiFormatNichtErlaubt()=== true){ 
                showMessage('<div>Bitte wählen Sie eine Datei mit einem erlaubten Format aus.</div>', 'Nicht erlaubtes Dateiformat');
              } 
              else {
                KuferTools.Utils.AjaxLadebildschirm.Start();
                var closeFirstDialog = this;
                
                jQuery.ajax({
                  url     : KuferTools.SelfLink + '&action=uploadedfile',
                  type    : 'POST',
                  data    : getFormData(),
                  processData: false,
                  contentType: false,
                  success : function(data) {
                      $(closeFirstDialog).dialog('close');
                      var objekt = KuferTools.Utils.getObjectFromJsonBase64(data);
                      if(objekt.DMZ === 'sendDone' && objekt.EMail === '1'){
                        showMessage('<div class = "nachweisart_blak"><strong>Art des nachzuweisenden Dokuments:</strong> ' + nachweisartText + '</div>' + 
                                      '<div><strong>Datei:</strong> ' + uploadfileValue+ '</div>' , 'Das Dokument wurde erfolgreich versendet.');
                      }
                      else if (objekt.DMZ === 'sendDone' && objekt.EMail === '0'){
                        showMessage('<div class = "farbe_rot">Beim Versenden des Dokuments ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut, oder wenden Sie sich an die Einrichtung.</div>'   , 'Fehler beim Versenden des Dokuments.');
                      }
                      else{
                        showMessage('<div class = "farbe_rot">Die Datei wurde erfolgreich hochgeladen aber es ist beim Informieren des zuständigen Mitarbeiters \n\
                                      ein Fehler aufgetreten. Bitte wenden Sie sich an die Einrichtung.</div>'   , 'Fehler beim Versenden des Dokuments.');
                      }
                    KuferTools.Utils.AjaxLadebildschirm.Stop();
                  }
                });
                
              }
        },
        
        "Abbrechen": function() { 
          $(this).dialog('close');
        }
      };

  var nachweisartOptions = '<option value="">-------- Bitte wählen --------</option>';
  $.each(KuferTools.NachweisartMap, function(index, value) {
    nachweisartOptions += '<option value="'+index+'">'+value+'</option>';
  });
  
  
  
  var meldung = '<div>\
                  <div class = "nachweisart_blak">\
                    <label for="nachweisart">Art des nachzuweisenden Dokumments:</label>\
                    <select name="nachweisart" size="1" id = "nachweisart">\
                      '+ nachweisartOptions +'\
                    </select>\
                  </div>\
                  <div class = "uploadfile">\
                    <label for="uploadfile">Datei:</label>\
                    <input type="file" name="uploadfile" id="uploadfile" value="">\
                    <span></span>\n\
                  </div>\
                </div>';
  
  showMessage(meldung, 'Nachweis für begleitenden Unterricht nachreichen', buttons);
  checkFileFormat();
  
  function getFormData() {
    var data = new FormData();
    data.append('nachweisart', $('#nachweisart option:selected').val());
    data.append('uploadfile', files = $('#uploadfile')[0].files[0]);
    return data; 
  };
 
  function checkFileFormat(){
    $('#uploadfile').bind('change',function () {  
      if (checkIfDateiFormatNichtErlaubt() === true){
          checkDateiNichtOk();
        }
        else{
          removeAddedHmlBycheckDateiNichtOk();
        }
    });
  }
   
  function checkDateiNichtOk(){
    var $dateiformat = $('.uploadfile > span');
    $dateiformat.html(''); 
    $dateiformat.addClass('farbe_rot');
    $dateiformat.html('<div>Der Dateiname ist unzulässig: \
                      <span class=""><a href="#" class="allowExt">siehe erlaubte Kriterien</a></span></div>');
  }
  
  function removeAddedHmlBycheckDateiNichtOk(){
      $('.uploadfile > span').empty();
      $('.uploadfile > span').removeClass('farbe_rot');
  }
  
  function checkIfDateiFormatNichtErlaubt(){
    
    if(typeof $('#uploadfile')[0].files[0] !== 'undefined'){
      var fileName = $('#uploadfile')[0].files[0].name;

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