Utilisateur:Dr Brains/MessageWatchlist.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
{{Utilisateur:Dr Brains/onglets}}

Notification de modification de la liste de suivi
* Code original : [[:en:User:Ais523/watchlistnotifier.js]]

== Fonctions ==

=== Sur toutes les pages ===

Affiche en haut de la page la dernière modification d'une page de la liste de suivi<ref>Si il n'y a pas eu de modification depuis la dernière consultation de la liste de suivi, il n'y a pas de notification</ref>
* Utilise une requête Ajax via l'[http://fr.wikipedia.org/w/api.php API] pour connaître la dernière modification<ref>Les pages modifiées par l'utilisateur sont exclues de la requête</ref>
* La requête est renouvelée automatiquement au bout d'un temps déterminé (10 secondes par défaut)
* Les liens de la notification procurent une prévisualisation Ajax vers la page demandée.

=== Dans la liste de suivi ===

Affiche en gras les modifications faites depuis la dernière consultation (sauvegarde par cookie)

== Installation ==

Ce script est adapté pour tous les skins et tous les navigateurs. Si vous rencontrez des problèmes ou avez des suggestions pour l'améliorer, merci de me laisser un message en utilisant le lien en haut à droite de cette page.

Pour bénéficier de cette fonction, ajoutez le code suivant à votre page [[Spécial:Mypage/monobook.js|Utilisateur:<VotrePseudo>/monobook.js]] (ou autre suivant l'habillage sélectionné dans vos [[Spécial:Préférences|Préférences]])

<syntaxhighlight lang=javascript>
importScript('Utilisateur:Dr Brains/MessageWatchlist.js');
</syntaxhighlight>

== Personnalisation ==
Les variables situées dans la partie personnalisable du [[#CODE SOURCE|code source]] sont personnalisables. Pour les modifier, il suffit de les recopier (sans la déclaration '''<tt>var</tt>''') et de leur attribuer la valeur souhaitée '''après''' l'appel du script.

=== Paramètres ===
Deux variables sont personnalisables : 
# la période de mise à jour de la notification<ref>exprimée en secondes, 10 secondes par défaut</ref>
# la taille de la fenêtre de prévisualisation<ref>exprimée en pixels, 500 pixels par défaut</ref>

Si vous souhaitez les modifier, vous pouvez ajuster la variable correspondante lors de l'installation.

==== Exemple ====
<syntaxhighlight lang=javascript>
importScript('Utilisateur:Dr Brains/MessageWatchlist.js');

$(function(){
   MessageWatchlistReload = 60; 
   MessageWatchlistHeight = 800; 
});
</syntaxhighlight>

=== Textes ===

Les différents textes sont personnalisables.

Il est également possible de modifier le format d'affichage de la notification. <br/>
Voici à quoi correspondent les "variables" précédées d'un signe '''<tt>$</tt>''' <ref>Toutes sont facultatives. Si la variable n'apparaît pas dans le format, l'information correspondante ne sera pas donnée</ref> :
* $01 : Lien vers la liste de suivi
* $02 : Heure de la modification (UTC)
* $03 : Lien de prévisualisation de la page
* $04 : Lien de prévisualisation de la page de diff
* $05 : Lien de prévisualisation de la page d'historique
* $06 : Lien de prévisualisation vers la page d'édition
* $07 : Lien de prévisualisation de fin de suivi
* $08 : Lien de prévisualisation de la page personnelle de l'utilisateur
* $09 : Lien de prévisualisation de la page de discussion de l'utilisateur
* $10 : Lien de prévisualisation des contributions de l'utilisateur
* $11 : Résumé de modification

Tous types d'élément [[HTML]] sont autorisés ({{Balise|b}}, {{Balise|i}}, {{Balise|u}}, {{Balise|s}}, {{Balise|br/}}, {{Balise|span}}, {{Balise|div}}, etc...). <br/>
Seules les apostrophes peuvent poser problème : elles doivent être précédées d'un signe '''{{Coloré|red|<tt><nowiki>\</nowiki></tt>}}''' ({{Touche|Alt Gr}} + {{Touche|8}}) afin d'être considérées comme du texte et non comme la fin de la variable.

==== Exemple ====
<syntaxhighlight lang=javascript>
importScript('Utilisateur:Dr Brains/MessageWatchlist.js');
$(function(){
   MessageWatchlist_NotificationFormat = '<b>Dernière modification de la $01</b><br/>$03 ($04|$05|$06|$07) modifiée le $02 par l\'utilisateur $08 ($09|$10) : "$11"';
   MessageWatchlist_TalkText = 'Discussion'; 
   MessageWatchlist_ContribText = 'Contributions';
}
</syntaxhighlight>

== Notes ==
<references />

== CODE SOURCE ==

{{Projet:JavaScript/Script}} 
{{Boîte déroulante début|titre=Code source}}<!-- */
//--><syntaxhighlight lang=javascript>
//<pre><nowiki>
 
////////////////////////////////////////// PARTIE PERSONNALISABLE ///////////////////////////////////////////////////////

// ##### PARAMÈTRES ##### //

//// Nombre de secondes entre deux mises à jour
var MessageWatchlistReload = 10; 

//// Hauteur de la fenêtre de prévisualisation (en pixels)
var MessageWatchlistHeight = 500; 

// ##### TEXTES ##### //

//// Notification de changement
// Format
var MessageWatchlist_NotificationFormat = '<b>Dernière modification de la $01</b> : $02 | <b>Détails :</b> "$03" ($04|$05|$06|$07), $log par $08 ($09|$10) | <b>Résumé : </b>"$11"';
// Textes

var MessageWatchlist_LogFormat = {
 "default" : "modification",
 "edit" : "modification",
 "new" : "création",
 "move_move" : "renommage",
 "move_move_redir" : "renommage par-dessus une redirection",
 "protect_protect" : "protection",
 "protect_modify" : "protection modifiée",
 "protect_unprotect" : "protection supprimée",
 "delete_delete" : "suppression",
 "delete_revision" : "suppression de révision",
 "delete_restore" : "restaurtion",
 "massmessage_send" : "envoi de message de masse",
 "block_block" : "blocage",
 "block_unblock" : "déblocage",
}


var MessageWatchlist_WatchlistTitle ='Voir la liste de suivi';
var MessageWatchlist_WatchlistText ='liste de suivi';
var MessageWatchlist_PageTitle ='Voir la page';
var MessageWatchlist_DiffTitle ='Voir la différence de version';
var MessageWatchlist_DiffText ='diff';
var MessageWatchlist_HistTitle ='Voir l\'historique de cette page';
var MessageWatchlist_HistText ='hist';
var MessageWatchlist_EditTitle ='Modifier cette page';
var MessageWatchlist_EditText ='edit';
var MessageWatchlist_StopTitle ='Ne plus suivre cette page';
var MessageWatchlist_StopText ='stop';
var MessageWatchlist_UserTitle ='Voir la page personnelle de cet utilisateur';
var MessageWatchlist_TalkTitle ='Discuter avec cet utilisateur';
var MessageWatchlist_TalkText ='d';
var MessageWatchlist_ContribTitle ='Voir les contributions de cet utilisateur';
var MessageWatchlist_ContribText ='c';
var MessageWatchlist_BlockTitle ='Bloquer cet utilisateur';
var MessageWatchlist_BlockText ='b';

var MessageWatchlist_AlertEdit = 'Il y a déjà une fenêtre de modification ouverte.\nVous devez la fermer pour pouvoir en ouvrir une autre.';

//// Fenêtre de prévisualisation
var MessageWatchlist_LoadingText = 'Chargement';
var MessageWatchlist_CloseWindowTitle ='Cliquer pour fermer la fenêtre de prévisualisation';
var MessageWatchlist_CloseWindowText ='Fermer';
var MessageWatchlist_PreviewSizePlusTitle = 'Cliquer pour augmenter la taille de la fenêtre de prévisualisation';
var MessageWatchlist_PreviewSizePlusText = '▼';
var MessageWatchlist_PreviewSizeMinusTitle = 'Cliquer pour diminuer la taille de la fenêtre de prévisualisation';
var MessageWatchlist_PreviewSizeMinusText = '▲';
var MessageWatchlist_DirectLinkText ='Lien direct';
// Boutons Boîtes déroulantes/Palettes de navigation
var MessageWatchlist_Enrouler = '[enrouler]';
var MessageWatchlist_Derouler = '[dérouler]';
// Boutons Sommaire
var MessageWatchlist_EnroulerBis = '[-]';
var MessageWatchlist_DeroulerBis = '[+]';

////////////////////////////////////////// FIN DE LA PARTIE PERSONNALISABLE /////////////////////////////////////////////

// Construction de la requête ajax
var wmwpajax = {
  http: function(bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    var xmlhttp;
    try {
      xmlhttp = new XMLHttpRequest();
    } catch(e) {
      try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
        try {
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
          xmlhttp = false
        }
      }
    }
 
    if (xmlhttp) {
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4)
          wmwpajax.httpComplete(xmlhttp,bundle);
      };
      xmlhttp.open(bundle.method ? bundle.method : "GET",bundle.url,bundle.async === false ? false : true);
      if (bundle.headers) {
        for (var field in bundle.headers)
          try {
            xmlhttp.setRequestHeader(field,bundle.headers[field]);
          } catch(err) {
            //Argos42 : pour rendre LiveRC fonctionnel sur chrome
          }
      }
      xmlhttp.send(bundle.data ? bundle.data : null);
    }
    return xmlhttp;
  },
 
  httpComplete: function(xmlhttp,bundle) {
    if (xmlhttp.status == 200 || xmlhttp.status == 302) {
      if (bundle.onSuccess)
        bundle.onSuccess(xmlhttp,bundle);
    } else if (bundle.onFailure) {
      bundle.onFailure(xmlhttp,bundle);
 
    } else {
      // A activer en debug mode ?
         //  alert(xmlhttp.status+xmlhttp.responseText);
    }
  }
}; 

// Fonction lancée après succès de la requête
function MessageWatchlist_WatchEditFound(xmlreq, data) {
      var watchrev, watchsum, watchrevold, watchpage, junk;
      var Resultat = xmlreq.responseXML.getElementsByTagName('item')[0];
      if(!Resultat) return;
      var watchrev = Resultat.getAttribute('revid');
      if(!watchrev) return;
      try{
            watchrevold = jQuery.cookie('ais523wmwatchrev=');
      }
      catch(junk) {watchrevold=0;}

      // Gestion des différents skins
      var Content = document.getElementById('bodyContent');
      if(!Content) Content = document.getElementById('article');
      if(!Content) Content = document.getElementById('mw_contentholder');
      if(!Content) Content = document.body;

      var NotifierParentNode = document.getElementById('MessageWatchlist_Div');
      if(!NotifierParentNode){
            NotifierParentNode = document.createElement('div'); 
            NotifierParentNode.id='MessageWatchlist_Div'; 
            var DivRepere = document.getElementById('siteNotice');
            DivRepere.parentNode.insertBefore( NotifierParentNode , DivRepere );
      }

      // Liste de suivi
      if((mw.config.get('wgCanonicalSpecialPageName') == "Watchlist")&&(document.URL.indexOf("edit")==-1)){
            var now = new Date();
            var nextYear = new Date(now.getTime() + 1000 * 60 * 60 * 24 * 365 );
            jQuery.cookie('ais523wmwatchrev', watchrev, {expires:nextYear, path:"/"})

            var aas= Content.getElementsByTagName('a');
            var i=aas.length;
            while(i--){
                  if(aas[i].href.indexOf('diff=')!=-1&&watchrevold)
                  if(+(aas[i].href.split('diff=')[1].split('&')[0])>watchrevold)
                  aas[i].parentNode.style.fontWeight='bold';
            }
            NotifierParentNode.style.display = "none";

      // Autres pages
      } else {
            var watchpageid = Resultat.getAttribute('pageid');
            var watchrevid = Resultat.getAttribute('revid');
            var watchpage = Resultat.getAttribute('title');
            var watchuser = Resultat.getAttribute('user');
            var watchsum = Resultat.getAttribute('parsedcomment');
            var watchtimestamp = Resultat.getAttribute('timestamp');

            watchtimestamp = watchtimestamp.split('Z').join('').split('T').join(' - '); 
            var Codedwatchpage = watchpage.replace(/'/g, "ZAPOSRTOPHE");
            var CodedUser = watchuser.replace(/'/g, "ZAPOSRTOPHE");
            if(watchrev!=watchrevold){
                  var WatchlistLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=Special:Watchlist\');" title="'+MessageWatchlist_WatchlistTitle+'">'+MessageWatchlist_WatchlistText+'</a>';
                  var PageLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title='+encodeURIComponent(Codedwatchpage)+'\');" title="'+MessageWatchlist_PageTitle+'">'+watchpage+'</a>';
                  var DiffLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title='+encodeURIComponent(Codedwatchpage)+'&diff=prev&oldid='+watchrevid+'\');" title="'+MessageWatchlist_DiffTitle+'">'+MessageWatchlist_DiffText+'</a>';
                  var HistLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title='+encodeURIComponent(Codedwatchpage)+'&action=history\');" title="'+MessageWatchlist_HistTitle+'">'+MessageWatchlist_HistText+'</a>';
                  var EditLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title='+encodeURIComponent(Codedwatchpage)+'&action=edit\');" title="'+MessageWatchlist_EditTitle+'">'+MessageWatchlist_EditText+'</a>';
                  var StopLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + mw.config.get('wgScript') + '?title='+encodeURIComponent(Codedwatchpage)+'&action=unwatch\');" title="'+MessageWatchlist_StopTitle+'">'+MessageWatchlist_StopText+'</a>';
                  var UserLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + '/wiki/User:'+encodeURIComponent(CodedUser)+'\');" title="'+MessageWatchlist_UserTitle+'">'+watchuser+'</a>';
                  var UserTalkLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + '/wiki/User talk:'+encodeURIComponent(CodedUser)+'\');" title="'+MessageWatchlist_TalkTitle+'">'+MessageWatchlist_TalkText+'</a>';
                  var UserContribLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + '/wiki/Special:Contributions/'+encodeURIComponent(CodedUser)+'\');" title="'+MessageWatchlist_ContribTitle+'">'+MessageWatchlist_ContribText+'</a>';
                  var BlockUserLink = '<a href="javascript:MessageWatchlist_QuickPreview(\''+mw.config.get('wgServer') + '/wiki/Special:Blockip/'+encodeURIComponent(CodedUser)+'\');" title="'+MessageWatchlist_BlockTitle+'">'+MessageWatchlist_BlockText+'</a>';

                  var LogFormat = MessageWatchlist_LogFormat["default"];
                  var watchtype = Resultat.getAttribute('type');
                  if(watchtype=="edit"){ LogFormat = MessageWatchlist_LogFormat["edit"]; }
                  if(watchtype=="new"){ LogFormat = MessageWatchlist_LogFormat["new"]; }
                  if(watchtype=="log"){ 
                      var watchlogtype =  Resultat.getAttribute('logtype');
                      var watchlogaction =  Resultat.getAttribute('logaction');
                      if(typeof(MessageWatchlist_LogFormat[(watchlogtype+"_"+watchlogaction)])==="string") LogFormat = MessageWatchlist_LogFormat[(watchlogtype+"_"+watchlogaction)];
                  }

                  var NotifyText = MessageWatchlist_NotificationFormat;
                  NotifyText = NotifyText.split('$log').join(LogFormat);
                  NotifyText = NotifyText.split('$01').join(WatchlistLink);
                  NotifyText = NotifyText.split('$02').join(watchtimestamp);
                  NotifyText = NotifyText.split('$03').join(PageLink);
                  NotifyText = NotifyText.split('$04').join(DiffLink);
                  NotifyText = NotifyText.split('$05').join(HistLink);
                  NotifyText = NotifyText.split('$06').join(EditLink);
                  NotifyText = NotifyText.split('$07').join(StopLink);
                  NotifyText = NotifyText.split('$08').join(UserLink);
                  NotifyText = NotifyText.split('$09').join(UserTalkLink);
                  if(mw.config.get('wgUserGroups').indexOf('sysop')!=-1){
                        NotifyText = NotifyText.split('$10').join(UserContribLink+'|'+BlockUserLink);
                  }else{
                        NotifyText = NotifyText.split('$10').join(UserContribLink);                        
                  }
                  NotifyText = NotifyText.split('$11').join(watchsum);

                  var LastNotify = document.getElementById('watchlistnotify');
                  if(LastNotify){
                        LastNotify.innerHTML = NotifyText;
                        NotifierParentNode.style.display = "block";
                  }else{
                        NotifierParentNode.innerHTML += '<div id="watchlistnotify" style="margin-bottom:0.5em;">' + NotifyText + '</div><div id="watchlistShowPreview" style="display:none;"></div>';
                  }
            }else{
                  NotifierParentNode.style.display = "none";
            }
      }
}

// Fonction de lancement de la requête
function MessageWatchlist_getLastEditOnWatchList() {
    // Gestion des différents skins
    var Content = document.getElementById('bodyContent');
    if(!Content) Content = document.getElementById('article');
    if(!Content) Content = document.getElementById('mw_contentholder');
    if(!Content) Content = document.body;

    var NotifierParentNode = document.getElementById('MessageWatchlist_Div');
    if(!NotifierParentNode){
        NotifierParentNode = document.createElement('div'); 
        NotifierParentNode.id='MessageWatchlist_Div'; 
        var DivRepere = document.getElementById('siteNotice');
        DivRepere.parentNode.insertBefore( NotifierParentNode , DivRepere );
    }
    var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') 
            + '/api.php?format=xml&action=query&list=watchlist'
            + '&wllimit=1&wldir=older'
            + '&wlexcludeuser='+encodeURIComponent(mw.config.get('wgUserName'))
            + '&wlallrev'
            + '&wlprop=comment|ids|title|user|flags|timestamp|patrol|sizes|parsedcomment|loginfo'
            + '&wltype=edit|new|log'
    wmwpajax.http({url:URL, onSuccess: MessageWatchlist_WatchEditFound});
    if(!((mw.config.get('wgCanonicalSpecialPageName') == "Watchlist")&&(document.URL.indexOf("edit")==-1))){
        setTimeout("MessageWatchlist_getLastEditOnWatchList()",MessageWatchlistReload*1000);
    }
} 

$(MessageWatchlist_getLastEditOnWatchList);
importStylesheet('Utilisateur:Dr Brains/MessageWatchlist.css');

// Fonction de prévisualisation 
function MessageWatchlist_QuickPreview(url){
      if(!url) return;
      url = decodeURIComponent(url);
      while(url.indexOf('&#039;')!=-1){
            url = url.split('&#039;').join("'");
            if(url.indexOf('&#039;')==-1) break;
      }
      url = url.replace(/ZAPOSRTOPHE/g, "'");
      if((url.indexOf('action=edit')!=-1)&&((mw.config.get('wgAction')=="edit")||(mw.config.get('wgAction')=="submit"))){ alert(MessageWatchlist_AlertEdit); return;}
      var PreviewDiv = document.getElementById('watchlistShowPreview');
      if(!PreviewDiv) return;
      while (PreviewDiv.firstChild){  PreviewDiv.removeChild(PreviewDiv.firstChild); }
      PreviewDiv.innerHTML = '<h2>'+MessageWatchlist_LoadingText+'<span style="text-decoration:blink;">...</span><h2><br/>';
      PreviewDiv.style.display = "block";
      wmwpajax.http({url:url, onSuccess: MessageWatchlist_QuickPreviewDone});
}

function MessageWatchlist_QuickPreviewDone(req, data){
      var PreviewDiv = document.getElementById('watchlistShowPreview');
      if(!PreviewDiv) return;
      var url = data.url;
      while (PreviewDiv.firstChild){  PreviewDiv.removeChild(PreviewDiv.firstChild); }
      var TempElement = document.createElement('div');
      TempElement.innerHTML = req.responseText; 
      var Content = WatchUsers_getElementWithId( TempElement, 'div', 'bodyContent');
      if(!Content) Content = WatchUsers_getElementWithId( TempElement, 'div', 'mw_contentholder');
      if(!Content) Content = WatchUsers_getElementWithId( TempElement, 'div', 'article');
      var PageContent = Content.innerHTML;
      var LiensAction = '<h2>'
+'<a href="javascript:MessageWatchlist_CancelPreview();" title="'+MessageWatchlist_CloseWindowTitle+'">'+MessageWatchlist_CloseWindowText+'</a>'
+' | '
+'<b><a href="javascript:MessageWatchlist_QuickPreviewSize(50);" title="'+MessageWatchlist_PreviewSizePlusTitle+'">'+MessageWatchlist_PreviewSizePlusText+'</a></b>'
+' : '
+'<b><a href="javascript:MessageWatchlist_QuickPreviewSize(-50);" title="'+MessageWatchlist_PreviewSizeMinusTitle+'">'+MessageWatchlist_PreviewSizeMinusText+'</a></b>'
+' | '
+'<a href="'+url+'" title="'+url+'">'+MessageWatchlist_DirectLinkText+'</a>'
+'</h2>';
      PreviewDiv.innerHTML = LiensAction + '<div id="MessageWatchlist_PreviewContent" style="height:'+MessageWatchlistHeight+'px;overflow-y:auto;border:2px solid black;padding:1em;">' +  PageContent + '<div class="visualClear"/></div>';
      PreviewDiv.style.display = "block";
      MessageWatchlist_cleanPreviewContent(PreviewDiv);
}

// Fermeture de la fenêtre de prévisualisation
function MessageWatchlist_CancelPreview(){
      var PreviewDiv = document.getElementById('watchlistShowPreview');
      while (PreviewDiv.firstChild){ PreviewDiv.removeChild(PreviewDiv.firstChild); }
      PreviewDiv.style.display = "none";
}


// Modification de la taille de la fenêtre de prévisualisation
function MessageWatchlist_QuickPreviewSize(diff){
      var PreviewDiv = document.getElementById('MessageWatchlist_PreviewContent');
      PreviewDiv.style.height = (parseInt(PreviewDiv.style.height.split('px').join('')) + diff) + 'px';
}

function WatchUsers_getElementWithId( elementParentNode , elementTagName , elementId ){
      if(!elementParentNode) elementParentNode = document; 
      var TheElement = false;
      var Elements = elementParentNode.getElementsByTagName(elementTagName);
      var elementcount = 0;
      while(elementcount<Elements.length){
            var Id = Elements[elementcount].id;
            if(Id){
                  if(Id.indexOf(elementId)!=-1){
                        TheElement = Elements[elementcount];
                        break;
                  }
            }
            elementcount++
      }
      return TheElement;
}

// ################################################################################################################## GESTION DU CONTENU DE LA PREVISUALISATION
 
var MessageWatchlist_indexSummary = 0;
var MessageWatchlist_indexNavigationBars = 10000;
var MessageWatchlist_indexCollapsibleTables = 10000;
 
function MessageWatchlist_cleanPreviewContent(element){
        if(!element) element = document;
 
        var newContentWrapper = element.getElementsByTagName("div");
        var div=0;
        while(div<newContentWrapper.length){
                if (
                ($(newContentWrapper[div]).hasClass("NavFrame"))  // ************************************* Boîtes déroulantes
                ){          
                    MessageWatchlist_indexCollapsibleTables++;
                    NavHead =  newContentWrapper[div].firstChild;
                    var NavToggle = document.createElement("a");
                    NavToggle.className = 'NavToggle';
                    NavToggle.id = 'NavToggle' + MessageWatchlist_indexCollapsibleTables;
                    NavToggle.href = 'javascript:MessageWatchlist_toggleCollapsibleTables(' + MessageWatchlist_indexCollapsibleTables + ');'; 
                    NavToggle.innerHTML = MessageWatchlist_Enrouler;
                    newContentWrapper[div].insertBefore( NavToggle, NavHead );  
                    var Content = newContentWrapper[div].getElementsByTagName("div");
                    for( var c=0;c<Content.length; c++ ) {
                        if ($(Content[c]).hasClass("NavContent")) { 
                           Content[c].id = 'NavContent' + MessageWatchlist_indexCollapsibleTables;
                        }
                    }
                    MessageWatchlist_toggleCollapsibleTables(MessageWatchlist_indexCollapsibleTables);
               }
 
                Div_Id = newContentWrapper[div].id;
                if(Div_Id){
                        if(
                        (Div_Id=="toctitle")     // ************************************* Sommaire
                        ){
                                MessageWatchlist_indexSummary = (MessageWatchlist_indexSummary+1);
                                newContentWrapper[div].id = 'toctitle_'+MessageWatchlist_indexSummary;
                                var TitreSommaire = newContentWrapper[div].getElementsByTagName('h2')[0];
                                TitreSommaire.innerHTML = TitreSommaire.innerHTML + ' <a href="javascript:MessageWatchlist_afficherSommaire(\'toc_'+MessageWatchlist_indexSummary
                                +'\',\'toctitle_'+MessageWatchlist_indexSummary
                                +'\', \''+TitreSommaire.innerHTML
                                +'\');" >'+MessageWatchlist_DeroulerBis+'</a>';
                                var Conteneur = newContentWrapper[div].parentNode;
                                var Sommaire = Conteneur.getElementsByTagName('ul')[0];
                                Sommaire.id = 'toc_'+MessageWatchlist_indexSummary;
                                Sommaire.style.display="none";
                        }
                        if(
                        (Div_Id=="mw-hidden-catlinks")
                        ){
                                newContentWrapper[div].style.display= "block";
                        }
                }
                div++        
        }
 
        var Tables = element.getElementsByTagName( "table" ); 
        for ( var i = 0; i < Tables.length; i++ ) {
              if( $(Tables[i]).hasClass("collapsible") ){     // ************************************* Palettes de navigation
                     NavigationBar = Tables[i];
                     NavigationBar.id = "collapsibleTable" + MessageWatchlist_indexNavigationBars ;
 
                     var Button     = document.createElement( "span" );
                     var ButtonLink = document.createElement( "a" );
                     var ButtonText = document.createTextNode( MessageWatchlist_Enrouler );
 
                     Button.style.styleFloat = "right";
                     Button.style.cssFloat = "right";
                     Button.style.fontWeight = "normal";
                     Button.style.textAlign = "right";
                     Button.style.width = "6em";
 
                     ButtonLink.id = "collapseButton" + MessageWatchlist_indexNavigationBars ;
                     ButtonLink.href = "javascript:MessageWatchlist_collapseNavigationBar(" + MessageWatchlist_indexNavigationBars + ");" ;
                     ButtonLink.appendChild( ButtonText ); 
                     Button.appendChild( ButtonLink );
 
                     var Header = NavigationBar.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
                     if (Header) {
                            Header.insertBefore( Button, Header.firstChild );
 
                     }
                     if ( $( NavigationBar ).hasClass( "collapsed" ) ) MessageWatchlist_collapseNavigationBar( MessageWatchlist_indexNavigationBars );
                     MessageWatchlist_indexNavigationBars++;
               }
        }
}
 
// ###################################################### FONCTIONS SUBALTERNES A LA GESTION DU CONTENU 
 
// -------------------------------------------- Sommaire
 
function MessageWatchlist_afficherSommaire(IDSommaire, IdTitre, TitreInitial){
       var Sommaire = document.getElementById(IDSommaire);
       Sommaire.style.display="block";
       var Titre = document.getElementById(IdTitre).getElementsByTagName('h2')[0];
       Titre.innerHTML = TitreInitial + ' <a href="javascript:MessageWatchlist_masquerSommaire(\''+IDSommaire+'\',\''+IdTitre+'\', \''+TitreInitial+'\');" >'+MessageWatchlist_EnroulerBis+'</a>';
}
 
function MessageWatchlist_masquerSommaire(IDSommaire, IdTitre, TitreInitial){
       var Sommaire = document.getElementById(IDSommaire);
       Sommaire.style.display="none";
       var Titre = document.getElementById(IdTitre).getElementsByTagName('h2')[0];
       Titre.innerHTML = TitreInitial + ' <a href="javascript:MessageWatchlist_afficherSommaire(\''+IDSommaire+'\',\''+IdTitre+'\', \''+TitreInitial+'\');" >'+MessageWatchlist_DeroulerBis+'</a>';
}
 
// -------------------------------------------- Palettes de navigation
 
function MessageWatchlist_collapseNavigationBar( tableIndex ) {
  var Button = document.getElementById( "collapseButton" + tableIndex );
  var Table = document.getElementById( "collapsibleTable" + tableIndex );
  if ( !Table || !Button ) return false;
 
  var Rows = Table.getElementsByTagName( "tr" ); 
 
  if ( Button.firstChild.data == MessageWatchlist_Enrouler ) {
    for ( var i = 1; i < Rows.length; i++ ) {
      Rows[i].style.display = "none";
    }
    Button.firstChild.data = MessageWatchlist_Derouler;
  } else {
    for ( var i = 1; i < Rows.length; i++ ) {
      Rows[i].style.display = Rows[0].style.display;
    }
    Button.firstChild.data = MessageWatchlist_Enrouler ;
  }
}
 
// -------------------------------------------- Boîtes déroulantes 
 
function MessageWatchlist_toggleCollapsibleTables(index) {
    var NavToggle = document.getElementById("NavToggle" + index);
    var NavContent = document.getElementById("NavContent" + index);
 
    if( (!NavToggle) || (!NavContent) ) return; 
 
    var Caption = NavToggle.innerHTML;  
    if (Caption == MessageWatchlist_Enrouler) {
        NavContent.style.display = 'none';
        NavToggle.innerHTML = MessageWatchlist_Derouler; 
    } else if (Caption == MessageWatchlist_Derouler) {
        NavContent.style.display = 'block';
        NavToggle.innerHTML = MessageWatchlist_Enrouler;
    }
}

// </nowiki></pre></syntaxhighlight>{{Boîte déroulante fin}}