/**
 * 
 */
var resetResult;
var lsentid;
var lisid;
const formaClass = 'frm'
var vistaPeriodi = false
var vistaDialoghi = false
var vistaRiferimenti = true
var listaPeriodiRisultato;
var listaClausoleRisultato;
var numeroContesti;
const hdnNamespace = 'http://dantenetwork.it/data/commedia/'
const syntitNamespace = 'https://dantenetwork.it/ontology/syntit/current/'

$(document).ready(function() {
	removeGraph = false;
	const dialogspeakers = {
		"Beatrice": "diaBeatrice",
		"Dante": "diaDante",
		"Virgilio": "diaVirgilio",
		"Cacciaguida": "diaCacciaguida",
		"san Bernardo": "diaSanBernardo"
	}
	const dialogaltri = 'diaAltri'
	var listaClausoleRisultatoContesti = []
	const cantobadgeclass = 'badge badge-outline-warning badge-pill'

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

	var shownSentenceList = new Set()

	listarisultati = [];
	listaPeriodiRisultato = [];
	listaClausoleRisultato = []
	var commentsArray = []
	var commentsJson = {}
	var resultSentences = new Set()
	const cantiche = ["Inferno", "Purgatorio", "Paradiso"]
	var loadedCanti = new Set();
	const openSTag = "{"
	const closeSTag = "}"

	var cantoDisplayed = "#InfernoCanto_1";
	var prevCantoDisplayed = "#InfernoCanto_1";
	var contextLength = 3;
	var showOffset = 30;
	var idCitazione = "citazioneFrase";
	
//	console.log(getAutoriFontiCitazioni())
//	console.log(getCommentatori())
	
	initCitazioni();

	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", false)
	const minim = $(" .minimap__content")


	$('#opzioniVista :checkbox').change(function() {
		changedOption = $(this)[0].id;
		switch (changedOption + "|" + this.checked) {
			case "visPeriodi|true":
				vistaPeriodi = true
				loadFrasi();
				break;
			case "visPeriodi|false":
				$("#vistaFrasi").css("display", "none");
				resetFrasi()
				vistaPeriodi = false
				break;
			case "visRiferimenti|true":
				vistaRiferimenti = true
				initCitazioni()
				$(cantoDisplayed).find(" .showcomments").each(function() {
					$(this).css("display", "inline-block");
				})
				//$(" .showcomments").css("display", "inline-block");
				minim.contents().find(" .showcomments").each(function() {
					$(this).css('display', 'inline-block');
				})

				break;
			case "visRiferimenti|false":
				$(cantoDisplayed).find(" .showcomments").each(function() {
					$(this).css("display", "none");
				})
				//$(".showcomments").css("display", "none");
				minim.contents().find(" .showcomments").each(function() {
					$(this).css('display', 'none');
				})
				const emptyNoteList = '<div class="card card-body well well-sm m-1 mt-2 p-0" id="noteCard0"><span class="p-3 text-muted bg-lida-vis small" style="opacity: 0.6;">Nessun commento visualizzato</span></div>';
				$('#displaynote').empty()
				$('#displaynote').append($(emptyNoteList))
				vistaRiferimenti = false
				break;
			case "visDialoghi|true":
				loadDialoghi();
				vistaDialoghi = true
				break;
			case "visDialoghi|false":
				$("#vistaDialoghi").css("display", "none");
				vistaDialoghi = false
				resetDialoghi()
				break;
			case "visMetafore|true":
				//loadMetafore();
				break;
			case "visMetafore|false":
				$("#vistaMetafore").css("display", "none");
		}
	});



	$(" ." + 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], ele.attr('class').split(' ')[0]); }),
			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() {

		var sentenceId = $(this).attr('class').split(' ')[0].replace('$', '')
		console.log('dblclick ' + lisid)
		if (shownSentenceList.has(sentenceId)) {
			resetSentenceStructure(sentenceId)
			shownSentenceList.delete(sentenceId)

		}
		else {
			//showSentenceStructure (sentenceId)
			shownSentenceList.add(sentenceId)


		}
	});


	$(" ." + formaClass).hover(function(idx, element) {

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


	/*
	* Espansione del contesto
	*/

	jQuery(document).delegate(' .espandiFrase, .riduciFrase', 'click', function() {
		if ($(this).hasClass("disabled")) {
			return;
		};
		var posizioniEspansione = []
		var cid = $(this).attr('id');
		var parcid = cid.split('_');
		var posVerso
		reit = '#versiFrase' + parcid[4]
		var expcontextLength = $(reit + " > li").length
		if (cid.includes('_er_')) {
			expcontextLength = contextLength
		} else {
			posVerso = $(reit).attr('posVerso')
			if (posVerso == 1) { // caso inizio o fine canto
				expcontextLength += contextLength;
			}
		}

		//svuoto la lista di versi
		$(reit).empty()
		//genero la nuova lista di versi 
		var versiContestoExp = getFormaContext(parseInt(parcid[3]), expcontextLength);
		var divVersoExp = ''
		var setVersicontestoExp = new Set()
		for (forma of versiContestoExp) {
			if (!setVersicontestoExp.has(forma.verso)) {
				divVersoExp = createDivVersoLI(forma.cantica+1, forma.verso, forma.canto)
				$(reit).append(divVersoExp)
				setVersicontestoExp.add(forma.verso)
			}
			createSpanFormeNew(forma.testo, forma.catg, 'e' + forma.posizione, forma.periodo, forma.funzperiodo, divVersoExp)
			posizioniEspansione.push('e' + forma.posizione)
		}

		if (cid.includes('_er_')) {
			///$("#"+cid).css("display", "none");
			$("#" + cid).removeClass("btn-outline-primary");
			$("#" + cid).addClass("btn-outline-secondary");
			$("#" + cid).addClass("disabled");
		}
		else {
			cid = cid.replace("ex", "er");
			///$("#"+cid).attr('style', 'display: d-flex;');
			$("#" + cid).removeClass("btn-outline-secondary");
			$("#" + cid).removeClass("disabled");
			$("#" + cid).addClass("btn-outline-primary");
		}


		//evidenzio risultato

		for (ris of listarisultati) {
			idris = '#e' + ris
			$(idris).addClass("font-weight-bold mark ")
		}

		//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('-')
				loadClausola(tmpid[0], tmpid[1], tmpid[2], tmpid[3])

			}
		}

		//aggiungo listeners

		//addFormaListenersInRisultato(posizioniEspansione)
		addFormaListenersInCanto()

		//disegno minimap, onlyContent = true
		drawMinimap('#vistaFrasi', true)
		//manageMM('#vistaFrasi')


	})


	/*
	 * Costruzione e visualizzazione del risultato in frasi.
	*/

	/*
	  * Costruzione e visualizzazione del risultato in frasi.
	*/

	//$.manageResultList(start, offset)
	var prevstart = -1
	var prevoffset = -1
	jQuery.manageResultList = function manageResultList(start, offset = showOffset) {

		if (offset == prevoffset && start == prevstart && cantoDisplayed == '#vistaFrasi')
			return
		console.log('Paginazione...')
		prevstart = start
		prevoffset = offset
		if (cantoDisplayed != '#vistaFrasi') {
			prevCantoDisplayed = cantoDisplayed;
			$(cantoDisplayed).css("display", "none");
			//visualizzo
			$("#vistaFrasi").attr('style', 'display: d-flex;');
			cantoDisplayed = "#vistaFrasi";
		}

		//listarisultati.sort(function(a, b){return a - b});
		showFrasi(start, offset)
		
		if (vistaPeriodi) {
			loadFrasi();
		}
		if (vistaDialoghi) {
			loadDialoghi();
		}
		addFormaListenersInCanto()
		drawMinimap('#vistaFrasi', false)

	}

	function countResultContexts() {
		var numeroRisultati = 0;
		if (listarisultati.length) {
			var ultimaPosizione = -1;
			for (risultato of listarisultati) {
				if (risultato <= ultimaPosizione) {
					continue;
				}
				numeroRisultati = numeroRisultati + 1;
				ultimaPosizione = getContextLastPosition(risultato, contextLength);
			}
			numeroContesti = numeroRisultati
			return (numeroRisultati)
		}


		if (listaClausoleRisultato.length) {
			numeroContesti = listaClausoleRisultatoContesti.length
			return (listaClausoleRisultatoContesti.length)
			/*var tempr = new Set()
			for (singleres of listaClausoleRisultato) {
				tempr.add(singleres.split('-')[0])
			}
			var myRis = []

			tempr.forEach(y => myRis.push(listaClausoleRisultato.filter(x => (x.split('-')[0] == y) && x.split('-').length > 1)))
			numeroContesti = myRis.length
			return (myRis.length)*/
		}
		numeroContesti = numeroRisultati
		return (numeroRisultati)
	}

	function getResInPage(startcont, endcont) {
		var res = [];
		var contaContesti = 0
		//console.log(listaClausoleRisultato)
		if (listarisultati.length) {
			var ultimaPosizione = -1;
			for (risultato of listarisultati) {
				if (risultato <= ultimaPosizione) {
					continue;
				}
				contaContesti = contaContesti + 1;
				if (contaContesti >= startcont && contaContesti < endcont) {
					res.push(risultato)
				}
				if (contaContesti > endcont)
					break;
				ultimaPosizione = getContextLastPosition(risultato, contextLength);
			}
			//ordino la lista dei risultati
			res.sort(function(a, b) { return a - b });
			return (res)
		}
		if (listaClausoleRisultatoContesti.length && !listarisultati.length ) {

			/*for (risultato of listaClausoleRisultatoContesti) {
				contaContesti = contaContesti + 1;
				if (contaContesti >= startcont && contaContesti < endcont) {
					res.push(risultato)
				}
				if (contaContesti > endcont)
					break;
			}*/
			for (i=startcont; i<=endcont; i++){
				res.push(listaClausoleRisultatoContesti[i])
			}
			//res.sort(function(a, b) { puno = a[0].split('-')[3]; pdue = b[0].split('-')[3]; return parseInt(puno) - parseInt(pdue) });
			return (res)
		}
		return (res)
	}

	function showFrasi(start, offset = showOffset) {
		var canto, numeroCantica;
		var divVerso;
		var elencoRisutati = $("#vistaFrasi");
		elencoRisutati.empty();

		var numeroRisultato = 0;
		var ultimaPosizione = 0;
		var numeroVersi;
		//const intsup = Math.min(start + offset, listarisultati.length)
		var resincontext = getResInPage(start, start + offset)

		for (let i = 0; i < resincontext.length; i++) {
			//risultato = listarisultati[i];
			risultato = resincontext[i];
			numeroRisultato++;

			if (!risultato.toString().includes('-') && risultato <= parseInt(ultimaPosizione)) {
				continue;
			}
			var versiContesto = ''
			var ctxpivot=0
			if (!Array.isArray(risultato)) {
				risultato = parseInt(risultato)
				versiContesto = getFormaContext(risultato, contextLength);
				ctxpivot=risultato
			}
			else{
				versiContesto = getFraseContext(risultato, contextLength);
				if(versiContesto.length){
					var tmind=Math.floor(versiContesto.length/2);
					ctxpivot=versiContesto[tmind]['posizione']
				}
			}
				

			var setVersicontesto = new Set()
			divVerso = ''
			numeroCantica = 0
			canto = 0
			//var titoloCanto = $('<h5 class="titolo-canto"/>')
			var versiIniziali = $('<div class="versiFrase mt-3" />')
			var listaVersi = $('<ol class="pt-3" />')

			listaVersi.attr('id', "Frase" + numeroRisultato);
			versiIniziali.attr('id', "versiFrase" + numeroRisultato);
			numeroVersi = 0;
			for (forma of versiContesto) {
				if (setVersicontesto.size == 0) {
					numeroCantica = forma.cantica
					canto = forma.canto
				}
				if (!setVersicontesto.has(forma.verso)) {
					divVerso = createDivVersoLI(forma.cantica + 1, forma.verso, forma.canto)
					versiIniziali.append(divVerso)
					listaVersi.append(versiIniziali)
					elencoRisutati.append(listaVersi)
					setVersicontesto.add(forma.verso)
					numeroVersi++;
				}
				createSpanFormeNew(forma.testo, forma.catg, 'e' + forma.posizione, forma.periodo, forma.funzperiodo, divVerso)
			}
			ultimaPosizione = forma.posizione;

			if (numeroVersi < contextLength + 1) {
				versiIniziali.attr('posVerso', 1); // inizio o fine canto
			} else {
				versiIniziali.attr('posVerso', 9999);
			}

			var comandi = $('<div class=" comandi col flex-nowrap d-inline justify-content-between pl-1 pb-2 ml-2 mb-2 border-bottom"/>')
			comandi.attr('id', "comandiFrase" + numeroRisultato)
			//comandi.attr('class', 'comandi col flex-nowrap d-inline justify-content-between pl-1 pb-2 ml-2 mb-2 border-bottom');

			var comandiGrp = $('<div />')
			comandiGrp.attr('class', 'btn-group flex-nowrap d-inline pr-3 mt-1 mr-3 align-text-bottom');
			comandiGrp.attr('role', "group")

			var spanBadgeExpand = $('<button class="btn btn-sm btn-outline-primary espandiFrase px-1 pt-1 pb-0"/>');
			var expandIcon = '<ion-icon name="expand-outline"></ion-icon>';
			//spanBadgeExpand.attr('class', 'btn btn-sm btn-outline-primary espandiFrase px-1 pt-1 pb-0');
			var spanBadgeReduce = $('<button class="btn btn-sm btn-outline-secondary riduciFrase px-1 pt-1 pb-0 ml-1 disabled"/>');
			var reduceIcon = '<ion-icon name="contract-outline"></ion-icon>';

			//spanBadgeReduce.attr('class', 'btn btn-sm btn-outline-secondary riduciFrase px-1 pt-1 pb-0 ml-1 disabled');

			//spanBadgeExpand.attr('id', getCantica(numeroCantica) + "Canto_ex_" + canto + "_" + risultato + "_" + numeroRisultato);
			spanBadgeExpand.attr('id', getCantica(numeroCantica) + "Canto_ex_" + canto + "_" + ctxpivot + "_" + numeroRisultato);
			spanBadgeExpand.append(expandIcon);

			spanBadgeReduce.attr('id', getCantica(numeroCantica) + "Canto_er_" + canto + "_" + ctxpivot + "_" + numeroRisultato);
			spanBadgeReduce.append(reduceIcon)

			spanBadgeExpand.appendTo(comandiGrp);
			spanBadgeReduce.appendTo(comandiGrp);

			comandiGrp.appendTo(comandi);


			var citazioneDiv = $('<div class=" text-right flex-nowrap d-inline ml-3 px-3 py-0"/>')
			//citazioneDiv.attr('class', ' text-right flex-nowrap d-inline ml-3 px-3 py-0');
			var citazione = $('<span class= " pl-3 citazioneFrase align-text-top"/>')
			citazione.append("[" + getCantica(numeroCantica) + ", Canto " + getRoman(canto) + "]")
			//citazione.attr('class', ' pl-3 citazioneFrase align-text-top');
			citazione.attr('name', getCantica(numeroCantica) + "Canto " + canto);
			citazione.attr('id', idCitazione + '_' + numeroRisultato + '_' + risultato);
			citazione.appendTo(citazioneDiv);

			citazioneDiv.appendTo(comandi);

			comandi.appendTo(elencoRisutati);

		}

		//evidenzio resultati

		for (ris of listarisultati) {
			idris = '#e' + ris
			$(idris).addClass("font-weight-bold mark ")
		}

		//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])
				loadClausola(tmpid[0], tmpid[1], tmpid[2], tmpid[3])

			}
		}


	}

	jQuery(document).delegate('.navig-canto, .citazioneFrase', 'click', function(e) {
		resetFrasi()

		//nasconde vista risultati
		$("#vistaFrasi").css("display", "none");

		//rimuove il grafo sintattico se c'è'
		resetGraphStruct()
		emptyStructCard()
		

		$(cantoDisplayed).css("display", "none");

		const cid = $(this).attr('name').replace(" ", "_");

		cantoDisplayed = "#" + cid;
		if (vistaRiferimenti)
			initCitazioni()
		var parcid = cid.split('_')

		if (!(loadedCanti.has(cid))) {
			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(" ", "_"), false)

		console.log(vistaPeriodi)
		if (vistaPeriodi) {
			loadFrasi();
		}
		if (vistaDialoghi) {
			loadDialoghi();
		}

		addFormaListenersInCanto();

		//se si sta arrivando al canto da un link della lista risultati 
		const callerid = $(this).attr('id');
		if (callerid != null && callerid.startsWith(idCitazione)) {
			const mypos = callerid.split('_')[2]
			latestPhraseId = callerid.split('_')[0].replace("citazione", "") + callerid.split('_')[1];
			$("#collapse" + parcid[0].replace("Canto", "")).collapse('show');
			document.getElementById(mypos).scrollIntoView({
				behavior: "smooth",
			});

		}


	});


	//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 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], ele.attr('class').split(' ')[0]); }),
				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) {

				var 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 getNumCurrentCantica() {

		var mcanto = cantoDisplayed.replace("#", '')
		var cantica = ''
		if (mcanto.startsWith('Inf'))
			cantica = '1'
		if (mcanto.startsWith('Pur'))
			cantica = '2'
		if (mcanto.startsWith('Par'))
			cantica = '3'

		return (cantica + '_' + mcanto.split('_')[1])
	}

	function loadPeriodo(idperiodo) {



		if (!isPeriodoInCanto(idperiodo, cantoDisplayed) && !(cantoDisplayed.includes('#vistaFrasi'))) {
			return
		}

		$(cantoDisplayed).find(' .' + idperiodo).each(function() {
			var pstp = $(this).attr('class').split(" ")[1]
			if (pstp == 'sentencetag')
				$(this).attr('style', 'display: d-flex;');
			//$(this).css('color', colorssp(mapsynttypestopalette[pstp]));
		})

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

	function isPeriodoInCanto(idperiodo, canto) {
		datiperiodo = idperiodo.split('_')
		daticanto = canto.split('_')
		canticaprd = datiperiodo[0]
		cantoprd = datiperiodo[1]
		if (canticaprd == '1' && daticanto[0].includes('Inferno'))
			return (cantoprd == daticanto[1])
		if (canticaprd == '2' && daticanto[0].includes('Purgatorio'))
			return (cantoprd == daticanto[1])
		if (canticaprd == '3' && daticanto[0].includes('Paradiso'))
			return (cantoprd == daticanto[1])
		return false
	}

	/*function loadFrase(idperiodo, funzionefrase) {

		if (!isPeriodoInCanto(idperiodo, cantoDisplayed))
			return

		$(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 loadClausola(idperiodo, funzionefrase, fromn, ton) {

		if (!isPeriodoInCanto(idperiodo, cantoDisplayed) && !(cantoDisplayed.includes('#vistaFrasi')))
			return

		$(cantoDisplayed).find(' .' + idperiodo).each(function() {
			var vid = parseInt($(this).attr('id').replace('e', ''))
			if (vid >= parseInt(fromn)
				&& vid <= parseInt(ton)) {
				var pstp = $(this).attr('class').split(" ")[1]

				if (pstp.trim() == funzionefrase)
					$(this).css('color', colorssp(mapsynttypestopalette[pstp]));
			}

		})

		minim.contents().find(' .' + idperiodo).each(function() {
			var vid = parseInt($(this).attr('id').replace('e', ''))
			if (vid >= parseInt(fromn)
				&& vid <= parseInt(ton)) {
				var mpstp = $(this).attr('class').split(" ")[1]
				if (mpstp.trim() == funzionefrase)
					$(this).css('color', colorssp(mapsynttypestopalette[mpstp]));
			}

		})
	}


	function loadDialoghi() {
		var aca = '3'
		if (cantoDisplayed.includes('Inferno'))
			aca = '1'
		if (cantoDisplayed.includes('Purgatorio'))
			aca = '2'
		for (const india in dialoghi) {
			//console.log(dialoghi[india]['Cnt'].replace('_so',''))
			var diaclass = dialoghi[india]['Cnt'].replace('_so', '')
			var authclass = dialoghi[india]['Cnt'];
			if (diaclass.split('_')[1] != cantoDisplayed.split('_')[1])
				continue;
			if (diaclass.split('_')[0] != aca)
				continue;
			var csscl = dialogaltri
			if (dialoghi[india]['Spna'] in dialogspeakers) {
				csscl = dialogspeakers[dialoghi[india]['Spna']]
			}


			$(cantoDisplayed).find(' .' + diaclass).each(function() {
				$(this).addClass(csscl)

			})
			$(cantoDisplayed).find(' .' + authclass).each(function() {
				//$(this).addClass(csscl)
				$(this).attr('style', 'display: d-flex;');

			})
			minim.contents().find(' .' + diaclass).each(function() {
				$(this).addClass(csscl)

			})

		}
		emphResults()
	}
	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 resetDialoghi() {

		for (mk in dialogspeakers) {
			//console.log (mk+' '+dialogspeakers[mk])
			$(cantoDisplayed).find(' .' + dialogspeakers[mk]).each(function() {
				$(this).removeClass(dialogspeakers[mk]);
			})
			minim.contents().find(' .' + dialogspeakers[mk]).each(function() {
				$(this).removeClass(dialogspeakers[mk]);
			})
		}
		$(cantoDisplayed).find(' .' + dialogaltri).each(function() {
			$(this).removeClass(dialogaltri);
		})
		minim.contents().find(' .' + dialogaltri).each(function() {
			$(this).removeClass(dialogaltri);
		})
		emphResults()
	}

	function resetFrasi() {

		$(cantoDisplayed).find(' .sentencetag').each(function() {
			$(this).css('display', 'none');
		})


		$(cantoDisplayed).find(' .' + formaClass).each(function() {
			//console.log(colorssp(mapsynttypestopalette[stp]))
			$(this).css('color', '');
			$(this).removeClass('font-weight-bold')
		})

		minim.contents().find(" .sentencetag").each(function() {
			$(this).css('display', 'none');
		})
		minim.contents().find(' .' + formaClass).each(function() {
			$(this).css('color', '');
			$(this).removeClass('font-weight-bold')
		})


		//cancello il grafo sintattico
		resetGraphStruct()
		emptyStructCard()
		emphResults()
	}
	//visualizzazione risultati
	function emphResults() {

		//evidenzio i periodi se unità di ricerca è impostato come periodo
		if (listaPeriodiRisultato.length) {
			for (msid of listaPeriodiRisultato) {
				//if (isPeriodoInCanto(msid, cantoDisplayed))
				loadPeriodo(msid)

			}

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

	}
	/*INIZIO GESTIONE CITAZIONI*/

	function initCitazioni() {
		//"#InfernoCanto_1"
		//console.log('VISTA CITAZIONI!')
		var mcanto = cantoDisplayed.replace("#", '')
		cantica = ''
		if (mcanto.startsWith('Inf'))
			cantica = 'Inferno'
		if (mcanto.startsWith('Pur'))
			cantica = 'Purgatorio'
		if (mcanto.startsWith('Par'))
			cantica = 'Paradiso'
		canto = mcanto.split('_')[1]
		if (canto.length == 1)
			canto = '0' + canto

		//		commentsArray = getVersiConCitazioni(cantica, canto)
		commentsJson = getVersiConCitazioniJson(cantica, canto)

	}



	function removeHtmlTags(value) {
		var text = value;
		if (text != null) {
			text = text.replace(/<(.|\n)*?>/g, '');
			text = text.replace("&laquo;", "");
			text = text.replace("&raquo;", "");
			text = text.replace(/\&nbsp;/g, ' ');
			text = text.replace(/[\r\n]+/gm, ' ');
			return text;
		}
	}

	jQuery(document).delegate(' .showcomments', 'click', function() {
		var cid = $(this).attr('id');
		if (!hasCommentsJson(cid)) {
			return
		}
		var parcid = cid.split('_')
		var cantica;
		switch (parcid[1]) {
			case "1": cantica = "Inferno";
				break;
			case "2": cantica = "Purgatorio";
				break;
			case "3": cantica = "Paradiso";
		}
		var commentArea = $('#displaynote');
		commentArea.empty()
		if ($('#noteCard0').length) {
			$("#noteCard0")[0].remove();
		}
		var id = cid.substr(9);
		var collapseNote;
		var gruppoVersi;
		var versText = "";
		//var saveVersoCitazione = "";
		var allGrouplKeys = Object.keys(commentsJson);
		var currentGroup;

		allGrouplKeys.sort().some(function(k) {
			if (k == id || ~k.indexOf(id + '-')) {
				//console.log('gruppo commenti '+k)
				console.log(commentsJson[k].length)
				gruppoVersi = k.split("_").slice(-1)[0]
				if (gruppoVersi.includes("-")) {
					versText = ", Versi " + gruppoVersi;
				} else {
					versText = ", Verso " + gruppoVersi;
				}
				currentGroup = createNoteGroup(cantica, getRoman(parcid[2]), versText, k, commentsJson[k].length)
				commentsJson[k].forEach(function(value, i) {
					currentGroup.append(createNoteEntry(value, k, i))
				});
				commentArea.append(currentGroup);
			}
			$('#tab-list #vis0-tab').tab('show')
		})

	})

	function createNoteGroup(cantica, canto, versi, id, len) {
		var noteGroupCard = $('<div class="card card-body noteCardGroup well well-sm mx-1 my-2 p-0" id="noteGroupCard' + id + '">');
		var commentHeader = $('<div class="d-flex align-content-start flex-nowrap text-muted" id="commentoGruppoVersi' + id + '">')
		var rigaNota = $('<div class="p-0 m-0">');
		var buttons = $('<div class="d-flex flex-wrap-reverse ml-auto align-items-center justify-content-end px-1 pt-1 pb-0">')
		var closeButton = $('<button id="closeNote' + id + '"' +
			'class="btn btn-sm btn-outline-warning btn-outline-warning-mod closeNote rounded text-warning align-self-end px-1 pb-0 ml-1 mb-1">' +
			'<ion-icon name="close-circle"></ion-icon>');
		closeButton.appendTo(buttons);
		if (len > 1) {
			var commentiSP = " commenti su "
		} else {
			var commentiSP = " commento su "
		}
		//noteGroupCard.append('<h6 class="card-title m-2 text-warning">' + cantica + ", Canto " + canto + versi + "</h6>");
		rigaNota.append('<h6 class="card-title m-2 text-warning"><span class="badge badge-warning badge-pill mx-1">' + len + "</span>" + commentiSP + cantica + ", Canto " + canto + versi + "</h6>");
		rigaNota.appendTo(commentHeader);
		buttons.appendTo(commentHeader);
		commentHeader.appendTo(noteGroupCard);

		return noteGroupCard;
	}

	function createNoteEntry(comments, id, pos) {
		var noteCard = $('<div class="card card-body well well-sm mx-1 mb-1 mt-0 p-0 border-lida08" id="noteCard' + id + '_' + pos + '">');
		//var noteCard = $('<div class="card card-body well well-sm m-1 mt-2 p-0" id="noteCard' + id + '">');			
		//var collapseCardBody = $('<div class="card-body px-0 py-2 mx-1 mb-1 mt-0 border-top rounded" >');
		var collapseCardBody = $('<div class="card-body px-0 py-1 mx-3 my-0 border-top rounded" >');
		var divCampiSingoli = $('<div class="d-flex align-content-start flex-wrap text-muted">');
		//createNoteHeader(noteCard, comments, id, pos, cantica, parcid, saveVersoCitazione);			
		createNoteHeader(noteCard, comments, id, pos);

		collapseNote = $('<div class="collapse show">');
		collapseNote.attr('id', "collapseNote" + id + '_' + pos)

		if (comments.TestoFonteCitazione != null && comments.TestoFonteCitazione != "nan") {
			createModule(collapseCardBody, "Testo della fonte: ", removeHtmlTags(comments.TestoFonteCitazione), "1", id, pos)
		}
		if (comments.NaturaRiferimento != null) {
			createDivSingola(divCampiSingoli, "Tipo di riferimento: ", comments.NaturaRiferimento, false)
			divCampiSingoli.appendTo(collapseCardBody);
			if (comments.NaturaRiferimento == "CITAZIONE" || comments.NaturaRiferimento == "LOCI PARALLELI") {
				if (comments.TipoCitazione != null && comments.TipoCitazione != "") {
					createDivSingola(divCampiSingoli, "Tipo citazione: ", comments.TipoCitazione, false)
					divCampiSingoli.appendTo(collapseCardBody);
				}
				appendSpecifica(comments, divCampiSingoli, collapseCardBody)
			}
		}
		if (comments.RapportoSoggettoOggetto != null) {
			createDivSingola(divCampiSingoli, "Rapporto testo/fonte: ", comments.RapportoSoggettoOggetto, false)
			divCampiSingoli.appendTo(collapseCardBody);
		}
		if (comments.RapportoCommentoCommentatoreText != null && comments.RapportoCommentoCommentatoreText != "nan") {
			createModuleCommentatore(collapseCardBody, comments.RapportoCommentoCommentatoreText, "5", id, pos)
		}
		if (comments.frammentoNota != null && comments.frammentoNota != "nan" && comments.annotazione != null && comments.annotazione != "nan") {
			createModuleFrammAnnot(collapseCardBody, removeHtmlTags(comments.frammentoNota), removeHtmlTags(comments.annotazione), "6", id, pos)
		} else {
			if (comments.frammentoNota != null && comments.frammentoNota != "nan") {
				createModule(collapseCardBody, "Nota: ", removeHtmlTags(comments.frammentoNota), "6", id, pos)
			}
			if (comments.annotazione != null && comments.annotazione != "nan") {
				createModule(collapseCardBody, "Nota completa: ", removeHtmlTags(comments.annotazione), "7", id, pos)
			}
		}
		if (comments.NotaFonteCitazione != null && comments.NotaFonteCitazione != "nan" && comments.NotaFonteCitazione != "") {
			createModule(collapseCardBody, "Nota dell'annotatore: ", comments.NotaFonteCitazione, "8", id, pos)
		}
		collapseCardBody.appendTo(collapseNote);
		collapseNote.appendTo(noteCard);
		return noteCard;
	}


	function appendSpecifica(commenti, cardBody, collapseCard) {
		var specifica = "";

		if (commenti.CitEpisodi != null && commenti.CitEpisodi != "") {
			specifica = commenti.CitEpisodi;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Episodio (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
		if (commenti.CitImmagini != null && commenti.CitImmagini != "") {
			specifica = commenti.CitImmagini;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Immagine (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
		if (commenti.CitTeorie != null && commenti.CitTeorie != "") {
			specifica = commenti.CitTeorie;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Teoria (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
		if (commenti.CitMotivi != null && commenti.CitMotivi != "") {
			specifica = commenti.CitMotivi;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Motivo (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
		if (commenti.CitStilemi != null && commenti.CitStilemi != "") {
			specifica = commenti.CitStilemi;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Stilema (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
		if (commenti.CitTopografie != null && commenti.CitTopografie != "") {
			specifica = commenti.CitTopografie;
			createDivSingola(cardBody, "Contenuto del riferimento: ", "Topografia (" + specifica, true)
			cardBody.appendTo(collapseCard);
		}
	}

	function createNoteHeader(noteCardX, comments, id, pos) { //, cantica, parcid, versoCitazionePrecedente){
		var nomeAutore = "";
		var titoloFonte = "";
		var luogoFonte = "";
		var commentHeader = $('<div class="d-flex align-content-start flex-nowrap text-muted" id="commentoVerso' + id + '_' + pos + '">')
		var rigaNota = $('<div class="px-3 py-1 m-0">');
		var buttons = $('<div class="d-flex flex-wrap-reverse ml-auto align-items-center justify-content-end p-1">')
		var collapseButton = $('<button id="collapseBtnNote' + id + '_' + pos + '"' +
			'class="btn btn-sm btn-outline-primary bg-light collapseNote border rounded text-primary align-self-end px-1 pb-0"' +
			'data-toggle="collapse" data-target="#collapseNote' + id + '_' + pos + '"' +
			'aria-expanded="true" aria-controls="collapseNote' + id + '_' + pos + '">' +
			'<ion-icon name="archive"></ion-icon>');
		//var closeButton = $('<button id="closeNote'+id+ '_' + pos +'"'+
		//		'class="btn btn-sm btn-outline-primary bg-light closeNote border rounded text-primary align-self-end px-1 pb-0 ml-1 mb-1">'+
		//		'<ion-icon name="close-circle"></ion-icon>');
		collapseButton.appendTo(buttons);
		//closeButton.appendTo(buttons);

		if (comments.commentario != null) {
			rigaNota.append('<b>Commentatore:</b> <i>' + comments.commentario + '</i><br>');
		}


		if (comments.NomeAutoreCitazione == null) {
			nomeAutore = 'riferimento';
		}
		else {
			nomeAutore = comments.NomeAutoreCitazione;
		}
		if (comments.AutoreCitazione != null) {
			rigaNota.append('<b>Autore della fonte:</b><a href="' + comments.AutoreCitazione + '" target="_blank"> <i>' + nomeAutore + '</i> </a>');
		} else {
			rigaNota.append('<b>Autore della fonte:</b> <i>' + nomeAutore + '</i>');
		}
		if (comments.TitoloFonteCitazione == null) {
			titoloFonte = "riferimento";
		} else {
			titoloFonte = comments.TitoloFonteCitazione;
		}
		if (comments.FonteCitazione != null) {
			rigaNota.append('&nbsp;<b>Fonte:</b> <a href="' + comments.FonteCitazione + '" target="_blank"><i> ' + titoloFonte + '</i> </a>');
		} else {
			rigaNota.append('&nbsp;<b>Fonte:</b><i> ' + titoloFonte + '</i>');
		}
		if (comments.LuogoFonteCitazione == null) {
			luogoFonte = "riferimento";
		} else {
			luogoFonte = comments.LuogoFonteCitazione;
		}
		if (comments.URLFonteCitazione != null) {
			rigaNota.append('&nbsp;<b>Coordinate della fonte:</b><a href="' + comments.URLFonteCitazione + '"target="_blank"><i> ' + luogoFonte + '</i></a><br>');
		} else {
			rigaNota.append('&nbsp;<b>Coordinate della fonte:</b><i> ' + luogoFonte + '</i><br>');
		}
		rigaNota.appendTo(commentHeader);
		buttons.appendTo(commentHeader);
		commentHeader.appendTo(noteCardX);
	}

	function createDivSingola(divCampi, campo, valore, specifica) {
		//var divSingola = $('<div class="px-3 py-1">');
		var divSingola = $('<div class="pl-0 pr-3 py-1">');
		if (specifica) {
			valore = valore.trim();
			divSingola.append('<b>' + campo + '</b><i>' + valore + ')</i>');
		} else {
			divSingola.append('<b>' + campo + '</b><i>  ' + valore + '</i>');
		}
		divSingola.appendTo(divCampi);
	}

	function createModule(collapse, label, testo, num, id, pos) {
		var minLength = (($('#displaynote').width() / ($('#Test').width() / 32)) * 2 * 1.63);
		var divContent = $('<div class="text-muted p-0">');
		//var divContent = $('<div class="d-flex align-content-start flex-wrap text-muted">');
		//var divTesto = $('<div class="px-3 py-1">')
		var nota = '<b>' + label + '</b><span class="blog-main-16">' + testo + '</span>';
		//divTesto.append(nota);
		//divContent.append(divTesto);
		divContent.append(nota);
		if (($('<textarea />').html(testo).text().length + label.length + 2) > minLength) {
			//console.log((testo.length + label.length +2) +" "+($('#displaynote').width() / $('#Test').width() * 2 * 32))
			var divModule = $('<div class="module pb-0">');
			var divNote = $('<div class="collapse" id="collapse' + num + 'Note' + id + '_' + pos + '" aria-expanded="false">')
			divModule.append('<a class="read-more collapsed" data-toggle="collapse" href="#collapse' + num + 'Note' + id + '_' + pos + '" role="button"></a>')
			divNote.append(divContent)
			divModule.append(divNote);

		} else {
			var divModule = $('<div class="py-1">');
			divModule.append(divContent);
		}
		divModule.appendTo(collapse);
	}

	function createModuleCommentatore(collapse, commento, num, id, pos) {

		let tmpcomm = '[' + commento + ']'
		let jsonCommento = JSON.parse(tmpcomm.replaceAll("'", '"').replaceAll("+", '"'));
		var minLength = (($('#displaynote').width() / ($('#Test').width() / 32)) * 2 * 1.63);
		var divContent = $('<div class="d-flex align-content-start flex-wrap text-muted">');
		var divTesto = $('<div class="pl-0 pr-3 py-1">')
		var nota = '';
		var lenmod = 0
		for (el in jsonCommento) {
			var urlCommento = jsonCommento[el].Commento;

			var esitoCommento = jsonCommento[el].Rapporto;

			var autoreCommento = jsonCommento[el].Autore
			if (autoreCommento == "") {
				autoreCommento = "Commento"
			}
			if (esitoCommento == "") {
				esitoCommento = "Rapporto nullo"
			}
			if (nota.length > 0) {
				nota = nota + ' - '
			}
			if (urlCommento == "") {
				//nota = '<b>Rapporto commento/commentatore: </b>'+esitoCommento+' Commento nullo, '+'</b><br>';
				nota = nota + '<i>' + esitoCommento + ' Commento nullo' + '</i>'//+'<br>';
			} else {
				//nota = '<b>Rapporto commento/commentatore: </b><i>'+esitoCommento +' <a href="'+urlCommento+'"target="_blank">' + autoreCommento+ '</i></a> ' +  '</b><br>';
				nota = nota + '<i>' + esitoCommento + ' <a href="' + urlCommento + '"target="_blank">' + autoreCommento + '</i></a>' //+ '</b><br>';
			}
			lenmod = lenmod + esitoCommento.length + autoreCommento.length
			//divTesto.append(nota);

		}
		nota = '<b>Rapporto commento/commentatore:</b> ' + nota
		divTesto.append(nota);
		divContent.append(divTesto);
		var divModule = $('<div class="module py-1">');
		divModule.append(divContent);
		divModule.appendTo(collapse);
	}

	function createModuleFrammAnnot(collapse, testo1, testo2, num, id, pos) {
		var minLength = (($('#displaynote').width() / ($('#Test').width() / 32)) * 2 * 1.63);
		var divFrammAnnot = $('<div class="py-1">');
		var divContent1 = $('<div class="text-muted p-0">');
		var divContent2 = $('<div class="text-muted p-0">');
		var uniqueIdMulti1 = 'coll' + num + 'SN' + id + '_' + pos;
		var uniqueIdMulti2 = 'coll' + num + 'CN' + id + '_' + pos;
		var divMultiCollapse1 = $('<div class="collapse multi-collapse' + id + '_' + pos + ' show text-muted p-0" id="' + uniqueIdMulti1 + '">');
		var divMultiCollapse2 = $('<div class="collapse multi-collapse' + id + '_' + pos + ' text-muted p-0" id="' + uniqueIdMulti2 + '">');
		var label1 = '<b>Nota / <a href="" data-toggle="collapse" data-target=".multi-collapse' + id + '_' + pos + '" aria-controls="' + uniqueIdMulti1 + ' ' + uniqueIdMulti2 + '">Nota completa</a>: </b>'
		var label2 = '<b><a href="" data-toggle="collapse" data-target=".multi-collapse' + id + '_' + pos + '" aria-controls="' + uniqueIdMulti1 + ' ' + uniqueIdMulti2 + '">Nota</a> / Nota completa: </b>'
		var nota1 = '<span class="blog-main-16">' + testo1 + '</span>';
		var nota2 = '<span class="blog-main-16">' + testo2 + '</span>';

		divFrammAnnot.append(divMultiCollapse1);
		divFrammAnnot.append(divMultiCollapse2);
		divContent1.append(label1 + nota1);
		divContent2.append(label2 + nota2);

		if (($('<textarea />').html(testo1).text().length + 23) > minLength) {
			var divModule1 = $('<div class="module pb-0">');
			var divNote1 = $('<div class="collapse" id="collapse' + num + 'Note' + id + '_' + pos + '" aria-expanded="false">')
			divModule1.append('<a class="read-more collapsed" data-toggle="collapse" href="#collapse' + num + 'Note' + id + '_' + pos + '" role="button"></a>')
			divNote1.append(divContent1)
			divModule1.append(divNote1);
			divMultiCollapse1.append(divModule1);
		} else {
			divMultiCollapse1.append(divContent1);
		}

		if (($('<textarea />').html(testo2).text().length + 23) > minLength) {
			var divModule2 = $('<div class="module pb-0">');
			var divNote2 = $('<div class="collapse" id="collapse' + num + 'Note' + (id + 1) + '_' + pos + '" aria-expanded="false">')
			divModule2.append('<a class="read-more collapsed" data-toggle="collapse" href="#collapse' + num + 'Note' + (id + 1) + '_' + pos + '" role="button"></a>')
			divNote2.append(divContent2);
			divModule2.append(divNote2);
			divMultiCollapse2.append(divModule2);
		} else {
			divMultiCollapse2.append(divContent2);
		}

		divFrammAnnot.appendTo(collapse);
	}

	/*	function hasComments(cid) {
			var id = cid.substr(9);
			for (var pos in commentsArray) {
				var comments = commentsArray[pos]
				if (comments.verso == id) {
					//console.log(comments)
					return (true)
				}
			}
			return false;
		}*/

	function hasCommentsJson(cid) {

		//return commentsJson.hasOwnProperty(cid.substr(9));
		var id = cid.substr(9);
		for (const [key, value] of Object.entries(commentsJson)) {
			if (key == id || key.startsWith(id + '-'))
				return true
		}
		return false

	}

	/*	function numberOfComments(cid) {
			var id = cid.substr(9);
			return commentsArray.filter(x => x.verso == id).length
		}
	*/
	function numberOfCommentsJson(cid) {
		var cntc = 0
		var id = cid.substr(9);
		for (const [key, value] of Object.entries(commentsJson)) {
			if (key == id || key.startsWith(id + '-'))
				cntc += commentsJson[key].length
		}
		return cntc
	}

	/*FINE GESTIONE CITAZIONI*/

	function getCantica(numeroCantica) {

		return (cantiche[numeroCantica])
	}

	//Calcola lemma e categoria grammaticale oppure categoria sintattica per tooltip

	function formatTTContent(categ, syntType, sentId) {


		var details = [];
		var lemma = categ.split('#')[1].replace("^", " ") //il lemma
		var categoria = categ.split('#')[0] // la categoria
		var details = getHoverContent(categoria);

		var myitems;
		var catgramm;
		var subcatgramm = '';
		var popoverText = '';
		var discorsost = '';
		var funcFrase = '';
		var TipiDiscorso = {
			"ThoughtDiscourse": "Pensato",
			"DirectDiscourse": "Diretto",
			"SpeakableDiscourse": "Parlato"

		}


		for (detail of details) {

			myitems = detail.split(',');

			catgramm = '<div  class="ttContent">';
			subcatgramm = '<p> <b> ' + lemma + ' - </b><i>' + myitems[0] + ',' + myitems.slice(1) + '</i></p></div>';
			popoverText = popoverText + catgramm + subcatgramm;
		}

		if (vistaDialoghi) {
			for (const india in dialoghi) {
				if (dialoghi[india]['Cnt'].replace('_so', '') == sentId) {
					discorsost = "<div class='ttContentPers'><b>Personaggio:</b> <i>" + dialoghi[india]['Spna'].replace(hdnNamespace, '') + '</i>'
						+ '<br><b>Discorso:</b> <i>' + TipiDiscorso[dialoghi[india]['Dty']] + '</i></div>'
					break;
				}
			}
		}
		if (vistaPeriodi) {
			funcFrase = '<div class="ttContent"><b>' + maptypes[syntType] + '</b></div>'
		}
		popoverText = popoverText + discorsost + funcFrase
		return (popoverText);
	}

	function getHoverContent(categ) {

		//console.log('Categoria '+categ)
		var mycat = [];


		categ = categ.replace('%2A', '*')
		categ = categ.replace('%2B', '+')
		categ = categ.replace('%2C', ',')
		categ = categ.replace('%2D', '-')
		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");
		$("#collapseZero").collapse('hide');
		$("#vistaFrasi").empty()
		$("#vistaFrasi").css("display", "none");
		for (msid of listaPeriodiRisultato) {
			$('.' + msid).each(function() {
				$(this).css('color', '');
				if (!vistaPeriodi) {
					var pstp = $(this).attr('class').split(" ")[1]
					if (pstp == 'sentencetag')
						$(this).attr('style', 'display: none;');
				}

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


		$("#accordionNav .badge").remove();
		//$("#headingZero").css("display", "none");

		listarisultati = []
		listaPeriodiRisultato = []
		listaClausoleRisultato = []
		listaClausoleRisultatoContesti = []
		resultSentences = new Set()
		if (cantoDisplayed == '#vistaFrasi')
			cantoDisplayed = prevCantoDisplayed
		$(cantoDisplayed).attr('style', 'display: d-flex;');
		//manageMM (cantoDisplayed)
		currPage = 0;
		latestPhraseId = "";
		drawMinimap(cantoDisplayed, true)
	}

	/*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(true, true);

	}
*/
	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
		}
		if (jsonQuery['QueryAvanzata'] == 1 && (jsonQuery['EsprLogica'] == null || jsonQuery['EsprLogica'] == '')) {
			alert('Definire almeno una clausola del filtro di ricerca')
			return
		}
		if (jsonQuery['Clausola0']['lemma_forma'] == 'testo' && jsonQuery['Clausola0']['Attiva'] == 1 && jsonQuery['QueryAvanzata'] == 0) {
			searchwords = jsonQuery['Clausola0']['queryText'].trim().split(' ')
			var contesto = JSON.parse(jsonQuery['Clausola0']['contesto'])
			var inf = []
			var pur = []
			var par = []
			var noContext = true
			if (!(contesto[0].every(item => item === 0) && contesto[1].every(item => item === 0) && contesto[2].every(item => item === 0))) {
				//inf=contesto[0].some(item => item !== 0)
				noContext = false
				inf = contesto[0].reduce((a, e, i) => {
					if (e === 1)
						a.push(i + 1);
					return a;
				}, []);
				pur = contesto[1].reduce((a, e, i) => {
					if (e === 1)
						a.push(i + 1);
					return a;
				}, []);
				par = contesto[2].reduce((a, e, i) => {
					if (e === 1)
						a.push(i + 1);
					return a;
				}, []);
			}

			var resultsInCantica = []
			var resultsInCanto = []
			console.log('frase, l. ' + searchwords.length)
			if (noContext || inf.length)
				executeLocalSearch(searchwords, formeprima, (formeprima.length - searchwords.length), cantiche[0], inf, resultsInCantica, resultsInCanto)
			if (noContext || pur.length)
				executeLocalSearch(searchwords, formeseconda, (formeseconda.length - searchwords.length), cantiche[1], pur, resultsInCantica, resultsInCanto)
			if (noContext || par.length)
				executeLocalSearch(searchwords, formeterza, (formeterza.length - searchwords.length), cantiche[2], par, resultsInCantica, resultsInCanto)
			if (listarisultati.length) {
				//evidenzia risultati
				for (ris of listarisultati) {
					idris = '#' + ris
					$(idris).addClass("font-weight-bold mark ")

				}
			}
			var totResultN = showBadgeInCantica(resultsInCantica)
			showBadgeInCanto(resultsInCanto)

			return
		}
		jsonQuery = buildSQ(jsonQuery)

		myquery = new sparqlGenerator().stringify(jsonQuery)
		console.log(myquery)

		executeQuerySearch(myquery)
	}

	function executeLocalSearch(testo, forme, limit, cantica, cont, resultsInCantica, resultsInCanto) {

		for (var ip = 0; ip <= limit; ip++) {

			if (cont.length && !cont.includes(parseInt(forme[ip].split('_')[1]))) {
				continue
			}
			var fnd = true
			var strlen = 0;
			var tmpa = []
			for (var frind = 0; frind < testo.length; frind++) {
				var itm = forme[ip + frind].split('_')[0].toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "")

				tmpa.push(itm)
			}
			fnd = (testo.join(' ').toLowerCase() === tmpa.join(' ') || tmpa.join(' ').startsWith(testo.join(' ').toLowerCase()))

			if (fnd) {
				//console.log('ipfound: '+forme[ip].split('_')[2]+' - '+forme[(ip+testo.length-1)].split('_')[2])

				resultsInCantica.push(cantica)
				resultsInCanto.push(cantica + 'Canto ' + forme[ip].split('_')[1])
				var tstar = parseInt(forme[ip].split('_')[2])
				var tstop = parseInt(forme[(ip + testo.length - 1)].split('_')[2])

				for (var mpo = tstar; mpo < tstop + 1; mpo++) {

					listarisultati.push(mpo)
				}

			}

		}
	}



	//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 periodinum = {};
		var cantica = cantiche[parseInt(idcantica) - 1];
		var elverso, formaItem, currSentenceId;
		var ultimaFormaCanto;
		let numeroPeriodo = 1;
		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])) {

					var verso = parseInt(formaItem[3]) - 1;
					var idCommento = "Commento_" + idcantica + "_" + canto + "_" + verso;
					//var commNumber = numberOfComments(idCommento);
					var commNumber = numberOfCommentsJson(idCommento)




					if (currSentenceId != null && currSentenceId != sentenceid) {

						createSpanPeriodiTag(closeSTag, 'c', formaItem[2] - 1, currSentenceId, elverso, periodinum[currSentenceId])
						currSentenceId = null
					}
					if (commNumber > 0) {
						createCommentSpan(idCommento, elverso, commNumber)
						//console.log("Numero commenti: "+commNumber)
					}
					//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, periodinum[currSentenceId])
					}
					currSentenceId = sentenceid;
					if (periodinum[currSentenceId] == null) {
						periodinum[currSentenceId] = numeroPeriodo
						numeroPeriodo = numeroPeriodo + 1;
					}
					//periodinum[currSentenceId]=numeroPeriodo
					//numeroPeriodo=numeroPeriodo+1;
					createSpanPeriodiTag(openSTag, 'o', formaItem[2], sentenceid, elverso, periodinum[currSentenceId])
				}
				createSpanFormeNew(formaItem[0], formaItem[4], formaItem[2], sentenceid, formaItem[6], elverso)
				ultimaFormaCanto = formaItem;

			}

		})
		//crea tag di chiusura per l'ultimo periodo del canto

		createSpanPeriodiTag(closeSTag, 'c', ultimaFormaCanto[2] - 1, currSentenceId, elverso, periodinum[currSentenceId])

		//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])
				loadClausola(tmpid[0], tmpid[1], tmpid[2], tmpid[3])

			}
		}

		if (listarisultati.length) {
			//evidenzia risultati
			for (ris of listarisultati) {
				idris = '#' + ris
				$(idris).addClass("font-weight-bold mark ")

			}
		}

	}

	function createCommentSpan(idVerso, elementoverso, numberOfComments) {
		var spanoccorrenza = $('<button />')
		spanoccorrenza.attr('id', idVerso)
		//btn-sm btn-outline-secondary
		spanoccorrenza.attr('class', 'btn btn-sm btn-outline-primary showcomments bg-light border-0 rounded text-primary px-1 pt-1 pb-0 ml-1');
		if (numberOfComments > 1) {
			var commentIcon = '<ion-icon name="document-attach"></ion-icon><ion-icon name="add-circle-outline"></ion-icon>';
		} else {
			var commentIcon = '<ion-icon name="document-attach"></ion-icon>';
		}

		spanoccorrenza.append(commentIcon)
		//spanoccorrenza.append(number)

		spanoccorrenza.appendTo(elementoverso)
	}

	function createSpanPeriodiTag(separator, catgramm, pos, sentenceid, elementoverso, pnum) {
		var spanoccorrenza = $('<span />')
		spanoccorrenza.attr('id', 'sep_' + pos)
		spanoccorrenza.attr('title', catgramm)
		spanoccorrenza.attr('class', sentenceid + ' sentencetag font-weight-bold')
		spanoccorrenza.append(separator + " ")

		if (separator == closeSTag) {

			//aggiunge simbolo di chiusura dialogo
			for (const india in dialoghi) {
				if (dialoghi[india]['Cnt'].replace('_so', '') == sentenceid) {
					//PER GESTIONE PUNTEGGIATURA IN DIALOGHI, DA FARE
					//console.log(elementoverso.children().slice(-2).text())
					if (elementoverso.children().slice(-2).text().includes(',')) {
						//console.log(' virgola ' +elementoverso.children().slice(-1).html())
						//let paro=elementoverso.children().slice(-2).text().replace(',', '')
						//elementoverso.children().slice(-2).text(paro)
						//console.log(' virgola dopo' +elementoverso.children().slice(-1).html())

					}
					elementoverso.children().slice(-1).html('&raquo;&nbsp;')


					break;
				}
			}

			varsupel = $('<sup />')
			//varsupel.append(sentenceid.split('_')[3]+' ')
			varsupel.append(pnum + ' ')
			varsupel.appendTo(spanoccorrenza)
		}
		spanoccorrenza.css("display", "none")
		spanoccorrenza.appendTo(elementoverso)

		if (separator == openSTag) {

			//aggiunge simbolo di apertura dialogo
			for (const india in dialoghi) {
				if (dialoghi[india]['Cnt'].replace('_so', '') == sentenceid) {
					var enddiscorso = $('<span />')
					enddiscorso.append('&laquo;')
					enddiscorso.appendTo(elementoverso)
					break;
				}
			}
		}

	}

	function createSpanFormeNew(forma, catgramm, pos, sentenceid, clausefunct, elementoverso) {
		var spanoccorrenza = $('<span />')
		var nbsp = $('<span>&nbsp;</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)
		nbsp.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 createAllDivCanti() {

		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")
		divFrasi.attr('class', 'pb-4')
		divDialoghi.attr('id', "vistaDialoghi")
		divDialoghi.attr('class', 'pb-4')
		divMetafore.attr('id', "vistaMetafore")
		divMetafore.attr('class', 'pb-4')

		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 pt-3')
				divcanto.css("display", "none")

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

	//execute query
	async function executeQuerySearch(query) {


		//alert(query)
		$("#loader").fadeIn(300);
		//$("#searchcomm2").prop("disabled", true);
		//$("#searchcomm2").html('<span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span> Searching...');
		try {
			seachbBindingsStream = await myEngine.queryBindings(query, { sources: [{ type: 'sparql', value: sparqlEndpoint },], });
		}
		catch (err) {
			$("#loader").fadeOut(300);
			//$("#searchcomm2").prop("disabled", false);
			//$("#searchcomm2").html('<span class="" role="status" aria-hidden="true"></span> Search');
			console.log(err.message);
		};

		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 clfunction = ''
				if (binding.has('clafunction'))
					clfunction = binding.get('clafunction').value.replaceAll(syntitNamespace, '')
				var clocc = ''
				if (binding.has('clocc'))
					clocc = binding.get('clocc').value.replaceAll(hdnNamespace, '')
				//var clfunction=binding.get('clf').value.replace(syntitNamespace,'')
				//id del periodo
				var sentenceid = ''
				if (binding.has('sentence'))
					sentenceid = binding.get('sentence').value.replace(hdnNamespace, '')

				if (pos && !result.has(pos)) {
					if (pos.includes(';')) {
						var posses = pos.slice(0, -1).split(';')
						for (po in posses)
							result.add(posses[po])
					}
					else
						result.add(pos)
					resultsInCantica.push(cantica);
					resultsInCanto.push(cantica + canto)
				}
				if (unitaRicerca != 'frase' && pos == -1) {
					unitaRicerca = 'frase'
				}
				if (clfunction.includes(';')) {
					var funcs = clfunction.slice(0, -1).split(';')
					var occs = clocc.slice(0, -1).split(';')
					for (var mi = 0; mi < funcs.length; mi++)
						resultClauses.add(sentenceid + "-" + clfrom + '-' + clto + "-" + funcs[mi].trim().replace('ordinateClause', '').replace('MainClause', 'Ma') + '-' + cantica + '-' + canto + '-' + occs[mi])

				}
				else
					resultClauses.add(sentenceid + "-" + clfrom + '-' + clto + "-" + clfunction.trim().replace('ordinateClause', '').replace('MainClause', 'Ma') + '-' + cantica + '-' + canto + '-' + clocc)
				//resultSentences.add(sentenceid)//NON USATO????

			});
			seachbBindingsStream.on('end', () => {
				var resSent = new Set()
				var resSentence = new Set()
				var resClauses = []
				//let minim=$(" .minimap__content")
				console.log('start rendering...')
				listarisultati = Array.from(result)
				var listaclausole = Array.from(resultClauses)


				listaPeriodiRisultato = []
				listaClausoleRisultato = []
				listaClausoleRisultatoContesti = []
				//Unità di ricerca è 'frase'

				if ((!listarisultati.length && unitaRicerca == 'forme') || unitaRicerca == 'frase') {
					//if (unitaRicerca == 'frase') {
					unitaRicerca = 'frase'
					resultsInCantica = []
					resultsInCanto = []
					//listaPeriodiRisultato = []
					if (listaclausole.length) {
						for (var frase of listaclausole) {
							var fraseItems = frase.split('-');

							//loadFrase(fraseItems[0].toString(), fraseItems[3].toString())
							loadClausola(fraseItems[0].toString(), fraseItems[3].toString(), fraseItems[1], fraseItems[2])
							resSent.add(fraseItems[0] + '-' + fraseItems[3] + '-' + fraseItems[1] + '-' + fraseItems[2]);
							//if (!resSent.has(fraseItems[0] + '-' + fraseItems[3])) {
							let tmpocc = fraseItems.slice(-1)

							if (resClauses.filter(clocc => clocc == tmpocc[0]).length == 0 || tmpocc[0]=='') {
								resClauses.push(tmpocc[0]);
								//resSent.add(fraseItems[0] + '-' + fraseItems[3]+'-'+fraseItems[1] + '-' + fraseItems[2]);
								resSentence.add(fraseItems[1] + '-' + fraseItems[2]);
								//resSent.add(fraseItems.slice(-1))
								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()

						listaPeriodiRisultato.push(fraseItems[0].toString())
						loadPeriodo(fraseItems[0].toString())
						loadClausola(fraseItems[0].toString(), fraseItems[3].toString(), fraseItems[1], fraseItems[2])
						resSent.add(fraseItems[0] + '-' + fraseItems[3] + '-' + fraseItems[1] + '-' + fraseItems[2]);


						if (!resSent.has(fraseItems[0])) {
							resSent.add(fraseItems[0]);
							resultsInCantica.push(fraseItems[4]);
							resultsInCanto.push(fraseItems[4] + fraseItems[5]);
						}
					}
					listaClausoleRisultato = Array.from(resSent);
				}

				//Unità di ricerca è 'Discorso'

				if (unitaRicerca == 'discorso' && listaclausole.length) {
					console.log('Dialoghi')
					resultsInCantica = []
					resultsInCanto = []
					var tmplr = []
					for (ris of listarisultati) {
						for (const india in dialoghi) {
							var tfr = parseInt(dialoghi[india]['Clfr'])
							var tto = parseInt(dialoghi[india]['Clto'])
							if (ris >= tfr && ris <= tto) {
								tmplr.push(ris)
							}
						}
					}
					listarisultati = tmplr
					for (var frase of listaclausole) {
						var fraseItems = frase.split('-');
						var testf = fraseItems[0].toString();

						for (const india in dialoghi) {
							var diaclass = dialoghi[india]['Cnt'].replace('_so', '')
							if (testf == diaclass) {
								listaPeriodiRisultato.push(fraseItems[0].toString())
								loadPeriodo(fraseItems[0].toString())
								loadClausola(fraseItems[0].toString(), fraseItems[3].toString(), fraseItems[1], fraseItems[2])
								//resSent.add(fraseItems[0] + '-' + fraseItems[3] + '-' + fraseItems[1] + '-' + fraseItems[2]);
								if (!resSent.has(fraseItems[0])) {
									resSent.add(fraseItems[0]);
									resultsInCantica.push(fraseItems[4]);
									resultsInCanto.push(fraseItems[4] + fraseItems[5]);

								}
								continue
							}
						}

					}
					listaClausoleRisultato = Array.from(resSent);


				}

				if (listarisultati.length) {
					//evidenzia risultati
					for (ris of listarisultati) {
						idris = '#' + ris
						$(idris).addClass("mark ")
						minim.contents().find(idris).addClass("font-weight-bold mark ")

					}
				}

				//ordino la lista dei risultati
				listarisultati.sort(function(a, b) { return a - b });
				// ordino la lista delle clausole del risultato
				listaClausoleRisultato.sort(function(a, b) {
					var valA = a.split('-')[2]
					var valB = b.split('-')[2]
					return valA - valB
				});
				//crea la lista dei risultati per i contesti
				if (listaClausoleRisultato.length) {
					var tempr = new Set()
					for (singleres of listaClausoleRisultato) {
						tempr.add(singleres.split('-')[0])
					}

					tempr.forEach(y => listaClausoleRisultatoContesti.push(listaClausoleRisultato.filter(x => (x.split('-')[0] == y) && x.split('-').length > 1)))
					}
					
				//aggiunge badge con totale risultati accanto alle cantiche

				var totResultN = showBadgeInCantica(resultsInCantica)

				//aggiunge badge con totale risultati nel bottone lista risultati
				var listIcon = ' <ion-icon name="list-outline"></ion-icon>';
				if (totResultN > 0) {
					$("#headingZero").closest('.card').attr('style', 'display: d-flex;')
					var spanbadgelista = $('<span />');
					spanbadgelista.attr('class', 'badge badge-warning badge-pill mx-2 ');
					spanbadgelista.append(totResultN + listIcon)
					spanbadgelista.appendTo($('#cantica0-badge'))
				}

				//aggiunge badge con totale risultati accanto ai canti
				showBadgeInCanto(resultsInCanto)

				console.log('badge end...')
					//calcolo numero dei contesti
					/ countResultContexts()
				$("#loader").fadeOut(300);
				// mostra lista risultati
				$.manageResultList(0, showOffset);

			});
			queryExecuted = true;
			//$(cantoDisplayed).attr('style', 'display: d-flex;');
			$("#cantica0").trigger("click");
			$("#vistaFrasi").css("display", "none");

		}
		catch (err) {
			$("#loader").fadeOut(300);
			$("#searchcomm2").prop("disabled", false);
			$("#searchcomm2").html('<span class="" role="status" aria-hidden="true"></span> Search');
			console.log(err.message);

		};



	};

	//VISUALIZZAZIONE BADGE RISULTATI IN CANTICA

	function showBadgeInCantica(resultsInCantica) {
		var i = 0, 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)
			}
		}
		return (totResultN)
	}

	//VISUALIZZAZIONE BADGE RISULTATI IN CANTO

	function showBadgeInCanto(resultsInCanto) {

		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+'"]'))
				}
			}
		}
	}
	/*
	*	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);


});