//
// JavaScript code for the management of HTML tables, for the OrdinaSoft library.
//
// Author:  OrdinaSoft
//          Patrick Lanz
//          Lausanne
//          info@ordinasoft.ch
//
// First version: May 10, 2007
//
// (c) 2007, OrdinaSoft, all rights reserved

//-----------------------------------------------------------------------------------------------
// Namespace initialization.

if (typeof OrdinaSoft == 'undefined')
  OrdinaSoft = new Object ();
if (typeof OrdinaSoft.Table == 'undefined')
  OrdinaSoft.Table = new Object ();
if (typeof OrdinaSoft.Table.Pager == 'undefined')
  OrdinaSoft.Table.Pager = new Object ();

//-----------------------------------------------------------------------------------------------
// Global variables.

OrdinaSoft.Table.SelectedClass = '';  // Class name for a selected row

OrdinaSoft.Table.Pager.MaxPagesLeft  = 5;         // Maximum number of pages at left
OrdinaSoft.Table.Pager.MaxPagesRight = 5;         // Maximum number of pages at right
OrdinaSoft.Table.Pager.Separator     = '&nbsp;';  // Separator between two entries
OrdinaSoft.Table.Pager.TxtPrev       = '<';       // Text for previous page
OrdinaSoft.Table.Pager.TxtNext       = '>';       // Text for next page
OrdinaSoft.Table.Pager.TxtFirst      = '<<';      // Text for first page
OrdinaSoft.Table.Pager.TxtLast       = '>>';      // Text for last page

// Indicates where and if we must display the current page in the pager.
// Possible values are:
//  - 0: no display.
//  - 1: display on left.
//  - 2: display on right.
OrdinaSoft.Table.Pager.NoCurPagePos  = 1;

//-----------------------------------------------------------------------------------------------
// Items selection.

// Changes the class of a selected item.
//  - Row is the selected item.

OrdinaSoft.Table.SelItem = function (Row) {

  Row.OldClassName = Row.className;
  Row.className = OrdinaSoft.Table.SelectedClass;
  return true;
} // OrdinaSoft.Table.SelItem



// Changes the class of a unselected item.
//  - Row is the selected item.

OrdinaSoft.Table.UnselItem = function (Row) {

  Row.className = Row.OldClassName;
  return true;
} // OrdinaSoft.Table.UnselItem

//-----------------------------------------------------------------------------------------------
// Pager.

// Formatting of a pager. Returns HTML code for the pager.
//  - CurPage is the number of the current page.
//  - NbPages is the total number of pages.

OrdinaSoft.Table.Pager.Format = function (CurPage, NbPages) {

  var Pager = OrdinaSoft.Table.Pager;
  var s = [];
  if (NbPages > 1) {
    var CurPageText = (NbPages == 1 ? '' : Pager.FormatCurPage (CurPage, NbPages));
    if ((Pager.NoCurPagePos == 1) && (CurPageText != ''))
      s [s.length] = CurPageText;
    if (NbPages != 1) {

      // Calculates the first and last page number to display
      var FirstPage = Math.max (CurPage - Pager.MaxPagesLeft, 1);
      var LastPage = Math.min (CurPage + Pager.MaxPagesRight, NbPages);

      // Entry for first page
      if ((FirstPage != 1) && (Pager.TxtFirst != ''))
        s [s.length] = Pager.FormatJump (1, Pager.FormatPageNumber (Pager.TxtFirst, false));

      // Entry for previous page
      if ((CurPage != 1) && (Pager.TxtPrev != ''))
        s [s.length] = Pager.FormatJump (CurPage - 1,
                                         Pager.FormatPageNumber (Pager.TxtPrev, false));

      // Entries for the pages
      for (var NoPage = FirstPage; NoPage <= LastPage; NoPage++) {
        var Content = Pager.FormatPageNumber (NoPage, NoPage == CurPage);
        if (NoPage != CurPage)
          Content = Pager.FormatJump (NoPage, Content);
        s [s.length] = Content;
      } // For NoPage, for all pages

      // Entry for next page
      if ((CurPage != NbPages) && (Pager.TxtNext != ''))
        s [s.length] = Pager.FormatJump (CurPage + 1,
                                         Pager.FormatPageNumber (Pager.TxtNext, false));

      // Entry for last page
      if ((LastPage != NbPages) && (Pager.TxtLast != ''))
        s [s.length] = Pager.FormatJump (NbPages,
                                         Pager.FormatPageNumber (Pager.TxtLast, false));

    } // NbPages != 1
    if ((Pager.NoCurPagePos == 2) && (CurPageText != ''))
      s [s.length] = CurPageText;
  } // NbPages > 1
  return s.join (Pager.Separator);
} // OrdinaSoft.Table.Pager.Format



// Formatting of the display of the current page.
//  - NoPage is the number of the current page.
//  - NbPages is the total number of pages.

OrdinaSoft.Table.Pager.FormatCurPage = function (NoPage, NbPages) {

  return 'Page ' + NoPage.toString () + ' of ' + NbPages.toString () +
          OrdinaSoft.Table.Pager.Separator;
} // OrdinaSoft.Table.Pager.FormatCurPage



// Formatting of the content to display a page number.
//  - NoPage is the number of the page.
//  - Current indicates if the page is the current one.

OrdinaSoft.Table.Pager.FormatPageNumber = function (NoPage, Current) {

  return NoPage.toString ();
} // OrdinaSoft.Table.Pager.FormatPageNumber



// Formatting of a jump to a given page.
//  - NoPage is the number of the page to jump to.
//  - Content is the content of the jump.

OrdinaSoft.Table.Pager.FormatJump = function (NoPage, Content) {

  return Content;
} // OrdinaSoft.Table.Pager.FormatJump

//-----------------------------------------------------------------------------------------------

OrdinaSoft_Table_Initialized  = true;  // The library is ready to be used