Wikipedia:Monobook.js/LiveRC.js: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
idem
fix errore di sintassi che è lì da 4 mesi, e rende lo script non funzionante da allora
Riga 444: Riga 444:
action: 'edit',
action: 'edit',
title: page,
title: page,
prependtext: testo
prependtext: testo,
summary: "LiveRC : Cancella subito"
summary: "LiveRC : Cancella subito"
} );
} );

Versione delle 16:52, 6 lug 2019

/*
==LiveWP==
*Documentation : [[:fr:User:EDUCA33E/LiveRC/Documentation]]
*Authors : [[:fr:User:EDUCA33E]], [[:fr:User:TiChou]] & [[:pl:User:Leafnode]]
*Version: 0.3.6 (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 (mw.config.get('wgTitle') == "Monobook.js/LiveRC" && mw.config.get('wgAction') === 'view') {

	/*** AVVISO DI DEPRECAZIONE ***/
	alert('Attenzione: Questa versione di LiveRC è molto vecchia e il suo utilizzo è fortemente sconsigliato. ' +
		'Si consiglia di abilitare "LiveRC 1.x" da Speciale:Preferenze, sotto "Accessori". In seguito, aprire le proprie ' +
		'sottopagine JavaScript esistenti (common.js, vector.js e monobook.js) e: 1 - rimuovere "lrc" dalla ' +
		'variabile toLoad, 2-cancellare "importScript(\'Wikipedia:Monobook.js/LiveRC.js\')". Inoltre, se hai abilitato' +
		'l\'accessorio "LiveRC (versione 0.3.6)", devi disattivarlo.');

	// Appel des parametres par défaut de LiveRC ;
	// ///////////////////////////////////////////
	importScript(wgPageName + '/LiveRCparam.js');

	// Appel des parametres utilisateur ;
	// ///////////////////////////////////////////
	importScript('Utente:' + wgUserName + '/LiveRCparam.js');


	//TODO: script non più esistenti
	//importStylesheetURI('http://pl.wikipedia.org/skins-1.5/common/diff.css');
	//importScriptURI('http://pl.wikipedia.org/skins-1.5/common/diff.js');

	var lastrevid, lasttimestamp = 1; // Timestamp d'initialisation;

	// Découpage de l'URL et de ses parametres;

	var _GET = [];
	var _uri = location.href;
	var _temp_get_arr = _uri.substring(_uri.indexOf('?') + 1, _uri.length).split("&");
	var _temp_get_arr_1 = [];
	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 COPYRIGHT = 2 << 16;
	var PAS = 2 << 17;
	var UPLOAD = 2 << 18;
	var NEWUSER = 2 << 19;
	var BLOCK = 2 << 20;
	var DELETE = 2 << 21;
	var MOVE = 2 << 22;
	var PROTECT = 2 << 23;
	var RIGHTS = 2 << 24;
	var DELETE_REVISION = 2 << 25; //RevDelete

	var lstSysop = new Array(); // Sysop list;
	var lstContact = new Array(); // Contact list;
	var lstIPClass = new Array(); // IPClass 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();
	var lstSuivirevid = new Array();
	var lstSuivioldid = new Array();
	var lstSuivircid = new Array();
}

/* </source>

===Utilities===

<source lang="javascript"> */

/******************************************************************************
 *                 Compatibilità DOMParser                                    *
 *       http://developer.mozilla.org/en-US/docs/Web/API/DOMParser            *
 ******************************************************************************/
/*
 * DOMParser HTML extension
 * 2012-09-04
 * 
 * By Eli Grey, http://eligrey.com
 * Public domain.
 * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
 */

/*! @source https://gist.github.com/1129031 */
/*global document, DOMParser*/

(function (DOMParser) {
	"use strict";

	var
		DOMParser_proto = DOMParser.prototype,
		real_parseFromString = DOMParser_proto.parseFromString;

	// Firefox/Opera/IE throw errors on unsupported types
	try {
		// WebKit returns null on unsupported types
		if ((new DOMParser).parseFromString("", "text/html")) {
			// text/html parsing is natively supported
			return;
		}
	} catch (ex) {}

	DOMParser_proto.parseFromString = function (markup, type) {
		if (/^\s*text\/html\s*(?:;|$)/i.test(type)) {
			var
				doc = document.implementation.createHTMLDocument("");
			if (markup.toLowerCase().indexOf('<!doctype') > -1) {
				doc.documentElement.innerHTML = markup;
			} else {
				doc.body.innerHTML = markup;
			}
			return doc;
		} else {
			return real_parseFromString.apply(this, arguments);
		}
	};
}(DOMParser));

/* ========================================================================== */

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

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 = Elements[elementcount].getAttribute('id');
		if (Id) {
			if (Id == elementId) {
				TheElement = Elements[elementcount];
				break;
			}
		}
		elementcount++
	}
	if (!TheElement) return null;
	return TheElement;
}

function getPageContent(Req, ID) {
	var OldTemp = document.getElementById("TempDiv");
	if (OldTemp) OldTemp.parentNode.removeChild(OldTemp);
	var Temp = document.createElement('div');
	Temp.id = "TempDiv";
	Temp.style.display = "none";
	document.body.appendChild(Temp);
	Temp.innerHTML = Req.responseText;
	var bC;
	if (ID) {
		bC = getElementWithId(ID, '*', Temp);
	} else {
		bC = getElementWithId('bodyContent', 'div', Temp);
		if (bC == null) bC = getElementWithId('article', 'div', Temp);
		if (bC == null) bC = getElementWithId('mw_contentholder', 'div', Temp);
	}
	return bC;
}

// 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 = new RegExp(chars[i], "g");
		string = string.replace(regex, '&' + entities[i] + ';');
	}
	return string;
}

/* </source>

=== LiveDiff ===

<source lang="javascript"> */

function liveDiff(page, id, oldid, rcid) {
	var el = document.getElementById('livePreviewTitle');
	el.innerHTML = "<b style='text-decoration: blink;'>Diff : <span style='color:red'>" + page + "</span>...</b>";
	wpajax.http({
		url: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(page) + '&diffonly=1&diff=' + id + '&oldid=' + oldid,
		onSuccess: getDiff,
		mpage: page,
		mid: id,
		moldid: oldid,
		mrcid: rcid
	});
}

function getRevisions(title, rvstartid) {
	var jsondata;
	$.ajax({
		url: mw.util.wikiScript('api'),
		data: {
			action: 'query',
			prop: 'revisions',
			rvprop: 'user',
			titles: title,
			rvstartid: rvstartid,
			rvlimit: 2,
			continue: '',
			format: 'json',
		},
		async: false,
		dataType: 'json'
	}).done(function (data) {
		jsondata = data;
	});
	return jsondata.query.pages[Object.keys(jsondata.query.pages)[0]].revisions;
}

function getDiff(xmlreq, data) {
	var page = data.mpage;
	var oldid = data.moldid;
	var id = data.mid;
	var rcid = data.mrcid;
	var bC = getPageContent(xmlreq);
	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 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 = "<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/' + escape(page) + '" target="_new">' + page + '</a></b> • ' +
		'(<a href="javascript:;" onClick="liveHist(\'' + upage + '\');" style="color:darkorange">Cron</a>)';

	var asNextDiff = getElementWithId("differences-nextlink", "*", bC);
	if (asNextDiff == null) {
		var optAvert = "";
		var optl = lstAvert.length;
		for (j = 0; j < optl; j++) {
			optAvert += '<option value="' + lstAvert[j].template;
			if (lstAvert[j].template == "Loggati") {
				if (lstAvert[j].hasPage) optAvert += '|' + upage.substr(7);
			} else {
				if (lstAvert[j].hasPage) optAvert += '|' + upage;
			}

			optAvert += '">' + lstAvert[j].string + '</option>';
		}

		// commentata e sostituita con nuova funzione getRevisions,
		// tutta la parte seguente da "Get username of submitter" fino user2=... per:
		// [[Speciale:PermaLink/81300049#Problema_LiveRC_0.3.6]]
		var revisions = getRevisions(page, id);
		var user1 = revisions[1].user;
		var user2 = revisions[0].user;
		/*
		// Get username of submitter
		var user1 = getElementWithId( 'mw-diff-otitle2' , "*" , bC );
		if (user1 != null) {
		  var usertmp=user1.innerHTML;
		  var daDove = usertmp.indexOf('tente:')+6;
		  var daDove2 = usertmp.indexOf('/wiki/Speciale:Contributi/')+26;
		  
		  if ((daDove2 != -1) && (daDove2 < daDove)) // e' un anonimo
		    daDove3 = daDove2;
		  else
		    daDove3 = daDove;
		  
		  var finoA = usertmp.indexOf('" title="');
		  var finoA2 = usertmp.indexOf('&amp;action=edit');
		  
		  if ((finoA2 != -1) && (finoA2 < finoA)) // non esiste la pagina utente
		    finoA3 = finoA2;
		  else
		    finoA3 = finoA;
		    
		  user1 = usertmp.substr(daDove3, finoA3-daDove3);
		}
		var user2 = getElementWithId( 'mw-diff-ntitle2'  , "*" , bC );
		if (user2 != null) {
		  var usertmp=user2.innerHTML;
		  var daDove = usertmp.indexOf('tente:')+6;
		  var daDove2 = usertmp.indexOf('/wiki/Speciale:Contributi/')+26;
		  
		  if ((daDove2 != -1) && (daDove2 < daDove)) // e' un anonimo
		    daDove3 = daDove2;
		  else
		    daDove3 = daDove;
		  
		  var finoA = usertmp.indexOf('" title="');
		  var finoA2 = usertmp.indexOf('&amp;action=edit');
		  
		  if ((finoA2 != -1) && (finoA2 < finoA)) // non esiste la pagina utente
		    finoA3 = finoA2;
		  else
		    finoA3 = finoA;
		    
		  user2 = usertmp.substr(daDove3, finoA3-daDove3);
		}
		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><tr><td /></tr></table>';

		document.getElementById('LiveRevertMessage').focus();
	}
}

function getLiveDelete(page, type) {
	page = encodeURIComponent(page);
	var link = document.getElementById('LiveCancImmLink');
	link.href = "javascript:;";
	link.style.color = "silver";
	link.style.cursor = "default";
	link.style.textDecoration = "none";
	document.getElementById('LiveRevertMessage').disabled = true;
	
	if (type == "copyviol") {
		var testo = '{{Cancelcopy|' + document.getElementById('LiveRevertMessage').value + '}}\n\n';
	} else {
		var testo = '{{Cancella subito|' + document.getElementById('cancimmAvert').value + '}}\n\n';
	}

	new mw.Api().postWithEditToken( {
		action: 'edit',
		title: page,
		prependtext: testo,
		summary: "LiveRC : Cancella subito"
	} );
}

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;

	var fixMessage = message.replace(new RegExp(/\\'/g), "'");

	var testo,
		page = 'Discussioni utente:' + encodeURIComponent(user);

	if (message == "Grazie") {
		testo = '\n==Grazie==\n{{' + fixMessage + '}}--~~~~\n';
	} else if (message == "Test") {
		testo = '\n==Grazie==\n{{' + fixMessage + '}} --~~~~\n';
	} else if (message == "Benvenuto") {
		testo = '\n{{' + fixMessage + '}}--~~~~\n';
	} else {
		testo = '\n==Avviso==\n{{' + fixMessage + '}}--~~~~\n';
	}

	if (message.indexOf('|') != -1)
		template = message.substr(0, message.indexOf('|'));
	else
		template = message;

	var optl = lstAvert.length;
	var summary = "LiveRC: Avviso";
	for (j = 0; j < optl; j++)
		if (lstAvert[j].template == template)
			summary = "LiveRC: " + lstAvert[j].string;

	new mw.Api().postWithEditToken( {
		action: 'edit',
		title: page,
		appendtext: testo
		summary: summary
	} );
}

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: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(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, 'text/html');

	var where = data.where;
	var page = data.page;
	var user1 = data.user1;
	var user2 = data.user2;
	var message = data.message;

	var wpTextbox1 = encodeURIComponent(doc.getElementsByTagName('textarea')[0].textContent);

	var inputs = doc.getElementsByTagName('form')[0].getElementsByTagName('input');
	var editform = new Array();
	for (i = 0; i < inputs.length; i++) {
		if (inputs[i].getAttributeNode("value") != null)
			editform[inputs[i].getAttributeNode("name").value] = inputs[i].getAttributeNode("value").value;
	}
	var wpStarttime = encodeURIComponent(editform['wpStarttime']);
	var wpEdittime = encodeURIComponent(editform['wpEdittime']);
	var wpEditToken = encodeURIComponent(editform['wpEditToken']);
	var suivipos = lstSuivi.indexOf(page);
	if (suivipos == -1)
		var wpWatchthis = "";
	else
		var wpWatchthis = "&wpWatchthis=1";

	switch (where) {
	case 'liverevert':
		var wpSummary = lang_menu[0].RVMES1 + ' [[Speciale:Contributi/' + user2 + '|' + user2 +
			']]; ' + lang_menu[0].RVMES2 + ' [[Utente:' + 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: wgServer + 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 + wpWatchthis
	});
}

/* </source>

=== LiveHist ===

<source lang="javascript"> */

function liveHist(page) {
	// uso delle "  (soluzione di merda, ma se funziona...)
	var page = page.replace(new RegExp(/\%22/g), '"');

	var el = document.getElementById('livePreviewTitle');
	el.innerHTML = "<b style='text-decoration: blink;'>Cron : <span style='color:red'>" + page + "</span>...</b>";
	wpajax.http({
		url: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(page) + '&action=history',
		onSuccess: getHist,
		message: page
	});
}

function getHist(xmlreq, data) {
	var bC = getPageContent(xmlreq);
	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, user) {
	// uso delle "  (soluzione di merda, ma se funziona...)
	var page = page.replace(new RegExp(/\%22/g), '"');

	var el = document.getElementById('livePreviewTitle');
	el.innerHTML = "<b style='text-decoration: blink;'><span style='color:red'>" + page + "</span>...</b>";
	wpajax.http({
		url: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(page) + '&redirect=no',
		onSuccess: getArticle,
		message: page,
		user: user
	});
}

function getArticle(xmlreq, data) {
	var bC = getPageContent(xmlreq);
	var c = data.message;
	var user = data.user;
	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 upage = c.replace(new RegExp(/\'/g), "\\'");
	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>';
	}

	var elt = document.getElementById('livePreviewTitle');
	elt.innerHTML = '<b><a href="' + wgServer + '/wiki/' + encodeURI(c) + '" target="_new">' + c + '</a></b>';

	var cancimmAvert = "";

	cancimmAvert += '<option value="1">1. pagine vuote, di prova</option>';
	cancimmAvert += '<option value="2">2. solo frasi offensive</option>';
	cancimmAvert += '<option value="3">3. solo lingua straniera</option>';
	cancimmAvert += '<option value="4">4. promozionali o CV</option>';
	cancimmAvert += '<option value="5">5. pagine doppie</option>';
	cancimmAvert += '<option value="6">6. categorie vuote</option>';
	cancimmAvert += '<option value="7">7. pagine già cancellate</option>';
	cancimmAvert += '<option value="8">8. pagine create per l\'inversione</option>';
	cancimmAvert += '<option value="9">9. redirect errati</option>';
	cancimmAvert += '<option value="10">10. talk e sottopag. di pagine già canc.</option>';
	cancimmAvert += '<option value="11">11. immagini doppie ed orfane</option>';
	cancimmAvert += '<option value="12">12. immagini in evidente copyviol</option>';
	cancimmAvert += '<option value="13">13. pagine copiate senza licenza libera</option>';
	cancimmAvert += '<option value="14">14. immagini da verificare da tanto</option>';
	cancimmAvert += '<option value="15">15. pagine \"Utente:\" di nessuno</option>';
	cancimmAvert += '<option value="16">16. pagine già trasferite</option>';
	cancimmAvert += '<option value="17">17. sottopag. "Utente:" richieste da lui</option>';

	elt.innerHTML = '<table width="100%" class="creator"><tr><td>' + elt.innerHTML +
		'</td><td align="right"><small>' +
		// Verifier avant si le patrouilleur peut modifier cette page ? (query.php?what=permissions&titles=page)
		// canc imm
		'[<a id="LiveCancImmLink" href="javascript:getLiveDelete(\'' + encodeURIComponent(c) + '\');" >' + lang_menu[0].CANCIMM + '</a>] ' +
		'<select id="cancimmAvert">' + cancimmAvert + '</select> • ' +
		lang_menu[0].REASON2 + ' : <input id="LiveRevertMessage" /> • ' +
		// canc x copyviol
		'[<a id="LiveCancImmLink" href="javascript:getLiveDelete(\'' + encodeURIComponent(c) + '\',\'copyviol\');" >' + lang_menu[0].CANCCV + '</a>] ••• ' +
		'[<a id="LiveAvertoLink" href="javascript:getLiveAverto(\'' + user + '\');">' + lang_menu[0].AVERTS + '</a>] : ' +
		'<select id="averto">' + optAvert + '</select>' +
		'</td></tr></table>';
	document.getElementById('LiveRevertMessage').focus();
}

/* </source>

=== LiveLog ===

<source lang="javascript"> */

function liveLog(action, page) {
	var titolo = '';
	switch (action) {
	case 'upload':
		titolo = 'Log dei caricamenti';
		break;
	case 'newuser':
		titolo = 'Log dei nuovi utenti';
		break;
	case 'block':
		titolo = 'Log dei blocchi utente';
		break;
	case 'delete':
		titolo = 'Log delle cancellazioni';
		break;
	case 'move':
		titolo = 'Log degli spostamenti';
		break;
	case 'protect':
		titolo = 'Log delle protezioni';
		break;
	case 'rights':
		titolo = 'Log dei cambi di permessi';
		break;
	case '':
		titolo = 'Log';
		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: wgServer + wgScriptPath + '/index.php?title=Speciale:Registri&type=' + action + "&user=&page=" + encodeURIComponent(page),
		onSuccess: getLog,
		message: page
	});
}

function getLog(xmlreq, data) {
	var bC = getPageContent(xmlreq);
	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/Speciale:Contributi/' + encodeURIComponent(user),
		onSuccess: getContrib,
		message: user
	});
}

function getContrib(xmlreq, data) {
	var bC = getPageContent(xmlreq);
	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() {
	jQuery.getJSON(
		mw.config.get('wgScriptPath') + '/api.php?callback=?', {
			action: 'query',
			list: 'allusers',
			augroup: 'sysop',
			aulimit: '500',
			format: 'json'
		},
		function (obj) {
			jQuery.each(obj.query.allusers, function (k, val) {
				lstSysop.push(val.name);
			});
			liveNS();
		}
	);
}

function liveWatch() {
	jQuery.getJSON(
		mw.config.get('wgScriptPath') + '/api.php?callback=?', {
			action: 'query',
			list: 'watchlistraw',
			wrlimit: '500',
			wrowner: mw.config.get('wgUserName'),
			wrtoken: mw.user.options.get('watchlisttoken'),
			format: 'json'
		},
		function (obj) {
			jQuery.each(obj.watchlistraw, function (k, val) {
				var info = val.title;

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

				// watch the talk too      
				if (info.indexOf("Utente:") == 0)
					lstSuivi.push("Discussioni utente:" + info.substr(7));
				else if (info.indexOf("Wikipedia:") == 0)
					lstSuivi.push("Discussioni Wikipedia:" + info.substr(10));
				else if (info.indexOf("Immagine:") == 0)
					lstSuivi.push("Discussioni immagine:" + info.substr(9));
				else if (info.indexOf("MediaWiki:") == 0)
					lstSuivi.push("Discussioni MediaWiki:" + info.substr(10));
				else if (info.indexOf("Template:") == 0)
					lstSuivi.push("Discussioni template:" + info.substr(9));
				else if (info.indexOf("Aiuto:") == 0)
					lstSuivi.push("Discussioni aiuto:" + info.substr(6));
				else if (info.indexOf("Categoria:") == 0)
					lstSuivi.push("Discussioni categoria:" + info.substr(10));
				else if (info.indexOf("Portale:") == 0)
					lstSuivi.push("Discussioni portale:" + info.substr(8));
				else if (info.indexOf("Progetto:") == 0)
					lstSuivi.push("Discussioni progetto:" + info.substr(9));
				else // ns0
					lstSuivi.push("Discussione:" + info);

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


function liveNS() {
	wpajax.http({
		url: wgServer + wgScriptPath + '/api.php?action=query&meta=siteinfo&siprop=namespaces&format=xml&rawcontinue',
		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;
		//Ex "Article"
		if (id == 0) ns = "(Principale)";

		//Select namespace (default = *)
		if (typeof (checkNamespace) != "undefined" && checkNamespace == id)
			options += '<option value="' + id + '" SELECTED >' + ns + '</option>';
		else
			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 = /^([-+])?(\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 = /^\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/Discussioni utente:' + encodeURIComponent(user) + '" style="color:seagreen" target="_new">D</a>';
		var ucontrib = '<a href="javascript:;" onClick="liveContrib(\'' + utilde + '\');" style="color:#43CD80">C</a>';
		var uadmin = '';
		if (lrcAdmin == true) {
			uadmin = ' • <a href="' + wgServer + '/wiki/Speciale:Blocca/' + encodeURI(user) + '" target="_new" style="color:seagreen">B</a>';
		}
		var ueditor = '<a href="' + wgServer + '/wiki/Utente:' + 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/Discussioni utente:' + encodeURIComponent(user) + '" style="color:seagreen" target="_new">D</a>';
		var ucontrib = '<a href="javascript:;" onClick="liveContrib(\'' + utilde + '\');" style="color:#43CD80">C</a>';
		var uadmin = '';
		if (lrcAdmin == true) {
			uadmin = ' • <a href="' + wgServer + '/wiki/Speciale:Blocca/' + encodeURI(user) + '" target="_new" style="color:seagreen">B</a>';
		}
		var ueditor = '<a href="' + wgServer + '/wiki/Utente:' + 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/Discussioni utente:' + encodeURIComponent(user) + '" style="color:seagreen" target="_new">D</a>';
		var ucontrib = '<a href="javascript:;" onClick="liveContrib(\'' + utilde + '\');" style="color:#43CD80">C</a>';
		var uadmin = '';
		if (lrcAdmin == true) {
			uadmin = ' • <a href="' + wgServer + '/wiki/Speciale:Blocca/' + encodeURI(user) + '" target="_new" style="color:seagreen">B</a>';
		}
		var ueditor = '<a href="' + wgServer + '/wiki/Utente:' + 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(),
		regex2 = new RegExp();

	//  var rc = data.rc
	var title = rc.title;
	var pageid = rc.pageid;
	var revid = rc.revid;
	var oldid = rc.old_revid;
	var rcid = rc.rcid;
	var user = rc.user;
	var comment = (rc.comment ? rc.comment : "");
	var timestamp = rc.timestamp;
	var ns = rc.ns;
	var state = rc.state;

	// ONLY LOG
	var type = rc.type;
	var new_title = rc.new_title;
	var duration = duration;

	regex = /\'/g;
	regex2 = /\"/g;
	var escTitle = title.replace(regex, "\\'");
	var diffEscTitle = escTitle.replace(regex2, '\%22');
	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(\'' + diffEscTitle + '\',\'' + 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 & RIGHTS)
		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 & DELETE_REVISION)
		diff = '<a href="javascript:;" onClick="changeLigne(\'' + pageid + '_' + revid + '\');liveLog(\'delete\',\'' + escTitle + '\');' + diffClose + '" style="color: chocolate">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 // simple edit
		diff = '<a href="javascript:;" onClick="changeLigne(\'' + pageid + '_' + revid + '\');liveDiff(\'' + diffEscTitle + '\',' + revid + ',' + oldid + ',' + rcid + ');' + diffClose + '" style="color:orange">Diff</a>';

	var hist = '';
	var livelogs = '';
	var edit = '';
	var admin = '';
	// Don't show link for log rows
	if (!(state & UPLOAD) &&
		!(state & NEWUSER) &&
		!(state & BLOCK) &&
		!(state & RIGHTS) &&
		!(state & DELETE) &&
		!(state & DELETE_REVISION) &&
		!(state & PROTECT) &&
		!(state & MOVE)) {
		hist = '<a href="javascript:;" onClick="liveHist(\'' + diffEscTitle + '\');" style="color:darkorange">C</a>';
		edit = '<a href="' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=edit" target="_new" style="color:tomato">M</a>';
		livelogs = '<a href="javascript:;" onClick="liveLog(\'\',\'' + escTitle + '\');" style="color:hotpink">L</a>';

		if (lrcAdmin == true) {
			admin = ' • <a href="' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=delete" target="_new" style="color:orangered">S</a>';

			admin += ' • <a href="' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=protect" target="_new" style="color: coral">P</a>';
		}
	}

	// Disambig / Homonymie ? ;
	///////////////////////////
	if (ns == 0 && state & HOMONYMIE) {
		artiStyle = 'color: darkorange; font-weight: bold; font-style: italic;';
		preArti += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/7/72/Disambig.svg/16px-Disambig.svg.png" width="16px" alt="Disambigua" title="Disambigua" /> '
	}

	// Page protégée ? ;
	////////////////////
	if (state & FULLLOCK)
		preArti += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/4/48/Padlock-red.svg/16px-Padlock-red.svg.png" width="16px" alt="Voce protetta" title="Voce protetta"/> ';
	if (state & LOCK)
		preArti += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Padlock-gold.svg/16px-Padlock-gold.svg.png" width="16px" alt="Voce semiprotetta" title="Voce semiprotetta"/> ';

	// Copyright ? ;
	//////////
	if (state & COPYRIGHT)
		preArti += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Copyright.svg/16px-Copyright.svg.png" width="16px" alt="Copyright" title="Copyright" /> ';

	// PaS ? ;
	//////////////////
	if (state & PAS)
		preArti += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Cestino_pieno_architetto_01.svg/11px-Cestino_pieno_architetto_01.svg.png" height="11px" alt="Voci da cancellare" title="Voci da cancellare" /> ';

	// Adq ? ;
	//////////
	if (state & ADQ)
		postArti += '<sup><img src="//upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Fairytale_bookmark_gold.png/10px-Fairytale_bookmark_gold.png" width="10px" alt="Voci in vetrina" title="Voci in vetrina" /></sup>';

	// Article catégorisé ? ;
	/////////////////////////
	var isCategorized = "";
	if (!(state & REDIRECT) &&
		!(state & HOMONYMIE) &&
		ns == 0 &&
		!(state & CATEGORIZED))
		postArti += '<sup style="color:crimson">(cat ?)</sup>';

	// Redirect, Log, or simple edit ? ;
	//////////////////
	if (state & MOVE) {
		//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/0/0e/Forward.png" width="20px" alt="Sposta" title="Sposta" />';
		var diffnew_title = rc.new_title.replace(new RegExp(/\"/g), '\%22');
		postArti += ' <a href="javascript:;" onClick="liveArticle(\'' + diffnew_title + '\',\'' + user + '\');">' + rc.new_title + '</a>';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');">' + title + '</a>';
	} else if (state & REDIRECT) {
		artiStyle = 'color: green; font-weight: bold; font-style: italic;';
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Redirectltr.png/20px-Redirectltr.png" width="20px" alt="Redirect" title="Redirect" />';
		var diffredirect = rc.redirect.replace(new RegExp(/\"/g), '\%22');
		postArti += ' <a href="javascript:;" onClick="liveArticle(\'' + diffredirect + '\',\'' + user + '\');">' + rc.redirect + '</a>';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');">' + title + '</a>';
	} else if (state & UPLOAD) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/4/47/Gartoon-Gnome-dev-floppy.png" width="20px" alt="Carica" title="Carica" />';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');" onDblClick="window.open(\'' + wgServer + '/wiki/' + encodeURI(title) + '\');">' + title + '</a>';
	} else if (state & NEWUSER) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/c/c1/Crystal_personal.png" width="20px" alt="Nuovo utente" title="Nuovo utente" />';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + 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="//upload.wikimedia.org/wikipedia/commons/6/64/Crystal_Clear_action_lock3.png" width="20px" alt="Blocca" title="Blocca" />';
		postArti += ' <a href="javascript:;" onClick="liveLog("block",\'' + rc.title + '\');">(' + rc.duration + ')</a>';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');">' + title + '</a>';
	} else if (state & RIGHTS) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/it/1/10/Stub_universit%C3%A0.png" width="20px" alt="Permessi" title="Permessi" />';
		postArti += ' <a href="javascript:;" onClick="liveLog("rights",\'' + rc.title + '\');">(da \'' + rc.rightsOld + '\' a \'' + rc.rightsNew + '\')</a>';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');">' + title + '</a>';
	} else if (state & DELETE) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/e/ef/Editcut.png" width="20px" alt="Cancella" title="Cancella" />';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');" onDblClick="window.open(\'' + wgServer + '/wiki/' + encodeURI(title) + '\');">' + title + '</a>';
	} else if (state & DELETE_REVISION) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/a/a7/Kgpg_info.png" width="20px" alt="Cambia visibilità" title="Cambia visibilità" />';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');" onDblClick="window.open(\'' + wgServer + '/wiki/' + encodeURI(title) + '\');">' + title + '</a>';
	} else if (state & PROTECT) {
		postArti += ' <img src="//upload.wikimedia.org/wikipedia/commons/7/72/Crystal_Clear_app_agent.png" width="20px" alt="Proteggi" title="Proteggi" />';
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');" onDblClick="window.open(\'' + wgServer + '/wiki/' + encodeURI(title) + '\');">' + title + '</a>';
	} else {
		arti = '<a style="' + artiStyle + '" href="javascript:;" onClick="liveArticle(\'' + diffEscTitle + '\',\'' + user + '\');" onDblClick="window.open(\'' + wgServer + '/wiki/' + encodeURI(title) + '\');">' + title + '</a>';
	}

	th1.innerHTML = '<small>' + tsToHhMm(timestamp) + ' • ' + diff + ' • ' + hist + ' • ' + edit + ' • ' + livelogs + 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/Discussioni utente:' + encodeURIComponent(user) + '" style="color:seagreen" target="_new">D</a>';
	var contrib = '<a href="javascript:;" onClick="liveContrib(\'' + escUser + '\');" style="color:#43CD80">C</a>';
	var editor = "",
		preEditor = "";

	// Bot ? ;
	//////////
	if (state & BOT)
		preEditor += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Nuvola_apps_kservices.png/16px-Nuvola_apps_kservices.png" width="16px" alt+"bot" title="bot"/>&nbsp;';

	// Sysop ? ;
	////////////
	if (state & SYSOP)
		preEditor += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Broom_icon.svg/16px-Broom_icon.svg.png" width="16px" alt="sysop" title="sysop" />&nbsp;';

	// Reverted ? ;
	/////////////////
	if (state & REVERT)
		preEditor += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Nuvola_actions_undo.png/16px-Nuvola_actions_undo.png" width="16px" alt="rollback" title="rollback" />&nbsp;';

	// TOR potentiel / AOL
	var isTOR = regex = /172\.\d+\.\d+\.\d+/;
	if (isTOR.test(user))
		preEditor += '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Dialog-warning.svg/16px-Dialog-warning.svg.png" width="16px" alt="forse TOR" title="forse TOR" />&nbsp;';

	editor = '<a href="' + wgServer + '/wiki/Utente:' + encodeURIComponent(user) + '" target="_new">' + user + '</a>';
	var uadmin = '';
	if (lrcAdmin == true) {
		uadmin = ' • <a href="' + wgServer + '/wiki/Speciale:Blocca/' + encodeURI(user) + '" target="_new" style="color:seagreen">B</a>';
	}

	var uhide = '<a href="javascript:;" onClick="supprLigne(\'' + pageid + '_' + revid + '\'); hideUser(\'' + user + '\');" style="color:grey">N</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 + ' rollback)</sup>'
	}

	// COMMENT //
	// Remplace lien [[xxx]] par <a> ;
	var wcomment = comment.htmlize();
	regex = /\[\[(([^\]\|]*)(.*?))\]\]/g;
	wcomment = wcomment.replace(regex, "<a href='" + wgServer + wgScriptPath + "/index.php?title=$2&redirect=no' target='_new'>$1</a>");
	regex = /\>[^\]\|<]*\|([^\]\|<]*)</g;
	wcomment = wcomment.replace(regex, ">$1<");

	td3.innerHTML = "<small>" + wcomment + "</small>";
	td3.style.border = "1px";
	td3.style.width = "40%";

	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 & RIGHTS) {
		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 & DELETE_REVISION) {
		th0.style.backgroundColor = "#D89A6D";
		th1.style.backgroundColor = "#D89A6D";
		td2.style.backgroundColor = "#D89A6D";
		td3.style.backgroundColor = "#D89A6D";
		td4.style.backgroundColor = "#D89A6D";
		tr1.style.border = "1px solid chocolate";
	}


	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 = "#FFBAB3";
		th1.style.backgroundColor = "#FFBAB3";
		td2.style.backgroundColor = "#FFBAB3";
		td3.style.backgroundColor = "#FFBAB3";
		td4.style.backgroundColor = "#FFBAB3";
		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 = "#BDE397";
		th1.style.backgroundColor = "#BDE397";
		td2.style.backgroundColor = "#BDE397";
		td3.style.backgroundColor = "#BDE397";
		td4.style.backgroundColor = "#BDE397";
		tr1.style.border = "1px solid green";

		// check if the page has been already deleted
		myXmlReq = wpajax.http({
			url: wgServer + wgScriptPath + '/api.php?action=query&list=deletedrevs&titles=' + title + '&drprop=user&format=xml&rawcontinue'
		});
		var api = myXmlReq.responseXML;
		if (api) {
			if (api.firstChild.nodeName == "error") return;
			deletedRevs = api.getElementsByTagName('rev');
			if (deletedRevs.length != 0) {
				th1.style.border = "1px solid red";
				th1.style.backgroundColor = "#FFDDDD";
				th1.innerHTML += '<img src="//upload.wikimedia.org/wikipedia/commons/f/f7/Gartoon-Emblem-trash.png" width="15px" alt="Voce cancellata in precedenza" title="Nuova voce già cancellata in precedenza" />'
			}
		}
	}

	if (state & IP) {
		td2.style.backgroundColor = "#B9F8FF";
		td3.style.backgroundColor = "#B9F8FF";
		td4.style.backgroundColor = "#B9F8FF";
	}

	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="//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Categorie_III.svg/10px-Categorie_III.svg.png" width="10px" alt="Avviso" title="Avviso"/>';
		tr1.style.border = "2px solid crimson";
	}

	// CONTACT LIST //
	//////////////////
	if (lstContact[user]) {
		td2.style.border = "2px solid gold";
		td2.style.backgroundColor = "yellow";
	}

	// IPCLASS LIST //
	//////////////////
	for (var IPclass in lstIPClass) {
		if (user.indexOf(IPclass) == 0) {
			td2.style.border = "2px solid gold";
			td2.style.backgroundColor = "yellow";
			IPclassMitigating = true;
		}
	}

	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 || typeof (oldid) == "undefined") {
		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 & RIGHTS) &&
			!(state & DELETE) &&
			!(state & DELETE_REVISION) &&
			!(state & PROTECT) &&
			!(state & MOVE)))
		supprLigne(pageid + "_" + revid);

	// Don't show Log if checkbox is not checked
	if ((!document.getElementById('showLog').checked) &&
		((state & UPLOAD) ||
			(state & NEWUSER) ||
			(state & BLOCK) ||
			(state & RIGHTS) ||
			(state & DELETE) ||
			(state & DELETE_REVISION) ||
			(state & PROTECT) ||
			(state & MOVE)))
		supprLigne(pageid + "_" + revid);

	// Don't show "non-Log" with +NaN diffsize (fake edits)
	if (isNaN(sizediff) &&
		!(state & UPLOAD) &&
		!(state & NEWUSER) &&
		!(state & BLOCK) &&
		!(state & RIGHTS) &&
		!(state & DELETE) &&
		!(state & DELETE_REVISION) &&
		!(state & PROTECT) &&
		!(state & MOVE))
		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";
		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 diffcstilde = cstilde.replace(new RegExp(/\"/g), '\%22');

			if (lstSuivi[n] == title) {
				lstSuivirevid[n] = revid;
				lstSuivioldid[n] = oldid;
				lstSuivircid[n] = rcid;
			}

			var myrevid = lstSuivirevid[n];
			var myoldid = lstSuivioldid[n];
			var myrcid = lstSuivircid[n];

			var sdiff = '<a href="javascript:;" onClick="liveDiff(\'' + diffcstilde + '\',' + myrevid + ',' + myoldid + ',' + myrcid + ');" style="color:orange">Diff</a>';
			var shist = '<a href="javascript:;" onClick="liveHist(\'' + diffcstilde + '\');" style="color:darkorange">C</a>';
			var sarti = '<a href="javascript:;" onClick="liveArticle(\'' + diffcstilde + '\',\'' + user + '\');">' + 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 = /\[\[Special:Contributions\/([^\]\|]+)/;
		match = regex.exec(comment);

		if (!match) {
			regex = /\[\[Speciale:Contributi\/([^\]\|]+)/;
			match = regex.exec(comment);
		}

		if (match) {
			var userR = match[1];
			if (userR != user && userR != mw.config.get('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('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 (yurik.getElementsByTagName('redirects').length) {
		state += REDIRECT;
		if (yurik.getElementsByTagName('redirects')[0].getElementsByTagName('r').length)
			rc.redirect = yurik.getElementsByTagName('redirects')[0].getElementsByTagName('r')[0].attributes[1].nodeValue;
	}

	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].attributes[1].textContent))
					state += categoriestests[j].state;
	}

	rc.state = state;

	getRevision(rc);
	//  wpajax.http({ url: wgServer + wgScriptPath + '/api.php?action=query&prop=revisions&pageids=' + pageid + '&rvstartid=' + revid + '&rvlimit=1&rvprop=content&format=xml&rawcontinue', 
	//                onSuccess: getRevision, rc: rc });
}

function getRedirCat2(xmlreq, data) {
	if (document.getElementById('stopLive').checked) return;

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

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

	var log = data.log;
	var pageid = log.pageid;
	var revid = log.revid;
	var state = log.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)
			log.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;
	}

	log.state = state;

	getRevision(log);
	//  wpajax.http({ url: wgServer + wgScriptPath + '/api.php?action=query&prop=revisions&pageids=' + pageid + '&rvstartid=' + revid + '&rvlimit=1&rvprop=content&format=xml&rawcontinue', 
	//                onSuccess: getRevision, rc: rc });
}

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

	// RC

	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 IPclassMitigating = false;
		for (var IPclass in lstIPClass)
			if (rc.user.indexOf(IPclass) == 0)
				IPclassMitigating = true;

		var mitigating = (rc.state & REVERT) ||
			(rc.state & BLANKING) ||
			(rc.state & REPLACED) ||
			(lstContact[rc.user]) ||
			(lstRevoc[rc.user]) ||
			(rc.user == wgUserName) ||
			(IPclassMitigating == true);

		if (document.getElementById('showIP').checked &&
			!(rc.state & IP) &&
			!mitigating) continue;

		if (lstHidden[rc.user] && !mitigating) continue;

		wpajax.http({
			url: wgServer + wgScriptPath + '/api.php?titles=' + encodeURIComponent(rc.title) + '&action=query&prop=categories&redirects&format=xml&rawcontinue',
			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 (logs[i].getAttribute('timestamp').replace(new RegExp(/\D/g), "") <= lasttimestamp) continue;

		log = new Object();
		log.state = 0;

		lenj = logs[i].attributes.length;

		//Cerca il campo 'action'
		var action = null;
		for (j = 0; j < lenj; j++)
			if (logs[i].attributes[j].name == 'action')
				action = logs[i].attributes[j].value;

		for (j = 0; j < lenj; j++) {
			if (logs[i].attributes[j].name == 'type') {
				switch (logs[i].attributes[j].value) {
				case 'patrol':
					// I "Segna come verificata" non li cago
					//          rc.state += PATROL;
					break;
				case 'newusers':
					log.state += NEWUSER;
					break;
				case 'upload':
					log.state += UPLOAD;
					break;
				case 'block':
					log.state += BLOCK;
					if (logs[i].firstChild)
						log.duration = logs[i].firstChild.attributes[1].value;
					break;
				case 'delete':
					if (action == 'delete')
						log.state += DELETE;
					else if (action == 'revision')
						log.state += DELETE_REVISION;
					break;
				case 'move':
					log.state += MOVE;
					if (logs[i].firstChild)
						log.new_title = logs[i].firstChild.attributes[1].value;
				case 'rights':
					log.state += RIGHTS;
					if (logs[i].firstChild) {
						log.rightsOld = logs[i].firstChild.attributes[1].value;
						log.rightsNew = logs[i].firstChild.attributes[0].value;
					}
				case 'protect':
					log.state += PROTECT;
					break;
				default:
					break;
				}
			} else
				log[logs[i].attributes[j].name] = logs[i].attributes[j].value;
		}

		if (typeof (log.comment) != "undefined") {
			lenj = commenttests.length;
			for (j = 0; j < lenj; j++)
				if (new RegExp(commenttests[j].regex).test(log.comment))
					log.state += commenttests[j].state;
		}

		if (lstSysop.indexOf(log.user) != -1)
			log.state += SYSOP;

		wpajax.http({
			url: wgServer + wgScriptPath + '/api.php?titles=' + encodeURIComponent(log.title) + '&action=query&prop=categories&redirects&format=xml&rawcontinue',
			onSuccess: getRedirCat2,
			log: log
		});
	}

	lastrevid = rcs[0].getAttribute('revid');
	lasttimestamp = rcs[0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");
	document.getElementById('tsInit').innerHTML = "Ultima versione : " + 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&rctype=edit|new|log&rcnamespace=' + rcns +
			'&rcprop=user|comment|flags|timestamp|title|ids|sizes' + rcshow +
			'&rcend=' + lasttimestamp + '&rclimit=' + lrcRCLimit +
			'&leend=' + lasttimestamp + '&lelimit=' + lrcRCLimit +
			'&format=xml&rawcontinue',
		onSuccess: getRC,
		message: "Elaborazione in corso...\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";
}

$.when(
	$.getScript('/w/index.php?title=Wikipedia:Monobook.js/Utils.js&action=raw&ctype=text/javascript'),
	$.ready
)
.done( function () {
	if (wgTitle == "Monobook.js/LiveRC") {

		//HACK: Se il file delle impostazioni non è ancora stato caricato, riprova più tardi
		if (typeof lang_menu == 'undefined') {
			setTimeout(arguments.callee, 250);
			return;
		}

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

		//Anteprima (default = not checked)
		if (typeof (checkAnteprima) != "undefined" && checkAnteprima == "1")
			lvPreviewFoot.innerHTML += '<input id="shidPrev"  type="checkbox" checked onclick="showHideObj(this, \'divLivePreview\');" />';
		else
			lvPreviewFoot.innerHTML += '<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'divLivePreview\');" />';
		showHideObj(document.getElementById("shidPrev"), 'divLivePreview');
		lvPreviewFoot.innerHTML += '<label for="shidPrev">' + lang_menu[0].PREVIEW + '</label>';

		//Liste (default = not checked)
		if (typeof (checkListe) != "undefined" && checkListe == "1")
			lvPreviewFoot.innerHTML += '<input id="shidList"  type="checkbox" checked onclick="showHideObj(this, \'liveFollow\');" />';
		else
			lvPreviewFoot.innerHTML += '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />';
		showHideObj(document.getElementById("shidList"), 'liveFollow');
		lvPreviewFoot.innerHTML += '<label for="shidList">' + lang_menu[0].LISTS + '</label>';

		//Modifiche minori (default = not checked)
		if (typeof (checkModificheMinori) != "undefined" && checkModificheMinori == "1")
			lvPreviewFoot.innerHTML += '<input id="showDiffR" type="checkbox" checked />';
		else
			lvPreviewFoot.innerHTML += '<input id="showDiffR" type="checkbox" />';
		lvPreviewFoot.innerHTML += '<label for="showDiffR">' + lang_menu[0].LOWDIFF + '</label>';

		//Pannello (default = checked)
		if (typeof (checkPannello) != "undefined" && checkPannello == "0")
			lvPreviewFoot.innerHTML += '<input id="shidRC"    type="checkbox" onclick="showHideObj(this, \'divTabRC\');" />';
		else
			lvPreviewFoot.innerHTML += '<input id="shidRC"    type="checkbox" checked onclick="showHideObj(this, \'divTabRC\');" />';
		showHideObj(document.getElementById("shidRC"), 'divTabRC');
		lvPreviewFoot.innerHTML += '<label for="shidRC">' + lang_menu[0].RCLABEL + '</label>';

		//Show Bot (default = checked)
		if (typeof (checkNienteBot) != "undefined" && checkNienteBot == "0")
			lvPreviewFoot.innerHTML += '<input id="showBot"   type="checkbox" />';
		else
			lvPreviewFoot.innerHTML += '<input id="showBot"   type="checkbox" checked />';
		lvPreviewFoot.innerHTML += '<label for="showBot">' + lang_menu[0].NOBOTS + '</label>';

		//Solo IP (default = not checked)
		if (typeof (checkSoloIP) != "undefined" && checkSoloIP == "1")
			lvPreviewFoot.innerHTML += '<input id="showIP"    type="checkbox" checked />';
		else
			lvPreviewFoot.innerHTML += '<input id="showIP"    type="checkbox" />';
		lvPreviewFoot.innerHTML += '<label for="showIP">' + lang_menu[0].IPONLY + ' • </label>';

		//RC (default = checked)
		if (typeof (checkRC) != "undefined" && checkRC == "0")
			lvPreviewFoot.innerHTML += '<input id="showRC"    type="checkbox" />';
		else
			lvPreviewFoot.innerHTML += '<input id="showRC"    type="checkbox" checked />';
		lvPreviewFoot.innerHTML += '<label for="showRC">' + lang_menu[0].RCSHOW + ' • </label>';

		//Log (default = checked)
		if (typeof (checkLog) != "undefined" && checkLog == "0")
			lvPreviewFoot.innerHTML += '<input id="showLog"    type="checkbox" />';
		else
			lvPreviewFoot.innerHTML += '<input id="showLog"    type="checkbox" checked />';
		lvPreviewFoot.innerHTML += '<label for="showLog">' + lang_menu[0].LOGSHOW + ' • </label>';

		lvPreviewFoot.innerHTML += '<span id="selectNS" />';
		if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;

		//Get contact list from property file
		var _lstContact = lstContact;
		var _len = lstContact.length;
		lstContact = new Array();
		for (var _i = 0; _i < _len; _i++)
			lstContact[_lstContact[_i]] = {
				ts: 0
			};

		//Get IPclass list from property file
		var _lstIPClass = lstIPClass;
		var _len = lstIPClass.length;
		lstIPClass = new Array();
		for (var _i = 0; _i < _len; _i++)
			lstIPClass[_lstIPClass[_i]] = {
				ts: 0
			};

		//Get trusted list from property file
		var _lstHidden = lstHidden;
		var _len = lstHidden.length;
		lstHidden = new Array();
		for (var _i = 0; _i < _len; _i++)
			lstHidden[_lstHidden[_i]] = {
				ts: 0
			};

		updateHidden();

		// Main
		liveSysop();
	}
})
.fail( function () {
	mw.log.error( 'Errore nel caricamento di LiveRC.' );
} );

/* </source> */