MediaWiki:Gadget-LiveRC.js/Extensions/MarkQuestionableExtension.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.
/* 
 --------------------------------------------------------------------------------------
 ---------LLLL---------III--------------------------RRRRRRRRRR--------CCCCC------------
 ---------LLLL---------III--------------------------RRRRRRRRRRRR----CCCCCCCCC----------
 ---------LLLL--------------------------------------RRR------RRR---CCC-----CCC---------
 ---------LLLL---------III--VV-----VV--EEEEEEEEE----RRR------RRR--CCC------------------
 ---------LLLL---------III---VV---VV---EEE----------RRRRRRRRRRR---CCC------------------
 ---------LLLL---------III---VV---VV---EEEEEE-------RRRRRRRRRR----CCC------------------
 ---------LLLL---------III----VV-VV----EEEEEE-------RRR-----RRR----CCC-----CCC---------
 ---------LLLLLLLLLLL--III----VVVVV----EEE----------RRR------RRR----CCCCCCCCC----------
 ---------LLLLLLLLLLL--III-----VVV-----EEEEEEEEE----RRR-------RRR-----CCCCC------------
 --------------------------------------------------------------------------------------
 
'''Extension de LiveRC'''
 
// Instaure un système de modifications marquées comme douteuses

// Script de base = [[Utilisateur:0x010C/script/DrapeauJaune.js]]
 
 
{{Catégorisation JS|LiveRC}} 

************************************************************************************************************************************************ */
if (typeof(LiveRC_AddHook)==="function" ) { // DÉBUT IF
 
LiveRC_Config["InstalledLiveRCExtensions"].push("MarkQuestionable");
 
/* ************************************************************************************************************************************************ */

 
/* </source>

== Variables globales ==
 
<source lang=javascript> */

lrcParams["MQE_CheckPage"] = "Wikipédia:Patrouille RC/Modifications à relire";
lrcParams["MQE_HideCheckPageEdits"] = true;
lrcParams["MQE_ActivateInDiffs"]    = true;


lrcIcons["MQE_UnpatrolledIcon"] = {
      type:0,
      src:"thumb/2/2f/Crystal_Clear_app_help_index.svg/16px-Crystal_Clear_app_help_index.svg.png",
      width:16,
      height:16
}


lrcTexts["MQE_UnpatrolledIcon_Title"] = "Cette modification fait l’objet d’une demande de vérification";
lrcTexts["MQE_Unpatrollink_Text"]     = "Marquer comme douteuse";
lrcTexts["MQE_Unpatrollink_Title"]    = "Demander une vérification de cette modification";
lrcTexts["MQE_Patrollink_Title"]      = "Approuver cette modification";
lrcTexts["MQE_Unpatrolled_Reason"]    = "Raison de la demande de vérification";
lrcTexts["MQE_Unpatrolled_pop"]       = "Marquée comme douteuse";
lrcTexts["MQE_Patrolled_Reason"]      = "Commentaire de la relecture";
lrcTexts['liveQuestionableTitle']     = 'Modifications douteuses';

UnTranslatedTexts["MQE_Unpatrolled_resume"] = "Marquée comme douteuse";


lrcParamDesc["DescMQE_CheckPage"]             = "[MarkQuestionable] Page de suivi des modifications douteuses";
lrcParamDesc["DescMQE_HideCheckPageEdits"]    = "[MarkQuestionable] Masquer les modifications faites sur la page de suivi des modifications douteuses";
lrcParamDesc["DescMQE_ActivateInDiffs"]       = "[MarkQuestionable] Activer dans les diff normaux (nécessite DiffExtension)";
lrcParamDesc["DescMQE_UnpatrolledIcon"]       = "[MarkQuestionable] Modification douteuse";
lrcParamDesc["DescMQE_UnpatrolledIcon_Title"] = "Modification douteuse";
lrcParamDesc["DescMQE_Unpatrollink_Text"]     = "Texte du lien pour marquer une modification comme douteuse";
lrcParamDesc["DescMQE_Unpatrollink_Title"]    = "Infobulle du lien pour marquer une modification comme douteuse";
lrcParamDesc["DescMQE_Patrollink_Title"]      = "Infobulle du lien pour marquer une modification comme relue"
lrcParamDesc["DescMQE_Unpatrolled_Reason"]    = "Texte de la demande de raison de vérification";
lrcParamDesc["DescMQE_Unpatrolled_pop"]       = "Confirmation du marquage d’une modification comme douteuse";
lrcParamDesc["DescMQE_Patrolled_Reason"]      = "Texte de la vérification";
lrcParamDesc["DescMQE_Unpatrolled_resume"]    = "[MarkQuestionable] Résume de modification du marquage d’une modification comme douteuse"; 
lrcParamDesc['DescDisplayliveQuestionable']   = 'Afficher le journal des modifications douteuses'; 
lrcParamDesc['DescliveQuestionableTitle']     = 'Titre de la liste de suivi des modifications douteuses';


LiveRC_addNeededMessages("markaspatrolleddiff");
LiveRC_addNeededMessages("markedaspatrolled");
 

LiveRC_Config["LimitationsRight"]["MarkQuestionable"] = "autopatrol";

 
LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"] = {
       "Values" : {},
       "DefaultState" : true
}


/* </source>
 
== Fonctions utilitaires ==
 
<source lang=javascript> */


function LRCMQE_parselink(chaine){
  if(!chaine) return "";
  var precedent;
  var reg = new RegExp("\\[\\[([^\\[\\]]+)\\|([^\\[\\]]+)\\]\\]");
  do {
    precedent = chaine;
    chaine = chaine.replace(reg, '<a href="'+mw.config.get("wgServer")+mw.config.get("wgArticlePath")+'">$2</a>');
  } while(chaine != precedent);
  reg = new RegExp("\\[\\[([^\\[\\]]+)\\]\\]");
  do {
    precedent = chaine;
    chaine = chaine.replace(reg, '<a href="'+mw.config.get("wgServer")+mw.config.get("wgArticlePath")+'">$1</a>');
  } while(chaine != precedent);
  return chaine;
}

/* </source>
 
== Vérification initiale du statut d'un diff ==
 
<source lang=javascript> */

function LRCMQE_Init() {
  if(!lrcUserCan("MarkQuestionable")) return;
  var DivTitle = document.getElementById('mw-diff-ntitle1');
  if(!DivTitle) return;
  var link = DivTitle.getElementsByTagName('a')[0];
  if(!link) return;
  var oldid = lrcGetArgFromURL(link.href, "oldid");
  var pagetitle = lrcGetArgFromURL(link.href, "title").replace(/_/g, " ");
  var CheckPage = lrcMakeParam("MQE_CheckPage");
  var URL = lrcGetAPIURL({format:'xml',action:'query',prop:'revisions',rvlimit:1,rvprop:'content',titles:CheckPage,continue:""});
  wpajax.http({url: URL, onSuccess: LRCMQE_CheckPatrolStatus, oldid:oldid, pagetitle:pagetitle});
}


function LRCMQE_CheckPatrolStatus(Req, data){
  var oldid = data.oldid;
  var FoundOldid = false;
  var comment = "";
  var ObjXML = Req.responseXML;
  var R = ObjXML.getElementsByTagName('rev')[0];
  if(R){
    var wikicode = (R.firstChild ? R.firstChild.nodeValue : "");
    if(wikicode){
      var pattern = new RegExp("\\* ?\\[\\[Sp(é|e)cial:Diff\\/"+oldid+"\\|[^\\[\\]]+\\]\\]");
      if(pattern.test(wikicode)){
        var lines = wikicode.split('\n');
        for(var i=0,l=lines.length; i<l;i++){
          if(pattern.test(lines[i])){
            FoundOldid = true;
            comment = lines[i].replace(pattern, "");          
            break;
          }
        }
      }
    }
  }
  LRCMQE_UpdatePatrolLink(oldid, data.pagetitle, FoundOldid, comment);
}

function LRCMQE_UpdatePatrolLink(oldid, pagetitle, FoundOldid, comment){
  var TargetDiv = document.getElementById('mw-diff-ntitle4');
  var span = document.createElement('span');
  span.className = "unpatrollink";
  span.appendChild(document.createTextNode("["));
  if(FoundOldid===true){
    var imagespan = document.createElement('span');
    imagespan.id = "unpatrollink";
    imagespan.innerHTML = lrcMakeIcon("MQE_UnpatrolledIcon", {after:" "}) + LRCMQE_parselink(comment);
    span.appendChild(imagespan);
  }else{
    var link = document.createElement('a');
    link.id = "unpatrollink";
    link.style.color = "darkgreen";
    link.style.cursor = "pointer";
    link.href= "javascript:;";
    link.onclick = function(){ LRCMQE_MarkUnPatrolled(oldid, pagetitle); return false; }
    link.innerHTML = lrcMakeText("MQE_Unpatrollink_Text");
    link.title = lrcMakeText("MQE_Unpatrollink_Title");
    span.appendChild(link);
  }
  span.appendChild(document.createTextNode("]"));
  var patrollink = lrcGetElementsByClass('patrollink',TargetDiv,null)[0]; 
  if(patrollink){
    patrollink.parentNode.insertBefore(document.createElement('br'), patrollink);
    var patrollink = patrollink.getElementsByTagName('a')[0];
    patrollink.id = "patrollink"
    patrollink.style.color = "darkgreen";
    patrollink.title = lrcMakeText("MQE_Patrollink_Title");
    patrollink.onclick = function(){ lrcPatrolEdit(this); LRCMQE_MarkPatrolled(oldid, pagetitle); return false; }
  }else if(FoundOldid===true){
    var patrolspan = document.createElement('span');
    patrolspan.className = 'patrollink';
    var newpatrollink = document.createElement('a');
    newpatrollink.innerHTML = lrcGetMediawikiMessage("markaspatrolleddiff", true);
    newpatrollink.title = lrcMakeText("MQE_Patrollink_Title");
    newpatrollink.onclick = function(){ LRCMQE_MarkPatrolled(oldid, pagetitle); return false; }
    newpatrollink.id = "patrollink";
    newpatrollink.style.color = "darkgreen";
    newpatrollink.style.cursor = "pointer";
    patrolspan.appendChild(document.createTextNode("["));
    patrolspan.appendChild(newpatrollink);
    patrolspan.appendChild(document.createTextNode("]"));
    TargetDiv.appendChild(document.createElement('br'));
    TargetDiv.appendChild(patrolspan);
  }else{
    TargetDiv.appendChild(document.createElement('br'));
  }
  TargetDiv.appendChild(span);
}


/* </source>
 
== Marquer comme douteuse ==
 
<source lang=javascript> */

function LRCMQE_MarkUnPatrolled(oldid, pagetitle){
  var CheckPage = lrcMakeParam("MQE_CheckPage");
  wpajax.http({ url: lrcGetAPIURL({format:'xml',action:'query',prop:'info',meta:'tokens',type:'csrf',inprop:'protection',titles:CheckPage}),
                onSuccess: LRCMQE_MarkUnPatrolled_gettoken,
                oldid:oldid,
                page:CheckPage,
                pagetitle:pagetitle
  });
}

function LRCMQE_MarkUnPatrolled_gettoken(Req, data){
  var ObjetXML = Req.responseXML;
  var Isprotected = false;
  var PR = ObjetXML.getElementsByTagName("pr");
  for(var a=0,l=PR.length;a<l;a++){
    var Type = PR[a].getAttribute("type");
    var Level = PR[a].getAttribute("level");
    if(Type=="edit" && !lrcUserHasGroup(Level)) Isprotected = true;
  }
  if(Isprotected){
    LiveRC_alert("<b>"+lrcMakeText("PROTECTEDPAGE").split("$1").join(page)+"</b>");
    return;
  }
  function LRCMQE_MarkUnPatrolled_getrawtext(comment){
    var CheckPage = lrcMakeParam("MQE_CheckPage");
    wpajax.http({ url: lrcGetUglyPageURL(CheckPage, "&action=raw"),
                onSuccess: LRCMQE_MarkUnPatrolled_adddiff,
                page:data.page,
                oldid:data.oldid,
                token:ObjetXML.getElementsByTagName('tokens')[0].getAttribute('csrftoken'),
                comment:comment,
                pagetitle:data.pagetitle
    });
  }
  LiveRC_prompt(lrcMakeText("MQE_Unpatrolled_Reason"), LRCMQE_MarkUnPatrolled_getrawtext);

}

function LRCMQE_MarkUnPatrolled_adddiff(Req, data){
  var page = data.page;
  var oldid = data.oldid;
  var pagetitle = data.pagetitle
  var token = data.token
  var wikicode = Req.responseText;
  var comment = data.comment;
  var newline = "* [[Special:Diff/"+oldid+"|"+data.pagetitle+" <small>(oldid="+oldid+")</small>]] : "+comment;
  var newwikicode = wikicode + "\n" + newline;
  var EditParam = {};  
  EditParam["text"] = newwikicode;
  EditParam["summary"] = lrcMakeText("RESUMESTART") + "[[Special:Diff/"+oldid+"|"+pagetitle+"]] = " +lrcMakeText("MQE_Unpatrolled_resume") + " ("+comment+")";
  EditParam["minor"] = "1";
  EditParam["title"] = page;
  EditParam["watchlist"] = "preferences";
  if(lrcMakeParam("BypassWatchdefault")) EditParam["watchlist"] = "nochange";
  EditParam["token"] = token;
  var Params = [];
  for(var Param in EditParam){
    Params.push(Param+"="+encodeURIComponent(EditParam[Param]));
  }
  Params = Params.join("&");
  var headers = {'Content-Type':'application/x-www-form-urlencoded'};
  wpajax.http({ url: lrcGetAPIURL('action=edit'),
                method: "POST", headers: headers,
                data: Params,
                onSuccess: LRCMQE_MarkUnPatrolled_proceed,
                params:EditParam,
                oldid:oldid,
                comment:comment,
                pagetitle:pagetitle
  });
}

function LRCMQE_MarkUnPatrolled_proceed(Req, data){
  var oldid = data.oldid
  var text = "<b>"+LRCMQE_parselink("[[Special:Diff/"+oldid+"]]") +" : "+ lrcMakeText("MQE_Unpatrolled_pop")+ "</b> <small>("+data.comment+")</small>";
  LiveRC_alert(text);
  LRCMQE_MarkUnPatrolled_updatelinks(oldid, data.pagetitle, data.comment);
}
  
function LRCMQE_MarkUnPatrolled_updatelinks(oldid, pagetitle, comment){
  var unpatrollink = document.getElementById('unpatrollink');
  var unpatrolspan = unpatrollink.parentNode;
  var imagespan = document.createElement('span');
  imagespan.id = "unpatrollink";
  imagespan.innerHTML = lrcMakeIcon("MQE_UnpatrolledIcon", {after:" "}) + LRCMQE_parselink(comment);
  unpatrolspan.insertBefore(imagespan, unpatrollink);
  unpatrolspan.removeChild(unpatrollink);
  var patrollink = document.getElementById('patrollink');
  if(patrollink){
    patrollink.parentNode.style.display = "";
  }else{
    var patrolspan = document.createElement('span');
    patrolspan.className = 'patrollink';
    var newpatrollink = document.createElement('a');
    newpatrollink.innerHTML = lrcGetMediawikiMessage("markaspatrolleddiff", true);
    newpatrollink.title = lrcMakeText("MQE_Patrollink_Title");
    newpatrollink.onclick = function(){ LRCMQE_MarkPatrolled(oldid, pagetitle); return false; }
    newpatrollink.id = "patrollink"
    newpatrollink.style.color = "darkgreen";
    newpatrollink.style.cursor = "pointer";
    patrolspan.appendChild(document.createTextNode("["));
    patrolspan.appendChild(newpatrollink);
    patrolspan.appendChild(document.createTextNode("]"));
    unpatrolspan.parentNode.insertBefore(patrolspan, unpatrolspan);
  }
}

/* </source>
 
== Marquer comme relue ==
 
<source lang=javascript> */


function LRCMQE_MarkPatrolled(oldid, pagetitle){
  var CheckPage = lrcMakeParam("MQE_CheckPage");
  wpajax.http({ url: lrcGetAPIURL({format:'xml',action:'query',prop:'info',meta:'tokens',type:'csrf',inprop:'protection',titles:CheckPage}),
                onSuccess: LRCMQE_MarkPatrolled_gettoken,
                oldid:oldid,
                page:CheckPage,
                pagetitle:pagetitle
  });
}

function LRCMQE_MarkPatrolled_gettoken(Req, data){
  var ObjetXML = Req.responseXML;
  var Isprotected = false;
  var PR = ObjetXML.getElementsByTagName("pr");
  for(var a=0,l=PR.length;a<l;a++){
    var Type = PR[a].getAttribute("type");
    var Level = PR[a].getAttribute("level");
    if(Type=="edit" && !lrcUserHasGroup(Level)) Isprotected = true;
  }
  if(Isprotected){
    LiveRC_alert("<b>"+lrcMakeText("PROTECTEDPAGE").split("$1").join(page)+"</b>");
    return;
  }
  function LRCMQE_MarkPatrolled_getrawtext(comment){
    var CheckPage = lrcMakeParam("MQE_CheckPage");
    wpajax.http({ url: lrcGetUglyPageURL(CheckPage, "&action=raw"),
                  onSuccess: LRCMQE_MarkPatrolled_deletediff,
                  page:data.page,
                  oldid:data.oldid,
                  token:ObjetXML.getElementsByTagName('tokens')[0].getAttribute('csrftoken'),
                  comment:comment,
                  pagetitle:data.pagetitle
    });
  }
  LiveRC_prompt(lrcMakeText("MQE_Patrolled_Reason"), LRCMQE_MarkPatrolled_getrawtext);
}

function LRCMQE_MarkPatrolled_deletediff(Req, data){
  var page = data.page;
  var oldid = data.oldid;
  var pagetitle = data.pagetitle;
  var token = data.token
  var comment = data.comment;
  var wikicode = Req.responseText;
  var newwikicode = [];
  var pattern = new RegExp("\\* ?\\[\\[Sp(é|e)cial:Diff\\/"+oldid+"\\|[^\\[\\]]+\\]\\]");
  var lines = wikicode.split('\n');
  for(var i=0,l=lines.length; i<l;i++){
    if(!pattern.test(lines[i])){
      newwikicode.push(lines[i]); 
    }
  }
  newwikicode = newwikicode.join("\n");
  var EditParam = {};  
  EditParam["text"] = newwikicode;
  EditParam["summary"] = lrcMakeText("RESUMESTART") + "[[Special:Diff/"+oldid+"|"+pagetitle+"]] = " +lrcGetMediawikiMessage("markedaspatrolled") + " ("+comment+")";
  EditParam["minor"] = "1";
  EditParam["title"] = page;
  EditParam["watchlist"] = "preferences";
  if(lrcMakeParam("BypassWatchdefault")) EditParam["watchlist"] = "nochange";
  EditParam["token"] = token;
  var Params = [];
  for(var Param in EditParam){
    Params.push(Param+"="+encodeURIComponent(EditParam[Param]));
  }
  Params = Params.join("&");
  var headers = {'Content-Type':'application/x-www-form-urlencoded'};
  wpajax.http({ url: lrcGetAPIURL('action=edit'),
                method: "POST", headers: headers,
                data: Params,
                onSuccess: LRCMQE_MarkPatrolled_proceed,
                params:EditParam,
                oldid:oldid,
                comment:comment,
                pagetitle:pagetitle
  });
}

function LRCMQE_MarkPatrolled_proceed(Req, data){
  var oldid = data.oldid
  var text = "<b>"+LRCMQE_parselink("[[Special:Diff/"+oldid+"]]") +" : "+ lrcGetMediawikiMessage("markedaspatrolled", true) + "</b> <small>("+data.comment+")</small>";
  LiveRC_alert(text);
  LRCMQE_MarkPatrolled_updatelinks(oldid, data.pagetitle);
}

function LRCMQE_MarkPatrolled_updatelinks(oldid, pagetitle){
  var patrollink = document.getElementById('patrollink');
  patrollink.parentNode.style.display = "none";
  var unpatrollink = document.getElementById('unpatrollink');
  var unpatrolspan = unpatrollink.parentNode;
  var link = document.createElement('a');
  link.id = "unpatrollink";
  link.href= "javascript:;";
  link.onclick = function(){ LRCMQE_MarkUnPatrolled(oldid, pagetitle); return false; }
  link.innerHTML = lrcMakeText("MQE_Unpatrollink_Text");
  link.title = lrcMakeText("MQE_Unpatrollink_Title");
  link.style.color = "darkgreen";
  unpatrolspan.insertBefore(link, unpatrollink);
  unpatrolspan.removeChild(unpatrollink);
}


/* </source>
 
== Gestion d'une modif "MarkQuestionable" dans la table RC de LiveRC ==
 
<source lang=javascript> */

function LRCMQE_AfterRC(Args){
  var TRid = Args.id;
  var TR = document.getElementById(TRid);
  var rc = Args.rc;
  var title = rc.title;
  var state = rc.state;
  if( lrcHasState(state, "EXTERNAL") || lrcHasState(state, "LOG") || title !== lrcMakeParam("MQE_CheckPage")) return;
  if(lrcMakeParam("DescMQE_HideCheckPageEdits") && TR) TR.parentNode.removeChild(TR);
  LRCMQE_getEditTR(rc);
}

function LRCMQE_getEditTR(rc){
  var allquestionnablevars = LRCMQE_getInfosFromComment(rc.comment);
  if(!allquestionnablevars) return;
  var questionnable = allquestionnablevars.questionnable;
  var oldid = allquestionnablevars.oldid;
  var pagetitle = allquestionnablevars.pagetitle;
  var patrolcomment = allquestionnablevars.patrolcomment;
  var TRs = document.getElementById("tabRC").getElementsByTagName("tr");
  for(var a=0,l=TRs.length;a<l;a++){
    var TR = TRs[a];
    var id = TR.id;
    if(id.match(new RegExp("\d*_"+oldid))!==null){
      if(questionnable){
        lrcAddClass(TR, "RcQuestionable");
        LRCMQE_addQuestionnableIcon(TR, patrolcomment);
      }else{
        lrcRemoveClass(TR, "RcQuestionable");
        LRCMQE_removeQuestionnableIcon(TR);
      }
    }
  }
}

function LRCMQE_addQuestionnableIcon(TR, patrolcomment){
  var DiffLink = lrcGetElementsByClass("diffDiffLink", TR, "a")[0];
  if(!DiffLink) return;
  var ParentSpan = DiffLink.parentNode;
  var Span = document.createElement('span');
  Span.className = "UnpatrolledIcon";
  Span.innerHTML = lrcMakeIcon("MQE_UnpatrolledIcon", {after:" "})
  ParentSpan.insertBefore(Span,DiffLink);
  var IMG = Span.getElementsByTagName('img')[0];
  if(IMG) IMG.title = IMG.title + " (" + patrolcomment + ")";
}

function LRCMQE_removeQuestionnableIcon(TR){
  var UnpatrolledIcon = lrcGetElementsByClass("UnpatrolledIcon", TR, "span")[0];
  if(UnpatrolledIcon) UnpatrolledIcon.parentNode.removeChild(UnpatrolledIcon);
}

/* </source>
 
== Mise en place de la liste de suivi des modifs douteuses ==
 
<source lang=javascript> */

function LRCMQE_AfterSpecialLogList(){
  lrcAddSpecialLogList("liveQuestionable", true, false);
}

/* </source>
 
=== Mise à jour de la liste de suivi des modifs douteuses ===
 
<source lang=javascript> */

function LRCMQE_getInfosFromComment(comment){
  var allquestionnablevars = false;
  var difflinkpattern = new RegExp("\\[\\[Special:Diff[^\\|]*\\|[^\\]]*\\]\\]", "g");
  var difflink = comment.match(difflinkpattern);
  if(difflink !== null){
    var wikitextlink = difflink[0];
    var oldid = wikitextlink.split("[[Special:Diff/").join("");
    oldid = oldid.replace(/\|.*/g, "");
    var pagetitle = wikitextlink.split("[[Special:Diff/"+oldid+"|").join("").split("]]").join("");
    var questionnable = (comment.indexOf(lrcGetMediawikiMessage("markedaspatrolled")) === -1);
    var patrolcomment = comment.split(wikitextlink)[1];
    if(questionnable)   patrolcomment = patrolcomment.split(lrcMakeText("MQE_Unpatrolled_resume"))[1];
    else patrolcomment = patrolcomment.split(lrcGetMediawikiMessage("markedaspatrolled"))[1];
    patrolcomment = patrolcomment.replace(/ *\(/g, "").replace(/\)$/, "");
    allquestionnablevars = {questionnable:questionnable,oldid:oldid,pagetitle:pagetitle,patrolcomment:patrolcomment};
  }
  return allquestionnablevars;
}

function LRCMQE_AfterSpecialLogListUpdated(Args){
  var TRid = Args.id;
  var TR = document.getElementById(TRid);
  var rc = Args.rc;
  var timestamp = rc.timestamp;
  var title = rc.title;
  var state = rc.state;
  var comment = rc.comment;
  if( lrcHasState(state, "EXTERNAL") || lrcHasState(state, "LOG") || title !== lrcMakeParam("MQE_CheckPage")) return;
  var allquestionnablevars = LRCMQE_getInfosFromComment(comment);
  if(allquestionnablevars){
    var questionnable = allquestionnablevars.questionnable;
    var oldid = allquestionnablevars.oldid;
    var pagetitle = allquestionnablevars.pagetitle;
    var patrolcomment = allquestionnablevars.patrolcomment;
    if(questionnable){ // add diff to the list)
      rc.questionableargs = allquestionnablevars;   
      if(!LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle]){
        LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle] = {};
        LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle].edits = [];
      }
      LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle].ts = timestamp;
      lrcSubFollowAddItem("liveQuestionable", pagetitle, rc);
    }else{
      var pageitem = LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle];
      if(pageitem){
        var rcList = LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle]["edits"];
        if(rcList.length!==0){
          for(var a=0,l=rcList.length;a<l;a++){
            var ThisQuestionnable = rcList[a].questionableargs;
            if(ThisQuestionnable.oldid !== oldid) continue;
            LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle]["edits"].splice(a,1);
          }
          if(LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][pagetitle]["edits"].length===0)
            lrcSubFollowDelete("liveQuestionable", pagetitle);
        }
      }
    }
    LRCMQE_AfterAllSpecialLogListUpdated();
  }
}

function LRCMQE_AfterAllSpecialLogListUpdated(){
  lrcDisplayDebug("Update list (liveQuestionable)");
  var tempAr = [];
  for(var title in LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"]){
    if(!LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"].hasOwnProperty(title)) continue;
    if(LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][title].edits.length === 0) continue;
    var timestamp = LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"][title].ts;
    var Line = document.createElement('li');
    Line.id = 'questionable-' + timestamp;
    var TS = document.createElement('span');
    TS.innerHTML = getTimeTag(timestamp);
    var uremove = document.createElement('a');
    uremove.className = "hidelineLink";
    uremove.href = "javascript:;";
    uremove.title = lrcMakeText("HIDE_THIS");
    uremove.onclick = function(){ lrcSubFollowDelete("liveQuestionable", title, LRCMQE_AfterAllSpecialLogListUpdated); };
    uremove.innerHTML = 'x';
    var watchbutton = document.createTextNode(' · ');
    if(lrcGetFlowStatusForAction(title, "watch")) watchbutton = lrcCreateWatchPageLink(title, LiveRC_Config["SpecialLogListConfig"]["liveSuivi"]["Values"][title], 0);
    var sdelete = lrcGetDeleteLink({title:title});
    var sarti = lrcGetPageLink({title:title});
    var MoreLink  = LRCMQE_lrcGetAllQuestionable(title);
    var Small = document.createElement('small');
    Small.appendChild(uremove);
    Small.appendChild(document.createTextNode(' · '));
    Small.appendChild(TS);
    Small.appendChild(document.createTextNode(' : '));
    Small.appendChild(watchbutton);
    if(sdelete){
      Small.appendChild(document.createTextNode(' • '));
      Small.appendChild(sdelete);
    }
    Small.appendChild(document.createTextNode(' • '));
    Line.appendChild(Small);
    Line.appendChild(sarti);
    if(MoreLink) Line.appendChild(MoreLink);
    tempAr.push(Line);
  }
  tempAr = lrcSortFollow(tempAr);
  var liveQuestionable = document.getElementById('liveQuestionable');
  if(!liveQuestionable) return;
  liveQuestionable.innerHTML = "";
  var List = document.createElement('ul');
  List.className = "FollowList";
  var len = tempAr.length;
  for(var n=(tempAr.length)-1; n>=0; n--){
    if(tempAr[n]) List.appendChild(tempAr[n]);
  }
  liveQuestionable.appendChild(List);
}

function LRCMQE_lrcGetAllQuestionable(title){
  var GlobalVar = LiveRC_Config["SpecialLogListConfig"]["liveQuestionable"]["Values"];
  if(!GlobalVar[title]) return false;
  var edits = GlobalVar[title].edits;
  if(edits.length<1) return false;
  var display = ( GlobalVar[title].display ? '' : 'none');
  var SubListSpan = document.createElement('span');
  SubListSpan.appendChild(document.createTextNode(' - '+edits.length));
  var ToggleLink = document.createElement('a');
  ToggleLink.className = "FollowSublistToggleLink";
  ToggleLink.href="javascript:;";
  ToggleLink.onclick = function(){ lrcSubFollowShowHide(this, "liveQuestionable", title); };
  ToggleLink.title = lrcMakeText("FollowSublistToggleTitle");
  ToggleLink.innerHTML = '<b>±</b>';
  SubListSpan.appendChild(ToggleLink);
  var SubList = document.createElement('ul');
  SubList.className = "FollowSublist";
  SubList.style.display = display;
  SubListSpan.appendChild(SubList);
  var Lines = [];
  for(var a=0,l=edits.length;a<l;a++){
    var thisedit = edits[a];
    var questionableargs = thisedit.questionableargs;
    var Line = document.createElement('span');
    Line.innerHTML = questionableargs.oldid;
    Line.appendChild(document.createTextNode(' – '));
    var diff = document.createElement('a');
    diff.className = "lrc_PreviewLink diffDiffLink";
    diff.href = lrcGetUglyPageURL(questionableargs.pagetitle, '&diff=prev&oldid='+questionableargs.oldid+'&unhide=1');
    diff.onclick = function(){ liveDiff(questionableargs.pagetitle, "prev", questionableargs.oldid ); return false; };
    diff.title = lrcMakeText("DIFF_TIP");
    diff.innerHTML = lrcMakeText("DIFF_SHORT");
    Line.appendChild(diff);
    Line.appendChild(document.createTextNode(' : '));
    var comment = document.createElement('span');
    comment.innerHTML = '<small>'+questionableargs.patrolcomment+'</small>';
    Line.appendChild(comment);
    Lines.push(Line);
  }
  for(var a=0,l=Lines.length;a<l;a++){
    var Li = document.createElement('li');
    Li.appendChild(Lines[a]);
    SubList.appendChild(Li);
  }
  return SubListSpan;
}

/* </source>

== Hooks ==
 
<source lang=javascript> */

LiveRC_AddHook("AfterSpecialLogList", LRCMQE_AfterSpecialLogList);

LiveRC_AddHook("AfterRC", LRCMQE_AfterRC);
LiveRC_AddHook("AfterSpecialLogListUpdated", LRCMQE_AfterSpecialLogListUpdated);
LiveRC_AddHook("AfterAllSpecialLogListUpdated", LRCMQE_AfterAllSpecialLogListUpdated);

LiveRC_AddHook("AfterPreviewDiff", LRCMQE_Init);
LiveRC_AddHook("AfterDiffExtension", function(){
  if(lrcMakeParam("MQE_ActivateInDiffs")) LRCMQE_Init();
});

 
/* *************************************************************************************************************************** */
} // FIN IF
//</source>