PageSourceSearch

https://sna.gov.it/wp-content/themes/sna/js/main.js?ver=1.0.0

js sna.gov.it collected 2026-10-01 11:29:27 UTC 30,050 bytes, 1,067 lines download raw bytes

1const lastFilterYear = 2010; // ultimo anno disponibile per il filtro corrispondente
2let pFired = false; // variabile-semaforo, FALSE -> evento scatenato dall'interfaccia; TRUE -> evento chiamato da uno script
3var checkFilters = []; // variabile contenente i filtri salvati su session storage
4
5function contains(arr, obj, key) {
6	var i = arr.length;
7	while (i--) {
8		if (arr[i][key] === obj[key]) {
9			return true;
10		}
11	}
12	return false;
13}
14
15function removeObjectWithKey(arr, value, key) {
16	const objWithIdIndex = arr.findIndex((obj) => obj[key] === value);
17	if (objWithIdIndex > -1) {
18		arr.splice(objWithIdIndex, 1);
19	}
20	return arr;
21}
22
23// FUNZIONI PER FILTRI ---------------------------------------
24
25/**
26 * esegue la submit di ricerca delle news
27 */
28function callSearch() {
29	let filtersStored = JSON.parse(
30		window.sessionStorage.getItem("activeFilters") || "[]"
31	);
32	const desktopForm = document.getElementById("dsk-filters");
33
34	if (filtersStored.length !== checkFilters.length) {
35		desktopForm.submit();
36	} else {
37		let c = true;
38		const keys1 = filtersStored.map((a) => a.id).sort();
39		const keys2 = checkFilters.map((b) => b.id).sort();
40
41		keys1.forEach((e, i) => {
42			if (e !== keys2[i]) {
43				c = false;
44			}
45		});
46
47		if (!c) {
48			desktopForm.submit();
49		}
50	}
51}
52
53/**
54 * Popola la select sottocategoria
55 * @param {*} cat categoria selezionata
56 */
57function populateSubCat(cat, subcat_selected = []) {
58	const ul = document.querySelector("#mb-filters ul#formlist-subcat");
59	const select = document.querySelector("#dsk-filters select#subcat-select");
60	const filtersNmbr = document.querySelector(".h3-subcat .filtersNmbr");
61	ul.innerHTML = "";
62	select.innerHTML = "";
63
64	if (filtersNmbr) {
65		filtersNmbr.classList.add("d-none");
66	}
67
68	currentFilters();
69
70	if (cat) {
71		const newArr = checkFilters.filter((e) => {
72			return e["genre"] !== "subcat";
73		});
74		window.sessionStorage.setItem("activeFilters", JSON.stringify(newArr));
75
76		if (filtersSubCat[cat]) {
77			filtersSubCat[cat].forEach((e, i) => {
78				const li = document.createElement("li");
79				li.setAttribute(
80					"class",
81					"d-flex align-items-center justify-content-between"
82				);
83
84				const label = document.createElement("label");
85				label.setAttribute("for", "subcat-" + i);
86				label.textContent = e.label;
87				li.appendChild(label);
88
89				const input = document.createElement("input");
90				input.setAttribute("type", "checkbox");
91				input.setAttribute("class", "changeHandler");
92				input.setAttribute("data-input-genre", "subcat");
93				input.setAttribute("id", "subcat-" + i);
94				//input.setAttribute("name", "subcat-" + i);
95				input.setAttribute("name", "subcat-select[]");
96				if (subcat_selected.includes(parseInt(e.value))) {
97					input.setAttribute("checked", true);
98				}
99				input.setAttribute("value", e.value);
100				input.addEventListener("change", mblFiltersListener);
101				li.appendChild(input);
102				ul.appendChild(li);
103
104				const option = document.createElement("option");
105				option.setAttribute("class", "subcat-" + i);
106				option.setAttribute("value", e.value);
107				option.textContent = e.label;
108				select.appendChild(option);
109			});
110		}
111
112		if (select) {
113			$("#subcat-select").multiselect("rebuild");
114		}
115
116		const h3d = document.querySelector(".h3-subcat.disabled");
117		if (h3d) {
118			h3d.classList.remove("disabled");
119			h3d.querySelector("button").removeAttribute("disabled");
120			h3d.querySelector(".backdrop").classList.add("d-none");
121		}
122	} else {
123		if (select) {
124			$("#subcat-select").multiselect("rebuild");
125		}
126		checkFilters = checkFilters.filter((x) => {
127			return x.genre !== "subcat";
128		});
129		window.sessionStorage.setItem(
130			"activeFilters",
131			JSON.stringify(checkFilters)
132		);
133		const h3d = document.querySelector(".h3-subcat");
134		if (h3d) {
135			h3d.classList.add("disabled");
136			h3d.querySelector("button").setAttribute("disabled", true);
137			h3d.querySelector(".backdrop").classList.remove("d-none");
138		}
139	}
140}
141
142/**
143 * Event listener per il change degli input in modalità mobile
144 * @param {*} event
145 */
146function mblFiltersListener(event) {
147	const mobileActions = document.querySelector(
148		".offcanvas-body #mb-filters > .actions"
149	);
150	const selectedI = document.querySelectorAll(
151		"#mb-filters .changeHandler:checked"
152	);
153
154	const filterSaved = {
155		id: event.target.id,
156		type: event.target.type,
157		value: event.target.value,
158		genre: event.target.dataset["inputGenre"],
159	};
160
161	if (!pFired) {
162		handleStorageFilters(filterSaved);
163	}
164
165	if (selectedI?.length) {
166		mobileActions.classList.remove("d-none");
167	} else {
168		mobileActions.classList.add("d-none");
169	}
170
171	setFiltersCounter(selectedI, event.target.dataset["inputGenre"]);
172
173	if (!pFired) {
174		setUpFilters("desktop");
175	}
176	pFired = false;
177}
178
179/**
180 * Visualizza/Nasconde il counter dei filtri mobile
181 * @param {*} selectedFilters elenco filtri selezionti
182 * @param {*} cat categoria filtri
183 */
184function setFiltersCounter(selectedFilters, cat) {
185	const x = document.querySelector("span#flNmr-" + cat);
186
187	if (selectedFilters?.length) {
188		if (countFilters(cat) === 0) {
189			x.innerHTML = 0;
190			x.classList.add("d-none");
191		} else {
192			x.innerHTML = countFilters(cat);
193			x.classList.remove("d-none");
194		}
195	} else {
196		x.innerHTML = 0;
197		x.classList.add("d-none");
198	}
199}
200
201/**
202 * Gestione dei button "Azzera" per ripulire le singole voci di input
203 * @param {*} cat indica quale delle tre aree è coinvolta (year - anno/cat - categoria/subcat - sottocategoria)
204 * @param {*} type indica se il click arriva dai button modalità smartphone o desktop
205 */
206function eraseFilters(event) {
207	const cat = event.target.dataset["inputGenre"];
208	currentFilters();
209	const list = document.querySelector("ul#formlist-" + cat);
210	const sel = document.querySelector("select#" + cat + "-select");
211
212	// mobile
213	for (let e of list.children) {
214		const input = e.querySelector("input.changeHandler");
215		if (input.checked) {
216			input.checked = false;
217			var event = new Event("change");
218			input.dispatchEvent(event);
219		}
220	}
221
222	// desktop
223	if (sel.type === "select-multiple") {
224		for (let e of sel.children) {
225			if (e.selected) {
226				pFired = true;
227				e.selected = false;
228				var event = new Event("change");
229				e.dispatchEvent(event);
230			}
231		}
232	} else {
233		sel.selectedIndex = -1;
234		setTimeout(() => {
235			$(sel).multiselect("refresh");
236			populateSubCat();
237		}, 50);
238		checkFilters = checkFilters.filter((x) => {
239			return x.genre !== cat;
240		});
241		window.sessionStorage.setItem(
242			"activeFilters",
243			JSON.stringify(checkFilters)
244		);
245	}
246
247	// console.log("sel:",checkFilters?.length);
248	if (!checkFilters?.length) {
249		handleFormActions();
250	}
251}
252
253/**
254 * Aggiorna l'array di filtri selezionati nello store
255 * @param {*} object oggetto contenente i dati essenziali del filtro selezionato
256 */
257function handleStorageFilters(object) {
258	currentFilters();
259	if (object.type === "radio") {
260		if (
261			contains(checkFilters, object, "type") &&
262			!contains(checkFilters, object, "id")
263		) {
264			removeObjectWithKey(checkFilters, object.type, "type");
265			checkFilters.push(object);
266		} else if (
267			!contains(checkFilters, object, "type") &&
268			!contains(checkFilters, object, "id")
269		) {
270			checkFilters.push(object);
271		} else if (
272			contains(checkFilters, object, "type") &&
273			contains(checkFilters, object, "id")
274		) {
275			removeObjectWithKey(checkFilters, object.type, "type");
276			object = null;
277		}
278		window.sessionStorage.setItem(
279			"activeFilters",
280			JSON.stringify(checkFilters)
281		);
282		populateSubCat(object?.value);
283	} else {
284		if (contains(checkFilters, object, "id")) {
285			removeObjectWithKey(checkFilters, object.id, "id");
286		} else {
287			checkFilters.push(object);
288		}
289		window.sessionStorage.setItem(
290			"activeFilters",
291			JSON.stringify(checkFilters)
292		);
293		currentFilters();
294	}
295}
296
297/**
298 * Gestione pulsanti di reset form
299 * @param {*} event
300 */
301function resetForm(event) {
302	document.querySelectorAll("span.filtersNmbr").forEach((e) => {
303		e.classList.add("d-none");
304	}); // numero (sfondo blu) filtri selezionati
305	handleFormActions();
306
307	// if (event.target.id === "resetDsk") {
308	// 	document.querySelector("#mb-filters").reset();
309	// } else {
310	// 	document.querySelector("#dsk-filters").reset();
311	// }
312
313	setTimeout(() => {
314		// refresh select desktop
315		$("#year-select").multiselect("refresh");
316		$("#cat-select").val("").multiselect("refresh");
317		populateSubCat();
318		$("#subcat-select").multiselect("rebuild");
319	}, 50);
320
321	window.sessionStorage.removeItem("activeFilters");
322}
323
324/**
325 * Visualizzazione anni "nascosti" su filtro corrispondente in smartphone/tablet
326 * @param {*} event
327 */
328function showMoreYears(event) {
329	event.preventDefault();
330	const hiddenYears = document
331		.querySelector("ul#formlist-year")
332		.querySelectorAll("li.d-none");
333
334	if (hiddenYears) {
335		for (let i = 0; i < 5; i++) {
336			if (hiddenYears[i]) {
337				hiddenYears[i].classList.remove("d-none");
338			}
339		}
340	}
341
342	const hyAfter = document
343		.querySelector("ul#formlist-year")
344		.querySelectorAll("li.d-none");
345	if (!hyAfter || !hyAfter.length) {
346		document.querySelector("a#more-years").classList.add("d-none");
347	}
348}
349
350/**
351 * Salva il filtro selezionato in modalità desktop
352 * @param {*} e
353 */
354function saveFilter(e) {
355	currentFilters();
356	const filterSaved = {
357		id: e[0].className,
358		type: e[0].parentElement.multiple ? "checkbox" : "radio",
359		value: e[0].value,
360		genre: e[0].dataset["inputGenre"] || e[0].className.split("-")[0],
361	};
362	handleStorageFilters(filterSaved);
363	setUpFilters("smartphone");
364}
365
366/**
367 * Sincronizza i filtri desktop/mobile
368 * @param {*} type Indica se riguarda i filtri desktop o mobile
369 */
370function setUpFilters(type) {
371	currentFilters();
372	const mbForm = document.querySelector("form#mb-filters");
373	const dskForm = document.querySelector("form#dsk-filters");
374	const selectedI = document.querySelectorAll(
375		"#mb-filters .changeHandler:checked"
376	);
377
378	if (type === "smartphone" && mbForm) {
379		checkFilters.forEach((e) => {
380			const input = document.querySelector("#" + e.id);
381			input.checked = true;
382			setFiltersCounter(selectedI, e.id.split("-")[0]);
383		});
384	} else if (type !== "smartphone" && dskForm) {
385		let selects = [];
386
387		checkFilters.forEach((e) => {
388			const ref = "#" + e.id.split("-")[0] + "-select";
389
390			if (!selects.includes(ref)) {
391				selects.push(ref);
392			}
393
394			const lInput = document.querySelector("." + e.id + " a label input");
395			if (lInput) {
396				lInput.checked = true;
397			}
398
399			const selectInput = document.querySelector(ref);
400			if (selectInput?.options && selectInput?.options.length) {
401				selectInput.options[parseInt(e.id.split("-")[1])].selected = true;
402			}
403		});
404
405		setTimeout(() => {
406			if (selects?.length) {
407				selects.forEach((e) => {
408					$(e).multiselect("refresh");
409				});
410			}
411		}, 50);
412	}
413	handleFormActions("show");
414}
415
416/**
417 * Funzione per la gestione della visualizzazione dei pulsanti delle form
418 * @param {*} action show/hide (default = hide)
419 */
420function handleFormActions(action = "hide") {
421	// console.log('going to '+action);
422	if (action === "show") {
423		document
424			.querySelector("#dsk-filters .actions a.btn")
425			.classList.remove("d-none"); // reset desktop
426		document
427			.querySelector(".offcanvas-body #mb-filters > .actions")
428			.classList.remove("d-none"); // submit + reset mobile
429	} else {
430		document
431			.querySelector("#dsk-filters .actions a.btn")
432			.classList.add("d-none");
433		document
434			.querySelector(".offcanvas-body #mb-filters > .actions")
435			.classList.add("d-none");
436	}
437}
438
439/**
440 * recupera i filtri settati dall'utente (serve per sincronizzare mobile/desktop)
441 */
442function currentFilters() {
443	checkFilters = JSON.parse(
444		window.sessionStorage.getItem("activeFilters") || "[]"
445	);
446}
447
448/**
449 * Restituisce il numero di filtri attualmente selezionati per categoria
450 * @param {*} type categoria di filtri
451 * @returns quantità filtri per categoria
452 */
453function countFilters(type) {
454	return checkFilters.filter((x) => {
455		return x.genre === type;
456	}).length;
457}
458
459// FUNZIONI PER FILTRI - END ---------------------------------------
460
461function rewriteBreadcrumbs() {
462	const brd = document.querySelector(".sna-breadcrumb .container");
463
464	if (brd) {
465		const brdHeight = brd.offsetHeight;
466		const longs = brd.querySelectorAll("li a .long");
467		const shorts = brd.querySelectorAll("li a .short");
468
469		if (brdHeight > 70 && window.innerWidth < 768) {
470			longs.forEach((x) => {
471				x.classList.add("visually-hidden");
472			});
473			shorts.forEach((x) => {
474				x.classList.remove("d-none");
475			});
476		} else {
477			shorts.forEach((x) => {
478				x.classList.add("d-none");
479			});
480			longs.forEach((x) => {
481				x.classList.remove("visually-hidden");
482			});
483		}
484	}
485}
486
487window.onload = () => {
488	let menuTrigger = document.querySelector(".js-menuToggle");
489	let topNav = document.querySelector(".js-topPushNav");
490	let openLevel = document.querySelector(".js-openLevel");
491	let closeLevel = document.querySelector(".js-closeLevel");
492	let closeLevelTop = document.querySelector(".js-closeLevelTop");
493	let navLevel = document.querySelector(".js-pushNavLevel");
494	const searchTrigger = document.querySelectorAll(".js-searchToggle");
495	const searchOverlay = document.querySelector(".js-searchOverlay");
496	const dskLinks = document.querySelectorAll(".navbar-nav .nav-item .nav-link");
497	const htmlBody = document.querySelector("body");
498	const menuDD = document.querySelectorAll(
499		".navbar-nav .nav-item.megamenu .dropdown-menu"
500	);
501	const backdrop = document.querySelector("#sna-backdrop");
502	const selectTabs = document.querySelector("#tabs-select");
503	const navDesktop = document.querySelector(".navbar-menu nav");
504
505	window.sessionStorage.removeItem("activeFilters");
506
507	// MENU ---------------------------------------------------------
508
509	function getScrollY() {
510		return document.documentElement.scrollTop;
511	}
512
513	function openPushNav(layer = "nav") {
514		//console.log("openPushNav");
515		if (layer === "nav") {
516			if (searchOverlay.classList.contains("isOpenOverlay")) {
517				closePushNav("overlay");
518			}
519
520			if (getScrollY() < 1) {
521				topNav.classList.remove("scrollTopMenuMore");
522				backdrop.classList.remove("moreMargin");
523			} else {
524				topNav.classList.add("scrollTopMenuMore");
525				backdrop.classList.add("moreMargin");
526			}
527
528			backdrop.style.height = document.documentElement.scrollHeight + "px";
529
530			htmlBody.classList.add("pushNavIsOpen");
531			htmlBody.classList.add("sna-overflow-content");
532			topNav.classList.add("isOpen");
533			backdrop.classList.remove("d-none");
534		} else if (layer === "overlay") {
535			const inputOverlay = document.querySelector("form#searchSNA input");
536			if (topNav.classList.contains("isOpen")) {
537				closePushNav();
538				menuTrigger.classList.remove("active");
539			}
540
541			searchOverlay.classList.add("isOpenOverlay");
542			searchOverlay.ariaHidden = "false";
543			htmlBody.classList.add("sna-overflow-content");
544			document.querySelector(".access-btns").classList.add("d-none");
545
546			const links = navDesktop.querySelectorAll("a");
547			links.forEach((e) => {
548				e.setAttribute("aria-hidden", "true");
549				e.setAttribute("tabindex", "-1");
550			});
551
552			const closeCookiebar = document.querySelector("#closeCookiebar");
553			if (closeCookiebar) closeCookiebar.click();
554
555			searchTrigger.forEach((e) => {
556				e.classList.add("active");
557			});
558
559			document.getElementById("search-text").tabIndex = "1";
560			document.getElementById("search-menu-submit").tabIndex = "1";
561			if (document.getElementById("contenutoPagina")) {
562				document.getElementById("contenutoPagina").ariaHidden = "true";
563			}
564			document.getElementsByClassName("sna-footer")[0].ariaHidden = "true";
565
566			document.getElementById("search-text").focus();
567		}
568	}
569
570	function getSiblings(elem) {
571		//console.log("getSiblings");
572		return Array.from(elem.parentNode.children).filter(function (sibling) {
573			return sibling !== elem;
574		});
575	}
576
577	function closePushNav(layer = "nav") {
578		//console.log("closePushNav");
579		if (layer === "nav") {
580			topNav.classList.remove("isOpen");
581			// let siblings = getSiblings(openLevel);
582			// for (const s of siblings) {
583			// 	s.classList.remove("isOpen");
584			// }
585			let divs = document.querySelectorAll(".js-pushNavLevel");
586			[].forEach.call(divs, function (div) {
587				div.classList.remove("isOpen");
588			});
589			htmlBody.classList.remove("pushNavIsOpen");
590			htmlBody.classList.remove("sna-overflow-content");
591			backdrop.classList.add("d-none");
592			backdrop.removeAttribute("style");
593		} else if (layer === "overlay") {
594			const links = navDesktop.querySelectorAll("a");
595			links.forEach((e) => {
596				e.removeAttribute("aria-hidden");
597				e.removeAttribute("tabindex");
598			});
599			searchOverlay.classList.remove("isOpenOverlay");
600			searchOverlay.ariaHidden = "true";
601			htmlBody.classList.remove("sna-overflow-content");
602			document.querySelector(".access-btns").classList.remove("d-none");
603			searchTrigger.forEach((e) => {
604				e.classList.remove("active");
605			});
606
607			document.getElementById("search-text").tabIndex = "-1";
608			document.getElementById("search-menu-submit").tabIndex = "-1";
609			document.getElementById("contenutoPagina").ariaHidden = "false";
610			document.getElementsByClassName("sna-footer")[0].ariaHidden = "false";
611		}
612	}
613
614	menuTrigger.addEventListener("click", function (e) {
615		e.preventDefault();
616		const isOpen = topNav.classList.contains("isOpen");
617		if (isOpen) {
618			closePushNav();
619			menuTrigger.classList.remove("active");
620			//console.log("menuTrigger - not active");
621		} else {
622			openPushNav();
623			menuTrigger.classList.add("active");
624			//console.log("menuTrigger - active");
625		}
626	});
627
628	searchTrigger.forEach((s) => {
629		s.onclick = (e) => {
630			e.preventDefault();
631			if (searchOverlay.classList.contains("isOpenOverlay")) {
632				closePushNav("overlay");
633			} else {
634				openPushNav("overlay");
635			}
636		};
637	});
638
639	dskLinks.forEach((s) => {
640		s.onclick = (e) => {
641			if (e.target.classList.contains("show")) {
642				htmlBody.classList.add("sna-overflow-content");
643			} else {
644				htmlBody.classList.remove("sna-overflow-content");
645			}
646		};
647	});
648
649	menuDD.forEach((s) => {
650		s.onclick = (e) => {
651			htmlBody.classList.remove("sna-overflow-content");
652		};
653	});
654
655	const openLevels = document.querySelectorAll(".js-openLevel");
656	for (const i of openLevels) {
657		i.addEventListener("click", function (e) {
658			// console.log("openLevels" + e.target);
659			e.target.nextElementSibling.classList.add("isOpen");
660		});
661	}
662
663	const closeLevels = document.querySelectorAll(".js-closeLevel");
664	for (const i of closeLevels) {
665		i.addEventListener("click", function (e) {
666			// console.log("closeLevels" + i);
667			e.target.closest(".js-pushNavLevel").classList.remove("isOpen");
668		});
669	}
670
671	closeLevelTop.addEventListener("click", function () {
672		// console.log("closeLevelTop");
673		closePushNav();
674	});
675
676	//FINE MENU ---------------------------------------------------------
677
678	// TASTO ACCEDI ----------------------------------------------------
679
680	const accessBtn = document.getElementById("access-button");
681	const menuSelector = accessBtn.dataset.menu;
682	const menu = document.querySelector(menuSelector);
683
684	accessBtn.addEventListener("click", function (e) {
685
686		// console.log('toggle ' + menuSelector);
687
688		e.preventDefault();
689		accessBtn.classList.toggle('opened');
690		menu.style.display = menu.style.display == 'block' ? 'none' : 'block';
691
692		if (menu.style.display == 'block') {
693			window.addEventListener('click', closeMenu);
694		}
695		else {
696			window.removeEventListener('click', closeMenu);
697		}
698	
699		return false;
700	});
701
702	function closeMenu(e) {
703		if (!accessBtn.contains(e.target) && (!menu.contains(e.target))){
704			// console.log("Clicked outside access-button and access-sub-buttons");
705			accessBtn.classList.remove('opened');
706			menu.style.display = 'none';
707			window.removeEventListener('click', closeMenu);
708		}
709	}
710	// FINE TASTO ACCEDI -----------------------------------------------
711
712	// RICERCA ---------------------------------------------------------
713
714	const searchR = document.querySelector("#search-res");
715	const icoSearch = document.querySelector("#searchSNAres .search-button");
716	const btnClear = document.querySelector("#searchSNAres .clear-button");
717
718	if (searchR) {
719		searchR.addEventListener("input", function (e) {
720			let vl = e.target.value;
721
722			if (vl) {
723				btnClear.classList.remove("d-none");
724			} else {
725				btnClear.classList.add("d-none");
726			}
727		});
728	}
729
730	if (btnClear) {
731		btnClear.addEventListener("click", function () {
732			btnClear.classList.add("d-none");
733			icoSearch.classList.remove("d-none");
734			searchR.focus();
735		});
736	}
737
738	//FINE RICERCA -----------------------------------------------------
739
740	// TABS COMPONENTE FORMAZIONE ---------------------------------------
741
742	function setTabsFormazioneOrientation(elem) {
743		const tabbox = document.querySelector(".tabs-box");
744
745		if (tabbox) {
746			if (window.matchMedia("(min-width: 1200px)").matches) {
747				tabbox.classList.add("tabs-vertical");
748			} else {
749				tabbox.classList.remove("tabs-vertical");
750			}
751		}
752	}
753
754	setTabsFormazioneOrientation();
755
756	// FINE TABS COMPONENTE FORMAZIONE ---------------------------------
757
758	// HEADER STICKY ---------------------------------------
759
760	// let body = document.querySelector("body");
761	let headerDark = document.querySelector(".header-dark");
762	let sticky = headerDark.offsetTop;
763	function setStickyMenu() {
764		if (window.pageYOffset > sticky) {
765			htmlBody.classList.add("sticky-head");
766		} else {
767			htmlBody.classList.remove("sticky-head");
768		}
769	}
770	// FINE HEADER STICKY ---------------------------------------
771
772	window.addEventListener("resize", function (event) {
773		setTabsFormazioneOrientation();
774		setSelectTabsContatti();
775	});
776	window.addEventListener("scroll", function (event) {
777		setStickyMenu();
778	});
779
780	// POPOVER ---------------------------------------
781	let popoverTriggerList = [].slice.call(
782		document.querySelectorAll('[data-bs-toggle="popover"]')
783	);
784	popoverTriggerList.map(function (popoverTriggerEl) {
785		return new bootstrap.Popover(popoverTriggerEl);
786	});
787
788	const toggleButtons = document.querySelectorAll("[id^='evento_']");
789	toggleButtons.forEach(function (toggleButton) {
790		toggleButton.addEventListener("click", function () {
791			const popoverId = toggleButton.id;
792			const popover = toggleButton.nextElementSibling;
793			const closeIcon = popover.querySelector(".pop-close");
794			closeIcon.addEventListener("click", function () {
795				popover.classList.remove("show");
796			});
797		});
798	});
799
800	// FINE POPOVER ---------------------------------------
801
802	// MAP CONTATTI ---------------------------------------
803
804	const searchMap = document.querySelector(".sediMap");
805	const searchMapContatti = document.querySelector(".sna-map-contatti");
806	const searchSediContatti = document.querySelector(".sedi-contatti");
807
808	if (searchMapContatti || searchSediContatti) {
809		function setMarkerArray() {
810			let markersSediContent = [];
811
812			if (mapData) {
813				markersSediContent = mapData.markers;
814				let markers = [];
815				markersSediContent.forEach((element) => {
816					let marker = L.marker(L.latLng(element.lat, element.long)).addTo(
817						mapContatti
818					);
819					marker.bindPopup(element.tooltipHtml);
820					markers.push(marker);
821				});
822				let group = new L.featureGroup(markers);
823				mapContatti.fitBounds(group.getBounds());
824				mapContatti.setZoom(mapContatti.getZoom() - 1);
825			}
826		}
827
828		let mapContatti = L.map("map-contatti").setView([41.459, 9.954], 6);
829
830		L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
831			attribution:
832				'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
833		}).addTo(mapContatti);
834
835		// L.tileLayer(
836		//  "https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png",
837		//  {
838		//    maxZoom: 18,
839		//    attribution:
840		//      '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/attributions">CARTO</a>',
841		//  }
842		// ).addTo(mapContatti);
843
844		setMarkerArray();
845	}
846
847	// FINE MAP CONTATTI ---------------------------------------
848
849	// TABS CONTATTI ---------------------------------------
850
851	if (selectTabs) {
852		selectTabs.addEventListener("change", (event) => {
853			document
854				.querySelectorAll("a[href='" + event.target.value + "']")[0]
855				.click();
856		});
857	}
858
859	function setSelectTabsContatti() {
860		const selectedTab = document.querySelector(
861			".tabs-ctn ul li.nav-item .active"
862		);
863		if (selectTabs) {
864			selectTabs.value = selectedTab.hash;
865		}
866	}
867
868	// FINE TABS CONTATTI ---------------------------------------
869
870	// COOKIEBAR ---------------------------------------
871
872	const cookiebar = document.querySelector(".cookiebar");
873	const closeCookiebar = document.querySelector("#closeCookiebar");
874
875	if (closeCookiebar) {
876		closeCookiebar.onclick = () => {
877			cookiebar.classList.add("closed");
878		};
879	}
880
881	// FINE COOKIEBAR ---------------------------------
882
883	// FILTRI ---------------------------------------
884	const moreYears = document.querySelector("a#more-years"); // pulsante "Mostra altro"
885	const eraseEls = document.querySelectorAll("a.reset"); // pulsanti "Azzera" mobile
886	const mobileInputs = document.querySelectorAll("#mb-filters .changeHandler"); // input mobile
887	// const resetBtn = document.querySelector(
888	// 	".offcanvas-body .actions button:last-child"
889	// ); // reset mobile
890	// const resetBtnDsk = document.querySelector(
891	// 	"#dsk-filters .actions button:last-child"
892	// ); // reset desktop
893	const shiftRight = document.querySelector(".sna-filters-sticky .right"); // freccia dx slider
894	const shiftLeft = document.querySelector(".sna-filters-sticky .left"); // freccia sx slider
895	const chipsCtn = document.querySelector(".slide .chips"); // chips slider
896	const totWidth = chipsCtn ? chipsCtn.scrollWidth : 0;
897	const offWidth = chipsCtn ? chipsCtn.offsetWidth : 0;
898
899	/**
900	 * Gestore dei comandi dello slidere per le chip di ricerca
901	 * @param {*} event
902	 */
903	function shiftHandler(event) {
904		const isLeft = event.target.parentNode.classList.contains("left");
905
906		if (isLeft) {
907			shiftRight.classList.remove("d-none");
908			const cStyle = chipsCtn.style.left || "0px";
909			const leftVl = parseInt(cStyle.substring(0, cStyle.length - 2));
910			const currentShift = leftVl + offWidth - 100;
911			chipsCtn.style.left = currentShift + "px";
912
913			if (Math.abs(currentShift) < 1) {
914				shiftLeft.classList.add("d-none");
915			}
916		} else {
917			shiftLeft.classList.remove("d-none");
918			const cStyle = chipsCtn.style.left || "0px";
919			const leftVl = parseInt(cStyle.substring(0, cStyle.length - 2));
920
921			const currentShift = leftVl - offWidth + 100;
922			chipsCtn.style.left = currentShift + "px";
923			if (totWidth - Math.abs(currentShift) < offWidth) {
924				shiftRight.classList.add("d-none");
925			}
926		}
927	}
928
929	if (moreYears) {
930		moreYears.addEventListener("click", showMoreYears);
931	}
932
933	if (shiftRight) {
934		if (totWidth < offWidth + 50) {
935			shiftRight.classList.add("d-none");
936		}
937
938		shiftRight.addEventListener("click", shiftHandler);
939	}
940
941	if (shiftLeft) {
942		shiftLeft.addEventListener("click", shiftHandler);
943	}
944
945	if (mobileInputs) {
946		mobileInputs.forEach((i) => {
947			i.addEventListener("change", mblFiltersListener);
948		});
949	}
950
951	// if (resetBtn) {
952	// 	resetBtn.addEventListener("click", resetForm);
953	// }
954
955	// if (resetBtnDsk) {
956	// 	resetBtnDsk.addEventListener("click", resetForm);
957	// }
958
959	if (eraseEls) {
960		eraseEls.forEach((e) => {
961			e.addEventListener("click", eraseFilters);
962		});
963	}
964
965	// FINE FILTRI ---------------------------------
966
967	// BREADCRUMB ---------------------------------
968
969	rewriteBreadcrumbs();
970
971	// FINE BREADCRUMB ---------------------------------
972
973	// FAQ SEARCH ---------------------------------
974
975	const faqSearch = $(".sna-faq-search #search-res");
976	const faqAccordion = $("#org-acc-alt");
977	const faqForm = $('form[name="searchFAQ"]');
978	const btnClearFaq = document.querySelector(
979		".sna-faq-search #searchSNAres .clear-button"
980	);
981
982	if (faqForm && faqSearch && faqAccordion) {
983		faqForm.removeAttr("onsubmit").submit(function (event) {
984			event.preventDefault();
985			var searchTerm = faqSearch.val().toLowerCase();
986			// console.log(searchTerm);
987
988			$(".accordion-item").each(function () {
989				var accTitle = $(this).find(".accordion-header").text().toLowerCase();
990				var accBody = $(this).find(".accordion-collapse").text().toLowerCase();
991				if (
992					accTitle.indexOf(searchTerm) > -1 ||
993					accBody.indexOf(searchTerm) > -1
994				) {
995					$(this).show();
996				} else {
997					$(this).hide();
998				}
999			});
1000			var visibleResults = $(".accordion-item:visible").length;
1001			if (visibleResults === 0) $(".faq-search-results").addClass("active");
1002			else $(".faq-search-results").removeClass("active");
1003		});
1004	}
1005
1006	if (btnClearFaq) {
1007		btnClear.addEventListener("click", function () {
1008			btnClearFaq.classList.add("d-none");
1009			icoSearch.classList.remove("d-none");
1010			$(".accordion-item").each(function () {
1011				$(this).show();
1012			});
1013			$(".faq-search-results").removeClass("active");
1014			searchR.focus();
1015		});
1016	}
1017
1018	// FINE FAQ SEARCH ---------------------------------
1019
1020	// CARD HERO  ---------------------------------
1021
1022	const cardHero = document.querySelector(".card-hero");
1023	const closeCardHero = document.querySelector(".card-icon-bg");
1024
1025	if (closeCardHero && cardHero) {
1026		closeCardHero.onclick = () => {
1027			cardHero.classList.add("closed");
1028		};
1029	}
1030
1031	// FINE CARD HERO  ---------------------------------
1032};
1033
1034window.onresize = () => {
1035	// GESTIONE CHIP FILTRI ----------------------------
1036	const chipsCtn = document.querySelector(".slide .chips");
1037
1038	if (chipsCtn) {
1039		const shiftRight = document.querySelector(".sna-filters-sticky .right");
1040		const shiftLeft = document.querySelector(".sna-filters-sticky .left");
1041
1042		const totWidth = chipsCtn.scrollWidth;
1043		const offWidth = chipsCtn.offsetWidth;
1044
1045		if (totWidth < offWidth + 50) {
1046			shiftRight.classList.add("d-none");
1047			shiftLeft.classList.add("d-none");
1048			chipsCtn.style.left = 0;
1049		} else {
1050			shiftRight.classList.remove("d-none");
1051		}
1052	}
1053	// GESTIONE CHIP FILTRI - END ----------------------------
1054
1055	// GESTIONE FILTRI MOBILE ----------------------------
1056	const wdWidth = window.innerWidth;
1057	if (wdWidth > 1199) {
1058		const closeOff = document.querySelector(".offcanvas-header > a");
1059
1060		if (closeOff) {
1061			closeOff.click();
1062		}
1063	}
1064	// GESTIONE FILTRI MOBILE - END ----------------------------
1065
1066	rewriteBreadcrumbs();
1067};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.