Utilisateur:Drekenn/LiveRC.js

Un livre de Wikilivres.

Attention : Depuis MediaWiki 1.18 les pages se terminant avec l'extension .js ou .css sont interprétées comme des pages wiki ! En particulier les modèles (subst ou non) et les liens. Vous devez donc migrer le code source et effectuer vos changements en évitant ces éléments de syntaxe wiki (peu importe leurs emplacements dans le code source : commentaire, chaine) :

  • Double accolades ouvrantes (en particulier avec subst:) : séparer les deux accolades "{"+"{" du reste de la chaine
  • Double crochets ouvrants : même technique de séparation.
  • Signature (tildes ~ multiples) : même technique de séparation.

Note : après avoir enregistré vos préférences, vous devrez attendre que le serveur mette à jour la feuille de style globale avant de forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
  • Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
  • Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
  • Konqueror : Cliquez sur Actualiser ou pressez F5 ;
  • Opera : Videz le cache dans Outils → Préférences.
/*
==LiveWP==
*Documentation : [[:fr:User:EDUCA33E/LiveRC/Documentation]]
*Authors : [[:fr:User:EDUCA33E]], [[:fr:User:TiChou]] & [[:pl:User:Leafnode]]
*Version: 0.3.7 (beta)
 
Version modifiée basée sur la version du 1er avril 2007 a 00:49 :
 
http://fr.wikipedia.org/w/index.php?title=User:EDUCA33E/LiveRC.js&oldid=15525649
 
=== Variables globales ===
 
<source lang="javascript"> */
 
if (wgTitle == "EDUCA33E/LiveRC") {
 
  // Appel des parametres par défaut de LiveRC ;
  // ///////////////////////////////////////////
  document.write('<script type="text/javascript" src="' 
             + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+wgPageName+'/LiveRCparam.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
 
  // Appel des parametres utilisateur ;
  // ///////////////////////////////////////////
  document.write('<script type="text/javascript" src="' 
             + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=User:'+encodeURI(wgUserName)+'/LiveRCparam.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
 
  var cssNode = document.createElement('link');
  cssNode.type = 'text/css';
  cssNode.rel = 'stylesheet';
  cssNode.href = 'http://pl.wikipedia.org/skins-1.5/common/diff.css?90';
  cssNode.media = 'screen';
  cssNode.title = 'dynamicLoadedSheet';
  document.getElementsByTagName("head")[0].appendChild(cssNode);
 
  document.write('<script type="text/javascript" src="http://pl.wikipedia.org/skins-1.5/common/diff.js?90"></script>');
 
  var lastrevid,lasttimestamp=1; // Timestamp d'initialisation;
 
  // Découpage de l'URL et de ses parametres;
 
  var _GET = new Array();
  var _uri = location.href;
  var _temp_get_arr = _uri.substring(_uri.indexOf('?')+1, _uri.length).split("&");
  var _temp_get_arr_1 = new Array();
  for(_get_arr_i=0; _get_arr_i<_temp_get_arr.length; _get_arr_i++){
    _temp_get_arr_1 = _temp_get_arr[_get_arr_i].split("=");
    _GET[decodeURIComponent(_temp_get_arr_1[0])] = decodeURIComponent(_temp_get_arr_1[1]);
  }
  delete _uri; delete _temp_get_arr; delete _temp_get_arr_1;
 
  // Variables d'état (pour test sur rc.state);
 
  var IP          = 1;
  var BOT         = 2 << 0;
  var SYSOP       = 2 << 1;
  var NEW         = 2 << 2;
  var MINOR       = 2 << 3;
  var NEWNS       = 2 << 4;
  var RENAMED     = 2 << 5;
  var PATROLLED   = 2 << 6;
  var REVERT      = 2 << 7;
  var BLANKING    = 2 << 8;
  var REPLACED    = 2 << 9;
  var REDIRECT    = 2 << 10;
  var CATEGORIZED = 2 << 11;
  var LOCK        = 2 << 12;
  var FULLLOCK    = 2 << 13;
  var HOMONYMIE   = 2 << 14;
  var ADQ         = 2 << 15;
  var BA          = 2 << 16;
  var APDQ        = 2 << 17;
  var COPYRIGHT   = 2 << 18;
  var PAS         = 2 << 19;
  var FIRE        = 2 << 20;
 
  var lstSysop = new Array();   // Sysop list;
  var lstContact = new Array(); // Contact list;
  var lstRevoc = new Array();   // Reverted list;
  var lstHidden = new Array();  // Hidden users list;
 
  // Is user Sysop;
  var lrcAdmin = false; // default value;
  if(wgUserGroups.indexOf("sysop") != -1)
    lrcAdmin = true;
 
  // Watchlist;
  var lstSuivi = new Array();
  var lstSuiviHH = new Array();
}
 
/* </source>
 
===Utilities===
 
<source lang="javascript"> */
var wpajax = {
  http: function(bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    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)
          wpajax.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)
          xmlhttp.setRequestHeader(field,bundle.headers[field]);
      }
      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 {
      // A activer en debug mode ?
      // alert(xmlhttp.statusText);
    }
  }
};
 
// Parser
if (document.implementation.createDocument) {
  var gml_xmlparser = new DOMParser();
}
 
function gml_XMLParse(string) {
  if (document.implementation.createDocument) {
    return gml_xmlparser.parseFromString(string, "text/xml");
  } else if (window.ActiveXObject) {
    var gml_xmldoc = new ActiveXObject("Microsoft.XMLDOM");
    gml_xmldoc.async = "false";
    ret = gml_xmldoc.loadXML(string);      
    if (!ret)
      return null;
    return gml_xmldoc.documentElement;
  }
  return null;
}
 
// HTMLize
String.prototype.htmlize = function() {
  var chars = new Array('&','<','>','"');
  var entities = new Array('amp','lt','gt','quot');
  var regex = new RegExp();
  var string = this;
  for (var i=0; i<chars.length; i++) {
    regex.compile(chars[i], "g");
    string = string.replace(regex, '&' + entities[i] + ';');
  }
  return string;
}
 
/* </source>
 
=== LiveDiff ===
 
<source lang="javascript"> */
 
function liveDiff(page, id, oldid) {
  var el = document.getElementById( 'livePreviewTitle' );
  el.innerHTML="<b style='text-decoration: blink;'>Diff : <span style='color:red'>"+page+"</span>...</b>";
  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURIComponent(page)+'&diffonly=1&diff='+id+'&oldid='+oldid, 
                onSuccess: getDiff, mpage: page, mid: id, moldid:oldid});
}
 
function getDiff(xmlreq, data) {
  var doc = gml_XMLParse(xmlreq.responseText);
  var page=data.mpage;
  var oldid=data.moldid;
  var id=data.mid;
  var bC  = doc.getElementById('bodyContent');
  if (bC ==  null) bC  = doc.getElementById('article')
  var LP = document.getElementById( 'livePreview' );
  var dLP = document.getElementById( 'divLivePreview' );
  var lD = getElementsByClass('diff',bC,null);
 
  var upage=page.replace(new RegExp(/\'/g), "\\'");
 
  if (lD[0] == null)
    LP.innerHTML = bC.innerHTML;
  else {
    if (document.getElementById('showDiffR').checked) {
      var avantEl = getElementsByClass('diff-deletedline',bC,null);
      var apresEl = getElementsByClass('diff-addedline',bC,null);
      var rollback = getElementsByClass('mw-rollback-link',bC,null);
      if (rollback[0] == null)
        var rl = "";
      else
        var rl = rollback[0].innerHTML+"<br />";
      var avant = "";
      var apres = "";
      var lav = avantEl.length;
      var lap = apresEl.length;
      for(var n=0; n < lav ; n++)
        avant = avant + avantEl[n].innerHTML + "<br />";
      for(var n=0; n < lap ; n++)
        apres = apres + apresEl[n].innerHTML + "<br />";
      LP.innerHTML = rl+"<table width='100%'><tr><td width='50%' class='diff-deletedline'>"+avant+"</td><td class='diff-addedline'>"+apres+"</td></tr></table>";
    }
    else {
      LP.innerHTML = "<table border='0' width='98%' cellpadding='0' cellspacing='4' class='diff'>"+lD[0].innerHTML+"</table>";
    }
  }
  if (dLP.style.display == "none") {
    var elcb = document.getElementById( 'shidPrev' );
    elcb.checked="true";
    dLP.style.display = "inline";
  }
 
  var entete = document.getElementById( 'livePreviewTitle' );
  entete.innerHTML='<b><a href="'+wgServer + '/wiki/' + encodeURI(page) + '" target="_new">' + page + '</a></b> • ' +
  '(<a href="javascript:;" onClick="liveHist(\''+upage+'\');" style="color:darkorange">Hist</a>)';
 
  var asNextDiff = doc.getElementById("differences-nextlink");
  if(asNextDiff == null) {
    var optAvert = "";
    var optl = lstAvert.length;
    for (j=0; j<optl; j++) {
      optAvert += '<option value="'+lstAvert[j].template;
      if(lstAvert[j].hasPage) optAvert += '|'+upage;
      optAvert += '">'+lstAvert[j].string+'</option>';
    }
 
    // Get username of submitter
    var user1 = doc.getElementById( 'mw-diff-otitle2' );
    if (user1 != null) {
      var usertmp=user1.innerHTML;
      user1 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>  \(<a(.*)/g), "$2");
    }
    var user2 = doc.getElementById( 'mw-diff-ntitle2' );
    if (user2 != null) {
      var usertmp=user2.innerHTML;
      user2 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>  \(<a(.*)/g), "$2");
    }
    user1=user1.replace(new RegExp(/\'/g), "\\'");
    user2=user2.replace(new RegExp(/\'/g), "\\'");
 
    entete.innerHTML = '<table width="100%" class="creator"><tr><td>' + entete.innerHTML + 
    '</td><td align="right"><small>' +
    // Verifier avant si le patrouilleur peut modifier cette page ? (query.php?what=permissions&titles=page)
    '[<a id="LiveRevertLink" href="javascript:getLiveMessage(\'liverevert\',\''+user1+'\',\''+user2+'\',\''+upage+'\',\''+oldid+'\');" >' + lang_menu[0].UNDORC+'</a>] • ' +
    lang_menu[0].REASON+' : <input id="LiveRevertMessage" /> ••• ' +
    '[<a id="LiveAvertoLink" href="javascript:getLiveAverto(\''+user2+'\');">'+lang_menu[0].AVERTS+'</a>] : ' +
    '<select id="averto">' + optAvert + '</select>' +
    '</td></tr></table>';
    document.getElementById('LiveRevertMessage').focus();
  }
}
 
function getLiveAverto(user) {
  var link = document.getElementById('LiveAvertoLink');
  link.href = "javascript:;";
  link.style.color = "silver";
  link.style.cursor = "default";
  link.style.textDecoration = "none";
  document.getElementById('averto').disabled = true;
  var message = document.getElementById('averto').value;
  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=User_Talk:' + encodeURIComponent(user) + '&action=edit',
                onSuccess: postLiveAverto,
                user: user, message: message });
}
 
function postLiveAverto(xmlreq, data) {
  var parser = new DOMParser();
  var doc = parser.parseFromString(xmlreq.responseText, 'application/xhtml+xml');
 
  var user = data.user;
  var message = data.message.replace(new RegExp(/\\'/g),"'");
 
  // Message au début
  // var wpTextbox1 = encodeURIComponent('{{subst:' + message + '}} ~~~~\n' + doc.getElementById('wpTextbox1').value);
 
  var wpTextbox1 = encodeURIComponent(doc.getElementById('wpTextbox1').value + '\n\n{{subst:' + message + '}} ~~~~\n');
 
  var inputs = doc.getElementById('editform').getElementsByTagName('input');
  var editform = new Array();
  for (i=0; i<inputs.length; i++) {
    editform[inputs[i].name] = inputs[i].value;
  }
  var wpStarttime = encodeURIComponent(editform['wpStarttime']);
  var wpEdittime = encodeURIComponent(editform['wpEdittime']);
  var wpEditToken = encodeURIComponent(editform['wpEditToken']);
 
//var wpSummary = encodeURIComponent('LiveRC : Avertissement ! ' + message.replace(new RegExp(/\|(.*)/), ' sur [[$1]]') + ' !');
  var wpSummary = encodeURIComponent('LiveRC : Warning following edits ! ' + message.replace(new RegExp(/\|(.*)/), ' on [[$1]]') + ' !');
 
  var headers = new Array();
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=User_Talk:' + encodeURI(user) + '&action=submit',
                method: "POST", headers: headers,
                data: 'wpSave=1&wpTextbox1=' + wpTextbox1 + '&wpStarttime=' + wpStarttime + '&wpEdittime=' + wpEdittime
                    + '&wpEditToken=' + wpEditToken + '&wpSummary=' + wpSummary});
}
 
function getLiveMessage(where, user1, user2, page, oldid) {
  var links = [ document.getElementById('LiveRevertLink') ];
  var i,len=links.length;
  for (i=0; i<len; i++) {
    links[i].href = "javascript:;";
    links[i].style.color = "silver";
    links[i].style.cursor = "default";
    links[i].style.textDecoration = "none";
  }
  document.getElementById('LiveRevertMessage').disabled = true;
  var message = document.getElementById('LiveRevertMessage').value;
  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + encodeURI(page) + '&action=edit&oldid=' + oldid,
                onSuccess: postLiveRevert,
                where: where, page: page, user1: user1, user2: user2, message: message });
}
 
function postLiveRevert(xmlreq, data) {
  var parser = new DOMParser();
  var doc = parser.parseFromString(xmlreq.responseText, 'application/xhtml+xml');
 
  var where = data.where;
  var page = data.page;
  var user1 = data.user1;
  var user2 = data.user2;
  var message = data.message;
 
  var wpTextbox1 = encodeURIComponent(doc.getElementById('wpTextbox1').value);
 
  var inputs = doc.getElementById('editform').getElementsByTagName('input');
  var editform = new Array();
  for (i=0; i<inputs.length; i++) {
    editform[inputs[i].name] = inputs[i].value;
  }
  var wpStarttime = encodeURIComponent(editform['wpStarttime']);
  var wpEdittime = encodeURIComponent(editform['wpEdittime']);
  var wpEditToken = encodeURIComponent(editform['wpEditToken']);
 
  switch(where) {
    case 'liverevert':
      var wpSummary = lang_menu[0].RVMES1 + ' [[Special:Contributions/' + user2 + '|' + user2
        + ']]; '+lang_menu[0].RVMES2+' [[User:' + user1 + '|' + user1 + ']]';
      break;
/*    case 'livevandalism':
      var wpSummary = 'LiveRC : Révocation de vandalisme par [[Special:Contributions/' + user2 + '|' + user2
        + ']]; retour a la version de [[User:' + user1 + '|' + user1 + ']]';
      break; */
  }
  if (message)
    wpSummary = wpSummary + ' ; ' + message;
  wpSummary = encodeURIComponent(wpSummary);
 
  var headers = new Array();
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + encodeURIComponent(page) + '&action=submit',
                method: "POST", headers: headers,
                data: 'wpSave=1&wpTextbox1=' + wpTextbox1 + '&wpStarttime=' + wpStarttime + '&wpEdittime=' + wpEdittime
                    + '&wpEditToken=' + wpEditToken + '&wpSummary=' + wpSummary});
}
 
/* </source>
 
=== LiveHist ===
 
<source lang="javascript"> */
 
function liveHist(page) {
  var el = document.getElementById( 'livePreviewTitle' );
  el.innerHTML="<b style='text-decoration: blink;'>Hist : <span style='color:red'>"+page+"</span>...</b>";
  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + encodeURIComponent(page) + '&action=history', onSuccess: getHist, message: page });
}
 
function getHist(xmlreq, data) {
  doc = gml_XMLParse(xmlreq.responseText);
  bC  = doc.getElementById('bodyContent')
  if (bC ==  null) bC  = doc.getElementById('article')
  var c=data.message;
  var LP = document.getElementById( 'livePreview' );
  var dLP = document.getElementById( 'divLivePreview' );
  LP.innerHTML = bC.innerHTML;
  if (dLP.style.display == "none") {
    var elcb = document.getElementById( 'shidPrev' );
    elcb.checked="true";
    dLP.style.display = "inline";
  }
  var elt = document.getElementById( 'livePreviewTitle' );
  elt.innerHTML='<b><a href="'+wgServer+'/wiki/'+encodeURIComponent(c)+'" target="_new">'+c+'</a></b>';
}
 
/* </source>
 
=== LiveArticle ===
 
<source lang="javascript"> */
 
function liveArticle(page) {
  var el = document.getElementById( 'livePreviewTitle' );
  el.innerHTML="<b style='text-decoration: blink;'><span style='color:red'>"+page+"</span>...</b>";
  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + encodeURIComponent(page) + '&redirect=no', onSuccess: getArticle, message: page });
}
 
function getArticle(xmlreq, data) {
  doc = gml_XMLParse(xmlreq.responseText);
  bC  = doc.getElementById('bodyContent')
  if (bC ==  null) bC  = doc.getElementById('article')
  var c=data.message;
  var LP = document.getElementById( 'livePreview' );
  var dLP = document.getElementById( 'divLivePreview' );
  LP.innerHTML = bC.innerHTML;
  if (dLP.style.display == "none") {
    var elcb = document.getElementById( 'shidPrev' );
    elcb.checked="true";
    dLP.style.display = "inline";
  }
  var elt = document.getElementById( 'livePreviewTitle' );
  elt.innerHTML='<b><a href="'+wgServer+'/wiki/'+encodeURI(c)+'" target="_new">'+c+'</a></b>';
}
 
/* </source>
 
=== LiveContrib ===
 
<source lang="javascript"> */
 
function liveContrib(user) {
  var el = document.getElementById( 'livePreviewTitle' );
  el.innerHTML="<b style='text-decoration: blink;'><span style='color:red'>"+user+"</span>...</b>";
  wpajax.http({url:wgServer + '/wiki/Special:Contributions/'+encodeURIComponent(user), 
                   onSuccess: getContrib, message: user });
}
 
function getContrib(xmlreq, data) {
  doc = gml_XMLParse(xmlreq.responseText);
  bC  = doc.getElementById('bodyContent')
  if (bC ==  null) bC  = doc.getElementById('article')
  var user=data.message;
  var LP = document.getElementById( 'livePreview' );
  var dLP = document.getElementById( 'divLivePreview' );
  LP.innerHTML = bC.innerHTML;
  if (dLP.style.display == "none") {
    var elcb = document.getElementById( 'shidPrev' );
    elcb.checked="true";
    dLP.style.display = "inline";
  }
  var utilde=user.replace(new RegExp(/\'/g), "\\'");
 
  var optAvert = "";
  var optl = lstAvert.length;
  for (j=0; j<optl; j++) {
    if(lstAvert[j].hasPage) continue;
    optAvert += '<option value="'+lstAvert[j].template+'">'+lstAvert[j].string+'</option>';
  }
 
  var entete = document.getElementById( 'livePreviewTitle' );
  entete.innerHTML='<b><a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a></b>';
  entete.innerHTML = '<table width="100%" class="creator"><tr><td>'+entete.innerHTML +
    '</td><td align="right"><small>' +
    '[<a id="LiveAvertoLink" href="javascript:var message=getLiveAverto(\''+utilde+'\');">'+lang_menu[0].AVERTS+'</a>] : ' +
    '<select id="averto">' + optAvert + '</select>' + '</td></tr></table>';
}
 
/* </source>
 
=== LiveSysop ===
 
<source lang="javascript"> */
 
function liveSysop() {
  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=Special:Listusers&limit=500&group=sysop', 
                   onSuccess: getSysop, message: "Pobieranie listy adminów" });
}
 
function getSysop(xmlreq, data) {
  var doc = gml_XMLParse(xmlreq.responseText);
  var bC  = doc.getElementById('bodyContent');
  if (bC ==  null) bC  = doc.getElementById('article')
  var lstSys = bC.getElementsByTagName( 'ul' )[ 0 ].getElementsByTagName( 'li' );
  var info="";
  var len = lstSys.length
  for(var i=0; i < len ; i++) {
    info=lstSys[i].getElementsByTagName( 'a' )[ 0 ].innerHTML;
    lstSysop.push(info);
  }
  liveNS();
}
 
function liveWatch() {
  wpajax.http({url:wgServer + '/wiki/Special:Watchlist/edit', 
                   onSuccess: getWatch, message: "Pobieranie obserwowanych" });
}
 
function getWatch(xmlreq, data) {
  var doc = gml_XMLParse(xmlreq.responseText);
  var bC  = doc.getElementById('bodyContent');
  if (bC ==  null) bC  = doc.getElementById('article')
  var info="";
  var lstUL = bC.getElementsByTagName( 'ul' );
  var lenUL = lstUL.length;
  for(var j=0; j < lenUL ; j++) {
    var lstLI = lstUL[j].getElementsByTagName( 'li' );
    var lenLI = lstLI.length;
    for(var i=0; i < lenLI ; i++) {
      info=lstLI[i].getElementsByTagName( 'input' )[ 0 ].value;
      lstSuivi.push(info);
      lstSuiviHH.push("--:--");
    }
  }
  liveRC();
}
 
/* function liveWatch() {
  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=watchlist&wllimit=500&format=xml', 
                   onSuccess: getWatch, message: "Pobieranie listy obserwowanych" });
}
 
function getWatch(xmlreq, data) {
  var a=xmlreq.responseText;
  var c=data.message;
  var i;
  // document.getElementById('debug').innerHTML = a+"<br />**************************";
  if(a.indexOf("<error")!=-1) {
    var lvSuivi = document.getElementById( 'liveSuivi' );
    lvSuivi.innerHTML = "<small>Suivi désactivé. (API.php : watchlist)</small>";
    return;
  }
  a=a.split("title=\"");
  var info="";
  for(i=a.length-1; i >= 0 ; i--) {
    info=a[i].substr(0,a[i].indexOf("\" pageid"));
    if (info == "") continue;
    lstSuivi.push(info);
    lstSuiviHH.push("--:--");
  }
  //document.getElementById('debug').innerHTML += lstSuivi;
} */
 
function liveNS() {
  wpajax.http({url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&meta=siteinfo&siprop=namespaces&format=xml', 
                   onSuccess: getNS, message: "Pobieranie nazw przestrzeni" });
}
 
function getNS(xmlreq, data) {
  var api = xmlreq.responseXML;
 
  if (api.firstChild.nodeName == "error") return;
 
  var nss = api.getElementsByTagName('query')[0].getElementsByTagName('namespaces')[0].getElementsByTagName('ns');
  var len = nss.length;
  var i;
  var id,ns;
  var options = "";
  var lstNs = new Array();
 
  for (i=0; i<len; i++) {
    id = nss[i].getAttribute('id');
    ns = nss[i].textContent;
 
    if (id < 0) continue;
    if (id == 0) ns = "Article";
 
    options += '<option value="' + id + '">' + ns + '</option>';
    lstNs.push(id);
  } 
  options = '<option value="' + lstNs.join('|') + '">*</option>' + options;
  document.getElementById('selectNS').innerHTML = '<label for="showNS0">'+lang_menu[0].NAMESP+' </label><select id="showNS0">' + options + '</select>';
 
  liveWatch();
}
 
/* </source>
 
=== LiveRC ===
 
<source lang="javascript"> */
 
function supprLigne(quelLigne) {
  var i,len;
  var tab = document.getElementById('tabRC');
  var els = new Array();
  if (quelLigne == '*')
    els = tab.getElementsByTagName('tr');
  else if (quelLigne == 'd') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'rgb(255, 250, 205)')
        els.push(_els[i]);
  } else if (quelLigne == 'r') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'rgb(255, 228, 225)')
        els.push(_els[i]);
  } else if (quelLigne == 'n') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'rgb(226, 242, 210)')
        els.push(_els[i]);
  } else
    els.push(document.getElementById(quelLigne));
  len = els.length;
  for (i=len-1; i>=0; i--)
    if (els[i] != null)
      tab.removeChild(els[i]);
}
 
function changeLigne(quelLigne) {
  var el = document.getElementById(quelLigne);
  var els1 = el.getElementsByTagName('th');
  var els2 = el.getElementsByTagName('td');
  var len = els1.length;
  for (var i=len-1; i>=0; i--)
    if (els1[i] != null)
      els1[i].style.backgroundColor = "#FFFACD";
  var len = els2.length;
  for (var i=len-1; i>=0; i--)
    if (els2[i] != null)
      els2[i].style.backgroundColor = "#FFFFE0"; 
}
 
function getElementsByClass(searchClass,node,tag) {
  var classElements = new Array();
  if ( node == null )
    node = document;
  if ( tag == null )
    tag = '*';
  var els = node.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
  for (i = 0, j = 0; i < elsLen; i++) {
    if (pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}
 
function tsToHhMm(timestamp) {
  var tz;
  var match, regex = new RegExp();
  if (lrcTZ) {
    regex.compile(/^([-+])?(\d?\d):?(\d\d)$/);
    match = regex.exec(lrcTZ);
    if (!match) {
      //livercError(lang_error.TZ);
      return 'xx:xx';
    }
    tz = match[2]*60 + match[3]*1;
    tz = match[1] == '-' ? -tz : tz;
  } else {
    var now = new Date();
    tz = -now.getTimezoneOffset();
  }
  regex.compile(/^\d\d\d\d-\d\d-\d\dT(\d\d):(\d\d):\d\dZ$/);
  match = regex.exec(timestamp);
  if (!match) {
    //livercError(lang_error.timestamp);
    return 'xx:xx';
  }
  var tt = (match[1]*60 + match[2]*1 + tz + 1440) % 1440;
  var mm = tt % 60;
  var hh = (tt - mm) / 60 % 24;
  return hh + ':' + (mm < 10 ? '0' : '') + mm;
}
 
function updateHidden() {
  var tempAr = new Array();
  for (var user in lstHidden) {
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var uremove = '<a href="javascript:;" onClick="unhideUser(\''+utilde+'\');" style="color:grey">-</a>';
    var udiscut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new">T</a>';
    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80">C</a>';
    var uadmin   = '';
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen">B</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="hidden-' + user + '"><small>' + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + '</span><br />';
    tempAr.push(ligne);
  }
  tempAr.sort();
  var lvHidden = document.getElementById('liveHidden');
  lvHidden.innerHTML = "";
  var len = tempAr.length;
  for (var n=len-1; n>=0; n--)
    lvHidden.innerHTML += tempAr[n];
}
 
function updateFollowContact() {
  var tempAr = new Array();
  for (var user in lstContact) {
    var timestamp = lstContact[user].ts;
    if (timestamp == 0) continue;
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var udiscut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new">T</a>';
    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80">C</a>';
    var uadmin   = '';
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen">B</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="contact-' + timestamp + '"><small>' + tsToHhMm(timestamp) + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + '</span><br />';
    tempAr.push(ligne);
  }
  tempAr.sort();
  var lvContact = document.getElementById('liveContact');
  lvContact.innerHTML = "";
  var len = tempAr.length;
  for (var n=len-1; n>=0; n--)
    lvContact.innerHTML += tempAr[n];
}
 
function updateFollowRevoc() {
  var tempAr = new Array();
  for (var user in lstRevoc) {
    var timestamp = lstRevoc[user].ts;
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var udiscut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new">T</a>';
    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80">C</a>';
    var uadmin   = '';
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen">B</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="revoc-' + timestamp + '"><small>' + tsToHhMm(timestamp) + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + ' (' + lstRevoc[user].nb + ' '+lang_menu[0].XTIMES+')</span><br />';
    tempAr.push(ligne);
  }
  tempAr.sort();
  var lvRevoc = document.getElementById('liveRevoc');
  lvRevoc.innerHTML = "";
  var len = tempAr.length;
  for (var n=len-1; n>=0; n--)
    lvRevoc.innerHTML += tempAr[n];
}
 
//function getRevision(xmlreq, data) {
function getRevision(rc) {
  if (document.getElementById('stopLive').checked) return;
 
//  var api = xmlreq.responseXML.getElementsByTagName('api')[0];
//
//  if (api.firstChild.nodeName == "error") return;
 
  var match, regex = new RegExp();
 
//  var rc = data.rc
  var title = rc.title;
  var pageid = rc.pageid;
  var revid = rc.revid;
  var oldid = rc.old_revid;
  var user = rc.user;
  var comment = (rc.comment ? rc.comment : "");
  var timestamp = rc.timestamp;
  var ns = rc.ns;
  var state = rc.state;
 
  regex.compile(/\'/g);
  var escTitle = title.replace(regex, "\\'");
  var escUser = user.replace(regex, "\\'");
 
//  var revisions = api.getElementsByTagName('query')[0].getElementsByTagName('pages')[0].getElementsByTagName('page')[0].getElementsByTagName('revisions')[0].getElementsByTagName('rev');
//
//  var oldsize = (state & NEW ? 0 : revisions[1].textContent.length);
//  var newsize = revisions[0].textContent.length
  var oldsize = rc.oldlen
  var newsize = rc.newlen
  var sizediff = newsize - oldsize;
 
 
  // INITIALISATION LIGNE RC //
 
  var tr1 = document.createElement('tr');
 
  var th0 = document.createElement('th');
  var th1 = document.createElement('th');
  var td2 = document.createElement('td');
  var td3 = document.createElement('td');
  var td4 = document.createElement('td');
 
 
  // SUPPR. LIGNE //
 
  th0.innerHTML = '<a href="javascript:;" onClick="supprLigne(\''+pageid+'_'+revid+'\');" style="color:red">X</a>';
 
 
  // ARTICLE //
 
  var arti = "", artiStyle = "";
  var preArti = "", postArti = "";
 
  var diff = "";
  var diffClose = "";
  if (lrcAutoCloseDiff == 1)
    diffClose='supprLigne(\''+pageid+'_'+revid+'\');';
  if (state & NEW) 
    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveArticle(\''+escTitle+'\');'+diffClose+'" style="color:green">New</a>';
  else
    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveDiff(\''+escTitle+'\','+revid+','+oldid+');'+diffClose+'" style="color:orange">Diff</a>';
  var hist = '<a href="javascript:;" onClick="liveHist(\''+escTitle+'\');" style="color:darkorange">H</a>';
  var edit = '<a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURI(escTitle)+'&action=edit" target="_new" style="color:tomato">E</a>';
  var admin = '';
  if (lrcAdmin == true) {
     admin = ' • <a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURI(escTitle)+'&action=delete" target="_new" style="color:orangered">S</a>';
  }
 
  // Disambig / Homonymie ? ;
  ///////////////////////////
  if (ns == 0 && state & HOMONYMIE) {
    artiStyle = 'color: darkorange; font-weight: bold; font-style: italic;';
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Disambig.svg/16px-Disambig.svg.png" width="16px" alt="Homonymie" /> '
  }
 
  // Page protégée ? ;
  ////////////////////
  if (state & FULLLOCK)
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Padlock-red.svg/16px-Padlock-red.svg.png" width="16px" alt="Article protégé"/> ';
  if (state & LOCK)
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Padlock-gold.svg/16px-Padlock-gold.svg.png" width="16px" alt="Article semi-protégé"/> ';
 
  // Copyright ? ;
  //////////
  if (state & COPYRIGHT)
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Copyright.svg/16px-Copyright.svg.png" width="16px" alt="Copyright" /> ';
 
  // PaS ? ;
  //////////////////
  if (state & PAS)
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Cestino_pieno_architetto_01.svg/11px-Cestino_pieno_architetto_01.svg.png" height="11px" alt="PaS" /> ';
 
  // Intervention wikipompiers ? ;
  ////////////////////////////////
  if (state & FIRE)
    preArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/FireIcon.svg/12px-FireIcon.svg.png" height="12px" alt="Intervention Wikipompiers" /> ';
 
  // Adq ? ;
  //////////
  if (state & ADQ)
    postArti += '<sup><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Fairytale_bookmark_gold.png/10px-Fairytale_bookmark_gold.png" width="10px" alt="Adq" /></sup>';
 
  // Bon article ? ;
  //////////////////
  if (state & BA)
    postArti += '<sup><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Fairytale_bookmark_silver_light.png/10px-Fairytale_bookmark_silver_light.png" width="10px" alt="Bon article" /></sup>';
 
  // Article potentiellement de qualité ? ;
  /////////////////////////////////////////
  if (state & APDQ)
    postArti += '<sup><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Fairytale_bookmark_light.png/10px-Fairytale_bookmark_light.png" width="10px" alt="Article potentiellement de qualité" /></sup>';
 
  // Article catégorisé ? ;
  /////////////////////////
  var isCategorized = "";
  if (!(state & REDIRECT)
    && !(state & HOMONYMIE)
    && ns == 0 
    && !(state & CATEGORIZED))
    postArti += '<sup style="color:crimson">(cat ?)</sup>';
 
  // Redirect ? ;
  //////////////////
  if (state & REDIRECT) {
    artiStyle = 'color: green; font-weight: bold; font-style: italic;';
    postArti += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Redirectltr.png/20px-Redirectltr.png" width="20px" alt="Redirection" />';
    postArti += '<a href="javascript:;" onClick="liveArticle(\''+rc.redirect+'\');">'+rc.redirect+'</a>';
    /* if (rc.redirect) {
      // postArti += '<a href="'+wgServer+'/wiki/'+encodeURIComponent(rc.redirect)+'" target="_new">'+rc.redirect+'</a>';
      postArti += '<a href="javascript:;" onClick="liveArticle(\''+rc.redirect+'\');">'+rc.redirect+'</a>';
    } else {
      regex.compile(/^#REDIRECT\s*\[\[(.*)\]\]/i);
      match = regex.exec(revisions[0].textContent);
      if (match) {
        // postArti += '<a style="color:red;" href="'+wgServer+'/wiki/'+encodeURIComponent(match[1])+'" target="_new">'+match[1]+'</a>';
        postArti += '<a style="color:red" href="javascript:;" onClick="liveArticle(\''+match[1]+'\');">'+match[1]+'</a>';
      } else {
        // postArti += '<a style="color:red;" href="'+mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/index.php?title='+encodeURI(title)+'&redirect=no" target="_new">/!\\</a>';
        postArti += '<a style="color:red" href="javascript:;" onClick="liveArticle(\''+title+'\');">'+title+'</a>';
      }
    } */
    // arti = '<a style="'+artiStyle+'" href="'+mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/index.php?title='+encodeURI(title)+'&redirect=no" target="_new">'+title+'</a>';
    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+title+'\');">'+title+'</a>';
  } else {
    // arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+title+'\');">'+title+'</a>';
    // arti = '<a href="#" mousebotton="right" onmousedown="window.open(\'http://fr.wikipedia.org/\')">'+title+'</a>';
    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+title+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
 
  th1.innerHTML = '<small>' + tsToHhMm(timestamp) + ' • ' + diff + ' • ' + hist + ' • ' + edit + admin + ' • </small>'
                + preArti + arti + postArti;
  th1.className="creator-title";
  th1.style.textAlign="left";
  th1.style.border="1px";
  th1.style.width="40%";
 
 
  // EDITOR //
  ////////////
  var discut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new">T</a>';
  var contrib = '<a href="javascript:;" onClick="liveContrib(\''+escUser+'\');" style="color:#43CD80">C</a>';
  var editor = "", preEditor = "";
 
  // Bot ? ;
  //////////
  if (state & BOT)
    preEditor += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Nuvola_apps_kservices.png/16px-Nuvola_apps_kservices.png" width="16px" />&nbsp;';
 
  // Sysop ? ;
  ////////////
  if (state & SYSOP)
    preEditor += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Broom_icon.svg/16px-Broom_icon.svg.png" width="16px" />&nbsp;';
 
  // Reverted ? ;
  /////////////////
  if (state & REVERT)
    preEditor += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Nuvola_actions_undo.png/16px-Nuvola_actions_undo.png" width="16px" />&nbsp;';
 
  // TOR potentiel / AOL
  var isTOR = regex.compile(/172\.\d+\.\d+\.\d+/);
  if (isTOR.test(user))
    preEditor += '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Dialog-warning.svg/16px-Dialog-warning.svg.png" width="16px" />&nbsp;';
 
  editor = '<a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
  var uadmin   = '';
  if (lrcAdmin == true) {
    uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen">B</a>';
  }
 
  var uhide = '<a href="javascript:;" onClick="supprLigne(\''+pageid+'_'+revid+'\'); hideUser(\''+ user +'\');" style="color:grey">H</a>'
 
  td2.innerHTML = '<small>' + discut + ' • ' + contrib + ' • ' + uhide + uadmin + ' • </small>'
                + preEditor + editor;
  td2.className="creator-name";
  td2.style.border = "1px";
  td2.style.width = "20%";
 
  if (lstRevoc[user]) {
    td2.style.border = "2px solid red";
    td2.innerHTML += '<sup style="color:red">(' + lstRevoc[user].nb + ' révoc)</sup>'
  }
 
  // COMMENT //
  // Remplace lien [[xxx]] par <a> ;
  var wcomment = comment.htmlize();
  regex.compile(/\[\[(([^\]\|]*)(.*?))\]\]/g);
  wcomment = wcomment.replace(regex, "<a href='"+mw.config.get('wgServer')+mw.config.get('wgScriptPath')+"/index.php?title=$2&redirect=no' target='_new'>$1</a>");
  regex.compile(/\>[^\]\|<]*\|([^\]\|<]*)</g);
  wcomment = wcomment.replace(regex, ">$1<");
 
  td3.innerHTML = "<small>" + wcomment + "</small>";
  td3.style.border = "1px";
  td3.style.width = "40%";
 
  if (state & REVERT) {
    th0.style.backgroundColor = "#FFE4E1";
    th1.style.backgroundColor = "#FFE4E1";
    td2.style.backgroundColor = "#FFE4E1";
    td3.style.backgroundColor = "#FFE4E1";
    td4.style.backgroundColor = "#FFE4E1";
    tr1.style.border = "1px solid crimson";
  }
 
  if (state & BLANKING || newsize == 0) {
    th0.style.backgroundColor = "white";
    th1.style.backgroundColor = "white";
    td2.style.backgroundColor = "white";
    td3.style.backgroundColor = "white";
    td4.style.backgroundColor = "white";
    tr1.style.border = "2px double crimson";
  }
  if (state & NEW) {
    th0.style.backgroundColor = "#e2f2d2";
    th1.style.backgroundColor = "#e2f2d2";
    td2.style.backgroundColor = "#e2f2d2";
    td3.style.backgroundColor = "#e2f2d2";
    td4.style.backgroundColor = "#e2f2d2";
    tr1.style.border = "1px solid green";
  }
 
  if (state & IP) {
    td2.style.backgroundColor = "white";
    td3.style.backgroundColor = "white";
    td4.style.backgroundColor = "white";
  }
 
  if (isTOR.test(user))
    td2.style.backgroundColor = "pink";
 
  if (state & REPLACED) {
    th0.style.backgroundColor = "pink";
    th1.style.backgroundColor = "pink";
    td2.style.backgroundColor = "pink";
    td3.style.backgroundColor = "pink";
    td4.style.backgroundColor = "pink";
    td4.innerHTML = '<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Categorie_III.svg/10px-Categorie_III.svg.png" width="10px" alt="Warning"/>';
    tr1.style.border = "2px solid crimson";
  }
 
  // CONTACT LIST //
  //////////////////
  if (lstContact[user]) {
    td2.style.border = "2px solid gold";
    td2.style.backgroundColor = "yellow";
  }
 
  if (user == wgUserName) {
    td2.style.border = "2px solid #A0B0E0";
    td2.style.backgroundColor = "#F0F8FF";
  }
 
  // DELTA SIZE //
 
  // delta de modif ;
  ///////////////////
  var txtdiff = "";
  if (sizediff < 0) 
    txtdiff = '<sub style="color:red">'+sizediff+'</sub>';
  else if (sizediff == 0)
    txtdiff = '<small style="color:purple">='+sizediff+'</small>';
  else
    txtdiff = '<sup style="color:blue">+'+sizediff+'</sup>';
  td4.innerHTML += txtdiff;
  td4.style.border = "1px";
  td4.style.textAlign = "right";
 
 
  // ASSEMBLAGE LIGNE //
 
  tr1.appendChild(th0);
  tr1.appendChild(th1);
  tr1.appendChild(td2);
  tr1.appendChild(td3);
  tr1.appendChild(td4);
  tr1.id = pageid+"_"+revid;
 
  var tab = document.getElementById( 'tabRC' );
  var elold = document.getElementById(pageid+"_"+oldid);
 
  if (tab.firstChild != null)
    tab.insertBefore(tr1, tab.firstChild);
  else
    tab.appendChild(tr1);
  if (elold == null) {
    if (tab.childNodes.length > lrcRCLimit) {
      var idt = tab.lastChild.id;
      supprLigne(idt);
    }
  } else {
    supprLigne(pageid+"_"+oldid);
  }
 
 
  // MISE A JOUR LISTES //
 
  var spos = lstSuivi.indexOf(title);
  if(spos != -1) {
    th0.style.border = "2px solid gold";
    th0.style.backgroundColor = "yellow";
    th1.style.border = "2px solid gold";
    th1.style.backgroundColor = "yellow";
    lstSuiviHH[spos] = tsToHhMm(timestamp);
    var tempsAr = new Array();
    var len = lstSuivi.length;
    for (var n = 0; n < len; n++) {
      if(lstSuiviHH[n] == "--:--") continue;
      var cstilde = lstSuivi[n].replace(new RegExp(/\'/g), "\\'");
      var sdiff = '<a href="javascript:;" onClick="liveDiff(\''+cstilde+'\','+revid+','+oldid+');" style="color:orange">Diff</a>';
      var shist = '<a href="javascript:;" onClick="liveHist(\''+cstilde+'\');" style="color:darkorange">H</a>';
      var sarti = '<a href="javascript:;" onClick="liveArticle(\''+cstilde+'\');">'+lstSuivi[n]+'</a>';
      var ligne='<small>' + lstSuiviHH[n] + ' • ' + sdiff + ' • ' + shist + ' • </small>' + sarti +'<br />';
      tempsAr.push(ligne);
    }
    tempsAr.sort();
    len = tempsAr.length;
    var lvSuivi = document.getElementById( 'liveSuivi' );
    lvSuivi.innerHTML = "";
    for (var n=len-1; n >= 0; n--)
      lvSuivi.innerHTML = lvSuivi.innerHTML + tempsAr[n];
  }
 
 
  if (lstContact[user]) {
    lstContact[user].ts = timestamp;
    updateFollowContact();
  }
 
  if (state & REVERT) {
    regex.compile(/\[\[Special:Contributions\/([^\]\|]+)/);
    match = regex.exec(comment);
 
    if (!match) {
		regex.compile(/\[\[Specjalna:Wkład\/([^\]\|]+)/);
		match = regex.exec(comment);
    }
 
    if (match) {
      var userR = match[1];
      if (userR != user && userR != wgUserName) {
        if (!lstRevoc[userR]) lstRevoc[userR] = { ts: 0, nb: 0 };
        lstRevoc[userR].ts = timestamp;
        lstRevoc[userR].nb += 1;
        updateFollowRevoc();
      }
    }
  }
}
 
function getRedirCat(xmlreq, data) {
  if (document.getElementById('stopLive').checked) return;
 
  var yurik = xmlreq.responseXML.getElementsByTagName('yurik')[0];
 
  if (yurik.firstChild.nodeName == "error") return;
 
  var rc = data.rc;
  var pageid = rc.pageid;
  var revid = rc.revid;
  var state = rc.state;
 
  var page = yurik.getElementsByTagName('pages')[0].getElementsByTagName('page')[0];
 
  if (page.getElementsByTagName('redirect').length) {
    state += REDIRECT;
    if (page.getElementsByTagName('redirect')[0].getElementsByTagName('to').length)
      rc.redirect = page.getElementsByTagName('redirect')[0].getElementsByTagName('to')[0].textContent;
  }
 
  if (page.getElementsByTagName('categories').length) {
    state += CATEGORIZED;
 
    var categories = page.getElementsByTagName('categories')[0].getElementsByTagName('cl');
    var i,j;
    var leni = categories.length;
    var lenj = categoriestests.length;
 
    for (i=0; i<leni; i++)
      for (j=0; j<lenj; j++)
        if (new RegExp(lang_category+categoriestests[j].regex, "i").test(categories[i].textContent))
          state += categoriestests[j].state;
  }
 
  rc.state = state;
 
  getRevision(rc);
//  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&prop=revisions&pageids=' + pageid + '&rvstartid=' + revid + '&rvlimit=1&rvprop=content&format=xml', 
//                onSuccess: getRevision, rc: rc });
}
 
function getRC(xmlreq, data) {
  if (document.getElementById('stopLive').checked) return;
 
  var api = xmlreq.responseXML.getElementsByTagName('api')[0];
 
  if (api.firstChild.nodeName == "error") return;
 
  var rcs = api.getElementsByTagName('query')[0].getElementsByTagName('recentchanges')[0].getElementsByTagName('rc');
  var i,j,leni,lenj,rc;
 
  leni=rcs.length;
  for (i=leni-1; i>=0; i--) {
    if (rcs[i].getAttribute('revid') <= lastrevid) continue;
 
    rc = new Object();
    rc.state = 0;
 
    lenj = rcs[i].attributes.length;
    for (j=0; j<lenj; j++) {
      switch(rcs[i].attributes[j].name) {
        case 'anon':
          rc.state += IP;
          break;
        case 'bot':
          rc.state += BOT;
          break;
        case 'new':
          rc.state += NEW;
          break;
        case 'minor':
          rc.state += MINOR;
          break;
        case 'new_ns':
          rc.state += NEWNS;
          break;
        case 'new_title':
          rc.state += RENAMED;
          break;
        case 'patrolled':
          rc.state += PATROLLED;
          break;
        case 'type':
          break;
        default:
          rc[rcs[i].attributes[j].name] = rcs[i].attributes[j].value;
          break;
      }
    }
 
    if (typeof(rc.comment) != "undefined") {
      lenj = commenttests.length;
      for (j=0; j<lenj; j++)
        if (new RegExp(commenttests[j].regex).test(rc.comment))
          rc.state += commenttests[j].state;
    }
 
    if (lstSysop.indexOf(rc.user) != -1)
      rc.state += SYSOP;
 
    var mitigating = (rc.state & REVERT)
      || (rc.state & BLANKING)
      || (rc.state & REPLACED)
      || (lstContact[rc.user])
      || (lstRevoc[rc.user])
      || (rc.user == wgUserName);
 
    if (document.getElementById('showIP').checked
      && !(rc.state & IP)
      && !mitigating ) continue;
 
    if (lstHidden[rc.user] && !mitigating) continue;
 
    wpajax.http({url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/query.php?titles=' + encodeURIComponent(rc.title) + '&what=redirects|categories&format=xml',
                 onSuccess: getRedirCat, rc: rc });
  } 
 
  lastrevid = rcs[0].getAttribute('revid');
  lasttimestamp = rcs[0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");
  document.getElementById('tsInit').innerHTML = "Last situation : " + lasttimestamp;
}
 
function liveRC() {
  var refresh = 10;
  timer= setTimeout("liveRC()",refresh*1000);
 
  if (document.getElementById('stopLive').checked) return;
 
  var rcns = document.getElementById('showNS0').value;
  if (rcns == null) return;
  var rcshow = "";
  if (document.getElementById('showBot').checked) rcshow = '&rcshow=!bot';
 
  wpajax.http({url:wgServer + wgScriptPath
    + '/api.php?action=query&list=recentchanges|logevents&rcnamespace=' + rcns
    + '&rcprop=user|comment|flags|timestamp|title|ids|sizes' + rcshow
    + '&rcend=' + lasttimestamp + '&rclimit=' + lrcRCLimit
    + '&leend=' + lasttimestamp + '&lelimit=' + lrcRCLimit
    + '&format=xml',
    onSuccess: getRC, message: "Traitement en cours...\n\n" });
}   
 
function hideUser(name) {
   lstHidden[name] = true;
   updateHidden();
}
 
function unhideUser(name) {
   delete lstHidden[name];
   updateHidden();
}
 
function showHideObj(parent, fils) {
  var ofils = document.getElementById( fils );
  if (parent.checked)
    ofils.style.display="inline";
  else
    ofils.style.display="none";
}
 
$(function () {
  if (wgTitle == "EDUCA33E/LiveRC") {
 
    var top        = document.getElementById( 'top' );
    if (top != null) {
        top.innerHTML = "";
        top.style.display = "none";
    }
    var siteSub    = document.getElementById( 'siteSub' );
    var contentSub = document.getElementById( 'contentSub' );
    var rtb        = document.getElementById( 'RealTitleBanner' );
    var rt         = document.getElementById( 'RealTitle' );
    var pca        = document.getElementById( 'p-cactions' );
 
 
    if (siteSub != null) siteSub.style.display = "none";
    if (contentSub != null) contentSub.style.display = "none";
    if (rtb != null) rtb.style.display = "none";
    if (rt != null) rt.style.display = "none";
    if (pca != null) pca.style.display = "none";
 
    var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );
    lvPreviewFoot.innerHTML = '<a href="javascript:;" onClick="supprLigne(\'*\');" style="color: red; font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'d\');" style="color: rgb(255, 235, 71); font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'r\');" style="color: rgb(255, 99, 83); font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'n\');" style="color: rgb(178, 243, 113); font-weight: bold;">X</a>' +
      '<input id="stopLive"  type="checkbox" value="true" />' +
      '<label for="stopLive">' + lang_menu[0].PAUSE   + '</label>' +
      '<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'divLivePreview\');" />' +
      '<label for="shidPrev">' + lang_menu[0].PREVIEW + '</label>' +
      '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />' +
      '<label for="shidList">' + lang_menu[0].LISTS   + '</label>' +
      '<input id="showDiffR" type="checkbox" />' +
      '<label for="showDiffR">'+ lang_menu[0].LOWDIFF + '</label>' +
      '<input id="shidRC"    type="checkbox" checked onclick="showHideObj(this, \'divTabRC\');" />' +
      '<label for="shidRC">'   + lang_menu[0].RCLABEL + '</label>' +
      '<input id="showBot"   type="checkbox" checked />' +
      '<label for="showBot">'  + lang_menu[0].NOBOTS  + '</label>' + 
      '<input id="showIP"    type="checkbox" />' +
      '<label for="showIP">'   + lang_menu[0].IPONLY  + ' • </label>' +
      '<span id="selectNS" />';
    if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;
 
    var _lstContact = lstContact;
    var _len = lstContact.length;
    lstContact = new Array();
    for (var _i=0; _i<_len; _i++)
      lstContact[_lstContact[_i]] = { ts: 0 };
 
    // Main
    liveSysop();
  }
});
 
/* </source> */