//
// Code JavaScript pour la page de recherche pour les armes.
//
// Auteur:  OrdinaSoft
//          Patrick Lanz
//          Lausanne
//          info@ordinasoft.ch
//
// Première version:  13 août 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 Base = OrdinaSoft.Base;
  var Request = new Ajax.Request (Master.VirtAppPath + 'Xml/Armes/List.aspx');
  Request.AddPostParam ('Monde', Base.Select.GetCurrent ('cbx_Monde', ''));
  Request.AddPostParam ('Profession', Base.Select.GetCurrent ('cbx_Profession', ''));
  Request.AddPostParam ('Rarete', Base.Select.GetCurrent ('cbx_Rarete', ''));
  Request.AddPostParam ('Sorte', Base.Select.GetCurrent ('cbx_Sorte', ''));
  if (typeof NoPage != 'undefined')
    Request.AddPostParam ('NoPage', NoPage.toString ());

  Request.SuccessFunc = function () {
      if (Request.IsXmlOK ())
        WeaponList (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 armes.
//  - XmlData est la donnée XML reçue du serveur.

function WeaponList (XmlData) {

  var Data = DecodeWeaponList (XmlData);
  var s = [];

  // Affichage du nombre d'armes 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] = 'Aucune arme ne correspond &agrave; votre recherche.';
      break;
    case '1' :
      s [s.length] = 'Une seule arme a &eacute;t&eacute; trouv&eacute;e.';
      break;
    default :
      s [s.length] = Data.TotalNb.toString () +
                       ' armes ont &eacute;t&eacute; trouv&eacute;es.';
  }  // switch (Data.TotalNb)
  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 armes
  s [s.length] = '<div>';
  s [s.length] =   '<table border="0" cellspacing="0" cellpadding="0" width="100%">';

  // En-tête de la table
  s [s.length] =     '<thead>';
  s [s.length] =       '<tr>';
  s [s.length] =         '<td style="padding: 2px; width: 100%"></td>';
  s [s.length] =         '<td align="center" style="padding: 2px; white-space: nowrap;">' +
                            'Requis</td>';
  s [s.length] =         '<td align="center" style="padding: 2px; white-space: nowrap;">' +
                            'D&eacute;g&acirc;ts min.</td>';
  s [s.length] =         '<td align="center" style="padding: 2px; white-space: nowrap;">' +
                            'D&eacute;g&acirc;ts max.</td>';
  s [s.length] =       '</tr>';
  s [s.length] =     '</thead>';

  // Affichage des armes
  s [s.length] =     '<tbody>';
  for (var i = 0; i < Data.Weapons.length; i++) {
    var Weapon = Data.Weapons [i];
    s [s.length] =       '<tr style="cursor: pointer;" ' +
                            'onmouseover="OrdinaSoft.Table.SelItem (this)" ' +
                            'onmouseout="OrdinaSoft.Table.UnselItem (this)" ' +
                            'onclick="SelectWeapon (\'' + Weapon.Rarity + '\', ' +
                                                    Weapon.JSText + ', \'' +
                                                    Weapon.Color + '\');">';
    s [s.length] =         '<td style="color: ' + Weapon.Color + ';">';
    s [s.length] =           Weapon.Text + ' (' + Weapon.Count + ')';
    s [s.length] =         '</td>';
    s [s.length] =         '<td align="center">' + Weapon.Required + '</td>';
    s [s.length] =         '<td align="center">' + Weapon.MinDamage + '</td>';
    s [s.length] =         '<td align="center">' + Weapon.MaxDamage + '</td>';
    s [s.length] =       '</tr>';
  }  // for i, pour toutes les armes
  s [s.length] =     '</tbody>';

  // Fin de la table
  s [s.length] =   '</table>';
  s [s.length] = '</div>';

  Master.GetElementById ('Result').innerHTML = s.join ('');
  RemoveWeaponClones ();
  Master.GetElementById ('Weapons').innerHTML = '';
  return true;
} // WeaponList



// Lecture de la liste des armes 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 armes, ainsi que les statistiques.

function DecodeWeaponList (XmlData) {

  var Data = new Object ();
  Data.CurPage = '0';
  Data.NbPages = '0';
  Data.TotalNb = '0';
  var List = [];
  Data.Weapons = List;

  // Accède au noeud principal
  var MainNode = XmlData.getElementsByTagName ('Weapons');
  if (MainNode.length == 0)
    return Data;
  MainNode = MainNode [0];

  // Decode les données
  var Node = MainNode.firstChild;
  while (Node != null) {

    // Arme
    if (Node.nodeName == 'Weapon') {
      var Weapon = new Object ();
      Weapon.Color = '#FFFFFF';
      Weapon.Count = 0;
      Weapon.Required = '-';
      Weapon.MinDamage = '-';
      Weapon.MaxDamage = '-';
      Weapon.Text = '';
      var WNode = Node.firstChild;
      while (WNode != null) {
        Weapon [WNode.nodeName] = OrdinaSoft.Ajax.GetXmlText (WNode);
        WNode = WNode.nextSibling;
      }  // while (WNode != null)
      List [List.length] = Weapon;
    }  // Node.nodeName == 'Weapon'

    // 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;
} // DecodeWeaponList

//-----------------------------------------------------------------------------------------------
// Affichage des armes.

// Appelée lorsque l'on sélectionne un groupe d'armes dans la liste.
//  - Rarity est la rareté de l'arme.
//  - Text est le texte pour le groupe d'armes.
//  - Color est la couleur pour l'arme.

function SelectWeapon (Rarity, Text, Color) {

  // Demande les données au serveur
  var Request = new Ajax.Request (Master.VirtAppPath + 'Xml/Armes/Data.aspx');
  Request.AddPostParam ('Rarity', Rarity);
  Request.AddPostParam ('Text', Text);

  Request.SuccessFunc = function () {
      if (Request.IsXmlOK ())
        WeaponData (Request.Req.responseXML, Text, Color);
      return true;
    };

  Request.AsyncCall ();
  return true;
}  // SelectWeapon



// Affiche le résultat contenant les données des armes.
//  - XmlData contient le résultat XML reçu depuis le serveur.
//  - Title est le texte à afficher au dessus de chaque arme.
//  - Color est la couleur pour le titre.

function WeaponData (XmlData, Title, Color) {

  // Calcule le contenu des armes
  var List = DecodeWeaponData (XmlData);
  var s = [];

  for (var i = 0; i < List.length; i++) {
    var Weapon = List [i];
    var Folder = Master.VirtAppPath + 'Images/Armes/' + Weapon.Folder + '/';
    s [s.length] = '<div style="border-top: thin solid #7D7D7D; margin: 5px; ' +
                     'padding-top: 5px; width: 100%;">';
    s [s.length] =   '<span ' +
                       'style="color: ' + Color + '; font-size: 140%; font-weight: bold;" >' +
                       Title + '</span><br />';
    s [s.length] =   '<img src="' + Folder + 'Perso.jpg"  style="margin: 2px;" />';
    s [s.length] =   '<img src="' + Folder + 'ATerre.jpg" style="margin: 2px;" />';
    s [s.length] =   '<img src="' + Folder + 'Icone.jpg"  style="margin: 2px;" />';
    s [s.length] =   '<br />';
    s [s.length] =   '<img src="' + Folder + 'Skin.jpg" style="margin: 2px;" />';
    s [s.length] = '</div>';
  }  // for i, pour toutes les armes

  // Met à jour l'affichage
  RemoveWeaponClones ();
  var Weapons = Master.GetElementById ('Weapons');
  Weapons.innerHTML = s.join ('');

  // Masquage des images, à cause de la transparence
  var Images = Weapons.getElementsByTagName ('img');
  for (var i = 0; i < Images.length; i++)
    Master.CloneImage (Images [i]);

  return true;
}  // WeaponData



// Supprime les masques sur les images.

function RemoveWeaponClones () {

  var Images = Master.GetElementById ('Weapons').getElementsByTagName ('img');
  for (var i = 0; i < Images.length; i++)
    Master.RemoveImageClone (Images [i]);
  return true;
} // RemoveWeaponClones



// Lecture des donnéess des qrmes que l'on a reçues du serveur.
//  - XmlData est la donnée XML reçue du serveur.
//  - Le résultat sera la liste des armes, avec les données de chaque arme.

function DecodeWeaponData (XmlData) {

  var List = [];

  // Accède au noeud principal
  var MainNode = XmlData.getElementsByTagName ('Weapons');
  if (MainNode.length == 0)
    return Data;
  MainNode = MainNode [0];

  // Decode les données
  var Node = MainNode.firstChild;
  while (Node != null) {
    if (Node.nodeName == 'Weapon') {
      var Weapon = new Object ();
      Weapon.Folder = '';
      Weapon.Required = '-';
      Weapon.MinDamage = '-';
      Weapon.MaxDamage = '-';
      var WNode = Node.firstChild;
      while (WNode != null) {
        Weapon [WNode.nodeName] = OrdinaSoft.Ajax.GetXmlText (WNode);
        WNode = WNode.nextSibling;
      }  // while (WNode != null)
      List [List.length] = Weapon;
    }  // Node.nodeName == 'Weapon'
    Node = Node.nextSibling;
  }  // While (Node != null)

  return List;
} // DecodeWeaponData