/**
 * Détermine si un nœud texte est entièrement composé de blancs
 *
 * @param nod  Un nœud implémentant l'interface |CharacterData| (c'est-à-dire,
 *             un nœud |Text|, |Comment| ou |CDATASection|)
 * @return     Vrai si tout le contenu texte de |nod| est composé de blancs,
 *             faux dans les autres cas.
 */
function is_all_ws( nod )
{
  // Utilisation des fonctionnalités String et RegExp d'ECMA-262 Edition 3
  return !(/[^\t\n\r ]/.test(nod.data));
}


/**
 * Détermine si un nœud devrait être ignoré par les fonctions itérateurs.
 *
 * @param nod  Un objet implémentant l'interface DOM1 |Node|.
 * @return     vrai si le nœud est :
 *                1) un nœud |Text| composé uniquement de blancs
 *                2) un nœud de commentaire |Comment|
 *             et faux dans les autres cas.
 */

function is_ignorable( nod )
{
  return ( nod.nodeType == 8) || // Un nœud de commentaire
         ( (nod.nodeType == 3) && is_all_ws(nod) ); // un nœud texte, uniquement des blancs
}

/**
 * Version de |previousSibling| qui passe les nœuds entièrement constitués
 * de blancs ou les commentaires. (Normalement |previousSibling| est une propriété
 * de tous les nœuds DOM qui donne le nœud du même niveau, qui est lethat is
 * un enfant du même parent, qui se trouve immédiatement avant le nœud 
 * de référence.)
 *
 * @param sib  Le nœud de référence.
 * @return     Soit :
 *               1) Le nœud de même niveau le plus proche de |sib| qui n'est pas
 *                  ignorable d'après |is_ignorable|, ou
 *               2) null si un tel nœud n'existe pas.
 */
function node_before( sib )
{
  while ((sib = sib.previousSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}

/**
 * Version de |nextSibling| qui passe les nœuds qui sont entièrement constitués de
 * blancs ou les commentaires.
 *
 * @param sib  Le nœud de référence.
 * @return     Soit :
 *               1) Le nœud suivant de même niveau le plus proche de |sib| qui n'est pas
 *                  ignorable selon |is_ignorable|, ou
 *               2) null si un tel nœud n'existe pas.
 */
function node_after( sib )
{
  while ((sib = sib.nextSibling)) {
    if (!is_ignorable(sib)) return sib;
  }
  return null;
}

/**
 * Version de |lastChild| qui passe les nœuds qui sont entièrement constitués de
 * blancs ou les commentaires.  (Normalement |lastChild| est une propriété
 * de tous les nœuds DOM qui donne le dernier des nœuds contenus directement
 * dans le nœud de référence.)
 *
 * @param sib  Le nœud de référence.
 * @return     Soit :
 *               1) Le dernier enfant de |sib| qui n'est pas
 *                  ignorable selon |is_ignorable|, ou
 *               2) null si un tel nœud n'existe pas.
 */
function last_child( par )
{
  var res=par.lastChild;
  while (res) {
    if (!is_ignorable(res)) return res;
    res = res.previousSibling;
  }
  return null;
}

/**
 * Version de |firstChild| qui passe les nœuds qui sont entièrement constitués de
 * blancs ou les commentaires.
 *
 * @param sib  Le nœud de référence.
 * @return     Soit :
 *               1) The premier enfant de |sib| qui n'est pas
 *                  ignorable selon |is_ignorable|, ou
 *               2) null si un tel nœud n'existe pas.
 */
function first_child( par )
{
  var res=par.firstChild;
  while (res) {
    if (!is_ignorable(res)) return res;
    res = res.nextSibling;
  }
  return null;
}

/**
 * Version de |data| qui ne renvoie pas les blancs en début et en fin
 * de chaîne et normalise tous les blancs en un seul espace. (Normalement,
 * |data| est une propriété des nœuds textes qui donne le texte du nœud.)
 *
 * @param txt  Le nœud texte dont les données doivent être renvoyées
 * @return     Une chaîne donnant le contenu du nœud texte avec
 *             tous les blancs réduits à un simple espace.
 */
function data_of( txt )
{
  var data = txt.data;
  // Utilisation des fonctionnalités String et RegExp d'ECMA-262 Edition 3
  data = data.replace(/[\t\n\r ]+/g, " ");
  if (data.charAt(0) == " ")
    data = data.substring(1, data.length);
  if (data.charAt(data.length - 1) == " ")
    data = data.substring(0, data.length - 1);
  return data;
}
