Utilisateur:Dr Brains/WatchCategoryMembers.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.
/*

Fonction : Ajoute, dans les pages Catégorie:, un lien permettant de suivre/ne plus suivre toutes les pages contenues dans la catégorie. 

Ne concerne que les pages directement incluses dans la catégorie. Les sous-catégories et leur contenu ne sont pas concernées.

{{Projet:JavaScript/Script}} 

*/
////////////////////////////////<source lang=javascript><pre><nowiki>

var WatchCategoryMembers_ajax = {
  http:function(bundle){ 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){ WatchCategoryMembers_ajax.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){}}}; 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{ }}
};

///////////////////////// LANCEMENT //////////////////////////////
if((mw.config.get('wgNamespaceNumber')==14)&&(mw.config.get('wgAction')=="view"||mw.config.get('wgAction')=="purge")){
     addOnloadHook(WatchCategoryMembers_AddLinks);
}

///////////////////////// AJOUT DU LIEN //////////////////////////////

function WatchCategoryMembers_AddLinks(){
     var ElementParent = document.getElementById('bodyContent');
     if(!ElementParent) ElementParent = document.getElementById('mw_contentholder');
     if(!ElementParent) ElementParent = document.getElementById('article');
     if(!ElementParent) return;
     var Element = document.createElement('div');
     Element.id = 'ElementControle';
     ElementParent.insertBefore(Element, ElementParent.firstChild);
     var Small = document.createElement('small');     
     ElementParent.insertBefore(Small, Element);
     var NouveauLienSuivre = document.createElement('a');
     NouveauLienSuivre.innerHTML = 'Suivre';
     NouveauLienSuivre.href = "javascript:WatchCategoryMembers(true)";     
     Small.appendChild(NouveauLienSuivre);
     Small.appendChild(document.createTextNode("/"));
     var NouveauLienStop = document.createElement('a');
     NouveauLienStop.innerHTML = 'Ne plus suivre';
     NouveauLienStop.href = "javascript:WatchCategoryMembers(false)";
     Small.appendChild(NouveauLienStop);
     Small.appendChild(document.createTextNode(" les pages de cette catégorie"));
}
 
///////////////////////// LISTAGE DES PAGES //////////////////////////////

var PageToWatch = new Array();
var PageToWatchCount = 0; 
var PagesInCategory = 0;
var PagesinWatchlist = 0;
var PagesWithError = new Array();

function WatchCategoryMembers(Watch, categorycontinue){
     if(!categorycontinue) categorycontinue = '';
      var NouvelleRequete = new XMLHttpRequest()
      var AdresseRequete = mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&action=query&list=categorymembers&cmlimit=499&cmtitle=' + mw.config.get('wgPageName').replace(/&/g, "%26") + categorycontinue;       
      NouvelleRequete.open("GET", AdresseRequete, true);
      NouvelleRequete.onreadystatechange = function() {
            if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
                  PagesInCategory++
                  document.getElementById('ElementControle').innerHTML = 'Listage des pages de la catégorie <b>' + mw.config.get('wgTitle') + '</b>, page ' + PagesInCategory;

                  var ElementTraitement = NouvelleRequete.responseXML; 
                  var Pages = ElementTraitement.getElementsByTagName('cm');
                  var AutreRequeteNecessaire = false;
                  for(a=0;a<Pages.length;a++){
                        var TitrePage = Pages[a].getAttribute("title");
                        if(TitrePage.indexOf(mw.config.get('wgFormattedNamespaces')[14]+':')==-1){
                              PageToWatch[PageToWatchCount] = TitrePage;
                              PageToWatchCount++
                        }
                  }
                  var AutreRequete = ElementTraitement.getElementsByTagName('query-continue')[0];
                  if(AutreRequete){
                        AutreRequeteNecessaire = true;
                        var AutreRequeteContinue = '&cmcontinue=' + AutreRequete.getElementsByTagName("categorymembers")[0].getAttribute("cmcontinue");
                  } 
                  if(AutreRequeteNecessaire==true){
                        WatchCategoryMembers(Watch,AutreRequeteContinue);
                  }else{
                        WatchCategoryMembers_getPageToken(0, Watch);
                  }
            }
      }
      NouvelleRequete.send(null);
}

///////////////////////// AJOUT/RETRAIT DE LA LISTE DE SUIVI //////////////////////////////


// Récupération du token

function WatchCategoryMembers_getPageToken(position, Watch){
      if(!position) position = 0;      
      var PageASuivre = PageToWatch[position];
      if(!PageASuivre){ 
            WatchCategoryMembers_AllPageInWatchlist(Watch);
            return; 
      }
      var AdresseRequete = mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&action=query&prop=info&titles='+encodeURIComponent(PageASuivre)+"&intoken=watch";  
      var NouvelleRequete = new XMLHttpRequest();
      NouvelleRequete.open("GET", AdresseRequete, true);
      NouvelleRequete.onreadystatechange = function() {
            if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
                  var token = false;
                  try{
                  var ObjectXML = NouvelleRequete.responseXML;
                  var PageInfos = ObjectXML.getElementsByTagName('page')[0];
                  token = PageInfos.getAttribute('watchtoken'); 
                  //token=token.split("+\\").join("");
                  }catch(e){}
                  if(token){
                        WatchCategoryMembers_AddPageToWatchlist(position, Watch, token);
                  }else{
                        document.getElementById('ElementControle').innerHTML = '<span class="error">Erreur de récupération du token pour la page <b>« ' + PageASuivre + ' »</b>.</span>';
                        PagesWithError.push(PageASuivre);
                        WatchCategoryMembers_getPageToken((position+1), Watch);
                  }
            }
      }
      NouvelleRequete.send(null);
}

// Ajout/retrait de la liste de suivi

function WatchCategoryMembers_AddPageToWatchlist(position, Watch, token){
      if(!position) position = 0;      
      var PageASuivre = PageToWatch[position];
      if(!PageASuivre){ 
            WatchCategoryMembers_AllPageInWatchlist(Watch);
            return; 
      }
      var Action = ( Watch ? "" : "&unwatch=1" );    
      var Text = ( Watch ? "ajoutée à" : "retirée de" );
      var requestEditData = 'title=' + encodeURIComponent(PageASuivre)
                          + '&token=' + encodeURIComponent(token)
                          + Action
      var headers = {"Content-Type": "application/x-www-form-urlencoded"};
      WatchCategoryMembers_ajax.http({url      : mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=watch',
                                      method   : "POST", 
                                      headers  : headers,
                                      data     : requestEditData
      });
      document.getElementById('ElementControle').innerHTML = 'La page <b>« ' + PageASuivre + ' »</b> a été '+Text+' votre liste de suivi.';
      PagesinWatchlist++
      WatchCategoryMembers_getPageToken((position+1), Watch);
} 

///////////////////////// MESSAGE DE FIN //////////////////////////////

function WatchCategoryMembers_AllPageInWatchlist(Watch){
      document.getElementById('ElementControle').innerHTML = '';
      var Action = ( Watch ? "ajoutées à" : "retirées de" );
      document.getElementById('ElementControle').innerHTML += PagesinWatchlist + ' pages ont été '+Action+' votre liste de suivi.';
      if(PagesWithError.length!=0){
            var Error = 'Une erreur est apparue pour '+PagesWithError.length+' page'+(PagesWithError.length==1 ? '':'s') +' :<ul>'
            for(var a=0,l=PagesWithError.length;a<l;a++){
                  Error += '<li>'+PagesWithError[a]+'</li>';
            }
            Error += '</ul>';
            document.getElementById('ElementControle').innerHTML += Error;
      }
      document.getElementById('ElementControle').innerHTML += '<br /><p><b><a href="javascript:window.location=document.URL;">Recharger la page</a></b></p>';
}

////////////////////////////////////////////////////////////////</nowiki></pre></source>