/**
 * JQUERY Handling und spezielle Funktionen für das Handling mit Datatables
 * zunächst ist hier das Datatable Handling für das Hinzufügen von Dozenten in den Kursdetails
 * des Tools Kurse MA enthalten (Reiter Honorare)
 */

registerNamespace('KuferTools.DataTables');
registerNamespace('KuferTools.KursDetails.Dozenten.DataTables');

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

  //DataTables Inhalt in das data() Objekt des angeklickten Buttons füllen und das div#dozDataTable aus
  // dem DOM Baum entfernen
  //Der Prototype - d.h. KuferTools.KursDetails.Dozenten.DataTables.prototype - wurde beim Laden bereits definiert
  var dozDataTable = new KuferTools.KursDetails.Dozenten.DataTables(null, 'Dozentenauswahl');
  dozDataTable.fillDataTableInhalt();

  // Klickhandler für das Hinzufügen eines Dozenten mit Hilfe von DataTables
  $('.dozentAddDT').click(function () {
    try {
      var $this = $(this); //aktuell geklickter Button
      //der vom DOM Baum abgehängte DataTables Inhalt hängt am geklickten Button
      var $dozDTInhalt = $this.data('DozDTInhalt');
      var $dozAuswahlListeDT = $dozDTInhalt.find('#dozAuswahlListeDT');
      // Name muss zusätzlich im Inputfeld selber (in Tabkursdozenten) mit A vorbesetzt werden
      var filterVars = {
        filtername: 'A', filtervorname: '',
        filternummer: '', filterstrasse: '',
        filterort: '', filterplz: ''
      };

      //Die Instanz aus der übergeordneten Ready Fkt. verwenden (sonst wird z.B. der selectedEntry wieder zurückgesetzt);
      // nur das Attr. $aktObj (= geklickter Button) noch anpassen
      dozDataTable.setAktObj($this);
      //DataTable initialisieren; 2. Par pDestroy muss true sein um DataTable beim Neuladen mit neuen Werten zu besetzen
      var oTable = dozDataTable.initDataTable($dozAuswahlListeDT, true, filterVars);

      //Data Table mit DozentenDaten im Dialog ausgeben
      dozDataTable.showDataTablesDialog($dozDTInhalt);

      // Keyup Event handling zum Filtern der Dozentenmenge nach den eingebenen Suchbegriffen;  Jedes Eingabefeld
      //filtert in der entspr. Spalte, also z.B. in Name, Vorname, Strasse etc
      $(document).on('input', '#dozSuchleisteDT input', function () {
        $this = $(this);  //enthält das aktuelle Eingabefeld z.B. input#doz_nameDT etc.
        switch ($this.prop('id')) {
          case 'doz_nameDT':
            filterVars.filtername = this.value;
            break;
          case 'doz_vornameDT':
            filterVars.filtervorname = this.value;
            break;
          case 'doz_nummerDT':
            filterVars.filternummer = this.value;
            break;
          case 'doz_strasseDT':
            filterVars.filterstrasse = this.value;
            break;
          case 'doz_ortDT':
            filterVars.filterort = this.value;
            break;
          case 'doz_plzDT':
            filterVars.filterplz = this.value;
            break;
        }
        //DataTable mit den neuen Werten ausgeben
        oTable.fnDraw();
      }); //end keyup

    }
    catch (e) {
      showMessage(e.message, e.name + ' Exception');
      return false;
    }
  }); //end Klickhandler für dozentAddDT

  //Einfacher Klick auf eine Tabellen Zeile (TR Element) bewirkt highlighten der Zeile
  $(document).on('click', '#dozAuswahlListeDT tbody', function (event) {
    var $this = $(this); //Tabellen Body
    var $eventTarget = $(event.target);
    //selectedIndex muss vor highlight ausgeführt werden.
    var $selectedTr = $eventTarget.parents('tr');
    var selectedIndex = $selectedTr.index();
    dozDataTable.highlight($this, selectedIndex);
    /* if (selectedIndex >= this.data.length)
         selectedIndex = null;
       */
    dozDataTable.setSelectedEntry($selectedTr);
  });  // end ClickHandler für Highlighten


  $(document).on('dblclick', '#dozAuswahlListeDT tbody', function (event) {
    var $eventTarget = $(event.target);
    //Wird durch das Clickevent bereits abgedeckt
    //var $selectedTr = $eventTarget.parents('tr');
    //var selectedIndex = $selectedTr.index();
    //param.highlight();
    // selectedEntry is das gewählte TR Element
    dozDataTable.buildLink4SelEntry(dozDataTable.$selectedEntry);
  });

});  //end document ready




// Konstruktor für die Pseudoklasse DataTables
KuferTools.DataTables = function ($pAktObj, pTitle) {
  this.$aktObj = $pAktObj;
  this.title = pTitle;
  this.$selectedEntry = null;

  /**
   *  Speichert den ausgewählten Eintrag
   *  das ist normalerweise die gewählte Zeile aus der Tabelle; also ein TR element
   */
  this.setSelectedEntry = function ($pSelEntry) {
    this.$selectedEntry = $pSelEntry;
  } // end getSelectedEntry

  //setzt das aktuell geklickte Objekt
  this.setAktObj = function ($pAktObj) {
    this.$aktObj = $pAktObj;
  }

  // füllt das data-Objekt des angeklickten Buttons
  this.fillDataTableInhalt = function () { };

  //Initialisiert die DataTable und liefert das DataTableObjekt
  this.initDataTable = function () { };

  //löscht die Einträge in den Suchfeldern
  this.deleteSearchEntries = function () { };

  //  Baut den Link mit der Id des selektierten Eintrags zusammen
  this.buildLink4SelEntry = function ($pSelEntry) { };


  //setzt Klasse active für den selektierten Eintrag und erzwingt damit Highlighting
  this.highlight = function ($pAktObj, pSelectedIndex) {
    $trs = $pAktObj.find('tr');

    //Bug-fix: Es reicht die bisherigen aktiven Zeilenelemente auf nichtaktiv zu setzen,
    $trs.removeClass('active');
    // $trs.filter(':odd').removeClass('even active').addClass('odd');
    // $trs.filter(':even').removeClass('odd active').addClass('even');
    if (!isNaN(parseFloat(pSelectedIndex)) && isFinite(pSelectedIndex))
      $trs.eq(pSelectedIndex).addClass('active');
  } // end highlight(..)


  /**
  * Gibt den Dialog mit den Dozentendaten aus, die als Data Tables dargestellt werden
  * Par. $pInhalt enthält die aus dem DOM Baum ausgehängte dozDatatable, die als data('DozDTInhalt') am aktuell
  * geklickten Button hängt
  */
  this.showDataTablesDialog = function showDataTablesDialog($pInhalt) {
    //Function Invocation Pattern anwenden (weil this sich in der inneren Fkt. ändert)
    var thisDT = this;


    var buttons = {};
    //Nur hinzufügen, falls das Recht für neuen Button gesetzt ist; wurde in getJSDeclarations(..) in der Javascript
    // Variable KuferTools.KursDetails.Dozenten.NewDoz gespeichert (von pagelinks['doznew'] )
    if (KuferTools.KursDetails.Dozenten.NewDoz === true) {
      buttons = {
        "neuer Dozent": function () {
          thisDT.getDialog4NewDozent();
          // $(this).dialog("close");
        }
      };

    }

    var buttonsDefault = {
      "Ok": function () {
        if (thisDT.$selectedEntry !== null) {
          //Eingaben in den Inputfeldern zurücksetzen
          thisDT.deleteSearchEntries();
          thisDT.buildLink4SelEntry(thisDT.$selectedEntry);
          //var $form = $('form#xyz');
          $(this).dialog("close");
        }
        //$form.submit();
        else
          showMessage('Sie haben noch keinen Dozenten ausgewählt.', 'Achtung');
      },  //end Ok
      "Abbrechen": function () {
        //Eingaben in den Inputfeldern zurücksetzen
        thisDT.deleteSearchEntries();
        $(this).dialog("close");
      }
    };   //end buttons

    //Mergen der Buttons Objekte
    buttons = jQuery.extend(buttons, buttonsDefault);
    // buttons = KuferTools.Utils.mergeObjects(buttons,buttonsDefault);
    var dialogwidth = 'auto';

    //var $inhalt = oTable.fnDraw();
    showMessage($pInhalt, this.title, buttons, dialogwidth);
  } //end showDataTablesDialog(..)

} //end Class DataTables


/**
 * spezielle DataTables Pseudoklasse für Dozentenauswahl in den Kursdetails
 */
KuferTools.KursDetails.Dozenten.DataTables = function ($pAktObj, pTitle) {

  //Notwendig um Parameter der Vater Klasse zu besetzen; entspricht einem parent::_construct() in PHP
  KuferTools.DataTables.call(this, $pAktObj, pTitle);

  /**
   * füllt das data-Objekt des angeklickten Buttons mit dem div#dozDataTable und entfernt das div aus dem DOM Baum
   */
  this.fillDataTableInhalt = function () {
    //div#DozDataTable speichern und aus dem DOM Baum aushängen
    var $dozDataTable = $('#dozDataTable');
    var $dozDataTableButton = $('.dozentAddDT');
    $dozDataTableButton.data('DozDTInhalt', $dozDataTable);
    $dozDataTable.detach();
  }; //end fillDozDataTableInhalt()

  /**
   * Initialisiert die DataTable und liefert das DataTableObjekt
   * 2. Par pDestroy gibt an, ob DataTable beim Neuladen mit neuen Werten besetzt wird
   */
  this.initDataTable = function ($pDataTableListe, pDestroy, pFilterVars) {
    var urlPar = "?tool_id=" + KuferTools.ToolId + '&toolsection_id=' + KuferTools.ToolSectionId + '&nr='
      + KuferTools.KursDetails.Kurs.Knr + '&action=addDozentDT'
    var url4Ajax = 'usertools.php' + urlPar;

    //sendet Ajaxrequest zur URL unter sAjaxSource;
    // Holt die Responsedaten aus einem Array bzw. Objekt mit Attribut únter sAjaxDataProp (d.h. mit "data");
    //Default ist "aaData"

    // Im Parameter sSearch_i bezieht sich das i auf die Nr der angezeigten Spalte in der Tabelle d.h.
    // 0 -> id; 1-> name, 2-> vorname, 3 -> strasse etc.; Namen (z.B. strasse, ort, nurplz etc.)  kommen aus dem Datamodul für Dozenten
    var oDataTable = $pDataTableListe.dataTable({
      "bServerSide": true,
      "sAjaxSource": url4Ajax,
      "sAjaxDataProp": "aaData",
      //Filtern nach den z.B. ersten 25 Einträgen kombiniert mit Sortierung der Spalten u. Seiteblättern funktioniert nicht korrekt; daher
      // erst mal kein Paginierung (Aufteilen der gefundenen Einträge auf mehrere Seiten); in KuferSQL gibt es das auch nicht
      "bPaginate": false,
      "bFilter": false,    //SuchFeld bzw. Filter disablen
      "bDestroy": pDestroy,
      //     "iDisplayLength":20, //Um den Wert aus dem Eingabefeld für die Anzahl zu erhalten, darf die Länge hier nicht angegeben sein
      "aoColumns": [
        {
          "mData": "id"
        },
        {
          "mData": "name",
          'render': $.fn.dataTable.render.text()
        },
        {
          "mData": "vorname",
          'render': $.fn.dataTable.render.text()
        },
        {
          "mData": "strasse",
          'render': $.fn.dataTable.render.text()
        },
        {
          "mData": "ort",
          'render': $.fn.dataTable.render.text()
        },
        //  { "mData": "nurplz" },
        {
          "mData": "tel_anzeige",
          'render': $.fn.dataTable.render.text()
        },
        {
          "mData": "email_anzeige",
          'render': $.fn.dataTable.render.text()
        }
      ],
      "oLanguage": {
        "sLengthMenu": "_MENU_ Einträge pro Seite",
        "sZeroRecords": "Kein Eintrag zu diesen Kriterien gefunden",
        "sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
        "sInfoEmpty": "0 Einträge",
        "sInfoFiltered": "(gefiltert aus _MAX_ Einträgen insgesamt)",
        // momentan nicht nötig; aber man kann es drin lassen
        "oPaginate": {
          "sNext": "vor",
          "sPrevious": "zurück   "
        }
      },
      "aoColumnDefs": [
        //Spalte nurplz über css Eigenschaften ausblenden, sonst schiebt es die Tabelle zusammen
        // {"bVisible": false,  "aTargets": ["nurplz"]},
        // für Suche bzw. Filter verwendbare bzw. nicht verwendbare Spalten (nach nurplz sollte gefiltert werden)
        //  TODO: nochklären; bSearchable sollte so funktioniern; klappt aber nicht;
        // {"bSearchable": false, "aTargets": ["telefon","email"] },
        { "bSortable": false, "aTargets": ["nr", "strasse", "ort", "telefon", "email", "nurplz"] },
        { "sClass": "nurplz", "aTargets": ["nurplz"] }    //für Spalte nurplz eine Klasse setzen
      ],

      /* Durch das Anpassen der Spaltengröße in fnAdjustColumnSizing() ändert sich die Tabelle; deshalb weglassen
      /* "fnInitComplete": function() {
          this.fnAdjustColumnSizing();
          this.fnDraw();
       },  */
      //Spalten in denen gesucht wird: 0: doznummer, 1: name, 2: vorname, etc.; Spalte 5 für PLZ ist via CSS ausgeblendet
      "fnServerParams": function (aoData) {
        aoData.push({ "name": 'sSearch_1', "value": pFilterVars.filtername }, { "name": 'sSearch_2', "value": pFilterVars.filtervorname },
          { "name": 'sSearch_0', "value": pFilterVars.filternummer }, { "name": 'sSearch_3', "value": pFilterVars.filterstrasse },
          { "name": 'sSearch_4', "value": pFilterVars.filterort }, { "name": 'sSearch_5', "value": pFilterVars.filterplz }
        );
      }
    });  //end var oDataTable
    return oDataTable;
  } //end this.initDataTable(..)

  /**
   *  Setzt die Eingabewerte in den Eingabefeldern für die Suche zurück
   */
  this.deleteSearchEntries = function () {
    var $suchfelder = $('input', '#dozSuchleisteDT');
    $suchfelder.each(function (index, item) {
      var $item = $(item);  //ist z.B. input#doz_nameDT etc.
      var resetVal = '';
      //Der Wert für die Namenseingabe wird auf 'A' gesetzt
      if ($item.prop('id') == 'doz_nameDT')
        resetVal = 'A';
      //Werte in den Inputfeldern zurücksetzen
      $item.val(resetVal);
    });
  } // end deleteSearchEntries(..)

  /**
   *  Oeffnet den Dialog zum Eingeben eines neuen Dozenten
   *  der Dialog enthält ein Formular zum Eingeben der Dozentendaten, das via Sightbuilder aufgebaut wird
   *  ist relevant für den Dialog zum "Dozenten Hinzufügen" im Honorarreiter von Tool Kurse MA (Tool 8)
   */
  this.getDialog4NewDozent = function () {
    var link = 'usertools.php';
    //KuferTools.ToolId = 8 und KuferTools.ToolSectionId = 377;
    var dataStr = "tool_id=" + KuferTools.ToolId + '&toolsection_id=' + KuferTools.ToolSectionId + '&action=newDozent';
    var weite = 990;
    var buttons = {
      "Ok": function () {
        //Das via loadAndDisplayPage(..) aufgebaute Formular validieren und abschicken; hat die Form
        // <form id="sightbuilderform" class="ui-dialog-content...>...

        //aktuell aktivierten Tab für Reiter Dozenten an den Link anhängen z.B. #tabs-5
        var tab = $('.text_reiter', 'li.ui-state-active').prop('href');

        var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + '&xsrf=' + KuferTools.TabPageXsrf + tab;
        var formStr = '<input type="hidden" name="newDozent" value="1">';
        formStr += '<input type="hidden" name="nr" value="' + KuferTools.KursDetails.Kurs.Knr + '">';

        var $form = KuferTools.Page;
        $form.prop('action', actionLink);
        $form.append(formStr);
        //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 getDialog4NewDozent(..)


  /*
   *  Baut den Link mit der Id des selektierten Eintrags zusammen und leitet zum Handler für das Hinzufügen des Eintrags weiter
   *  Handling zum erzeugten Link erfolgt in Method _handleDozAdd() in toolmitarbeiter.php
   */
  this.buildLink4SelEntry = function ($pSelEntry) {
    var selId = $pSelEntry.find(':first-child').text();
    //wird wg. Problemen mit Umlauten (z.B. bei Büttner) doch nicht mitgeschickt im GET
    //var selName = $pSelEntry.find(':nth-child(2)').text();
    // alert (" Id: " + selId + " Name: "+ selName + " index: " + $pSelEntry.index());

    //aktuell aktivierten Tab für Reiter Dozenten z.B. #tab-6
    var tab = $('.text_reiter', 'li.ui-state-active').prop('href');

    var actionLink = KuferTools.SelfLink.replace(/&wb__already__decoded=done/g, '').replace(/#.*/, '') + '&xsrf=' + KuferTools.DozentHinzufuegenXsrf + tab;
    var postObj = { addDozent: 1, dozId: selId, nr: KuferTools.KursDetails.Kurs.Knr };
    KuferTools.Utils.Post(actionLink, postObj);

    // $this.prop('href',newLink);
  } //end buildLink4SelEntry()

} //end KuferTools.KursDetails.Dozenten.DataTables

KuferTools.KursDetails.Dozenten.DataTables.prototype = new KuferTools.DataTables();
