MediaWiki:Gadget-indexPagesStatistics.js

Da Wikisource.

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
$(function() {
	var pagename = mw.config.get("wgPageName");
	var basePageName = 'Pagina:' + mw.config.get('wgTitle') + '/';
	var notExists = ' (la pagina non esiste)';
	var elencoTesti = [];
	var api = new mw.Api();
	var countByUser = {};
	var countByMonth = {};
	var countByUserAndMonth = [];
	var countLast10Days = {};
	var countLast30Days = {};
	var totalRevs = 0;
	
	function highlight(claxx, clean) {
		clean = typeof clean !== 'undefined' ? clean : true;
		if (clean)
			$('#pagineDellEdizioneInner a').removeClass('highlight-page');
		pages = $('#pagineDellEdizioneInner .' + claxx);
		if (pages.length) {
			pages.addClass('highlight-page');
			offset = $(pages.get(0)).offset().top;
			screenTop = $(window).scrollTop();
			screenBottom = screenTop + $(window).innerHeight();
			if (offset < screenTop || offset > screenBottom) {
				$('html, body').animate( {scrollTop: offset }, 'fast');
			}
		}
		if (claxx == 'quality1')
			highlight('new', false);
	}
	
	function highlightInterval(from, to) {
		$('#pagineDellEdizioneInner a').removeClass('highlight-page');
		for (i = from; i <= to; i++) {
			$('#pagineDellEdizioneInner a[title="' + basePageName + i + '"]').addClass('highlight-page');
			$('#pagineDellEdizioneInner a[title="' + basePageName + i + notExists + '"]').addClass('highlight-page');
		}
	}
	
	// controlli in ns0 che la qualità corrisponda
	if (mw.config.get("wgNamespaceNumber") === 0) {
		qualityNs0 = $('#textquality').attr('class');
		
		pagine75 = $('.tl-testo-quality.tl-testo-subpage').filter('[data-quality="75%"]').add('.prp-pagequality-3');
		pagine50 = $('.tl-testo-quality.tl-testo-subpage').filter('[data-quality="50%"]').add('.prp-pagequality-2');
		pagine25 = $('.tl-testo-quality.tl-testo-subpage').filter('[data-quality="25%"]').add('.prp-pagequality-1');
		
		showAvviso = false;
		showAvvisoOn = $();
		if (qualityNs0 == '100%' && (pagine75.length > 0 || pagine50.length > 0 || pagine25.length > 0)) {
			showAvviso = true;
			showAvvisoOn = showAvvisoOn.add(pagine75).add(pagine50).add(pagine25);
		}
		if (qualityNs0 == '75%' && (pagine50.length > 0 || pagine25.length > 0)) {
			showAvviso = true;
			showAvvisoOn = showAvvisoOn.add(pagine50).add(pagine25);
		}
		if (qualityNs0 == '50%' && pagine25.length > 0) {
			showAvviso = true;
			showAvvisoOn = showAvvisoOn.add(pagine25);
		}
		if (showAvviso) {
			showAvvisoOn.first().parent().attr('id', 'linkAvvisoSAL');
			avviso = '<span class="index-pages-stat-avviso">Attenzione: il testo è stato portato al ' + qualityNs0 
				+ ', ma ci sono delle pagine non ancora al ' + qualityNs0 + ' (<a href="#linkAvvisoSAL">vedi</a>)</span>';
			$('.quality-msg-text').html(avviso);
			showAvvisoOn.parent().css('border', '2px solid red').attr('title', 'Pagina non ancora portata al '+ qualityNs0);
			showAvvisoOn.parent().find('a').attr('title', 'Pagina non ancora portata al '+ qualityNs0);
		}
	}
	
	if (mw.config.get("wgNamespaceNumber") === 110 && pagename.indexOf('/') == -1) {
		if ($('.sommario').length == 0) {
			$('.quality-msg-text').html($('.quality-msg-text').html() + ' Il campo Sommario deve ancora essere compilato ' +
			'(<a href="/wiki/Aiuto:Gadget_CompilaSommario" target="_new">istruzioni</a>).');
		}
		calculateStatics(false);
	}
	
	// statistiche nelle pagine Indice e controllo che la qualità corrisponda
	function calculateStatics(countVolumes) {
		console.log('calculateStatics (including volumes? ' + countVolumes + ')');
		if ($('.prp-index-pagelist .error').length > 0) {
			return;
		}
		
		tot0 = $('.pagineDellEdizione .prp-pagequality-0').length;
		totToCreate = $('.pagineDellEdizione a.new').length;
		tot1 = $('.pagineDellEdizione .prp-pagequality-1').length + totToCreate;
		tot2 = $('.pagineDellEdizione .prp-pagequality-2').length;
		tot3 = $('.pagineDellEdizione .prp-pagequality-3').length;
		tot4 = $('.pagineDellEdizione .prp-pagequality-4').length;
		totale = tot1 + tot2 + tot3 + tot4;
		percToCreate = Math.round(totToCreate / totale * 100) || 0;
		perc1 = Math.round(tot1 / totale * 100) || 0;
		perc2 = Math.round(tot2 / totale * 100) || 0;
		perc3 = Math.round(tot3 / totale * 100) || 0;
		perc4 = Math.round(tot4 / totale * 100) || 0;
		
		declaredQuality = $('#dati').data('qualita');
		effectiveQuality = '25%';
		if (tot1 === 0) {
			effectiveQuality = '50%';
			if (tot2 === 0) {
				effectiveQuality = '75%';
				if (tot3 === 0) {
					effectiveQuality = '100%';
					if (tot4 === 0) {
						effectiveQuality = '25%';
						if (totale === 0) {
							// ci sono solo pagine allo 0%
							effectiveQuality = '100%';
						}
					}
				}
			}
		}
		
		drawStatistics(countVolumes, tot0, totToCreate, tot1, tot2, tot3, tot4, perc1, perc2, perc3, perc4);
		if (countVolumes) {
			$('.volumi a').not('.selflink').each(function() {
				link = $(this).attr('href');
				$.ajax({
					url: link
				}).done(function(response) {
					content = $('.pagineDellEdizione', response);
					tot0 = parseInt($('#index-pages-stat .quality0').html()) + content.find('.prp-pagequality-0').length;
					totToCreate = parseInt($('#index-pages-stat .new').html()) + content.find('a.new').length;
					tot1 = parseInt($('#index-pages-stat .quality1').html()) + content.find('.prp-pagequality-1').length + content.find('a.new').length;
					tot2 = parseInt($('#index-pages-stat .quality2').html()) + content.find('.prp-pagequality-2').length;
					tot3 = parseInt($('#index-pages-stat .quality3').html()) + content.find('.prp-pagequality-3').length;
					tot4 = parseInt($('#index-pages-stat .quality4').html()) + content.find('.prp-pagequality-4').length;
					totale = tot1 + tot2 + tot3 + tot4;
					percToCreate = Math.round(totToCreate / totale * 100) || 0;
					perc1 = Math.round(tot1 / totale * 100) || 0;
					perc2 = Math.round(tot2 / totale * 100) || 0;
					perc3 = Math.round(tot3 / totale * 100) || 0;
					perc4 = Math.round(tot4 / totale * 100) || 0;
					drawStatistics(countVolumes, tot0, totToCreate, tot1, tot2, tot3, tot4, perc1, perc2, perc3, perc4);
				});
			});
		}
		
		if (!countVolumes) {
			if (declaredQuality !== undefined && declaredQuality != effectiveQuality) {
				$('.quality-msg-text').html('<span class="index-pages-stat-avviso">Attenzione: l\'indice è al ' 
					+ declaredQuality + ', ma andrebbe portato al ' + effectiveQuality + '</span> ' 
					+ '(<a id="highlightLink" class="' + effectiveQuality.replace('%', '') + '" href="#">vedi le pagine al ' + effectiveQuality + '</a>)');
				
				$('#highlightLink').click(function(e) {
					e.preventDefault();
					c = $(this).attr('class');
					$('#index-pages-stat a.' + c).click();
				});
			}
			
			// controlla pagine al 75% o 100% non trascluse
			mw.loader.using("mediawiki.api", function() {
				var api = new mw.Api();
				$('.quality-msg-text').append(' <span id="notTranscludedWarning"></span>');
				var count = 0;
				$('.prp-index-pagelist .prp-pagequality-3, .prp-index-pagelist .prp-pagequality-4').each(function() {
					var thisPageLink = $(this);
					var pageTitle = thisPageLink.attr('title');
					//console.log('check ' + pageName);
					api.get({
						action: 'query', 
						format: 'json', 
						list: 'embeddedin', 
						einamespace: '0', 
						eititle: pageTitle
					}).done(function (data) {
						var linkedNs0 = data.query.embeddedin;
						if (linkedNs0.length == 0) {
							count++;
							$(thisPageLink).addClass('notTranscluded');
							$('#notTranscludedWarning').html('Ci sono ' + count + ' pagine trascritte o rilette, ma non trascluse (<a id="showNotTranscluded" href="#">vedi</a> - <a href="/wiki/Aiuto:Transclusione_proofread">guida</a>)');
							$('#showNotTranscluded').click(function(e) {
								e.preventDefault();
								highlight('notTranscluded');
							});
							if (count >= 10) {
								$('#notTranscludedWarning').css('color', 'red');
							}
							//console.log('found ' + pageName);
						}
						$('#index-pages-stat .notTranscluded').html(count);
					});
				});
			});
		}
	}
	
	function getMilestones() {
		api.get({
			action: 'query', 
			prop: 'revisions', 
			titles: pagename, 
			rvlimit: 500, 
			format: 'json'
		}).done(function (data) {
			var created, sal75, sal100;
			var sal = $('#pagequality').attr('class');
			$.each(data.query.pages, function(index, obj) {
				revs = obj.revisions;
				for (var j = 0; j < revs.length; j++) {
					var comment = revs[j].commenthidden ? revs[j].commenthidden : revs[j].comment;
					var timestamp = revs[j].timestamp.substring(0, 10);
					var dataFormattata = timestamp.substring(8, 10) + '/' + timestamp.substring(5, 7) + '/' + timestamp.substring(0, 4);
					if (revs[j].parentid == 0) {
						created = dataFormattata;
					}
					if (!sal75 && (sal == '75%' || sal == '100%') && comment.indexOf("Porto il SAL a SAL 75%") != -1) {
						sal75 = dataFormattata;
					} else if (!sal100 && sal == '100%' && comment.indexOf("Porto il SAL a SAL 100%") != -1) {
						sal100 = dataFormattata;
					}
				}
			});
			
			$('#index-pages-stat').after('<div id="index-pages-stat-footer"></div>');
			$('#index-pages-stat-footer').append('Indice creato il ' + created);
			if (sal75) {
				$('#index-pages-stat-footer').append('<br>Finito di trascrivere il ' + sal75);
			}
			if (sal100) {
				$('#index-pages-stat-footer').append('<br>Finito di rileggere il ' + sal100);
			}
		});
	}
	
	function drawStatistics(countVolumes, tot0, totToCreate, tot1, tot2, tot3, tot4, perc1, perc2, perc3, perc4) {
		if ($('#index-pages-stat').length == 0) {
			$('.pagineDellEdizione').append($('<div id="index-pages-stat">'));
			$('#index-pages-stat').append($('<div style="float: right"><button id="openStatsBtn" class="btn blue">Dettaglio contributi</button></div></div>'));
		}
		$('#index-pages-stat table, #index-pages-stat-tools, #index-pages-stat-volumes').remove();
		$('#index-pages-stat').append($('<table></table>')
			.append($('<tr></tr>')
				.append('<td><a class="25" href="#" title="Pagine al 25% o non ancora create">Da trascrivere:</a></td>')
				.append('<td><span class="quality1">' + tot1 + '</span></td>')
				.append('<td class="perc1">' + perc1 + '% </td>')
			)
			.append($('<tr></tr>')
				.append('<td>&nbsp; di cui <a class="0" href="#" title="Pagine non ancora create">da creare:</a></td>')
				.append('<td><span class="new">' + totToCreate + '</span></td>')
				.append('<td class="percToCreate">' + percToCreate + '% </td>')
			)
			.append($('<tr></tr>')
				.append('<td><a class="50" href="#" title="Pagine al 50%">Da controllare:</a></td>')
				.append('<td><span class="quality2">' + tot2 + '</span></td>')
				.append('<td class="perc2">' + perc2 + '% </td>')
			)
			.append($('<tr></tr>')
				.append('<td><a class="75" href="#" title="Pagine al 75%">Da rileggere:</a></td>')
				.append('<td><span class="quality3">' + tot3 + '</span></td>')
				.append('<td class="perc3">' + perc3 + '% </td>')
			)
			.append($('<tr></tr>')
				.append('<td><a class="100" href="#" title="Pagine al 100%">Rilette:</a></td>')
				.append('<td><span class="quality4">' + tot4 + '</span></td>')
				.append('<td class="perc4">' + perc4 + '% </td>')
			)
			.append($('<tr></tr>')
				.append('<td><a href="#" title="Pagine allo 0%">Vuote:</a></td>')
				.append('<td><span class="quality0">' + tot0 + '</span></td>')
				.append('<td>-</td>')
			)
			.append($('<tr></tr>')
				.append('<td>Totale:</td>')
				.append('<td><span class="total">' + (totale + tot0) + '</span></td>')
				.append('<td>-</td>')
			)
			.append($('<tr></tr>')
				.append('<td><a href="#" title="Pagine al 75% o 100% non trascluse">Non trascluse:</a></td>')
				.append('<td><span class="notTranscluded">n.d.</span></td>')
				.append('<td>-</td>')
			)
		);
		
		$('#index-pages-stat').append($('<div id="index-pages-stat-tools"></div>')
			.append('<input type="checkbox" id="mark-visited"/> <label for="mark-visited">Segna in grigio le pagine già visitate</label>'));
		$('#mark-visited').click(function () {
			if ($('.prp-index-pagelist').hasClass('mark-visited')) {
				$('.prp-index-pagelist').removeClass('mark-visited');
			} else {
				$('.prp-index-pagelist').addClass('mark-visited');
			}
		});
		
		if ($('.volumi a').not('.selflink').not('.new').length) {
			$('#index-pages-stat').append($('<div id="index-pages-stat-volumes"></div>')
				.append('<input type="checkbox" id="count-all-volumes"/> <label for="count-all-volumes">Tutti i volumi</label>')
			);
			if (countVolumes) {
				$('#count-all-volumes').prop( "checked", true );
				$('#count-all-volumes').click(function () {
					calculateStatics(false);
				});
			} else {
				$('#count-all-volumes').click(function () {
					calculateStatics(true);
				});
			}
		}
		
		if ($('#index-pages-stat-footer').length == 0) {
			getMilestones();
		}
			
		$('#index-pages-stat a').click(function(e) {
			e.preventDefault();
			claxx = $(this).parent().parent().find('span').attr('class');
			highlight(claxx);
		});
	}
	
	// barra di avanzamento nelle categorie indice
	if (pagename.startsWith('Categoria:Pagine_indice_SAL_') || pagename == 'Categoria:Sommari' 
		|| pagename == 'Categoria:Indici_non_trasclusi_in_ns0' || pagename == 'Categoria:Indici_senza_sommario') {
		var specialPageUrl = "/w/index.php?&title=Speciale:PagineIndice&limit=5000&offset=0";
		
		if (pagename == 'Categoria:Pagine_indice_SAL_100%') {
			specialPageUrl = "/w/index.php?&title=Speciale:PagineIndice&filter=validated&limit=5000&offset=0";
		} else if (pagename == 'Categoria:Pagine_indice_SAL_75%') {
			specialPageUrl = "/w/index.php?&title=Speciale:PagineIndice&filter=proofread&limit=5000&offset=0";
		} else if (pagename == 'Categoria:Pagine_indice_SAL_25%' || pagename == 'Categoria:Pagine_indice_SAL_50%') {
			specialPageUrl = "/w/index.php?&title=Speciale:PagineIndice&filter=incomplete&limit=5000&offset=0";
		}
		
		$.ajax({
			url: specialPageUrl
		}).done(function(response) {
			console.log("Speciale:PagineIndice caricato");
			content = $('.mw-spcontent ol.special', response);
			content.children().each(function(index) {
				titolo = $(this).find('a').attr('title');
				// console.log(titolo);
				quality = $(this).find('.pr_quality');
				quality.addClass('quality-bar');
				quality.find('td').filter(function() {
    				return $(this).css('width') == '0px';
				}).remove();
				
				$('.mw-category a').filter(function() {
    				return $(this).attr('title') == titolo;
				}).parent().append(quality);
			});
		});
	}
	
	// icona SAL dell'indice in tutte le categorie
	if (mw.config.get("wgCanonicalNamespace") == 'Category') {
		var i25 = 0, i50 = 0, i75 = 0, i100 = 0;
		$('#mw-pages > p').append('<span id="count-indici"></span>');
		$('#mw-pages a').each(function(i) {
			var title = $(this).attr('href').replace('/wiki/', '');
			if (title.startsWith('Indice')) {
				$.ajax({
					url: "/w/index.php?&title=" + title
				}).done(function(response) {
					icon = $('.quality-msg-image img', response);
					icon.attr('width', '9');
					icon.attr('height', '9');
					icon.css('margin-left', '3px');
					$('#mw-pages [href="/wiki/' + title + '"]').after(icon);
					qual = icon.attr('alt').replace('%.svg', '');
					if (qual == '25') i25++;
					else if (qual == '50') i50++;
					else if (qual == '75') i75++;
					else if (qual == '100') i100++;
					
					if (pagename.indexOf('Categoria:Pagine_indice_SAL_') == -1)
						$('#count-indici').html( ' SAL indici: <span class="quality1">' + i25 
									+ '</span> &nbsp; <span class="quality2">' + i50 
									+ '</span> &nbsp; <span class="quality3">' + i75 
									+ '</span> &nbsp; <span class="quality4">' + i100);
				});
			}
		});
	}
	
	if (pagename.startsWith('Wikisource:Rilettura_del_mese/')) {
		$('#mw-content-text li a').each(function(i) { 
			var title = $(this).attr('href').replace('/wiki/', '');
			if (title.startsWith('Indice')) {
				$.ajax({
					url: "/w/index.php?&title=" + title
				}).done(function(response) {
					icon = $('.quality-msg-image img', response);
					icon.attr('width', '9');
					icon.attr('height', '9');
					icon.css('margin-left', '3px');
					$('#mw-content-text li [href="/wiki/' + title + '"]').after(icon);
				});
			}
		});
	}
	
	sortByTitle = function(parent) {
		var elems = parent.find('li').detach().sort(function (a, b) {
			return ($(a).text() < $(b).text() ? -1 : $(a).text() > $(b).text() ? 1 : 0);
		}); 
		parent.append(elems);
	};
	
	// carica la lista dei testi brevi (fino a 30 pagine) e i "mozziconi"
	if (pagename == 'Discussioni_Wikisource:Rilettura_del_mese') {
		$.ajax({
			url: "/w/api.php?action=query&list=categorymembers&cmtitle=Category:Pagine_indice_SAL_75%&cmlimit=500&format=json"
		}).done(function(response) {
			var list = response.query.categorymembers;
			$('#testiBrevi, #mozziconi').html('<ol></ol>');
			$('#testiBrevi').append('<b>Totale pagine da rileggere: <span id="testiBreviTotale">0</span></b>');
			$('#mozziconi').append('<b>Totale pagine da rileggere: <span id="mozziconiTotale">0</span></b>');
			for (i = 0; i < list.length; i++) {
				var title = list[i].title;
				$.ajax({
					url: "/w/index.php?&title=" + title
				}).done(function(response) {
					totToCreate = $('.pagineDellEdizione a.new', response).length;
					tot1 = $('.pagineDellEdizione .prp-pagequality-1', response).length + totToCreate;
					tot2 = $('.pagineDellEdizione .prp-pagequality-2', response).length;
					tot3 = $('.pagineDellEdizione .prp-pagequality-3', response).length;
					tot4 = $('.pagineDellEdizione .prp-pagequality-4', response).length;
					totale = tot1 + tot2 + tot3 + tot4;
					perc3 = Math.round(tot3 / totale * 100) || 0;
					
					var title = $('#firstHeading', response).text();
					//console.log(title + ': ' + tot3);
					if (tot3 <= 30) {
						link = $('<li><a href="/wiki/' + title + '"><i>' + title + '</i></a> (' + tot3 + ')</li>');
						if (tot3 == 0) {
							link.css('color', 'red');
							link.find('a').css('color', 'red');
						}
						$('#testiBrevi ol').append(link);
						$('#testiBreviTotale').html(tot3 + parseInt($('#testiBreviTotale').html()));
						sortByTitle($('#testiBrevi ol'));
					}
					else if (perc3 < 50) {
						link = $('<li><a href="/wiki/' + title + '"><i>' + title + '</i></a> (' + tot3 + ', ' + perc3 + '%)</li>');
						$('#mozziconi ol').append(link);
						$('#mozziconiTotale').html(tot3 + parseInt($('#mozziconiTotale').html()));
						sortByTitle($('#mozziconi ol'));
					}
					icon = $('.quality-msg-image img', response);
					icon.attr('width', '9');
					icon.attr('height', '9');
					icon.css('margin-left', '3px');
					$('#proposte [title="' + title.replace(/"/g, '\\"') + '"]').parent().after(icon);
					icon.after(' (' + tot3 + ')');
				});
			}
		});
	}
	
	addToMap = function(map, name) {
		if (!map.hasOwnProperty(name)) {
			map[name] = 1;
		} else {
			map[name] = map[name] + 1;
		}
	};
	
	toArray = function(map) {
		var arr = [];
		for (var o in map) {
		    arr.push( { name: o, count: map[o] } );
		}
		return arr;
	};
	
	sortDesc = function(arr, field, ascDesc) {
		if (field === undefined)
			field = 'count';
		if (ascDesc === undefined)
			ascDesc = 'asc';
		arr.sort(function(a, b) {
		    return a[field] > b[field] ? (ascDesc == 'asc' ? -1 : 1) : a[field] < b[field] ? (ascDesc == 'asc' ? 1 : -1) : 0;
		});
		return arr;
	};
	
	userLink = function(name) {
		return '<a href="/wiki/Speciale:Contributi/' + name + '" target="_new">' + name + '</a>';
	};
	
	loadPagesContribs = function() {
		countByUser = {};
		countByMonth = {};
		countByUserAndMonth = [];
		countLast10Days = {};
		countLast30Days = {};
		totalRevs = 0;
		
		var lastPage = $('.prp-index-pagelist a:last').attr('href').replace('/wiki/', '').replace('/w/index.php?title=', '').replace('&action=edit&redlink=1', '');
		var baseTitle = 'Pagina:' + mw.config.get('wgTitle') + '/';
		var lastPageNumber = parseInt(lastPage.split('/')[1]);
		var pagesToGo = $(".prp-index-pagelist a:not(.new)").length;
		
		if (pagesToGo == 0) {
			alert("Dettaglio non disponibile, nessuna pagina è stata ancora creata!");
		} else {
			for (var i = 1; i <= lastPageNumber; i++) {
				var thisPage = baseTitle + i;
				if ($('.prp-index-pagelist a[title="' + thisPage + '"]').length) {
					api.post({
						action: 'query', 
						format: 'json', 
						titles: thisPage, 
						prop: 'revisions', 
						rvprop: 'user|timestamp',
						rvlimit: 100
					}).done(function (data, textStatus, jqXHR) {
						$.each(data.query.pages, function(index, obj) {
							revs = obj.revisions;
							for (var j = 0; j < revs.length; j++) {
								var user = revs[j].user;
								var timestamp = revs[j].timestamp;
								
								if (!user.toLowerCase().endsWith('bot')) {
									
									var month = timestamp.substring(0, 7);
									addToMap(countByUser, user);
									addToMap(countByMonth, month);
									
									var date10DaysAgo = new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).setHours(0,0,0,0);
									var date30DaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).setHours(0,0,0,0);
									if (Date.parse(timestamp) > date10DaysAgo)
										addToMap(countLast10Days, user);
									else if (Date.parse(timestamp) > date30DaysAgo)
										addToMap(countLast30Days, user);
									
									var found = false;
									for (var k = 0; k < countByUserAndMonth.length; k++) {
										if (countByUserAndMonth[k].user == user && countByUserAndMonth[k].month == month) {
											countByUserAndMonth[k].count = countByUserAndMonth[k].count + 1;
											found = true;
											break;
										}
									}
									if (!found) {
										countByUserAndMonth.push( { user: user, month: month, count: 1 } );
									}
									
									totalRevs++;
								}
							}
							pagesToGo--;
							if (pagesToGo == 0) {
								openStatsBox();
							}
						});
					});
				}
			}
		}
	};
	
	openStatsBox = function() {
		$('.index-stats-box').remove();
		var box = '<div class="box index-stats-box">'
			+ '<div class="box-title">Dettaglio contributi<span class="icon-close"></span></div>'
			+ '<div class="box-main"><div class="index-stats-box-main"></div><div class="index-stats-box-note"></div></div>';
		$("body").append(box);
		$('.index-stats-box-main').append('<div class=""');
		$('.index-stats-box').draggable();
		$('.index-stats-box').draggable('option', 'cancel', '.box-main');
		$('.index-stats-box .icon-close').click(function() {
			$('.index-stats-box').remove();
		});
		
		var topUsers = sortDesc(toArray(countByUser)).slice(0, 5);
		$('.index-stats-box-main').append('<table id="topUsers"></table');
		$('#topUsers').append('<tr><th colspan="4">Maggiori contributori¹</th></tr>');
		$('#topUsers').append('<tr><th>Utente</th><th>Modifiche</th><th>%</th><th>Mesi di maggiore attività²</th></tr>');
		
		for (var i = 0; i < topUsers.length; i++) {
			var perc = (topUsers[i].count / totalRevs * 100).toFixed(0);
			if (perc > 5 || topUsers[i].count >= 10) {
				$('#topUsers').append('<tr></tr>');
				$('#topUsers tr:last').append('<td>' + userLink(topUsers[i].name) + '</td>');
				$('#topUsers tr:last').append('<td>' + topUsers[i].count + '</td>');
				$('#topUsers tr:last').append('<td>' + perc + '%</td>');
				
				var topPeriods = countByUserAndMonth.filter(function (el) {
					return el.user == topUsers[i].name;
				});
				topPeriods = sortDesc(topPeriods).slice(0, 3);
				topPeriodsStr = [];
				for (var j = 0; j < topPeriods.length; j++) {
					if (j == 0 || topPeriods[j].count >= 10) {
						topPeriodsStr.push(topPeriods[j].month + ' (' + topPeriods[j].count + ')');
					}
				}
				$('#topUsers tr:last').append('<td>' + topPeriodsStr.join(', ') + '</td>');
			}
		}
		
		var topMonth = sortDesc(toArray(countByMonth)).slice(0, 5);
		topMonth = sortDesc(topMonth, 'name', 'desc');
		$('.index-stats-box-main').append('<table id="topMonths"></table');
		$('#topMonths').append('<tr><th colspan="4">Mesi di maggiore attività¹</th></tr>');
		$('#topMonths').append('<tr><th>Mese</th><th>Modifiche</th><th>%</th><th>Utenti più attivi²</th></tr>');
		for (var k = 0; k < topMonth.length; k++) {
			var perc2 = (topMonth[k].count / totalRevs * 100).toFixed(0);
			if (perc2 > 5 || topMonth[k].count >= 10) {
				$('#topMonths').append('<tr></tr>');
				$('#topMonths tr:last').append('<td>' + topMonth[k].name + '</td>');
				$('#topMonths tr:last').append('<td>' + topMonth[k].count + '</td>');
				$('#topMonths tr:last').append('<td>' + perc2 + '%</td>');
				
				var monthUsers = countByUserAndMonth.filter(function (el) {
					return el.month == topMonth[k].name;
				});
				monthUsers = sortDesc(monthUsers).slice(0, 3);
				monthUsersStr = [];
				for (var l = 0; l < monthUsers.length; l++) {
					if (l == 0 || monthUsers[l].count >= 10) {
						monthUsersStr.push(userLink(monthUsers[l].user) + ' (' + monthUsers[l].count + ')');
					}
				}
				$('#topMonths tr:last').append('<td>' + monthUsersStr.join(', ') + '</td>');
			}
		}
		
		$('.index-stats-box-note').append('<b>Note</b><br>' +
			'Sono conteggiati i contributi in nsPagina degli utenti non bot.<ul>' +
			'<li>1. I primi 5 con almeno 10 contributi o il cui peso è almeno 5% del totale.</li>' +
			'<li>2. Dopo il primo, sono mostrati i successivi 2 con almeno 10 contributi.</li>' +
			'</ul>');
			
		topLast10Days = sortDesc(toArray(countLast10Days)).slice(0, 3);
		topLast30Days = sortDesc(toArray(countLast30Days)).slice(0, 3);
		if (topLast10Days.length || topLast30Days.length) {
			$('.index-stats-box-main').append('<table id="recentActivity"></table');
			$('#recentActivity').append('<tr><th colspan="2">Attività recente³</th></tr>');
			$('.index-stats-box-note ul').append('<li>3. I 5 utenti con più contributi negli ultimi 10 o 30 giorni.</li>');
			
			if (topLast10Days.length) {
				topLast10DaysStr = [];
				for (var m = 0; m < topLast10Days.length; m++) {
					topLast10DaysStr.push(userLink(topLast10Days[m].name) + ' (' + topLast10Days[m].count + ')');
				}
				$('#recentActivity').append('<tr><td>Ultimi 10 giorni</td><td>' + topLast10DaysStr.join(', ') + '</td></tr>');
			}
			if (topLast30Days.length) {
				topLast30DaysStr = [];
				for (var n = 0; n < topLast30Days.length; n++) {
					topLast30DaysStr.push(userLink(topLast30Days[n].name) + ' (' + topLast30Days[n].count + ')');
				}
				$('#recentActivity').append('<tr><td>Da 11 a 30 giorni fa</td><td>' + topLast30DaysStr.join(', ') + '</td></tr>');
			}
		}
	};
	
	$('#openStatsBtn').click(loadPagesContribs);
	
	function getPageNum(el) {
		return parseInt($(el).attr('title').replace(basePageName, '').replace(notExists, ''));
	}
	
	// evidenzia le pagine che rappresentano un capitolo al mouseover sul sommario
	$('.indice-sommario-titolo a').mouseover(function() {
		var table = $(this).parents('table');
		var pageFrom = table.find('.indice-sommario-num a');
		var pageTo = $(table.nextAll('table')[0]).find('.indice-sommario-num a');
		if (pageFrom.length) {
			var from = getPageNum(pageFrom[0]);
			var to = pageTo.length ? getPageNum(pageTo[0])-1 : 10000;
			highlightInterval(from, to);
			var totPages = $('.highlight-page:not(.quality0)').length;
			var todoPages = $('.highlight-page:not(.quality0,.quality3,.quality4)').length;
			var title = (totPages > 1 ? totPages + ' pagine' : '1 pagina') + ' (' + todoPages + ' da trascrivere)';
			$(this).attr('title', title);
		}
	});
	$('.indice-sommario-num a').mouseover(function() {
		var num = getPageNum(this);
		highlightInterval(num, num);
	});
});