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>