From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

/*

==LiveWP==

*Documentation : [[:fr:User:EDUCA33E/LiveRC/Documentation]]

*Author : [[:fr:User:EDUCA33E]]

*Dev & enhancements : [[:fr:User:TiChou]], [[:pl:User:Leafnode]], [[:it:User:Jalo]] & [[:fr:User:Nakor]] & [[:fr:User:Arkanosis]]

*Version: 0.3.9 (beta)



=== Variables globales ===



<source lang="javascript"> */



if (wgTitle == "EDUCA33E/LiveRC") {



  // 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 UPLOAD      = 2 << 21;

  var NEWUSER     = 2 << 22;

  var BLOCK       = 2 << 23;

  var DELETE      = 2 << 24;

  var MOVE        = 2 << 25;

  var PROTECT     = 2 << 26;

  var PATROL      = 2 << 27;

  var ABFILTER    = 2 << 28;

  var TAG         = 2 << 29;

  var REVIEW      = 2 << 30;



  /*

  // ///////////////////////////////////// //

  == Global variables / Variables globales ==

  // ///////////////////////////////////// //



  */



  var lrcRCLimit       = 30;      // LiveRC default RC list size;

  var lrcPreviewHeight = '250px'; // LiveRC default preview window height;

  var lrcAutoCloseDiff = 0;       // LiveRC default Diff behaviour;

  var lrcTZ            = '';      // Default time zone (+02:00, 02:00, -0200, -05:45, ...)



  /*



  // //////////////////// //

  == Internationalization ==

  // //////////////////// //



  */



  // Wiki specific translation;

  // /////////////////////

  var lang_category = 'Catégorie:';

  var lang_category_short = '(cat ?)';

  var lang_main_namespace = 'Articles';



  // Menu translation;

  // /////////////////

  var lang_menu =  {

    PAUSE:   "Pause",

    PREVIEW: "Prévisualiser",

    LISTS:   "Listes",

    LOWDIFF: "Diff réduit",

    RCLABEL: "RC",

    NOBOTS:  "Sans Bots",

    IPONLY:  "IP seules",

    IPNEW:   "IP et débutant",

    NAMESP:  "Espace",

    XTIMES:  "fois",

    UNDORC:  "Défaire",

    REVERT:  "Révoquer",

    REASON:  "Motif",

    AVERTS:  "Avertir",

    RVMES1:  "[[User:EDUCA33E/LiveRC/Documentation|LiveRC]] : Révocation des modifications de",

    RVMES2:  "retour à la version de",

    EMPTY:   "Blanchir",

    LOGSHOW: "Journaux",

    ABSHOW:  "Filtres"

  } ];



  var lang_tooltips = {

    // main menu

    HIDE_ALL:       "Supprimer toutes les lignes",

    HIDE_REVIEWED:  "Supprimer les lignes des modifications visualisées",

    HIDE_REVERTS:   "Supprimer les lignes d'annulation",

    HIDE_NEW:       "Supprimer les lignes de création de page",

    HIDE_BLANKING:  "Supprimer les lignes de blanchiment",

    HIDE_THIS:      "Supprimer cette ligne",

    // links in rows

    DIFF_TIP:       "Différence (prévisualisation)",

    DIFF_SHORT:     "Diff",

    HIST_TIP:       "Historique (prévisualisation)",

    HIST_SHORT:     "C",

    EDIT_TIP:       "Modifier (nouvelle fenêtre)",

    EDIT_SHORT:     "M",

    DEL_TIP:        "Supprimer (nouvelle fenêtre)",

    DEL_SHORT:      "S",

    PROTECT_TIP:    "Protéger (nouvelle fenêtre)",

    PROTECT_SHORT:  "P",

    TALK_TIP:       "Page de discussion (nouvelle fenêtre)",

    TALK_SHORT:     "T",

    CONTRIB_TIP:    "Contributions (prévisualisation)",

    CONTRIB_SHORT:  "C",

    BLOCK_TIP:      "Bloquer (Nouvelle fenêtre)",

    BLOCK_SHORT:    "B",

    USER_HIDE_TIP:  "Ignorer l'utilisateur",

    USER_HIDE_SHORT:"H"

  }



  var lang_log = {

    UPLOAD:  'Journal d\'import de fichiers',

    NEWUSER: 'Journal des création de comptes utilisateur',

    BLOCK:   'Journal des blocages',

    DELETE:  'Journal des suppressions de page',

    MOVE:    'Journal des renommages et déplacements',

    PROTECT: 'Journal des protections'

  };



  var lang_messages = {

    SAME_EDITOR: 'éditeur précédent identique',

    WARNING: 'Avertissement',

    ON_ARTICLE: 'sur'

  };



  // Comments test table (regexp format);

  // ////////////////////////////////////

  var commenttests = 

    { state: BLANKING  , regex: /^Résumé automatique : blanchiment|^[Bb]lanchi/ },

    { state: REPLACED  , regex: /^Résumé automatique : contenu remplacé par/ },

    { state: REVERT , regex: /(LiveRC : )?Révocation |([Bb]ot : )?[Aa]nnulation des modifications|([Bb]ot : )?[Rr]évocation de |^(Undid|Revert to( the)?) revision|^(Undoing|Reverted( \d+)?) edit|^r(e)?v(ert(ing|ed)?)?\b/ } 

  ];



  // Categories test table (regexp format);

  var categoriestests = 

    { state: LOCK      , regex: 'Page (semi-protégée|en semi-protection longue)' },

    { state: FULLLOCK  , regex: 'Page protégée' },

    { state: HOMONYMIE , regex: 'Homonymie' },

    { state: ADQ       , regex: 'Article de qualité( contesté)?' },

    { state: BA        , regex: 'Bon article' },

    { state: APDQ      , regex: 'Article potentiellement (bon|de qualité)' },

    { state: COPYRIGHT , regex: 'Article soupçonné de travail sous copyright' },

    { state: PAS       , regex: 'Page proposée à la suppression' },

    { state: FIRE      , regex: 'Wikipompiers' }

  ];



  // LiveRC default template use;

  // ////////////////////////////

  var lstAvert = 

    { template: "Test 0"              , string: "Test 0"    , hasPage: false },

    { template: "Test 1"              , string: "Test 1"    , hasPage: false },

    { template: "Test 2"              , string: "Test 2"    , hasPage: false },

    { template: "Test 3"              , string: "Test 3"    , hasPage: false },

    { template: "Vandalisme"          , string: "Vandal"    , hasPage: true  },

    { template: "Spammeur"            , string: "Spam"      , hasPage: true  },

    { template: "Motivation_modif"    , string: "Résumé"    , hasPage: true  },

    { template: "Signature"           , string: "Signature" , hasPage: false },

    { template: "Bienvenue_copyright" , string: "Copyright" , hasPage: false },

    { template: "Vandalisme_cracra"   , string: "Cracra"    , hasPage: false }

  ];



  // LiveRC default values for checkboxes

  var lrcShowBotChecked   = 'checked';   // change to 'checked' to show only IPs by default

  var lrcShowIPChecked   = '';   // change to 'checked' to show only IPs by default

  var lrcShowIPNEWChecked   = '';   // change to 'checked' to show only IPs and non-patrolled by default (sysops only)

  var lrcShowRCChecked   = 'checked';   // change to 'checked' to hide recent changes by default

  var lrcShowLogChecked   = '';   // change to 'checked' to show logs by default

  var lrcShowFilterChecked   = '';   // change to 'checked' to show filters by default



  // Getting user params

  // FIXME: works fine in Mozilla and Opera, does not work in Chrome and Safari



  importScript(wgPageName+'/LiveRCparam.js'); 

  importScript('User:'+wgUserName+'/LiveRCparam.js');



  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 lastrcid=0,lastfilterid=0,lastlogid=0,lastrctimestamp=1,lastletimestamp=1,lastafltimestamp=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("=");

    _GETdecodeURIComponent(_temp_get_arr_10])] = decodeURIComponent(_temp_get_arr_11]);

  }

  delete _uri; delete _temp_get_arr; delete _temp_get_arr_1;







  var lstSysop = new Array();   // Sysop list;

  var lstContact = new Array(); // Contact list;

  var lstContact2 = new Array(); // Contact list;

  var lstRevoc = new Array();   // Reverted list;

  var lstHidden = new Array();  // Hidden users list;



  // Has user patrol rights?

  var lrcPatrol = false;

  var lrcAPIlimit = 500;

  if(wgUserGroups.indexOf("autopatrolled") != -1)

    lrcPatrol = true;

			

  // Is user Sysop;

  var lrcAdmin = false; // default value;

  if(wgUserGroups.indexOf("sysop") != -1)

  {

    lrcAdmin = true;

    lrcPatrol = 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.headersfield]);

      }

      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);

    }

  }

};



///////////////////////////////////////////////////////////////////////////////

// * Recherche d'un élement dont on connait l'Id mais non unique, donc sans utiliser document.getElementById()

// Thanks to Dr Brains

 

function getElementWithId( elementId , elementTagName , elementParentNode ){

      if(!elementParentNode) elementParentNode = document; 

      

      if (elementParentNode.getElementById) return elementParentNode.getElementById(elementId);

      

      var TheElement = false;

      var Elements = elementParentNode.getElementsByTagName(elementTagName);

      var elementcount = 0;

      while(elementcount<Elements.length){

            var Id = Elementselementcount].getAttribute('id');

            if(Id){

                  if(Id==elementId){

                        TheElement = Elementselementcount];

                        break;

                  }

            }

            elementcount++

      }

      if (! TheElement) return null;

      return TheElement;

}

///////////////////////////////////////////////////////////////////////////////





function getRights(xmlreq, data) {

  var api = xmlreq.responseXML;



  if (api.firstChild.nodeName == "error") return;



  var rights = api.getElementsByTagName('query')[0].getElementsByTagName('userinfo')[0].getElementsByTagName('rights')[0].getElementsByTagName('r');

  var len = rights.length;

  var i;

  var id,right;



  for (i=0; i<len; i++) {

    right = rightsi].textContent;

    // Handle IE

    if (!right)right = rightsi].text;



    if (right == "apihighlimits") lrcAPIlimit=5000;

    if (right == "autopatrol") lrcPatrol=true;

  }

  

  buildControlBar();

}



function buildControlBar()

{

  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 showIPNEWbox = '';

  if (lrcPatrol)

    showIPNEWbox = '<input id="showIPNEW"    type="checkbox" ' + lrcShowIPNEWChecked + '/>' +

      '<label for="showIPNEW">'   + lang_menu0].IPNEW  + ' </label>';



  var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );

  lvPreviewFoot.innerHTML = '<a href="javascript:;" onClick="supprLigne(\'*\');" style="color: red; font-weight: bold;" title="'+lang_tooltips.HIDE_ALL+'">X</a> | ' +

    '<a href="javascript:;" onClick="supprLigne(\'d\');" style="color: rgb(255, 235, 71); font-weight: bold;" title="'+lang_tooltips.HIDE_REVIEWED+'">X</a> ' +

    '<a href="javascript:;" onClick="supprLigne(\'r\');" style="color: rgb(255, 99, 83); font-weight: bold;" title="'+lang_tooltips.HIDE_REVERTS+'">X</a> ' +

    '<a href="javascript:;" onClick="supprLigne(\'n\');" style="color: rgb(178, 243, 113); font-weight: bold;" title="'+lang_tooltips.HIDE_NEW+'">X</a> ' +

    '<a href="javascript:;" onClick="supprLigne(\'c\');" style="color: white; font-weight: bold;" title="'+lang_tooltips.HIDE_BLANKING+'">X</a>' +

    '<input id="stopLive"  type="checkbox" value="true" />' +

    '<label for="stopLive">' + lang_menu0].PAUSE   + '</label>' +

	' &bull; ' +

    '<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'divLivePreview\');" />' +

    '<label for="shidPrev">' + lang_menu0].PREVIEW + '</label>' +

    '<input id="showDiffR" type="checkbox" />' +

    '<label for="showDiffR">'+ lang_menu0].LOWDIFF + '</label>' +

	' &bull; ' +

    '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />' +

    '<label for="shidList">' + lang_menu0].LISTS   + '</label>' +

	' &bull; ' +

    '<input id="showBot"   type="checkbox" ' + lrcShowBotChecked + ' />' +

    '<label for="showBot">'  + lang_menu0].NOBOTS  + '</label>' + 

    '<input id="showIP"    type="checkbox" ' + lrcShowIPChecked + '/>' +

    '<label for="showIP">'   + lang_menu0].IPONLY  + ' </label>' +

    showIPNEWbox +

	' &bull; ' +

    '<input id="showRC"    type="checkbox" ' + lrcShowRCChecked + ' />' +

    '<label for="showRC">'   + lang_menu0].RCLABEL  + ' </label>' +

    '<input id="showLog"    type="checkbox" ' + lrcShowLogChecked + '/>' +

    '<label for="showLog">'   + lang_menu0].LOGSHOW  + ' </label>' +

    '<input id="showFilter"    type="checkbox" ' + lrcShowFilterChecked + '/>' +

    '<label for="showFilter">'   + lang_menu0].ABSHOW  + ' • </label>' +

    '<span id="selectNS" />';



  if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;



  liveSysop();

}



// Parser

if (window.DOMParser) var gml_xmlparser = new DOMParser();



function gml_XMLParse(string) {

  if (window.DOMParser) {

    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 string = this;

  for (var i=0; i<chars.length; i++) {

    var regex = new RegExp(charsi], "g");

    string = string.replace(regex, '&' + entitiesi + ';');

  }

  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) {

  // temporary fix for incorrect HTML code

  var text = xmlreq.responseText;

  var newtext = text.replace(/&nbsp<span class=\"mw-revdelundel-link/g, "&nbsp;<span class=\"mw-revdelundel-link");

  var doc = gml_XMLParse(newtext);

  var page=data.mpage;

  var oldid=data.moldid;

  var id=data.mid;

  var bC  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  var lD = getElementsByClass('diff',bC,null);



  var upage=page.replace(new RegExp(/\'/g), "\\'");



  if (lD0 == null) {

    LP.innerHTML = bC.innerHTML;

    if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  }

  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 (rollback0 == null)

        var rl = "";

      else

        var rl = rollback0].innerHTML+"<br />";

      var avant = "";

      var apres = "";

      var lav = avantEl.length;

      var lap = apresEl.length;

      for(var n=0; n < lav ; n++)

        avant = avant + avantEln].innerHTML + "<br />";

      for(var n=0; n < lap ; n++)

        apres = apres + apresEln].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'>"+lD0].innerHTML+"</table>";

    }

  }

  if (dLP.style.display == "none") {

    var elcb = document.getElementById( 'shidPrev' );

    elcb.checked="true";

    dLP.style.display = "inline";

  }

  if (typeof (setupTooltips) != 'undefined') {

    setupTooltips(dLP, false, true);

  }



  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 = getElementWithId('differences-nextlink', 'a', doc);

  if ((asNextDiff == null) && lrcPatrol) { 

    var optAvert = "";

    var optl = lstAvert.length;

    for (j=0; j<optl; j++) {

      optAvert += '<option value="'+lstAvertj].template;

      if(lstAvertj].hasPage) optAvert += '|'+upage;

      optAvert += '">'+lstAvertj].string+'</option>';

    }



    // Get username of submitter

    var user1 = getElementWithId('mw-diff-otitle2', 'div', doc);

    if (user1 != null) {

      var usertmp=user1.innerHTML;

      if (!usertmp) usertmp=user1.firstChild.xml;

      // user1 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>  \(<a(.*)/g), "$2");

      user1 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>(.*)\((.*)\)/g), "$2");

      user1 = user1.replace(new RegExp(/(.*)<(.*)>/g), "$1");

    }

    var user2 = getElementWithId('mw-diff-ntitle2', 'div', doc);

    if (user2 != null) {

      var usertmp=user2.innerHTML;

      if (!usertmp) usertmp=user2.firstChild.xml;

      // user2 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>  \(<a(.*)/g), "$2");

      user2 = usertmp.replace(new RegExp(/<a (.*)>(.*)<\/a>(.*)\(<a(.*)/g), "$2");

    }

    user1=user1.replace(new RegExp(/\'/g), "\\'");

    user2=user2.replace(new RegExp(/\'/g), "\\'");

    var identique="";

    if(user1 == user2) {

     identique =  "<b style='color:red'>[" + lang_messages.SAME_EDITOR + "]</b> ";

    }



    entete.innerHTML = '<table width="100%" class="creator"><tr><td>' + entete.innerHTML + 

    '</td><td align="right"><small>' + identique +

    // 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_menu0].UNDORC+'</a>] • ' +

    lang_menu0].REASON+' : <input id="LiveRevertMessage" /> ••• ' +

    '[<a id="LiveAvertoLink" href="javascript:getLiveAverto(\''+user2+'\');">'+lang_menu0].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),"'");

  

  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++) {

    editforminputsi].name = inputsi].value;

  }

  var wpStarttime = encodeURIComponent(editform'wpStarttime']);

  var wpEdittime = encodeURIComponent(editform'wpEdittime']);

  var wpEditToken = encodeURIComponent(editform'wpEditToken']);



  var wpSummary = encodeURIComponent('LiveRC : ' + lang_messages.WARNING + ' ' + message.replace(new RegExp(/\|(.*)/),

    ' ' + lang_messages.ON_ARTICLE + ' [[$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++) {

    linksi].href = "javascript:;";

    linksi].style.color = "silver";

    linksi].style.cursor = "default";

    linksi].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++) {

    editforminputsi].name = inputsi].value;

  }

  var wpStarttime = encodeURIComponent(editform'wpStarttime']);

  var wpEdittime = encodeURIComponent(editform'wpEdittime']);

  var wpEditToken = encodeURIComponent(editform'wpEditToken']);



  switch(where) {

    case 'liverevert':

      var wpSummary = lang_menu0].RVMES1 + ' [[Special:Contributions/' + user2 + '|' + user2

        + ']]; '+lang_menu0].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  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);;

  var c=data.message;

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  LP.innerHTML = bC.innerHTML;

  if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  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>



=== 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  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);

  var c=data.message;

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  LP.innerHTML = bC.innerHTML;

  if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  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  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);

  var user=data.message;

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  LP.innerHTML = bC.innerHTML;

  if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  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(lstAvertj].hasPage) continue;

    optAvert += '<option value="'+lstAvertj].template+'">'+lstAvertj].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_menu0].AVERTS+'</a>] : ' +

    '<select id="averto">' + optAvert + '</select>' + '</td></tr></table>';

}



/* </source>



=== LiveLog (:it:User:Jalo) ===



<source lang="javascript"> */

 

function liveLog(action,page) {

  var titolo = '';

  switch(action) {

    case 'upload':

      titolo = lang_log.UPLOAD;

      break;

    case 'newusers':

      titolo = lang_log.NEWUSER;

      break;

    case 'block':

      titolo = lang_log.BLOCK;

      break;

    case 'delete':

      titolo = lang_log.DELETE;

      break;

    case 'move':

      titolo = lang_log.MOVE;

      break;

    case 'protect':

      titolo = lang_log.PROTECT;

      break;

    default:

      break;

  }

 

  var el = document.getElementById( 'livePreviewTitle' );

  el.innerHTML="<b style='text-decoration: blink;'><span style='color:red'>"+titolo+"</span>...</b>";

  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=Special:Log&type=' + action + "&user=&page=" + encodeURIComponent(page), onSuccess: getLog, message: page });

}

 

function getLog(xmlreq, data) {

  doc = gml_XMLParse(xmlreq.responseText);

  bC  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);

  var c=data.message;

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  LP.innerHTML = bC.innerHTML;

  if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  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>



=== LiveFilter ===

*/



function liveFilter(id) {

  var el = document.getElementById( 'livePreviewTitle' );

  el.innerHTML="<b style='text-decoration: blink;'>Filter: <span style='color:red'></span>...</b>";

  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=Special:AbuseLog&details='+id, 

                onSuccess: getFilter, mid: id});

}



function getFilter(xmlreq, data) {

  doc = gml_XMLParse(xmlreq.responseText);

  bC  = getElementWithId('bodyContent', 'div', doc);

  if (bC ==  null) bC  = getElementWithId('article', 'div', doc);

  var LP = document.getElementById( 'livePreview' );

  var dLP = document.getElementById( 'divLivePreview' );

  LP.innerHTML = bC.innerHTML;

  if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

  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="'+mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/index.php?title=Special:AbuseLog&details='+data.mid+'" target="_new">Détails</a></b>';

}





/*

=== LiveSysop ===



<source lang="javascript"> */



function liveSysop() {

  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=allusers&augroup=sysop&aulimit=' +lrcAPIlimit +'&format=xml', 

                   onSuccess: getSysop, message: "Traitement en cours...\n\n" });

}



function getSysop(xmlreq, data) {

  var api = xmlreq.responseXML.getElementsByTagName('api')[0];



  if (api.firstChild.nodeName == "error") return;



  var rcs = api.getElementsByTagName('query')[0].getElementsByTagName('allusers')[0].getElementsByTagName('u');



  leni=rcs.length;

  for (i=leni-1; i>=0; i--) {

    

    lstSysop.push(rcsi].getAttribute('name'));

  

  }

  liveNS();

}



function liveWatch() {

  wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=watchlistraw&wrlimit=' +lrcAPIlimit +'&format=xml', 

                   onSuccess: getWatch, message: "Traitement en cours..." });

}



function getWatch(xmlreq, data) {

  var api = xmlreq.responseXML.getElementsByTagName('api')[0];



  if (api.firstChild.nodeName == "error") return;



  var rcs = api.getElementsByTagName('watchlistraw')[0].getElementsByTagName('wr');



  leni=rcs.length;

  for (i=0; i<leni; i++) {

    

    lstSuivi.push(rcsi].getAttribute('title'));

    lstSuiviHH.push("--:--");

  

  }

  

  var wc1=api.getElementsByTagName('query-continue')[0];

  if (wc1)

  {

    var wrcontinue=wc1.getElementsByTagName('watchlistraw')[0].getAttribute('wrcontinue');

    wpajax.http({url:mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=watchlistraw&wrlimit=' +lrcAPIlimit +'&format=xml&wrcontinue=' + wrcontinue, 

      onSuccess: getWatch, message: "Traitement en cours..." });

  }

  else

    liveRC();

}



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 = nssi].getAttribute('id');

    ns = nssi].textContent;

    // Handle IE

    if (!ns)  ns = nssi].text;



    if (id < 0) continue;

    if (id == 0) ns = lang_main_namespace;



    options += '<option value="' + id + '">' + ns + '</option>';

    lstNs.push(id);

  } 

  options = '<option value="' + lstNs.join('|') + '">*</option>' + options;

  document.getElementById('selectNS').innerHTML = '<label for="showNS0">'+lang_menu0].NAMESP+' </label><select id="showNS0">' + options + '</select>';



  liveWatch();

}



/* </source>



=== LiveRC ===



<source lang="javascript"> */



function supprLigne(quelLigne) {

  var i,len;

  var tab = document.getElementById('tabRC');

  // IE automatically inserts a TBODY that we have to take care of

  if (tab.firstChild && (tab.firstChild.nodeName == "TBODY")) tab=tab.firstChild;

  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 (_elsi].firstChild.style.backgroundColor == 'rgb(255, 250, 205)')

        els.push(_elsi]);

  } else if (quelLigne == 'r') {

    var _els = tab.getElementsByTagName('tr');

    len = _els.length;

    for (i=len-1; i>=0; i--)

      if (_elsi].firstChild.style.backgroundColor == 'rgb(255, 228, 225)')

        els.push(_elsi]);

  } else if (quelLigne == 'n') {

    var _els = tab.getElementsByTagName('tr');

    len = _els.length;

    for (i=len-1; i>=0; i--)

      if (_elsi].firstChild.style.backgroundColor == 'rgb(226, 242, 210)')

        els.push(_elsi]);

  } else if (quelLigne == 'c') {

    var _els = tab.getElementsByTagName('tr');

    len = _els.length;

    for (i=len-1; i>=0; i--)

      if (_elsi].firstChild.style.backgroundColor == 'white')

        els.push(_elsi]);

  } else

    els.push(document.getElementById(quelLigne));

  len = els.length;

  for (i=len-1; i>=0; i--)

    if (elsi != null)

      tab.removeChild(elsi]);

}



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 (els1i != null)

      els1i].style.backgroundColor = "#FFFACD";

  var len = els2.length;

  for (var i=len-1; i>=0; i--)

    if (els2i != null)

      els2i].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(elsi].className) ) {

      classElementsj = elsi];

      j++;

    }

  }

  return classElements;

}



function tsToHhMm(timestamp) {

  var tz;

  var match;

  if (lrcTZ) {

    var regex = new RegExp(/^([-+])?(\d?\d):?(\d\d)$/);

    match = regex.exec(lrcTZ);

    if (!match) {

      //livercError(lang_error.TZ);

      return 'xx:xx';

    }

    tz = match2*60 + match3*1;

    tz = match1 == '-' ? -tz : tz;

  } else {

    var now = new Date();

    tz = -now.getTimezoneOffset();

  }

  var regex = new RegExp(/^\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 = (match1*60 + match2*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" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';

    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';

    var uadmin   = '';

    if (lrcAdmin == true) {

       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</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 += tempArn];

}



function updateFollowContact() {

  var tempAr = new Array();

  for (var user in lstContact2) {

    var timestamp = lstContact2user].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" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';

    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';

    var uadmin   = '';

    if (lrcAdmin == true) {

       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</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 += tempArn];

}



function updateFollowRevoc() {

  var tempAr = new Array();

  for (var user in lstRevoc) {

    var timestamp = lstRevocuser].ts;

    var utilde = user.replace(new RegExp(/\'/g), "\\'");

    var uremove = '<a href="javascript:;" onClick="removeRevoc(\''+utilde+'\');" style="color:grey">-</a>';

    var udiscut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';

    var ucontrib = '<a href="javascript:;" onClick="liveContrib(\''+utilde+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';

    var uadmin   = '';

    if (lrcAdmin == true) {

       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';

    }

    var ueditor  = '<a href="'+wgServer+'/wiki/User:'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';

    var ligne = '<span id="revoc-' + timestamp + '"><small>' + tsToHhMm(timestamp) + ' • ' + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + ' (' + lstRevocuser].nb + ' '+lang_menu0].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 += tempArn];

}



function removeRevoc(name) {

   delete lstRevocname];

   updateFollowRevoc();

}





//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;



//  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;



  var regex = new RegExp(/\'/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" title="'+lang_tooltips.HIDE_THIS+'">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+'\',\''+user+'\');'+diffClose+'" style="color:green">New</a>';

  else if (state & UPLOAD)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'upload\',\''+escTitle+'\');'+diffClose+'" style="color:darkslateblue">Log</a>';

  else if (state & NEWUSER)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'newusers\',\''+escTitle+'\');'+diffClose+'" style="color:lime">Log</a>';

  else if (state & BLOCK)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'block\',\''+escTitle+'\');'+diffClose+'" style="color:darkgoldenrod">Log</a>';

  else if (state & DELETE)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'delete\',\''+escTitle+'\');'+diffClose+'" style="color: saddlebrown">Log</a>';

  else if (state & MOVE)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'move\',\''+escTitle+'\');'+diffClose+'" style="color:black">Log</a>';

  else if (state & PROTECT)  

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveLog(\'protect\',\''+escTitle+'\');'+diffClose+'" style="color: darkslategray">Log</a>';

  else if (state & ABFILTER)

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveFilter('+revid+');'+diffClose+'" style="color: darkslategray">Filt</a>';

  else  { // simple edit

    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');liveDiff(\''+escTitle+'\','+revid+','+oldid+');'+diffClose+'" style="color:orange" title="'+lang_tooltips.DIFF_TIP+'">'+lang_tooltips.DIFF_SHORT+'</a>'

    diff += '<sup><a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURI(escTitle)+'&diff='+revid+'&oldid='+oldid+'" target="_new">+</a></sup>';

    }

 

  var hist = '';

  var  = '';

  var admin = '';

  // Don't show link for log rows

  if (!(state & UPLOAD) &&

      !(state & NEWUSER) &&

      !(state & BLOCK) &&

      !(state & DELETE) &&

      !(state & PROTECT) &&

      !(state & PATROL) &&

      !(state & MOVE) &&

      !(state & ABFILTER))

  {

    hist = '<a href="javascript:;" onClick="liveHist(\''+escTitle+'\');" style="color:darkorange" title="'+lang_tooltips.HIST_TIP+'">'+lang_tooltips.HIST_SHORT+'</a>';

     = '<a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURIComponent(title)+'&action=edit" target="_new" style="color:tomato" title="'+lang_tooltips.EDIT_TIP+'">'+lang_tooltips.EDIT_SHORT+'</a>';

    if (lrcAdmin == true) {

      admin = ' • <a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURIComponent(title)+'&action=delete" target="_new" style="color:orangered" title="'+lang_tooltips.DEL_TIP+'">'+lang_tooltips.DEL_SHORT+'</a>'; 

 

      admin += ' • <a href="' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title='+encodeURIComponent(title)+'&action=protect" target="_new" style="color: coral" title="'+lang_tooltips.PROTECT_TIP+'">'+lang_tooltips.PROTECT_SHORT+'</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">'+lang_category_short+'</sup>';



  // Redirect, Log, or simple edit ? ;

  //////////////////

  if (state & MOVE) {

//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Forward.png/16px-Forward.png" width="16px" alt="Renommage" />';

    postArti += ' <a href="javascript:;" onClick="liveArticle(\''+rc.new_title+'\',\''+user+'\');">'+rc.new_title+'</a>';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');">'+title+'</a>';

  }

  else 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="Redirect" />';

    postArti += ' <a href="javascript:;" onClick="liveArticle(\''+rc.redirect+'\',\''+user+'\');">'+rc.redirect+'</a>';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');">'+title+'</a>';

  } 

  else if (state & UPLOAD) {

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Gartoon-Gnome-dev-floppy.png/16px-Gartoon-Gnome-dev-floppy.png" width="16px" alt="Upload" />';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';

  }

  else if (state & NEWUSER) {

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Crystal_personal.png/16px-Crystal_personal.png" width="16px" alt="Nouvel utilisateur" />';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';

  }

  else if (state & BLOCK) {

//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Crystal_Clear_action_lock3.png/16px-Crystal_Clear_action_lock3.png" width="16px" alt="Blocage" />';

    postArti += ' <a href="javascript:;" onClick="liveLog("block",\''+rc.title+'\');">('+rc.duration+')</a>';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');">'+title+'</a>';

  }

  else if (state & DELETE) {

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Editcut.png/16px-Editcut.png" width="16px" alt="Suppression" />';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';

  }

  else if (state & PROTECT) {

    postArti += ' <img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Crystal_Clear_app_agent.png/16px-Crystal_Clear_app_agent.png" width="16px" alt="Protection" />';

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';

  }

  else {

    arti = '<a style="'+artiStyle+'" href="javascript:;" onClick="liveArticle(\''+escTitle+'\',\''+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';

  }

 

  th1.innerHTML = '<small>' + tsToHhMm(timestamp) + ' • ' + diff + ' • ' + hist + ' • ' +  + 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" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';

  var contrib = '<a href="javascript:;" onClick="liveContrib(\''+escUser+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</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 = new RegExp(/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" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';

  }

  

  var uhide = '<a href="javascript:;" onClick="supprLigne(\''+pageid+'_'+revid+'\'); hideUser(\''+ user +'\');" style="color:grey" title="'+lang_tooltips.USER_HIDE_TIP+'">'+lang_tooltips.USER_HIDE_SHORT+'</a>';

  

  td2.innerHTML = '<small>' + discut + ' • ' + contrib + ' • ' + uhide + uadmin + ' • </small>'

                + preEditor + editor;

  td2.className="creator-name";

  td2.style.border = "1px";

  td2.style.width = "20%";



  if (lstRevocuser]) {

    td2.style.border = "2px solid red";

    td2.innerHTML += '<sup style="color:red">(' + lstRevocuser].nb + ' révoc <a href="javascript:removeRevoc(\'' + user + '\')">-</a>)</sup>'

  }



  // COMMENT //

  // Remplace lien [[xxx]] par <a> ;

  var wcomment = comment.htmlize();

  var regex1 = new RegExp(/\[\[(([^\]\|]*)(.*?))\]\]/g);

  wcomment = wcomment.replace(regex1, "<a href='"+mw.config.get('wgServer')+mw.config.get('wgScriptPath')+"/index.php?title=$2&redirect=no' target='_new'>$1</a>");

  var regex2 = new RegExp(/\>[^\]\|<]*\|([^\]\|<]*)</g);

  wcomment = wcomment.replace(regex2, ">$1<");



  // Abusefilter tag ? ;

  /////////////////

  if (state & TAG) {

    wcomment += '<br /><span style="color: red; font-weight: bold;">Tag : ';

    wcomment += rc.tags0].firstChild.nodeValue;

    for (var tagId = 1; tagId < rc.tags.length; ++tagId)

      wcomment += ' | ' + rc.tagstagId].firstChild.nodeValue;

    wcomment += '</span>';

    td3.style.border = "2px solid red";

  } else {

  td3.style.border = "1px";

  td3.style.width = "40%";

  }



  td3.innerHTML = "<small>" + wcomment + "</small>";





  if (state & PATROLLED) {

    td2.style.backgroundColor = "#e3e3f1";

    td3.style.backgroundColor = "#e3e3f1";

    td4.style.backgroundColor = "#e3e3f1";

  }  

  

  if (state & ABFILTER) {

    th0.style.backgroundColor = "#FFBE60";

    th1.style.backgroundColor = "#FFBE60";

    td2.style.backgroundColor = "#FFBE60";

    td3.style.backgroundColor = "#FFBE60";

    td4.style.backgroundColor = "#FFBE60";

  }  

  

 if (state & UPLOAD) {

    th0.style.backgroundColor = "#D1CAFA";

    th1.style.backgroundColor = "#D1CAFA";

    td2.style.backgroundColor = "#D1CAFA";

    td3.style.backgroundColor = "#D1CAFA";

    td4.style.backgroundColor = "#D1CAFA";

    tr1.style.border = "1px solid  darkslateblue";

  }

 

  if (state & NEWUSER) {

    th0.style.backgroundColor = "#C6FF6D";

    th1.style.backgroundColor = "#C6FF6D";

    td2.style.backgroundColor = "#C6FF6D";

    td3.style.backgroundColor = "#C6FF6D";

    td4.style.backgroundColor = "#C6FF6D";

    tr1.style.border = "1px solid  lime";

  }

 

  if (state & BLOCK) {

    th0.style.backgroundColor = "#EECC84";

    th1.style.backgroundColor = "#EECC84";

    td2.style.backgroundColor = "#EECC84";

    td3.style.backgroundColor = "#EECC84";

    td4.style.backgroundColor = "#EECC84";

    tr1.style.border = "1px solid  darkgoldenrod";

  }

 

  if (state & DELETE) {

    th0.style.backgroundColor = "#E7CAA7";

    th1.style.backgroundColor = "#E7CAA7";

    td2.style.backgroundColor = "#E7CAA7";

    td3.style.backgroundColor = "#E7CAA7";

    td4.style.backgroundColor = "#E7CAA7";

    tr1.style.border = "1px solid saddlebrown";

  }

 

  if (state & MOVE) {

    th0.style.backgroundColor = "#FDC5FF";

    th1.style.backgroundColor = "#FDC5FF";

    td2.style.backgroundColor = "#FDC5FF";

    td3.style.backgroundColor = "#FDC5FF";

    td4.style.backgroundColor = "#FDC5FF";

    tr1.style.border = "1px solid magenta";

  }

 

  if (state & PROTECT) {

    th0.style.backgroundColor = "#B2BCC6";

    th1.style.backgroundColor = "#B2BCC6";

    td2.style.backgroundColor = "#B2BCC6";

    td3.style.backgroundColor = "#B2BCC6";

    td4.style.backgroundColor = "#B2BCC6";

    tr1.style.border = "1px solid  darkslategray";

  }



  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 (lstContact2user]) {

    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 ;

  ///////////////////

  if (!(state & NEWUSER) &&

      !(state & PROTECT) &&

      !(state & MOVE) &&

      !(state & DELETE) &&

      !(state & ABFILTER)) {

  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' );

  // IE automatically inserts a TBODY that we have to take care of

  if (tab.firstChild && (tab.firstChild.nodeName == "TBODY")) tab=tab.firstChild;

  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);

  }



  // Don't show RC if checkbox is not checked

  if ((!document.getElementById('showRC').checked) &&

     (!(state & UPLOAD) &&

      !(state & NEWUSER) &&

      !(state & BLOCK) &&

      !(state & DELETE) &&

      !(state & PROTECT) &&

      !(state & MOVE) &&

      !(state & ABFILTER)))

    supprLigne(pageid+"_"+revid);



  if (state & PATROL)

    supprLigne(pageid+"_"+revid);

 

  // Don't show Log if checkbox is not checked

  if ((!document.getElementById('showLog').checked) &&

     ((state & UPLOAD) ||

      (state & NEWUSER) ||

      (state & BLOCK) ||

      (state & DELETE) ||

      (state & PROTECT) ||

      (state & MOVE)))

    supprLigne(pageid+"_"+revid);



  // Don't show Filter if checkbox is not checked

  if ((!document.getElementById('showFilter').checked) &&

     (state & ABFILTER))

    supprLigne(pageid+"_"+revid);



  // 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";

    lstSuiviHHspos = tsToHhMm(timestamp);

    var tempsAr = new Array();

    var len = lstSuivi.length;

    for (var n = 0; n < len; n++) {

      if(lstSuiviHHn == "--:--") continue;

      var cstilde = lstSuivin].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+'\');">'+lstSuivin+'</a>';

      var ligne='<small>' + lstSuiviHHn + ' • ' + 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 + tempsArn];

  }





  if (lstContact2user]) {

    lstContact2user].ts = timestamp;

    updateFollowContact();

  }



  if (state & REVERT) {

    var regex = new RegExp(/\[\[Sp[ée]cial:Contributions\/([^\]\|]+)/);

    match = regex.exec(comment);



    if (!match) {

		var regex2 = new RegExp(/\[\[Specjalna:Wkład\/([^\]\|]+)/);

		match = regex2.exec(comment);

    }

    

    if (match) {

      var userR = match1];

      if (userR != user && userR != wgUserName) {

        if (!lstRevocuserR]) lstRevocuserR = { ts: 0, nb: 0 };

        lstRevocuserR].ts = timestamp;

        lstRevocuserR].nb += 1;

        updateFollowRevoc();

      }

    }

  }

}



function getRedirCat(xmlreq, data) {

  if (document.getElementById('stopLive').checked) return;

 

  var yurik = xmlreq.responseXML.getElementsByTagName('api')[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+categoriestestsj].regex, "i").test(categoriesi].textContent))

          state += categoriestestsj].state;

  }

 

  rc.state = state;

 

  getRevision(rc);

}

 

function getRedirCat2(xmlreq, data) {

  if (document.getElementById('stopLive').checked) return;

 

  var api = xmlreq.responseXML.getElementsByTagName('api')[0];

 

  if (api.firstChild.nodeName == "error") return;

 

  var log = data.log;

  var pageid = log.pageid;

  var revid = log.revid;

  var state = log.state;

 

  var query = api.getElementsByTagName('query')[0];

 

  if (query.getElementsByTagName('redirects').length) {

    state += REDIRECT;

    if (query.getElementsByTagName('redirects')[0].getElementsByTagName('r').length)

      log.redirect = query.getElementsByTagName('redirects')[0].getElementsByTagName('r')[0].getAttribute('to');

  }

 

  if (query.getElementsByTagName('categories').length) {

    state += CATEGORIZED;

 

    var categories = query.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+categoriestestsj].regex, "i").test(categoriesi].getAttribute('title')))

          state += categoriestestsj].state;

  }

 

  log.state = state;

 

  getRevision(log);

}

 

// Get RC and Log

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--) {

    // Using rcid as revid can be 0 (e.g. when moving a page)

    if (rcsi].getAttribute('rcid') <= lastrcid) continue;



    rc = new Object();

    rc.state = 0;



    lenj = rcsi].attributes.length;

    for (j=0; j<lenj; j++) {

      switch(rcsi].attributesj].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:

          rcrcsi].attributesj].name = rcsi].attributesj].value;

          break;

      }

    }



    var tags = rcsi].getElementsByTagName('tags')[0].getElementsByTagName('tag');

    if (tags.length) {

      rc.state += TAG;

      rc.tags = tags;

    }



    if (typeof(rc.comment) != "undefined") {

      lenj = commenttests.length;

      for (j=0; j<lenj; j++)

        if (new RegExp(commenttestsj].regex).test(rc.comment))

          rc.state += commenttestsj].state;

    }



    if (rc.newlen == 0) rc.state += BLANKING;



    if (lstSysop.indexOf(rc.user) != -1)

      rc.state += SYSOP;



    var mitigating = (rc.state & REVERT)

      || (rc.state & BLANKING)

      || (rc.state & REPLACED)

      || (rc.state & TAG)

      || (lstContact2rc.user])

      || (lstRevocrc.user])

      || (rc.user == wgUserName);



    if (document.getElementById('showIP').checked

      && !(rc.state & IP)

      && !mitigating ) continue;



    if ((rc.state & PATROLLED)

      && document.getElementById('showIPNEW').checked

      && !mitigating ) continue;

      

    if ((typeof(rc.logtype) != "undefined")

      && rc.logtype == "newuser") continue;

      



    if (lstHiddenrc.user && !mitigating) continue;



    wpajax.http({url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?titles=' + encodeURIComponent(rc.title) + '&action=query&prop=categories&redirects&format=xml',

                 onSuccess: getRedirCat, rc: rc });

  } 



  // Log

  var logs = api.getElementsByTagName('query')[0].getElementsByTagName('logevents')[0].getElementsByTagName('item');

  var i,j,leni,lenj,log;

 

  leni=logs.length;

  for (i=leni-1; i>=0; i--) {

    if (logsi].getAttribute('logid') <= lastlogid) continue;

    log = new Object();

    log.state = 0;

 

    lenj = logsi].attributes.length;

    for (j=0; j<lenj; j++) {

        if (logsi].attributesj].name == 'type')

        {

          switch(logsi].attributesj].value) {

            case 'patrol':

// I "Segna come verificata" non li cago

            log.state += PATROL; 

              break;

            case 'newusers':

              log.state += NEWUSER;

              break;

            case 'upload':

              log.state += UPLOAD;

              break;

            case 'block':

              log.state += BLOCK;

              if (logsi].firstChild)

                log.duration = logsi].firstChild.attributes1].value;

              break;

            case 'delete':

              log.state += DELETE;

              break;

            case 'move':

              log.state += MOVE;

              if (logsi].firstChild)

                log.new_title = logsi].firstChild.attributes1].value;

            case 'protect':

              log.state += PROTECT;

              break;

            case 'review':

              log.state += REVIEW;

              break;

            default:

              break;

          }

        }

        else

          loglogsi].attributesj].name = logsi].attributesj].value;

        

        //Set a dummy revid to prevent deletion

        log.revid=log.logid;

    }

 

    if (typeof(log.comment) != "undefined") {

      lenj = commenttests.length;

      for (j=0; j<lenj; j++)

        if (new RegExp(commenttestsj].regex).test(log.comment))

          log.state += commenttestsj].state;

    }

 

    if (lstSysop.indexOf(log.user) != -1)

      log.state += SYSOP;

 

    if (!(log.state & REVIEW))

    wpajax.http({url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?titles=' + encodeURIComponent(log.title) + '&action=query&prop=categories&redirects&format=xml',

               onSuccess: getRedirCat2, log: log });

  } 



 // Filters

  var filters = api.getElementsByTagName('query')[0].getElementsByTagName('abuselog')[0].getElementsByTagName('item');

  var i,j,leni,lenj,filter;

  

  leni=filters.length;

  for (i=leni-1; i>=0; i--) {

    if (filtersi].getAttribute('id') <= lastfilterid) continue;

    filter = new Object();

    filter.state = ABFILTER;

 

    lenj = filtersi].attributes.length;

    for (j=0; j<lenj; j++) {

        filterfiltersi].attributesj].name = filtersi].attributesj].value;

    }

    

    //Set a dummy revid to prevent deletion

    filter.revid = filter.id

    

    // Get filter description

    

    

    //Set a dummy revid to prevent deletion

    filter.revid = filter.id

    

    wpajax.http({url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&list=abusefilters&abflimit=1&format=xml&abfstartid=' + filter.filter_id,

               onSuccess: getFilterTitle, filter: filter });

  } 





  lastrcid = rcs0].getAttribute('rcid');

  lastlogid = logs0].getAttribute('logid');

  lastfilterid = filters0].getAttribute('id');

  lastrctimestamp = rcs0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");

  lastletimestamp = logs0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");

  lastafltimestamp = filters0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");

  document.getElementById('tsInit').innerHTML = "Last situation : " + lastrctimestamp ;

}



function getFilterTitle(xmlreq, data) {

  var filter = data.filter;



  var xmlinfo = xmlreq.responseXML.getElementsByTagName('api')[0];

 

  if (xmlinfo.firstChild.nodeName == "error") return;

  

  filter.comment = 'Déclenchement du filtre '

  filter.comment += xmlinfo.getElementsByTagName('abusefilters')[0].getElementsByTagName('filter')[0].getAttribute('id'); 

  filter.comment += ': ';

  filter.comment += xmlinfo.getElementsByTagName('abusefilters')[0].getElementsByTagName('filter')[0].getAttribute('description');

  filter.comment += ' (action: '+ filter.result + ')';



  getRevision(filter);

}



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;



  wpajax.http({url:wgServer + wgScriptPath

    + '/api.php?action=query&list=recentchanges|logevents|abuselog&rcnamespace=' + rcns

    + '&rcprop=user|comment|flags|timestamp|title|ids|sizes|tags' + (lrcPatrol ? '|patrolled' : '')

    + (document.getElementById('showBot').checked ? '&rcshow=!bot' : '')

    + '&rcend=' + lastrctimestamp + '&rclimit=' + lrcRCLimit

    + '&leend=' + lastletimestamp + '&lelimit=' + lrcRCLimit

    + '&aflend=' + lastafltimestamp + '&afllimit=' + lrcRCLimit

    + '&format=xml',

    onSuccess: getRC, message: "Traitement en cours...\n\n" });

}   



function hideUser(name) {

   lstHiddenname = true;

   updateHidden();

}



function unhideUser(name) {

   delete lstHiddenname];

   updateHidden();

}



function showHideObj(parent, fils) {

  var ofils = document.getElementById( fils );

  if (parent.checked)

    ofils.style.display="inline";

  else

    ofils.style.display="none";

}



function liveRCInit()

{

  wpajax.http({ url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&meta=userinfo&uiprop=rights&format=xml', 

                onSuccess: getRights});

}



$(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 showIPNEWbox = '';

    if (lrcPatrol)

      showIPNEWbox = '<input id="showIPNEW"    type="checkbox" ' + lrcShowIPNEWChecked + '/>' +

        '<label for="showIPNEW">'   + lang_menu0].IPNEW  + ' </label>';



    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_menu0].PAUSE   + '</label>' +

      '<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'divLivePreview\');" />' +

      '<label for="shidPrev">' + lang_menu0].PREVIEW + '</label>' +

      '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />' +

      '<label for="shidList">' + lang_menu0].LISTS   + '</label>' +

      '<input id="showDiffR" type="checkbox" />' +

      '<label for="showDiffR">'+ lang_menu0].LOWDIFF + '</label>' +

      '<input id="showBot"   type="checkbox" ' + lrcShowBotChecked + ' />' +

      '<label for="showBot">'  + lang_menu0].NOBOTS  + '</label>' + 

      '<input id="showIP"    type="checkbox" ' + lrcShowIPChecked + '/>' +

      '<label for="showIP">'   + lang_menu0].IPONLY  + ' </label>' +

      showIPNEWbox +

      '<input id="showRC"    type="checkbox" ' + lrcShowRCChecked + ' />' +

      '<label for="showRC">'   + lang_menu0].RCLABEL  + ' </label>' +

      '<input id="showLog"    type="checkbox" ' + lrcShowLogChecked + '/>' +

      '<label for="showLog">'   + lang_menu0].LOGSHOW  + ' </label>' +

      '<input id="showFilter"    type="checkbox" ' + lrcShowFilterChecked + '/>' +

      '<label for="showFilter">'   + lang_menu0].ABSHOW  + ' • </label>' +

      '<span id="selectNS" />';



//      '<input id="shidRC"    type="checkbox" checked onclick="showHideObj(this, \'divTabRC\');" />' +

//      '<label for="shidRC">'   + lang_menu[0].RCLABEL + '</label>' +



    if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;



    var _len = lstContact.length;

    lstContact2 = new Array();

    for (var _i=0; _i<_len; _i++)

      lstContact2lstContact_i]] = { ts: 0 };



    // Main

    liveRCInit();

  }

});



/* </source> */