/*
   Der MedienContainer enthält die Methoden und JQUERY Events zum Einfügen,
   updaten und Löschen von Medien
*/ 
 
 // Konstruktor fuer das Medienhandling
  function MedienContainer () {
	var WT_MEDIENTRENNER = '|';
    // this.$lisFuerCheckBox = $('ul.addCheckbox li'); 
    // Nur zum Test
    this.eigenschaft = 'medienwert';
    
    //existieren auch in den inneren Funktionen und sind dort verwendbar
    
    //Kann nicht mehr verwendet werden, da mehrere Medianhandler auf einer Seite sein können.
    //stattdessen wird getMarkedMedienRow() verwendet
    //var markedmedienRow = 0;
    
    var markedUpdateMedienRow = 0;
    //Objecte
    var $input4Mediendialog;
    // Click Event oder Double Klick Event
    var eventObj4Medien;
    
    //Instanzvariablen
    this.oddcolor = '#FFFFFF';
    this.evencolor = '#C8C8C8'; // '#BBBBFF';
    this.aktcolor = '#FFFF00';
    this.aktborder = '2px solid #6C66A4';   // '#FF00FF';
    this.normalborder = '1px solid #828177';
    this.hltablecolor = '#C9C9C9';
    this.hltableborder = '1px solid  #828177';
    
    this.initReadyhandling = initReadyhandling;
    
    // Referenz auf das Instanz-Objekt anlegen, da sich this bei der Ausführung auf die Aufrufumgebung,
    // also z.B. das window-Object oder das Element, dem der entspr. Eventhandler anhängt, bezieht und nicht auf das
    // Instanzobjekt; thisObject dagegen zeigt immer auf das Instanzobjekt (hier Mediencontainer))
    var thisObject = this;
    //this.initTableLayout = initTableLayout;
    
   // nur Funktion initReadyhandling() soll oeffentlich sein 
  /********************************************************************************
  Initialisiert das Handling für das laden des Dokuments mit $(document).ready(..)
  *********************************************************************************/
  function initReadyhandling() {
  
    // initialisieren des Tabellen-Layouts
    initTableLayoutPrivat();
    //ÖffnenButton für den Dialog mit den hinterlegten Medien
	  $('.button_hl_medien').on('click', function(event) {
	    eventObj4Medien = event;
		  $('#dialog_hl_medien').dialog('open');
	    // prevent the default action, e.g., following a link
	    return false;
	  });
    //Öffnet Button für den Dialog mit den hinterlegten Medien aus dem Update Fenster heraus
	  $('#button_upd_hlmedien').on('click', function() {
	    //Hier highlighten des 1ten Elements
	    $input4Mediendialog = $('input#update_medium','#dialog_update_medien');
	    if ($input4Mediendialog.val() == '')
	      markedUpdateMedienRow = 0;
	      
	      //Standardfärbung für alle anderen Elemente in der HL Tabelle
	    $hlmedienTBody = $('.medientable tbody','#dialog_hl_medienupd')  
      $hlmedienTBody.find('tr').css('background-color',thisObject.hltablecolor);
 
      //neu markiertes Element in der Hinterlegungstabelle highlightn  
	    $aktTrElem = $('#medienupd_' + markedUpdateMedienRow,'#dialog_hl_medienupd');
	    $aktTrElem.css('background-color',thisObject.aktcolor); 
		  $('#dialog_hl_medienupd').dialog('open');
	    // prevent the default action, e.g., following a link
	    return false;
	  });
  

	  // Dialog mit den hinterlegten Medien
	  $('#dialog_hl_medien').dialog({ 
	  	autoOpen:  false, 
	  	title:     'Medien:', 
	  	width: 500,
	  	modal:     true,
      buttons:   {
				"Ok": function() {
				
				//Die id von button_hl_medien ist button_hl_IDDESZIELS
                var targetId = $(eventObj4Medien.currentTarget).prop('id').split('_').slice(2).join('_');
                  insertEntry2MedienTable($(this), $('table','#'+targetId)); 
		  	      //	_restoreCheckboxToArray($(this), $('table','#kurstag_medien'))
				  $(this).dialog("close");
				},
                                "Abbrechen": function() { $(this).dialog("close"); }
	  	} 
	  	});
	  	
	  // Dialog mit den hinterlegten Medien für das Medienupdate Fenster
	  $('#dialog_hl_medienupd').dialog({ 
	  	autoOpen:  false, 
	  	title:     'Medium:', 
	  	width: 300,
	  	modal:     true,
      buttons:   {
				"Ok": function() { 
				_restoreSelectToDialog(markedUpdateMedienRow, $(this), $('#update_medium','#dialog_update_medien'));
			  // _restoreCheckboxToDialog($(this), $('#kurstag_medien_alt'));
				 $(this).dialog("close");
                                },
                                "Abbrechen": function() { $(this).dialog("close"); }
	  	} 
	  	});
	  	
	  	
	   //Auswahl der HL im Dialog zum Bearbeiten der Medien via Klick; Clickhandler ist an DOM element TBody geknüpft	
	   $('tbody','#dialog_hl_medienupd').on('click', function(eventobj){
       eventobj.preventDefault();
       // event.target bezieht sich auf das aktuell angeklickte DOM Element, also:  tr#medienupd_i td.xxxx
	     // (hier nicht event.currentTarget verwenden; das bezieht sich auf das DOM Element des Clickhandlers, also tbody)
	     var $aktTrElem = $(eventobj.target).parents('#dialog_hl_medienupd tr');
       markedUpdateMedienRow = $aktTrElem.prop('id').split('_')[1];
       var $aktTBody = $(this);
       //alert('markedUpdateMedienRow: ' + markedUpdateMedienRow + ' akttr ' + $aktTrElem.html());  
      
       //Standardfärbung
       $aktTBody.find('tr').css('background-color',thisObject.hltablecolor);
       // wird schon im Stylesheet richtig besetzt in #dialog_hl_medienupd tr
       // $('tr',$aktTBody).css('border',thisObject.hltableborder);
       //Highlighten des akt. Elements
		   $aktTrElem.css('background-color',thisObject.aktcolor); 
		   //$aktTrElem.css({'border':thisObject.aktborder});
    });
    
		
    /*
    //Checkboxen im Mediendialog für die Hinterlegungen hinzufügen
    var $lisFuerCheckBox = $('ul.addCheckbox li');
    //var $lisFuerCheckBox = this.lisFuerCheckBox;
    //alert("lis4check: " + $lisFuerCheckBox.html());
    $lisFuerCheckBox.each( function () {
      var $checkbox = $('<input type="checkbox" class="hlauswahl"/>');
      $checkbox.val($(this).children('span').text());
      $(this).prepend($checkbox);
    });		*/
		
	  $('.button_delete').on('click', function(){
	  //Die id von button_delete ist button_delete_IDDESZIELS
      var targetId = $(this).prop('id').split('_').slice(2).join('_');
	  var $target = $('tbody','#'+targetId);
      //gelöscht wird nur falls noch ein Eintrag vorhanden ist;
      // alert("isempty targetchild: " + isempty($target.children('tr').html()) + " empty null: " + isempty(null));
      if (!isempty($target.children('tr').html()))
      //if($target.children('tr').length != 0)
        deleteEntryfromMedienTable(getMarkedMedienRow($target.parents('.kurstag_medien')),$target);
    });
    
     $('.button_update').on('click', function(event){
       // Event hier in globaler Variable speichern
       eventObj4Medien = event;
       //alert("eventtype in btnUpd= " + event.handleObj.type);
       // markiertes TR Element aus der Medientabelle
       
 	  //Die id von button_update ist button_update_IDDESZIELS
       var $target = $('#'+$(this).prop('id').split('_').slice(2).join('_'));
       
       var $source = $('.medienzeile_' + getMarkedMedienRow($target),$target);
       var $target = $('#dialog_update_medien');
       var mediumval = $('td.inhalt',$source).text();
       var bemerkval = $('td.bemerkung',$source).text();
       $('#update_medium',$target).val(mediumval);
       $('#update_medienbem',$target).val(bemerkval);
       
       $('#dialog_update_medien').dialog('open');
	     // prevent the default action, e.g., following a link
	     return false;  
    });
    
   /* $('#kurstag_medien').on('dblclick', function(event){
      event.preventDefault();
       $('#dialog_update_medien').dialog('open');
	     // prevent the default action, e.g., following a link
	     return false;   
    });   */
    
    
     // Dialog für Update eines Mediums
	  $('#dialog_update_medien').dialog({ 
	  	autoOpen:  false, 
	  	title:     'Medium:', 
	  	width: 400,
	  	modal:     true,
      buttons:   {
				"Ok": function() {
				  // Event hier in globaler Variable speichern
				  var eventobj = eventObj4Medien;
				  //alert("eventtype ind dialogupd= " + eventobj.handleObj.type);
				  //Bei vorausgehendem Click auf das  Bearbeiten Symbol wird ein Eintrag eingefügt
				  if (eventobj.handleObj.type == "click") {
				    var $target = $('#'+$(eventobj.currentTarget).prop('id').split('_').slice(2).join('_'));
				    insertEntry2MedienTable($(this),$('tbody',$target));
				  }
				  else {  //bei dblclick bzw.live Event wird nur Update durchgeführt
				    var $target = $(eventobj.currentTarget).parents('.kurstag_medien');
			  	    updateEntryofMedienTable($(this),$('table',$target));
				  }
				 $(this).dialog("close");
                               },
                               "Abbrechen": function() { $(this).dialog("close"); } 
	  	} 
	  	});
    
    
	  //eventhandler an tbody knüpfen; dann muss NICHT fuer jedes neu erzeugte tr Element
    // ein Eventhandler angehängt werden	
//	 $('tbody','#kurstag_medien').on('click', myHighlight);	
	 

	 var clicks = 0;
	 $(document).on('click', '.kurstag_medien:not(.read_only) tbody', function(event) {
				clicks++;
				if (clicks == 1) {
          var eventTarget = event.target;
          var eventCurrentTarget = event.currentTarget;
          //console.log(event.currentTarget);
					setTimeout(function(){//console.log(event.currentTarget);
            event.target = eventTarget;
            event.currentTarget = eventCurrentTarget;
            
						if(clicks == 1) {
						//	$('#log').text('Single-Click Action');
							myHighlight(event);
							eventObj4Medien = event; // Event hier in globaler Variable speichern
							//alert("eventtype click in clicks= " + event.handleObj.type);
						} else {
						//	$('#log').text('Double-Click Action');
							myHighlight(event);
              // irgendwer ist auf die Idee gekommen, an späteren Stellen zu Unterscheiden, ob ein Dialog per
              // Klick aufgerufen wurde, oder per Doppelklick. Deshalb muss hier der Handle-Typ geändert werden.
              event.handleObj.type = 'dbclick';
							// Event hier in globaler Variable speichern
							eventObj4Medien = event;
							//alert("eventtype dblclick in clicks= " + event.handleObj.type);
							
							// markiertes TR Element aus der Medientabelle
			  var $target = $(event.currentTarget);
              var $source = $('.medienzeile_' + getMarkedMedienRow($target.parents('.kurstag_medien')),$target);
              var $target = $('#dialog_update_medien');
              var mediumval = $('td.inhalt',$source).text();
              var bemerkval = $('td.bemerkung',$source).text();
              $('#update_medium',$target).val(mediumval);
              $('#update_medienbem',$target).val(bemerkval);
              
              $('#dialog_update_medien').dialog('open');
						}
						 //event.preventDefault();
						clicks = 0;
					}, 400);
				}
     });

  } //end initReadyhandling
  
  //**********************************************************************************************
  /* Alle anderen Methoden (außer initReadyHandling) im Mediencontainer sollen privat bleiben
  /*  daher nicht mit this....   zur Verfuegung stellen                                       ****/
  
    // wird hier anonym deklariert; waere auch anders mgl.
   function initTableLayoutPrivat() {
      var $aktTabcontent = $('.kurstag_medien table');
      $aktTabcontent.each(function(){
        //alert("in initTableLayout Eigenschaft: " + thisObject.eigenschaft);
        $('tr',$(this)).css('border',thisObject.normalborder);
        $('tr:even',$(this)).css('background-color',thisObject.evencolor);
        $('tr:odd',$(this)).css('background-color',thisObject.oddcolor);
      
        $input4Mediendialog = $('input#update_medium','#dialog_update_medien');
        $input4Mediendialog.val('');
      });
      $('.kurstag_medien:not(.read_only) table').each(function(){
        var zeilenid = 0;
        $aktelem = $('.medienzeile_' + zeilenid, $(this));
        $aktelem.css({'border':thisObject.aktborder});
        //$('td:not(.blockimg)',$aktelem).css('background-color','yellow');
        $aktelem.css('background-color',thisObject.aktcolor);
        setMarkedMedienRow($(this).parents('.kurstag_medien'), zeilenid);
      });
    }



   // Wird beim Ändern eine Eintrags aufgerufen; d.h. beim Insert, Update u.Delete
   //Aktualisiert das Hiddenfeld für Medien
   //Ist row negativ, so steht dies für einen neuen Eintrag
   //Ist medium leer, so steht dies für einen löschvorgang.
   //Target entspricht dem Medienfeld.
   function updateHiddenMedienField(row, id, medium, bemerkung, $target) {
	   
	   var medienstr = $('#'+$target.prop('id')+'_hidden').val();
	   // WT_MEDIENTRENNER ist z.B. '|' 
	   var medienAry = medienstr.split(WT_MEDIENTRENNER);
	   medienlen = 3;  // Länge eines einzelnen Medieneintrags
	   
	   //Falls letzte Element ein Trenner ist, wird bei Verwendung von split noch ein zusätzliches leeres Element ins 
	   // array geschrieben, das gelöscht werden muss
	   if (medienAry[medienAry.length - 1] == '')
	   	 medienAry.pop();
	   
	   //Nur bei #kurstag_medien werden die einzelnen Medieneinträge auch aktualisiert.
	   var updateSingleMedien = ($target.prop('id') == 'kurstag_medien');
	   
	   // alert('medienstr: ' + medienstr + ' medienary: ' + medienAry + ' medlen: ' +  medienAry.length);
	   if(row >= 0 && medienAry.length > 1) {
          if(medium == '') { //Delete
              //löscht die nächsten 3(= medienlen) Elemente von Position row*medienlen
          	  medienAry.splice(row*medienlen, medienlen);//TODO ist nur im ausnahmefall 9!! hier im idealfall nur aus der hidden die richtigen werte wählen
          	  for(i = row; i <= 8; i++) {//TODO test auf typeof, obs das gibt, sonst leerstring
         		// Holt den Wert  für 'Medium'
          		if(typeof(medienAry[i*medienlen + 1]) != 'undefined')
        		  var med = medienAry[i*medienlen + 1];
        		else
        		  var med = '';
        		// Nur fuer das Updaten der einzelnen Medienfelde medien1, .. ,medien9
          		if(updateSingleMedien) {
                  $('#kurstag_medien'+ (parseInt(i) + 1)).val(med);
          		}
        	  }
          }
          else { //Update
              medienAry[row*medienlen] = id
        	  medienAry[row*medienlen +1] = medium;
        	  medienAry[row*medienlen + 2] = bemerkung;
        	  	// Nur fuer das Updaten der einzelnen Medienfelde medien1, .. ,medien9
        	  if(updateSingleMedien) {
        	    $('#kurstag_medien'+ (parseInt(row) + 1)).val(medium);
        	  }
          }
	   }
	   else { //Insert
	     if(medienAry.length == 1) {
            medienAry[0] = id;
	     }
	     else {
	    	 medienAry.push(id);
	     }
	        medienAry.push(medium);
            medienAry.push(bemerkung);
           // Nur fuer das Updaten der einzelnen Medienfelde medien1, .. ,medien9
            if(updateSingleMedien) {
              $('#kurstag_medien'+ medienAry.length / medienlen).val(medium);
            }
	   }
	   
	   //Join fügt die Trenner nur zwischen den Array Elementen ein; 
	    medienstr = medienAry.join(WT_MEDIENTRENNER);
	   // Falls der Hiddenstring nicht leer ist, muss am Ende  noch z.B. ein | angehängt werden; dann
	   // hat man z.B. Beamer||Leinwand|Lw1|Fernseher|TV1| oder   Beamer|B1|Leinwand|| oder ähnliches; der Trenner am Ende ist nötig,
	   // damit man erkennt, ob die letzte Bemerkung leer ist oder nicht 
	   if (medienstr != '')
	     medienstr += WT_MEDIENTRENNER;  
	   $('#'+$target.prop('id')+'_hidden').val(medienstr);
	   
	   // Zusätzlich den Headline Meldungstext entfernen, der beim Abschicken des Formulars angezeigt wird 
	   $('h1#ktform_message').remove();
	   //$('h1#ktform_message').text('');
	   //alert('h1 ausg: ' + $('h1#ktform_message').text());
	   
   }
   
   // Löscht einen Eintrag aus der Medientabelle und reorganisiert diese
   function deleteEntryfromMedienTable(zeilenindex,$target) {
    var removestr = '.medienzeile_' + zeilenindex;
    var $tableTr = $('tr',$target.parent());
    var $delTrValue = $(removestr,$target);
    // Dieser Wert muß evtl. noch aus anderen Input Einträgen entfernt werden
    var $delTdInhalt = $('td.inhalt',$delTrValue);
    $tableTr.remove(removestr);
    
     //Tabelle reorganisieren, falls noch ein Eintrag vorhanden ist 
     //jetzt die neuen Kinder zum Ermitteln der übriggebliebenen TableRows 
     $tableTrNew = $target.children();
     tablelen = $tableTrNew.length;
 
     $tableTrNew.each( function(index) {
        $(this).prop('class','medienzeile_' + index);
     });
     
     //Standardfärbung
     $target.find('tr:even').css('background-color',thisObject.evencolor);
     $target.find('tr:odd').css('background-color',thisObject.oddcolor);
     // Nach dem Löschen die Markierung auf das 1te Element in der Tabelle setzen, da das bisher markierte
     // dann nicht mehr vorhanden ist
     setMarkedMedienRow($target.parents('.kurstag_medien'), 0);
     $aktTrNew =  $target.find('.medienzeile_' + getMarkedMedienRow($target.parents('.kurstag_medien')));
     $aktTrNew.css({'border':thisObject.aktborder});
     $aktTrNew.css('background-color',thisObject.aktcolor);
     //Inputfeld im Mediendialog leeren
	 $input4Mediendialog.val('');
	   
	 //Beim Löschen das Medien Hidden Feld updaten	 
	 updateHiddenMedienField(zeilenindex, '', '', '', $target.parents('.kurstag_medien'));
   }


    // ACHTUNG!!!! bezieht sich auf TBODY Element
	  // Markiert das aktuell ausgewählte Tabellenfeld
    // hier wird zum Ermitteln des aktuell angeklickten Elements event.target verwendet
  function myHighlight(eventobj) {
	   //Hier gilt: $(this) ist ein  Tbody Element
	   // event.target bezieht sich auf das aktuell angeklickte DOM Element, also tr.medienzeile_i
	   // (hier nicht event.currentTarget verwenden; das bezieht sich auf das DOM Element des Clickhandlers,
     //  also tbody)
     $aktTBody = $(eventobj.currentTarget);
	 $aktTrElem = $(eventobj.target).parents('.kurstag_medien tr');
     // alert ('eventtyp in highlight:  ' + eventobj.handleObj.type + ' //  aktbody: ' + $aktTBody.html());
     var zeile = $aktTrElem.prop('class');
     var zeilenid = zeile.split('_')[1];
    
     //aktTable ersetzt this
     var $aktTable = $('tbody',$aktTBody.parents('.kurstag_medien'));
     
     //Hier wird die Markierung fuer alle Geschwister zurueckgesetzt; mgl. waere auch ein Ruecksetzen aller
     //Tr Elemente durch Auswahl von $(this).parent().children();
     var $allTrElemensinTable = $aktTable.children();
     $allTrElemensinTable.each( function() { 
       $(this).css('border',thisObject.normalborder);
      });
     //Standardfärbung
     $aktTBody.find('tr:even').css('background-color',thisObject.evencolor);
     $aktTBody.find('tr:odd').css('background-color',thisObject.oddcolor);
     //Das ausgewählte Tabellenelement  gesondert markieren
		 $aktTrElem.css({'border':thisObject.aktborder});
		 //$('td:not(.blockimg)',$aktelem).css('background-color','yellow');
		 $aktTrElem.css('background-color',thisObject.aktcolor);
		 setMarkedMedienRow($aktTBody.parents('.kurstag_medien'), zeilenid);
     //alert("in highlight medienrow: " + markedmedienRow);
     //Inputfeld im Mediendialog leeren
		 $input4Mediendialog.val('');
  } // end myHighlight
	 
	 
	  //Rückspeichern des gewählten Selectfelds in die Dialogfelder für die Medienauswahl  
  function _restoreSelectToDialog($zeilenindex, $source, $target) {
    // target ist input#update_medium im Dialogfeld zum Bearbeiten eines Mediums
    //alert("target: " + $target.prop("name") + ' mit Wert: ' + $target.val());
    var medieninhalt = '';
    //alert("source: " + $source.html() + " markedrow: " + $zeilenindex);
    var $selectedTr = $('#medienupd_' + $zeilenindex,$source);
    var $tdinhalt = $('.inhalt',$selectedTr);
    medieninhalt = $tdinhalt.text();
    if (medieninhalt != '')
      $target.val(medieninhalt);
  }
	 
	 
	//Speichert die selektierten Checkbox Felder in einem Medienarray und gibt dieses zurück
	// Nimmt bei den Hinterlegungen den Wert aus den Spans innerhalb der lis von $source und legt ihn in die 
  // Values von $target. Außerdem werden die angehakten Checkboxen wieder deaktiviert.
	function _restoreCheckboxToArray($source) {
    var $lis = $source.find(':checked');
    var medienary = new Array();
    
    $lis.each( function() {
      var medienentry = new MedienEintrag();
      //Abschließendes Semikolon entfernen
      medienentry.medium = $(this).val().split(WT_MEDIENTRENNER)[0];
     // medienary.push($(this).val()
      // Hier wird nur das medium ausgewählt aber keine Bemerkung eingetragen d.h. Bemerkung bleibt leer
      //medienentry.bemerkung = '';
      medienary.push(medienentry);
             });
    $lis.prop('checked', false);
    return medienary;
  } //end _restoreCheckboxToArray(..)
	 
	 
	//Speichert den Wert aus dem Medien-Eintrag im Array ab
	function _restoreInput2Array($source) {
	  var medienentry = new MedienEintrag();
	  var medienary = new Array();
	  var $input = $('#update_medium',$source);
	  var $beminput = $('#update_medienbem',$source);
	  //Array enthält nur ein Element oder gar keins
	  if ($input.val() != '') {
      medienentry.medium = $input.val();
      medienentry.bemerkung = $beminput.val();
      medienary[0] = medienentry;
      }
	  return medienary;
	}
	
	// Konstruktorfunktion fuer einen einzelnen Medieneintrag
	function MedienEintrag() {
	this.id = '';
    this.medium = '';
    this.bemerkung = '';
  }
  
  /* Fügt die angehackte Medienwerte aus den Hinterlegungen in die 
     Tabelle der ausgewählten Medien ein  */
  function insertEntry2MedienTable($source, $target) {
    var MedienAry = new Array();
    var sourceElemId = $source.prop('id');
    
    //ZUerst ausgewählte Medien im Array Abspeichern
    //Button zur Auswahl aus der Checkbox wurde angeklickt
    if (sourceElemId == 'dialog_hl_medien')
      MedienAry = _restoreCheckboxToArray($source);
    else  //  id = dialog_update_medien
    //Button zur Auswahl aus des Update Dialogs wurde angeklickt
      MedienAry = _restoreInput2Array($source);
    
    //Danach Medien aus dem array in die MedienTable übernehmen
    fillMedienTablefromArray(MedienAry,$target);
  }//end insertEntry2MedienTable
    
 
  /* Holt die Werte aus dem Medienary und fügt sie in die Tabelle der ausgewählten Medien ein  
    benötigt als input ein Array von medien
  */ 
  function fillMedienTablefromArray(medienary,$target) {
  
   var medienlen = medienary.length;
    
   /* Beste Variante:   last-child Selektor  */
   var $lasttrchild = $('tr:last-child',$target);
   
   /* alert (" lasttrch inhalt  " + $lasttrchild.html() + " lastch text: " + $lasttrchild.text() +
           " lasttrch context: " + $lasttrchild.context + " Node: " + $lasttrchild.node +
           " get wert: "  + $lasttrchild.get());  */
   
   var removelastentry = false;
   if ($lasttrchild.is(':not(' + null + ')')) {
     /* alert ("Targetindex: " + $lasttrchild.index('tr:last-child') + " has td: " + $lasttrchild.has('td').html() ); */
     var firstindex = 0;
     // Gibt die Position an ab der die Indizes als zeilen id attribut in das <tr> Element eingefügt werden sollen
     var position4insert = $('tr',$target).index($lasttrchild);
  
     // Hier muss das tr- Element vorher korrekt angelegt worden sein, also z.B. <tr class = "medienzeile_1">
     // Ein Zeileneintrag ohne <td>s oder mit leeren tds wird entfernt, da er falsch ist
     if ($lasttrchild.has('td').html() != null) {
         //falls das einzige tr Element leer ist, wird zunächst dieses aufgefüllt;
         if ($('td.inhalt',$lasttrchild).text() == '' && $('td.bemerkung',$lasttrchild).text() == '') {
           if (medienlen >=1)
             removelastentry = true;      
         }
       }  //end if lasttrchild has td
     
     var offset4remove = 0
       //alert ("lasttrchild cmp: " + $lasttrchild.is(':not(' + null +')') + " medienlen: " + medienlen); 
       //letzten Eintrag nur einmal entfernen
     if (removelastentry == true) {
       $lasttrchild.remove();
       //jetzt das letzte Kind nach dem Enfernen nehmen (also das voher vorletzte)
       $lasttrchild = $('tr:last-child',$target);
       removelastentry = false;
       offset4remove = 1;
     }
              
     if (position4insert > 0 ) {
       for (var i = medienlen -1 ; i >= 0; i--) {
         var zeilind = position4insert + i + 1 - offset4remove;
         // HTML-String Darstellung fuer das neue TR Element, das hinten angehängt wird 
         var $neuesTr = getNewTrElement(medienary[i],zeilind,$target);    
        //  $neuesTr.on('click', myHighlight4singleTr);
          $lasttrchild.after($neuesTr);   
       }
     } //end if position4insert > 0
     
     // jetzt ist ein leeres tr Element (ohne td Inhalt) enthalten das zunächst gelöscht wird
     else {
       //hier wurde das Element enfernt, wenn es leer war (s.o.)
       for (i=0 ; i < medienlen; i++) {
         var zeilind = position4insert + i + 1 - offset4remove;
         var $neuesTr = getNewTrElement(medienary[i],zeilind,$target);
         //$neuesTr.on('click', myHighlight4singleTr);                
         $target.append($neuesTr);   
       }    //end for  
     } //end else
   } // end if is(':not(null)')
   
   // Tabelle mit Medien ist  komplett leer (enthält nicht mal tr Elemente)
   else {
     // alert ("tr is null; lasttrchild cmp: " + $lasttrchild.is(':not(' + null +')'));
     for (i=0 ; i < medienlen; i++) {
        var $neuesTr = getNewTrElement(medienary[i],i,$target);
       // $neuesTr.on('click', myHighlight4singleTr);
        $target.append($neuesTr);
      }
    }
    //Beim Einfügen von Zeilen das Medien Hidden Feld updaten; 2. Parameter id: leer	 
    for(i = 0; i < medienlen; i++) {
    	updateHiddenMedienField(-1, '', medienary[i].medium, medienary[i].bemerkung, $($target).parents('.kurstag_medien'));
    }
   
    //ungerade und gerade Zeilen farblich passend markieren
    $('tr:even',$target).css('background-color',thisObject.evencolor);
    $('tr:odd',$target).css('background-color',thisObject.oddcolor);
    $('tr',$target).css('border',thisObject.normalborder);
    $aktelem = $('.medienzeile_' + getMarkedMedienRow($($target).parents('.kurstag_medien')), $target);
	  $aktelem.css({'border':thisObject.aktborder});
	  //$('td:not(.blockimg)',$aktelem).css('background-color','yellow');
	  $aktelem.css('background-color',thisObject.aktcolor);
  } //end fillMedienTablefromArray(  )


 /**
     liefert ein neu angelegtes <TR> Element für die Tabelle
     AryElem ist hier ein Medieneintrag
  */
  function getNewTrElement(AryElem,index,$target) {
    $newtr = $('<tr class = "medienzeile_' + index + '"><td class="blockimg">' + AryElem.id + '</td>' +
                        '<td class="inhalt">' + KuferTools.Utils.htmlEncode(AryElem.medium) + '</td>' +
                        '<td class="bemerkung">' + KuferTools.Utils.htmlEncode(AryElem.bemerkung) + '</td>'+
                        '</tr>');
    setMarkedMedienRow($target, index);                    
    return $newtr;
  }


  function updateEntryofMedienTable($source,$target) {
	
    var $updateelement = $('tr.medienzeile_' + getMarkedMedienRow($target.parents('.kurstag_medien')),$target);
    //alert ("markedRow: " + markedmedienRow + "updateelem: " + $updateelement.html());
    
    var mediumvalue = $('#update_medium',$source).val();
    var medienbemvalue =   $('#update_medienbem',$source).val();
    // alert("mediumvalue: " + mediumvalue + " medienbem: " + medienbemvalue);
       
    //nur falls ein Wert für Medium enthalten ist, wird dieser und die Bemerkung eingetragen
    if (mediumvalue != '') {
      $('td.inhalt',$updateelement).text(mediumvalue);
      $('td.bemerkung',$updateelement).text(medienbemvalue);
      
      //Die id ist im Blockimage der markierten Zeile versteckt
      medienid = $('td.blockimg',$updateelement).text();
      //Beim Update eines Zeileneintrags das Medien Hidden Feld updaten	 
      updateHiddenMedienField(getMarkedMedienRow($target.parents('.kurstag_medien')), medienid, mediumvalue, medienbemvalue, $target.parents('.kurstag_medien'));	
    }
  }  //end updateEntryofMedienTable
  
  /**
   * Gibt die Nummer der markierten Medienzeile zurück.
   * Erwartet als Parameter den Parent, in dem sich diese befinden
   */
  function getMarkedMedienRow($target)
  {
    var zeile = $('.medientable', $target).data('markedRow');
    //Falls ausgelesen wird, bevor es das erste mal gesetzt wurde.
    return (typeof(zeile)=='undefined')?0:zeile;
  }
  
  /**
   * Setzt die Nummer der markierten Medienzeile.
   * Erwartet als Parameter den Parent, in dem sich diese befinden, und die Zeilennummer
   */
  function setMarkedMedienRow($target, zeile)
  {
	$('.medientable', $target).data('markedRow', zeile);
  }
} //end Mediencontainer
