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 '© <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 // '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <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.