/**
 *
 */
function tableSort(){

   /**
    * Ruft den xmlHttp-Request um die Tabelle nach sortField sortieren zu lassen
    *
    * @param object     objE
    * @param string     sortObject
    * @param string     sortField
    * @param string     sortDirection
    * @param string     idDivOutput
    * @param string     template
    */
   this.sort = function(objE, sortObject, sortField, sortDirection, idDivOutput, template)
   {
      var url, pageSearchValue, objInput;
      var para = new Array();


      if(sortDirection != 'DESC')
      {
         sortDirection = 'ASC';
      }

      if(!template)
      {
         template = '';
      }

      para.push('sortField='     + sortField);
      para.push('sortDirection=' + sortDirection);
      para.push('template='      + template);
      para.push('idDivOutput='   + idDivOutput);
      
      if((objInput = document.getElementById('searchThroughSheetsValue')))
      {
         pageSearchValue = objInput.value;
      }
      else
      {
         pageSearchValue = '';
      }
      
      para.push('pageSearchValue=' + pageSearchValue);

      // Informationen zum Paging ans Parameter-Array anhaengen
      para = para.concat(this.getPagingValuesAsParameter());

      url = '/'
          + sortObject
          + '/tableSort';

      sendXmlHttpRequest(url, idDivOutput, para, XmlHttpRequestCallBack, 'opacity');
   }

   /**
    * Setzt die neue Anzahl der Listeneintraege
    */
   this.setPageSize = function(newSize)
   {
      var objFieldPageSize, objFieldPageShow, oldPageSize, actPageNum, newPageNum;
      var actEntry;

      // neue pageSize setzen
      if(!(objFieldPageSize = document.getElementById('pageSize')))
      {
         return;
      }

      oldPageSize = objFieldPageSize.value
      objFieldPageSize.value = newSize;

      // und die akt. Seite mit der geaenderten pageSize anzeigen lassen
      if(!(objFieldPageShow = document.getElementById('pageShow')))
      {
         return;
      }

      actPageNum = objFieldPageShow.value;

      actEntry = actPageNum * oldPageSize;
      newPageNum = (actEntry / newSize).toFixed(0);
      if(newPageNum < 0)
      {
         newPageNum = 0;
      }

      this.goTo(false, newPageNum);
   }

   /**
    * Springt zur angegebenen Seite, unter beibehaltung der Sortierung
    *
    * @param int  pageShow
    */
   this.goTo = function(objE, pageShow, firstLetter)
   {
      var url, objInput, pageSize, sortObject, idDivOutput;
      var para = new Array();

      // die Parameter der Sortierung lesen
      para = this.getSortingValuesAsParameter();

      // welche Seite soll angezeigt werden
      para.push('pageShow=' + pageShow);

      var searchString = document.getElementById('searchThroughSheetsValue') != null ? document.getElementById('searchThroughSheetsValue').value : '' ;
      para.push('pageSearchValue=' + searchString);

      // ist eine Seitengroesse angegeben
      if((objInput = document.getElementById('pageSize')))
      {
         // ja
         if((pageSize = objInput.value) > 0)
         {
            // und pageSize ist > 0
            para.push('pageSize=' + pageSize);
         }
      }

      // Welches SiteModel soll sortiert werden
      if(!(objInput = document.getElementById('sortObject')))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. ID = sortObject');
         return;
      }

      if(!(sortObject = objInput.value))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. Value = null');
         return;
      }

      // ID des Ausgabe-DIV
      if(!(objInput = document.getElementById('idDivOutput')))
      {
         alert('Konnte idDivOutput nicht finden.');
         return;
      }
      
      idDivOutput = objInput.value;
      
      // Workaround fuer die choiceImg Listendarstellung
      if(firstLetter)
      {
         para.push('firstLetter=' + firstLetter);
      }
      
      // Die URL bauen
      url = '/'
          + sortObject
          + '/tableSort';
      
      sendXmlHttpRequest(url, idDivOutput, para, XmlHttpRequestCallBack, 'opacity');
   }

   /**
    * Loescht das Suchbegrifffeld und laed die Liste neu mit goTo Seite 0
    *
    */
   this.loadWholeList = function(objE)
   {
      var objF;

      if((objF = document.getElementById('searchThroughSheetsValue')))
      {
         objF.value = '';
      }

      this.goTo(objE, 0);
   }

   /**
    * Loescht einen Eintrag
    *
    * @param object  objE        Element auf das geklicket wurde
    * @param int     oid         oId des zu loeschenden Eintrags
    */
   this.deleteEntry = function(objE, oid)
   {
      var objInput, sortObject, idDivOutput;
      var para = new Array();
      
      if(objE instanceof Array)
      {
         oid = objE[1];
      }
      
      para = objTableSort.getPagingValuesAsParameter().concat(objTableSort.getSortingValuesAsParameter());
      para.push('oid=' + oid);

      // Welches SiteModel soll sortiert werden
      if(!(objInput = document.getElementById('sortObject')))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. ID = sortObject');
         return;
      }

      if(!(sortObject = objInput.value))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. Value = null');
         return;
      }

      // Ausgabe DIV
      // ID des Ausgabe-DIV
      if(!(objInput = document.getElementById('idDivOutput')))
      {
         alert('Konnte idDivOutput nicht finden.');
         return;
      }

      idDivOutput = objInput.value;

      // Die URL bauen
      url = '/'
          + sortObject
          + '/deleteEntry';
      
      sendXmlHttpRequest(url, idDivOutput, para, XmlHttpRequestCallBack, 'opacity');
   }
   
   
   /**
    * Ruft deleteEntry auf. Gibt vorher den Text in askUser aus
    */
   this.deleteEntryAskUser = function(objE, oid, askUser)
   {
      var para = new Array(objE, oid);
          
      boDialog
            (
               'confirm',
               askUser,
               null,
               null,
               this.deleteEntry,
               para
            );
   }

   /**
    * Ruft die Kontroller-Methode toggleField
    * Schaltet den Wert des Feldes/Eigenschaft zwischen 0 und 1
    *
    * @param   object      objE           Element auf das geklickt wurde
    * @param   int         oid            oid des Eintrags
    * @param   string      nameField      Name des Feldes/Eigenschaft
    *
    * @return  void
    */
   this.toggleField = function(objE, oid, nameField)
   {
      var objInput, sortObject, idDivOutput;
      var para = new Array();

      // Paging- und Sortierungs-Parameter ermitteln
      para = this.getPagingValuesAsParameter().concat(this.getSortingValuesAsParameter());

      para.push('oid='       + oid);
      para.push('nameField=' + nameField)

      // Welches SiteModel soll sortiert werden
      if(!(objInput = document.getElementById('sortObject')))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. ID = sortObject');
         return;
      }

      if(!(sortObject = objInput.value))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. Value = null');
         return;
      }

      // Ausgabe DIV
      // ID des Ausgabe-DIV
      if(!(objInput = document.getElementById('idDivOutput')))
      {
         alert('Konnte idDivOutput nicht finden.');
         return;
      }

      idDivOutput = objInput.value;

      // Die URL bauen
      url = '/'
          + sortObject
          + '/toggleField';

      sendXmlHttpRequest(url, idDivOutput, para, XmlHttpRequestCallBack, 'opacity');
   }

   /**
    * Ruft die Methode nameMethod im SiteController auf
    * Wurde in askUser ein Text uebergeben wird vor Ausfuehrung der Methode
    *
    * @param   object   objE           Element auf das geklickt wurde
    * @param   string   nameMethod     Name der aufzurufenden Methode
    * @param   string   askUser
    */
   this.callMethod = function(objE, nameMethod, askUser)
   {
      if(askUser)
      {
         boDialog
               (
                  'confirm',
                  askUser,
                  null,
                  null,
                  this.callMethodCB,
                  nameMethod
               );

         return;
      }

      this.callMethodCB(nameMethod);
   }

   /**
    * Wird von callMethod aufgerufen
    */
   this.callMethodCB = function(nameMethod)
   {
      var objInput, sortObject, idDivOutput;
      var para = new Array();

      // Paging- und Sortierungs-Parameter ermitteln
      para = objTableSort.getPagingValuesAsParameter().concat(objTableSort.getSortingValuesAsParameter());

      // Welches SiteModel soll sortiert werden
      if(!(objInput = document.getElementById('sortObject')))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. ID = sortObject');
         return;
      }

      if(!(sortObject = objInput.value))
      {
         alert('Zu sortierendes Datenmodel konnte nicht ermittelt werden. Value = null');
         return;
      }

      // Ausgabe DIV
      // ID des Ausgabe-DIV
      if(!(objInput = document.getElementById('idDivOutput')))
      {
         alert('Konnte idDivOutput nicht finden.');
         return;
      }

      idDivOutput = objInput.value;

      // Die URL bauen
      url = '/'
          + sortObject
          + '/' + nameMethod;

      sendXmlHttpRequest(url, idDivOutput, para, XmlHttpRequestCallBack, 'opacity');
   }

   /**
    * Liesst die Informationen zum Paging aus dem Dokument und liefert sie als
    * Array von Parameter-Strings
    *
    * @param void
    *
    * @return array
    */
   this.getPagingValuesAsParameter = function()
   {
      var i, str, objInput;
      var arrVal = new Array();
      var arrId  = new Array
                       (
                          'pageShow',
                          'pageSize',
                          'pageEntryCount',
                          'pageCount'
                       );

      for(i = 0; i < arrId.length; i++)
      {
         if(!(objInput = document.getElementById(arrId[i])))
         {
            continue;
         }

         arrVal.push(arrId[i] + '=' + objInput.value);
      }

      return arrVal;
   }

   /**
    * Liest die Informationen zur Sortierung aus dem Dokument und liefert sie als
    * Array von Parameter-Strings
    *
    * @param void
    *
    * @return array
    */
   this.getSortingValuesAsParameter = function()
   {
      var i, str, objInput;
      var arrVal = new Array();
      var arrId  = new Array
                       (
                          'sortField',
                          'sortDirection',
                          'template',
                          'idDivOutput'
                       );

      for(i = 0; i < arrId.length; i++)
      {
         if(!(objInput = document.getElementById(arrId[i])))
         {
            continue;
         }

         arrVal.push(arrId[i] + '=' + objInput.value);
      }

      return arrVal;
   }



} // END Class tableSort

var objTableSort = new tableSort();
