//
// Code JavaScript pour la page de recherche des mots de la langue.
//
// Auteur:  OrdinaSoft
//          Patrick Lanz
//          Lausanne
//          info@ordinasoft.ch
//
// Première version:  2 octobre 2007 2007
//
// Dépend de:
//   - Ajax.js
//   - Master.js
//   - Table.js
//

//-----------------------------------------------------------------------------------------------

// Code d'initialisation de la page.

// Attend que la page a été chargée et initialisée, afin d'initialiser les données spécifiques de
// la page.

function PageInit () {

  // Attend que les dépendances soient initialisées
  if ((typeof Ajax_Initialized   == 'undefined') ||
      (typeof Master_Initialized == 'undefined') ||
      (typeof Table_Initialized  == 'undefined')) {
    setTimeout (PageInit, 100);
    return false;
  }  // Dépendances pas encore initialisée

  // Formattage d'un saut à la page spécifiée.
  //  - NoPage est le numàro de la page sur laquelle il faut aller.
  //  - Content est le contenu à afficher.

  OrdinaSoft.Table.Pager.FormatJump = function (NoPage, Content) {
    return Table.Pager.FormatEntry (Content, false,
                                    'onclick="Submit (' + NoPage.toString () + ');"');
  } // OrdinaSoft.Table.Pager.FormatJump

  // Initialisation des contrôles.
  Master.Form.onsubmit = Submit;

  return true;
} // PageInit

PageInit ();

//-----------------------------------------------------------------------------------------------
// Soumission de la page.

// Fait le travail lorsque la page doit être renvoyée au serveur.
//  - NoPage est le numéro de la page à afficher.

function Submit (NoPage) {

  // Demande les données au serveur
  var Request = new Ajax.Request (Master.VirtAppPath + 'Xml/Langage/List.aspx');
  Request.AddPostParam ('Name', Master.GetElementById ('txt_Name').value);
  if (typeof NoPage != 'undefined')
    Request.AddPostParam ('NoPage', NoPage.toString ());

  Request.SuccessFunc = function () {
      if (Request.IsXmlOK ())
        WordList (Request.Req.responseXML);
      return true;
    };

  Request.AsyncCall ();
  return false;
} // Submit

//-----------------------------------------------------------------------------------------------
// Affichage de la liste.

// Fait le travail lorsque l'on a reçu la liste des mots.
//  - XmlData est la donnée XML reçue du serveur.

function WordList (XmlData) {

  var Data = DecodeWordList (XmlData);
  var s = [];

  // Affichage du nombre de mots et du pager.
  s [s.length] = '<div style="border-top: thin solid #7D7D7D; margin-top: 10px; ' +
                   'padding-top: 5px;">';
  switch (Data.TotalNb) {
    case '0' :
      s [s.length] = 'Aucun mot ne correspond &agrave; votre recherche.';
      break;
    case '1' :
      s [s.length] = 'Un seul mot a &eacute;t&eacute; trouv&eacute;.';
      break;
    default :
      s [s.length] = Data.TotalNb.toString () +
                       ' mots ont &eacute;t&eacute; trouv&eacute;s.';
  }  // switch (Data.TotalNb)
  s [s.length] = '<br />';
  s [s.length] = '<br />';
  var Pager = Table.Pager.Format (Data.CurPage, Data.NbPages);
  if (Pager != '') {
    s [s.length] = Pager;
    s [s.length] = '<br />';
  } // Pager != ''
  s [s.length] = '</div>';

  // Table des mots
  s [s.length] = '<div>';
  s [s.length] =   '<table border="0" cellspacing="0" cellpadding="0" width="100%">';

  // Affichage des mots
  s [s.length] =     '<tbody>';
  var Border = ' border-bottom: 1px solid #FFFFFF;';
  for (var i = 0; i < Data.Words.length; i++) {
    var Word = Data.Words [i];
    s [s.length] =       '<tr valign="top">';
    s [s.length] =         '<td style="font-weight: bold; padding: 2px;' + Border + '">' +
                             Word.Word + '&nbsp;&nbsp;</td>';
    s [s.length] =         '<td style="padding: 2px;' + Border + '">' +
                             Word.Definition + '</td>';
    s [s.length] =       '</tr>';
  }  // for i, pour toutes les mots
  s [s.length] =     '</tbody>';

  // Fin de la table
  s [s.length] =   '</table>';
  s [s.length] = '</div>';

  Master.GetElementById ('Result').innerHTML = s.join ('');
  return true;
} // WordList



// Lecture de la liste des mots que l'on a reçue du serveur.
//  - XmlData est la donnée XML reçue du serveur.
//  - Le résultat sera une structure contenant la liste des mots, ainsi que les statistiques.

function DecodeWordList (XmlData) {

  var Data = new Object ();
  Data.CurPage = '0';
  Data.NbPages = '0';
  Data.TotalNb = '0';
  var List = [];
  Data.Words = List;

  // Accède au noeud principal
  var MainNode = XmlData.getElementsByTagName ('Words');
  if (MainNode.length == 0)
    return Data;
  MainNode = MainNode [0];

  // Decode les données
  var Node = MainNode.firstChild;
  while (Node != null) {

    // Arme
    if (Node.nodeName == 'Word') {
      var Word = new Object ();
      Word.Name = '';
      Word.Definition = '';
      var WNode = Node.firstChild;
      while (WNode != null) {
        Word [WNode.nodeName] = OrdinaSoft.Ajax.GetXmlText (WNode);
        WNode = WNode.nextSibling;
      }  // while (WNode != null)
      List [List.length] = Word;
    }  // Node.nodeName == 'Word'

    // Autre donnée
    else Data [Node.nodeName] = OrdinaSoft.Ajax.GetXmlText (Node);

    Node = Node.nextSibling;
  }  // While (Node != null)

  Data.CurPage = parseInt (Data.CurPage, 10);
  Data.NbPages = parseInt (Data.NbPages, 10);
  return Data;
} // DecodeWordList