Usor:Alex brollo/PersonalTools.js

E Wikisource

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
ws={};
if (localStorage.memoRegex===undefined) localStorage.memoRegex="{}";$("#radioQuality4").css("visibility","hidden");
mw.activeElement=$("#wpTextbox1")[0];
$("textarea, input[type!='checkbox'][type!='button'][type!='search'][type!='hidden'][type!='submit'][type!='radio'][name!='wpAntispam']").focusin(function () {
	mw.activeElement=this;
});
mw.alertMessage = function (title, text) {
	if (text === undefined) {
		text = title;
		title = undefined;
	}
	
	var id = Math.random().toString(36).substring(5);
	var box = '<div class="alert-message" id="' + id + '">'+ '<button class="button alert-message-close">x</button>';
	
	if (title)
		box += '<strong>' + title + '</strong><br>' ;
		
	box += text + '</div>';
	$('#bodyContent').append(box);
	$('.alert-message-close').click(function() {
		$('.alert-message-close').parents('.alert-message').remove();
	});
	
	$("#" + id).fadeTo(3000, 500).slideUp(500, function() {
    	$("#" + id).slideUp(500).remove();
	});
};

/**
 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 * Version : 2.01.B
 * By Binny V A
 * License : BSD
 */
var shortcut = {
	'all_shortcuts':{},//All the shortcuts are stored in this array
	'add': function(shortcut_combination,callback,opt) {
		//Provide a set of default options
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		};
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}
 
		var ele = opt.target;
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();
 
		//The function to be called at keypress
		var func = function(e) {
			e = e || window.event;
 
			if(opt.disable_in_input) { //Don't enable shortcut keys in Input, Textarea fields
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;
 
				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
 
			//Find Which key is pressed
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			var character = String.fromCharCode(code).toLowerCase();
 
			if(code == 188) character=","; //If the user presses , when the type is onkeydown
			if(code == 190) character="."; //If the user presses , when the type is onkeydown
 
			var keys = shortcut_combination.split("+");
			//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
			var kp = 0;
 
			//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			};
			//Special Keys - and their codes
			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
 
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
 
				'pause':19,
				'break':19,
 
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
 
				'pageup':33,
				'page_up':33,
				'pu':33,
 
				'pagedown':34,
				'page_down':34,
				'pd':34,
 
				'left':37,
				'up':38,
				'right':39,
				'down':40,
 
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123
			};
 
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	//Meta is Mac specific
			};
 
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
 
			for(var i=0; k=keys[i],i<keys.length; i++) {
				//Modifiers
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;
 
				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;
 
				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1) { //If it is a special key
					if(special_keys[k] == code) kp++;
 
				} else if(opt.keycode) {
					if(opt.keycode == code) kp++;
 
				} else { //The special keys did not match
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}
 
			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
 
				if(!opt['propagate']) { //Stop the event
					//e.cancelBubble is supported by IE - this will kill the bubbling process.
					e.cancelBubble = true;
					e.returnValue = false;
 
					//e.stopPropagation works in Firefox.
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		};
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		//Attach the function with the event
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},
 
	//Remove the shortcut - just specify the shortcut and I will remove the binding
	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination])
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];
 
		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
}




ws.alertMessage = function (title, text) {
	if (text === undefined) {
		text = title;
		title = undefined;
	}
	
	var id = Math.random().toString(36).substring(5);
	var box = '<div class="alert-message" id="' + id + '">'
	+ '<button class="button alert-message-close">x</button>';
	
	if (title)
		box += '<strong>' + title + '</strong><br>' ;
		
	box += text + '</div>';
	$('#bodyContent').append(box);
	$('.alert-message-close').click(function() {
		$('.alert-message-close').parents('.alert-message').remove();
	});
	
	$("#" + id).fadeTo(3000, 500).slideUp(500, function() {
    	$("#" + id).slideUp(500).remove();
	});
};
count = function(testo, stringa) {
            var n = 0;
            while (testo.indexOf(stringa) > -1) {
                n = n + 1;
                testo = testo.replace(stringa, "");
            }
            return n;
        }
;
ws.find_stringa = function(testo, idi, idf, dc, x) {
    var idip = testo.indexOf(idi);
    var idfp = testo.indexOf(idf, idip + idi.length) + idf.length;
    var vvalore="";
    if (idip > -1 && idfp > -1) {
        if (x !== "") {
            while (count(testo.slice(idip, idfp), x) > count(testo.slice(idip, idfp), idf)) {
                idfp = testo.indexOf(idf, idfp) + idf.length;
            }
        }
        if (dc === 0) {
            vvalore = testo.slice(idip + idi.length, idfp - idf.length);
        } else {
            vvalore = testo.slice(idip, idfp);
        }
    } else {
        vvalore = "";
    }
    return vvalore;
}
;
ws.produciLista = function(testo, s1, s2, delim, x) {
    var lista = [];
    var elemento="";
    while (ws.find_stringa(testo, s1, s2, !0, x) > "") {
        elemento = ws.find_stringa(testo, s1, s2, !0, x);
        testo = testo.replace(elemento, "");
        if (delim) {
            lista.push(elemento);
        } else {
            lista.push(elemento.slice(s1.length, -s2.length));
        }
    }
    return lista;
}
;


/* memoRegex */



ws.memoRegex=JSON.parse(localStorage.memoRegex);
https://la.wikisource.org/wiki/Usor:Alex_brollo/PersonalTools.js
// caricamento dell'oggetto memoRegex per selezione di codice in modalità edit
ws.caricaRegex=function () {
	//if (localStorage.memoRegex===undefined) localStorage.memoRegex="{}";
	var memo;
	try{
		memo=JSON.parse(localStorage.memoRegex);
	}
	catch{
		localStorage.memoRegex="{}";
		memo=JSON.parse(localStorage.memoRegex);
	}
	
	var toAdd=JSON.parse(ws.selection()[1]); 
	for (var m in toAdd) {
		memo[m]=toAdd[m];
	}
	
	localStorage.memoRegex=JSON.stringify(memo);
	ws.memoRegex=JSON.parse(localStorage.memoRegex);
	// alert("Le sostituzioni selezionate sono state caricate");
};

// lancio della serie di regex su header. body, footer
ws.memoRegexRun=function () {
		var testo="";
		testo=$("#wpTextbox1").val();
		$.each(ws.memoRegex,function(index,value) {
			
			// verifica se corre sectionEdit e se è attiva una section con  nome
			if (ws.sectionEdit && ws.sectionEdit.name!=="") {
				// verifica se nel commento esiste un prefisso/suffisso, e se corrisponde alla section attiva
				if (test(value[0],ws.sectionEdit.name)) {
					testo=testo.replace(RegExp(index,value[2]),value[1]);
				}
			// altrimenti esegui
			} else {
				testo=testo.replace(RegExp(index,value[2]),value[1]);
			}
			
			
		});
		$("#wpTextbox1").val(testo);
		if (mw.config.get("wgCanonicalNamespace")==="Page") {
			testo=$("#wpHeaderTextbox").val();
			$.each(ws.memoRegex,function(index,value) {
				testo=testo.replace(RegExp(index,value[2]),value[1]);
			});
			$("#wpHeaderTextbox").val(testo);
			testo=$("#wpFooterTextbox").val();
			$.each(ws.memoRegex,function(index,value) {
				testo=testo.replace(RegExp(index,value[2]),value[1]);
			});
			$("#wpFooterTextbox").val(testo);
		}
	};

// caricamento dell'oggetto memoRegex da pagina remota di default (nDiscussioni_indice correlato alla pagina corrente)
ws.caricaRegexRemoto=function () {
	// se siamo in nsPagina tenta di caricare una memoRegex memorizzata in Discussioni indice
	if (mw.config.get("wgCanonicalNamespace")=="Page") {
		var paginaFonte=mw.config.get("wgPageName");
		paginaFonte="Index_talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; console.log(paginaFonte);
		paginaFonte=$.ajax({url:"/w/index.php?action=raw&title="+paginaFonte+"&r="+Math.random(),async:false}).responseText;console.log(paginaFonte);
		var codiceMemoregex=ws.find_stringa(paginaFonte,'{"','"]}',1); console.log(codiceMemoregex);
		var memo={};
		
		try {
			memo=JSON.parse(codiceMemoregex);
			localStorage.memoRegex=JSON.stringify(memo);
			ws.memoRegex=JSON.parse(localStorage.memoRegex);
			ws.alertMessage("MemoRegex", "Le sostituzioni correlate alla pagina sono state caricate");
		}
		catch(err) {
			ws.alertMessage("MemoRegex", "La pagina Discussioni indice non esiste/non contiene memoRegex");
			localStorage.memoRegex="{}";
		}
	// in ns diversi da nsPagina, tenta di caricare in modo additivo le regex contenuto in un testo selezionato
	} else {
		if (ws.selection()[1]!=="") {
			ws.caricaRegex();
		}
		
		
	}
	
};

// funzione generica di salvataggio di pagina remota
ws.salvaPagina = function (title,text,summary) {
		new mw.Api().postWithToken( 'edit', {
			action: 'edit',
			title: title,
			summary: summary,
			text: text,
		}).done(function( data ) {
	        if ( data && data.edit && data.edit.result == 'Success' ) {
				console.log("OK, pagina " + title + "salvata");
	
			}
		});
	};

// salvataggio memoRegex su pagina remota (nsDiscussioni_indice)
ws.salvaRegexRemoto=function() {
	if (mw.config.get("wgCanonicalNamespace")=="Page") {
		var paginaFonte=mw.config.get("wgPageName");
		paginaFonte="Index talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; console.log(paginaFonte);
		var regexOld="";
		var testoPaginaFonte="";
		var regexFormattato="";
		//paginaFonte="Index talk:"+paginaFonte;
		testoPaginaFonte = $.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title="+paginaFonte,async:false}).responseText;
		var errore=ws.find_stringa(testoPaginaFonte,"<!DOCTYPE html>","</html>",1);
		if (errore!=="") {
			testoPaginaFonte=testoPaginaFonte.replace(errore,"");
		}
		regexFormattato=localStorage.memoRegex.replace(/("\],)/g,"$1\n");
		regexOld=ws.find_stringa(testoPaginaFonte,'{"','"]}',1); 
		if (regexOld!=="") {
			testoPaginaFonte=testoPaginaFonte.replace(regexOld,regexFormattato);
		} else {
			testoPaginaFonte+="\n== memoRegex ==\n<nowiki>"+regexFormattato+"</nowiki>\n";
		}
		ws.salvaPagina(paginaFonte,testoPaginaFonte,"salvataggio memoregex");
		ws.alertMessage("MemoRegex", "Regex have been saved into "+paginaFonte);
	} else {
		ws.alertMessage("MemoRegex", "Routine can only be called from nsPage");
	}
	
};

// funzione generica di creazione di bottoni in "bottoniera"
ws.newButton=function(nome, funzione, azione, messaggio) { 
// azione è una stringa composta da v,e,s,h rispettivamente view,edit,submit,history
// se nome è un oggetto svolgilo
	var p;
	if (typeof(nome) === "string") {
		p = {
			nome: nome,
			funzione: funzione,
			azione: azione,
			messaggio: messaggio
		};
	} else {
		p = nome;
	}
	if (p.messaggio===undefined) p.messaggio="Nessun aiuto registrato";
	if (p.classe===undefined) p.classe="baseButton";
	if (p.stile===undefined) p.stile="background-color: #f0f0f0; border: 1px solid #d0d0d0; padding: 3px 6px;"+
	"display: inline-block; font-size: 12px;  margin: 0;  cursor: pointer;  border-radius:4px;";
	if (p.namespaces!==undefined) {
		var listaNamespaces=p.namespaces.split("|");
		for (var i=0; i<listaNamespaces.length; i+=1) {
			listaNamespaces[i]=$.trim(listaNamespaces[i]); 
			if (["ns0", "Main", "Principale"].indexOf(listaNamespaces[i]) !== -1) {
				listaNamespaces[i] === "";
			}
		}
		if ($.inArray(mw.config.get('wgCanonicalNamespace'),p.namespaces.split(","))==-1) return;
	}
// Passo 1: se newtatooo non esiste, lo crea
	if ($("#newtattoo").length===0) creaBottoniera();
	// fine se azione=history
	if (mw.config.get('wgAction') === "history") {
		return;
	}
	// normalizzazione function
	if (p.funzione.indexOf("(") === -1 && p.funzione.indexOf(")") === -1) {
		p.funzione += "()";
	}
	// default: bottone presente in view, edit, 
	if (p.azione === undefined) {
		p.azione = "ves";
	}
		// messaggio di default
	if (p.messaggio === undefined) {
		p.messaggio = "Nessun messaggio di aiuto registrato";
	}
	// valutazione condizione di visualizzazione
	if (mw.config.get('wgAction') === "edit" && p.azione.indexOf("e") === -1) {
		return;
	}
	if (mw.config.get('wgAction') === "view" && p.azione.indexOf("v") === -1) {
		return;
	}
	if (mw.config.get('wgAction') === "submit" && p.azione.indexOf("s") === -1) {
		return;
	}
	// caso pulsante=immagine
	var html = "";
	if (p.nome.substring(0, 2) == "//") {
		html = '<img class="'+p.classe+'" style="'+p.stile+'" src="' + p.nome + '" onclick="' + p.funzione + '" title="' + p.messaggio +'"';
		if (p.ondblclick!==undefined) html+=' ondblclick="'+p.ondblclick+'"';
		html+='/>';
	}
	// caso pulsante=label
	else {
		html = '<button class="'+p.classe+'" style="'+p.stile+'" type="button" title="' + p.messaggio + '" onclick="' + p.funzione +'"';
		if (p.ondblclick!==undefined) html+=' ondblclick="'+p.ondblclick+'"';
		html+='><small>' + p.nome + '</small></button>';                
	}
	$("#newtattoo").append($(html));
	return false;
}
/* funzione di creazione della bottoniera 
Dopo l'esecuzione, esiste #newtattoo        */
function creaBottoniera() {
	$('#' + (mw.user.options.get('skin') === 'modern' ? 'mw_' : '') + 'content')
	.append('<div id="newtattoo" align="right" style="position:fixed;bottom:0; right:0; background-color:white; border: 1px solid; border-color:#F0F0F0; z-index:1500;"></div>');
}

/*
Confronta il suffisso o il prefisso di un nome di sezione nel commento
di una regex, con il nome della sezione corrente; restituisce true o false.

Per indicare un prefisso: --testo
Per indicare un suffisso: testo--

*/
function test(commento,sezione) {
   	var r_pref=/ (\w+)--/;
	var r_suff=/--(\w+)/;
	var ok=false;
	if (r_pref.test(commento) || r_suff.test(commento)) {
		if (r_pref.test(commento)) {
			if (RegExp("^"+r_pref.exec(commento)[1]).test(sezione)) ok=true;
		} else {
			if (r_suff.test(commento)) {
				if (RegExp(r_suff.exec(commento)[1]+"$").test(sezione)) ok=true;
			}
		}
	} else ok=true;
	return ok;
}
// comandi lanciati al momento del caricamento della pagina corrente
// ws.newButton("regex up","ws.caricaRegex","es","Carica le sostituzioni selezionate");
ws.newButton("salva regex", "ws.salvaRegexRemoto","es","Scarica sulla pagina Discussioni indice le sostituzioni attive");
ws.newButton("carica regex", "ws.caricaRegexRemoto","es","Allinea memoRegex alla pagina Discussioni indice");
ws.newButton("esegui regex", "ws.memoRegexRun","es","Esegue le sostituzioni memorizzate");
if (mw.config.get("wgCanonicalNamespace")==="Page" && mw.config.get("wgAction")==="edit" ) {
     // caricamento del nome base pagina corrente
     localStorage.currentBasePage=(/.+?:(.+)\/\d+$/m).exec(mw.config.get("wgPageName"))[1];
     // se localStorage.currentRegexBasePage non è definito definiscilo
     if (localStorage.currentRegexBasePage===undefined) {
     	localStorage.currentRegexBasePage=localStorage.currentBasePage;
     }
     // se le regex memorizzate sono relative a un'altra BasePage carica le regex appropriate
     if (localStorage.currentRegexBasePage!==localStorage.currentBasePage) {
     	localStorage.currentRegexBasePage=localStorage.currentBasePage;
     	mw.caricaRegexRemoto();
     	
     	
     }
}


/* eis */

// Eis versione 28/10/20
// Rispetto alla versione precedente, aggiunta di un campo input "Pagina seccessiva"
if (typeof ws === 'undefined') {
    ws={};
}

ws.eis={};
ws.eis.cp={};
(function ($,mw) {
	// console.log("passo 1");
	if (mw.config.get("wgCanonicalNamespace")!=="Page" || mw.config.get("wgAction")!=="edit") { 
		// console.log("eis non eseguito"); 
		return false;
	} else {
		$(".prp-page-container").css("height","100%");$(".prp-layout-is-horizontal #wpTextbox1").attr("rows","6");
		ws.eis.base=/Pagina:(.+)\/\d+$/.exec(mw.config.get("wgPageName"))[1];
		ws.eis.html=$.ajax({
			// url: "/w/index.php?action=render&title=Indice:" + normUrl(ws.eis.base),
			url: "/w/index.php?action=render&title=Index:" + normUrl(ws.eis.base),
			async: false
		}).responseText;
		// ws.eis.indexLength=$(".pagineDellEdizione a", $(ws.eis.html)).length;
		 ws.eis.indexLength=$(".prp-index-pagelist a", $(ws.eis.html)).length;
	}
	// console.log("passo 2");
	activate();


	/* passo 1 :  costruire l'ambiente */
	
	
	// in nsPage, and in view mode, eis environment is built
	function normUrl(nomePagina) {
		return encodeURI(nomePagina.replace(/ /g,"_")).replace(/&/g,"%26");
	}
	
	
	function activate() {
		// access button
		
		if (mw.user.options.get("gadget-barbaforcutanew")===null) {
			$('<li id="ca-eis"><span><a href="#" title="Attiva eis" >eis</a></span></li>').click(function() {
				$("#wptextbox1").css("font-size",".9pc");
				creaEis();
				pp();
			}).insertAfter($("#ca-edit"));
		// loading wikitext of three pages
	
		} else {
			$('<button id="ca-eis" type="button">eis</button>').click(function() {
				$("#wpTextbox1").css("font-size",".9pc");
				creaEis();
				pp();
			}).appendTo($(".editButtons"));
		// loading wikitext of three pages
		}
		
		return false;
	}

	// initializing function, it disables some buttons, builds preview box, build action buttons
	function creaEis() {
	    // disabilitazioni
	    mw.loader.load('//wikisource.org/w/index.php?title=MediaWiki:GoogleOCR.js&action=raw&ctype=text/javascript');
		$("#ca-proofreadPagePrevLink a, #ca-proofreadPageNextLink a").remove();
		$("#wpSave, #wpPreview, #wpDiff, #wikiPreview").remove();
		$(".mw-summary, .editCheckboxes").remove();
		$("#ca-eis").remove();
		//$("a[title='Get the text by OCR']").remove();
		$('body').append(
			'<div id="findReplaceEis_box" style="display:none; font-size:90%; width:500px;position:fixed; z-index:1500;top:0px;right:0px;background-color:white;border:2px solid #0645AD;padding:10px">' +
			'<div style="float:left">Cerca testo:</div>' +
			'<div style="float:right"><input type="text" id="findReplaceEis_find" size="30" style="background-color:#efefef" readonly/></div>' +
			'<div style="clear:both;float:left">Sostituisci con: </div>' +
			'<div style="float:right"><input type="text" id="findReplaceEis_replace" size="30"/></div>' +
			'<div style="clear:both;float:left">' +
			'<div style="float:right;margin-top:10px;"><input type="button" id="findReplaceEis_ok"  value="OK"/></div>');
		
		
		var box=$("<div id='editBoxEis' style='background-color:#dfdfdf; min-height:10px; display:inline-block;position:fixed; top:0; left:0; z-index:100' ></div>");
		
		if (mw.user.options.get("gadget-barbaforcutanew")===null)  {
			box.resizable();
			$("#content").append(box); 
		}
		else {
			box.css("position","static").appendTo($(".editButtons"));
		}
		
	    
		var qb='<span id="radiobuttons">'+
			'<span class="quality0"><input tabindex="5" title="Pagine_SAL_00%" type="radio" value="0" name="wpQuality"></span>'+
			'<span class="quality2"><input tabindex="6" title="Pagine_SAL_50%" type="radio" value="2" name="wpQuality"></span>'+
			'<span class="quality1"><input tabindex="7" title="Pagine_SAL_25%" type="radio" value="1" name="wpQuality"></span>'+
			'<span class="quality3"><input tabindex="8" title="Pagine_SAL_75%" checked="" type="radio" value="3" name="wpQuality"></span>'+
			'<span id="radioQuality4" class="quality4" style="visibility:hidden;"><input tabindex="9" title="Pagine_SAL_100%" type="radio" value="4" name="wpQuality">&nbsp;&nbsp;</span></span>';

		qb+='<span>&nbsp;&nbsp;'+
			'<button class="baseButton" id="wpPrev" style="display: inline; padding: 1px 2px;" type="button" title="Vai alla pagina precedente" ><small>&lt;</small></button>'+
			'<button class="baseButton" id="wpNext" style="display: inline; padding: 1px 2px;" type="button" title="Vai alla pagina successiva" ><small>&gt;</small></button>'+
			'<button class="baseButton" id="wpSaveStay" style="display: inline; padding: 1px 2px;" type="button" title="Salva le modifiche" ><small>Salva</small></button>'+
			'<button class="baseButton" id="wpSave" style="display: inline; padding: 1px 2px;" type="button" title="Salva le modifiche e apri la pagina successiva" ><small>Salva e procedi</small></button>'+
			'<button class="baseButton" id="wpPreview" style="display: inline; padding: 1px 2px;" type="button" title="Visualizza anteprima" ><small>Anteprima</small></button>'+
			'<button class="baseButton" id="wpWikitext" style="display: none; padding: 1px 2px;" type="button" title="Visualizza anteprima" ><small>Wikitesto</small></button>'+
			'&nbsp;<span style="font-size:75%; color:#aaa;">Vai a pag: </span>'+
			'&nbsp;<input type="text" id="wpNextPage" title="Pagina successiva" value="" size="4" >'+
			'<button class="baseButton" id="copiaUrl" style="display: inline; padding: 1px 2px;" type="button" title="Copia url immagine"><small>Copia url</small></button>'+
			'&nbsp;<input type="text" id="wpComment" value="Ajax eis edit" size="25"></span>'+
			'<img alt="✔" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/15px-Yes_check.svg.png" style="width:px; height:15px;display:none" id="ok_img"/> ';
		$("#editBoxEis").append($(qb));
		
		$("span[class^='quality'] input").click(function() {
				$("#wpComment").val("/* new eis level"+$(this).attr("value")+" */");
			});
		$('#wpNextPage').keyup(function (e) {
		    if (e.keyCode === 13) {
		       	// controllo numero pagina
		       	if ($("#wpNextPage").val()*1>ws.eis.indexLength) {
					$("#wpNextPage").val(ws.eis.indexLength);
				}
			$("#wpNext").click(); //alert('ya!')
		    }
		});
		$("#wpNextPage").dblclick(function(){
			// controllo numero pagina
			if ($("#wpNextPage").val()*1>ws.eis.indexLength) {
				$("#wpNextPage").val(ws.eis.indexLength);
			}
			$("#wpNext").click();
		});
		$('#copiaUrl').click(function() {
	        navigator.clipboard.writeText('https:'+$('.prp-page-image img').attr('src'));
	        mw.alertMessage("Image URL", "L'indirizzo dell'immagine della pagina è stata caricata negli appunti");
	    });
		$("#wpExit").click(function(){
			window.open("/wiki/"+ws.eis.cp.title,"_self"); 
		});
		$("#wpSave").click(function(){
			pageSave(1);
		});
		$("#wpSaveStay").click(function(){
			pageSave(0);
		});
		$("#wpPreview").click(function(){
			// pp(prevPage());
			
			$("#divPreview").css("display","block");
			$("#wpPreview").css("display","none");
			$("#wpWikitext").css("display","inline");
			pagePreview();
			
		});
		$("#wpWikitext").click(function(){
			// pp(prevPage());
	
			$("#divPreview").css("display","none");
			$("#wpPreview").css("display","inline");
			$("#wpWikitext").css("display","none");
				
		});
		
		$("#wpPreviewSave").click(function(){
			pagePreview();
		});
		$("#wpPrev").click(function(){
			pp(prevPage());
			
		});
		$("#wpNext").click(function(){
			// $("#divPreview").css("display","none");
			pp(nextPage());
		
		});
		//creazione box divPreview
		var divPreview=$("<div>").css({
			"position":"absolute",
			"top":"0",
			"left":"0",
			"width":"100%",
			"height":$(".prp-page-image").css("height"),
			"overflow":"auto",
			"padding":"10px",
			"z-index":"150",
			"background-color":"white",
			"border":"1px solid black",
			"display":"none"
			}).attr("id","divPreview")
			// .dblclick(function() {$("#divPreview").toggle();})
			.append($("<div>").attr("id","previewContent"));
			$("<div>").attr("style",'position:absolute; top:0;right:0;cursor:pointer; z-index:200;')
			.append($('<button class="baseButton" id="wpPreviewExit" style="display: inline; padding: 1px 2px;" type="button" title="Chiudi" ><small>Annulla</small></button>').click(function(){$("#divPreview").toggle();}));

		$(".prp-page-content").css("position","relative").append(divPreview);
			
$('#previewContent').mouseup(function() {
		    var text=$.trim(getSelectedText());
		    
		    // 
		    if (text !== '') {
		    	/* $("#findReplaceEis_box").css("display","block");
		    	$("#findReplaceEis_find").val(text);
		    	$("#findReplaceEis_replace").val(text).focus(); */
		    	$("#inputField").remove();
		    	var s=getSelection();
				var r=s.getRangeAt(0).getBoundingClientRect();
				$("<input>").attr("id","inputField").attr("type","text")
					.css({"position":"fixed","top":r.y-3,"left":r.x,"height":r.height,"width":r.width})
					.val(text)
					.appendTo($(".pagetext"));
				$("#inputField").focus();
				$('#inputField').keyup(function(event) {
					var keycode = event.keyCode || event.which;
					if(keycode == '13') {
						gestisciInput(text);
						
					}
					if(keycode == '27') {
						$("#inputField").remove();
					}
				}).focusout(function(){gestisciInput(text);});
				
		    }
		});
		
function gestisciInput(oldText) {
	var newText=$("#inputField").val();
	if (newText !== oldText) {
		ws.scriviBox(ws.leggiBox().replace(oldText,newText));
	}
	$("#inputField").remove();
	pagePreview();
	
}
		
		ws.eis.baseImg=$(".prp-page-image img").attr("src").match(/(.+page)\d+(-\d+px.+)/);
		// ws.eis.baseImg[1]+[numero pagina]+ws.eis.baseImg[2] è l'url dell'immagine
		// della pagina [numero pagina)]
		// può essere caricato con 
		// $(".prp-page-image img").attr("src",ws.eis.baseImg[1]+211+ws.eis.baseImg[2]);
	}
	function nextPage() {
		/*var np=ws.eis.cp.title.match(/(.+\/)(\d+)$/);
		if (np[2]==ws.eis.indexLength-1) $("#wpNext").css("display","none"); else  $("#wpNext").css("display","inline");
		return np[1]+(np[2]*1+1);
		*/
		var np=ws.eis.cp.title.match(/(.+\/)(\d+)$/);
		return np[1]+$("#wpNextPage").val();
	}
	function prevPage() {
		var np=ws.eis.cp.title.match(/(.+\/)(\d+)$/);
		if (np[2]==2) $("#wpPrev").css("display","none"); else  $("#wpNext").css("display","inline");
		return np[1]+(np[2]*1-1);
	}	
	// splits wiki code into header,body,footer
	function splitPagina(tpp) {
		var testo = ["", "", ""];
		testo[0] = tpp.substring(0, tpp.indexOf("</noinclude>") + 12);
		testo[2] = tpp.substring(tpp.lastIndexOf("<noinclude>"));
		testo[1] = tpp.substring(testo[0].length, tpp.length - testo[2].length);
		return testo;
	}
	// reads three pages code (current, previous, previous of previous)	
	function pp(pageName) {
		if (pageName===undefined) pageName=mw.config.get("wgPageName");
		pageName=pageName.replace(/_/g," ");
		var pagine={};
		var t=(/(.+\/)(.+)$/).exec(pageName); // t[1]: base  pagina t[2]: numero pagina
		var	t1=t[2]*1-1;
		var	t2=t[2]*1-2;
		ws.eis.t3=t[2]*1+1; // predispongo numero pagina successiva
		console.log(ws.eis.t3,ws.eis.indexLength);
		if (ws.eis.t3>ws.eis.indexLength) ws.eis.t3=t[2]; // controllo che non sia oltre la fine indice
		$("#wpNextPage").val(ws.eis.t3); // imposto il numero pagina successiva in wpNextPage
		
		var p_cor=pageName;
		var p_prec1=t[1]+t1;
		var p_prec2=t[1]+t2;
		console.log(p_prec2,p_prec1,p_cor);
		var api = new mw.Api();
		$("#firstHeading").text("Modifica eis di "+pageName);
		// lettura di tre pagine
		
		api.get( {
		    action: 'query',
		    prop: 'revisions',
			titles:p_prec2+"|"+p_prec1+"|"+p_cor,
			rvprop:"content"
		} ).done( function ( data ) {
			    ws.query=data.query.pages;
			    $.each(data.query.pages, function(index,value) {
					if (ws.query[index].missing!==undefined) 
						pagine[ws.query[index].title]=["","",""]; 
					else 
						pagine[ws.query[index].title]=splitPagina(ws.query[index].revisions[0]["*"]);
			    });
				ws.eis.p_2=[p_prec2,pagine[p_prec2]];
				ws.eis.p_1=[p_prec1,pagine[p_prec1]];
				ws.eis.p_0=[p_cor,pagine[p_cor]];
				ws.p_2=ws.eis.p_2;
				ws.p_1=ws.eis.p_1;
				ws.p_0=ws.eis.p_0;
				ws.testoPag2Prec=ws.p_2[1];
				ws.testoPagPrec=ws.p_1[1];
				
				// settaggi comuni
				ws.eis.cp.basePageName=t[1];
				ws.eis.cp.basePageNum=t[2];
				ws.eis.cp.title=ws.eis.p_0[0];
				
				mw.config.set("wgTitle",ws.eis.cp.title);
				mw.config.set("wgPageName",/.+\//.exec(mw.config.get("wgPageName"))[0]+ws.eis.cp.basePageNum);
				
				// oscuramento next se ultima pagina e prev se prima
				if ( ws.eis.cp.basePageNum >= ws.eis.indexLength) $("#wpNext").css("display","none"); else $("#wpNext").css("display","inline");
				if ( ws.eis.cp.basePageNum == 1) $("#wpPrev").css("display","none"); else $("#wpPrev").css("display","inline");
				
				// modifica link Leggi e Modifica
				if ($("#ca-view a").length===1) {
					ws.eis.cp.linksUrl=$("#ca-view a").attr("href").replace(/\d+$/,ws.eis.cp.basePageNum);
					$("#ca-view a").attr("href",ws.eis.cp.linksUrl);
					$("#ca-edit a").attr("href",ws.eis.cp.linksUrl);
				}
				

				var urlpc=/.+\//.exec($("#ca-nstab-page a").attr("href"))[0]+ws.eis.cp.basePageNum;
				$("#ca-nstab-page a").attr("href",urlpc).attr("target","_blank");
				urlpc=/.+\//.exec($("#ca-talk a").attr("href"))[0]+ws.eis.cp.basePageNum;
				$("#ca-talk a").attr("href",urlpc).attr("target","_blank");
				if ($("#croptool").length>0) {
					ws.eis.cp.croptool=$("#t-cropNew a").attr("href").replace(/\d+$/,ws.eis.cp.basePageNum);
					$("#t-cropNew a").attr("href",ws.eis.cp.croptool);
				}
				var urlImg=$(".prp-page-image img").attr("src").match(/(.+page)(\d+)(-.+)/);
				ws.eis.cp.imageUrl=urlImg[1]+ws.eis.cp.basePageNum+urlImg[3];
				
				// assegno valori alle variabili globali testoPagPrec e testoPag2Prec per renderli visibili a autoPt e autoRi7
				ws.testoPagPrec=ws.eis.p_1[1];
				ws.testoPag2Prec=ws.eis.p_2[1];
				$("#radioQuality4").css("visibility","hidden");
				$(".prp-page-image img").attr("src",ws.eis.cp.imageUrl);
			/* qui inserita routine per caricare l'immagine nel canvas OpenSeadragon
			Critica l'aggiunta del prefisso https: alla stringa url immagine
			*/
				mw.hook( 'ext.proofreadpage.osd-viewer-ready' ).add( function ( viewer ) {
				    // Can use viewer or mw.proofreadpage.viewer - they're the same
				    viewer
				        .addSimpleImage( {
				            url: 'https:'+ws.eis.cp.imageUrl
				        } );
				} );
				
				
				if (ws.eis.p_0[1].toString()===",,") {
					// caso pagina corrente non esistente
					// leggo la pagina...
					$.get( mw.config.get("wgServer")+"/w/index.php?title="+normUrl(mw.config.get("wgPageName"))+"&action=edit&redlink=1", function( data ) {
						$("#wpTextbox1").val($("#wpTextbox1",$(data)).val());
						
						
						ws.eis.cp.header="";
						ws.eis.cp.footer="";
						$("#wpHeaderTextbox").val(ws.eis.cp.header);
						$("#wpFooterTextbox").val(ws.eis.cp.footer);
						
						// eseguo autoRi, Rv, postOcr, regex
						// preOCR();
						$("#buttonautoRi").click();
                        $("#buttonpostOCR").click();
						// $("#button6").click();
                        $("#buttonRunregex").click();
						ws.eis.p_0[1][1]= $("#wpTextbox1").val();
						ws.eis.cp.user=mw.config.get("wgUserName");
						ws.eis.cp.level="1";
						$("#radiobuttons input[value='"+ws.eis.cp.level+"']").click();
						pagePreview();
					});
				} else {
					// caso pagina esistente
					ws.eis.cp.user=ws.eis.p_0[1][0].match(/user=\"([^"]*)\" \/>/)[1];
					ws.eis.cp.level=ws.eis.p_0[1][0].match(/level=\"(\d+)\" /)[1];
					ws.eis.cp.header=$.trim(ws.eis.p_0[1][0].replace(/<noinclude\><pagequality.+?>/,"").replace("</noinclude>",""));
					ws.eis.cp.footer=$.trim(ws.eis.p_0[1][2].replace("<noinclude>","").replace("</noinclude>",""));
					$("#wpHeaderTextbox").val(ws.eis.cp.header);
					$("#wpFooterTextbox").val(ws.eis.cp.footer);
					$("#wpTextbox1").val(ws.eis.p_0[1][1]);
					
					// if level=3 and user is another one, or if level=4 display radiobutton4
					if ( (ws.eis.cp.level==="3" && ws.eis.cp.user!==mw.config.get("wgUserName")) || ws.eis.cp.level==="4") $("#radioQuality4").css("visibility","visible");
					
					$("#radiobuttons input[value='"+ws.eis.cp.level+"']").click();
					pagePreview();
				}
	
		});
		$(".prp-page-image img").css("top","0");
		$("#wpTextbox1").scrollTop(0);
	}
	function chiudiEditBox () {
		$("#sfondoeis").toggle();
	}
	function pageBuild() {
		ws.restore_lst();
		var template= '<noinclude><pagequality level="#LEVEL#" user="#USER#" />#HEADER#</noinclude>' + 
		'#BODY#<noinclude>#FOOTER#\n</noinclude>';
		var wikicode= template.replace("#HEADER#",$("#wpHeaderTextbox").val())
			.replace("#BODY#",$("#wpTextbox1").val())
			.replace("#FOOTER#",$("#wpFooterTextbox").val());
		if (ws.eis.cp.level ===$("input:checked","#radiobuttons").val()) {
			 wikicode=wikicode.replace("#LEVEL#",ws.eis.cp.level).replace("#USER#", ws.eis.cp.user);
		} else {wikicode=wikicode.replace("#LEVEL#",$("input:checked","#radiobuttons").val())
		   	    	.replace("#USER#", mw.config.get("wgUserName"));
		}

		return wikicode;
	}
	
	
	function pageSave(azione) {
		var wikicode=pageBuild();
		new mw.Api().postWithToken( 'edit', {
			action: 'edit',
			title: ws.eis.cp.title,
			summary:$("#wpComment").val(),
			text: wikicode,
		}).done(function( data ) {
	        if ( data && data.edit && data.edit.result === 'Success' ) {
				$("#ok_img").toggle();
				setTimeout(function (){
					$("#ok_img").toggle();
				}, 500);
				if (azione==1 && ws.eis.cp.basePageNum < ws.eis.indexLength) $("#wpNext").click();
				if (azione==-1) $("#wpPrev").click();
			} else {
				alert("Errore nel salvataggio della pagina");
			}
		});
	}
	function pagePreview() {
		// toggleButton generico (nasconde parent())
		/*	var toggleButton=$('<img>')
		    .attr("src","//upload.wikimedia.org/wikipedia/commons/f/f8/Tooltip-CloseButton.png") 
		    .attr("style",'position:absolute; top:0;right:0;cursor:pointer; z-index:200;')
			.click(function(){$(this).parent().toggle();}); 
		*/
		//caricamento preview
		var wikicode=pageBuild();
		// $("#divPreview").toggle();
		$.ajax({
         	url: mw.util.wikiScript( 'api' ),
        	data: {
            	format: 'json',
            	action: 'parse',
				// contentmodel: 'proofread-page',
				title:ws.eis.cp.title,
				summary: "ajax preview",
            	text: wikicode,
            	time: $.now()
            	},
        	dataType: 'json',
        	type: 'POST',
        	success: function( data ) { 
        		if ( data && data.parse ) {
					
					$("#previewContent").html($(data.parse.text["*"]));

            	} else if ( data && data.error ) {
                		alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
            			} else {
                			alert( 'Error: Unknown result from API.' );
						}
        		},
        		error: function( xhr ) {
        			alert( 'Error: Request failed.' );
			}
    	});
	}
	ws.pagePreview=pagePreview;
	/* 
	$("#findReplace_box input[value='OK']").click(function() {
	if($("#divPreview")==="block") {
	pagePreview();
	}
    }) */

function getSelectedText() {
    if (window.getSelection) {
        return window.getSelection().toString();
    } else if (document.selection) {
        return document.selection.createRange().text;
    }
    return '';
}

})(jQuery,mw);


/* findReplace */

$('body').append(
			'<div id="findReplace_box" class="box" style="display:none;">' +
			'<div class="box-title">Trova & Sostituisci<span class="icon-close findReplace_box_close"></span></div>' +
			'<div class="box-main">' +
			'<div class="width-50">Cerca (testo o espressione regolare):</div>' +
			'<div class="width-50"><input type="text" id="findReplace_find" size="55"/></div>' +
			'<div class="width-50">Sostituisci con: </div>' +
			'<div class="width-50"><input type="text" id="findReplace_replace" size="55"/></div>' +
			'<div class="width-50">Commento: </div>'+
			'<div class="width-50"><input type="text" id="findReplace_doc" size="55"/></div>' +
			'<div>' +
			'<input type="checkbox" id="findReplace_regex"/><label for="findReplace_regex">Espressione regolare</label><br/>' +
			'<input type="checkbox" id="findReplace_maiusc"/><label for="findReplace_maiusc">Non distinguere maiuscole/minuscole</label><br/>' +
			'<input type="checkbox" id="findReplace_multiriga"/><label for="findReplace_multiriga">Multiriga</label><br/>' +
			'<input type="checkbox" id="findReplace_ricorda"/><label for="findReplace_ricorda">Ricorda questa sostituzione (<a target="_blank" href="/wiki/Aiuto:MemoRegex">MemoRegex</a>)</label></div>' +
			'<div class="text-right"><input id="findReplace_box_ok" type="button" class="btn blue" value="Applica" />' +
			'<input type="button" class="btn blue findReplace_box_close" value="Chiudi" /></div></div>');
ws.selection=function (area){
	
	/*
	if(area===undefined){
		if(mw.config.get("wgCanonicalNamespace")=="Page"||$("#editBox").length===1)
			area=1;
		else 
			area=0;
	}
	
	var txtarea=$('textarea')[area];
	var txt=$(txtarea).val();
	*/
	var txt=mw.activeElement.value;
	var s=[];
	s[0]=txt.substring(0,mw.activeElement.selectionStart);
	s[1]=txt.substring(mw.activeElement.selectionStart,mw.activeElement.selectionEnd);
	s[2]=txt.substring(mw.activeElement.selectionEnd);
	return s;
};
// riscrive mw.activeElement e ristabilisce il focus/la selezione attiva
// riceve un array tipo [testo precedente, testo selezionato, testo seguente]
// pone il cursore a fine selezione
ws.scriviSel=function(t) {
	mw.activeElement.value=t.join("");
	mw.activeElement.selectionStart=t[0].length;
	mw.activeElement.selectionEnd= t[0].length + t[1].length;
        mw.activeElement.focus();
};
// idem, poi attiva la selezione 
ws.scriviSelAlt=function(t) {
	mw.activeElement.value=t.join("");
	mw.activeElement.selectionStart=t[0].length + t[1].length;
	mw.activeElement.selectionEnd= t[0].length + t[1].length;
    mw.activeElement.focus();
};

ws.toggleNote = function() {
    var editbox = document.getElementsByName('wpTextbox1')[0];
    var lista, marks, refs,i;
    if (editbox.value.indexOf("<sup>nota</sup>") == -1) {
        lista = ws.produciLista(editbox.value, "<ref", '</' + 'ref>', 1);
        lista = jQuery.grep(lista, function(n, i) {
            return (n.indexOf('<ref ' + 'follow=') == -1);
        });
        for (i = 0; i < lista.length; i += 1) {
            editbox.value = editbox.value.replace(lista[i], "<sup>nota</sup>");
            editbox.value = editbox.value + "\n" + lista[i];
        }
    } else {
        marks = count(editbox.value, '<ref' + '>') + count(editbox.value, '<ref ' + 'name=') + count(editbox.value, '<ref ' + 'group=');
        refs = count(editbox.value, "<sup>nota</sup>");
        if (marks != refs) {
            alert("ATTENZIONE: discordanza fra numero delle <br />note (" + marks + ") e numero dei segnaposti (" + refs + "). Controllare!");
            return;
        }
        lista = ws.produciLista(editbox.value, "<ref", '</' + 'ref>', 1);
        lista = jQuery.grep(lista, function(n, i) {
            return (n.indexOf('<ref ' + 'follow=') == -1);
        });
        editbox.value = editbox.value.replace(/\n<ref/g, "<ref");
        for (i = 0; i < lista.length; i += 1) {
            editbox.value = editbox.value.replace(lista[i], "");
        }
        for (i = 0; i < lista.length; i += 1) {
            editbox.value = editbox.value.replace("<sup>nota</sup>", lista[i]);
        }
    }
};

ws.mostraTrovaSostituisci = function() {
    $('#findReplace_box').css("display", "block");
    var t = ws.selection();
    $("#findReplace_find").attr("value", t[1]);
    $("#findReplace_replace").attr("value", t[1]).click();
};
$('#findReplace_box_ok').click(function(e) {
    ws.trovaSostituisci();
});
$('.findReplace_box_close').click(function(e) {
    ws.nascondiTrovaSostituisci();
});

ws.nascondiTrovaSostituisci = function() {
    $('#findReplace_box').css("display", "none");
};

ws.regexRepl = function(trova, sostituisci, modificatori) {
    if (modificatori === undefined) modificatori = 'g';
    var regex = new RegExp(trova, modificatori);
    var testo = $('[name=wpTextbox1]').val();
    $('[name=wpTextbox1]').val(testo.replace(regex, sostituisci));
};

ws.trovaSostituisci = function() {
    var trova = $('#findReplace_find').val();
    var sostituisci = $('#findReplace_replace').val()
        .replace(/\\n/g, '\n').replace(/\\t/g, '\t'); //abilita \n e \t come caratteri speciali newline e tab
    var commento=$('#findReplace_doc').val();	
    var isRegex = $('#findReplace_regex').is(':checked');
    var isMaiusc = $('#findReplace_maiusc').is(':checked');
    var isMultiriga = $('#findReplace_multiriga').is(':checked');
    var isRicorda = $('#findReplace_ricorda').is(':checked');
    var regexParams = 'g';
    if (!isRegex) {
        //escape dei caratteri speciali delle regex
        trova = trova.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
    }
    if (isMaiusc) {
        regexParams += 'i';
    }
    if (isMultiriga) {
        regexParams += 'm';
    }
    //applica la sostituzione nella pagina corrente
    regex = new RegExp(trova, regexParams);
    /* testo = $('[name=wpTextbox1]').val();
    $('[name=wpTextbox1]').val(testo.replace(regex, sostituisci)); */
    // attivazione su tutti i tre campi se in nsPagina 
    if (mw.config.get("wgCanonicalNamespace")==="Page") {
        for (i=0;i<3;i+=1) {
        ws.scriviBox(ws.leggiBox(i).replace(regex,sostituisci),i);
        }
    } else {
        ws.scriviBox(ws.leggiBox().replace(regex,sostituisci));
    }
    // Temporanea disabilitazione
    //updatePreview();
    
    //se l'utente ha spuntato "Ricorda", salva in localStorage
    if (isRicorda) {
        // se localStorage.memoRegex esiste lo carico in ws.memoRegex 
        if (localStorage.memoRegex!==undefined) ws.memoRegex=JSON.parse(localStorage.memoRegex);
        if (ws.memoRegex===undefined) ws.memoRegex={};
        commento=commento.replace("(regex)","");
        if (isRegex) {
            commento+="(regex)";
        }
    
        // aggiorno localStorage["regex"] 
        ws.memoRegex[trova]=[commento,sostituisci,regexParams]; console.log("Passato per riga 549");
        localStorage.memoRegex=JSON.stringify(ws.memoRegex);
        localStorage.memoRegexEdited=true;   
    } 

};

ws.leggiBox=function (area) {
	if (area === undefined) {
		if (mw.config.get('wgCanonicalNamespace') == "Page" || $("#editBox").length===1) area = 1;
		else area = 0;
	}
	return $('textarea')[area] === undefined ? '' : $('textarea')[area].value;
};

ws.scriviBox=function (testo, area, ss, se) {
	if (area === undefined || area === "") {
		if (mw.config.get('wgCanonicalNamespace') == "Page" || $("#editBox").length===1) {
			area = 1;
		} else {
			area = 0;
		}
	}
	$('textarea')[area].value = testo;
	// console.log("area:", area);
	if (ss !== undefined && se !== undefined) {
		$('textarea')[area].selectionStart = ss;
		$('textarea')[area].selectionEnd = se;
	}
};


/* FI */

/* inserimento  template FI standard */
if ( typeof $ != 'undefined' && typeof $.fn.wikiEditor != 'undefined' && mw.config.get("wgCanonicalNamespace")==="Page") {$( function() {
    var nomeBase, numeroPagina, nomeImmagine, fi;
    nomeBase=mw.config.get("wgTitle").match(/(.+)\./)[1].replace("Pagina:","");
    numeroPagina=mw.config.get("wgTitle").match(/\/(\d+)$/)[1];
    nomeImmagine=nomeBase+" (page #1 crop).jpg".replace("#1",numeroPagina);
    fi="{{FI\n|file = #1\n| width = 400px\n| float = floating-center\n| caption = \n}}".replace("#1",nomeImmagine);
    // console.log(nomeImmagine);
    
    $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
      'section': 'advanced',
      'group': 'insert',
      'tools': {'FI': {
          label: 'Inserisci template FI',
          type: 'button',
          icon: '//upload.wikimedia.org/wikipedia/commons/6/68/Pulsante_img.png',
          action: {type: 'callback',
            execute: function() {
            	/* nomeBase=mw.config.get("wgTitle").match(/(.+)\./)[1];
    			numeroPagina=mw.config.get("wgTitle").match(/\/(\d+)$/)[1];
    			nomeImmagine=nomeBase+" (page #1 crop).jpg".replace("#1",numeroPagina);*/
    			fi="{{FI\n|file = #1\n| width = 400px\n| float = floating-center\n| caption = \n}}".replace("#1",nomeImmagine);
				// console.log("Nuova versione gadget FI");
				//mw.toolbar.insertTags(fi,"");
				$(mw.activeElement).textSelection( 'encapsulateSelection', { pre: fi, post: '' } );
            	} 
          }
       }
}});});}

// routine per newRi 
ws.newRi=function() {
	var currentHeader=ws.leggiBox("0");
	// se manca un Rh oppure esiste ma è vuoto
	if (/{{ri/i.test(currentHeader)===false || currentHeader.indexOf("{{Rh|||}}")!==-1) {
		var header=ws.find_stringa(ws.testoPag2Prec[0],"/>","</noinclude>",0);

		header=ws.newAutoRi(header);
		// se header contiene Rh, rulla
		if (header.indexOf("{{Rh")!==-1) ws.scriviBox(header,"0");
	}
};

ws.newAutoRi=function(header) {
	function incrementa(t){
		var pagina=/(\d+)/.exec(t)[1];
		var pnew=(pagina*1+2)+""; 
		return t.replace(pagina,pnew);
	}
	// normalizzazione Rh
	header=header.replace("{{rh|","{{Rh|");

	var oldRi=ws.find_stringa(header,"{{Rh|","}}",1,"{{");
	if (oldRi==="") return header;
	var parsedRi=ws.parseTemplate("Rh",oldRi);
	// analisi
	var valido=[];
	var pagina="";
	for (i=1;i<4;i+=1) {
		if (/^\d+$/.test(parsedRi[0][i]) || /— \d+ —/.test(parsedRi[0][i]) || /\|\d+}/.test(parsedRi[0][i])) valido.push(i);
	}
	// console.log(valido,parsedRi);
	switch (valido.length) {
		case 0: 
			break;
		case 1: 
			// pagina=/(\d+)/.exec(parsedRi[0][valido[0]])[1];
			parsedRi[0][valido[0]]=incrementa(parsedRi[0][valido[0]]);
			break;
		default: 
			break;
	}

	return header.replace(oldRi,ws.rewriteTemplate(parsedRi));
};

ws.parseTemplate=function(template, testo) {
	function cod(testo) {
		var l = ws.produciLista(testo, "{"+"{", "}}", 1, "{{");
		for (var i = 0; i < l.length; i += 1) {
			testo = testo.replace(l[i], l[i].replace(/\|/g, "__!__").replace(/=/g, "__eq__"));
		}
		l = ws.produciLista(testo, "[[", "]]", 1, "[[");
		for (i = 0; i < l.length; i += 1) {
			testo = testo.replace(l[i], l[i].replace(/\|/g, "__!__"));
		}
		return testo;
	}
	function decod(testo) {
		testo = testo.replace(/__!__/g, "|").replace(/__eq__/g, "=");
		return testo;
	}
	
	if (testo === undefined) testo = ws.leggiBox();
    var cap=template.substring(0,1).toLocaleUpperCase()+template.substring(1);
    testo=testo.replace("{{"+cap,"{{"+template);
	var t = ws.find_stringa(testo, "{"+"{" + template, "}}", 1, "{{");
	var l = []; // lista delle keys
	t = "0=" + t.substring(2, t.length - 2); // nome del template in parametro "0"
	l.push["0"];
	var ts = {};
	var n = 1;
	t = cod(t);
	t = t.split("|");

	// element for element
	for (i = 0; i < t.length; i += 1) {
		// case param is positional
		if (t[i].indexOf("=") == -1) {
			t[i] = n + "=" + t[i];
			n = n + 1;
		}
		var els = [];
		els[0] = t[i].substring(0, t[i].indexOf("=")).trim();
		els[1] = t[i].substring(t[i].indexOf("=") + 1).trim();
		if (els[1][els[1].length - 1] == "\n") els[1] = els[1].substring(0, els[1].length - 1);

		ts[els[0]] = decod(els[1]);
		l.push(els[0]);
	}

	return [ts, l];
};


ws.rewriteTemplate=function(x,mini) {
	if (mini===undefined) mini=true;
	var testo = "";
	if (mini) { 
		$.each(x[1], function (indice, valore) {
			if ((/^\d+$/).test(valore)) 
				testo += "|" + x[0][valore];
			else
				testo += "|" + valore + "=" + x[0][valore];
		});
		testo = "{" + "{" + testo.substring(1) + "}}";
	} else { 
		$.each(x[1], function (indice, valore) {
			if (valore != "0") testo += " | " + valore + " = " + x[0][valore] + "\n";
		});
		testo = "{{" + x[0]["0"] + "\n" + testo + "}}\n";
		testo = testo.replace(/\n\s\|\s\d*\s=\s/g, "\n | ");
	}
	return testo;
}
  /*
   * Convert ## syntax to <section> syntax
   */
  ws.restore_lst=function() {

    console.log("Restoring section markers from ##-syntax");

    var editbox = $("#wpTextbox1");

    if (!editbox) {
      error("Couldn't find editbox");
      return;
    }

    var search = /##[\s]*(.*?)[\s]*##[\s]*\n/;
    var a = editbox.val().split(search);
    var s = a[0];
    var m = parseInt(a.length / 2);
    for (var i = 0; i < m; i++) {
      var title = a[i * 2 + 1];
      // Ensure we'll don't get twice quote.
      title = title.replace(/^"(.*)"$/, "$1");
      title = title.replace(/^'(.*)'$/, "$1");
      var content = a[i * 2 + 2];
      if (title && content.substring(0, 2) == "{|") {
        content = "\n" + content;
      }
      if (title) {
        s = s + "<section begin=\"" + title + "\" />" +
          content +
          "<section end=\"" + title + "\" />\n";
      } else {
        s = s + content;
      }
      /* if( i < m-1 ) s = s + "----\n"; */
    }
    editbox.val(s);
  }


/**
   * easy lst: hide section markers
   */
  ws.easy_section_syntax=function() {

    console.log("Converting section markers to ##-syntax");

    var editbox = $("#wpTextbox1");

    if (!editbox) {
      error("Couldn't find editbox");
      return;
    }

    var search = /<section\sbegin=[\s]*(.*?)[\s]*\/>/;
    var a = editbox.val().split(search);
    var s = a[0];
    var ok = true;
    for (var i = 0; i < parseInt(a.length / 2); i++) {
      var title = a[i * 2 + 1];
      var content = a[i * 2 + 2];
      var r2 = /^([\s\S]*?)<section\send=(.*?)\/>(\n|)[\s]*([\s\S]*?)$/;
      var m2 = content.match(r2);
      if (m2) {
        title = title.replace(/^"(.*)"$/, "$1");
        title = title.replace(/^'(.*)'$/, "$1");
        if (s && s.charAt(s.length - 1) != "\n" &&
          s.charAt(s.length - 1) != "|") {
          s = s + "\n";
        }
        s = s + "## " + title + " ##\n" + m2[1];
        if (m2[4]) {
          if (m2[4] != "----\n") {
            if (s && s.charAt(s.length - 1) != "\n") {
              s = s + "\n";
            }
            s = s + "####\n" + m2[4];
          }
        }
      } else {
        ok = false;
        error("Error" + title);
      }
    }
    if (ok) {
      // val() function is important, as just setting .value on a raw
      // element doesn't work in CodeMirror
      editbox.val(s);
    }
  }
ws.autoPt=function() {
	
	var t = [],
	rFin = /\ (\w+’*\w+)-$/,			// parola finale ifenata
	rPtIniz = /^\{\{pt\|/i,		// pt in testa sulla pagina corrente
	rPtFin = /\{\{pt\|(.+)-\|\}\}/i,	// pt di tipo finale
	rHyp2 = /^[^ \n]+/,
	hyp = "",
	hyp2 = "",
	l = [],
	prePt = "",
	headTxt="",
	rht=/^(({{nop}})*\n*)/;
		t = ws.selection();
	// se c'è una selezione di testo....
	if (t[1].length > 0) {
		if (t[0].length > t[2].length) { //allora va applicato un pt-before...
			t[1] = "{{Pt|" + t[1] + "|}}";

		} else {
			ws.testoPagPrec[1] = ws.testoPagPrec[1].replace(/\{\{pt\|/g, "{{Pt|");
			l = ws.produciLista(ws.testoPagPrec[1], "{{Pt|", "}}", 1, "{{");
			prePt = "";
			if (l.length > 0) {
				prePt = l[l.length - 1];
				prePt = ws.find_stringa(prePt, "{{Pt|", "|", 0);
			}
			t[1] = "{{Pt|" + t[1] + "|" + prePt.substring(0, prePt.length - 1) + t[1] + "}}";
		}
		ws.scriviSel(t);
	} else {// invece se non c'è alcuna selezione di testo...
		t = ws.leggiBox();
		headTxt=rht.exec(t)[0];
		if (t.indexOf("{{nop}}")==0) t=t.replace("{{nop}}","");
		t=$.trim(t);
		// se la pagina precedente ha un pt di tipo finale
		// e la pagina corrente non ha un pt di tipo iniziale
		// allora applica un pt iniziale
		if (rPtFin.exec(ws.testoPagPrec[1]) !== null && rPtIniz.exec(t) === null) {
			hyp = rPtFin.exec(ws.testoPagPrec[1])[1];
			hyp2 = rHyp2.exec(t);
			t = "{{Pt|" + hyp2 + "|" + hyp + hyp2 + "}}" + t.replace(hyp2, "");
		}
		// se la pagina corrente termina con parola ifenata
		// allora applica pt finale sulla
		if (rFin.exec(t) !== null) {
			hyp = rFin.exec(t)[1]; //parola ifenata senza trattino
			t = t.substr(0, t.search(rFin) + 1) +
				"{{Pt|" + hyp + "-|}}";
		}
	ws.scriviBox(headTxt+t);}
}

// spostamento in LocalTools di shortcuts e bottoni
importScript("User:Alex brollo/LocalTools.js");