Utilisateur:Dr Brains/UnwatchFromWatchlist.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.
//<source lang=javascript>//<pre>//<nowiki>
if(typeof(UnwatchFromWatchlist)==="undefined"){

window.UnwatchFromWatchlist = new Object();

UnwatchFromWatchlist.Texts = new Object(); // ///////////////////////// TEXTES

UnwatchFromWatchlist.Texts.diff = "diff";
UnwatchFromWatchlist.Texts.hist = "hist";
UnwatchFromWatchlist.Texts.histLong = "historique";
UnwatchFromWatchlist.Texts.unwatch = "stop";
UnwatchFromWatchlist.Texts.unwatch_tip = "Ne plus suivre la page";

UnwatchFromWatchlist.Functions = new Object(); // ///////////////////// FONCTIONS

UnwatchFromWatchlist.Functions.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){ UnwatchFromWatchlist.Functions.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{ }}
};

UnwatchFromWatchlist.Functions.GetMainDiv = function(){
  var Divs = document.getElementsByTagName('div');
  for(var a=0,l=Divs.length;a<l;a++){
    var Div = Divs[a];
    if(!$(Div).hasClass("mw-changeslist")) continue;
    return Div;
  }
  return false;
}

UnwatchFromWatchlist.Functions.GetAllLis = function(){
  var toreturn = {};
  var Div = UnwatchFromWatchlist.Functions.GetMainDiv();
  if(!Div) return {};
  var Enhanced = $.makeArray( $(Div).find('table.mw-enhanced-rc'));
  if(Enhanced.length > 0){
    var TDs = [];
    for(var a=0,l=Enhanced.length;a<l;a++){
      var TD = Enhanced[a].getElementsByTagName('td')[2];
      if(!UnwatchFromWatchlist.Functions.GetPagenameFromTD(TD)) TD = Enhanced[a].getElementsByTagName('td')[1];
      TDs.push(TD);
    }
    toreturn.tds = TDs;
  }else{
    var Lis = Div.getElementsByTagName('li');
    toreturn.lis = Lis;
  }
  return toreturn;
}

UnwatchFromWatchlist.Functions.Init = function(){
  var AllElements = UnwatchFromWatchlist.Functions.GetAllLis();
  var Lis = AllElements["lis"]; // ----------------------------- Watchlist simple
  if(Lis){
    for(var a=0,l=Lis.length;a<l;a++){
      UnwatchFromWatchlist.Functions.AddStopLink(Lis[a]);
    }
  }
  var TDs = AllElements["tds"]; // ----------------------------- Watchlist améliorée
  if(TDs){
    for(var a=0,l=TDs.length;a<l;a++){
      UnwatchFromWatchlist.Functions.AddStopLinkEnhanced(TDs[a]);
    }
  }
}

// #####################################################################################################################
// Liste de suivi améliorée

UnwatchFromWatchlist.Functions.AddStopLinkEnhanced = function(td){
  if(!td) return;
  var separator = $.makeArray( $(td).find('span.mw-changeslist-separator'))[0];
  if(!separator) return;
  var target = separator.previousSibling;
  var TitleLink = $.makeArray( $(td).find('span.mw-title'))[0];
  if(TitleLink){
    var StopLink = document.createElement('a');
    StopLink.href = "javascript:;";
    StopLink.innerHTML = UnwatchFromWatchlist.Texts.unwatch;
    StopLink.title = UnwatchFromWatchlist.Texts.unwatch_tip;
    StopLink.onclick = function(){
      UnwatchFromWatchlist.Functions.StopWatchPageEnhanced(this);
      return false;
    }
    target.parentNode.insertBefore(document.createTextNode(" | "), target);
    target.parentNode.insertBefore(StopLink, target);
  }else{ 

  /*  TODO : Gestion des items "journaux"  */

  }
}

UnwatchFromWatchlist.Functions.StopWatchPageEnhanced = function(StopLink){
  var TD = UnwatchFromWatchlist.Functions.GetTDFromLink(StopLink);
  var PageName = UnwatchFromWatchlist.Functions.GetPagenameFromTD(TD);
  if(!TD || !PageName) return;
  UnwatchFromWatchlist.Functions.UnwatchPageEnhanced(PageName, TD);
}

UnwatchFromWatchlist.Functions.GetTDFromLink = function(StopLink){
  var TD = StopLink.parentNode;
  while(TD.tagName.toLowerCase() != "td"){ TD = TD.parentNode; if(!TD) break; }
  return TD;
}

UnwatchFromWatchlist.Functions.GetPagenameFromTD = function(TD){
  if(!TD) return null;
  var Links = TD.getElementsByTagName('a');
  for(var a=0,l=Links.length;a<l;a++){
    var Link = Links[a];
    if($(Link).hasClass("mw-changeslist-title")) return Link.title;
  }
  return null;
}

UnwatchFromWatchlist.Functions.UnwatchPageEnhanced = function(PageName, TD){
  var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&prop=info&intoken=watch&titles='+encodeURIComponent(PageName);
  UnwatchFromWatchlist.Functions.ajax.http({
    url:URL, 
    onSuccess: UnwatchFromWatchlist.Functions.UnwatchPageProcessEnhanced,
    page:PageName,
    td:TD
  });
}

UnwatchFromWatchlist.Functions.UnwatchPageProcessEnhanced = function(Req, data){
  var pageNode = Req.responseXML.getElementsByTagName("page")[0];
  var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=watch';
  var postdata = "title=" + encodeURIComponent(data.page)
              + "&token=" + encodeURIComponent(pageNode.getAttribute("watchtoken"))
              + "&unwatch=1";
  //prompt(URL+"&"+postdata, URL+"&"+postdata);
  var headers = {"Content-Type": "application/x-www-form-urlencoded"};
  UnwatchFromWatchlist.Functions.ajax.http({
    url: URL, 
    method: "POST", 
    headers: headers, 
    data: postdata, 
    onSuccess: UnwatchFromWatchlist.Functions.UnwatchPageDoneEnhanced,
    datas:data
  });  
}

UnwatchFromWatchlist.Functions.UnwatchPageDoneEnhanced = function(Req, data){
  var errorNode = Req.responseXML.getElementsByTagName("error")[0];
  if(errorNode){
    var txt = "Error : "+data.url+" — "+data.data+"\n";
    var attr = errorNode.getAttributes;
    for(var a=0,l=attr.length;a<l;a++){ txt += "\n* "+attr[a].name+" = "+attr[a].value; }
    alert(txt);
    return;
  }
  var page = data.datas.page;
  var TD = data.datas.td;
  var Table = TD.parentNode;
  while(Table.tagName.toLowerCase() != "table"){ Table = Table.parentNode; if(!Table) break; }
  if(!Table) return;
  var Classes = Table.className;
  if(!Classes) return;
  Classes = Classes.split(" ");
  for(var a=0,l=Classes.length;a<l;a++){
    var ThisClass = Classes[a];
    if(ThisClass.indexOf("mw-changeslist-") != 0) continue;
    UnwatchFromWatchlist.Functions.DeleteAllUnwatchedTables(ThisClass);
  }

}

UnwatchFromWatchlist.Functions.DeleteAllUnwatchedTables = function(TableClass){
  var Div = UnwatchFromWatchlist.Functions.GetMainDiv();
  if(!Div) return;
  var Tables = Div.getElementsByTagName('table');
  for(var a=0,l=Tables.length;a<l;a++){
    var Table = Tables[a];
    if($(Table).hasClass(TableClass)) Table.parentNode.removeChild(Table);
  }

  /*  TODO : supprimer la page des items "journaux"  */

}

// #####################################################################################################################
// Liste de suivi simple

UnwatchFromWatchlist.Functions.AddStopLink = function(Li){
  if(!Li) return;
  var Links = Li.getElementsByTagName('a');
  var link = Links[1];
  if(link.innerHTML != UnwatchFromWatchlist.Texts.hist) link = Links[0];
  if(link.innerHTML != UnwatchFromWatchlist.Texts.hist) return;   // Journaux
  var StopLink = document.createElement('a');
  StopLink.href = "javascript:;";
  StopLink.innerHTML = UnwatchFromWatchlist.Texts.unwatch;
  StopLink.title = UnwatchFromWatchlist.Texts.unwatch_tip;
  StopLink.onclick = function(){
    UnwatchFromWatchlist.Functions.StopWatchPage(this);
    return false;
  }
  link.parentNode.insertBefore(StopLink, link.nextSibling);
  link.parentNode.insertBefore(document.createTextNode(" | "), link.nextSibling);
}

UnwatchFromWatchlist.Functions.StopWatchPage = function(StopLink){
  var Li = UnwatchFromWatchlist.Functions.GetLiFromLink(StopLink);
  var PageName = UnwatchFromWatchlist.Functions.GetPagenameFromLi(Li);
  if(!Li || !PageName) return;
  UnwatchFromWatchlist.Functions.UnwatchPage(PageName, Li);
}

UnwatchFromWatchlist.Functions.GetLiFromLink = function(StopLink){
  var Li = StopLink.parentNode;
  while(Li.tagName.toLowerCase() != "li"){ Li = Li.parentNode; if(!Li) break; }
  return Li;
}

UnwatchFromWatchlist.Functions.GetPagenameFromLi = function(Li){
  if(!Li) return null;
  var Links = Li.getElementsByTagName('a');
  for(var a=0,l=Links.length;a<l;a++){
    var Link = Links[a];
    if($(Link).hasClass("mw-changeslist-title")) return Link.title;
  }
  return null;
}

UnwatchFromWatchlist.Functions.UnwatchPage = function(PageName, Li){
  var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&prop=info&intoken=watch&titles='+encodeURIComponent(PageName);
  UnwatchFromWatchlist.Functions.ajax.http({
    url:URL, 
    onSuccess: UnwatchFromWatchlist.Functions.UnwatchPageProcess,
    page:PageName,
    li:Li
  });
}

UnwatchFromWatchlist.Functions.UnwatchPageProcess = function(Req, data){
  var pageNode = Req.responseXML.getElementsByTagName("page")[0];
  var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=watch';
  var postdata = "title=" + encodeURIComponent(data.page)
              + "&token=" + encodeURIComponent(pageNode.getAttribute("watchtoken"))
              + "&unwatch=1";
  //prompt(URL+"&"+postdata, URL+"&"+postdata);
  var headers = {"Content-Type": "application/x-www-form-urlencoded"};
  UnwatchFromWatchlist.Functions.ajax.http({
    url: URL, 
    method: "POST", 
    headers: headers, 
    data: postdata, 
    onSuccess: UnwatchFromWatchlist.Functions.UnwatchPageDone,
    datas:data
  });  
}

UnwatchFromWatchlist.Functions.UnwatchPageDone = function(Req, data){
  var errorNode = Req.responseXML.getElementsByTagName("error")[0];
  if(errorNode){
    var txt = "Error : "+data.url+" — "+data.data+"\n";
    var attr = errorNode.getAttributes;
    for(var a=0,l=attr.length;a<l;a++){ txt += "\n* "+attr[a].name+" = "+attr[a].value; }
    alert(txt);
    return;
  }
  var page = data.datas.page;
  var Li = data.datas.li;
  var Classes = Li.className;
  if(!Classes) return;
  Classes = Classes.split(" ");
  for(var a=0,l=Classes.length;a<l;a++){
    var ThisClass = Classes[a];
    if(ThisClass.indexOf("watchlist-")!=0) continue;
    UnwatchFromWatchlist.Functions.DeleteAllUnwatchedLis(ThisClass);
  }
}

UnwatchFromWatchlist.Functions.DeleteAllUnwatchedLis = function(ThisClass){
  var Lis = UnwatchFromWatchlist.Functions.GetAllLis()["lis"];
  for(var a=(Lis.length-1),l=-1;a>l;a--){
    var Li = Lis[a];
    if(!Li) continue;
    if($(Li).hasClass(ThisClass)) Li.parentNode.removeChild(Li);
  }
}


// #####################################################################################################################
// Lancement

if((mw.config.get('wgCanonicalSpecialPageName') == "Watchlist") && document.URL.indexOf("edit")==-1 && document.URL.indexOf("raw")==-1){
        $(UnwatchFromWatchlist.Functions.Init);                              
}

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