/**
 * 
 */


var resetResult;
var lsid;
var lsentid;
const formaClass='frm'
var selectedVista;
var listaPeriodiRisultato;
var listaClausoleRisultato;

 
$(document).ready(function() {
	lsid='';
	removeGraph=false;
						
	const cantobadgeclass = 'badge badge-outline-info badge-pill'

	const sparqlGenerator = sparqljs.Generator;
	const myEngine = new Comunica.QueryEngine();
	const sparqlEndpoint = "https://hdnlab1.isti.cnr.it/fuseki/commediaontosintgra/query";
	
	var shownSentenceList = new Set()

	//var currentMinimap = ''
	var listarisultati = [];
	listaPeriodiRisultato = [];
	listaClausoleRisultato=[]
	var resultSentences = new Set()
	var minimapScrolling = false;
	var displayId = 'displaycanto'
	var cantiche=["Inferno", "Purgatorio","Paradiso"]
	var loadedCanti=new Set();
	const openSTag="{"
	const closeSTag="}"
	
	var cantoDisplayed = "#InfernoCanto_1";
	var prevCantoDisplayed = "#InfernoCanto_1";
	var queryExecuted = false;
	var contextLength = 3; 
	var idCitazione = "citazione_Frase";
	
	resetResult=function(){
		//console.log('clean result')
		cleanSearchResult()
		esprlogica = []
	}
	
	//hideMinimap();
	createAllDivCanti()
	//const start = performance.now();
	showCanto(formeprima, '1','1')
	$("#InfernoCanto_1").attr('style', 'display: d-flex;')
	loadedCanti.add("InfernoCanto_1")
	drawMinimap("#InfernoCanto_1")
	const minim=$(" .minimap__content")
	//const end = performance.now();
	//console.log(`Load cantiche time: ${end - start} ms`);
	
$("#valoreVista").on('change', function() {
	selectedVista = $(this).val();
	switch (selectedVista){
		case "forme":
					$("#vistaFrasi").css("display", "none");
					$("#vistaDialoghi").css("display", "none");
					$("#vistaMetafore").css("display", "none");
					resetFrasi()
					$(cantoDisplayed).attr('style', 'display: d-flex;')
					break;
		case "frasi":
					loadFrasi();
				
					break;					
		case "metafore":
					//loadMetafore();
					
					break;			
		case "dialoghi":
					//loadDialoghi();
					
					break;
	}
});




$(" ."+formaClass).each(function(idx, element) {
        // We cycle through the elements using each() so that we can choose the element specifically that we wish to clean up afterward
		var ele = $(element);
			ele.tooltip({
				content: (function() {return formatTTContent(ele.attr('title'), ele.attr('class').split(' ')[1]);}),
  				classes:{"ui-tooltip":'Nik_dropdown-content'},
  				close: function (event, ui) {$(".ui-helper-hidden-accessible").remove();},
       			create: function(ev, ui) {$(this).data("ui-tooltip").liveRegion.remove();},
  				hide: false,
  				show: {delay: 800,duration: 0}
			
		});
	});



$( " ."+formaClass ).dblclick(function() {
	
		sentenceId=$(this).attr('class').split(' ')[0].replace('$','')
		console.log('dblclick '+lisid)
		if (shownSentenceList.has(sentenceId)){
			resetSentenceStructure(sentenceId)
			shownSentenceList.delete(sentenceId)
			lsid=''
			
		}
		else{
			//showSentenceStructure (sentenceId)
			shownSentenceList.add(sentenceId)
			
		}
});


$(" ."+formaClass).hover(function(idx, element) {
        
        sentenceId=$(this).attr('class').split(' ')[0].split('_')
		var tmplisid=sentenceId[0]+'_'+sentenceId[1]+'_'+sentenceId[3]
		lsentid=$(this).attr('class').split(' ')[0]
		lisid=tmplisid
	});


	
	
	//$("#" + displayId).scroll(function() {
	$(displayCantoWrapperId).scroll(function() {
		if (minimapScrolling) {
			minimapScrolling = false
		}
		else {
			trackScrollCanto()
		}
	});

	jQuery(document).delegate(' .espandiFrase', 'click', function() {
		var cid  = $(this).attr('id');
		var parcid=cid.split('_');
		var cantoToShow = parcid[0]+"_"+parcid[2]
		var fraseToExpand = "#"+"versiFrase"+parcid[4]
		var cantoDiv = [];
		var fraseDiv = [];
		var numeroVerso;
		var idVerso;
		var divAggiuntiPrima = null;
		var divAggiuntiDopo = null;
		var fraseElements = [];
		var ultimoVersoDivDopo;
		var primoVersoDivPrima;
		var citazioneFrase;
		var lastAppend;
		var fineCanto = false;
		
		cid = cid.replace("ex","er");
		
		if ( !(loadedCanti.has(cantoToShow))){
			caricaCanto(cantoToShow,parcid)
		}
		cantoToShow = "#"+ cantoToShow;
		
		$(cantoToShow +" li").each((index, elem) => {
  			cantoDiv.push(elem.id);
		});
		
		$(fraseToExpand +" >li").each((index, elem) => {
  			fraseDiv.push(elem.id);
		});
		
		$(fraseToExpand +" >li").each((index, elem) => {
  			fraseElements.push(elem);
		});
		
		idVerso = fraseDiv[0].split('_');
		cantica = idVerso[0];
		canto = idVerso[1];
		numeroVerso = parseInt(idVerso[2]);
		
		primoVersoDivPrima = parseInt(idVerso[2])
		idVerso = fraseDiv[fraseDiv.length-1].split('_');
		ultimoVersoDivDopo = parseInt(idVerso[2]);
				
		citazioneFrase = $("#"+idCitazione+parcid[4]).clone();
		
		divAggiuntiPrima = $("#"+"FrasiAggiuntePrima"+parcid[4]);
		divAggiuntiDopo = $("#"+"FrasiAggiunteDopo"+parcid[4]);

		if (divAggiuntiPrima.length == 0){
			divAggiuntiPrima = $("<div />")
			divAggiuntiPrima.attr('id',"FrasiAggiuntePrima"+parcid[4])
		}else{
			primoVersoDivPrima = divAggiuntiPrima.attr("primoVerso")
		}
		
		if (divAggiuntiDopo.length == 0){
			divAggiuntiDopo = $("<div />")
			divAggiuntiDopo.attr('id',"FrasiAggiunteDopo"+parcid[4])
		}else{
			ultimoVersoDivDopo = divAggiuntiDopo.attr("ultimoVerso")
		}

		if (fraseDiv.length < contextLength+1){
			if(numeroVerso == 1){ //  caso inizio canto
				lastAppend = aggiungiDopo(fraseDiv, ultimoVersoDivDopo,divAggiuntiDopo,cantoDiv)		
			}else{ //  caso fine canto
				aggiungiPrima(fraseDiv, primoVersoDivPrima,divAggiuntiPrima,cantoDiv);
				fineCanto = true;					
			}				
		}else{ 
			aggiungiPrima(fraseDiv, primoVersoDivPrima,divAggiuntiPrima,cantoDiv);
			lastAppend = aggiungiDopo(fraseDiv, ultimoVersoDivDopo,divAggiuntiDopo,cantoDiv)		
		}
		
		if (!fineCanto){
			$("#"+idCitazione+parcid[4]).remove();
			lastAppend.append("<br>")
			citazioneFrase.appendTo(lastAppend)
		}
		
		$("#"+cid).attr('style', 'display: d-flex;');

		//gestisco risultati se unità di ricerca è periodo
		if (listaPeriodiRisultato.length){
			for (msid of listaPeriodiRisultato){
				loadPeriodo(msid)
				
			}
		}
		
		//gestisce risultati se unità di ricerca è frase
		if (listaClausoleRisultato.length){
			for (clsid of listaClausoleRisultato){
				let tmpid=clsid.split('-')
				loadFrase(tmpid[0], tmpid[1])
				
			}
		}
			
		//aggiungo listeners
		//addFormaListeners()
		//addFormaListenersInCanto()
		addFormaListenersInRisultato()
		
		//disegno minimap
		drawMinimap('#vistaFrasi')
		
	});
		
	function aggiungiDopo(fraseDiv, ultimoVersoDivDopo,divAggiuntiDopo,cantoDiv){
		idVerso = "#"+fraseDiv[fraseDiv.length-1];
		numeroVerso = parseInt(ultimoVersoDivDopo);
		
		for (i=numeroVerso;i<numeroVerso+contextLength;i++){
			var verso  = $("#"+cantoDiv[i]).clone();
			ultimoVersoDivDopo++;
			verso.attr('id', cantica+"_"+canto+"_"+ultimoVersoDivDopo);
			divAggiuntiDopo.append(verso);
		}

		divAggiuntiDopo.insertAfter($(idVerso));	
		divAggiuntiDopo.attr("ultimoVerso",ultimoVersoDivDopo)
		return verso;		
	}
	
	function aggiungiPrima(fraseDiv, primoVersoDivPrima,divAggiuntiPrima,cantoDiv){
		idVerso = "#"+fraseDiv[0];
		numeroVerso = parseInt(primoVersoDivPrima);	
		for (i=numeroVerso-1;i>numeroVerso-contextLength-1;i--){
			var verso  = $("#"+cantoDiv[i-1]).clone();
			primoVersoDivPrima--;
			verso.attr('id', cantica+"_"+canto+"_"+primoVersoDivPrima);
			divAggiuntiPrima.prepend(verso);
		}
		divAggiuntiPrima.insertBefore($(idVerso));
		divAggiuntiPrima.attr("primoVerso",primoVersoDivPrima)	
	}
	
	jQuery(document).delegate(' .riduciFrase', 'click', function() {
		var cid  = $(this).attr('id');
		var parcid=cid.split('_');
		var divAggiuntiPrima = "#"+"FrasiAggiuntePrima"+parcid[4]
		var divAggiuntiDopo = "#"+"FrasiAggiunteDopo"+parcid[4]
		var fraseDiv = [];
		var fraseToExpand = "#"+"Frase"+parcid[4]
		var idUltimoVerso;

		citazioneFrase = $("#"+idCitazione+parcid[4]).clone();
		$("#"+idCitazione+parcid[4]).remove();
		$(divAggiuntiPrima).remove();
		$(divAggiuntiDopo).remove();
		
		$(fraseToExpand +" li").each((index, elem) => {
  			fraseDiv.push(elem.id);
		});
		idUltimoVerso = "#"+fraseDiv[fraseDiv.length-1];
		
		citazioneFrase.appendTo($(idUltimoVerso));
		$("#"+cid).css("display", "none");
		drawMinimap('#vistaFrasi')

	});		
	
	function caricaCanto(canto, parcid){
			if(parcid[0].includes('Inferno'))
				showCanto(formeprima, '1',parcid[2])
			if(parcid[0].includes('Purgatorio'))
				showCanto(formeseconda, '2',parcid[2])
			if(parcid[0].includes('Paradiso'))
				showCanto(formeterza, '3',parcid[2])
			loadedCanti.add(canto)
	}

/*
 * Costruzione e visualizzazione del risultato in frasi.
*/
	jQuery(document).delegate(' .lista-risultati', 'click', function(e) {
		   
			var canto, numeroCantica;
			var divVerso;
			prevCantoDisplayed=cantoDisplayed;			
			$(cantoDisplayed).css("display", "none");
			cantoDisplayed = "#vistaFrasi";
			if (!queryExecuted){
				$("#vistaFrasi").attr('style', 'display: d-flex;');
				//manageMM("#vistaFrasi")
				drawMinimap('#vistaFrasi')
				if (selectedVista=='frasi'){
					loadFrasi();
				}
				return
			}
			const start = performance.now();
			queryExecuted = false;
			
			listarisultati.sort(function(a, b){return a - b});
			
			var elencoRisutati = $("#vistaFrasi");
			elencoRisutati.empty();
					
			var numeroRisultato = 0;
			var ultimaPosizione = 0;	
			for (risultato of listarisultati){
				numeroRisultato++;
				risultato = parseInt(risultato)
				if (risultato <= parseInt(ultimaPosizione)){
					continue;
				}
				versiContesto= getFormaContext(risultato, contextLength);
				var setVersicontesto = new Set()
				divVerso =''
				numeroCantica=0
				canto=0
				//var titoloCanto = $('<h5 class="titolo-canto"/>')
				var versiIniziali = $('<div class="versiFrase" />')

				var listaVersi = $("<ol />")
				listaVersi.css("padding-bottom","0px")
				listaVersi.css("margin-bottom","0px")

				listaVersi.attr('id', "Frase"+numeroRisultato);
				versiIniziali.attr('id', "versiFrase"+numeroRisultato);

				for (forma of versiContesto){
					if (setVersicontesto.size == 0){
						numeroCantica=forma.cantica
						canto=forma.canto
					}
					if (!setVersicontesto.has(forma.verso)){
						divVerso = createDivVersoLI(forma.cantica, forma.verso, forma.canto)
						versiIniziali.append(divVerso)
						listaVersi.append(versiIniziali)
						elencoRisutati.append(listaVersi)
						setVersicontesto.add(forma.verso)
					}
					createSpanFormeNew(forma.testo, forma.catg, 'e'+forma.posizione, forma.periodo, forma.funzperiodo, divVerso)
				}
				ultimaPosizione = forma.posizione;
			
				var mhr=$('<hr width="100" align="center"/>')
				var comandi = $('<div />')
				comandi.attr('id',"comandiFrase"+numeroRisultato)				

				var citazione = $('<span />')	
				citazione.append("[Canto "+getRoman(canto)+", "+getCantica(numeroCantica)+"]")
				citazione.attr('class', ' citazioneFrase my-0 mx-2 navig-canto');
				citazione.attr('name', getCantica(numeroCantica)+"Canto "+canto);
				citazione.attr('id', idCitazione+numeroRisultato);
				divVerso.append("<br>")
				comandi.attr('class', 'comandi');
				mhr.css("margin-top","0px")
				mhr.css("padding-top","0px")
				citazione.appendTo(divVerso);
				
				var spanBadgeExpand = $('<span />');
				var expandIcon = '<ion-icon name="ellipsis-vertical-outline"></ion-icon>';
				spanBadgeExpand.attr('class', 'badge badge-primary badge-pill my-0 mx-2 espandiFrase');
				var spanBadgeReduce = $('<span />');				
				var reduceIcon = '<ion-icon name="arrow-up-outline"></ion-icon>';

				spanBadgeReduce.attr('class', 'badge badge-primary badge-pill my-0 mx-2 riduciFrase');
				
				spanBadgeExpand.attr('id', getCantica(numeroCantica)+"Canto_ex_"+canto+"_"+risultato+"_"+numeroRisultato);
				spanBadgeExpand.append(expandIcon)
				
				spanBadgeReduce.attr('id', getCantica(numeroCantica)+"Canto_er_"+canto+"_"+risultato+"_"+numeroRisultato);
				spanBadgeReduce.append(reduceIcon)
				spanBadgeReduce.css("display", "none");

				spanBadgeExpand.appendTo(comandi);
				spanBadgeReduce.appendTo(comandi);

				comandi.appendTo(elencoRisutati);
				elencoRisutati.append(mhr)
				
			}
			const endCaricamento = performance.now();
			console.log(`Caricamento contesti time: ${endCaricamento - start} ms`);
					
			//evidenzio resultati
			
			for (ris of listarisultati) {
				idris = '#e' + ris
				$(idris).addClass("font-weight-bold mark ")
			}
			
			const endEvidRis = performance.now();
			console.log(`Evidenza risultati time: ${endEvidRis - start} ms`);
						
			//evidenzio i periodi se unità di ricerca è impostato come periodo
			if (listaPeriodiRisultato.length){
				for (msid of listaPeriodiRisultato){
					loadPeriodo(msid)
				
				}
			
			}
			//evidenzio le frasi se unità di ricerca è frase
			if (listaClausoleRisultato.length){
				for (clsid of listaClausoleRisultato){
					let tmpid=clsid.split('-')
					loadFrase(tmpid[0], tmpid[1])
					
				}
			}			
			
			//visualizzo
			$("#vistaFrasi").attr('style', 'display: d-flex;');
			//manageMM("#vistaFrasi")
			
			const endVis = performance.now();
			console.log(`Visualizzazione time: ${endVis - start} ms`);
			
			drawMinimap('#vistaFrasi')
			
			
			
			if (selectedVista=='frasi'){
				loadFrasi();
			}
			//aggiungo listeners
			//addFormaListeners()
			//addFormaListenersInCanto()
			addFormaListenersInRisultato()
			const endal = performance.now();
			console.log(`Addlistener time: ${endal - start} ms`);
			
			const enddmm = performance.now();
			console.log(`DrawMM time: ${enddmm - start} ms`);
			
	});
	
	
	jQuery(document).delegate('.navig-canto', 'click', function(e) {
		resetFrasi()
		
		//nasconde vista risultati
		$("#vistaFrasi").css("display", "none");
		
		//rimuove il grafo sintattico se c'è'
		var periodograph=document.getElementById("periodograph");
		
		if (periodograph!=null){
			let showngr=periodograph.getAttribute('name').split("_")
			var tmpsent=showngr[0]+"_"+showngr[1]+"_s_"+showngr[2];
			if (shownSentenceList.has(tmpsent)){
				lisid=''
				resetSentenceStructure(tmpsent)
				shownSentenceList.delete(tmpsent)
			}
			$("#periodograph").empty()
		}
		
	
		$(cantoDisplayed).css("display", "none");
		
		const cid=$(this).attr('name').replace(" ", "_");
		
		cantoDisplayed = "#"+cid;
		
		if ( !(loadedCanti.has(cid)))
		{
			
			var parcid=cid.split('_')
			if(parcid[0].includes('Inferno'))
				showCanto(formeprima, '1',parcid[1])
			if(parcid[0].includes('Purgatorio'))
				showCanto(formeseconda, '2',parcid[1])
			if(parcid[0].includes('Paradiso'))
				showCanto(formeterza, '3',parcid[1])
			loadedCanti.add(cid)
		}
		//$("#" + $(this).attr('name').replace(" ", "_")).css("display", "block");
		$("#" + $(this).attr('name').replace(" ", "_")).attr('style', 'display: d-flex;')
		
		
		drawMinimap("#" + $(this).attr('name').replace(" ", "_"))
		
		
		if (selectedVista=='frasi'){
			loadFrasi();
		}
	
		//addFormaListeners();
		addFormaListenersInCanto();
		
	});

	
	//Query

	jQuery(document).delegate('#searchcomm, #searchcomm2', 'click', function(e) {
		e.preventDefault();
		manageQuery()
	});
	

	//Reset

	jQuery(document).delegate('#cleanresult', 'click', function(e) {
		console.log('clean')
		cleanSearchResult()
		esprlogica = []
		$('#queryText').val("")

	});
	
	//Utility functions
	
	function addFormaListeners(){
		
		$(" ." + formaClass).each(function(idx, element) {
			var ele = $(element);
			ele.tooltip({
				content: (function() { return formatTTContent(ele.attr('title'), ele.attr('class').split(' ')[1]); }),
				classes: { "ui-tooltip": 'Nik_dropdown-content' },
				close: function(event, ui) { $(".ui-helper-hidden-accessible").remove(); },
				create: function(ev, ui) { $(this).data("ui-tooltip").liveRegion.remove(); },
				hide: false,
				show: {delay: 800,duration: 0}

			});
			ele.hover(function(idx, element) {

				sentenceId = $(this).attr('class').split(' ')[0].split('_')
				var tmplisid = sentenceId[0] + '_' + sentenceId[1] + '_' + sentenceId[3]
				lsentid = $(this).attr('class').split(' ')[0]
				lisid = tmplisid

			});

		});

	}
	
	function addFormaListenersInRisultato(){
		
		for (ris of listarisultati) {
			
				idris = '#e' + ris
				ele=$(idris)
				$(idris).tooltip({
				content: (function() { return formatTTContent(ele.attr('title'), ele.attr('class').split(' ')[1]); }),
				classes: { "ui-tooltip": 'Nik_dropdown-content' },
				//close: function(event, ui) { $(".ui-helper-hidden-accessible").remove(); },
				//create: function(ev, ui) { $(this).data("ui-tooltip").liveRegion.remove(); },
				hide: false,
				show: {delay: 800,duration: 0}

			});
			
		}
		$(cantoDisplayed).find(" ." + formaClass).each(function(idx, element) {
			$(element).hover(function(idx, element) {

				sentenceId = $(this).attr('class').split(' ')[0].split('_')
				var tmplisid = sentenceId[0] + '_' + sentenceId[1] + '_' + sentenceId[3]
				lsentid = $(this).attr('class').split(' ')[0]
				lisid = tmplisid

			});

		});
			
		
	}
	
	function addFormaListenersInCanto(){
		let idn=0
		$(cantoDisplayed).find(" ." + formaClass).each(function(idx, element) {
			idn=idn+1
			var ele = $(element);
			
			$(element).tooltip({
				content: (function() { return formatTTContent(ele.attr('title'), ele.attr('class').split(' ')[1]); }),
				classes: { "ui-tooltip": 'Nik_dropdown-content' },
				//close: function(event, ui) { $(".ui-helper-hidden-accessible").remove(); },
				//create: function(ev, ui) { $(this).data("ui-tooltip").liveRegion.remove(); },
				hide: false,
				show: {delay: 800,duration: 0}

			});
			$(element).hover(function(idx, element) {

				sentenceId = $(this).attr('class').split(' ')[0].split('_')
				var tmplisid = sentenceId[0] + '_' + sentenceId[1] + '_' + sentenceId[3]
				lsentid = $(this).attr('class').split(' ')[0]
				lisid = tmplisid

			});

		});
		console.log('nr forme '+idn)

	}
	
	
	function getRoman(numero) {
	
	var romani = ["I","II","III","IV","V","VI","VII","VIII","IX","X",
				  "XI","XII","XIII","XIV","XV","XVI","XVII","XVIII","XIX","XX",
				  "XXI","XXII","XXIII","XXIV","XXV","XXVI","XXVII","XXVIII","XXIX","XXX",
				  "XXXI","XXXII","XXXIII","XXXIV"];
	return (romani[numero-1]);
	
}

function loadPeriodo(idperiodo) {
	
	
	$(cantoDisplayed).find(' .'+idperiodo).each(function() {
		var pstp=$(this).attr('class').split(" ")[1]

		$(this).css('color', colorssp(mapsynttypestopalette[pstp]));
	})
	
	minim.contents().find(' .'+idperiodo).each(function() {
		var mpstp=$(this).attr('class').split(" ")[1]

		$(this).css('color', colorssp(mapsynttypestopalette[mpstp]));
	})
}

function loadFrase(idperiodo, funzionefrase) {
	
	
	$(cantoDisplayed).find(' .'+idperiodo).each(function() {
		var pstp=$(this).attr('class').split(" ")[1]

		if(pstp.trim()==funzionefrase)
			$(this).css('color', colorssp(mapsynttypestopalette[pstp]));
	})
	
	minim.contents().find(' .'+idperiodo).each(function() {
		var mpstp=$(this).attr('class').split(" ")[1]
		if(mpstp.trim()==funzionefrase)
			$(this).css('color', colorssp(mapsynttypestopalette[mpstp]));
	})
}

function loadFrasi() {
	
	$(cantoDisplayed).find(' .sentencetag').each(function() {
		$(this).attr('style', 'display: d-flex;');
	})
	$(cantoDisplayed).find(' .'+formaClass).each(function() {
		stp=$(this).attr('class').split(" ")[1]

		$(this).css('color', colorssp(mapsynttypestopalette[stp]));
	})
	//let minim=$(" .minimap__content")
	minim.contents().find(" .sentencetag").each(function(){
		$(this).attr('style', 'display: d-flex;');
	})
	minim.contents().find(' .'+formaClass).each(function() {
		stp=$(this).attr('class').split(" ")[1]

		$(this).css('color', colorssp(mapsynttypestopalette[stp]));
	})
}
function resetFrasi(){
	
	$(cantoDisplayed).find(' .sentencetag').each(function() {
		$(this).css('display', 'none');
	})
	$(cantoDisplayed).find(' .'+formaClass).each(function() {
		//console.log(colorssp(mapsynttypestopalette[stp]))
		$(this).css('color', '');
	})
	//let minim=$(" .minimap__content")
	minim.contents().find(" .sentencetag").each(function(){
		$(this).css('display', 'none');
	})
	minim.contents().find(' .'+formaClass).each(function() {
		$(this).css('color', '');
	})
	//evidenzio i periodi se unità di ricerca è impostato come periodo
	if (listaPeriodiRisultato.length) {
		for (msid of listaPeriodiRisultato) {
			loadPeriodo(msid)

		}

	}
	//evidenzio le frasi se unità di ricerca è frase
	if (listaClausoleRisultato.length) {
		for (clsid of listaClausoleRisultato) {
			let tmpid = clsid.split('-')
			loadFrase(tmpid[0], tmpid[1])

		}
	}
}
	
	function getCantica(numeroCantica){
	
		switch (numeroCantica){
				case 1:	return("Inferno");
				case 2:	return("Purgatorio");
				case 3:	return("Paradiso");
		}	
	}
	
	function formatTTContent(categ, syntType){
		var details=[];
		
		details = getHoverContent(categ);
		
		var myitems;
		var catgramm;
		var subcatgramm = '';
		var popoverText = '';
		if (selectedVista=='frasi'){
			return '<div class="ttContent"><b>'+maptypes[syntType]+'</b></div>';
		}

		for (detail of details){
			myitems= detail.split(',');	
			
			catgramm='<div  class="ttContent">';
			subcatgramm='<p> <b>'+myitems[0]+'</b><i>'+myitems.slice(1,-1)+'</i></p></div>';			
			popoverText = popoverText + catgramm + subcatgramm;
		}
		
		return (popoverText);
	}

	function getHoverContent(categ){
		
		//console.log('Categoria '+categ)
		var mycat=[];
		if(categ.includes('^')){
			categs=categ.split('^')			
			for (cat of categs){
				mycat.push(proprietaForma(cat))
			}
			//console.log(mycat.join('-'))
		}else{
			mycat.push(proprietaForma(categ));
		}
		return(mycat);
	}
	
	function proprietaForma(categ){
		if (categ[0]=='v'){
			return parserVerbi.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='s'){
			return parserSostantivi.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='e'){
			return parserPreposizioni.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='b'){
			return parserAvverbi.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='p'){
			return parserPronomi.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='a'){
			return parserAggettivi.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if(categ[0]=='r'){
			return parserArticolo.parse(categ).split(',').filter(prop => prop.length > 0).join()
		}
		if (categ[0] == 'f') {
			return parserCitazione.parse(categ).split(',').filter(prop => prop.length > 0).join();
		}
		if (categ[0] == 'n') {
			return parserOnomastica.parse(categ).split(',').filter(prop => prop.length > 0).join();
		}
		if (categ[0] == 'c') {
			return parserCongiunzione.parse(categ).split(',').filter(prop => prop.length > 0).join();
		}
		return categoriegrammaticali[categ[0]]
	}
	
	function cleanSearchResult() {
		
		$("#headingZero").closest('.card').css("display", "none");
		$("#vistaFrasi").empty()
		$("#vistaFrasi").css("display", "none");
		for (msid of listaPeriodiRisultato){
			$('.'+msid).each(function(){
				//$(this).removeClass("font-weight-bold mark ")
				$(this).css('color', '');
			});
		}
		for (clsid of listaClausoleRisultato){
			var tmpcl=clsid.split('-');
			$('.'+tmpcl[0]).each(function(){
				$(this).css('color', '');
			});
		}
		
		//let minim=$(" .minimap__content")
		for (forma of listarisultati) {
			idforma = '#' + forma
			$(idforma).removeClass("font-weight-bold mark ")
			minim.contents().find(idforma).removeClass("font-weight-bold mark ")
		}
		
		
		$(".badge").remove();
		//$("#headingZero").css("display", "none");
	
		listarisultati = []
		listaPeriodiRisultato=[]
		listaClausoleRisultato=[]
		resultSentences=new Set()
		if(cantoDisplayed=='#vistaFrasi')
			cantoDisplayed=prevCantoDisplayed
		$(cantoDisplayed).attr('style', 'display: d-flex;');
		//manageMM (cantoDisplayed)
		drawMinimap(cantoDisplayed)
	}
	
	function manageMM(name){
		currentMinimap = name;
		let testhtml = $(currentMinimap)[0].outerHTML;
		//let minim=$(" .minimap__content")
		let bm=minim.contents().find(' .blog-main')
		bm.empty()
		bm.append(testhtml)
		getDimensionsDiv();
	
	}
	
	var unitaRicerca='forma'
	
	function manageQuery(){
		cleanSearchResult()
		esprlogica = []
		jsonQuery=getJsonQuery()
		
		if(jsonQuery['QueryAvanzata']==0)
			unitaRicerca='forma'
		else
			unitaRicerca=jsonQuery['unitaRicerca']
		console.log("got json query, unita ricerca: "+unitaRicerca)
		if(jsonQuery['QueryAvanzata']==0 && jsonQuery['Clausola0']['queryText']==''){
			alert('Digitare una stringa da cercare')
			return
		}
		
		jsonQuery = buildSQ(jsonQuery)
		
		myquery = new sparqlGenerator().stringify(jsonQuery)
		console.log(myquery)
		executeQuerySearch(myquery)
	}
	
	
	
	//manage sentence and clauses
	
	function showSentenceStructure(sentence) {

		sid = '.' + sentence.toString()
		//console.log(sid)
		$(sid).addClass('text-info font-italic')

	}
	
	
	
	function resetSentenceStructure(sentence) {
		$(" ." + sentence).removeClass('text-info font-italic')
	}


	//Cantica management functions
	
	function showCanto(formecantica, idcantica, canto) {
		var setVersiCanto = new Set()
		
		var cantica=cantiche[parseInt(idcantica)-1];
		var elverso, formaItem, currSentenceId;
		formecantica.map(function(item) {
			formaItem = item.split("_");
			var sentenceid=idcantica+"_"+formaItem[1]+"_s_"+formaItem[5]
			if (formaItem[1]==canto){
				if (! setVersiCanto.has(cantica + "_" + formaItem[3] + "_" + 'Canto_' + formaItem[1])){
					if(currSentenceId!=null && currSentenceId != sentenceid){
						createSpanPeriodiTag(closeSTag, 'c', formaItem[2]-1, currSentenceId, elverso)
						currSentenceId=null
					}
					//elverso=createDivVersoNew(cantica, formaItem[3], 'Canto_' + formaItem[1])
					elverso=createDivVersoLI(cantica, formaItem[3], 'Canto_' + formaItem[1])
					setVersiCanto.add(cantica+ "_" + formaItem[3] + "_" + 'Canto_' + formaItem[1])
				}
				if(currSentenceId==null || currSentenceId != sentenceid){
					if (currSentenceId!=null){
						createSpanPeriodiTag(closeSTag, 'c', formaItem[2]-1, currSentenceId, elverso)
					}
					currSentenceId=sentenceid;
					createSpanPeriodiTag(openSTag, 'o', formaItem[2], sentenceid, elverso)
				}
				createSpanFormeNew(formaItem[0], formaItem[4], formaItem[2], sentenceid,formaItem[6],elverso)
			
			}
			
		})
		
		//gestione risultati
		
		if (listaPeriodiRisultato.length){
			for (msid of listaPeriodiRisultato){
				loadPeriodo(msid)
				
			}
		}
		
		if (listaClausoleRisultato.length){
			for (clsid of listaClausoleRisultato){
				let tmpid=clsid.split('-')
				loadFrase(tmpid[0], tmpid[1])
				
			}
		}				
		
		if (listarisultati.length){
			//evidenzia risultati
			for (ris of listarisultati) {
				idris = '#' + ris
				$(idris).addClass("font-weight-bold mark ")
	
			}
		}
		
	}

	function createSpanPeriodiTag(separator, catgramm, pos, sentenceid, elementoverso) {
		var spanoccorrenza = $('<span />')
		spanoccorrenza.attr('id', 'sep_'+pos)
		spanoccorrenza.attr('title', catgramm)
		spanoccorrenza.attr('class', sentenceid+' sentencetag')
		spanoccorrenza.append(separator+" ")
		if (separator==closeSTag){
			varsupel=$('<sup />')
			varsupel.append(sentenceid.split('_')[3]+' ')
			varsupel.appendTo(spanoccorrenza)
		}
		spanoccorrenza.css("display", "none")
		spanoccorrenza.appendTo(elementoverso)

	}
	
	function createSpanFormeNew(forma, catgramm, pos, sentenceid, clausefunct, elementoverso) {
		var spanoccorrenza = $('<span />')
		spanoccorrenza.attr('id', pos)
		//spanoccorrenza.attr('data-cg', catgramm)
		spanoccorrenza.attr('title', catgramm)
		spanoccorrenza.attr('class', sentenceid+" "+clausefunct+' '+formaClass)
		spanoccorrenza.append(forma+" ")
		
		spanoccorrenza.appendTo(elementoverso)

	}
	function createDivVersoNew(cantica, num, canto) {
		
			var elementoverso = createDivVersoGeneric(cantica, num, canto)
			
			elementoverso.appendTo('#' + cantica + canto)
			return elementoverso

	}
	
	function createDivVersoLI(cantica, num, canto) {
		
			var elementoverso = createDivVersoGenericLi(cantica, num, canto)
			let cantoContainer=$('#' + cantica + canto);
			elementoverso.appendTo(cantoContainer.find('ol'))
			return elementoverso

	}
	
	function createDivVersoGenericLi(cantica, num, canto) {
			let digits=num.length
			
			var spannum=$('<span />')
			
			if (digits==1)
				spannum.append('\xa0\xa0')
			if (digits==2)
				spannum.append('\xa0')
			spannum.append(num+'. ')
			var elementoverso = $('<li />')
			//var elementoverso=$('<p />')
			//elementoverso.append(spannum)
			elementoverso.attr("value", num)
			
			//elementoverso.attr("style", "line-height: 1.0em")

			elementoverso.attr('class', 'f6 mb-0 text-muted text-nowrap font-weight-lighter ')//+cantica+' '+canto)
			//elementoverso.attr('class', 'text-nowrap ')//+cantica+' '+canto)

			elementoverso.attr('id', cantica + "_" + canto + "_" + num)
			elementoverso.append('\xa0')
			return elementoverso
	}
	
	function createDivVersoGeneric(cantica, num, canto) {
			
			var elementoverso = $('<p />')
			
			var spannum=$('<span />')
			spannum.append(num + ". ")
	
			spannum.attr('class', 'numverso text-muted')
			elementoverso.append(spannum)
			//elementoverso.append(num + ". ")
			//elementoverso.attr("style", "line-height: 0.5em")

			elementoverso.attr('class', 'f6 mb-2 text-dark text-nowrap font-weight-lighter '+cantica+' '+canto)

			elementoverso.attr('id', cantica + "_" + canto + "_" + num)
			
			return elementoverso
	}
	
	
	function createAllDivCanti() {
		var cantiche=["Inferno", "Purgatorio","Paradiso"]
		var divFrasi = $('<div />')
		var divDialoghi = $('<div />')
		var divMetafore = $('<div />')
		
		//var titoloFrasi = $('<h4 class="titolo-canto pb-2" />')
		var titoloDialoghi = $('<h4 class="titolo-canto pb-2" />')
		var titoloMetafore = $('<h4 class="titolo-canto pb-2" />')

		//titoloFrasi.append("Frasi:");
		titoloDialoghi.append("Dialoghi:");
		titoloMetafore.append("Metafore:");

		divFrasi.attr('id', "vistaFrasi")
		divDialoghi.attr('id', "vistaDialoghi")
		divMetafore.attr('id', "vistaMetafore")
		
		divFrasi.appendTo('#displaycanto')
		divDialoghi.appendTo('#displaycanto')
		divMetafore.appendTo('#displaycanto')
		
		divFrasi.css("display", "none")
		divDialoghi.css("display", "none")
		divMetafore.css("display", "none")

		//titoloFrasi.appendTo(divFrasi)
		titoloDialoghi.appendTo(divDialoghi)
		titoloMetafore.appendTo(divMetafore)

		
		for (cantica of cantiche){
			for (var i=1; i<35; i++){
				if(i==34 && cantica!=="Inferno"){
					continue
				}
			canto= "Canto "+ i
			cantoRomano= "Canto "+ getRoman(i)

			var divcanto = $('<div />')
			var titolocanto = $('<h4 class="titolo-canto pb-2" />')
			titolocanto.append(cantica + ", " + cantoRomano)
			divcanto.attr('class', 'canto')
			divcanto.css("display", "none")

			divcanto.attr('id', (cantica + canto).replace(" ", "_"))
			titolocanto.appendTo(divcanto)
			//nuovo
			var olversi=$('<ol />')
			olversi.appendTo(divcanto)
			//fine nuovo
			divcanto.appendTo('#displaycanto')
			}
		}
	}

	//execute query
	
	async function executeQuerySearch(query) {
		seachbBindingsStream = await myEngine.queryBindings(query, { sources: [{ type: 'sparql', value: sparqlEndpoint },], });
		//console.log(query)
		alert(query)
		try {
			var result = new Set()
			var resultClauses = new Set()
			
			var resultsInCantica = []
			var resultsInCanto = []
			seachbBindingsStream.on('data', (binding) => {
				//cantica
				if (binding.has('Cantica'))
					cantica = binding.get('Cantica').value;
				else
					cantica='Nessuna'
				
				
				//canto
				if (binding.has('Canto'))
					canto = binding.get('Canto').value;
				else
					canto='Canto 0'
				
				//numero del verso
				if (binding.has('NumeroVerso'))
					numverso = binding.get('NumeroVerso').value;
				else
					numverso=0
				//posizione del frammento
				if (binding.has('pos'))
					pos = binding.get('pos').value;
				else{
					pos = 0;
				}
				
				//regione della clausola
				var clfrom=binding.get('clfr').value;
				var clto=binding.get('clto').value;
				var cltype=binding.get('clatype').value.replace('https://dantenetwork.it/ontology/syntit/current/','')
				var clfunction=binding.get('clafunction').value.replace('https://dantenetwork.it/ontology/syntit/current/','')
				//id del periodo
				var sentenceid=binding.get('sentence').value.replace('http://dantenetwork.it/data/commedia/','')
				
				if (pos>0 && !result.has(pos)){
					
					result.add(pos)
					resultsInCantica.push(cantica);
					resultsInCanto.push(cantica + canto)
				}
				resultClauses.add(sentenceid + "-" +clfrom+'-'+clto+"-"+clfunction.trim().replace('ordinateClause','').replace('MainClause', 'Ma')+'-'+cantica+'-'+canto)
				resultSentences.add(sentenceid)
	
			});
			seachbBindingsStream.on('end', () => {
				var resSent=new Set()
				//let minim=$(" .minimap__content")
				console.log('start rendering...')
				listarisultati = Array.from(result)
				var listaclausole=Array.from(resultClauses)

				cantiche = ["Inferno", "Purgatorio", "Paradiso"]
				listaPeriodiRisultato=[]
				listaClausoleRisultato=[]
				//Unità di ricerca è 'frase'
				if (!listarisultati.length || unitaRicerca == 'frase') {

					resultsInCantica = []
					resultsInCanto = []
					//listaPeriodiRisultato = []
					if (listaclausole.length) {
						for (var frase of listaclausole) {
							var fraseItems = frase.split('-');
							
							loadFrase(fraseItems[0].toString(), fraseItems[3].toString())
							/*
							for (var p = parseInt(fraseItems[1]); p < parseInt(fraseItems[2]) + 1; p++) {

								listarisultati.push(p)
							}
							*/
							if (!resSent.has(fraseItems[0] + '-' + fraseItems[3])) {
								
								resSent.add(fraseItems[0] + '-' + fraseItems[3])
								resultsInCantica.push(fraseItems[4]);
								resultsInCanto.push(fraseItems[4] + fraseItems[5])
								
							}	
						}
						listaClausoleRisultato=Array.from(resSent)
					}
				}
				//Unità di ricerca è 'periodo'
				if (unitaRicerca=='periodo' && listaclausole.length){
					resultsInCantica=[]
					resultsInCanto=[]
					//listaPeriodiRisultato=[]
					for (var frase of listaclausole){
						var fraseItems=frase.split('-');
						var mysid = '.' + fraseItems[0].toString()
						console.log(mysid)
						//$(mysid).addClass('font-italic')
						//$(mysid).addClass("font-weight-bold mark ")
						listaPeriodiRisultato.push(fraseItems[0].toString())
						loadPeriodo(fraseItems[0].toString())
						/*
						$(mysid).each(function(){
							//console.log('add id '+$(this).attr('id'));
							listarisultati.push($(this).attr('id'))
							
						});
						*/
						if (!resSent.has(fraseItems[0])){
							resSent.add(fraseItems[0])
							resultsInCantica.push(fraseItems[4]);
							resultsInCanto.push(fraseItems[4] + fraseItems[5])
						}
						
					}
					
					
				}
				
				if (listarisultati.length){
					//evidenzia risultati
					for (ris of listarisultati) {
						idris = '#' + ris
						$(idris).addClass("font-weight-bold mark ")
						minim.contents().find(idris).addClass("font-weight-bold mark ")
	
					}
				}
				
				
				//aggiunge badge con totale risultati accanto alle cantiche
				i = 0
				var totResultN=0;
				var listIcon = '<ion-icon name="list-outline"></ion-icon>';

				for (cantica of cantiche) {
					i += 1
					let count = resultsInCantica.reduce((n, x) => n + (x === cantica), 0);
					if (count>0){
						totResultN+=count
						var spanbadgecantica = $('<span />');
						spanbadgecantica.attr('class', 'badge badge-warning badge-pill mx-2');
						spanbadgecantica.append(count)
						spanbadgecantica.appendTo($('#cantica' + i + '-badge'))
						//$('#cantica' + i).after(spanbadgecantica)
					}
				}
				//aggiunge badge con totale risultati nel bottone lista risultati
				if (totResultN>0){
					$("#headingZero").closest('.card').attr('style', 'display: d-flex;')
					var spanbadgelista = $('<span />');
					spanbadgelista.attr('class', 'badge badge-primary badge-pill mx-2 lista-risultati');
					spanbadgelista.append(totResultN+listIcon)
					spanbadgelista.appendTo($('#cantica0-badge'))
				}
				//aggiunge badge con totale risultati accanto ai canti
				
				console.log('results end...')
				
				//console.log(sid)
				var $nctags= $(' .navig-canto')
		
		
				for (cantica of cantiche) {
					for (k of Array(35).keys()) {
						if (k == 0)
							continue
						let count = resultsInCanto.reduce((n, x) => n + (x === cantica + 'Canto ' + k), 0);
						if (count>0){
							var spanbadge = $('<span />');
							spanbadge.attr('class', cantobadgeclass);
							spanbadge.append(count)
							//spanbadge.appendTo($('[name="' + cantica + 'Canto ' + k + '"]'))
							spanbadge.appendTo($nctags.filter('[name="' + cantica + 'Canto ' + k + '"]'))
							//spanbadge.insertAfter($('[name="'+cantica+'Canto '+k+'"]'))
						}
					}
				}
				console.log('badge end...')

				//aggiorna minimap
				/*
				if (currentMinimap != '') {
					showMinimap()
				}
				*/

			});
			queryExecuted = true;
			$(cantoDisplayed).attr('style', 'display: d-flex;');
			$("#vistaFrasi").css("display", "none");
		}
		catch (err) {
			console.log(err.message);
		};

	};

/*
*	REGOLE DI PARSING PER VISUALIZZAZIONE CATEGORIE GRAMMATICALI 
*/

const categoriegrammaticali={"v":"Verbo", "s":"Sostantivo", "a":"Aggettivo", "p":"Pronome", "r":"Articolo", "b":"Avverbio","e":"Preposizione", 
								"c":"Congiunzione", "i":"Interiezione", "n":"Onomastica", "f":"Citazione", "l":"Locuzione", 
								"r-e":"Articolo, Preposizione", "b-v":"Avverbio, Verbo", "p-v":"Pronome, Verbo", 
								"b-p-v":"Avverbio, Pronome, Verbo", "b-p":"Avverbio, Pronome", 
								"e-p":"Preposizione, Pronome", "a-s":"Aggettivo, Sostantivo",
								"e-r":"Preposizione, Articolo", "v-b":"Verbo, Avverbio", "v-p":"Verbo, Pronome", 
								"v-p-b":"Verbo, Pronome, Avverbio", "p-b":"Pronome, Avverbio", 
								"p-e":"Pronome, Preposizione", "s-a":"Sostantivo, Aggettivo",}


var categoriegrammaticaliGrammar=`Expression = head:(Filtro){return 'Verbo,'+head.join()}
Filtro= fhead:("v")? tail:( transitivita? diatesi? impersonalita?
    						coniugazione? modotempo?
                            persona? funzione? declinazione?
                            genere? numero? grado?){return tail}
    

diatesi= [a|p] {if (text()=='a') return ' Attivo'; else return ' Passivo';}
    
transitivita=[i|t]? {if (text()=='t') return ' Transitivo'; else if (text()=='i') return ' Intransitivo';}

impersonalita=([*|+])? {if (text()=='*') return ' Impersonale'; else if (text()=='+')return ' Riflessivo';}

coniugazione=[1|2|3|4|5]? {switch(parseInt(text())){
							case(1): return ' Prima coniugazione';
                            case(2): return ' Seconda coniugazione';
                            case(3): return ' Terza coniugazione';
                            case(4): return ' Ausiliare essere'
                            case(5): return ' Ausiliare avere'}}
modotempo=modo:"ip" {return(' Presente indicativo')}/
			   "ib" {return(" Passato Prossimo Indicativo")}/
			   "ii" {return(" Imperfetto Indicativo")}/
              "ir" {return(" Passato Remoto Indicativo")}/
              "is" {return( " Trapassato Prossimo Indicativo")}/
              "it" {return( " Trapassato Remoto Indicativo")}/
              "if" {return(" Futuro Semplice Indicativo")}/
              "ia" {return(" Futuro Anteriore Indicativo")}/
              "cp" {return( " Presente Congiuntivo")}/
              "ci" {return( " Imperfetto Congiuntivo")}/
              "cr" {return( " Passato Congiuntivo")}/
              "ct" {return( " Trapassato Congiuntivo")}/
              "dp" {return( " Presente Condizionale")}/
              "dr" {return( " Passato Condizionale")}/
              "mp" {return( " Presente Imperativo")}/
              "fp" {return( " Presente Infinito")}/
              "fr" {return( " Passato Infinito")}/
              "pp" {return( " Presente Participio")}/
              "pr" {return( " Passato Participio")}/
              "gp" {return( " Presente Gerundio")}/
              "gr" {return( " Passato Gerundio")}/
              "pf" {return( " Participio Futuro")} 
persona="s1" {return(' Prima persona singolare')}/
		"s2" {return(' Seconda persona singolare')}/
        "s3" {return(' Terza persona singolare')}/
        "p1" {return(' Prima persona plurale')}/
        "p2" {return(' Seconda persona plurale')}/
        "p3" {return(' Terza persona plurale')}


funzione="a" {return(' Verbo Funzione Aggettivo')}/
		"sm" {return(' Verbo Funzione Sostantivo maschile')}/
        "sf" {return(' Verbo Funzione Sostantivo femminile')}/
        "b" {return(' Verbo Funzione Avverbio')}/
        "l" {return(' Verbo Funzione Locuzione')}


declinazione=[1|2|3|4|5] {switch(parseInt(text())){
							case(1): return ' Prima declinazione';
                            case(2): return ' Seconda declinazione';
                            case(3): return ' Terza declinazione';
                            case(4): return ' nd'
                            case(5): return ' nd'}}
                     
genere=[f|m] {if (text()=='f') return ' Femminile'; else if (text()=='m') return ' Maschile';}

numero=[s|p] {if (text()=='s') return ' Singolare'; else if (text()=='p') return ' Plurale';}

grado="c+" {return(' Grado c+ singolare')}/
		"c-" {return(' Grado c-')}/
        "c=" {return(' Grado c=')}

Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*

`

var categoriaGrammaticaleSostantivo = `
Expression = head:(Filtro){return 'Sostantivo,'+head.join()}
Filtro= fhead:("s")? tail:( genereforma? declinazionesostantivo? generelemma?
    						numersingolareplurale? locuzione?){return tail}
    

declinazionesostantivo= [1|2|3]? {switch(parseInt(text())){
							case(1): return ' Prima declinazione';
                            case(2): return ' Seconda declinazione';
                            case(3): return ' Terza declinazione'}}
    
genereforma=[m|f]? {if (text()=='m') return ' forma maschile'; else if (text()=='f') return ' forma femminile';}

generelemma=[m|f]? {if (text()=='m') return ' lemma maschile'; else if (text()=='f') return ' lemma femminile';}

numersingolareplurale=[s|p]? {if (text()=='s') return ' numero singolare'; else if (text()=='p') return ' numero plurale';}

locuzione="Iv" {return('In Locuzione verbo');}

Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*

`

var categoriaGrammaticalePreposizione = `
Expression = head:(Filtro){return 'Preposizione,'+head.join()}
Filtro= fhead:("e")? tail:( tipo1? tipo2? sintassi? complemento1? complemento2?){return tail}
    

tipo1=[p|i] {if (text()=='i') return ' Impropria'; else if (text()=='p') return ' Impropria';}
tipo2=modo:"a" {return(' Articolata')}/
			   "lx" {return(" In locuzione separata")}/
			   "l" {return(" In locuzione")} /
               "s" {return(" Semplice")}
               
sintassi=[sodbfcnutmezlpa] {if (text()=='s') return ' Soggettiva'; 
							if (text()=='o') return ' Oggettiva';
                            if (text()=='d') return ' Dichiarativa';
                            if (text()=='b') return ' Completiva obliqua';
                            if (text()=='f') return ' Finale';
                            if (text()=='c') return ' Causale';
                            if (text()=='n') return ' Concessiva';
                            if (text()=='u') return ' Consecutiva';
                            if (text()=='t') return ' Temporale';
                            if (text()=='m') return ' Modale';
                            if (text()=='e') return ' Eccettuativa';
                            if (text()=='z') return ' Esclusiva';
                            if (text()=='l') return ' Limitativa';
                            if (text()=='p') return ' Comparativa';
                            if (text()=='a') return ' Avversativa';}
                            
complemento1="ktd" {return(" Di tempo determinato")} /
               "ktc" {return(" Di tempo continuato")} /
               "kt" {return(' Di tempo')}/
			   "kdl" {return(" Di moto da luogo")} /
			   "kd" {return(" Di termine")}/
			   "kv" {return(" Di vantaggio")} /
               "ksl" {return(" Di stato in luogo")} /
               "ks" {return(" Di svantaggio")} /
               "kg" {return(" Di specificazione")} /
               "kml" {return(" Di moto a luogo")} /
               "km" {return(" Di modo")} /
               "kw" {return(" Di mezzo")} /
               "kc" {return(" Di compagnia")} /
               "ku" {return(" Di unione")} /
               "ka" {return(" Di allontanamento/separazione")} /
               "kz" {return(" Di materia")} /
               "kl" {return(" Di luogo")} /
               "ko" {return(" Di sostanza")} /
               "kpl" {return(" Di moto per luogo")} /
               "kps" {return(" Predicativa del soggetto")} /
               "kpo" {return(" Predicativa dell'oggetto")}
               
           
complemento2= 
    "kp" {return(" Di Limitazione")} /
    "kq" {return("  Di Qualità")} /
    "kr" {return("  Di Causa")} /
    "ki" {return("  Di Agente")} /
    "ke" {return("  Di Causa Efficiente")} /
    "kf" {return("  Di Fine Scopo")} /
    "ky" {return("  Di Paragone")} /
    "kx" {return("  Di Argomento")} /
    "kb" {return("  Distributivo")} /
    "kj" {return("  Di Sostituzione")} /
    "kn" {return("  Di Estensione")} /
    "k1b" {return("  Indiretta Benefattiva")} /
    "k1p" {return("  Indiretta Possessore")} /
    "k1o" {return(" Indiretta Oggetto")} /
    "k1d" {return(" Indiretta Dativo")} /
    "k1e" {return(" Indiretta Esperiente")} /
    "k2" {return(" Simmetrica")} /
    "k3" {return(" Di Pena")} /
    "k4" {return("  Di Effetto")} /
    "k5" {return("  Concessiv")} /
    "k6" {return(" Di Origine Provenienza")} /
    "k7" {return(" Di Abbondanza/Privazione")} /
    "k8" {return(" Partitiva")} /
    "k9" {return(" Di Denominazione")} /
    "k10" {return(" Di Colpa")} /
    "k11" {return(" Di Quantità")} /
    "k12" {return(" Di Peso")} /
    "k13" {return(" Di Esclusione")} /
    "k14" {return(" Di Rapporto")}

`
var avverbio = ` Expression = head:(Filtro){return 'Avverbio,'+head.join()}
Filtro= fhead:("b")? tail:( fake?  tipo?){return tail}
     
fake= ""

tipo="c+" {return(' Avverbio al Comparativo di Maggioranza')}/
        "c-" {return(' Avverbio al Comparativo di Minoranza')}/
        "sa" {return(' Avverbio al Superlativo Assoluto')}/
        "sr" {return(' Avverbio al Superlativo Relativo')}/
        "lz" {return(' Avverbio in Locuzione Separato')}/
        "l" {return(' Avverbio in Locuzione')}/
        "y" {return(' Avverbio Proclitico')}/
        "x" {return(' Avverbio Enclitico')}/
        "c" {return(' Avverbio al Comparativo di Uguaglianza')}


Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*

`

var pronome = `

Expression = head:(Filtro){return 'Pronome,'+head.join()}
Filtro= fhead:("p")? tail:(  tipo_pronome? classe_pronome? genere_pronome? 
		numero_pronome?  forma_pronome? funzione_pronome? tiporiflessivi?){return tail}
    

tipo_pronome= "p" {return(' Pronome Personale')}/
			  "f" {return(" Pronome Riflessivo")}/
			  "s" {return(" Pronome Possessivo")}/
              "d" {return(" Pronome Dimostrativo")}/
              "i" {return(" Pronome Indefinito")}/
              "r" {return(" Pronome Relativo")}/
              "t" {return(" Pronome Interrogativo")}/
              "e" {return(" Pronome Esclamativo")}/
              "n" {return(" Pronome Numerale")} 
    
classe_pronome=	"1" {return(" Prima Classe Persona")}/
              	"2" {return(" Seconda Classe Persona")}/
              	"3" {return(" Terza Classe Persona")} 

genere_pronome=	"m" {return(" Maschile")}/
              	"f" {return(" Femminile")}/
              	"n" {return(" Neutro")} 
numero_pronome=	"s" {return(" Singolare")}/
              	"p" {return(" Plurale")}
forma_pronome= 	"l" {return(" Pronome Libero")}/
              	"i" {return(" Pronome Libero In Composizione")}/
              	"y" {return(" Pronome Proclitico")}/
             	"x" {return(" Pronome Enclitico")} 
funzione_pronome="so" {return(' Libero Soggetto')}/
		"soi" {return(' Libero Soggetto Impersonale')}/
        "co" {return(' Libero Complemento')}/
        "ra" {return(' Libero Rafforzativo')}/
        "ac" {return(' Clitico Accusativo')}/
        "da" {return(' Clitico Dativo')}/
        "pt" {return(' Clitico Partitivo')}


tiporiflessivi="pr" {return(' Proprio')}/
		"le" {return(' Lessicalizzato')}/
        "im" {return(' Impersonale')}/
        "pa" {return(' Passivo')}/
        "re" {return(' Reciproco')}


Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*

`
var categoriaGrammaticaleAggettivo = `
Expression = head:(Filtro){return 'Aggettivo,'+head.join()}
Filtro= fhead:("a")? tail:(  tipo_aggettivo classe_aggettivo? genere_aggettivo? 
		numero_aggettivo? grado_aggettivo? tipo_complemento? tipo_frase? 
		oggetto_indiretto?){return tail}

tipo_aggettivo = 
		"i" {return(" Indefinito")}/
		"t" {return(" Interrogativo")}/
		"e" {return(" Esclamativo")}/
		"n" {return(" Numerale")}/
		"d" {return(" Dimostrativo")}/
		"r" {return(" Relativo")}/
		"s" {return(" Possessivo")}/
		"l" {return(" In locuzione")}/
		"" 	{return(" Qualificativo")} 

    
classe_aggettivo =	"1" {return(" Prima Classe")}/
              		"2" {return(" Seconda Classe")} 

genere_aggettivo=	"m" {return(" Maschile")}/
              		"f" {return(" Femminile")}/
              		"n" {return(" Neutro")} 
              	
numero_aggettivo=	"s" {return(" Singolare")}/
              		"p" {return(" Plurale")}
              	
grado_aggettivo = 	"c+" {return(" Comparativo Di Maggioranza")}/
					"c-" {return(" Comparativo Di Minoranza")}/
        			"c=" {return(" Comparativo Di Uguaglianza")}/
        			"sr" {return(" Superlativo Relativo")}/
        			"sa" {return(" Superlativo Assoluto")}        		
        
tipo_complemento ="xc10" {return(" Introdotto Da VERSO")}/
    	"xc11" {return(" Introdotto Da SOPRA")}/
    	"xc12" {return(" Introdotto Da SOTTO")}/
    	"xc13" {return(" Introdotto Da DINANZI")}/
      	"xc1"  {return(" Introdotto Da A")}/ 
    	"xc2"  {return(" Introdotto Da CON")}/
   		"xc3"  {return(" Introdotto Da CONTRO")}/
    	"xc4"  {return(" Introdotto Da DA")}/
   	 	"xc5"  {return(" Introdotto Da DI")}/
    	"xc6"  {return(" Introdotto Da IN")}/
    	"xc7"  {return(" Introdotto Da PER")}/
    	"xc8"  {return(" Introdotto Da SU")}/
    	"xc9"  {return(" Introdotto Da TRA")}/ 	
    	"xc"   {return(" Introdotto Da Preposizione")}/
    	"xo1"  {return(" Oggetto Ind")}/
    	"xo5"  {return(" Oggetto Ind Compl Con DI")}/
    	"xo"   {return(" Oggetto Ind Pronom")}
        


tipo_frase =
    "xf1" {return("Con Infinito Retto Da A")}/
    "xf2" {return("Con Infinito Retto Da DA")}/
    "xf3" {return("Con Infinito Retto Da DI")}/
    "xf4" {return("Con Infinito Retto Da PER")}/
    "xf5" {return("Con Infinito Retto Da SE")}/
    "xh1" {return("Con Subordinata All Indicativo")}/
    "xh2" {return("Con Subordinata Al Congiuntivo")}/
    "xz1" {return("In Locuzione Imp Infinito")}/
    "xz2" {return("In LocuzioneImp Che Indicativo")}/
    "xz3" {return("In Locuzione Imp Che Congiuntivo")}/
    "xz4" {return("In Locuzione Imp Se Indicativo")}/
    "xz5" {return("In Locuzione Imp Se Congiuntivo")}/
    "xz6" {return("In Locuzione Imp Come Indicativo")}/
    "xz7" {return("In Locuzione Imp Quando Indicativo")}/
    "xz8" {return("In Locuzione Imp Perché Congiuntivo")}/
    "xz9" {return("In Locuzione Imp A Infinito")}
        

oggetto_indiretto = 
        ",o" {return(" Con Oggetto Indiretto")}
        
        
Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*
		
`
var categoriaGrammaticaleArticolo = `

Expression = head:(Filtro){return 'Articolo,'+head.join()}
Filtro= fhead:("r")? tail:(  tipo? genere? numero?){return tail}

tipo = 
		"d" {return(" Determinativo")}/
		"i" {return(" Indeterminativo")} 

    

genere =	"m" {return(" Maschile")}/
             "f" {return(" Femminile")}
              	
numero =	"s" {return(" Singolare")}/
            "p" {return(" Plurale")}
 
        
Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*
		

`
var citazione = `
Expression = head:(Filtro){return 'Citazione,'+head.join()}
Filtro= fhead:("f") tail:(  fake? tipo?){return tail}

fake = ""
tipo="l" {return(' Citazione Latina')}/
        "p" {return(' Citazione Provenzale')}/
        "r" {return(' Citazione Francese')}/
        "s" {return(' Citazione Spagnola')}/
        "e" {return(' Citazione Ebraica')}/
        "g" {return(' Citazione Greca')}

Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*

`
	var onomastica = `Expression = head:(Filtro){return 'Onomastica,'+head.join()}
Filtro= fhead:("n") tail:(  proprio tipo?){return tail}

tipo="x" {return(' Separato')}/
        "t" {return(' Titolo')}
proprio = "p" {return("Nome Proprio")}

Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*
`
	var congiunzione = ` 
Expression = head:(Filtro){return 'Congiunzione,'+head.join()}
Filtro= fhead:("c") tail:(  tipo? cordinativasubordinativa? tipocoordinativa? 
		tiposubordinativa*  complementodue?){return tail}
    

tipo = "lx" {return(' LocuzioneSeparata')}/
			  "c" {return(" Composta")}/
			  "l" {return(" Locuzione")}/
              "s" {return(" Semplice")} 
    
cordinativasubordinativa =	"c" {return(" Coordinativa")}/
              	"s" {return(" Subordinativa")} 

tipocoordinativa =	"c" {return(" Copulativa")}/
              	"d" {return(" Disgiuntiva")}/              	
              	"a" {return(" Avversativa")}/              	
              	"n" {return(" Conclusiva")}/              	
              	"e" {return(" Esplicativa")}/      	
              	"r" {return(" Correlativa")} 
tiposubordinativa =	"s" {return(" Soggettiva")}/
              	"o" {return(" Oggettiva")}/
              	"d" {return(" Dichiarativa")}/              	
              	"b" {return(" Completiva Obliqua")}/              	
              	"i" {return(" Interrogativa")}/              	
              	"f" {return(" Finali")}/
              	"c" {return(" Causali")}/
              	"n" {return(" Concessiva")}/              	
              	"u" {return(" Consecutiva")}/              	
              	"t" {return(" Temporale")}/              	
              	"m" {return(" Modale")}/
              	"e" {return(" Eccettuativa")}/
              	"p" {return(" Comparativa")}/              	
              	"v" {return(" Condizionale")}/              	
              	"z" {return(" Esclusiva")}/              	
              	"l" {return(" Limitativa")} 
complementodue = 	
             	"x" {return(" Locuzione Separata")} 

Integer "integer"
  = _ [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"= " "*
`
//parser per categorie grammaticali
var parserVerbi = peg.generate(categoriegrammaticaliGrammar);
var parserSostantivi = peg.generate(categoriaGrammaticaleSostantivo);
var parserPreposizioni = peg.generate(categoriaGrammaticalePreposizione);
var parserAvverbi = peg.generate(avverbio);
var parserPronomi = peg.generate(pronome);
var parserAggettivi = peg.generate(categoriaGrammaticaleAggettivo);
var parserArticolo = peg.generate(categoriaGrammaticaleArticolo);
var parserCitazione = peg.generate(citazione);
var parserOnomastica = peg.generate(onomastica);
var parserCongiunzione = peg.generate(congiunzione);


});