jQuery(function() {
  //Sammeländerung der Noten: 
  //setzt in einem td element die enthaltene Checkbox auf true oder false
  function setzeCheckbox(td, value, nurNichtBenoteteTn) {
    var $td = jQuery(td),
        input = $td.find("input[type=checkbox]:not(:disabled)"),
        tempDisabled = !value && $td.find("input[type=checkbox]").prop('disabled'),
        selectBox = $td.children("select" + (tempDisabled ? ':not(:disabled)' : ''));
 
    if(nurNichtBenoteteTn)
      if(selectBox.length && selectBox.filter(".noteEditfeld").val() != "")
        return;
    
    if(value) {// die Note nur auf "" setzen wenn die Checkbox auf true gesetzt werden soll
      input, selectBox
              .filter(".noteEditfeld:not(.notenende)").val("");
      input, selectBox
              .filter(".noteEditfeld:not(.notenende)").prop("disabled", value);
    }
    else
    {
      input, selectBox
              .filter(".noteEditfeld:not(.notenende)").prop("disabled", value);
    }
    input.filter(".nichtBenotetCheckbox:not(.notenende)").prop("checked", value);
  }
  
  //Sammeländerung der Noten: ganzes fach auf nicht bewertet:
  jQuery("#notenform tr.alleSetzen input.fachNichtBenotet").bind("change", function(){ 
    var $this = jQuery(this);
    var $td = jQuery("td.fach"+$this.prop("value"));
    var array = $td.toArray();
    var checked = this.checked;
    
    if($this.prop("checked")) { 
      // es soll "nicht bewertet" auf true geändert werden
      
      // gibt es benotete TN ?
      var esExistierenBenoteteTN = false;
      for (var i = 0; i < array.length; ++i) {
        if(jQuery(array[i]).children(".noteEditfeld:not(.notenende)").val() != "") {
          esExistierenBenoteteTN = true;
          break;
        }
      }
      
      if(esExistierenBenoteteTN) {
        
        // Soll die Änderung auch für benotete Teilnehmer übernommen werden?
        showMessage(
          "Soll die Änderung auch für benotete "+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+" übernommen werden? Dies löscht die vorhandenen Noten!", 
          "Alle "+KuferTools.Spracheinstellungen.Teilnehmer.Plural.Nominativ+" auf nicht beurteilt setzen?",
          { 
            "Nur nicht benotete" : function() 
            {//$this ist noch das td Element! nicht der Dialog, der in this steckt!
              for (key in array ) {
                if (array.hasOwnProperty(key)) {
                  setzeCheckbox(array[key], checked, true);
                }
              }
              $(this).dialog("close");
            },
            "Ja": function() 
            {//$this ist noch das td Element! nicht der Dialog, der in this steckt!
              for (key in array ) {
                if (array.hasOwnProperty(key)) {
                  setzeCheckbox(array[key], checked, false);
                }
              }
              $(this).dialog("close");
            },
            "Abbrechen": function() 
            {//$this ist noch das td Element! nicht der Dialog, der in this steckt!
              $this.prop("checked", !checked);
              $(this).dialog("close"); 
            }
          });
          
      } else {
        // es existieren keine benoteten TN
        
        // dann einfach für alle übernehmen
        for (key in array ) {
          if (array.hasOwnProperty(key)) {
            setzeCheckbox(array[key], checked, false);
          }
        }
      }
      
    } else {
      // es soll "nicht bewertet" auf false geändert werden
      
      // dann einfach für alle übernehmen
      for (key in array ) {
        if (array.hasOwnProperty(key)) {
          setzeCheckbox(array[key], checked, false);
        }
      }
    }
    
  });
  
  
  //Nur beim Seite laden
  //für nichtbeurteilt: alle setzen Checkbox richtig vorbelegen
  jQuery("#notenform tr.alleSetzen input.fachNichtBenotet").each(function(index, item) {
    var $item = jQuery(item);
    var fach = $item.val();
    if (jQuery("td.fach"+$item.prop("value")+" input.nichtBenotetCheckbox:not(:checked)").length == 0)
      $item.prop("checked", true);
  });
  //Damit man beim Umsetzen der Kursphase den Ausgangswert hat
  var $alleSetzenSelect = jQuery(jQuery("#notenform tr.alleSetzen select.niveauAlle")[0]);
  var ausgangsPhase = KuferTools.Utils.getValueAllerSelectsMitKlasse('niveau');
  if (ausgangsPhase !== false) {
    $alleSetzenSelect.data('previousValue', ausgangsPhase);
    $alleSetzenSelect.val(ausgangsPhase);
  }
  else {
    $alleSetzenSelect.data('previousValue', $alleSetzenSelect.val());
  }
  
  
  // Wenn in einem Fach alle Teilnehmer das Notenende erreicht haben, wird dazu das
  // "alle Setzen" nicht angezeigt.
  $("#notenform tr.alleSetzen input.fachNichtBenotet").each(function() {
    var $notenInput = jQuery("td.fach"+$(this).prop("value")).find(".nichtBenotetCheckbox:not(.notenende)");
    if ($notenInput.length == 0) {
      $(this).parent().html('&nbsp;');
    }
  });
  //Das gleiche mit der Kursphase
  var $kursphase = $('#notenform tr:not(.alleSetzen) select[name^="niveau_"]:not(.notenende)');
  if($kursphase.length == 0) {
    $('#notenform tr.alleSetzen select[name^="niveau_"]').parent().html('&nbsp;');
  }
  //Wenn gar nichts mehr bei alle Setzen ausgewählt werden kann, dann wird die Zeile komplett entfernt
  if ($('#notenform tr.alleSetzen input, #notenform tr.alleSetzen select').length == 0) {
    $('#notenform tr.alleSetzen').remove();
  }
  
  //Sammeländerung der Noten: Kursphase für alle setzen:
  jQuery("#notenform tr.alleSetzen select.niveauAlle").bind("change", function(){ 
    
    var $this = $(this);
    var $selectNiveau = jQuery("#notenform select.niveau:not(#notenform .alleSetzen select.niveau)");
  
    // sind alle selektierten Optionen gleich ?
    var alleGleichValue = KuferTools.Utils.getValueAllerSelectsMitKlasse('niveau');
    
    if(alleGleichValue) {
      // Values waren gleich 
      
      // alle setzen
      $selectNiveau.val( $this.val() );
      
    } else {
      // Values waren nicht gleich
      
      showMessage(
        "Soll die Änderung für alle Teilnehmer übernommen werden?", 
        "Kursphasen aller Teilnehmer setzen?", 
        {
          "Ja" : function() 
          {//$this ist noch das select Element! nicht der Dialog, der in this steckt!
            // alle setzen
            $selectNiveau.val( $this.val() );
            
            // previousValue setzen
            $this.data("previousValue", $this.val());
            
            $(this).dialog("close");
          },
          "Abbrechen" : function() 
          {//$this ist noch das select Element! nicht der Dialog, der in this steckt!
            // vorherigen Wert eintragen
            $this.val($this.data("previousValue"));
            
            $(this).dialog("close");
          }
        });
    }
    
  });
});