//<![CDATA[
  var version = '2.6';
  var HTML='';
  var passes = 2;
  function h(max) { return Math.floor(Math.random()*max) }        // Pour raccourcir un peu.

  // Fonctions de sous-traitance pour code_arrobas_point_JS().
  // N'utiliser que des guillemets " pour délimiter les chaînes ajoutées, les simples sont réservés aux
  // chaînes à brouiller par la suite. C'est pour faciliter la détection.
  function remplace_point() {
    switch(h(6)) {
      case 0 : return '\\x2e';
      case 1 : return '\\u002e';
      case 2 : return "'+String.fromCharCode(46)+'";
      case 3 : return "'+[\".\"][0]+'";
      case 4 : return "'+\".\".charAt(0)+'";
      case 5 : return "'+\".\"+'";
    }
  }

  function remplace_arrobas() {
    switch(h(6)) {
      case 0 : return '\\x40';
      case 1 : return '\\u0040';
      case 2 : return "'+String.fromCharCode(64)+'";
      case 3 : return "'+[\"@\"][0]+'";
      case 4 : return "'+\"@\".charAt(0)+'";
      case 5 : return "'+\"@\"+'";
    }
  }

  // Le paramètre s doit être une chaîne avec ses guillemets.
  invalides = "!$%#*+/?";
  function code_point_JS(s) {
    if (h(7) < 6) {
      var i1 = -1;
      var i2 = s.indexOf('.');                                  // La méthode String.replace() ne permet pas
      var resultat = '';                                        // de remplacer les points de plusieurs façons
      while (i2 >= 0) {                                         // différentes.
        resultat += s.substring(i1+1,i2) + remplace_point();
        i1 = i2;
        i2 = s.indexOf('.', i2+1);
      }
      resultat += s.substr(i1+1);
      return resultat;
    } else {
      i = invalides.charAt(h(invalides.length));
      while (s.indexOf(i) >= 0) i = invalides.charAt(h(invalides.length));
      return s.replace(/\./g,i) + ".replace(/\\"+i+"/g,\".\")";
    }
  }

  // L'entrée dans cette fonction doit être une expression JavaScript valide, donc si c'est une simple
  // chaîne elle doit avoir des apostrophes.
  function code_arrobas_point_JS(s) {
    var s = code_point_JS(s);
    var po = '', pf = '', i;
    if (h(7) < 6) {                                                     // remplacement de l'arrobas sans replace
      var liste = s.split('@');                                         // Détour nécessaire pour que les @
      s = liste[0];                                                     // ne soient pas tous remplacés pareil.
      for (i = 1; i < liste.length; i++) s += remplace_arrobas() + liste[i];  // Avec replace et join ça va pas.
      if (s.indexOf('.replace') >= 0) s = '(' + s + ')';
    } else {
      i = invalides.charAt(h(invalides.length));                        // avec replace
      while (s.indexOf(i) >= 0) i = invalides.charAt(h(invalides.length));
      if (s.indexOf('+') >= 0) { po = '('; pf = ')' };
      return po + s.replace(/@/g,i) + pf + ".replace(/\\"+i+"/g,\"@\")";
    }
    return s;
  }

  function code_arrobas_point_HTML(s) {
    var zero  = '00000';                                   // Quelques zéros
    switch(h(2)) {
      case 0 : s = s.replace(/@/g,'&#'+zero.substr(h(6))+'64;'); break;// On ajoute des 0, 5 maximum à cause d'IE.
      case 1 : s = s.replace(/@/g,'&#x'+zero.substr(h(5)+1)+'40;'); break; // Ici 4 zéros maxi. ( 0 <= h(5) <= 4 )
    }
    switch(h(2)) {
      case 0 : return s.replace(/\./g,'&#'+zero.substr(h(6))+'46;');
      case 1 : return s.replace(/\./g,'&#x'+zero.substr(h(5)+1)+'2e;');
    }
  }

  //-------- bug d'Opera 6 sur les RegExp avec des anti-slashes ; corrigé dans Opera 7 -----------
  // Cette RegExp détecte si une chaîne se termine par un nombre impair d'anti-slashes et une apostrophe.
  if ((navigator.appName == 'Opera') && (parseFloat(navigator.appVersion) <= 6.05)) {
    re_apostrophe = new RegExp("([^\\\\\\])(\\\\\\\\)*\\\\'", 'g');
  } else {
    re_apostrophe = /([^\\])(\\\\)*\\'/g;
  }
  // Prend une chaîne contenant une chaine JS, genre "'coucou l\\'artiste'", et la convertit en chaîne
  // normale, ici "coucou l'artiste" -> suppression des apostrophes de début et de fin, des doubles-anti-slashes
  // et des \'.
  function decortique(s) {
    return s.substr(1,s.length-2).replace(/\\\\/g,'\\').replace(re_apostrophe,"$1'");
  }

  // Codage d'une chaîne (courte) avec String.fromCharCode. La chaîne attendue est entre apostrophes.
  function fromcharcode(s) {
    s = decortique(s);
    var c, n, m, p;
    var liste = [];
    for (var i = 0; i < s.length; i++) {
      c = s.charCodeAt(i);
      switch (h(5)) {
        case 0 : liste[i] = c; break;                  // Code ASCII tel quel.
        case 1 : liste[i] = '0x'+c.toString(16);       // Code ASCII en hexa.
                 break;
        case 2 : n = Math.floor(Math.random()*100);    // Exprime le code ASCII sous forme d'une addition.
                 liste[i] = (c-n) + '+' + n;
                 break;
        case 3 : n = Math.floor(Math.random()*100);    // Exprime le code ASCII sous forme d'une soustraction.
                 liste[i] = (c+n) + '-' + n;
                 break;
        case 4 : n = Math.floor(Math.random()*10);     // Exprime le code ASCII sous la forme n*m+p.
                 m = Math.floor(Math.random()*10);
                 p = c - n*m;
                 liste[i] = n + '*' + m + ((p > 0) ? '+'+p : '-'+(-p));
                 break;
      }
    }
    return 'String.fromCharCode('+liste.join(',')+')';
  }

  // Liste de caractères qu'on peut ajouter au hasard. Ils ne doivent pas être des caractères spéciaux des
  // expressions régulières.
  liste = ' !#%&,-0123456789:<=>ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~';

  function brouille_chaine(s) {                           // Chaîne JS avec des guillemets
    var nb = 0;
    var codage_special = [];                              // Cas spécial : les caractères codés genre \x40.
    var i = 0;
    var j;
    while ((j = s.indexOf('\\',i)) >= 0) {                // Il ne faut pas insérer de caractères entre
      if (s.charAt(j+1) == 'u') {                         // le \ et le 0. Donc on remplace ces caractères
        codage_special[nb] = '\\u'+s.substr(j+2, 4); // temporairement par \u, et on mémorise
        s = s.substr(0,j+2) + s.substr(j+6);                        // leur code.
        nb++;
        i = j + 2;
      }
      else if (s.charAt(j+1) == 'x') {
        codage_special[nb] = '\\x'+s.substr(j+2, 2);
        s = s.substr(0,j+1) + 'u' + s.substr(j+4);
        nb++;
        i = j + 2;
      }
      else i = j + 1;
    }
    var cs = codage_special.join();
    if (s.length < 5) return fromcharcode(s);                    // au moins 3 caractères + les guillemets
    var j = liste.charAt(h(liste.length));
    while ((s.indexOf(j) >= 0)                                   // Choisit un caractère inutilisé dans s
        || (cs.indexOf(j) >= 0)) j = liste.charAt(h(liste.length));    // et dans codage_special.
    var n = Math.min(2+h(4), s.length-2);                        // On insère 2 à 5 fois ce caractère.
    var p;
    for (var k=0; k<n; k++) {
      p = 2 + h(s.length - 2);                                   // position du caractère
      while ((s.charAt(p-1) == '\\') && (p < s.length)) p++;     // Si on est juste après un \, on bouge à droite.
      if (p < s.length) s = s.substr(0,p) + j + s.substr(p);
    }

    k = s.length;
    while (nb > 0) {                                       // On recode les caractères spéciaux.
      nb--;
      k = s.lastIndexOf('\\u', k-1);
      s = s.substr(0,k) + codage_special[nb] + s.substr(k+2);
    }

    // On choisit une façon d'exprimer la chaîne nulle (sans apostrophes, c'est important).
    var nulle;
    switch(h(3)) {
      case 0 : nulle = '""'; break;
      case 1 : nulle = '[""][0]'; break;
      case 2 : nulle = '"'+String.fromCharCode(65+Math.random()*26)+'".substr(1)'; break;
    }

    return s+".replace(/"+j+'/g,'+nulle+')';
  }

  //-------- bug d'Opera sur les RegExp avec des anti-slashes -----------
  // Cette RegExp détecte si une chaîne se termine par un nombre impair d'anti-slashes et une apostrophe.
  if ((navigator.appName == 'Opera') && (parseFloat(navigator.appVersion) <= 6.05)) {
    re_chaine = new RegExp("[^\\\\\\](\\\\\\\\)*\\\\$");
  } else {
    re_chaine = /[^\\](\\\\)*\\$/;
  }

  // La chaîne d'entrée s représente une expression JavaScript valide, en principe composée de plusieurs
  // chaînes entre apostrophes, séparées par des instructions.
  // Appelle la fonction "brouille_chaine", qui insère des caractères aléatoires.
  function brouille_JS(s) {
    var liste = s.split("'");               // On sépare au niveau des apostrophes.
    var ch;
    var brouillee = '';
    var i = 0;
    while (i < liste.length-1) {
      ch = "'";
      brouillee += liste[i];                                    // On ne code pas ce qu'il y a entre les chaînes.
      i++;
      while ((' '+liste[i]).search(re_chaine) >= 0) ch += liste[i++]+"'"; // On raboute quand une ' est précédée d'un
      ch += liste[i++] + "'";                                   // nombre impair d'anti-slashes.
      brouillee += brouille_chaine(ch);
    }
    return brouillee + liste[liste.length-1];                  // On ne code pas ce qu'il y a après les chaînes.
  }

  //========== Transforme du texte en une chaîne JavaScript. =========
  function to_JS_string(s) {
    return "'" + s.replace(/\\/g, '\\\\').replace(/[\n\r]/g,' ').replace(/'/g,"\\'") + "'";
  }

  //========== Mélange les caractères d'une chaîne ==========
  function scramble(s) {
    var t = s.split('');
    var r = '';
    var c;
    while(t.length) {
      c = Math.floor(Math.random() * t.length);
      r += t.splice(c, 1);
    }
    return r;
  }

  //========== Différentes fonctions de chiffrement du code JavaScript
  // table normale base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  var base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*-';
  var nb_retournements = 0;
  var nb_base64 = 0;
  function chiffre(s, force) {
    // Cas du ROT-n : on teste la présence de caractères > 126 ou < 32, qui ne passent pas.
    var num_chiffre;
    if(typeof(force) == 'undefined') {
      do (num_chiffre = h(5));
      while (((nb_retournements > 0) && (num_chiffre == 0)) ||   // 1 retournement maximum (ça refait du clair)
             ((passes <= 2)          && (num_chiffre == 4)) ||   // hexa seulement pour les fous
             ((nb_base64        > 0) && (num_chiffre == 3)));    // et 1 base64 maximum (question de longueur)
    } else {
      num_chiffre = force;
    }
    switch(num_chiffre) {
      // Retournement par blocs de longueur aléatoire. (97 octets + la chaîne codée)
      case 0 : nb_retournements++;
               var taille = 20 + h(31);         // blocs de 20 à 50 caractères.
               var code = '';
               for(i = 0; i < s.length; i += taille) code += s.substr(i,taille).split("").reverse().join("");
               return 'var s="' + code.replace(/\\/g,'\\\\').replace(/"/g,'\\"') +'";d="";'
                 + 'for(var i=0;i<s.length;i+='+taille+')d+=s.substr(i,'+taille+').split("").reverse().join("");eval(d)';
      // Permutation de blocs de 1 à 3 caractères. (46 octets + la chaîne codée)
      case 1 : var n1 = 1 + h(3);          // nombre de caractères du 1er bloc
               var n2 = 1 + h(3);          // nombre de caractères du 2ème bloc
               var n = n1 + n2;
               var padding = s.length % n;
               s = '000000'.substr(0, padding) + s;
               re = new RegExp('(.{'+n1+'})(.{'+n2+'})', 'g');
               var re1 = '...'.substr(0, n1);
               var re2 = '...'.substr(0, n2);
               var code = 'eval(' + to_JS_string(s.replace(re,'$2$1')) + '.replace(/('+re2+')('+re1+')/g,"$2$1")';
               if(padding) code += '.substr('+padding+')';
               code += ')';
               return code;
      // ROT-n (90 octets + la chaîne codée)
      case 2 : var n = 1 + h(26);       // ROT-1 à ROT-26 sur les caractères 32 à 126.
               s2 = '';
               for (var i = 0; i < s.length; i++)          // Conversion des caractères > 126 ou < 32
                 if ((s.charCodeAt(i) > 126) || (s.charCodeAt(i) < 32)) {
                   s2 += '\\x' + s.charCodeAt(i).toString(16);
                 } else s2 += s.charAt(i);
               s = s2;
               var co = '';
               for (var i=0; i<s.length; i++) co += String.fromCharCode((s.charCodeAt(i)-32+n)%95 + 32);
               co = co.replace(/\\/g,'\\\\').replace(/\'/g,"\\'").replace(/\"/g,'\\"');
               return 'var d="";for(var i=0;i<'+s.length+';i++)d+=String.fromCharCode(("'+co+'".charCodeAt(i)+'+(63-n)+')%95+32);eval(d)';
      // Base64 (avec une table différente à chaque fois) (4/3 de la chaîne + 223 octets !)
      case 3 : nb_base64++;
               var bits = 0;
               var l = s.length;
               var txt = '';                              // texte codé en base64
               var padding = (3-(s.length % 3)) % 3;      // Cas où la taille ne serait pas multiple de 3.
               s += '  '.substr(0,padding);
               base64 = scramble(base64);
               for (var i = 0; i < s.length; i += 3) {
                 bits = (s.charCodeAt(i) << 16) | (s.charCodeAt(i+1) << 8) | s.charCodeAt(i+2);
                 txt += base64.charAt((bits >>> 18) & 63) + base64.charAt((bits >>> 12) & 63) +
                        base64.charAt((bits >>> 6)  & 63) + base64.charAt((bits >>> 0)  & 63); 
               }
               if (padding) txt = txt.substr(0, txt.length-padding) + (base64.charAt(0)+base64.charAt(0)).substr(0,padding); // Complète avec des #
               return 'var t="'+base64+'",d="",b,s="'+txt+'";'
                    + 'for(var i=0;i<'+txt.length+';i+=4){b=(t.indexOf(s.charAt(i))<<18)|'
                    + '(t.indexOf(s.charAt(i+1))<<12)|(t.indexOf(s.charAt(i+2))<<6)|t.indexOf(s.charAt(i+3));'
                    + 'd+=String.fromCharCode(b>>>16,(b>>>8)&255,b&255)};eval(d.substr(0,'+l+'))';
      // Hexadécimal
      // Codage +/- abandonné car trop long : il multiplie au moins par 2 la taille du code entré.
      case 4 : var c, co = '';
               for (var i=0; i<s.length; i++) {
                 c = s.charCodeAt(i).toString(16);
                 if (c.length == 1) c = '0' + c;
                 co += c;
               }
               return 'var d="";for(var i=0;i<'+co.length+';i+=2)d+=String.fromCharCode(parseInt("'+co+'".substr(i,2),16));eval(d)';
    }
  }
  //============ Fabrique une fausse adresse en .com
  function fausse_adresse() {
    if(typeof(caspam) != "undefined") return '';
    var fausse = '';
    for (var i = 0; i < 4+h(5); i++) fausse += String.fromCharCode(97+h(26));
    fausse += '@';
    for (i = 0; i < 4+h(5); i++) fausse += String.fromCharCode(97+h(26));
    fausse += '.com';
    return '<a href="mailto:'+fausse+'"> </a>';
  }

  //============ Différentes façons de créér un lien en JavaScript
  function cree_lien_JS(a, t) {
    // éventuellement, dans le sujet on filtre les apostrophes, les guillemets et les antislashes.
    // Les guillemets sont interdits à cause qu'ils sont utilisés dans la balise href="", quant à
    // l'apostrophe c'est parce qu'après ça complique sévèrement le brouillage (l'apostrophe sert
    // de délimiteur de chaînes, et c'est plus chiant s'il y en a aussi dans les chaînes).
    var sujet = (document.forms['frm'].sujet.value) ? '?Subject='+document.forms['frm'].sujet.value.replace(/'/g,'%27').replace(/"/g,'%22').replace(/\\/g, '%5c') : '';
    var css   = (document.forms['frm'].css.value)   ? ' class="'+document.forms['frm'].css.value+'"' : '';
    var adresse = code_arrobas_point_JS("'"+a+"'");
    return '\'<a href="" onmouseover="this.href=\\\'mailto:\'+' + adresse + '+\'' + sujet
           +'\\\'" onmouseout="this.href=\\\'\\\'"' + css + '>' + code_arrobas_point_HTML(t) + '</a>\'';
    /*
    return '\'<a href="mailto:\'+' + code_arrobas_point_JS("'"+a+"'") + '+\'' + sujet + '"' +
               css + '>' + code_arrobas_point_HTML(t) + "<"+"/a>'";
    */
  }

  //=========== Affiche l'aperçu dans une petite fenêtre
  var fenetre;
  function apercu(area) {
    fenetre = window.open ('','','width=200,height=100,resizable=yes,'
		      + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    fenetre.document.write('<HT'+'ML><BO'+'DY><TABLE WIDTH="100%" HEIGHT="100%"><TR><TD class="centre" VALIGN=MIDDLE>'+area.value+'<'+'/TD><'+'/TR><'+'/TABLE><'+'/BODY><'+'/HTML>');
    fenetre.document.close();
  }

  //========= Réalise le codage
  var javascript = '', javascript2 = '';
  function xhtml_embed(js) {
    if(!js) return '';
    return '<scri'+'pt type="text/javascript">\n//<![CD'+'ATA[\n' + js + '\n//]'+']>\n</sc'+'ript>' +
           '\n' + fausse_adresse();
  }
  function html_embed(js) {
    if(!js) return '';
    return '<scri'+'pt type="text/javascript" language="javascript">\n<!--\n' + js + '\n//-->\n</sc'+'ript>' +
           '\n' + fausse_adresse();
  }
  function is_xhtml() {
    return document.forms['frm'].w3 ?
             document.forms['frm'].w3[1].checked : (document.forms['frm'].w3hid.value=="xhtml");
  }
  function embed(js) {
    if (is_xhtml()) return xhtml_embed(js);
    else return html_embed(js);
  }
  function code_moi_tout_ca(s) {
    var code = 'document.write('+(brouille_JS(s)) + ')';
    for(var i=0; i<passes-1; i++) code = chiffre(code);
    // La dernière passe se fait obligatoirement en ROT-n
    code = chiffre(code, 2);
    return code;
  }

  //========= Déclenche la création du code HTML ou du script
  function encode(a, t) {                                          // a est l'adresse, t est le texte du lien
    nb_retournements = 0;
    nb_base64 = 0;
    if(document.forms['frm'].lien && document.forms['frm'].lien[1].checked) {
      var uri = document.forms['frm'].uri.value;
      if(!uri) { alert("Il faut préciser le chemin de l'image."); return '' }
      var ext = uri.substr(uri.length-4);                          // substr(-4) marche pas sous IE...
      if((ext != '.gif') && (ext != '.jpg') && (ext != '.png')) {
        alert("Ce n'est pas une image gif, jpg ou png !");
        return '';
      }
      var l = document.forms['frm'].l.value;
      var h = document.forms['frm'].h.value;
      if(!l || !h) alert("L'affichage sera meilleur si les dimensions de l'image sont précisées.");
      t = '<img src="'+uri+'" width="'+l+'" height="'+h+'" alt="email"';
      if (is_xhtml()) t += ' style="border-style:none" />';
                 else t += ' border="0">';
    }
    var source;
    if(t.indexOf('\\') >= 0) {
      alert("Pas d'anti-slash dans le texte du lien svp.");
      return '';
    }
    if((t.indexOf('@') >= 0) && document.forms['frm'].sujet.value) {
      alert("Le texte de votre lien comporte @, et vous avez précisé un sujet.\nUn bug d'Internet Explorer 6 " +
            "rendra l'affichage bizarre, mais dans les autres navigateurs le lien apparaîtra normalement.\n" +
            "Pour éviter ça, mettez un texte de lien sans @, du genre \"contact\", ou ne mettez pas de sujet " +
            "au mail.");
    }
    t = t.replace(/'/g, "\\'");
    if (t) source = cree_lien_JS(a, t);                     // lien
    else source = code_arrobas_point_JS(to_JS_string(a));   // texte sans lien
    javascript = code_moi_tout_ca(source);
    return embed(javascript);
  }

  //========= Déclenche la création du script
  function encode2(source) {                                      // source : code HTML à chiffrer.
    nb_retournements = 0;
    nb_base64 = 0;
    var s = source.toLowerCase();
    if(s.indexOf('<'+'meta ') >= 0) {
      alert ('On ne peut pas coder les balises <'+'meta> avec des scripts !');
      return '';
    }
    if(s.indexOf('<'+'link ') >= 0) {
      alert ('On ne peut pas coder les balises <'+'link> avec des scripts, ni d\'ailleurs aucune balise de la section <'+'head> !');
      return '';
    }
    if(s.indexOf('<'+'script') >= 0) {
      alert ('Recoder un script ne marche que rarement, et donne souvent des résultats curieux !\nEssayez l\'aperçu pour voir.');
      // On essaye quand-même, en enlevant les balises de commentaires.
      source = source.replace(/<!--[\n\r]+/, '').replace(/[\n\r]+\/\/-->/, '');
      source = source.replace(/\/\/<!\[CDATA\[[\n\r]+/, '').replace(/[\n\r]+\/\/\]\]>/, '');
    }
    if((s.indexOf('<a ') >= 0) && (s.indexOf('mailto:') >= 0)) {
      // Corrige les liens href sans guillemets
      source = source.replace(/href=([^"'][^ >]+[^"'>])/ig, 'href="$1"');
      // Détecte un lien href
      var res = source.match(/href=['"]([^'"]*)['"]/i);
      if(res[1].indexOf('mailto:') == 0) {
        // Si c'est une adresse mailto:
        source = source.replace(/href=["']([^'"]+)["']/i, 'href=""');
        // On supprime le lien href,
        var over = 'onmouseover="this.href=\'' + res[1] + '\';';
        var out  = 'onmouseout="this.href=\'\';';
        // on crée ou on complète le onmouseover
        if(source.search(/onmouseover="/i) > 0) source = source.replace(/onmouseover="/i, over);
          else source = source.replace(/href=""/i, 'href="" '+over+'"');
        // et le onmouseout
        if(source.search(/onmouseout="/i) > 0) source = source.replace(/onmouseout="/i, out);
          else source = source.replace(/href=""/i, 'href="" '+out+'"');
      }
    }
    // Ensuite seulement on code.
    javascript2 = code_moi_tout_ca(code_arrobas_point_JS(to_JS_string(source)));
    return embed(javascript2);
  }


  //========= Affiche une aide sur le PHP.
  var mafenetre;
  function aide_php() {
    mafenetre = window.open('','','width=500,height=300,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html =  '<'+'BODY BGCOLOR="#FAFAD2">\n<H2>Et avec PHP, ASP etc ?<'+'/H2>\n';
    html += '<P STYLE="font-style:italic; padding-left:20px; text-align:justify">Mes pages sont en PHP. ';
    html += 'Certaines utilisent la fonction <FONT COLOR="#0000ff">mail()<'+'/FONT> de php et donc comportent des ';
    html += 'adresses e-mail en clair dans des variables, par exemple : <BR>\n';
    html += '<FONT COLOR="#0000ff">$email="moi@ic'+'i.fr";<'+'/FONT><BR>\n';
    html += 'Comment coder dans ce cas?<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Inutile de coder ces variables, puisque le code PHP est ';
    html += 'interpr&eacute;t&eacute; sur le serveur, et que seul le r&eacute;sultat est envoy&eacute; au client. Vous pouvez ';
    html += 'vérifier en consultant votre page dans un navigateur et en regardant le code source.<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Par contre, si le script PHP renvoie au client des adresses, ';
    html += 'elles devront &ecirc;tre cod&eacute;es au m&ecirc;me titre que n\'importe quelle portion de HTML.<'+'/P>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur les formulaires.
  function aide_formulaires() {
    mafenetre = window.open('','','width=550,height=250,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html  = '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>';
    html += 'Et dans les formulaires ?<'+'/h2>\n';
    html += '<p style="text-align:justify">Certains formulaires du type <I>formmail.pl<'+'/I> ';
    html += 'utilisent des &eacute;l&eacute;ments cach&eacute;s pour stocker des adresses e-mail :<'+'/P>\n';
    html += '<p style="padding-left:10px; color:#0000ff">\n';
    html += '&lt;form method="POST" action="http://www.monsite.fr/cgi-bin/formmail.pl"><BR>\n';
    html += '&lt;input type="hidden" name="recipient" value="<FONT COLOR="#008000">moi@'+'ici.fr<'+'/font>"><'+'/P>\n';
    html += '<p style="text-align:justify">Ici l\'adresse, bien que n\'&eacute;tant pas affich&eacute;e ';
    html += '&agrave; l\'&eacute;cran, appara&icirc;t en clair dans le code HTML, donc est visible pour un robot. ';
    html += 'C\'est la balise enti&egrave;re <fo'+'nt color="#0000ff">&lt;input...&gt;<'+'/font> qu\'il ';
    html += 'faut coder, et pas seulement l\'adresse. &Ccedil;a se fait en ';
    html += 'en utilisant le g&eacute;n&eacute;rateur du bas (<b>Codage de n\'importe quel bout d\'html</b>).';
    html += '</p><'+'/body>\n';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur les formulaires.
  function aide_images() {
    mafenetre = window.open('','','width=650,height=200,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html  = '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>';
    html += 'Et avec des images ?<'+'/h2>\n';
    html += '<p style="text-align:justify">On peut utiliser une image comme lien cliquable sur une adresse. ';
    html += 'En HTML, cela donne quelque chose du style :<'+'/p>\n';
    html += '<p style="padding-left:10px; color:#0000ff">\n';
    html += '&lt;a href=&quot;<font color="#008000">mailto:moi'+'@ici.fr</font>&quot;&gt;';
    html += '&lt;img src=&quot;/images/monimage.gif&quot width=&quot;30&quot; height=&quot;20&quot;';
    html += '&gt;&lt;/a&gt;<'+'/p>\n';
    html += '<p style="text-align:justify">C\'est l\'ensemble qu\'il faut coder, de <font color="#0000ff">';
    html += '&lt;a href...</font> &agrave <font color="#0000ff">&lt;/a&gt;</font>, en ';
    html += 'utilisant la partie du bas du g&eacute;n&eacute;rateur (<b>Codage de n\'importe quel bout ';
    html += 'd\'html</b>).</p><'+'/body>\n';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur les formulaires.
  function aide_meta() {
    mafenetre = window.open('','','width=500,height=300,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html = '<he'+'ad><scr'+'ipt type="text/javascript" src="external_links.js"></scr'+'ipt></he'+'ad>\n';
    html += '<'+'BODY BGCOLOR="#FAFAD2">\n<H2>Et dans les balises META ?<'+'/H2>\n';
    html += '<P STYLE="text-align:justify">Ces balises, qui contiennent souvent des adresses e-mail, ne peuvent pas &ecirc;tre &eacute;crites &agrave ';
    html += 'la vol&eacute;e par des scripts, puisqu\'elles sont plac&eacute;es dans la section &lt;HEAD> et pas dans le ';
    html += 'corps du document.<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Elles ne peuvent donc pas &ecirc;tre cod&eacute;es ';
    html += 'efficacement. Seul le codage ASCII est utilisable, et il n\'est pas tr&egrave;s solide. ';
    html += 'Le mieux est de supprimer les balises META contenant des adresses e-mail, quand c\'est possible.<'+'/P>';
    html += '<P STYLE="text-align:justify"><FONT COLOR="#0000ff">aspirine.org<'+'/FONT> met &agrave; votre disposition un robot qui extrait ';
    html += 'les adresses e-mail sur une page. Il peut casser certains codages simples :<'+'/P>\n';
    html += '<CENTER><A href="http://aspirine.org/cgi-bin/trouvemail.pl" rel="external">Ce robot est ici.<'+'/A>';
    html += '<'+'/CENTER><'+'/BODY>\n';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur le mail.
  function aide_mail() {
    mafenetre = window.open('','','width=500,height=150,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html =  '<'+'BODY BGCOLOR="#FAFAD2">\n<H2>Et dans le courrier &eacute;lectronique ?<'+'/H2>\n';
    html += '<P STYLE="text-align:justify">Le courrier &eacute;lectronique n\'a aucun int&eacute;r&ecirc;t ';
    html += 'ici, puisqu\'il est priv&eacute;. Les robots des spammeux n\'ont pas acc&egrave;s &agrave; vos ';
    html += 'courriers et ne peuvent pas r&eacute;cup&eacute;rer d\'adresses dedans. Il n\'y a donc rien &agrave; coder.<'+'/P>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur les newsgroups.
  function aide_news() {
    mafenetre = window.open('','','width=500,height=300,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html = '<he'+'ad><scr'+'ipt type="text/javascript" src="external_links.js"></scr'+'ipt></he'+'ad>\n';
    html += '<'+'BODY BGCOLOR="#FAFAD2">\n<H2>Et dans les groupes de discussion ?<'+'/H2>\n';
    html += '<P STYLE="text-align:justify">Les groupes de discussion sont l\'autre source majeure ';
    html += 'd\'adresses pour les spammeux : les messages post&eacute;s sont publics et contiennent ';
    html += 'la plupart du temps l\'adresse de l\'&eacute;metteur <B>dans les en-t&ecirc;tes<'+'/B>. Le probl&egrave;me du codage sur les ';
    html += 'newsgroups est que les messages sont en texte brut, ce qui rend impossible ';
    html += 'le codage/d&eacute;codage &agrave; la vol&eacute;e. On doit donc ruser.<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Il y a tout d\'abord l\'astuce courante qui consiste &agrave; &eacute;crire par exemple ';
    html += '<FONT COLOR="#008000"><NOBR>moi-nospam@ic'+'i.fr<'+'/NOBR><'+'/FONT> au lien de <FONT COLOR="#008000">moi'+'@ici.fr<'+'/FONT>.\n';
    html += '<B>Ce n\'est pas suffisant<'+'/B>, car certains logiciels d\'extraction sont capables de filtrer ';
    html += 'les ajouts les plus courants, dont <A href="nospam.txt" rel="external" STYLE="text-decoration:underline; color:#0000ff">voici une liste<'+'/A>.<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Variante efficace : utiliser un ajout pas courant et le dire, par exemple :<BR>';
    html += '<I><FONT COLOR="#008000">&Eacute;crire &agrave; l\'adresse mois@ici.fr en enlevant le "s".<'+'/FONT><'+'/I><BR>\n';
    html += 'C\'est probablement <B>le meilleur codage possible<'+'/B>, puisque pour trouver la vraie adresse, il ';
    html += 'faut comprendre le sens de la phrase, ce qui est hors de port&eacute;e des robots.<'+'/P>\n';
    html += '<P STYLE="text-align:justify">On peut aussi utiliser le <A href="rot13.html" rel="external">codage ROT-13<'+'/A>, tr&egrave;s courant ';
    html += 'sur Usenet, au point que certains logiciels de lecture le proposent en option :<BR>';
    html += '<FONT COLOR=#008000>Ma signature - zbv@vpv.se - (&agrave; d&eacute;coder en ROT-13)<'+'/FONT><BR>';
    html += 'Si votre lecteur de news ne propose pas ce codage, vous ';
    html += 'pouvez utiliser notre <a href="rot13.html" rel="external">page sp&eacute;ciale ROT-13<'+'/A>.<'+'/P>\n';
    html += '<'+'/BODY>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur les adresses cachées.
  function aide_hidden() {
    mafenetre = window.open('','','width=500,height=250,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html = '<he'+'ad><scr'+'ipt type="text/javascript" src="external_links.js"></scr'+'ipt></he'+'ad>\n';
    html += '<bod'+'y BGCOLOR=#FAFAD2>\n<H2>Attention aux adresses cach&eacute;es.<'+'/H2>\n';
    html += '<P STYLE="text-align:justify">Il peut y avoir des adresses en clair dans une page HTML ';
    html += 'qui ne sont pas affich&eacute;es. Penser en particulier aux donn&eacute;es des formulaires, ';
    html += 'aux balises META, aux commentaires, aux scripts, aux objets encapsul&eacute;s...<'+'/P>\n';
    html += '<P STYLE="text-align:justify">Le seul moyen de savoir ce qui est accessible aux robots des ';
    html += 'spammeux est d\'inspecter de pr&egrave;s le code source HTML, en cherchant les @.<'+'/P>\n';
    html += '<p style="text-align:justify"><a href="http://aspirine.org/cgi-bin/trouvemail.pl" rel="external">Utilisez ';
    html += 'notre robot en ligne extracteur d\'adresses pour v&eacute;rifier votre page<'+'/a>.<'+'/p><'+'/body>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur l'utilisation de feuilles de style.
  function aide_css() {
    mafenetre = window.open('','','width=400,height=150,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html  = '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>Utilisation ';
    html += 'd\'une feuille de style.<'+'/h2>\n';
    html += '<p style="text-align:justify">Indiquer dans cette case juste le nom du style choisi pour le lien. ';
    html += 'Ce style doit &eacute;videmment &ecirc;tre d&eacute;clar&eacute; dans votre feuille de style.<';
    html += '/p><p style="text-align:justify">Si ceci est du chinois pour vous (et que comme moi vous ';
    html += 'ne comprenez rien au chinois), laissez la case vide.</p></'+'body>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur le double-encodage.
  function aide_2passes() {
    mafenetre = window.open('','','width=500,height=220,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html  = '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>Peut-on ';
    html += 'faire 2 codages successifs ?<'+'/h2>\n<form>\n';
    html += '<p style="text-align:justify">Non. D\'une part &ccedil;a risque fortement de ne pas marcher ';
    html += '(essayer l\'aper&ccedil;u pour savoir), d\'autre part le codage se fait déjà sur <b>'+passes+'</b> ';
    html += 'couches (en plus du brouillage de base). </p><p>Si vous &ecirc;tes parano&iuml;aque, ou joueur, ';
    html += 'vous pouvez d&eacute;cider que le ';
    html += 'codage se fera sur <select name="nb"><option>2</option><option>3</option><option>4</option>';
    html += '<option>5</option><option>6</option><option>8</option><option>10</option></select> couches. Mais ';
    html += 'attention au temps de calcul, aussi bien pour le codage que pour l\'affichage de la page.</p>';
    html += '<p style="text-align:center"><input type="button" value="ok" ';
    html += 'onclick="ch_passes(this.form.nb[this.form.nb.selectedIndex].text); window.close()" /></p></form></'+'body>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
    mafenetre.ch_passes = change_passes;
  }
  function change_passes(n) { passes = n }
  //========= Affiche une aide sur le fonctionnement hors-connexion.
  function aide_horsconnexion() {
    mafenetre = window.open('','','width=500,height=220,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html  = '<he'+'ad><scr'+'ipt type="text/javascript" src="external_links.js"></scr'+'ipt></he'+'ad>\n';
    html += '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>&Ccedil;a ';
    html += 'marche hors connexion ?<'+'/h2>\n<form>\n';
    html += '<p style="text-align:justify">Oui et c\'est l\'un des avantages de cet encodeur. Quand vous ';
    html += 'entrez votre adresse pour la coder, elle n\'est pas transmise &agrave; notre serveur, et nous ';
    html += 'ne pouvons (ni ne voulons) pas la r&eacute;colter.</p>';
    html += '<p style="text-align:justify">Nous vous conseillons d\'ailleurs ';
    html += 'd\'enregistrer cette page sur votre disque dur pour l\'utiliser hors ligne.</p>';
    html += '<p style="text-align:justify">Voici son adresse d\'origine, si vous voulez v&eacute;rifier ';
    html += 'les &eacute;ventuelles mises &agrave; jour :<br />';
    html += '<a href="http://aspirine.org/emailcode.php" rel="external">http://aspirine.org/emailcode.php</a>';
    html += '</p></'+'body>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
  //========= Affiche une aide sur le fonctionnement hors-connexion.
  function aide_chemin() {
    mafenetre = window.open('','','width=500,height=200,resizable=yes,'
                + 'scrollbars=yes,toolbar=no,directories=no,location=no,status=no,menubar=no');
    html = '<bod'+'y style="background-color:#fafad2; font-family:Verdana; font-size:smaller">\n<h2>Chemin ';
    html += 'de l\'image<'+'/h2>\n<form>\n';
    html += '<p style="text-align:justify">Le chemin entr&eacute; doit &ecirc;tre relatif &agrave; la page ';
    html += 'o&ugrave; il sera plac&eacute;, tel qu\'il serait dans une balise <span style="color:#0000ff">&lt;';
    html += 'img&gt;</span>. C\'est le chemin pour acc&eacute;der &agrave; l\'image sur votre site, pas sur ';
    html += 'votre disque dur.</p>';
    html += '<p>Bien entendu, ce chemin sera valide sur <b>votre</b> site, pas sur le n&ocirc;tre, donc ';
    html += 'l\'aper&ccedil;u ne fonctionnera pas.';
    html += '</p></'+'body>';
    mafenetre.document.write(html);
    mafenetre.document.close(html);
  }
//]]>