Utilisateur:Dr Brains/SuivisSousPages.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.
if(mw.config.get('wgNamespaceNumber')%2){
    var SuivisSousPages_ArticleNS = mw.config.get('wgNamespaceNumber') -1;
    var SuivisSousPages_TalkNS = mw.config.get('wgNamespaceNumber');
}else{
    var SuivisSousPages_ArticleNS = mw.config.get('wgNamespaceNumber');
    var SuivisSousPages_TalkNS = mw.config.get('wgNamespaceNumber') +1;
}

var SuivisSousPages_ArticleNSName = mw.config.get('wgFormattedNamespaces')[SuivisSousPages_ArticleNS];
if(SuivisSousPages_ArticleNSName!='') SuivisSousPages_ArticleNSName += ':';
var SuivisSousPages_TalkNSName = mw.config.get('wgFormattedNamespaces')[SuivisSousPages_TalkNS] + ':';

$(SuivisSousPages_AddLink);


function SuivisSousPages_AddLink(){
      var CaWatch = document.getElementById('ca-watch');
      if(!CaWatch) CaWatch = document.getElementById('ca-unwatch');
      if(!CaWatch) return;
      var NewWatchLink = document.createElement('li');
      NewWatchLink.id = 'ca-watch-SousPages';
      NewWatchLink.innerHTML = '<span style="whitespace:nowrap;"><a style="display:inline;margin-right:0;padding-right:0;" href="javascript:SuivisSousPages_API(0);" title="Supprimer les sous-pages à la liste de suivi">(Ne plus) </a><a style="display:inline;margin-left:0;padding-left:0;" href="javascript:SuivisSousPages_API(1);" title="Ajouter les sous-pages à la liste de suivi">Suivre</a></span>'; 

      if(mw.config.get('skin')=="vector"){
            var CactionsMenu = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
            CactionsMenu.appendChild(NewWatchLink);
      }else{
            var Ul = CaWatch.parentNode;
            var Next = CaWatch.nextSibling;
            if(Next){
                Ul.insertBefore(NewWatchLink,Next);
            }else{
                Ul.appendChild(NewWatchLink);
            }  
      }    
}

function SuivisSousPages_API(watch){
      var PageTitle = mw.config.get('wgTitle').split('/')[0]; 
      var PageName = SuivisSousPages_TalkNSName + PageTitle; 
      var SousPagesListe = new Array();  
      var AdresseRequete = mw.config.get('wgServer') + '/w/api.php?action=query&list=allpages&aplimit=499&apnamespace='+SuivisSousPages_TalkNS+'&apprefix=' + PageTitle.replace(/&/g,"%26")+'/' ;
      //alert(AdresseRequete);
      var NouvelleRequete = new XMLHttpRequest();
      NouvelleRequete.open("GET", AdresseRequete, true);
      NouvelleRequete.send(null);
      NouvelleRequete.onreadystatechange = function() {
            if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
                  //alert('Reçu');
                  var ElementTraitement = document.createElement('div');
                  ElementTraitement.innerHTML = NouvelleRequete.responseText; 
                  var Informations = ElementTraitement.getElementsByTagName('span');
                  for(var a=0;a<Informations.length;a++){
                        var ContenuInformation = Informations[a].innerHTML;
                        if(ContenuInformation.indexOf('title=')!=-1){
                              var ThisPageName = ContenuInformation.split('title="')[1].split('"')[0]; 
                              ThisPageName = ThisPageName.split(SuivisSousPages_TalkNSName).join(SuivisSousPages_ArticleNSName);    
                              SousPagesListe.push(SuivisSousPages_Clean(ThisPageName));
                        }
                  }
                  if(!SousPagesListe[0]){
                        alert("Il n'y a aucune sous-page à ajouter ou retirer de la liste de suivi.");
                        return;
                  }
                  var WatchAction = "ajoutées à";
                  if(watch==0) WatchAction = "retirées de";
                  var MessageAlert = 'Les pages suivantes et leur page de discussion vont être '+WatchAction+' votre liste de suivi :\n\n';
                  for(var b=0;b<SousPagesListe.length;b++){
                        MessageAlert += '* '+SousPagesListe[b]+'\n';
                  }
                  MessageAlert += '\n Continuer ?';
                  var SurEtCertain = confirm(MessageAlert);
                  if(SurEtCertain) SuivisSousPages_Raw(SousPagesListe, watch);
            }
      }
}

// Nettoyage résultats requête
 
function SuivisSousPages_Clean(text){
      while(text.indexOf('&amp;')!=-1){
            text = text.split('&amp;').join("&");
            if(text.indexOf('&amp;')==-1) break;
      }
      while(text.indexOf('&#039;')!=-1){
            text = text.split('&#039;').join("'");
            if(text.indexOf('&#039;')==-1) break;
      }
      while(text.indexOf('&quot;')!=-1){
            text = text.split('&quot;').join('"');
            if(text.indexOf('&quot;')==-1) break;
      }
      while(text.indexOf('&nbsp;')!=-1){
            text = text.split('&nbsp;').join(' ');
            if(text.indexOf('&nbsp;')==-1) break;
      }  
      return text;
}



function SuivisSousPages_Raw(SousPagesListe, watch){
      var AdresseRequete = mw.config.get('wgServer') + mw.config.get('wgArticlePath').split('$1').join('Special:Watchlist/raw');
      //alert(AdresseRequete);
      var NouvelleRequete = new XMLHttpRequest();
      NouvelleRequete.open("GET", AdresseRequete, true);
      NouvelleRequete.send(null);
      NouvelleRequete.onreadystatechange = function() {
            if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
                  var ElementTraitement = document.createElement('div');
                  //ElementTraitement.style.display = 'none';
                  ElementTraitement.innerHTML = NouvelleRequete.responseText; 
                  //document.body.insertBefore(ElementTraitement, document.body.firstChild);
                  var OldTitles = ElementTraitement.getElementsByTagName('textarea')[0].value;
                  //alert(OldTitles);
                  for(var a=0;a<SousPagesListe.length;a++){
                       if(watch==1){
                              OldTitles += SousPagesListe[a]+'\n';
                       }else{
                              OldTitles = OldTitles.split('\n'+SousPagesListe[a]+'\n').join('\n');
                       }
                  }
                  ElementTraitement.getElementsByTagName('textarea')[0].value = OldTitles;
                  var Form = ElementTraitement.getElementsByTagName('form')[0];
                  var Action = Form.action;
                  var count = 0;
                  var Token = Form.getElementsByTagName('input')[count];
                  while(Token.name!='token'){ 
                       count++; 
                       Token = Form.getElementsByTagName('input')[count];
                  }
                  TokenValue = Token.value;
                  
                  var boundary = '--------123xyz';
                  var data = '';
                  data += '--' + boundary + '\nContent-Disposition: form-data; name="titles"\n\n' + OldTitles + '\n'
                  data += '--' + boundary + '\nContent-Disposition: form-data; name="token"\n\n' + TokenValue + '\n'
                  var ajaxSubmit = new XMLHttpRequest();
                  ajaxSubmit.open('POST', Action, true);
                  ajaxSubmit.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+boundary);
                  ajaxSubmit.send(data + '--' + boundary);
                  ajaxSubmit.onreadystatechange = function(){
                        if (ajaxSubmit.readyState == 4){
                              var ElementTraitementBis = document.createElement('div');
                              ElementTraitementBis.innerHTML = ajaxSubmit.responseText; 
                              if(document.getElementById('bodyContent')) var Content = 'bodyContent';
                              if(document.getElementById('article')) var Content = 'article';
                              if(document.getElementById('mw_contentholder')) var Content = 'mw_contentholder';
                              var BodyContent = SuivisSousPages_getElementWithId( Content , 'div' , ElementTraitementBis );
                              if(!BodyContent) alert('Pas bodyContent');
                              var NewDiv = document.createElement('div');
                              NewDiv.id = 'WatchResult';
                              NewDiv.setAttribute('style', 'border:1px solid silver;padding:1em;margin:0.5em;');
                              document.getElementById(Content).parentNode.insertBefore(NewDiv, document.getElementById(Content));
                              BodyContent.removeChild(BodyContent.getElementsByTagName('form')[0]);
                              while(BodyContent.firstChild){
                                    var FirstChild = BodyContent.firstChild;
                                    BodyContent.removeChild(FirstChild);
                                    NewDiv.appendChild(FirstChild);
                              }
                              var CloseLink = '<span style="float:right;">'
                              +'<a href="javascript:SuivisSousPages_close();" '
                              +'title="Cliquer pour fermer la fenêtre">Fermer</a>'
                              +'</span>';
                              NewDiv.innerHTML = CloseLink + NewDiv.innerHTML;
                        }
                  }
            }
      }
}

function SuivisSousPages_close(){
      var Resutlts = document.getElementById('WatchResult');
      if(Resutlts) Resutlts.parentNode.removeChild(Resutlts);
}

function SuivisSousPages_getElementWithId( elementId , elementTagName , elementParentNode ){
      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==elementId){
                        TheElement = Elements[elementcount];
                        break;
                  }
            }
            elementcount++
      }
      return TheElement;
}