Jump to content

User:Alex brollo/bat.js

From 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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
// ViewInSequence (vis) activation 
//importScript("User:Alex brollo/vis.js");
//importStylesheet("User:Alex brollo/vis.css");


// creo un'unica variabile globale, non si sa mai che mi serva; anzi proviamo senza
// var alex={};
// mw.loader.load("jquery.ui");

$("head").append($('<style>/*.poem {position:relative;} .poem p {margin-left:3em;}*/ .quote:target {background-color:#DEF;}</style>'));
// funzioni pagina.js
//mw.loader.using(['mw.Api',"jquery.ui"]).then(function() {
mw.loader.using(['mw.Api']).then(function() {
	console.log("passo 1");
if (mw.config.get("wgServer")!=="//it.wikisource.org") {
	mw.loader.load('//wikisource.org/w/index.php?title=User:Alex_brollo/eis.js&action=raw&ctype=text/javascript' );
	}
(function ($,mw,alex) {
	// riceve un template RigaIntestazione e incrementa di 2 il numero pagina
// template è il nome del template di cui fare il parsing (es. RigaIntestazione )
// restituisce un oggetto costituito da un dizionario e una lista
// testo è il testo dove ricercare il template (default leggiBox() )♀
// il dizionario contiene le coppie nome paramtro - valore
// la lista contiene i nomi dei parametri, o cifre (in stringa) per i parametri posizionali
// il nome del template è associato al parametro con chiave "0" )
// esempio: da Pagina:Eneide (Caro).djvu/91 ilcomando:
// parseTemplate("RigaIntestazione",leggiBox(0)) 
// restituisce [{"0":"RigaIntestazione","1":"48","2":"{{Sc|l'eneide.}}","3":"[1158-1182]"},["0","1","2","3"]]
console.log("Passo 2");
alex.parseTemplate=function (template, testo) {
	function cod(testo) {
		var l = 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 = 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 = leggiBox();
    var cap=template.substring(0,1).toLocaleUpperCase()+template.substring(1);
    testo=testo.replace("{{"+cap,"{{"+template);
	var t = 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];
};
alex.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;
}	
	
	alex.newAutoRi=function(header) {
		function incrementa(t){
			var pagina=/(\d+)/.exec(t)[1];var pnew=(pagina*1+2)+""; return t.replace(pagina,pnew);
		}
		// normalizzazione RigaIntestazione
		header=header.replace("{{Ri|","{{RigaIntestazione|").replace("{{ri|","{{RigaIntestazione|").replace("{{rigaIntestazione|","{{RigaIntestazione|");
		var oldRi=find_stringa(header,"{{RigaIntestazione|","}}",1,"{{");
		if (oldRi==="") return header;
		var parsedRi=parseTemplate("RigaIntestazione",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,rewriteTemplate(parsedRi));
	};
	
	alex.moveRi=function() {
		var ri=find_stringa($("#wpTextbox1").val(),"{{RigaIntestazione|","}}",1,"{{");
		var pp=find_stringa($("#wpTextbox1").val(),"{{PieDiPagina|","}}",1,"{{");
		var ri1=find_stringa($("#wpHeaderTextbox").val(),"{{RigaIntestazione|","}}",1,"{{");
		var pp1=find_stringa($("#wpFooterTextbox").val(),"{{PieDiPagina|","}}",1,"{{");
		var header=$("#wpHeaderTextbox").val();
		var body=$("#wpTextbox1").val();
		var footer=$("#wpFooterTextbox").val();
		if (ri!=="") { 
			if (ri1!=="") header=header.replace(ri1,"");
			header=ri+header; 
			$("#wpHeaderTextbox").val(header);
			body=body.replace(ri,"");
			$("#wpTextbox1").val(body);
		}
		if (pp!=="") { 
			if (pp1!=="") footer=footer.replace(pp1,"");
			footer=footer+pp; 
			$("#wpFooterTextbox").val(footer);
			body=body.replace(pp,"");
			$("#wpTextbox1").val(body);
		}
	};
	
	/**
	 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
	 * Version : 2.01.B
	 * By Binny V A
	 * License : BSD
	 */
	
	alex.shortcut = {
		'all_shortcuts':{},//All the shortcuts are stored in this array
		'add': function(shortcut_combination,callback,opt) {
			
			
			if (alex.shortcut.all_shortcuts[shortcut_combination.toLowerCase()]!==undefined) {
				console.log(shortcut_combination.toLowerCase()+" già registrata");
				return false;
			}
			
			
			
			//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;
		}
	}
// funzioni per il caricamento rapido di testoPagPrec e testo2PagPrec
// pp: carica l'ultima revisione delle 2 pagine precedenti e restituisce alex.p_2 e alex.p_1
// ognuna: [titolo pagina, [header,body,footer]]
    alex.p_0=[];
    alex.p_1=[];
    alex.p_2=[];
    var bengali="০১২৩৪৫৬৭৮৯"
	function b2l(bengaliDigits) {
		
		var b=bengaliDigits.split("");
		var result="";
		for (i=0;i<b.length;i+=1){
			result+=(bengali.indexOf(b[i])+"");
		}
		return result;
	}
	function l2b(latinDigits) {
		
		var l=latinDigits.split("");
		var result="";
		for (i=0;i<l.length;i+=1){
			result+=(bengali.substring(l[i]*1,l[i]*1+1));
		}
		return result;
	}
    
    function pp() {
		var p=[];
		var t=(/(.+\/)(.+)$/).exec(mw.config.get("wgPageName"));
		var t1="";
		var t2="";
		if (mw.config.get("wgServer")==="//bn.wikisource.org") {
			t1=l2b((b2l(t[2])-1)+"");
			t2=l2b((b2l(t[2])-2)+"");
		} else {
			t1=t[2]*1-1
			t2=t[2]*1-2
		}
		
		
		var api = new mw.Api();
		
		
		api.get( {
		    action: 'query',
		    prop: 'revisions',
			titles:t[1]+t2+"|"+t[1]+t1+"|"+t[1]+t[2],
			rvprop:"content"
		} ).done( function ( data ) {
			    $.each(data.query.pages, function(index,value) {
			    	try {p.push([value.title,value.revisions[0]["*"]]);}
			    	catch(err) {p.push([value.title,""]);}
			    	
			    });
				localStorage.p=p;
				try {
                                     alex.p_2=[p[0][0],splitPagina(p[0][1])];}
				catch(err) {alex.p_2=["",[[],[],[]] ];}
				try {
				    alex.p_1=[p[1][0],splitPagina(p[1][1])];}
				catch(err) {alex.p_1=["",[[],[],[]] ];}
				try {
				alex.p_0=[p[2][0],splitPagina(p[2][1])];}
				catch(err) {alex.p_0=["",[[],[],[]] ];}				
		} );
	}

	function sal3() {
		$(".quality3 input").click();
		$("#handle button[title='Salva le modifiche']").click();
	}
	
	function sal4() {
		
			$(".quality4 input").click();
			$("#handle button[title='Salva le modifiche']").click();
		
	}
	
	function lp(pagina) {
		//var testo=$.ajax({
		//			url: mw.config.get("wgServer")+"/w/index.php?action=raw&title=" + pagina+ "&" + Math.random(),
		//			async: false
		//		}).responseText;
		return alex.p_0[1];
	
	}
	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;
		}
		
	function lpprec(pagina) {
	//var pn = pagina.split("/");
	//	alex.testoPagPrec  = lp(pn[0] + "/" + (pn[1] - 1));
		// testo2PagPrec = lp(pn[0] + "/" + (pn[1] - 2));
	      return alex.p_1[1];
	}
	
	
	function inkapsula(pre, post) {
		t = selection();
		t[0] = t[0] + pre.replace(/&quote;/g, '"');
		t[2] = post.replace(/&quote;/g, '"') + t[2];
		scriviSel(t);
	}
	
	 
	
	/* 
	Ambiente per EditInView
	oggetto pubblico: alex.eiv
	 
	metodi:
	* alex.eiv.pageRead (pagina): legge il codice wiki di una pagina
	* alex.eiv.pageParse (mw.contenuto): esegue il parsing di mw.contenuto.codice in header, body, footer, user, level
	* alex.eiv.pageBuild (mw.contenuto): ricostruisce il nuovo mw.contenuto dai sottocampi
	* alex.eiv.pageSave (mw.contenuto) : salva l'oggetto mw.contenuto nella pagina corrente
	* alex.eiv.pageEdit (mw.contenuto): copia i campi di mw.contenuto in editbox
	
	argomenti:
	* alex.eiv.pagina      :nome della pagina (default pagina aperta in view)
	* alex.eiv.sommario    :sommario (default "Javascript edit")
	* alex.eiv.contenuto.user     :utente registrato in header
	* alex.eiv.contenuto.level    :level (0 - 4) registrato in header
	* alex.eiv.contenuto.header   :parte variabile di header
	* alex.eiv.contenuto.user     :parte variabile di footer
	* alex.eiv.contenuto.body     :corpo della pagina
	* alex.eiv.contenuto.codice   :raw code completo della pagina (come è letto o come va salvato)
	
	
	
	 
	*/

	
	// ambiente globale editinview
	alex.eiv = {};
 
	// contenitore per wikicode
	alex.eiv.contenuto={};
	

	
// la funzione pageRead inserisce il raw code della pagina in mw.eiw.contenuto.codice
	alex.eiv.pageRead = function (pagina) {
		if (pagina === undefined) pagina = mw.config.get('wgPageName');
			/* chiamata ajax sincrona: eliminare! */
			alex.eiv.contenuto.codice= $.ajax({
				url: "/w/index.php?action=raw&title=" + pagina,
				async: false
			}).responseText;
	    alex.eiv.pagina=pagina;
	    alex.eiv.numeroPagina=pagina.substr(pagina.indexOf("/")+1)*1;
	    alex.eiv.thumb=$(".thumbPage").eq(alex.eiv.numeroPagina-1);
	    alex.eiv.sommario="Javascript edit";
	    alex.eiv.pageParse();
	    // chiamo lpprec
	    lpprec(pagina);
	    if ($("#editBox").length===1) {
	    	$("textarea").eq(0).val(alex.eiv.contenuto.header);
			$("textarea").eq(1).val(alex.eiv.contenuto.body);
			$("textarea").eq(2).val(alex.eiv.contenuto.footer);
			$("#radiobuttons input[value='"+alex.eiv.contenuto.level+"']").click();
			
	    }
	};
	
// la funzione pageParse suddivide codice in campi e dati; il campo pagina non viene modificato
	alex.eiv.pageParse = function (oggetto) {
		if (oggetto === undefined) oggetto = alex.eiv.contenuto;
		var headerEnd = alex.eiv.contenuto.codice.indexOf("</noinclude>") + "</noinclude>".length;
		var footerStart = alex.eiv.contenuto.codice.lastIndexOf("<noinclude>");
		alex.eiv.contenuto.body = alex.eiv.contenuto.codice.substring(headerEnd,footerStart);
		alex.eiv.contenuto.header= alex.eiv.contenuto.codice.substring(0, headerEnd);
		alex.eiv.contenuto.footer= alex.eiv.contenuto.codice.substring(footerStart);
		try {
			alex.eiv.contenuto.level =alex.eiv.contenuto.codice.match(/level=\"(\d+)\" /)[1];
		}
		catch(err) {
			alex.eiv.contenuto.level ="1";
		}
		try {
			alex.eiv.contenuto.user =alex.eiv.contenuto.codice.match(/user=\"([^"]+)\" \/>/)[1];
		}
		catch(err) {
			alex.eiv.contenuto.user =mw.config.get("wgUserName");
		}
		alex.eiv.contenuto.header=$.trim(alex.eiv.contenuto.header.replace(/<noinclude\><pagequality.+?>/,"").replace(/<div class\=\"pagetext\"\>/,"").replace("</noinclude>",""));
		alex.eiv.contenuto.footer=$.trim(alex.eiv.contenuto.footer.replace("<noinclude>","").replace("<references/>","").replace("</div>","").replace("</noinclude>",""));
	};
 
// la funzione pageBuild è  reciproca di pageParse e ricostruisce il codice raw della pagina dai campi
	alex.eiv.pageBuild = function (oggetto) {
		var template= '<noinclude><pagequality level="#LEVEL#" user="#USER#" />#HEADER#</noinclude>' + 
		'#BODY#<noinclude>#FOOTER#\n</noinclude>';
		alex.eiv.contenuto.codice= template.replace("#LEVEL#",alex.eiv.contenuto.level)
			.replace("#USER#",alex.eiv.contenuto.user)
			.replace("#HEADER#",alex.eiv.contenuto.header)
			.replace("#BODY#",alex.eiv.contenuto.body)
			.replace("#FOOTER#",alex.eiv.contenuto.footer);
	};
    /*
    Se data è stringa, viene usato come commento (summary) per la pagina corrente
    Se data è oggetto, allora:
    	data.pagenum viene usato come numero di pagina (default indice corrente)
    	data.base viene usato come base nome pagina 
 
    In ogni caso viene ottenuto  prima del salvataggio var pagename=base+"/"+pagenum; che è il nome della pagina
    su cui salvare
 
    Se alla fine del parsing dei parametri wgPageName === pagename allora la pagina corrente viene ricaricata
    Al momento vengono utilizzati i dati contenuti nell'oggetto wm.eiv.contenuto; l'aggiunta di ulteriori campi
    all'oggetto data permetterà di forzare contenuti diversi per ciascuno dei campi dell'oggetto .contenuto
	*/
	
	alex.eiv.save = function (title,text,summary) {
		var api = new mw.Api();
		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");
				 
			} else {
				alert("Errore nel salvataggio della pagina");
			}
		});
	};
	
	alex.eiv.pageSave = function () {
		alex.eiv.pageBuild();
		var api = new mw.Api();
		api.postWithToken( 'edit', {
			action: 'edit',
			title: alex.eiv.pagina,
			summary: alex.eiv.sommario,
			text: alex.eiv.contenuto.codice,
		}).done(function( data ) {
	        if ( data && data.edit && data.edit.result == 'Success' ) {
				console.log("OK, pagina " + alex.eiv.pagina + "salvata");
				window.location.reload(); 
			} else {
				alert("Errore nel salvataggio della pagina");
			}
		});
	};
	
	alex.creaBox=function () {
	    if (mw.config.get("wgAction")!=="view") {
	    	
	    	return;
	    }
		
		if ($("#sfondoEiv").length>0) {
	    		$("#sfondoEiv").toggle();
	    	return;
	    }
	    

	    $('<div id="sfondoEiv" style="width: 100%; height: 100%; position: fixed; z-index: 100; top: 0px; left: 0px; background-color: rgb(250, 250, 250);"></div>').appendTo($("#content"));
		$(".prp-page-image").clone().appendTo($("#sfondoEiv"));
		$("#sfondoEiv .prp-page-image").css("width","40%");
		$("#sfondoEiv .prp-page-image img").draggable();
	
		var box=$('<div style="display:block; border:1px solid black; position:fixed; top:10px; left:10px; /* z-index:999; */ background-color:#efefef;padding:6px;" id="editBox"></div>');
		box.append($("<div id='handle' style='width:100%; background-color:#dfdfdf; min-height:10px;' ><div id='areaBottoni' style='float:left;max-width:400px'></div> </div>"))
		box.append($("<textarea name='wpHeaderTextbox' id='wpHeaderTextbox' style='width:100%; height:30px;  border:1px solid gray;' />"));
		box.append($("<textarea name='wpTextbox1' id='wpTextbox1' rows='35' style='width:550px; border:1px solid gray;' />"));
		box.append($("<textarea name='wpFooterTextbox' id='wpFooterTextbox' style='width:100%; height:30px;  border:1px solid gray;' />"));
	    $("#sfondoEiv").append(box);
		// attivazione alex.activeEleme
	    $("#editBox textarea").focusin(function () {alex.activeElement=this;})
		$("#editBox").draggable({ handle: "areaBottoni" });
	
		var qb='<span id="radiobuttons" style="float:right">'+
			'<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>';
			
			
		if((alex.eiv.contenuto.level==="3" && alex.eiv.contenuto.user!==mw.config.get("wgUserName")) || alex.eiv.contenuto.level==="4" ) {
				qb+='<span id="radioQuality4" class="quality4"><input tabindex="9" title="Pagine_SAL_100%" type="radio" value="4" name="wpQuality"></span></span>';
		}
		
		
		
		qb+='<br><span style="float:right">'+
			'<button class="baseButton" id="wpSave" style="display: inline; padding: 1px 2px;" type="button" title="Salva le modifiche" onclick="alex.eiv.salvaPagina()"><small>Salva</small></button>'+
			'<button class="baseButton" id="wpPreview" style="display: inline; padding: 1px 2px;" type="button" title="Visualizza anteprima" onclick="alex.eiv.pagePreview()"><small>Anteprima</small></button>'+
			'<button class="baseButton" style="display: inline; padding: 1px 2px;" type="button" title="Annulla e chiudi" onclick="alex.eiv.chiudiEditBox()"><small>Annulla</small></button>'+
			'</span>';
		$("#handle").append($(qb));
		$("textarea").eq(0).val(alex.eiv.contenuto.header);
		$("textarea").eq(1).val(alex.eiv.contenuto.body);
		$("textarea").eq(2).val(alex.eiv.contenuto.footer);
		$("#radiobuttons input[value='"+alex.eiv.contenuto.level+"']").click();
		var livello={
			"0":"/* Pagine SAL 00% */",
			"1":"/* Pagine SAL 25% */",
			"2":"/* Pagine SAL 50% */",
			"3":"/* Pagine SAL 75% */",
			"4":"/* Pagine SAL 100% */"
		};	
		$("#radiobuttons input").click(function() {
			alex.eiv.contenuto.level=$(this).val();
			alex.eiv.contenuto.user=mw.config.get("wgUserName");
			alex.eiv.sommario=livello[alex.eiv.contenuto.level]+" da newThumbs";
		});
	
	}

	alex.eiv.chiudiEditBox=function () {
		$("#sfondoEiv").toggle();
	}
	 
	alex.eiv.salvaPagina=function () {
		alex.eiv.contenuto.header=$("textarea").eq(0).val();
		alex.eiv.contenuto.body=$("textarea").eq(1).val();
		alex.eiv.contenuto.footer=$("textarea").eq(2).val();
		alex.eiv.pageSave();
		// alex.eiv.chiudiEditBox();
		//var pagina=alex.eiv.pagina.split("/");
		//pagina=pagina[0]+"/"+(pagina[1]*1+1);
		
		//alex.eiv.pageRead(pagina);
		
	}
	alex.eiv.pagePreview = function () {
		alex.eiv.contenuto.header=$("textarea").eq(0).val();
		alex.eiv.contenuto.body=$("textarea").eq(1).val();
		alex.eiv.contenuto.footer=$("textarea").eq(2).val();
		// closeButton generico (chiude parent())
		var closeButton=$('<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().remove();
		})
		//creazione box divPreview
		var divPreview=$("<div>").css({
			"position":"absolute",
			"top":"100px",
			"left":"100px",
			"width":"580px",
			"height":"700px",
			"overflow":"scroll",
			"padding":"20px",
			"z-index":"150",
			"background-color":"white",
			"border":"1px dotted black"
			}).attr("id","divPreview")
			.append(closeButton);
		$("#content").append(divPreview);
		$("#divPreview").draggable();
			
		//caricamento preview
		alex.eiv.pageBuild();
		$.ajax({
         	url: mw.util.wikiScript( 'api' ),
        	data: {
            	format: 'json',
            	action: 'parse',
				contentmodel: 'proofread-page',
				summary: alex.eiv.sommario,
            	text: alex.eiv.contenuto.codice,
            	},
        	dataType: 'json',
        	type: 'POST',
        	success: function( data ) { 
        		if ( data && data.parse ) {
					alex.eiv.previewHtml=data.parse.text["*"];
					$("#divPreview").append($(alex.eiv.previewHtml));

            	} 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.' );
			}
    	});
	} // FINE FUNZIONE PREVIEW

	if (mw.config.get("wgCanonicalNamespace")==="Page" && mw.config.get("wgAction")==="view") {
		alex.eiv.pageRead();
		
	}
	if (mw.config.get("wgCanonicalNamespace")==="Page") pp();

/* }) ($,mw,alex);


// funzioni BAT
(function($,mw) { */
	
	// creo funzioni di base
	/* conta il numero di occorrenze di stringa dentro testo*/
	//var alex={};
	
	function count(testo, stringa) {
		n = 0;
		while (testo.indexOf(stringa) > -1) {
			n = n + 1;
			testo = testo.replace(stringa, "");
		}
		return n;
	}

	function find_stringa(testo, idi, idf, dc, x) {
		idip = testo.indexOf(idi);
		idfp = testo.indexOf(idf, idip + idi.length) + idf.length;
		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 = "";
		}
		if (vvalore.length < (idi + idf).length) {
			vvalore = "";
		}
		
		return vvalore;
	}

	function produciLista(testo, s1, s2, delim, x) {
		lista = [];
		while (find_stringa(testo, s1, s2, true, x) > "") {
			elemento = find_stringa(testo, s1, s2, true, x);
			testo = testo.replace(elemento, "");
			if (delim) {
				lista.push(elemento);
			} else {
				lista.push(elemento.slice(s1.length, - s2.length));
			}
		}
		return lista;
	}

		 
	function ss(){
		var textarea=alex.activeElement; // elemento dom wpTextbox1
		var txt=$(textarea).val();
		var s=[];
		s[0]=txt.substring(0,textarea.selectionStart);
		s[1]=txt.substring(textarea.selectionStart,textarea.selectionEnd);
		s[2]=txt.substring(textarea.selectionEnd);
		return s;
	} 
	alex.ss=ss; //esporto la funzione
		// riscrive wpTextbox1 e ristabilisce il focus/la selezione attiva
		// riceve un array tipo [testo precedente, testo selezionato, testo seguente]
	function sw(t) {
		var textarea=alex.activeElement; // elemento dom wpTextbox1=$("#wpTextbox1")[0]; // elemento dom wpTextbox1
		textarea.value=t.join("");
		textarea.selectionStart=t[0].length;
		textarea.selectionEnd= t[0].length + t[1].length;
		textarea.focus();
	}
	alex.sw=sw; //esporto la funzione
	
	// sel: oggetto selection
// regex: oggetto memoRegex {regexString:[commento,subst,modificatori],.....}

	function sost(sel,listaregex) {
		console.log(sel,listaregex);
		// if there isn't any selection
		if (sel[1]=="") {
			sel[1]=sel[0]+sel[2]; 
			sel[0]="";
			sel[2]="";
		}
		$.each(listaregex,function(index,value) {
				sel[1]=sel[1].replace(RegExp(index,value[2]),value[1]);
				});
		return sel;
	}
	alex.sost=sost; // esporto la funzione
	/***************************************************/
	// test autoPt
	alex.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 = "";
		t = ss();
	// 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 {
			alex.p_1[1][1] = alex.p_1[1][1].replace(/\{\{pt\|/g, "{{Pt|");
			l = produciLista(alex.p_1[1][1], "{{Pt|", "}}", 1, "{{");
			prePt = "";
			if (l.length > 0) {
				prePt = l[l.length - 1];
				prePt = /{{Pt\|(.+[^\|}])/.exec(prePt)[1]
			}
			t[1] = "{{Pt|" + t[1] + "|" + prePt.substring(0, prePt.length - 1) + t[1] + "}}";
		}
		sw(t);
	} else {// invece se non c'è alcuna selezione di testo...
		//t = $.trim(leggiBox());
		//textarea=alex.activeElement; // elemento dom wpTextbox1
		t=$.trim($(alex.activeElement).val());
		
		// 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(alex.p_1[1][1]) !== null && rPtIniz.exec(t) === null) {
			hyp = rPtFin.exec(alex.p_1[1][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 + "-|}}";
		}
	//scriviBox(t);
	$(alex.activeElement).val(t);}
}
	/***************************************************/
	/* funzione di creazione della bottoniera 
	Dopo l'esecuzione, esiste #newtattoo        */
	
	
	function creaBottoniera() {
		$('#' + (mw.user.options.get('skin') === 'modern' ? 'mw_' : '') + 'content')
		.append($('<div>').attr("id","newtattoo").attr("align","right").attr("style","position:fixed;bottom:0; right:0; background-color:white; border: 1px solid; border-color:#F0F0F0; z-index:1500;"));
	}

	// Syncronous requests are deprecated but very comfortable; I LOVE them :-)
	function leggiPersonalButtons(){
		var i=0;
		/* chiamata ajax sincrona: eliminare! */
		var testo=$.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title=User:"+mw.config.get("wgUserName")+"/PersonalButtons",async:false});
		
		if (testo.responseText==="") {
			testo="<pre>eiv,es,EditInView *Ctrl+Alt+e*,creaBox\n"+
"diacritici, es, Mostra/nascondi diacritici *Alt+0*,diacriticiToggle\n"+
"postOCR, es, esegue postOCR *Alt+7*,postOCR\n"+
"parag,es,Separa i possibili paragrafi con una riga vuota *Alt+8*,aggiustaParagrafi\n"+
"linee,es,Riunisce le linee di testo di u paragrafo *Alt+6*,unisciLinee\n"+
"i, es, Applica markup corsivo *Ctrl+Alt+i*, incapsula,'',''\n"+
"Sc, es,Applica il template SmallCaps (maiuscoletto), incapsula,{{Sc|,}}\n"+
"c, es,Applica il template Center (centrato) *Ctrl+Alt+c*, incapsula,{{center|,}}\n"+
"ci, es,Applica il template Center (centrato) + italico, incapsula,{{center|'',''}}\n"+
"outd, es,Applica il template Outdent (indent inverso) *Ctrl+Alt+o*, incapsula,{{outdent|,}}\n"+
"larger, es,Applica il template larger, incapsula,{{larger|,}}\n"+
"----, es,Applica il template Rule (traccia una riga orixzzontale centrata), incapsula,{{Rule|4em}},\n"+
"Mm, es,Applica maiuscolo/minuscolo alla selezione alternandole *Ctrl+Alt+m*, up_low\n"+
"Rv,es,Elimina righe vuote,eliminaRigheVuote\n"+
"→, es,Indenta le righe della selezione (utile per i versi nelle poesie) *Alt+Right*, indentSelection\n"+
"←, es,Riduce l'indentazione delle righe *Alt+Left*, deIndentSelection\n"+
"note +,es,Facilita l'inserimento delle annotazioni *Ctrl+Alt+n*, note\n"+
"note ↑↓,es,Sposta le annotazioni *Ctrl+Alt+t*, toggleNote\n"+
"sect, es,Inserisce i tag section: posizionare il cursore alla fine della prima sezione *Ctrl+Alt+s*, newSections\n"+
"tabM, es,Trasforma in tabella wiki  il codice copiaincollato da Excel (separatori di cella: tabulazioni; separatori di righe; a capo), tableMaker\n"+
"app,es,Taglia e incolla colonne da OCR,append\n"+
"appr,es,Riunisce elementi consecutivi in una riga *Ctrl+Alt+r*,append2\n"+
"poem,es,Applica poem alla selezione *Ctrl+Alt+p*,incapsula,<poem>,</poem>\n"+
"F&R,es,Regex box,mostraTrovaSostituisci\n"+
"r!!,es,Lancia tutte le regex memorizzate *Alt+9*,memoRegexRun\n"+
"r↓,es,Salva le regex in Index talk,salvaRegexRemoto\n"+
"r↑,es,C↑arica le regex in Index talk,caricaRegexRemoto\n"+
//"r=,es,Carica le regex memorizzate in Index Talk per l'opera corrente,caricaRegexRemoto\n"+
"TAB,es,inserisce un carattere TAB,incapsula,	,\n</pre>";
		} else {testo=testo.responseText;}
		
		testo=$.trim(find_stringa(testo,"<pre>","</pre>",0)).split("\n");
		for (i=0;i<testo.length;i+=1) {
			testo[i]=testo[i].split(",");
			}
		return testo;
	}
	/* Funzioni per la bottoniera */
	
	
	//Sostituisce tutti gli apostrofi dattilografici in tipografici, ma rispetta gli apostrofi di marckup wiki e gli apostrofi
	//contenuti in: math, {{{}}}, {{}}, [[]], [], http:..... 
	alex.apostrofi=function () {
		var testo=$("#wpTextbox1").val();
		var testoCod = codifica(testo);
		testoCod[0] = testoCod[0].replace(/'/g, '’').replace(/’’’’’/g, "'''''").replace(/’’’’/g, "''''").replace(/’’’/g, "'''").replace(/’’/g, "''");
		$("#wpTextbox1").val(decodifica(testoCod[0],testoCod[1]));
	}
	
	function codifica(testo) {
		var l = [];
		var res = fss(testo, l, "<math", "</math>", "");
		res = fss(res[0], res[1], "<!--", "-->", "<");
		res = fss(res[0], res[1], "{", "}", "{");
		res = fss(res[0], res[1], "[", "]", "[");
		res = fss(res[0], res[1], "<", ">", "<");
		res = fss(res[0], res[1], "http://", " ", "");
		res = fss(res[0], res[1], "https://", " ", "");
		return res;
	}
	
	function fss(testo, l, tagi, tagf, x) {
		while (find_stringa(testo, tagi, tagf, 1) > "") {
			var el = find_stringa(testo, tagi, tagf, 1, tagi);
			testo = testo.replace(el, "###el" + l.length + "###");
			l.push(el);
		}
		return [testo, l];
	}
	
	// La funzione decodifica() riceve un testo codificato e la lista degli elementi protetti e restituisce un testo 
	// con gli elementi protetti risistemati al loro posto; è complementare a codifica()
	function decodifica(testo, l) {
		for (i = l.length - 1; i > -1; i = i - 1) {
			testo = testo.replace("###el" + i + "###", l[i]);
		}
		return testo;
	}
	alex.autoRi=function() {
		if (mw.config.get("wgServer")=="//it.wikisource.org") {
			var header=find_stringa(alex.p_2[1][0],'/>',"</noinclude>",0);
			scriviBox(alex.newAutoRi(header),"0");
			var footer=find_stringa(alex.p_2[1][2],'<noinclude>',"</noinclude>",0);
			scriviBox(alex.newAutoRi(footer),"2");
			/*if (!(/\{\{RigaIntestazione\||\{\{Ri\|/i).test(leggiBox("0"))) {
				alex.p_2[1][0]=alex.p_2[1][0].replace(/{{ri\|/i,"{{RigaIntestazione|").replace(/{{rigaintestazione\|/i,"{{RigaIntestazione|");
				// var ri_in_header=true;
				var ri_in_footer=false;
				var header=find_stringa(alex.p_2[1][0],'/>',"</noinclude>",0);
				var footer=find_stringa(alex.p_2[1][2],'<noinclude>',"</noinclude>",0);
				var ri = find_stringa(alex.p_2[1][0], "{"+"{RigaIntestazione", "}}", 1, "{{");
				
				if (ri==="")  {
					ri=find_stringa(alex.p_2[1][2], "{"+"{RigaIntestazione", "}}", 1, "{{");
					if  (ri!=="") ri_in_footer=true;
				}
				var r = /\d+/g;
				
				var r1= /(\|\d+\|)/g;
				var r2= /(\|\d+}})/g;
				var r3=/— \d+ —/g;
				var np="";
				var riNew="";
				if (ri.match(r)!==null && ri.match(r).length === 1) {
					np=r.exec(ri)[0];
					riNew=ri.replace(np,np*1+2);
					if (ri_in_footer) scriviBox(footer.replace(ri,riNew),2); else	scriviBox(header.replace(ri,riNew),0);
				} else if (ri.match(r1)!==null && ri.match(r1).length === 1) {
						np=r1.exec(ri)[0].replace(/\|/g,"");
						riNew=ri.replace("|"+np+"|","|"+(np*1+2)+"|");
						if (ri_in_footer) scriviBox(footer.replace(ri,riNew),2); else	scriviBox(header.replace(ri,riNew),0);
				} else if (ri.match(r2)!==null && ri.match(r2).length === 1) {
						np=r2.exec(ri)[0].replace(/[|}]/g,"");
						riNew=ri.replace("|"+np+"}}","|"+(np*1+2)+"}}");
						if (ri_in_footer) scriviBox(footer.replace(ri,riNew),2); else	scriviBox(header.replace(ri,riNew),0);
				} else if (ri.match(r3)!==null && ri.match(r3).length === 1) {
						np=r3.exec(ri)[0].replace(/[ —]/g,"");
						riNew=ri.replace("— "+np+" —","— "+(np*1+2)+" —");
						if (ri_in_footer) scriviBox(footer.replace(ri,riNew),2); else	scriviBox(header.replace(ri,riNew),0);
				} else {
					console.log("RigaIntestazione ambiguo");
					if (leggiBox(0)==="") {
						scriviBox(header,0);
					}
				}
			}	*/
		}
	}	
	if (mw.toolbar!==undefined) {
		alex.incapsula = function (pre, post) {
			mw.toolbar.insertTags(pre,post);
		};
	}
	else {
		alex.incapsula = function (pre, post) {
			var testo=ss();
			while (testo[1].slice(-1)==" ") {
    		testo[1]=testo[1].slice(0,-1);
    		testo[2]=" "+testo[2];
    		}
			testo[0]+=pre;
			testo[2]=post+testo[2];
			sw(testo);
		};	
		
	}
		
		
		alex.diacriticiToggle=function(){
			if (! $(".diacritici").hasClass("ui-draggable")) {
				$(".diacritici").draggable();
			}
			
			$(".diacritici").toggle();
		};
	// Funzioni per gesione maiuscole/minuscole
	
	function capitalize(testo) {
		testo = testo.split(" ");
		for (var i = 0; i < testo.length; i += 1) {
			testo[i] = testo[i].substring(0, 1).toLocaleUpperCase() + testo[i].substring(1).toLocaleLowerCase();
		}
		return testo.join(" ");
	}
	
	function changeCase(testo) {
		if (testo == testo.toLocaleUpperCase()) testo = testo.toLocaleLowerCase();
		else testo = testo.toLocaleUpperCase();
		return testo;
	}
	
	alex.capit=function() {
		var t = selection();
		t[1] = capitalize(t[1]);
		//scriviBox(t.join(""));
		scriviSel(t);
	};
	
	alex.up_low=function() {
		var t = ss();
		t[1] = changeCase(t[1]);
		sw(t);
		//scriviBox(t.join(""), "", t[0].length, t[0].length + t[1].length);
	};
	
	// Elimina righe vuote.
	alex.eliminaRigheVuote = function() {
			$("#wpTextbox1").val($("#wpTextbox1").val().replace(/\s+$/gm,"").replace(/\n\n/g,"\n"));
		};
	
	alex.aggiustaParagrafi = function() {
		var i=0;
		var testo=$('#wpTextbox1').val();
		var poems = produciLista(testo, "<poem", "</poem>", 1);
			for (i = 0; i < poems.length; i += 1) {
				testo = testo.replace(poems[i], "[#" + i + "#]");
				}
			testo = testo.replace(/ \n/g, "\n").replace(/([\.\?\!»:]\n)([^\n])/g, '$1\n$2');
			for (i = 0; i < poems.length; i += 1) {
					testo = testo.replace("[#" + i + "#]", poems[i]);
				}
				$('#wpTextbox1').val(testo);
			};
	
	alex.unisciLinee = function() {
			// eliminazione acapo che esclude sia i testi <poem> che le righe che iniziano con  ";:#*" (liste html)
			var editbox = document.getElementsByName('wpTextbox1')[0];
            var poemNumber=0;
            var listaGlobale=[]
			// fase 1: codifica
			if (editbox.value.indexOf("<poem") != -1) {
				lista = produciLista(editbox.value, "<poem", "</poem>", 1);
                listaGlobale=[].concat(lista)
                poemNumber=lista.length;
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + i + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
				}
			}
			editbox.value=editbox.value.replace("{{Poem", "{{poem").replace("{{Mlb", "{{mlb");
            if (editbox.value.indexOf("{{poem") != -1) {
				lista = produciLista(editbox.value, "{" + "{poem", "}}", 1,"{{");
                listaGlobale=listaGlobale.concat(lista);
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + (i+poemNumber) + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
                    
				}
			}
			if (editbox.value.indexOf("{{mlb") != -1) {
				lista = produciLista(editbox.value, "{" + "{mlb", "}}", 1,"{{");
                listaGlobale=listaGlobale.concat(lista);
				for (i = 0; i <= lista.length - 1; i = i + 1) {
					marcatore = "###" + (i+poemNumber) + "###";
					editbox.value = editbox.value.replace(lista[i], marcatore);
                    
				}
			}
            
			// fase2: eliminazione acapo singoli, con conservazione dei multipli
			//if (mw.config.get("wgTitle").indexOf("Trattato di archeologia (Gentile).djvu")==-1) {
			editbox.value = editbox.value.replace(/([^>}\n])\n([^<\n\:\;\*\#\|\{])/g, '$1 $2'); //linux
			editbox.value = editbox.value.replace(/([^>}\r\n])\r\n([^<\r\n\:\;\*\#\|\{])/g, '$1 $2'); //windows
			//    }
			// eliminazione sequenze di spazi, sostituiti da spazio singolo
			editbox.value = editbox.value.replace(/  +/g, ' ');
            // sostituzione spazio dopo marcatore
            editbox.value=editbox.value.replace(/### /g,"###\n");
			// fase 3: decodifica
			if (editbox.value.indexOf("###0###") != -1) {
				for (i = 0; i <= listaGlobale.length - 1; i = i + 1) {
					marcatore = "###" + i + "###";
					editbox.value = editbox.value.replace(marcatore, listaGlobale[i]);
				}
			}
			// fase 4: sistemazione a capo attorno a poem
			//editbox.value=editbox.value.replace(/ <poem>/g,"\n<poem>").replace(/<\/poem> /g,"</poem>\n");
            editbox.value=editbox.value.replace(/### /g,"###\n");
			updatePreview();
		};
	// Funzioni per indentaVersi
	
	alex.indentSelection=function () {
		var t = ss();
		if (t[0].indexOf("\n") == -1) {
			t[1] = t[0] + t[1];
			t[0] = "";
		} else {
			pn = t[0].lastIndexOf("\n");
			t[1] = t[0].substring(pn + 1) + t[1];
			t[0] = t[0].substring(0, pn + 1);
		}
		var t1 = t[1].split("\n");
		for (var i = 0; i < t1.length; i += 1) {
			t1[i] = "     " + t1[i];
		}
		t[1] = t1.join("\n");
		//scriviBox(t.join(""), "", t[0].length, t[0].length + t[1].length);
		sw(t);
	};
	
	
	alex.deIndentSelection=function() {
		var t = ss();
		if (t[0].indexOf("\n") == -1) {
			t[1] = t[0] + t[1];
			t[0] = "";
		} else {
			pn = t[0].lastIndexOf("\n");
			t[1] = t[0].substring(pn + 1) + t[1];
			t[0] = t[0].substring(0, pn + 1);
		}
		var t1 = t[1].split("\n");
		for (var i = 0; i < t1.length; i += 1) {
			for (j = 0; j < 5; j += 1) {
				if (t1[i].substring(0, 1) == " ") t1[i] = t1[i].substring(1);
				else break;
			}
		}
		t[1] = t1.join("\n");
		//scriviBox(t.join(""), "", t[0].length, t[0].length + t[1].length);
		sw(t);
	};
	function autoRi() {
	var r=/({{rh\|)(\d+)(.+}})|({{rh\|.+\|)(\d+)(}})|({{rh\|[^\d]+)(\d+)(.+}})/i;
	var prev_ri=r.exec(alex.p_2[1][0]);
	
	var new_ri="";
	var header=$("#wpHeaderTextbox").val();
	
	
	if (header==="" || localStorage.saveHeader==false) {
			if (prev_ri!==undefined) {
			prev_ri = prev_ri.filter(function(n){ return n != undefined }); // "packing" della lista
			new_ri=prev_ri[1]+(prev_ri[2]*1+2)+prev_ri[3];
			$("#wpHeaderTextbox").val(new_ri);
		}
	}
	}
	// ct+
	alex.ctPlus=function () {
		var t=alex.ss();
		t[1]=t[1].split("\n");
		for (i=0;i<t[1].length;i+=1) {
			t[1][i]="{{Ct|f=100%|v=1|L=0px|"+t[1][i]+"}}";
		}
		t[1]=t[1].join("\n");
		alex.sw(t);
	return false;
}
	
	// esegue postOCR
	// Gestisce l'inserimento di note
	alex.postOCR=function() {
		var footer=$("#wpFooterTextbox").val();
		var cat="";
		// testoXml();
		alex.apostrofi();
		dehyphen();
		autoRi();
		// sezione specifica per progetto
		if (mw.config.get("wgServer")==="//wikisource.org")  {
			if (mw.config.get("wgCanonicalNamespace")==="Page" )  {
				// aggiunta automatica di Category:Napulitano
				cat=find_stringa(alex.p_1[1][2],"[[Category:","]]",1);
				if (footer.indexOf(cat)===-1) $("#wpFooterTextbox").val(footer+cat);
			}	
		}
		alex.moveRi();
		// newRi();
	}
	
	// deifenatore o_O
	function dehyphen() {
		var testo=$("#wpTextbox1").val();
		testo=testo.replace(/[-¬] *\n([^ \n]*)[ ]*[\n]?/g,"$1\n");
		$("#wpTextbox1").val(testo);
	}
	
	alex.note=function() {
		var t = ss();
		if (t[1].length === 0) {
			t[1] = "<sup>nota</sup>";
		} else {
			t[1] = "<ref>" + t[1] + "</ref>";
		}
		//scriviBox(t.join(""));
		sw(t);
	};
	
	alex.toggleNote =function () {
		// alert("Versione prova su vector.js");
		var editbox = document.getElementsByName('wpTextbox1')[0];
		if (editbox.value.indexOf("<sup>nota</sup>") == -1) { // note in posizione regolare       
			lista = produciLista(editbox.value, "<ref", "</ref>", 1);
			lista = $.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 { //presenza di marcatori
			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) { // verifica parità   
				alert("ATTENZIONE: discordanza fra numero dei <br />segnaposti (" + marks + ") e numero delle note (" + refs + "). Controllare!");
				return;
			}
			lista = produciLista(editbox.value, "<ref", "</ref>", 1);
			lista = $.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], "").replace("<sup>nota</sup>", lista[i]);
			}
		}
	};
	
	alex.newSections=function () {
	    var s=ss();
	    if (s[2].indexOf("<section end=s2 />")==-1) {
	        s[0]="<section begin=s1 />"+s[0]+"<section end=s1 />";
	        s[2]="<section begin=s2 />"+s[2]+"<section end=s2 />"; 
	    }
	    else {
	        s[0]=s[0]+"<section end=s2 />";
	        s[2]="<section begin=s3 />"+s[2].replace("<section end=s2 />","<section end=s3 />");    
	    }
	    s[0].value=s[0]+s[1]+s[2];
	    //scriviBox(s.join(""));
	    sw(s);
	};
	
	alex.tableMaker=function () {
		var t = ss();
		var tabella = ss()[1];
		tabella=tabella.replace(/\|\|/g,"\t");
		tabella=tabella.split("\n");
		for (i = 0; i < tabella.length; i += 1) {
			tabella[i] = "|-\n|" + tabella[i].replace(/\t/g, "||");
		}
		t[1] = "{|\n" + tabella.join("\n") + "\n|}\n";
		sw(t);
	};
	
	// funzione per creare righe da elementi in colonna
	
	
	alex.append2=function() {
		var testo=ss();
		testo[1]=testo[1].replace(/\n/g,"||");
		sw(testo);
		return;
	}
	
	// funzione per aggiungere colonne a colonne 
	alex.append=function () { 
	   if (ss()[1].length>0) {
	    	alex.a=ss(); // si memorizza in a gli elementi da aggiungere
			sw([alex.a[0],"",alex.a[2]]);
	      	return;
	   }
	   else {
	   		alex.b=ss();
	   		alex.a[1]=alex.a[1].split("\n");
	   		alex.b[2]=alex.b[2].split("\n");
	   		$.each(alex.a[1],function(index,value) {
	       		alex.b[2][index]=alex.b[2][index]+"||"+value;
	   		});
	   		alex.b[2]=alex.b[2].join("\n");
	   		sw(alex.b);
		}
	};
	/***************   funzioni specifiche per diacritici **************/
	// range combining: 768-879 (0x0300-0x036f)
	// Crea un contenitore contenitore draggabile
	function apply(span) {
		var curDiac=$(span).text().normalize("NFD");
		if (curDiac.length==3) curDiac=curDiac.substring(1,2); else curDiac="";
			var t=ss();
			// ricerca all'indietro del primo carattere non combining
			if ($(".diacritici span").eq(0).text()==="REP ") {
				var n=1;
				while (t[0].codePointAt(t[0].length-n) >= 768 && t[0].codePointAt(t[0].length-n) <879) {n+=1;}
				var car=t[0].substring(t[0].length-n,t[0].length).normalize("NFD");
				if (car.length>1) car=car.substring(0,1);
				car=(car+curDiac).normalize("NFC");
				t[0]=t[0].substring(0,t[0].length-n)+car;
				sw(t);
			} else {
				t[0]+=curDiac;
				sw(t);
			}
		
	}

	// CODICE IN ESECUZIONE 	
	
	var diac=$("<div>")
		.attr("class","diacritici")
		.css({"font-family":"Arial Unicode MS",
			"display":"none",
			"font-size":"140%",
			"line-height":"1",
			"width":"10em",
			"position":"fixed",
			"border":"3px solid black",
			"min-width":"50px",
			"min-height":"20px",
			"top":"50px",
			"left":"50px",
			"background-color":"rgb(230, 255, 230)",
			"z-index":"1000"})
		.appendTo($("#content")); 
	// diac.draggable().resizable(); 
	var spanSelector=$("<span>").text("REP ").css("font-size","1pc").click(function() {
		if ($(this).text()==="ADD ") {
			$(this).text("REP ").css("color","red");
		} else {
		$(this).text("ADD ").css("color","green");
		}
	});
	var closeButton=$("<span>").text("CLOSE ").css("font-size","1pc").click(function() { 
		
		$(".diacritici").toggle();
	});
	// costruzione caratteri con diacritico
	// elenco diacritici separati da |
	var diacritici=("\u25cc|\u25cc\u0300|\u25cc\u0301|\u25cc\u0302|\u25cc\u0303|\u25cc\u0304|\u25cc\u0305|\u25cc\u0306|\u25cc\u0307|\u25cc\u0308|\u25cc\u0309|\u25cc\u030a|\u25cc\u030b|\u25cc\u030c|\u25cc\u030d|\u25cc\u0311|\u25cc\u0312|\u25cc\u0313|\u25cc\u0314|\u25cc\u0320|\u25cc\u0323|\u25cc\u0324|\u25cc\u0326|\u25cc\u0327|\u25cc\u0330|\u25cc\u0331|\u25cc\u0335|\u25cc\u0345").normalize("NFC").split("|");
	// ogni diacritico viene inserito in uno span e al click viene collegata una funzione di scambio diacritico
	for (i=0;i<diacritici.length;i+=1) {
		diac.append($("<span>").text(diacritici[i]+" ")  // chiusura funzione click
		); // chiusura append
	}  // chiusura for
	//$("#newtattoo").css("position","").appendTo($(".diacritici"));
	$(".diacritici span").click(function() { apply(this);});
	spanSelector.insertBefore( $(".diacritici span").eq(0));
	closeButton.insertAfter( $(".diacritici span").eq(0));
	$("<br>").insertAfter($(".diacritici span").eq(1));
	
	// Creazione e popolamento di bottoniera
	creaBottoniera();
	
	// primo passo per nuovo newButton
	alex.personalButtons=leggiPersonalButtons();
	var html="";
	var sh=null;
	$.each(alex.personalButtons, function (index,value)  {
		sh=null;
		html = $("<button>")
			.attr("class","baseButton")
			.attr("type","button")
			.attr("id","button"+index)
			.attr("title",value[2])
			.css("display","inline")
			.append($("<small>").text(value[0]));
		
		
		if(value[2].match(/\*([^*]+)\*/)) {
			sh=value[2].match(/\*([^*]+)\*/)[1];
		}
		
		
		// console.log(value.toString()+" "+value.length)
		
		if ($.trim(value[3])!=="incapsula") {
			html.click(function() {
				/* if (alex[$.trim(value[3])]===undefined) {
					window[$.trim(value[3])]();
				} else {
					alex[$.trim(value[3])]();
				}*/
				// chiudo l'accesso all'oggetto window
			alex[$.trim(value[3])]();
			});
		} else {
			html.click(function() {
				alex.incapsula(value[4].replace(/\\n/g, '\n'),value[5].replace(/\\n/g, '\n'));
			});
		}
		if (sh) alex.shortcut.add(sh,(function (){
			$("#button"+index).click();

		}));
	

		$("#newtattoo").append(html);
	});
	
	//TROVA E SOSTITUISCI
	//Edit Alex versione 25.01.13
	$('body').append(
	'<div id="findReplace_box" style="display:none;font-size:90%;width:500px;height:140px;position:fixed; z-index:1500;top:0px;right:0px;background-color:white;border:2px solid #0645AD;padding:10px">' +
	'<div style="float:left">Cerca (testo o espressione regolare):</div>' +
	'<div style="float:right"><input type="text" id="findReplace_find" size="30"/></div>' + '<div style="clear:both;float:left">Sostituisci con: </div>' +
	'<div style="float:right"><input type="text" id="findReplace_replace" size="30"/></div>' 
	+ '<div style="clear:both;float:left">Commento: </div>' +
	'<div style="float:right"><input type="text" id="findReplace_doc" size="50"/></div>' +
	'<div style="clear:both;float:left">' +
	'<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</label></div>' +
	'<div style="float:right;margin-top:60px;"><input id="trovaSostituisci" type="button" value="OK" />' +
	
	'<input id="nascondiTrovaSostituisci" type="button" value="Chiudi" /></div>');
	$("#trovaSostituisci").click(function() {trovaSostituisci();});
	$("#nascondiTrovaSostituisci").click(function() {$('#findReplace_box').toggle();});
	$("#findReplace_replace").focus(function() {
	
	// var find=$("#findReplace_find").val();
	// caricamento valori se già memorizzati
	if (alex.memoRegex[$("#findReplace_find").val()]!=undefined) {
		$("#findReplace_replace").val(alex.memoRegex[$("#findReplace_find").val()][1]);
		$("#findReplace_doc").val(alex.memoRegex[$("#findReplace_find").val()][0]);
		$("#findReplace_maiusc").prop("checked",alex.memoRegex[$("#findReplace_find").val()][2].indexOf("i")!=-1);
		$("#findReplace_multiriga").prop("checked",alex.memoRegex[$("#findReplace_find").val()][2].indexOf("m")!=-1);
		$("#findReplace_regex").prop("checked",alex.memoRegex[$("#findReplace_find").val()][0].indexOf("(regex)")!=-1);
	
	
	} else {
		//$("#findReplace_replace").val($("#findReplace_find").val());
		$("#findReplace_maiusc").prop("checked",false);
		$("#findReplace_multiriga").prop("checked",false);
		$("#findReplace_regex").prop("checked",false);
		$("#findReplace_ricorda").prop("checked",false);
	}
	
	
	
});

	alex.mostraTrovaSostituisci= function () {
		$('#findReplace_box').css("display", "block");
		var t = ss();
		
	// carica selezione in trova solo se breve (pewr evitare di caricarla in caso di sostituzioni selettive)	
		if (t[1].length<15) {
			$("#findReplace_find").attr("value", t[1]);
			$("#findReplace_replace").attr("value", t[1]).click();
		} else {
			$("#findReplace_find").click();
		}
	};
	
	function regexRepl(trova, sostituisci, modificatori) {
		if (modificatori === undefined) modificatori = 'g';
		var regex = new RegExp(trova, modificatori);
		var testo = $('#wpTextbox1').val();
		$('#wpTextbox1').val(testo.replace(regex, sostituisci));
	}
	
	function trovaSostituisci () {
		var trova = $('#findReplace_find').val();
		var sostituisci = $('#findReplace_replace').val().replace(/\\n/g, '\n').replace(/\\t/g, '\t'); //trasforma il backslash-n in un "vero" newline
		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 testo="";
		var testoNew="";
		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
		var regex = new RegExp(trova, regexParams);
		
		
		//var regexl ={"trova":[trova,sostituisci,regexParams]}; 
		/// se non esiste selezione....
		if (ss()[1]=="") {
			testo=$("#wpTextbox1").val();
			$("#wpTextbox1").val(testo.replace(regex,sostituisci));
			testo=$("#wpHeaderTextbox").val();
			$("#wpHeaderTextbox").val(testo.replace(regex,sostituisci));
			testo=$("#wpFooterTextbox").val();
			$("#wpFooterTextbox").val(testo.replace(regex,sostituisci));
		} else {
			testo=ss();
			testo[1]=testo[1].replace(regex,sostituisci)
			sw(testo);
			console.log(testo,regex,alex.activeElement)
		}
		
		
	  //se l'utente ha spuntato "Ricorda", salva in una variabile localStorage
	  if (isRicorda) {
	    // se localStorage.memoRegex esiste lo carico in alex.memoRegex 
	    if (localStorage.memoRegex!==undefined) alex.memoRegex=JSON.parse(localStorage.memoRegex);
	    if (alex.memoRegex===undefined) alex.memoRegex={};
	    // aggiorno localStorage["regex"] 
	    commento=commento.replace("(regex)","");
	    
	    if (isRegex) {
	    	commento+="(regex)";
	    }
	    alex.memoRegex[trova]=[commento,sostituisci,regexParams];
	    localStorage.memoRegex=JSON.stringify(alex.memoRegex);
	    localStorage.memoRegexEdited="true";   
		
	 }
	
	} 
	 
	// funzione basePageName
	
	
	alex.basePageName=function () {
		var basePageName="";
		if (mw.config.get("wgCanonicalNamespace")=="Page") basePageName=mw.config.get("wgPageName").match(/.*:(.+)\//)[1];
		if (mw.config.get("wgCanonicalNamespace")=="Index" || mw.config.get("wgCanonicalNamespace")=="Index talk") basePageName=mw.config.get("wgPageName").match(/.*:(.+)/)[1];
		return basePageName;
	}
	
	
	// lancio sostituzioni; le memoRegex sono riservate al nsPage
	alex.memoRegexRun=function () {
		
		
		/*if (localStorage.memoRegexCurrentPage!==alex.basePageName()) {
			if (localStorage.memoRegexEdited==="true") {
				alex.salvaRegexRemoto();
			}
			alex.caricaRegexRemoto();
		} */
		var testo=ss();
		var partialSubs=true;
		if (testo[1].length==0) {
			testo=$("#wpTextbox1").val();
			partialSubs=false;
		}
		
		if (partialSubs) {
			$.each(alex.memoRegex,function(index,value) {
				testo[1]=testo[1].replace(RegExp(index,value[2]),value[1]);
				});
			sw(testo);
		} else  {
			
			$.each(alex.memoRegex,function(index,value) {
				testo=testo.replace(RegExp(index,value[2]),value[1]);
				});
			$("#wpTextbox1").val(testo);
			if (mw.config.get("wgCanonicalNamespace")==="Page") {
				testo=$("#wpHeaderTextbox").val();
				$.each(alex.memoRegex,function(index,value) {
					testo=testo.replace(RegExp(index,value[2]),value[1]);
				});
				$("#wpHeaderTextbox").val(testo);
				testo=$("#wpFooterTextbox").val();
				$.each(alex.memoRegex,function(index,value) {
					testo=testo.replace(RegExp(index,value[2]),value[1]);
				});
				$("#wpFooterTextbox").val(testo);
			}
		} 
		alex.moveRi();
	};
	
	// caricamento manuale da pagina
	alex.caricaRegex=function () {
		var memo=JSON.parse(localStorage.memoRegex);
		var toAdd=JSON.parse(selection()[1]); 
		for (var m in toAdd) {
			memo[m]=toAdd[m];
		}
		
		localStorage.memoRegex=JSON.stringify(memo);
		alex.memoRegex=JSON.parse(localStorage.memoRegex);
	//	alert("Le sostituzioni selezionate sono state caricate");
	};
		

	// Caricamento da pagina di default: Index talk
	/* alex.caricaRegexRemoto=function () {
		if (mw.config.get("wgCanonicalNamespace")=="Page") {
			var paginaFonte=mw.config.get("wgPageName");
			paginaFonte="Index talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; 
			// console.log(paginaFonte);
			
			paginaFonte=$.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title="+paginaFonte,async:false}).responseText;
			// console.log(paginaFonte);
			var codiceMemoregex=find_stringa(paginaFonte,'{"','"]}',1); 
			// console.log(codiceMemoregex);
			var memo={};
			
			try {
				memo=JSON.parse(codiceMemoregex);
				localStorage.memoRegex=JSON.stringify(memo);
				alex.memoRegex=JSON.parse(localStorage.memoRegex);
				alert("Stored regex for this work have been uploaded");
				localStorage.memoRegexCurrentPage=alex.basePageName();
				localStorage.memoRegexEdited="false";
			}
			catch(err) {
				// svuoto memoRegex
				alert("No regex into Index talk page");
				localStorage.memoRegex=JSON.stringify({"alL ":["scanno frequente alL -> all’","all’","g"]});
				localStorage.memoRegexEdited="true";
				localStorage.memoRegexCurrentPage=alex.basePageName();
				
				
				alex.memoRegex=JSON.parse(localStorage.memoRegex);
			}
			
			
	
		} else {
			alert("Routine can only be called from nsPage");
		}
	}
*/
alex.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");
		var indexTalkName="Index_talk:"+(/.+:(.+)\//).exec(paginaFonte)[1]; 
		var indexTalkRaw=$.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title="+indexTalkName,async:false}).responseText;console.log(paginaFonte);
		var codiceMemoregex=find_stringa(indexTalkRaw,'{"','"]}',1); 
		// console.log(codiceMemoregex);
		var memo={};
		
		try {
			memo=JSON.parse(codiceMemoregex);
			localStorage.memoRegex=JSON.stringify(memo);
			alex.memoRegex=JSON.parse(localStorage.memoRegex);
			alert("Le sostituzioni correlate alla pagina sono state caricate");
		}
		catch(err) {
			alert("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 (selection()[1]!=="") {
			alex.caricaRegex();
		}
		
		
	}
	
};
	// salvataggio regex remoto
	alex.salvaRegexRemoto=function() {
		if (mw.config.get("wgCanonicalNamespace")=="Page") {
			var paginaFonte=localStorage.currentBasePage;
			var regexOld=""
			var testoPaginaFonte="";
			var regexFormattato=""
			var errore="";
			paginaFonte="Index talk:"+paginaFonte;
			try {
				testoPaginaFonte = $.ajax({url:mw.config.get("wgServer")+"/w/index.php?action=raw&title="+paginaFonte,async:false}).responseText;
				errore=find_stringa(testoPaginaFonte,"<!DOCTYPE html>","</html>",1);
		    	if (errore!=="") {
					testoPaginaFonte=testoPaginaFonte.replace(errore,"");
		        }
				
			} catch(err) {
				console.log("No Index talk page");
				
			}
			regexFormattato=localStorage.memoRegex.replace(/("\],)/g,"$1\n")
			var regexOld=find_stringa(testoPaginaFonte,'{"','"]}',1); 
			if (regexOld!=="") {
				
				testoPaginaFonte=testoPaginaFonte.replace(regexOld,regexFormattato);
			} else {
				testoPaginaFonte+="\n== memoRegex ==\n<nowiki>"+regexFormattato+"</nowiki>\n"
			}
			alex.eiv.save(paginaFonte,testoPaginaFonte,"salvataggio memoregex");
			alert("Regex have been saved into "+paginaFonte);
		} else {
			alert("Routine can only be called from nsPage");
		}
		
	}
	
	
	// test funzione abbr
	function abbr(testo) {
		
		var finale="";
		var semifinale="";
		//caso vocale + m,n
		finale=testo.slice(-1);
		semifinale=testo.slice(-2,-1).normalize("NFD").substr(0,1);
		if (/[aeiou][mn]/.test(semifinale+finale)) 
			return testo.slice(0,-2)+(semifinale+"\u0304").normalize("NFC");
		// caso pre
		if (testo.slice(-3)==="pre") 
			return testo.slice(0,-3)+("p"+"\u0304").normalize("NFC");
		// caso per
		if (testo.slice(-3)==="per") 
			return testo.slice(0,-3)+("<u>p</u>");
		// caso paperini	
		if (["que","qua","qui"].indexOf(testo.slice(-3))!==-1) 
			return testo.slice(0,-3)+("q\u0304").normalize("NFC");
		// caso quando
		if (testo.slice(-6)==="quando") 
			return testo.slice(0,-6)+"qn\u0304".normalize("NFC");
		// caso re
		if (testo.slice(-2)==="re") 
			return testo.slice(0,-2)+("r"+"\u0304").normalize("NFC");	
		// caso re
		if (testo.slice(-3)==="che") 
			return testo.slice(0,-3)+("cħ");
		return testo;
	}
	
	alex.abbrRun=function() {
		var t=ss();
		t[0]=abbr(t[0]);
		sw(t);
	}
	
/****** funzioni per versi ***** /
/* aggiunge il numero di riga
		 * con mod=1 mette il numero ogni ultimo verso del paragrafo
		 * con mod=2 mette il numero ogni x righe
		 * 
		 * TODO: escludere le righe con {{Centrato}}
		 */
		numeroRiga = function(mod, x) {
			var testoCasella = document.getElementById("wpTextbox1").value;
			// cancella tutti gli R //
			if (mod === 0) {
				while (find_stringa(testoCasella, "{{R|", "}}", 1) !== "") {
					testoCasella = testoCasella.replace(find_stringa(testoCasella, "{{R|", "}}", 1), '');
				}
				while (find_stringa(testoCasella, "{{r|", "}}", 1) !== "") {
					testoCasella = testoCasella.replace(find_stringa(testoCasella, "{{r|", "}}", 1), '');
				}
				document.getElementById("wpTextbox1").value = testoCasella;
				return;
			}
			//esci se manca il poem
			if (testoCasella.indexOf("<poem") == -1 || testoCasella.indexOf("</poem>") == -1) {
				console.log("uscita 1");
				return;
			}
			//prende il poem in cui si trova il cursore
			var pos = document.getElementById("wpTextbox1").selectionStart;
			begin = testoCasella.substring(0, pos + 6).lastIndexOf("<poem");
			if (begin == -1) {
				console.log("uscita 2");
				return;
			}
			end = testoCasella.substring(begin).indexOf("</poem>") + testoCasella.substring(0, begin).length;
			var prima = testoCasella.substring(0, begin + 6);
			var dopo = testoCasella.substring(end);
			//scomponi il testo in singole righe
			var lines = testoCasella.substring(begin + 6, end).split("\n");
			var num = 1;
			var center = false;
			
			/* algoritmo nuovo Alex 13.07.2016 */
			//solo in namespace Pagina, fai scegliere all'utente da che numero partire (l'ultimo numero della pagina prima)
			if (mw.config.get("wgCanonicalNamespace") == "Page") {
				//se questo è il primo poem della pagina, proponi di continuare dall'ultimo numero; altrimenti proponi 1
				verso=ultVerso(alex.p_1[1][1])+1;
				
				num = parseInt(prompt("da che numero parto?", verso));
			}
			num--;
			
			/* algoritmo nuovo Alex 13.07.2016 */
			var r=/^ *<center>|^ *{{center\||^ *{{centrato\||^ *{{vc\|| *{{r-|^ *{{ct\|/i;
			for (var i = 0; i < lines.length; i++) {
				//non considerare il testo dentro <center></center>
				// if (lines[i].toLowerCase().lastIndexOf("<center>") > -1) center = true;
				//salta le righe vuote, o centrate, o marcate con {{r-}}
				if (!(r.test(lines[i]) || $.trim(lines[i])==="")) {
					num++;
					//in modalita' 1, controlla che la prossima riga sia l'ultima o una riga bianca
					if (mod == 1 && (i + 1 >= lines.length || lines[i + 1].replace(/\s/g, "") === "")) {
						lines[i] = scriviNumero(lines[i], num);
					}
					if (mod == 2 && num % x === 0) {
						lines[i] = scriviNumero(lines[i], num);
					}
				}
				if (lines[i].toLowerCase().lastIndexOf("</center>") > -1) center = false;
			}
			//rimetti insieme le righe
			var out = lines[0];
			for (i = 1; i < lines.length; i++) {
				out = out + "\n" + lines[i];
			}
			document.getElementById("wpTextbox1").value = prima + out + dopo;
			//modifica il link alla prossima pagina, in modo da "ricordarsi" a che verso siamo arrivati
			if (mw.config.get("wgCanonicalNamespace") == "Page" && mw.config.get("wgAction") != 'history' && $("#ca-next span a").length) {
				mw.loader.using('ext.proofreadpage.page', function () {
					setURLVar($("#ca-next span a"), "verso", num + 1);
					act = $("#editform").attr("action");
				});
			}
		};
/* nuova funzione per il recupero numero verso dalla pagina precedente */
		function ultVerso(testo) {
	
		var rigaUltimoPoem=0;
		var rigaUltimoR=0;
		var ultimoVerso=0;
		var r=/^ *<center>|^ *{{center\||^ *{{centrato\||^ *{{vc\|| *{{r-|^ *{{ct\|/i;
		// normalizzo </poem> su nuova riga 
		testo=testo.replace(/([^\n])(<\/poem>)/g,"$1\n$2");
		// splitto in righe
		testo=testo.split("\n");
		// cerco l'ultimo </poem>
		for (i=testo.length-1;i>-1;i-=1){
			if ((/<\/poem>/).test(testo[i])) break;
		}
		if (i===-1) return 0;
		// cerco indietro l'ultimo R
		rigaUltimoPoem=i;
		for (i=rigaUltimoPoem-1;i>-1;i-=1){
			if ((/{{r\|/i).test(testo[i])) break;
		}
		if (i===-1) return 0;
	
		rigaUltimoR=i;
		ultimoVerso=testo[i].match(/{{r\|(\d+)/i)[1]*1;
		// conto le righe verso fino a </poem>
		for (i=rigaUltimoR+1;i<rigaUltimoPoem;i+=1) {
			if (!(r.test(testo[i]) || $.trim(testo[i])==="")) ultimoVerso+=1;
		}
		return ultimoVerso;
	}
		
		
		/* sotto-funzione di numeroRiga()
		 * aggiunge il numero num alla riga line
		 */
		scriviNumero = function(line, num) {
			var str = line;
			var n = 0;
			//salta gli spazi ad inizio riga
			while (str.charAt(0) && str.charAt(0) == ' ') {
				str = str.substring(1);
				n++;
			}
			//salta gli ":" ad inizio riga
			while (str.charAt(0) && str.charAt(0) == ':') {
				str = str.substring(1);
				n++;
			}
			if (n > 0) line = line.substring(0, n) + "{{R|" + num + "}}" + line.substring(n);
			else line = "{{R|" + num + "}}" + line;
			return line;
		};

alex.v5=function() {numeroRiga(2,5);};
alex.v4=function() {numeroRiga(2,4);};
alex.v3=function()  {numeroRiga(2,3);};
alex.v1=function() {numeroRiga(1);};

/*****fine funzioni per versi *******/

	// Inizializzazione memoRegex
	if (localStorage.memoRegex===undefined) {
		localStorage.memoRegex=JSON.stringify({});
	} 	
	alex.memoRegex=JSON.parse(localStorage.memoRegex);
	if (mw.config.get("wgCanonicalNamespace")==="Page" && mw.config.get("wgAction")==="edit" ) {
	     // caricamento del nome base pagina corrente
	     localStorage.currentBasePage=(/.+?:(.+)\/.+$/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;
	     	alex.caricaRegexRemoto();
	     }
     }
	
	
	alex.shortcut.add("Alt+3", (function () {$("span.quality3 input").click();$("#wpSave").click();}));
	alex.shortcut.add("Alt+0", (function () {$("span.quality0 input").click();$("#wpSave").click();}));
	alex.shortcut.add("Alt+1", (function () {$("span.quality1 input").click();$("#wpSave").click();}));
	alex.shortcut.add("Ctrl+Alt+4", (function () {$("span.quality4 input").click();$("#wpSave").click();}));
	alex.shortcut.add("Alt+s", (function () {$("#wpSave").click(); return false;}));
	// alex.shortcut=shortcut;
	// attivazone della registrazione dei campi testo con focus
	alex.activeElement=$("#wpTextbox1")[0];
	$("input:text, textarea").not("#findReplace_box input:text").focusin(function () {alex.activeElement=this;});
	importScript("User:Alex brollo/localScripts.js");
})($,mw,alex);
});