/*
 * JS-Funktionen für die Buttons aus PageButtonsAPI.
 * Derzeit nur für Buttons innerhalb von Tabs gedacht
 * 
 * Langfristig sollte es auch zumindest für die Tabcollections-Buttons erweitert werden.
 */

registerNamespace('KuferTools.TabPage');
registerNamespace('KuferTools.TabPage.Storno');

$(document).ready(function() {
  KuferTools.TabPage.InitStornoDialog();
  KuferTools.TabPage.InitEinzeiligMehrzeilig();
  KuferTools.TabPage.InitKursFilterDialog();
  KuferTools.TabPage.InitMarkieren();
  KuferTools.TabPage.InitBearbeiteSightBuilder();
}); // End Ready

/**
 * Init für den Button und den Dialog zum Abmelden im Reiter Teilnehmer
 */
KuferTools.TabPage.InitStornoDialog = function()
{
  var $dialog;
  
  // Durch den Ajax-Filter im Reiter belegte Kurse in Tool Teilnehmerinfo ist es leider nötig, dass 
  // der Dialog von Außen gesetzt werden kann.
  KuferTools.TabPage.Storno.SetDialog = function( $pDialog ) {
    // Es konnte zu Fehlern führen, wenn die Abfrage weggelassen wird, vor allem, wenn auf der 
    // Seite nicht die Datatables.js eingebunden wurde.
    if($pDialog.length > 0) {
      $dialog = $pDialog;
      $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
      });
    }
  };
  KuferTools.TabPage.Storno.SetDialog($('.tab_teilnehmerStorno').parents('.tab.content').find('#stornoDialog'));
  
  /**
   * Clickhandler für den Abmelden-Button. Öffnet einen Dialog, welcher die angehakten
   * Teilnehmer anzeigt
   */
  $('.tab_teilnehmerStorno').click(function() {
    var $pTab = $(this).parents('.tab.content');
    var selectedBelegIds = [];
    $pTab.find('table .markable:checked').each(function(){
      selectedBelegIds[selectedBelegIds.length] = $(this).val();
    });
    
    //var selectedBelegIds = KuferTools.GetSelectedIds();
    if (selectedBelegIds.length < 1) {
      if($(this).hasClass('storno4tn')) {
        var dataName = KuferTools.Spracheinstellungen.Teilnehmer.Singular.Nominativ;
      } else {
        var dataName = KuferTools.Spracheinstellungen.Kurs.Singular.Nominativ;
      }
      showMessage('Es muss mindestens ein '+ dataName +' 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() {
        
        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] = '';
      }
    });
    KuferTools.Utils.Post( KuferTools.SelfLink + '&xsrf='+KuferTools.StornoXsrf, postObj );
  }
};

/**
 * Initialisiert die Einzeilig/Mehrzeilig-Radio-Buttons
 */
KuferTools.TabPage.InitEinzeiligMehrzeilig = function() {
  $('.tab_zeilenauswahl').click(function(){
    var $table = $(this).parents('.tab.content').find('table.tab_page_datatable');
    if($(this).val() == 'einezeile') {
      KuferTools.Utils.KuerzeTabelleAufZeile( $table, true );
    } else {
      KuferTools.Utils.KuerzeTabelleAufZeile( $table, false );
    }
  });
};

/**
 * Dialog für den Ajax-Kursfilter z. B. in den Personendetails der Mitarbeitertools.
 * 
 * Wurde großteils von personendetails.js übernommen. Sobald die Reiter "belegte Kurse" vom Dozenten und 
 * der Adresse ebenfalls über TabPageTabel realisiert werden, kann dies aus personendetails.js entfernt werden.
 * 
 * Außerdem wird der Filter sehr kompliziert gehandhabt. Es werden nicht die Server-Processing-Funktionen
 * von Datatables verwendet, sondern es werden jedes mal die Tabellen ausgetauscht.
 */
KuferTools.TabPage.InitKursFilterDialog = function(){
  $('.tab_kursfilter').click(function(e) {
    var $tab = $(this).parents('.tab.content');
    showKurseFilterDialog($tab);
  });

  // Button zum Löschen des Termin-Filters unter der Tabelle 
  $(".tab_kursfilter_del").click(function() {
    $this = jQuery(this);
    var $tab = $(this).parents('.tab.content');
    $kursFilterForm = createKurseFilterForm();
   //Das KursFilter Formular muss in den DOM Baum gehängt werden; ansonsten wird nichts gefiltert, da die
   // Eingabefelder des Filterformulars (mit den filterwerten) ja  nicht vorhanden sind 
    $this.append($kursFilterForm);
    removeFilterKursTable($tab);
    //Nach dem Zurücksetzen der Filter muss das Formular wieder ausgehängt werden; ansonsten ist es beim
    //nächsten Klick auf Filter 2mal im DOM Baum vorhanden (und das gibt Fehler beim Filtern)
    $kursFilterForm.detach();
  });
  
  //Baut den Filter für die Kurse im Reiter Kursübersicht der Details in den Tools Dozenteninfo u. Teilnehmerinfo auf 
  function showKurseFilterDialog($pTab) {
    $form = createKurseFilterForm();
    showFilterMessage($pTab, $form, KuferTools.Spracheinstellungen.Kurs.Singular.Nominativ + 'filter:',
		  getDialogDefaultButtons($pTab), undefined, undefined);
  } //end showKurseFilterDialog(..)


  //Baut den Filter für die Kurse in Reiter Kursübersicht der Details in den Tools Dozenteninfo u. Teilnehmerinfo auf 
  function createKurseFilterForm() {
    /**
     * Private Funktion für diese Filterfunktion, welche den Aufbau des Filterdialogs erleichtert.
     * Die einzelnen Spalten des Dialogs werden in Spans mit gleicher Klasse gepackt.
     * @return String
     */
    function getSpanNr(pInhalt, pSpaltennummer){
      return '<span class="filter_person_column_' + pSpaltennummer + '">' + pInhalt + '</span>';
    }
    
    // TODO evtl die Action per Post senden?
    var actionLink = KuferTools.SelfLink + '&action=kursFilter';
     
    var $form = $('<form action="' + actionLink + '" method="post" class="kursfilterForm"></form>'); 
    
    var meldung = '<div class="person_filterdialog">';
    meldung += '<div class="zeile">';
    meldung += getSpanNr('Titel:', 1) + getSpanNr(getInputKursTitel(KuferTools.Filter.KursTitel), 2);
    meldung += '</div>';
    
    meldung += '<div class="zeile">';
    meldung += getSpanNr('Kursnummer von:', 1) + getSpanNr(getInputKnrVon(KuferTools.Filter.KnrVon), 2);
    meldung += getSpanNr('bis:', 3) + getSpanNr(getInputKnrBis(KuferTools.Filter.KnrBis), 4) + '<br><br>';
    meldung += '</div>';
    
    meldung += '<div class="zeile">';
    meldung += getSpanNr('Datum von:', 1) + getSpanNr(getInputDatumVon(KuferTools.Filter.DatumVon), 2);
    meldung += getSpanNr('bis:', 3) + getSpanNr(getInputDatumBis(KuferTools.Filter.DatumBis), 4) + '<br><br>';
    meldung += '</div>';
    
    meldung += '<div class="person_filterdialog_buttons">';
    meldung += getButtonToday() + getButtonAktWeek() + getButtonAktMonth() + '<br>';
    meldung += getButtonTomorrow() + getButtonNextWeek() + getButtonNextMonth();
    meldung += '</div>';
    meldung += '</div>';
    $form.append(meldung);
    return $form;
  } //end createKurseFilterForm (..)



// Führt für den jeweiligen Buttonclick das passende Javaskript Handling aus
function getDialogDefaultButtons($pTab) {
  return {
    "Schließen": function () {
      $(this).dialog("close");
    },
    "Filter leeren": function () {
      removeFilterKursTable($pTab);
      $(this).dialog("close");
    },
    "Filter setzen": function () {
      doFilterKursTablebyAjax($pTab);
      $(this).dialog("close");
    }
  };
}


/**
 * Aufruf des Filterdialogs. Setzt die Meldung zuvor in ein Formular.
 * 
 * @param $pTab Containter-Div des aktiven Tabs.
 * @param pMeldung Dialoginhalt
 * @param pTitle Dialogtitel
 * @param pButtons Buttons
 * @param pWidth Breite des Fensters (optional)
 * @param pPosition Höhe des Fensters (optional)
 * @param pAction Action-Attribut des Formulars (optional)
 */
function showFilterMessage($pTab, pMeldung, pTitle, pButtons, pWidth, pPosition)
{
  var $dialogKurseFilter = $('<div id="dialogKurseFilter"></div>');
  var meldung = $dialogKurseFilter.append(pMeldung);
    
  //  '<form class="filter_form" method="post" ' + action + '>' + pMeldung + '</form>';
  showMessage(meldung, pTitle, pButtons, pWidth, pPosition, function($pDialog){
    doFilterKursTablebyAjax($pTab);
    $pDialog.dialog('close');
  });
}

//Setzt die Filtervariablen für die Kurs Tabelle im Kursreiter zurück
function removeFilterKursTable($pTab) {
  // $('#dialogKurseFilter :input[type=radio][value=default]').prop("checked", true);
  // besser ist z.B. (aber Klasse so nicht vorhanden
  // $('#dialogKurseFilter #alleStatiTermine').prop("checked", true);
  
  //Zuerst: Zurücksetzen der Einstellungen direkt in den Inputfeldern (zum Senden als AJAX POST Variablen)
  $('.filter_input').val(''); // bzw. andere Möglichkeit
 /// $('.filter_datumvon').val(KuferTools.Filter.DatumVon0);
 // $('.filter_datumbis').val(KuferTools.Filter.DatumBis0);

  //Danach: Zurücksetzen der Einstellungen für die Anzeige in den Eingabefeldern; die werden beim erneuten Öffnen 
  //des Filters mit den KuferTools.Filter Variablen besetzt (in Methode createKurseFilterForm())
  KuferTools.Filter.DatumVon = '';
  KuferTools.Filter.DatumBis = '';
  KuferTools.Filter.KnrVon = '';
  KuferTools.Filter.KnrBis = '';
  KuferTools.Filter.KursTitel = '';
  
  doFilterKursTablebyAjax($pTab);
}


//Hier wird die neue Tabelle für die Kurse erstellt, wenn ein Filter gesetzt wird
function doFilterKursTablebyAjax($pTab) {
  
  // Nicht nötig: var datumVon  =   $.trim($('.filter_datumvon').val()); Denn:
  // Im Post werden u.a. die Felder filter_kurstitel, filter_knrvon, filter_knrbis, filter_datumvon,filter_datumbis
  // mitgeschickt
  var datumVon = $.trim($('.filter_datumvon').val());
  var datumBis = $.trim($('.filter_datumbis').val());
  var knrVon = $.trim($('.filter_knrvon').val());
  var knrBis = $.trim($('.filter_knrbis').val());
  var kursTitel = $.trim($('.filter_kurstitel').val());
  
  KuferTools.Filter.filterActive = false;
  //Filter ist aktiv, wenn die Eingabewerte nicht leer sind; für die Datumswerte ist der Filter bereits aktiv, wenn nur einer
  //der werte datumVon bzw. datumBis gefüllt ist
  // per Default eingestellten Datumswerten sein.
  if (!isempty(kursTitel)) {
    KuferTools.Filter.KursTitel = kursTitel;
    KuferTools.Filter.filterActive = true;
  }
  if (!isempty(knrVon)) {
    KuferTools.Filter.KnrVon = knrVon;
    KuferTools.Filter.filterActive = true;
  }
  if (!isempty(knrBis)) {
    KuferTools.Filter.KnrBis = knrBis;
    KuferTools.Filter.filterActive = true;
  }
  
  //Wenn nur ein Datumswert leer ist , wird der Filter trotzdem aktiviert; dann werden - ohne Berücksichtigung des Semesters-
  // alle Kurse im gesetzten Zeitraum gefiltert; bei DatumVon='' ist dann der Zeitraum von vorne her nicht eingeschränkt
  if (!isempty(datumVon) || !isempty(datumBis) ) {
    KuferTools.Filter.DatumVon = datumVon;
    KuferTools.Filter.DatumBis = datumBis;
    KuferTools.Filter.filterActive = true;
  }
 
 
  var $kursfilterForm = $('.kursfilterForm');
  //doAjaxPost sendet den Ajax Request zum Server und gibt  dabei die Inhalte der Input Felder aus dem Formular als POST
  // Variablen mit; also sthet z.B. im POST: filter_kurstitel=Englisch&filter_datumvon=18.02.2013&filter_datumbis=......
  KuferTools.Utils.doAjaxPost($kursfilterForm, $kursfilterForm.prop('action'))
    .then(resp => resp.text())
    .then(function(response){
      //Verarbeiten der Response vom Server
      var $tableDiv = $('.tab_page_datatable_div', $pTab);
      var $response = $(response);
      $tableDiv.html($response.find('.tab_page_datatable_div').html());
      // Nach dem Filtern muss der Stornodialog neu gesetzt werden.
      KuferTools.TabPage.Storno.SetDialog($response.find('#stornoDialog'));
      KuferTools.TabTable.InitDataTable($pTab.find('table').first());


      KuferTools.Utils.AjaxLadebildschirm.Stop();
    }); //end callbacck Funktion für Response zu doAjaxPost)
  
  if(KuferTools.Filter.filterActive) {
    $(".tab_kursfilter_del", $pTab).css({"display":"inline"});
  } else {
    $(".tab_kursfilter_del", $pTab).css({"display":"none"});
  }
}
};

/**
 * Initialisiert die "alle markieren" und "keine markiren"-Buttons
 */
KuferTools.TabPage.InitMarkieren = function() {
  $('.tab_markiere').click(function(){
    $(this).parents('.tab.content').find('table.tab_page_datatable input.markable').prop('checked', true);
  });
  $('.tab_entferne_markierungen').click(function(){
    $(this).parents('.tab.content').find('table.tab_page_datatable input.markable').prop('checked', false);
  });
};

KuferTools.TabPage.InitBearbeiteSightBuilder = function()
{
  $('.tab_bearbeiten4sightbuilder').click(function(){
    
    var classes = $(this).prop('class');
    var getParam = classes.match(/get_(\w*)/);
    getParam = getParam[1];
    var saveParam = classes.match(/save_(\w*)/);
    saveParam = saveParam[1];
    var dataId = classes.match(/dataid_(\w*)/);
    dataId = dataId[1];
    
    
    var actionPart = '&action=' + getParam + '&dataId=' + dataId;
    var link = 'usertools.php';
    
    var dataStr = "tool_id=" + KuferTools.ToolId + '&toolsection_id=' + KuferTools.ToolSectionId + actionPart;
    var weite = 800;
    
    var buttons =   {
      "Speichern": function() {
        var activeTab = '#' + KuferTools.Utils.Tabs.GetIdFromActiveTab();
        var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + activeTab;
        var $form = KuferTools.Page;
        if( !$form.is('form') ) {
          $form = $form.find('form');
        }
        
        $form.append('<input type="hidden" name="' + saveParam + '" value="1">');
        // TODO derzeit werden keine Bankdaten validiert!
        if(validateForm($form.find('input, select, textarea'))) {
          $form.prop('action',actionLink);
          $form.submit();
        } else {
          showMessage('Bitte geben Sie gültige Werte in die gekennzeichneten Eingabefelder ein.' ,'Validierung fehlgeschlagen');
        }
      },
      "Abbrechen": function() {$(this).dialog("close"); $('#hlberuf_div').remove();}
    };
  
    //Hier erfolgt das Nachladen der Seite via Ajax und die Seitenausgabe via showMessage()
    KuferTools.Utils.loadAndDisplayPage(link,dataStr,buttons,weite);
  });
}