1<!DOCTYPE html> 2<html lang="it"> 3<head> 4<!-- 5 6 FlexCMP - Digital Experience Platform (DXP) 7 v. 7.9.17 - 2026 8 (c) 2000-2026 Deda Digital s.r.l. - Bologna, Italy - www.flexcmp.com - www.deda.digital 9 --> 10 <meta name='generator' content='FlexCMP - www.flexcmp.com' /> 11 12 13 <meta charset="UTF-8"> 14 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 15 <meta name="viewport" content="width=device-width, initial-scale=1"> 16 <!-- START INDEX --><title>Sindaco - Comune di Lodi</title><!-- STOP INDEX --> 17 <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap-italia.min.css" /> 18 <link rel="stylesheet" type="text/css" href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/accessible-slick-1.0.1/slick/slick.min.css"/> 19 <link rel="stylesheet" type="text/css" href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/accessible-slick-1.0.1/slick/accessible-slick-theme.min.css"/> 20 <link rel='stylesheet' type='text/css' media='screen' href='https://unpkg.com/[email protected]/dist/aos.css' /> 21 22 <link rel='stylesheet' type='text/css' media='screen' href='https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/fontawesome-pro-5.7.1-web/css/all.min.css' /> 23 <link rel='stylesheet' type='text/css' media='screen' href='https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/slick-lightbox/slick-lightbox.css' /> 24 <link rel='stylesheet' type='text/css' media='screen' href='https://www.comune.lodi.it/flex/cm/pages/ServeCSS.php/L/IT/N/R-22~flex.css/M/-/BF/CHROME/BV/128.0.0.0?Wn5k7b' /> 25 26 27 <meta name='keywords' content='Il Sindaco' /> 28 <meta name='description' content='Il Sindaco' /> 29 <meta name='author' content='' /> 30 <meta name="robots" content="index,follow"> 31 32 <link rel="shortcut icon" href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/img/favicon.ico" type="image/x-icon" /> 33 <link rel="apple-touch-icon" href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/img/apple-touch-icon.png" /> 34 35 36 37 38 39
39<script> 40 document.addEventListener('DOMContentLoaded', function () { 41 AOS.init({ 42 once: false, 43 mirror: true, 44 disable: 'mobile' 45 }); 46 }); 47 48 window.addEventListener('load', function () { 49 AOS.refreshHard(); 50 }); 51 52 window.addEventListener('resize', () => AOS.refresh()); 53 document.addEventListener('lazyloaded', () => AOS.refresh()); 54 </script>
54 55 56
56<script> 57 window.__PUBLIC_PATH__='https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/fonts'; 58 </script>
58 59<link rel='canonical' href='https://www.comune.lodi.it/sindaco' /> 60<link rel='alternate' href='https://www.comune.lodi.it/sindaco' hreflang='it' /> 61<meta property="og:title" content="Sindaco" /> 62<meta property="og:type" content="article" /> 63<meta property="og:url" content="https://www.comune.lodi.it/sindaco" /> 64<meta property="og:site_name" content="www.comune.lodi.it" /> 65<meta name="twitter:card" content="summary" /> 66<meta name="twitter:site" content="www.comune.lodi.it" /> 67<meta name="twitter:creator" content="FlexCMP" /> 68<meta name="twitter:title" content="Sindaco" /> 69 70</head> 71<body class="AmministrazioneInterno fx-idp-7 other chrome vma-128 vmi-0"> 72 <!-- INIZIO SKIP --> 73<div class="LinkSkip"><a href="#Contenuto">Vai al contenuto principale</a></div> 74<div class="LinkSkip"><a href="#MenuPrincipale">Vai al menu principale di navigazione</a></div> 75<div class="LinkSkip"><a href="#MenuSezione">Vai al menu della sezione</a></div> 76<div class="LinkSkip"><a href="#Footer">Vai al footer</a></div> 77<!-- FINE SKIP --> 78 <!-- Modal --> 79<div class="modal fade modal-fullscreen modal-search show" id="searchModal" aria-hidden="true" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"> 80 <div class="modal-dialog" role="document"> 81 <div class="modal-content"> 82 <div class="modal-header"> 83 <div class="container"> 84 <div class="row"> 85 <div class="col-2 col-md-1"> 86 <button type="button" class="close" data-dismiss="modal" aria-label="Chiudi finestra cerca"> 87 <i class="far fa-arrow-circle-left" aria-hidden="true"></i> 88 </button> 89 </div> 90 <div class="col-10 col-md-11"> 91 <span class="modal-title h2" id="searchModalTitle"> 92 <span>Cerca</span> 93 </span> 94 </div> 95 </div> 96 </div> 97 </div> 98 <div class="modal-body"> 99 <div class="container"> 100 <div class="row"> 101 <div class="col-12"> 102 103<form id='F1' method='post' action='https://www.comune.lodi.it/flex/cm/FixedPages/Common/Search.v3.php/L/IT/s/2' enctype='multipart/form-data'> 104<div class="Search"> 105 <label for="text" class="SearchFormText GoAway">Cerca</label> 106 <div class="inputText"><input type='text' id='text' name='text' value='' maxlength='40' placeholder='Cerca nel sito' class='Input' /></div> 107 <div class="IcoCerca"><input type='submit' id='btnOK' name='btnOK' value='Esegui la ricerca' class='Submit'/></div> 108</div> 109<div><input type='hidden' name='HaveDataF1' id='HaveDataF1' value='1' /></div> 110 111</form> 112 113 </div> 114 </div> 115 </div> 116 </div> 117 </div> 118 </div> 119 </div> 120 121 122 <header> 123 <div class="it-header-wrapper it-header-sticky"> 124 <div class="it-header-slim-wrapper"> 125 <div class="container"> 126 <div class="row"> 127 <div class="col-12"> 128 <div class="it-header-slim-wrapper-content"> 129 <a class="d-none d-lg-block navbar-brand target_blank" href="//www.regione.lombardia.it">Regione Lombardia</a> 130 <div class="nav-mobile"> 131 <nav> 132 <a class="it-opener d-lg-none target_blank" href="//www.regione.lombardia.it"> 133 <span>Regione Lombardia</span> 134 </a> 135 </nav> 136 </div> 137 <a class="linkSportello" href="https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379"> 138 <span class="txtServizi"><img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/stemma-negativo.png" alt="Stemma Servizi al Cittadino" />Servizi per il cittadino</span> 139 </a> 140 </div> 141 </div> 142 </div> 143 </div> 144 </div> 145 <div class="it-nav-wrapper"> 146 <div class="it-header-center-wrapper"> 147 <div class="container"> 148 <div class="row"> 149 <div class="it-header-center-content-wrapper"> 150 <div class="it-brand-wrapper"> 151 <button class="custom-navbar-toggler menuHamburger" type="button" aria-controls="nav11" aria-expanded="false" aria-label="Apri il menu principale" data-target="#nav11">
152 <span class="hamb-top"></span> 153 <span class="hamb-middle"></span> 154 <span class="hamb-bottom"></span> 155 156 </button> 157 <a href="https://www.comune.lodi.it/home" title="Città di Lodi"> 158 <div class="it-brand-text"> 159 <img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/stemma-lodi.png" alt="Città di Lodi" title="Città di Lodi" /> 160 </div> 161 <span>Città di Lodi</span> 162 </a> 163 </div> 164 <div class="it-right-zone"> 165 <!--<div class="it-socials d-none d-md-flex"> 166 <span>Seguici su</span> 167 <ul> 168 <li> 169 <a href="//www.facebook.com/ComunediLodi" title="Seguici su Facebook" aria-label="Facebook" class="target_blank"> 170 <svg class="icon icon-sm"> 171 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
171prite.svg#it-facebook"></use> 172 </svg> 173 </a> 174 </li> 175 176 <li> 177 <a href="//twitter.com/ComunediLodi" title="Seguici su Twitter" aria-label="Twitter" class="target_blank"> 178 <svg class="icon icon-sm"> 179 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-twitter"></use> 180 </svg> 181 </a> 182 </li> 183 <li> 184 <a href="//www.youtube.com/user/ComunediLodi" title="Seguici su Youtube" aria-label="Youtube" class="target_blank"> 185 <svg class="icon icon-sm"> 186 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-youtube"></use> 187 </svg> 188 </a> 189 </li> 190 <li> 191 <a href="//www.instagram.com/comunedilodi" title="Seguici su Instagram" aria-label="Instagram" class="target_blank"> 192 <svg class="icon icon-sm"> 193 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
193prite.svg#it-instagram"></use> 194 </svg> 195 </a> 196 </li> 197 </ul> 198 </div>--> 199 <div class="it-search-wrapper"> 200 <button aria-label="Cerca nel sito" class="btn btn-cerca" type="button" data-toggle="modal" data-target="#searchModal"> 201 <span class="d-none d-md-block txtCerca">Cerca</span> 202 <span class="search-link rounded-icon"> 203 <img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/ico-cerca.png" alt=""> 204 </span> 205 </button> 206 </div> 207 </div> 208 </div> 209 </div> 210 </div> 211 </div> 212 <div class="it-header-navbar-wrapper"> 213 <div class="container"> 214 <nav class="navbar navbar-expand-lg has-megamenu"> 215 <div class="navbar-collapsable" id="nav10"> 216 <div class="overlay"></div> 217 <div class="close-div sr-only"> 218 <button class="btn close-menu" type="button"><span class="it-close"></span>close</button> 219 </div> 220 <div class="menu-top"> 221 222 </div> 223 <div class="menu-wrapper"> 224 <div class="logo-sticky"> 225 <a href="https://www.comune.lodi.it/home"> 226 <img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/stemma-lodi.png" alt="Città di Lodi" title="Città di Lodi" /> 227 </a> 228 </div> 229 <ul class="navbar-nav" id="MenuPrincipale"> 230 <li class="nav-item dropdown"> 231 <a class="nav-link dropdown-toggle" href="https://www.comune.lodi.it/comune.html" data-toggle="dropdown" aria-expanded="false"> 232 <span>Amministrazione</span> 233 <svg class="icon icon-xs"> 234 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
234prite.svg#it-expand"></use> 235 </svg> 236 </a> 237 <div class="dropdown-menu"> 238 <div class="link-list-wrapper"> 239 240<!-- trailindex - start cached content --> 241 242<ol> 243<li class='LIStrong'><strong><span>Sindaco</span></strong></li> 244<li><a href='https://www.comune.lodi.it/giunta' title='La Giunta Comunale' ><span>Giunta Comunale</span></a></li> 245<li><a href='https://www.comune.lodi.it/consiglio' title='Il Consiglio Comunale' ><span>Consiglio Comunale</span></a></li> 246<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2481' title='Organizzazione dell'ente' ><span>Organizzazione dell'ente</span></a></li> 247<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2209' title='Albo pretorio On line' ><span>Albo pretorio</span></a></li> 248<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379' title='Servizi on-line' ><span>Servizi per il cittadino</span></a></li> 249<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11667' title='' ><span>Servizi per Enti e Imprese</span></a></li> 250<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11406' title='' ><span>Servizi dipendenti/amministratori</span></a></li> 251<li><a href='https://lodi.e-pal.it/L190/?idSezione=33&id=&sort=&activePage=&search=' title='' ><span>Regolamenti comunali</span></a></li> 252</ol> 253 254 255<!-- trailindex - end cached content --> 256 257 </div> 258 </div> 259 </li> 260 <li class="nav-item dropdown megamenu"> 261 <a class="nav-link dropdown-toggle" href="javascript:alert('extFlexPage: no page with ID [BLOB:ID=11]')" data-toggle="dropdown" aria-expanded="false"> 262 <span>Aree Tematiche</span> 263 <svg class="icon icon-xs"> 264 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
264prite.svg#it-expand"></use> 265 </svg> 266 </a> 267 <div class="dropdown-menu"> 268 <div class="row"> 269 <div class="col-12 col-lg-4"> 270 <div class="link-list-wrapper"> 271 272<!-- trailindex - start cached content --> 273 274<ol> 275<li><a href='https://www.comune.lodi.it/areetematiche/ambiente' title='Ambiente e Ecologia' ><img src='https://www.comune.lodi.it/flex/images/1/2/2/D.1fb08d8f5e57ed7cd02e/leaf_regular_small.png' alt='Educazione e istruzione ' /><span>Ambiente, Ecologia e cambiamenti climatici</span></a></li> 276<li><a href='https://www.comune.lodi.it/areetematiche/cultura' title='Cultura, Sport e Turismo' ><img src='https://www.comune.lodi.it/flex/images/1/3/5/D.03e6039089900ed12f7e/child_regular_small.png' alt='Educazione e istruzione ' /><span>Cultura, Sport e Turismo</span></a></li> 277<li><a href='https://www.comune.lodi.it/areetematiche/anagrafe' title='Anagrafe, Stato civile, Elettorale, Protocollo' ><img src='https://www.comune.lodi.it/flex/images/1/e/d/D.e6bbac76c3231f2b4331/address_card_regular_small.png' alt='Educazione e istruzione ' /><span>Servizi demografici e al cittadino</span></a></li> 278<li><a href='https://www.comune.lodi.it/areetematiche/istruzione' title='Educazione e istruzione ' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.f3f00af26c93dceadfe0/graduation_cap_solid_small.png' alt='Educazione e istruzione ' /><span>Istruzione</span></a></li> 279<li><a href='https://www.comune.lodi.it/areetematiche/nidi-politiche-familiari' title='Educazione e istruzione ' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.f3f00af26c93dceadfe0/graduation_cap_solid_small.png' alt='Educazione e istruzione ' /><span>Nidi e politiche familiari</span></a></li> 280<li><a href='https://www.comune.lodi.it/areetematiche/pari-opportunita-centro-antiviolenza' title='' ><span>Pari opportunità e politiche antiviolenza</span></a></li> 281<li><a href='https://centroantiviolenzalodi.it/centro-antiviolenza/' title='' ><span>Centro Antiviolenza</span></a></li> 282<li><a href='https://www.comune.lodi.it/areetematiche/polizia' title='' ><img src='https://www.comune.lodi.it/flex/images/1/c/3/D.46ff463d5296755a72f2/shield_alt_regular_small.png' alt='Sicurezza e Polizia Locale' /><span>Sicurezza, Polizia Locale, ZTL</span></a></li> 283<li><a href='https://www.comune.lodi.it/areetematiche/urbanistica' title='Edilizia, Lavori pubblici, Urbanistica, Patrimonio' ><img src='https://www.comune.lodi.it/flex/images/2/7/6/D.7b80a5029313642d2559/ico_edil_urban.png' alt='Edilizia, Lavori pubblici, Urbanistica' /><span>Edilizia, Lavori pubblici, Urbanistica, Patrimonio</span></a></li> 284<li><a href='https://www.comune.lodi.it/areetematiche/SUAP' title='Sportello Unico Attività Produttive' ><img src='https://www.comune.lodi.it/flex/images/1/2/0/D.8da03cbac3f2d9ed2f27/store_regular_small.png' alt='Educazione e istruzione ' /><span>Sportello Unico Attività Produttive</span></a></li> 285<li><a href='https://www.comune.lodi.it/areetematiche/tariffe' title='Tributi e Tariffe' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.fcc3f6c0b8c2e79e0419/trash_alt_regular_small.png' alt='Educazione e istruzione ' /><span>Tributi e Tariffe</span></a></li> 286<li><a href='https://www.comune.lodi.it/areetematiche/sociale' title='Sociale' ><img src='https://www.comune.lodi.it/flex/images/1/3/9/D.5ff5247f35d91cd06f67/hands_helping_regular_small.png' alt='Educazione e istruzione ' /><span>Sociale e Politiche abitative</span></a></li> 287<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11624' title='' ><span>Servizi di Segreteria</span></a></li> 288<li><a href='https://www.comune.lodi.it/areetematiche/viabilita-mobilita' title='' ><img src='https://www.comune.lodi.it/flex/images/1/c/3/D.46ff463d5296755a72f2/shield_alt_regular_small.png' alt='Sicurezza e Polizia Locale' /><span>Mobilità</span></a></li> 289<li><a href='https://www.comune.lodi.it/areetematiche/cimiteri' title='' ><span>Cimiteri</span></a></li> 290</ol> 291 292 293<!-- trailindex - end cached content --> 294 295 </div> 296 </div> 297 </div> 298 299 </div> 300 </li> 301 <li class="nav-item dropdown"> 302 <a class="nav-link" href="https://www.comune.lodi.it/contatti">
303 <span>Contatti</span> 304 </a> 305 </li> 306 </ul> 307 <a class="linkSportello2" href="https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379"> 308 <span class="txtServizi"><img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/stemma-negativo.png" alt="Stemma Servizi al Cittadino" />Servizi per il cittadino</span> 309 </a> 310 <div class="it-socials it-socials d-none d-md-flex"> 311 <span>Seguici su</span> 312 <ul> 313 <li> 314 <a href="//www.facebook.com/ComunediLodi" title="Seguici su Facebook" aria-label="Facebook" class="target_blank"> 315 <svg class="icon icon-sm"> 316 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-facebook"></use> 317 </svg> 318 </a> 319 </li> 320 <!-- 321 <li> 322 <a href="//twitter.com/ComunediLodi" title="Seguici su Twitter" aria-label="Twitter" class="target_blank"> 323 <svg class="icon icon-sm"> 324 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
324prite.svg#it-twitter"></use> 325 </svg> 326 </a> 327 </li>--> 328 <li> 329 <a href="//www.youtube.com/user/ComunediLodi" title="Seguici su Youtube" aria-label="Youtube" class="target_blank"> 330 <svg class="icon icon-sm"> 331 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-youtube"></use> 332 </svg> 333 </a> 334 </li> 335 <li> 336 <a href="//www.instagram.com/comunedilodi" title="Seguici su Instagram" aria-label="Instagram" class="target_blank"> 337 <svg class="icon icon-sm"> 338 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-instagram"></use> 339 </svg> 340 </a> 341 </li> 342 </ul> 343 </div> 344 <div class="it-search-wrapper cloned"> 345 <button aria-label="Cerca nel sito" class="btn btn-cerca" type="button" data-toggle="modal" data-target="#searchModal"> 346 <span class="search-link rounded-icon"> 347 <img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/ico-cerca.png" alt="" /> 348 </span> 349 </button> 350 </div> 351 </div> 352 </div> 353 </nav> 354 </div> 355 </div> 356 <div class="it-header-navbar-wrapper menu-responsive"> 357 <div class="container"> 358 <nav class="navbar navbar-expand-lg has-megamenu" aria-label="Menu principale mobile"> 359 <div aria-modal="true" role="dialog" aria-label="Menu"> 360 <div class="navbar-collapsable" id="nav11"> 361 <div class="overlay"></div> 362 <div class="menu-top"> 363 364 </div> 365 <div class="menu-wrapper"> 366 <div class="close-div"> 367 <button class="btn close-menu" type="button" aria-label="Chiudi menu"> 368 <svg class="icon" aria-hidden="true" focusable="false"> 369 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
369prite.svg#it-close-big"></use> 370 </svg> 371 </button> 372 </div> 373 <ul class="navbar-nav"> 374 <li class="nav-item dropdown"> 375 <a class="nav-link dropdown-toggle" href="https://www.comune.lodi.it/comune.html" data-toggle="dropdown" aria-expanded="false"> 376 <span>Amministrazione</span> 377 <svg class="icon icon-xs"> 378 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-expand"></use> 379 </svg> 380 </a> 381 <div class="dropdown-menu"> 382 <div class="link-list-wrapper"> 383 384<!-- trailindex - start cached content --> 385 386<ol> 387<li class='LIStrong'><strong><span>Sindaco</span></strong></li> 388<li><a href='https://www.comune.lodi.it/giunta' title='La Giunta Comunale' ><span>Giunta Comunale</span></a></li> 389<li><a href='https://www.comune.lodi.it/consiglio' title='Il Consiglio Comunale' ><span>Consiglio Comunale</span></a></li> 390<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2481' title='Organizzazione dell'ente' ><span>Organizzazione dell'ente</span></a></li> 391<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2209' title='Albo pretorio On line' ><span>Albo pretorio</span></a></li> 392<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379' title='Servizi on-line' ><span>Servizi per il cittadino</span></a></li> 393<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11667' title='' ><span>Servizi per Enti e Imprese</span></a></li> 394<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11406' title='' ><span>Servizi dipendenti/amministratori</span></a></li> 395<li><a href='https://lodi.e-pal.it/L190/?idSezione=33&id=&sort=&activePage=&search=' title='' ><span>Regolamenti comunali</span></a></li> 396</ol> 397 398 399<!-- trailindex - end cached content --> 400 401 </div> 402 </div> 403 </li> 404 <li class="nav-item dropdown"> 405 <a class="nav-link dropdown-toggle" href="https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/14" data-toggle="dropdown" aria-expanded="false"> 406 <span>Aree Tematiche</span> 407 <svg class="icon icon-xs"> 408 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
408prite.svg#it-expand"></use> 409 </svg> 410 </a> 411 <div class="dropdown-menu"> 412 <div class="link-list-wrapper"> 413 414<!-- trailindex - start cached content --> 415 416<ol> 417<li><a href='https://www.comune.lodi.it/areetematiche/ambiente' title='Ambiente e Ecologia' ><img src='https://www.comune.lodi.it/flex/images/1/2/2/D.1fb08d8f5e57ed7cd02e/leaf_regular_small.png' alt='Educazione e istruzione ' /><span>Ambiente, Ecologia e cambiamenti climatici</span></a><ol> 418<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11435' title='' ><span>Alberi</span></a></li> 419<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9749' title='' ><span>Ambrosia e pollini</span></a></li> 420<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9542' title='' ><span>Amianto</span></a></li> 421<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/343' title='Animali' ><span>Animali</span></a></li> 422<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9408' title='' ><span>Aree a rischio di incidente rilevante</span></a></li> 423<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/350' title='Qualità dell'aria' ><span>Aria</span></a></li> 424<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7909' title='Case dell'acqua' ><span>Case dell'acqua</span></a></li> 425<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12369' title='' ><span>Colonnine di ricarica veicoli elettrici</span></a></li> 426<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9750' title='' ><span>Disinfestazioni </span></a></li> 427<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/3949' title='Ecosistema Urbano' ><span>Ecosistema Urbano</span></a></li> 428<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/789' title='Fiume Adda' ><span>Fiume Adda</span></a></li> 429<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12340' title='' ><span>Fondazione CERS Solare Lodigiana</span></a></li> 430<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12775' title='' ><span>Giornate ecologiche</span></a></li> 431<li><a href='https://www.comune.lodi.it/green_city' title='' ><span>GREEN CITY</span></a></li> 432<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4263' title='Impianti termici, caldaie, caminetti, stufe' ><span>Impianti termici, caldaie, caminetti, stufe</span></a></li> 433<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/10131' title='' ><span>Orti Urbani</span></a></li> 434<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/1716' title='Pulizia strade' ><span>Pulizia strade</span></a></li> 435<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6154' title='' ><span>Raccolta rifiuti</span></a></li> 436<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2996' title='Società Acqua Lodigiana - S.A.L.' ><span>Servizi idrici - S.A.L.</span></a></li> 437<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/347' title='Solare termico e fotovoltaico' ><span>Solare termico e fotovoltaico</span></a></li> 438<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/5268' title='Teleriscaldamento' ><span>Teleriscaldamento</span></a></li> 439<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/348' title='Verde pubblico e privato' ><span>Verde pubblico e privato</span></a></li> 440</ol> 441</li> 442<li><a href='https://www.comune.lodi.it/areetematiche/cultura' title='Cultura, Sport e Turismo' ><img src='https://www.comune.lodi.it/flex/images/1/3/5/D.03e6039089900ed12f7e/child_regular_small.png' alt='Educazione e istruzione ' /><span>Cultura, Sport e Turismo</span></a><ol> 443<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/5308' title='Archivio Storico' ><span>Archivio Storico</span></a></li> 444<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7048' title='Biblioteca comunale Laudense' ><span>Biblioteca Laudense</span></a></li> 445<li><a href='https://www.comune.lodi.it/correnti' title='Correnti - Bando Citta' che Legge' ><span>Correnti - Bando Citta' che Legge</span></a></li> 446<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11200' title='' ><span>Stati Generali della Cultura</span></a></li> 447<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6870' title='Luoghi della Cultura' ><span>Luoghi della Cultura</span></a></li> 448<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6881' title='Iniziative' ><span>Iniziative</span></a></li> 449<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6900' title='Teatro alle Vigne' ><span>Teatro alle Vigne</span></a></li> 450<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/385' title='Sport e Tempo Libero' ><span>
450Sport e Tempo Libero</span></a></li> 451<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/388' title='Turismo' ><span>Turismo</span></a></li> 452<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/351' title='Associazioni' ><span>Associazioni</span></a></li> 453</ol> 454</li> 455<li><a href='https://www.comune.lodi.it/areetematiche/anagrafe' title='Anagrafe, Stato civile, Elettorale, Protocollo' ><img src='https://www.comune.lodi.it/flex/images/1/e/d/D.e6bbac76c3231f2b4331/address_card_regular_small.png' alt='Educazione e istruzione ' /><span>Servizi demografici e al cittadino</span></a><ol> 456<li><a href='https://www.comune.lodi.it/prenotazione_CIE' title='' ><span>Carta d'Identità Elettronica (CIE)</span></a></li> 457<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11983' title='' ><span>Cambio di residenza</span></a></li> 458<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/10395' title='' ><span>Anagrafe degli Italiani Residenti all'Estero (AIRE)</span></a></li> 459<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12656' title='' ><span>Referendum 22 - 23 marzo 2026</span></a></li> 460<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6662' title='' ><span>Donazione di organi e tessuti</span></a></li> 461<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/8573' title='Testamento biologico' ><span>Testamento biologico</span></a></li> 462<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9571' title='' ><span>Censimento</span></a></li> 463<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11436' title='' ><span>Sottoscrizione referendum </span></a></li> 464</ol> 465</li> 466<li><a href='https://www.comune.lodi.it/areetematiche/istruzione' title='Educazione e istruzione ' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.f3f00af26c93dceadfe0/graduation_cap_solid_small.png' alt='Educazione e istruzione ' /><span>Istruzione</span></a><ol> 467<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/275' title='Elenco scuole' ><span>Elenco scuole</span></a></li> 468<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/5640' title='Piano per il Diritto allo Studio' ><span>Piano per il Diritto allo Studio</span></a></li> 469<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12854' title='' ><span>Cedole librarie dematerializzate 2026/2027</span></a></li> 470<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12882' title='' ><span>Nuovo Portale per la gestione della mensa </span></a></li> 471<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11251' title='' ><span>Spazio Gioco - IL TRENINO</span></a></li> 472<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12099' title='' ><span>Il Coordinamento Pedagogico Territoriale – CPT</span></a></li> 473</ol> 474</li> 475<li><a href='https://www.comune.lodi.it/areetematiche/nidi-politiche-familiari' title='Educazione e istruzione ' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.f3f00af26c93dceadfe0/graduation_cap_solid_small.png' alt='Educazione e istruzione ' /><span>Nidi e politiche familiari</span></a><ol> 476<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12203' title='' ><span>Graduatoria nidi per inserimenti da Settembre 2026 - Anno educativo 2026/2027</span></a></li> 477</ol> 478</li> 479<li><a href='https://www.comune.lodi.it/areetematiche/pari-opportunita-centro-antiviolenza' title='' ><span>Pari opportunità e politiche antiviolenza</span></a><ol> 480<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12647' title='' ><span>Mentorship Lodi 2026</span></a></li> 481<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12806' title='' ><span> Protocollo della Rete Territoriale Antiviolenza</span></a></li> 482</ol> 483</li> 484<li><a href='https://centroantiviolenzalodi.it/centro-antiviolenza/' title='' ><span>Centro Antiviolenza</span></a></li> 485<li><a href='https://www.comune.lodi.it/areetematiche/polizia' title='' ><img src='https://www.comune.lodi.it/flex/images/1/c/3/D.46ff463d5296755a72f2/shield_alt_regular_small.png' alt='Sicurezza e Polizia Locale' /><span>Sicurezza, Polizia Locale, ZTL</span></a><ol> 486<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6948' title='Multe online' ><span>Multe online</span></a></li> 487<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/8487' title='Piano della sosta' ><span>Piano della sosta</span></a></li> 488<li><a href='https://www.comune.lodi.it/ZTL' title='Zona a Traffico Limitato' ><span>Zona a Traffico Limitato</span></a></li> 489<li><a href='https://www.comune.lodi.it/protezionecivile' title='Protezione Civile' ><span>
489Protezione Civile</span></a></li> 490<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/375' title='VideoSorveglianza' ><span>VideoSorveglianza</span></a></li> 491<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4679' title='FBL, progetto contro le truffe' ><span>FBL, progetto contro le truffe</span></a></li> 492</ol> 493</li> 494<li><a href='https://www.comune.lodi.it/areetematiche/urbanistica' title='Edilizia, Lavori pubblici, Urbanistica, Patrimonio' ><img src='https://www.comune.lodi.it/flex/images/2/7/6/D.7b80a5029313642d2559/ico_edil_urban.png' alt='Edilizia, Lavori pubblici, Urbanistica' /><span>Edilizia, Lavori pubblici, Urbanistica, Patrimonio</span></a><ol> 495<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/1469' title='Piano di Governo del Territorio' ><span>Piano di Governo del Territorio</span></a></li> 496<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6975' title='Urbanistica' ><span>Urbanistica</span></a></li> 497<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7012' title='Sportello Unico Edilizia' ><span>Sportello Unico Edilizia</span></a></li> 498<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12044' title='' ><span>Contributo di Costruzione - Tariffari</span></a></li> 499<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7029' title='Lavori Pubblici' ><span>Lavori Pubblici</span></a></li> 500<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/8914' title='Patrimonio' ><span>Patrimonio</span></a></li> 501<li><a href='https://www.comune.lodi.it/commissionepaesaggio' title='Commissione Paesaggio' ><span>Commissione Paesaggio</span></a></li> 502</ol> 503</li> 504<li><a href='https://www.comune.lodi.it/areetematiche/SUAP' title='Sportello Unico Attività Produttive' ><img src='https://www.comune.lodi.it/flex/images/1/2/0/D.8da03cbac3f2d9ed2f27/store_regular_small.png' alt='Educazione e istruzione ' /><span>Sportello Unico Attività Produttive</span></a><ol> 505<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/9890' title='' ><span>
505Emergenza COVID -19</span></a></li> 506<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/981' title='Procedimenti SUAP' ><span>Procedimenti</span></a></li> 507<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/5056' title='Pubblicazione degli Atti dei Comuni associati' ><span>Atti dei Comuni associati</span></a></li> 508<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4934' title='Manifestazioni' ><span>Manifestazioni</span></a></li> 509<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4871' title='Piano della Pubblicità e delle Pubbliche Affissioni' ><span>Pubblicità e affissioni</span></a></li> 510<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7937' title='Piano cessioni a fini solidaristici' ><span>Cessioni a fini solidaristici</span></a></li> 511<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12834' title='' ><span>Bando Ponte sull'Adda</span></a></li> 512<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6988' title='Regolamenti SUAP' ><span>Regolamenti</span></a></li> 513<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/8268' title='AL VIA - Azioni Lombarde per la Valorizzazione degli Investimenti Aziendali' ><span>Bando Regionale AL VIA</span></a></li> 514<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11543' title='' ><span>Flusso cessazione attività</span></a></li> 515<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/233' title='Taxi e noleggio con conducente' ><span>Taxi e noleggio con conducente</span></a></li> 516</ol> 517</li> 518<li><a href='https://www.comune.lodi.it/areetematiche/tariffe' title='Tributi e Tariffe' ><img src='https://www.comune.lodi.it/flex/images/1/0/7/D.fcc3f6c0b8c2e79e0419/trash_alt_regular_small.png' alt='Educazione e istruzione ' /><span>Tributi e Tariffe</span></a><ol> 519<li><a href='https://lodi.k-portal.it/titr/home' title='' ><span>PORTALE TARI</span></a></li> 520<li><a href='https://sportellotelematico.comune.lodi.it/action:s_italia:imposta.municipale.unica' title='' ><span>IMU</span></a></li> 521<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12685' title='' ><span>IMU 2026</span></a></li> 522<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12278' title='' ><span>IMU 2025</span></a></li> 523<li><a href='https://sportellotelematico.comune.lodi.it/action%3As_italia%3Aaccesso.documentale' title='' ><span>RICHIESTA ACCESSO DOCUMENTALE</span></a></li> 524<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6729' title='Tosap, imposta di pubblicità e diritti sulle pubbliche affissioni' ><span>Canone Unico Patrimoniale</span></a></li> 525<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4295' title='La nuova Imposta di Soggiorno, ecco le modalità ' ><span>Imposta di soggiorno</span></a></li> 526<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/78' title='Addizionale IRPEF' ><span>Addizionale IRPEF</span></a></li> 527<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/74' title='5 per mille' ><span>5 per mille</span></a></li> 528<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2249' title='Regolamenti - Tributi' ><span>Regolamenti</span></a></li> 529</ol> 530</li> 531<li><a href='https://www.comune.lodi.it/areetematiche/sociale' title='Sociale' ><img src='https://www.comune.lodi.it/flex/images/1/3/9/D.5ff5247f35d91cd06f67/hands_helping_regular_small.png' alt='Educazione e istruzione ' /><span>Sociale e Politiche abitative</span></a><ol> 532<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/125' title='Politiche Sociali - Attività generali' ><span>Contatti Servizi sociali</span></a></li> 533<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/145' title='Adulti in difficoltà ' ><span>Adulti in difficoltà</span></a></li> 534<li><a href='https://www.arera.it/it/bonus_sociale.htm#' title='' ><span>Bonus sociale - Elettricità/Gas/Acqua</span></a></li> 535<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/157' title='Minori e famiglie' ><span>Minori e famiglie</span></a></li> 536<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/3828' title='Comitato Unico di Garanzia - C.U.G.' ><span>
536Comitato Unico di Garanzia - C.U.G.</span></a></li> 537<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/10193' title='' ><span>Servizi Sociali - Modulistica </span></a></li> 538<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12323' title='' ><span>Fondo per la non autosufficienza anno 2025 (Misura B2)</span></a></li> 539<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12324' title='' ><span>Sportello di ascolto e di supporto delle vittime</span></a></li> 540<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/6752' title='Famiglie' ><img src='https://www.comune.lodi.it/flex/images/c/3/9/D.8bede48d56be13db4b84/ico_famiglie.png' alt='Educazione e istruzione ' /><span>Ufficio Casa</span></a></li> 541<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12817' title='' ><span>Avviso pubblico - Sostegno al mantenimento dell'alloggio in locazione sul libero mercato - Anno 2026</span></a></li> 542</ol> 543</li> 544<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11624' title='' ><span>Servizi di Segreteria</span></a><ol> 545<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11627' title='' ><span>Partecipazione e cittadinanza attiva</span></a></li> 546<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11436' title='' ><span>Sottoscrizione referendum </span></a></li> 547</ol> 548</li> 549<li><a href='https://www.comune.lodi.it/areetematiche/viabilita-mobilita' title='' ><img src='https://www.comune.lodi.it/flex/images/1/c/3/D.46ff463d5296755a72f2/shield_alt_regular_small.png' alt='Sicurezza e Polizia Locale' /><span>Mobilità</span></a><ol> 550<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12704' title='' ><span>Chiusura Ponte storico / Napoleone Bonaparte</span></a></li> 551<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/265' title='Piano Urbano Mobilità ' ><span>Piano Urbano Mobilità sostenibile</span></a></li> 552<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12373' title='' ><span>Lodi a 30 km/h</span></a></li> 553<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2578' title='Trasporto pubblico' ><span>Trasporto pubblico Locale</span></a></li> 554<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12454' title='' ><span>Linee trasporto urbano</span></a></li> 555<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/7531' title='Agenzia del trasporto pubblico locale del bacino della Città metropolitana di Milano, Monza e Brianza, Lodi e Pavia' ><span>Agenzia del trasporto pubblico</span></a></li> 556<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/1725' title='Parcheggi' ><span>Parcheggi</span></a></li> 557<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/8487' title='Piano della sosta' ><span>Piano della sosta</span></a></li> 558<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/801' title='Biciclette e piste ciclabili' ><span>Piano della Mobilità Attiva</span></a></li> 559<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12453' title='Biciclette e piste ciclabili' ><span>Parcheggiare la bicicletta</span></a></li> 560<li><a href='https://www.comune.lodi.it/green_way' title='' ><span>Green Way</span></a></li> 561<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/12369' title='' ><span>Colonnine di ricarica veicoli elettrici</span></a></li> 562<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/1716' title='Pulizia strade' ><span>Pulizia strade</span></a></li> 563<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/284' title='' ><span>Permesso temporaneo ZTL </span></a></li> 564<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/4414' title='Contrassegni di circolazione per persone disabili ' ><span>Contrassegni per disabili </span></a></li> 565<li><a href='https://www.comune.lodi.it/mezzi_pesanti' title='' ><span>Circolazione mezzi pesanti in città </span></a></li> 566<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/430' title='Limitazioni al traffico' ><span>Limitazioni al traffico</span></a></li> 567<li><a href='https://www.comune.lodi.it/areetematiche/viabilita' title='Viabilità e Mobilità ' ><img src='https://www.comune.lodi.it/flex/images/1/6/c/D.44dd7ed451424f178c7d/ico_viab_mobil.png' alt='Educazione e istruzione ' /><span>Viabilità e Mobilità </span></a></li> 568</ol> 569</li> 570<li><a href='https://www.comune.lodi.it/areetematiche/cimiteri' title='' ><span>Cimiteri</span></a></li> 571</ol> 572 573 574<!-- trailindex - end cached content --> 575 576 </div> 577 578 </div> 579 </li> 580 <li class="nav-item dropdown"> 581 <a class="nav-link" href="https://www.comune.lodi.it/contatti">
582 <span>Contatti</span> 583 </a> 584 </li> 585 <li class="nav-item dropdown"> 586 <a class="nav-link target_blank" href="https://wbccomunelodi.cloud.incifra.it/booking/"> 587 <span>Appuntamenti servizi demografici</span> 588 </a> 589 </li> 590 <li class="nav-item dropdown"> 591 <a class="nav-link" href="https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379"> 592 Servizi per il cittadino 593 </a> 594 </li> 595 </ul> 596 </div> 597 </div> 598 </div> 599 </nav> 600 </div> 601 </div> 602 </div> 603 </div> 604 <span style='display: none;'></span> 605 </header> 606 <!-- START INDEX --> 607 <div class="container"> 608 <div class="row"> 609 <div class="col-12 d-block d-lg-none"> 610 <aside class="WrapMenuTopResp dropdown" aria-label="Menu di sezione"> 611 <button class="btnMenuTop" id="toggleTopMenu" data-toggle="dropdown" type="button"> 612 <span class="caret"></span> 613 <strong>Menu</strong> 614 <span class="caret"></span> 615 </button> 616 <div class="dropdown-menu"> 617 <nav class="MenuV"> 618 619<!-- trailindex - start cached content --> 620 621<ol> 622<li><a href='https://www.comune.lodi.it/comune.html' title='' ><span>Amministrazione</span></a><ol> 623<li class='LIStrong'><strong><span>Sindaco</span></strong></li> 624<li><a href='https://www.comune.lodi.it/giunta' title='La Giunta Comunale' ><span>Giunta Comunale</span></a></li> 625<li><a href='https://www.comune.lodi.it/consiglio' title='Il Consiglio Comunale' ><span>Consiglio Comunale</span></a></li> 626<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2481' title='Organizzazione dell'ente' ><span>Organizzazione dell'ente</span></a></li> 627<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2209' title='Albo pretorio On line' ><span>Albo pretorio</span></a></li> 628<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379' title='Servizi on-line' ><span>Servizi per il cittadino</span></a></li> 629<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11667' title='' ><span>Servizi per Enti e Imprese</span></a></li> 630<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11406' title='' ><span>Servizi dipendenti/amministratori</span></a></li> 631<li><a href='https://lodi.e-pal.it/L190/?idSezione=33&id=&sort=&activePage=&search=' title='' ><span>Regolamenti comunali</span></a></li> 632</ol> 633</li> 634</ol> 635 636 637<!-- trailindex - end cached content --> 638 639 </nav> 640 </div> 641 </aside> 642 </div> 643 <div class="col-12 col-lg-3 d-none d-lg-flex justify-content-center"> 644 <aside class="contMenuV" aria-label="Menu di sezione"> 645 <div class="indexBlock"> 646 <div class="indexList"> 647 648<!-- trailindex - start cached content --> 649 650<ol> 651<li><a href='https://www.comune.lodi.it/comune.html' title='' ><span>Amministrazione</span></a><ol> 652<li class='LIStrong'><strong><span>Sindaco</span></strong></li> 653<li><a href='https://www.comune.lodi.it/giunta' title='La Giunta Comunale' ><span>Giunta Comunale</span></a></li> 654<li><a href='https://www.comune.lodi.it/consiglio' title='Il Consiglio Comunale' ><span>Consiglio Comunale</span></a></li> 655<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2481' title='Organizzazione dell'ente' ><span>Organizzazione dell'ente</span></a></li> 656<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/2209' title='Albo pretorio On line' ><span>Albo pretorio</span></a></li> 657<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/379' title='Servizi on-line' ><span>Servizi per il cittadino</span></a></li> 658<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11667' title='' ><span>Servizi per Enti e Imprese</span></a></li> 659<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/11406' title='' ><span>Servizi dipendenti/amministratori</span></a></li> 660<li><a href='https://lodi.e-pal.it/L190/?idSezione=33&id=&sort=&activePage=&search=' title='' ><span>Regolamenti comunali</span></a></li> 661</ol> 662</li> 663</ol> 664 665 666<!-- trailindex - end cached content --> 667 668 </div> 669 </div> 670 </aside> 671 </div> 672 <div class="col-12 col-lg-9"> 673 <main id="Contenuto" class="corpopagina"> 674 <div class="wrap-breadcrumb"> 675 <span class="homebread"><a class="bread-home" href="https://www.comune.lodi.it/home">Home</a> / </span><!-- BreadCrumb --> 676 677 678<a href='https://www.comune.lodi.it/comune.html' title="Amministrazione">Amministrazione</a> 679 680/ 681 682Sindaco 683 684 685<!-- --> 686 687<!-- --> 688 689</div> 690 <div class="contSocial"> 691 <div class="socialWheelWrapper dropdown hidden-print"> 692 <button type="button" 693 class="btn-social-share dropdown-toggle" 694 id="socialShareDropdown" 695 data-toggle="dropdown" 696 aria-haspopup="true" 697 aria-expanded="false" 698 aria-label="Condividi questa pagina sui social network"> 699 <i class="fal fa-share-alt" aria-hidden="true"></i>
700 <span>Condividi</span> 701 </button> 702 <div class="dropdown-menu dropdown-menu-right" 703 aria-labelledby="socialShareDropdown" 704 id="socialWheel" 705 role="menu"> 706 <div class="link-list-wrapper"> 707 <ul class="link-list" role="presentation"> 708 <!--<li><a class="list-item" href="#" id="swLi" role="menuitem" target="_blank" rel="noopener noreferrer"><i class="fab fa-linkedin" aria-hidden="true"></i><span>Condividi su LinkedIn</span></a></li>--> 709 <li><a class="list-item" href="#" id="swFb" role="menuitem" target="_blank" rel="noopener noreferrer"><i class="fab fa-facebook-f" aria-hidden="true"></i><span>Condividi su Facebook</span></a></li> 710 <!--<li><a class="list-item" href="#" id="swTw" role="menuitem" target="_blank" rel="noopener noreferrer"><i class="fab fa-twitter" aria-hidden="true"></i><span>Condividi su Twitter</span></a></li>--> 711 </ul> 712 </div> 713 </div> 714 </div> 715</div> 716 717<!-- Begin BLOB Content --> 718<h1 class="viewTitolo">Sindaco</h1><h1 class="viewsottotitoloNero"> 719 Andrea Furegato<br /> 720</h1><div class='viewLineBreak'> </div><div class='BLOBBlockAlignLeft'><img id='img-1' src='https://www.comune.lodi.it/flex/tmp/imgResized/T-bfd001898385159aa4f759abcbad7843-250x250.png' width="250" height="250" alt='Andrea Furegato' class='viewImg' /></div><div class='BLOBFloatClear'></div><div class='viewLineBreak'> </div><h3 class="viewTitolo3">Si occupa di:</h3> 721<div class='viewPar BLOBAlignLeft'><p >Programmazione culturale e sedi della Cultura, Personale, Università e Parco Tecnologico Padano, investimenti soggetti al regime amministrativo del P.N.R.R., Attività Produttive, Protezione Civile, Lavori pubblici, Patrimonio.<br /><br /></p></div> 722<h3 class="viewTitolo3">Come incontrarlo:</h3> 723<div class='viewPar BLOBAlignLeft'><p >Riceve su appuntamento inviando una mail a:<br /><a href='mailto:[email protected]'>[email protected]</a><br /><br /><strong class='userFormat1'>Segreteria del Sindaco / Staff del Sindaco</strong><br />lunedì 8,30 12,00 - 14,30 16,15<br />martedì 8,30 12,00 - 14,30 16,30<br />mercoledì 8,30 17,15<br />giovedì 8,30 12,00 - 14,30 16,30<br />venerdì 8,30 12,30<br /><br /></p></div> 724<h3 class="viewTitolo3">Segreteria del Sindaco</h3> 725<div class='viewPar BLOBAlignLeft'><p >Tel. 0371 409.282<br />Tel. 0371 409.108<br /><a href='mailto:[email protected]'>[email protected]<br /><br /></a></p></div> 726<div class='BLOBAlignLeft'><a href='https://lodi.e-pal.it/L190/sezione/show/403600?idSezione=403345&sort=&activePage=&search=&' class='viewLink' title=''><img id='img-2' src='https://www.comune.lodi.it/flex/images/b/1/0/D.f97a8b41a6bc9ad5a306/casa_di_vetro.jpg' width="333" height="42" alt='la scritta amministrazione trasparente' /></a><span class='BLOBHidden'>.</span></div> 727<!-- End BLOB Content --> 728 729 <div class="row"> 730 731 732 </div> 733 </main> 734 </div> 735 </div> 736 </div> 737 <!-- STOP INDEX --> 738 <!-- INIZIO FOOTER --> 739<footer class="it-footer" id="Footer"> 740 <div class="it-footer-main"> 741 <div class="container d-sm-flex d-md-block justify-content-sm-center"> 742 <div class="col-12 col-md-11 d-sm-flex d-md-block justify-content-sm-center"> 743 <div class="row justify-content-lg-between"> 744 <div class="col-12 col-sm-auto"> 745 <div class="logoFooter"> 746 <img src="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/stemma-footer.png" alt="Stemma Comune di Lodi"> 747 </div> 748 </div> 749 <div class="col-12 col-sm-7 m-center"> 750 <div class="footerInfo"> 751 <strong>Piazza Broletto 1, 26900 Lodi</strong> 752 <p> 753 P.I. 03116800156 - C.F. 84507570152<br /> 754 Centralino 0371 409.1 - e-mail: <a href="mailto:[email protected]" title="e-mail">[email protected]</a> - PEC: <a href="mailto:[email protected]" title="PEC">[email protected]</a> 755 </p> 756 </div> 757 </div> 758 <div class="col-12 col-lg-auto social">
759 <span>Seguici su</span> 760 <ul> 761 <li> 762 <a href="//www.facebook.com/ComunediLodi" title="Seguici su Facebook" aria-label="Facebook" class="target_blank"> 763 <svg class="icon icon-sm"> 764 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-facebook"></use> 765 </svg> 766 </a> 767 </li> 768 <!-- 769 <li> 770 <a href="//twitter.com/ComunediLodi" title="Seguici su Twitter" aria-label="Twitter" class="target_blank"> 771 <svg class="icon icon-sm"> 772 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-twitter"></use> 773 </svg> 774 </a> 775 </li>--> 776 <li> 777 <a href="//www.youtube.com/user/ComunediLodi" title="Seguici su Youtube" aria-label="Youtube" class="target_blank"> 778 <svg class="icon icon-sm"> 779 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/s
779prite.svg#it-youtube"></use> 780 </svg> 781 </a> 782 </li> 783 <li> 784 <a href="//instagram.com/comunedilodi" title="Seguici su Instagram" aria-label="Instagram" class="target_blank"> 785 <svg class="icon icon-sm"> 786 <use xlink:href="https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/img/sprite.svg#it-instagram"></use> 787 </svg> 788 </a> 789 </li> 790 </ul> 791 </div> 792 </div> 793 </div> 794 </div> 795 </div> 796 <div class="it-footer-small-prints clearfix"> 797 <div class="container"> 798 <h3 class="sr-only">Sezione Link Utili</h3> 799 <div class="it-footer-small-prints-list d-flex "> 800 <div class="row w-100"> 801 <div class="col-12"> 802<!-- trailindex - start cached content --> 803 804<ol> 805<li><a href='http://www.comune.lodi.it/flex/cm/pages/eu-privacy.php/L/IT' title='' ><span>Cookie Policy</span></a></li> 806<li><a href='https://www.comune.lodi.it/privacy' title='' ><span>Privacy</span></a></li> 807<li><a href='https://www.comune.lodi.it/note-legali' title='' ><span>Note legali</span></a></li> 808<li><a href='https://www.comune.lodi.it/credits' title='' ><span>Credits</span></a></li> 809<li><a href='https://www.comune.lodi.it/flex/cm/FixedPages/Common/SiteMapTree.php/L/IT' title='Mappa del Sito' ><span>Mappa del Sito</span></a></li> 810<li><a href='https://form.agid.gov.it/view/cb4ffb90-9869-11f0-bee6-a53b1c61d10b' title='' ><span>Dichiarazione di accessibilità</span></a></li> 811<li><a href='https://www.comune.lodi.it/flex/cm/pages/ServeBLOB.php/L/IT/IDPagina/3410' title='' ><span>Segnalazioni/suggerimenti</span></a></li> 812</ol> 813 814 815<!-- trailindex - end cached content --> 816</div> 817 </div> 818 </div> 819 </div> 820 </div> 821</footer> 822<!-- FINE FOOTER --> 823 <div class='adminlinks'> 824 <div class='container'> 825 <div class='row justify-content-center'> 826 <div class='col-auto'> 827 828 829 </div> 830 </div> 831 </div> 832</div>
833<script type='text/html' id='eu-privacy-tpl'><style type='text/css'> 834 835 :root { 836 --colore-primario: #c1000a; 837 } 838 839 #eu-privacy { 840 top: auto !important; 841 position: fixed; 842 left: 0; 843 width: 100%; 844 min-height: 50px; 845 z-index: 10000; 846 bottom: 0; 847 overflow: hidden; 848 color: black; 849 background-color: rgba(255,255,255,0.97); 850 box-shadow: 0 -10px 10px rgba(0,0,0,0.3); 851 -webkit-transform: translateY(600px); 852 -moz-transform: translateY(600px); 853 -ms-transform: translateY(600px); 854 -o-transform: translateY(600px); 855 transform: translateY(600px); 856 857 -webkit-transition: transform 0.5s ease-in; 858 -moz-transition: transform 0.5s ease-in; 859 -ms-transition: transform 0.5s ease-in; 860 -o-transition: transform 0.5s ease-in; 861 transition: transform 0.5s ease-in; 862 } 863 #eu-privacy.open { 864 -webkit-transform: translateY(0px); 865 -moz-transform: translateY(0px); 866 -ms-transform: translateY(0px); 867 -o-transform: translateY(0px); 868 transform: translateY(0px); 869 870 -webkit-transition: transform 0.5s 1s ease-in; 871 -moz-transition: transform 0.5s 1s ease-in; 872 -ms-transition: transform 0.5s 1s ease-in; 873 -o-transition: transform 0.5s 1s ease-in; 874 transition: transform 0.5s 1s ease-in; 875 } 876 877 878 #eu-privacy-inner { margin: 15px; } 879 #eu-privacy-inner p { font-size: 15px; line-height: 25px; } 880 #eu-privacy-inner p a { color: var(--colore-primario);} 881 882 #eu-privacy-inner p i { 883 font-size: 8px; 884 top: -1px; 885 position: relative; 886 margin-right: 3px; 887 color: grey; 888 } 889 #eu-privacy-inner .title { 890 font-size: 16px; 891 letter-spacing: 0; 892 line-height: 17px; 893 /*color: black; 894 margin-bottom: 5px;*/ 895 text-transform: uppercase; 896 font-weight: 700; 897 text-align: center; 898 899 color: var(--colore-primario); 900 margin-bottom: 10px; 901 padding-bottom: 10px; 902 border-bottom: 1px solid var(--colore-primario); 903 } 904 .eu-privacy-check label { 905 display: inline-block; 906 max-width: 100%; 907 margin-bottom: 5px; 908 font-weight: 700; 909 font-size: 14px; 910 top: -2px; 911 position: relative; 912 margin-right: 5px; 913 } 914 .eu-privacy-buttons-container { 915 margin: 5px 0 0; 916 font-size: 12px; 917 display: block; 918 position: relative; 919 font-family: "Titillium Web",sans-serif; 920 } 921 922 .eu-privacy-checks, .eu-privacy-buttons { 923 display: flex; 924 justify-content: flex-start; 925 } 926 927 .eu-privacy-check { 928 margin: 0 15px 10px 0; 929 } 930 931 .eu-privacy-buttons .eu-privacy-button { 932 display: inline-block; 933 font-weight: 600; 934 /*color: var(--colore-primario);*/ 935 text-align: center; 936 vertical-align: middle; 937 cursor: pointer; 938 -webkit-user-select: none; 939 -moz-user-select: none; 940 -ms-user-select: none; 941 user-select: none; 942 /*background-color: transparent;*/ 943 border: 1px solid var(--colore-primario); 944 text-transform: uppercase; 945 padding: 5px 40px; 946 font-size: 14px; 947 line-height: 1.5; 948 border-radius: .2rem; 949 transition: color .3s ease-in-out, background-color .3s ease-in-out, border-color .15s ease-in-out,box-shadow .15s ease-in-out, opacity 0.3s ease-in-out; 950 color: #fff; 951 background-color: var(--colore-primario); 952 } 953 954 .eu-privacy-button:hover { 955 text-decoration: none; 956 /* 957 color: #fff; 958 background-color: var(--colore-primario); 959 opacity: 0.7; 960 */ 961 color: var(--colore-primario); 962 background-color: transparent; 963 } 964 965 .eu-privacy-buttons .eu-privacy-button-choose, .eu-privacy-buttons .eu-privacy-button-close { 966 color: var(--colore-primario); 967 background-color: transparent; 968 } 969 970 .eu-privacy-buttons .eu-privacy-button-choose:hover, .eu-privacy-buttons .eu-privacy-button-close:hover { 971 background-color: var(--colore-primario); 972 color: #fff; 973 } 974 975 .eu-privacy-buttons .eu-privacy-button-all:hover { 976 color: #fff; 977 background-color: var(--colore-primario); 978 opacity: 0.7; 979 } 980 /* 981 982 .eu-privacy-buttons .eu-privacy-button-all { 983 color: #fff; 984 background-color: var(--colore-primario); 985 border-color: var(--colore-primario); 986 text-transform: uppercase; 987 padding: 5px 40px; 988 } 989 */ 990 991 .eu-privacy-buttons .eu-privacy-button-container { 992 margin: 0 20px 0 0; 993 } 994 .eu-privacy-buttons .eu-privacy-button-container a{ 995 text-decoration: none; 996 } 997 .eu-privacy-close-box a.eu-privacy-button.eu-privacy-button-close { 998 margin-top:-5px; 999 background-color: var(--colore-primario); 1000 color: #ffffff; 1001 border-radius: 50%; 1002 width: 30px; 1003 height: 30px; 1004 display: block; 1005 text-align: center; 1006 line-height: 27px; 1007 transition: color .15s ease-in-out, background .3s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, opacity 0.3s ease-in-out; 1008 text-decoration: none; 1009 } 1010 .eu-privacy-close-box a.eu-privacy-button.eu-privacy-button-close:hover { 1011 color: var(--colore-primario); 1012 background-color: #ffffff; 1013 } 1014 .d-none { display: none; } 1015 .float-right { float: right !important;} 1016 @media screen and (max-width: 769px) { 1017 #eu-privacy-inner p, .eu-privacy-check label { font-size: 13px; line-height: 20px;} 1018 } 1019 @media screen and (max-width: 568px) { 1020 #eu-privacy { 1021 width: 100vw; 1022 } 1023 .eu-privacy-close-box a.eu-privacy-button.eu-privacy-button-close { 1024 margin-top:0; 1025 } 1026 .eu-privacy-close-box { 1027 position: absolute; 1028 right: 15px; 1029 top: 5px; 1030 z-index: 1000; 1031 } 1032 .eu-privacy-buttons, .eu-privacy-checks { 1033 flex-wrap: wrap; 1034 } 1035 .eu-privacy-buttons .eu-privacy-button-container { 1036 margin: 0px 0px 10px 0; 1037 width: 100%; 1038 } 1039 .eu-privacy-buttons .eu-privacy-button { 1040 width: 100%; 1041 } 1042 .eu-privacy-check { margin: 0 5px 0 0; flex: 0 1 46%;} 1043 1044 } 1045</style> 1046 1047<div class="container" data-dom-position="top"> 1048 <div class="eu-privacy-close-box float-right"> 1049 <a href="#" class='eu-privacy-button eu-privacy-button-close' aria-label="Chiudi informativa cookie">x</a> 1050 </div> 1051 <div class="row justify-content-center"> 1052 <div class="col-12 px-0"> 1053 <h5 class="title">Informativa cookie</h5> 1054 1055 <p class="text"> 1056 1057 <p class="text"> 1058 Il sito utilizza <strong>cookie tecnici</strong> o tecnologie simili <strong>necessari</strong> per funzionare correttamente. 1059 Con il tuo consenso, vorremmo utilizzare anche <strong>cookie di profilazione</strong> (anche di terze parti) per finalità di marketing o per una migliore esperienza. 1060 Se <strong>chiudi</strong> questo messaggio, tramite la <strong>X</strong>
1060 in alto a destra, accetti solo i cookie necessari. 1061 <br /> 1062 Seleziona Gestisci Cookie per conoscere i cookie utilizzati e impostare i consensi. Consulta anche la nostra <a href="//www.comune.lodi.it/privacy">Privacy Policy</a>. 1063 </p> 1064 1065 1066 <div class='eu-privacy-buttons-container'> 1067 1068 <div class='eu-privacy-checks'> 1069 1070 <div class='eu-privacy-check d-none'> 1071 <input type='checkbox' name='eu-privacy-chk-necessary' id='eu-privacy-chk-necessary' value='1' disabled checked> 1072 <label for='eu-privacy-chk-necessary'>Necessari e tecnici</label> 1073 </div> 1074 1075 <div class='eu-privacy-check d-none'> 1076 <input type='checkbox' name='eu-privacy-chk-preferences' id='eu-privacy-chk-preferences' value='2'> 1077 <label for='eu-privacy-chk-preferences'>Preferenze</label> 1078 </div> 1079 1080 <div class='eu-privacy-check d-none'> 1081 <input type='checkbox' name='eu-privacy-chk-statistics' id='eu-privacy-chk-statistics' value='4'> 1082 <label for='eu-privacy-chk-statistics'>Statistiche</label> 1083 </div> 1084 <div class='eu-privacy-check d-none'> 1085 <input type='checkbox' name='eu-privacy-chk-marketing' id='eu-privacy-chk-marketing' value='8'> 1086 <label for='eu-privacy-chk-marketing'>Marketing</label> 1087 </div> 1088 1089 </div> 1090 1091 <div class='eu-privacy-buttons'> 1092 <div class='eu-privacy-button-container'> 1093 <a href='https://www.comune.lodi.it/flex/cm/pages/eu-privacy.php/L/IT' id='' class='eu-privacy-button eu-privacy-button-choose'>Gestisci Cookie</a> 1094 </div> 1095 <div class='eu-privacy-button-container'> 1096 <a href='#' id='eu-privacy-choose' class='eu-privacy-button eu-privacy-button-close'>ACCETTA SOLO I NECESSARI</a> 1097 </div> 1098 1099 <div class='eu-privacy-button-container'> 1100 <a href='#' id='eu-privacy-choose-all' class='eu-privacy-button eu-privacy-button-all'>Accetta Tutti</a> 1101 </div> 1102 </div> 1103 1104 </div> 1105 1106 </div> 1107 </div> 1108</div></script>
1108 1109
1110<script type='text/javascript'>var gAppConfigure = { 1111 kBlankLinkMessage: ' (Questo collegamento aprirà una nuova finestra)', 1112 kBaseURL: 'https://www.comune.lodi.it/flex/cm/', 1113 kDataURL: 'https://www.comune.lodi.it/flex/', 1114 eucookie: {"settings":1}, 1115 lang: 'IT', 1116 isDevel: false 1117};</script>
vendor: 1 bytes, line 1117
1117
1118<script type='text/javascript' src='https://www.comune.lodi.it/flex/cm/js.7.9.17/jq/jquery-3.4.1.min.js'></script>
vendor: 1 bytes, line 1118
1118
1119<script type='text/javascript' src='https://www.comune.lodi.it/flex/cm/js.7.9.17/jq/FlexJS.js'></script>
1119<script type="text/javascript"> 1120$().ready(function() { 1121window.__flex__eu_cookie_enabled = true; 1122 1123// $(window).on('load', function() { 1124 1125// }); 1126 1127(function() { 1128 1129 if (! window.__flex__eu_cookie_enabled) 1130 return; 1131 1132 function open() { 1133 1134 if (fjs.euCookie.handler !== null) 1135 fjs.euCookie.handler.openDialog(); 1136 else 1137 fjs.Loader.LoadJS('js/jq/eu-privacy-v2.js', function() { 1138 1139 fjs.euCookie.handler = new fxEUPrivacy(); 1140 1141 fjs.euCookie.handler.openDialog(); 1142 }); 1143 } 1144 1145 $('body').on('click', '.eu-privacy-button-set', function() { 1146 1147 const el = $(this), as = el.data('after-set'); 1148 1149 if (as === 'reload') 1150 window.addEventListener('eu-privacy:changed', function(e) { 1151 1152 location.reload(); 1153 }); 1154 1155 open(); 1156 1157 return false; 1158 }); 1159 1160 // ho già un'impostazione attiva, non apro il dialog 1161 1162 if (document.cookie.match(/fx-eu-privacy/)) 1163 return; 1164 1165 open(); 1166 1167})(); 1168 1169}); 1170</script>
1170 1171 1172 1173<!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 65 bytes, lines 1173-1174
1173 1174<script async src='https://www.googletagmanager.com/gtag/js?id=
1174G-1C0DRHW4L1
vendor: 63 bytes, line 1174
1174' type='text/plain' data-cookieconsent='statistics'></script>
1175<script type='text/plain' data-cookieconsent='statistics'> 1176
vendor: 135 bytes, lines 1176-1180
1176window.dataLayer = window.dataLayer || []; 1177 function gtag(){dataLayer.push(arguments);} 1178 gtag('js', new Date()); 1179 1180 gtag('config', '
1180G-1C0DRHW4L1
vendor: 5 bytes, line 1180
1180');
1181</script>
1181 1182
1183<script type='text/javascript' src='//cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap-italia.bundle.min.js'></script>
vendor: 1 bytes, line 1183
1183
1184<script type='text/javascript' src='https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/accessible-slick-1.0.1/slick/slick.min.js'></script>
vendor: 1 bytes, line 1184
1184
1185<script type='text/javascript' src='//unpkg.com/[email protected]/dist/aos.js'></script>
vendor: 1 bytes, line 1185
1185
1186<script type='text/javascript' src='https://www.comune.lodi.it/flex/TemplatesUSR/assets/R-22/slick-lightbox/slick-lightbox.js'></script>
vendor: 1 bytes, line 1186
1186
1187<script type="text/javascript">$().ready(function() { 1188 1189 1190 1191 // Gestione Menu Responsive con Focus Trap e Accessibilità 1192 (function() { 1193 var $menuResponsive = $(".menu-responsive"); 1194 var $navbarCollapsable = $menuResponsive.find(".navbar-collapsable"); 1195 var $menuWrapper = $menuResponsive.find(".menu-wrapper"); 1196 var $overlay = $menuResponsive.find(".overlay"); 1197 var $hamburger = $(".menuHamburger"); 1198 var menuOpen = false; 1199 1200 function openMenu() { 1201 menuOpen = true; 1202 $menuResponsive.addClass("showMenu"); 1203 $navbarCollapsable.addClass("expanded"); 1204 $overlay.css("display", "block"); 1205 $hamburger.attr("aria-expanded", "true"); 1206 $("body").css("overflow", "hidden"); 1207 setTimeout(function() { 1208 $menuResponsive.find(".close-menu").focus(); 1209 }, 100); 1210 } 1211 1212 function closeMenu() { 1213 menuOpen = false; 1214 $menuResponsive.removeClass("showMenu"); 1215 $navbarCollapsable.removeClass("expanded"); 1216 $overlay.css("display", "none"); 1217 $hamburger.attr("aria-expanded", "false"); 1218 $("body").css("overflow", ""); 1219 $hamburger.focus(); 1220 } 1221 1222 // Click Hamburger 1223 $hamburger.on("click", function() { 1224 if (menuOpen) { 1225 closeMenu(); 1226 } else { 1227 openMenu(); 1228 } 1229 }); 1230 1231 // Click X (delegato) 1232 $menuResponsive.on("click", ".close-menu", function(e) { 1233 e.preventDefault(); 1234 closeMenu(); 1235 }); 1236 1237 // Click Overlay 1238 $overlay.on("click", function() { 1239 closeMenu(); 1240 }); 1241 1242 // ESC e Focus Trap 1243 $(document).on("keydown", function(e) { 1244 if (!menuOpen) return; 1245 1246 // ESC 1247 if (e.key === "Escape" || e.keyCode === 27) { 1248 e.preventDefault(); 1249 closeMenu(); 1250 return; 1251 } 1252 1253 // Focus Trap 1254 if (e.key === "Tab" || e.keyCode === 9) { 1255 var $focusable = $menuWrapper.find('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])').filter(':visible'); 1256 var first = $focusable.first()[0]; 1257 var last = $focusable.last()[0]; 1258 1259 if (e.shiftKey && document.activeElement === first) { 1260 e.preventDefault(); 1261 last.focus(); 1262 } else if (!e.shiftKey && document.activeElement === last) { 1263 e.preventDefault(); 1264 first.focus(); 1265 } 1266 } 1267 }); 1268 })(); 1269 1270 // Focus Trap per Modal Search 1271 (function() { 1272 var $searchModal = $("#searchModal"); 1273 1274 $searchModal.on("shown.bs.modal", function() { 1275 var $focusable = $searchModal.find('button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])').filter(':visible'); 1276 if ($focusable.length) { 1277 $focusable.first().focus(); 1278 } 1279 }); 1280 1281 $searchModal.on("keydown", function(e) { 1282 if (e.key === "Tab" || e.keyCode === 9) { 1283 var $focusable = $searchModal.find('button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])').filter(':visible'); 1284 var first = $focusable.first()[0]; 1285 var last = $focusable.last()[0]; 1286 1287 if (e.shiftKey && document.activeElement === first) { 1288 e.preventDefault(); 1289 last.focus(); 1290 } else if (!e.shiftKey && document.activeElement === last) { 1291 e.preventDefault(); 1292 first.focus(); 1293 } 1294 } 1295 }); 1296 })(); 1297 1298 /* Apriamo il menu padre del attuale elemento nel menu hamburger */ 1299 $(".menu-responsive .navbar-nav .link-list-wrapper li.LIStrong").parent().parent().parent().addClass("show"); 1300 $(".menu-responsive .navbar-nav .link-list-wrapper li.LIStrong").parent().parent().parent().parent().addClass("show"); 1301 1302 1303 $(".FlexNavi span.NavInactive:nth-child(2), .navBottom span.NavInactive:nth-child(2)").html('<i aria-hidden="true" class="fal fa-chevron-left"></i>'); 1304 $(".FlexNavi a[title='Primo Elemento']").html('<i aria-hidden="true" class="fal fa-chevron-double-left"></i>'); 1305 $(".FlexNavi a[title='Ultimo Elemento']").html('<i aria-hidden="true" class="fal fa-chevron-double-right"></i>'); 1306 $(".FlexNavi a[title='Elemento Precedente']").html('<i aria-hidden="true" class="fal fa-chevron-left"></i>'); 1307 $(".FlexNavi a[title='Elemento Successivo']").html('<i aria-hidden="true" class="fal fa-chevron-right"></i>'); 1308 $(".nav-wrap").html("<div class='navTop'>"+$(".FlexNavi").html()+"</div>"); 1309 $(".FlexNavi ol li").each(function(){ 1310 let str = $(this).text(); 1311 if(str == '...'){ 1312 $(this).remove(); 1313 } 1314 }); 1315 $(" .FlexNavi span").each(function(){ 1316 let testo = $(this).text(); 1317 if(testo == '<' || testo == '>'){ 1318 $(this).html('<i aria-hidden="true" class="fal fa-chevron-right"></i>'); 1319 }else if(testo == '>' || testo == '<'){ 1320 $(this).html('<i aria-hidden="true" class="fal fa-chevron-left"></i>'); 1321 }else if(testo == '<<'){ 1322 $(this).html('<i aria-hidden="true" class="fal fa-chevron-double-left"></i>'); 1323 }else if(testo == '>>'){ 1324 $(this).html('<i aria-hidden="true" class="fal fa-chevron-double-right"></i>'); 1325 } 1326 }); 1327 1328 1329 /* Copiamo il percorso action dal form generico nel form aggiunto sulla home */ 1330 $(".home-page #F2").attr("action",$(".home-page #F1").attr("action")); 1331 1332 $("#map").addClass( "embed-responsive" ); 1333 $(".gm-style").addClass( "embed-responsive-item" ); 1334 $('table.viewTable').wrap("<div class='table-responsive'></div>"); 1335 1336 1337 1338 $(".corpopagina form .BLOBFloatClear").addClass( "form-check" ); 1339 $(".corpopagina form input[type='checkbox']").addClass( "checkbox" ); 1340 $(".corpopagina form input[type='radio']").addClass( "radio" ); 1341 $(".corpopagina form input[type='submit']").addClass("btn btn-secondary"); 1342 1343// JS modifica form editoriali per adattarli a bootstrap 4 1344 1345 $( "form .formText" ).each(function() { 1346 $( this ).addClass('form-control').unwrap().closest('.BLOBWidth100').attr('class','form-group'); 1347 var l = $( this ).prev().find('.formTextLabel').unwrap(); 1348 $( this ).siblings('.formMandatory').appendTo( l ); 1349 }); 1350 1351 $( "form .formTextArea" ).each(function() { 1352 $( this ).addClass('form-control').unwrap().closest('.BLOBWidth100').attr('class','form-group'); 1353 var la = $( this ).prev().find('.formTextAreaLabel').unwrap(); 1354 $( this ).siblings('.formMandatory').appendTo( la ); 1355 }); 1356 1357 $( "form .formDropDown" ).each(function() { 1358 $( this ).addClass('form-control').unwrap().closest('.BLOBWidth100').attr('class','form-group'); 1359 var ls = $( this ).prev().find('.formDropDownLabel').unwrap(); 1360 $( this ).siblings('.formMandatory').appendTo( ls); 1361 }); 1362 1363 $( "form .formCheckboxLabel" ).each(function() { 1364 $( this ).addClass('form-control').unwrap().closest('.BLOBFloatClear').attr('class','form-check'); 1365 }); 1366 1367 $( "form .checkbox" ).each(function() { 1368 $( this ).addClass('form-control').unwrap(); 1369 }); 1370 1371 $( "form .checkbox" ).each(function() { 1372 var l = $( this ).find('.checkbox'); 1373 $( this ).siblings('.formMandatory').appendTo( l ); 1374 }); 1375 1376 $( "form .btn-secondary" ).each(function() { 1377 $( this ).unwrap().wrap( "<div class='cont-submit'></div>" ); 1378 }); 1379 1380 $(".form-check .formMandatory").unwrap(); 1381 1382 $( "form .radio" ).each(function() { 1383 $( this ).addClass('form-control').unwrap().closest('.BLOBFloatClear').attr('class','form-check'); 1384 }); 1385 1386 // $(".formRadio").unwrap(); 1387 1388 1389 // Imposta gli URL di condivisione social 1390 var wlh = window.location.href; 1391 1392 $('#swLi').attr('href' , '//www.linkedin.com/shareArticle?url=' + wlh); 1393 $('#swFb').attr('href' , '//www.facebook.com/sharer/sharer.php?u=' + wlh); 1394 1395 1396 //Mostriamo solo i primi 3 caratteri del mese 1397 $("#ChannelMonthList ol li a, #ChannelMonthList .ChannelSelItem,#ChannelMonthList .ChannelEmptyItem").each(function(){ 1398 $(this).text($(this).text().substring(0, 3)); 1399 }); 1400 1401 1402 1403 1404 /***************************************/ 1405
1406 // Sposta id="MenuPrincipale" in base al breakpoint 992px 1407 (function() { 1408 var menuNav = document.querySelector('.navbar-nav'); 1409 var contWrapHam = document.querySelector('.menuHamburger'); 1410 var breakpoint = 992; 1411 var lastState = null; 1412 1413 function updateMenuPrincipaleId() { 1414 if (!menuNav || !contWrapHam) return; 1415 1416 var isMobile = window.innerWidth < breakpoint; 1417 1418 // Evita operazioni inutili se lo stato non è cambiato 1419 if (lastState === isMobile) return; 1420 lastState = isMobile; 1421 1422 if (isMobile) { 1423 // Mobile: sposta id su cont-wrap-ham 1424 menuNav.removeAttribute('id'); 1425 contWrapHam.setAttribute('id', 'MenuPrincipale'); 1426 } else { 1427 // Desktop: ripristina id su nav 1428 contWrapHam.removeAttribute('id'); 1429 menuNav.setAttribute('id', 'MenuPrincipale'); 1430 } 1431 } 1432 1433 // Esegui al caricamento 1434 updateMenuPrincipaleId(); 1435 1436 // Esegui al resize con debounce 1437 var resizeTimer; 1438 window.addEventListener('resize', function() { 1439 clearTimeout(resizeTimer); 1440 resizeTimer = setTimeout(updateMenuPrincipaleId, 100); 1441 }); 1442 })(); 1443 1444 // Sposta id="MenuSezione" in base al breakpoint 992px 1445 (function() { 1446 var contMenuV = document.querySelector('.contMenuV'); 1447 var wrapMenuTopResp = document.querySelector('.WrapMenuTopResp'); 1448 var breakpoint = 992; 1449 var lastState = null; 1450 1451 function updateMenuSezioneId() { 1452 // Se non esistono i contenitori, esci 1453 if (!contMenuV && !wrapMenuTopResp) return; 1454 1455 var isMobile = window.innerWidth < breakpoint; 1456 1457 // Evita operazioni inutili se lo stato non è cambiato 1458 if (lastState === isMobile) return; 1459 lastState = isMobile; 1460 1461 if (isMobile) { 1462 // Mobile: sposta id su WrapMenuTopResp 1463 if (contMenuV) contMenuV.removeAttribute('id'); 1464 if (wrapMenuTopResp) wrapMenuTopResp.setAttribute('id', 'MenuSezione'); 1465 } else { 1466 // Desktop: sposta id su contMenuV 1467 if (wrapMenuTopResp) wrapMenuTopResp.removeAttribute('id'); 1468 if (contMenuV) contMenuV.setAttribute('id', 'MenuSezione'); 1469 } 1470 } 1471 1472 // Esegui al caricamento 1473 updateMenuSezioneId(); 1474 1475 // Esegui al resize con debounce 1476 var resizeTimer; 1477 window.addEventListener('resize', function() { 1478 clearTimeout(resizeTimer); 1479 resizeTimer = setTimeout(updateMenuSezioneId, 100); 1480 }); 1481 })(); 1482 1483 1484 // Focus Trap per Cookie Banner #eu-privacy 1485 (function() { 1486 var privacyBanner = null; 1487 var focusableEls = []; 1488 var firstFocusableEl = null; 1489 var lastFocusableEl = null; 1490 var isOpen = false; 1491 var keydownHandlerBound = false; 1492 1493 // Crea live region per annunci screen reader 1494 var liveRegion = document.createElement('div'); 1495 liveRegion.id = 'fx-privacy-live'; 1496 liveRegion.setAttribute('role', 'status'); 1497 liveRegion.setAttribute('aria-live', 'assertive'); 1498 liveRegion.setAttribute('aria-atomic', 'true'); 1499 liveRegion.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'; 1500 document.body.appendChild(liveRegion); 1501 1502 function announceToScreenReader(message) { 1503 liveRegion.textContent = ''; 1504 setTimeout(function() { 1505 liveRegion.textContent = message; 1506 }, 50); 1507 } 1508 1509 // Funzione per inizializzare il focus trap quando il banner esiste 1510 function initPrivacyBannerTrap() { 1511 privacyBanner = document.getElementById('eu-privacy'); 1512 if (!privacyBanner) return false; 1513 1514 // Observer per rilevare l'aggiunta/rimozione della classe "open" 1515 var classObserver = new MutationObserver(function(mutations) { 1516 mutations.forEach(function(mutation) { 1517 if (mutation.attributeName === 'class') { 1518 var nowOpen = privacyBanner.classList.contains('open'); 1519 if (nowOpen && !isOpen) { 1520 openPrivacyBanner(); 1521 } else if (!nowOpen && isOpen) { 1522 closePrivacyBanner(); 1523 } 1524 } 1525 }); 1526 }); 1527 1528 classObserver.observe(privacyBanner, { attributes: true }); 1529 1530 1531 1532 // Intercetta click su "Personalizza" per spostare il focus quando il banner si apre 1533 document.addEventListener('click', function(e) { 1534 var setBtn = e.target.closest('.eu-privacy-button-set'); 1535 if (setBtn) { 1536 // Attendi che il banner si apra e sposta il focus 1537 setTimeout(function() { 1538 if (privacyBanner && privacyBanner.classList.contains('open')) { 1539 openPrivacyBanner(); 1540 } 1541 }, 150); 1542 } 1543 }); 1544 1545 // Controlla stato iniziale 1546 if (privacyBanner.classList.contains('open')) { 1547 setTimeout(openPrivacyBanner, 100); 1548 } 1549 1550 return true; 1551 } 1552 1553 function openPrivacyBanner() { 1554 if (!privacyBanner) return; 1555 isOpen = true; 1556 1557 // Imposta attributi ARIA sul banner 1558 privacyBanner.setAttribute('role', 'dialog'); 1559 privacyBanner.setAttribute('aria-modal', 'true'); 1560 privacyBanner.setAttribute('aria-label', 'Informativa cookie'); 1561 1562 // Trova elementi focusabili nel banner 1563 updateFocusableElements(); 1564 1565 // Attiva focus trap (solo una volta) 1566 if (!keydownHandlerBound) { 1567 document.addEventListener('keydown', handleKeyDown, true); 1568 keydownHandlerBound = true; 1569 } 1570
1571 // Sposta il focus sul pulsante close per accessibilità 1572 setTimeout(function() { 1573 var closeButton = privacyBanner.querySelector('.eu-privacy-button-close'); 1574 if (closeButton) { 1575 closeButton.focus(); 1576 } else if (firstFocusableEl) { 1577 firstFocusableEl.focus(); 1578 } else { 1579 // Fallback: rendi il banner stesso focusabile 1580 privacyBanner.setAttribute('tabindex', '-1'); 1581 privacyBanner.focus(); 1582 } 1583 1584 // Annuncia apertura agli screen reader 1585 announceToScreenReader('Preferenze cookie aperte. Usa Tab per navigare, Escape per chiudere.'); 1586 }, 100); 1587 } 1588 1589 function closePrivacyBanner() { 1590 if (!privacyBanner) return; 1591 isOpen = false; 1592 1593 // Rimuovi attributi ARIA dal banner 1594 privacyBanner.removeAttribute('role'); 1595 privacyBanner.removeAttribute('aria-modal'); 1596 privacyBanner.removeAttribute('aria-label'); 1597 1598 // Annuncia chiusura agli screen reader 1599 announceToScreenReader('Preferenze cookie chiuse.'); 1600 1601 // Sposta focus all'inizio della pagina 1602 setTimeout(function() { 1603 var skipLink = document.querySelector('.skip-link'); 1604 var mainContent = document.getElementById('main-content'); 1605 var firstFocusable = document.querySelector('header a, header button, .skip-link'); 1606 1607 if (skipLink) { 1608 skipLink.focus(); 1609 } else if (mainContent) { 1610 mainContent.setAttribute('tabindex', '-1'); 1611 mainContent.focus(); 1612 } else if (firstFocusable) { 1613 firstFocusable.focus(); 1614 } 1615 }, 100); 1616 } 1617 1618 function updateFocusableElements() { 1619 if (!privacyBanner) return; 1620 1621 var selector = 1622 'a[href]:not([disabled]):not([tabindex="-1"]), ' + 1623 'button:not([disabled]):not([tabindex="-1"]), ' + 1624 'input:not([disabled]):not([tabindex="-1"]):not([type="hidden"]), ' + 1625 'textarea:not([disabled]):not([tabindex="-1"]), ' + 1626 'select:not([disabled]):not([tabindex="-1"]), ' + 1627 '[tabindex]:not([tabindex="-1"])'; 1628 1629 var candidates = privacyBanner.querySelectorAll(selector); 1630 focusableEls = []; 1631 1632 for (var i = 0; i < candidates.length; i++) { 1633 var el = candidates[i]; 1634 if (el.offsetParent !== null && !el.hidden) { 1635 focusableEls.push(el); 1636 } 1637 } 1638 1639 firstFocusableEl = focusableEls[0]; 1640 lastFocusableEl = focusableEls[focusableEls.length - 1]; 1641 } 1642 1643 function handleKeyDown(e) { 1644 if (!privacyBanner || !isOpen) return; 1645 1646 // ESC per chiudere 1647 if (e.key === 'Escape') { 1648 var closeButton = privacyBanner.querySelector('.eu-privacy-button-close'); 1649 if (closeButton) { 1650 closeButton.click(); 1651 } 1652 return; 1653 } 1654 1655 // TAB focus trap 1656 if (e.key === 'Tab') { 1657 updateFocusableElements(); 1658 1659 if (focusableEls.length === 0) { 1660 e.preventDefault(); 1661 return; 1662 } 1663 1664 if (e.shiftKey) { 1665 // SHIFT + TAB (backward) 1666 if (document.activeElement === firstFocusableEl || 1667 !privacyBanner.contains(document.activeElement)) { 1668 e.preventDefault();
1669 lastFocusableEl.focus(); 1670 } 1671 } else { 1672 // TAB (forward) 1673 if (document.activeElement === lastFocusableEl || 1674 !privacyBanner.contains(document.activeElement)) { 1675 e.preventDefault(); 1676 firstFocusableEl.focus(); 1677 } 1678 } 1679 } 1680 } 1681 1682 // Focus guard: se il focus esce dal banner, riportalo dentro 1683 // ECCEZIONE: permetti navigazione nel menu-responsive e hamburger 1684 function handleFocusGuard(e) { 1685 if (!privacyBanner || !isOpen) return; 1686 1687 // Permetti sempre il click/focus sull'hamburger button 1688 var hamburger = document.querySelector('.menuHamburger'); 1689 if (hamburger && (hamburger.contains(e.target) || e.target === hamburger)) { 1690 return; 1691 } 1692 1693 // Permetti navigazione nel menu-responsive quando è aperto 1694 var menuResponsive = document.querySelector('.menu-responsive'); 1695 if (menuResponsive && menuResponsive.classList.contains('showMenu')) { 1696 if (menuResponsive.contains(e.target)) { 1697 return; 1698 } 1699 } 1700 1701 if (!privacyBanner.contains(e.target)) { 1702 e.preventDefault(); 1703 e.stopPropagation(); 1704 updateFocusableElements(); 1705 if (firstFocusableEl) {
1706 firstFocusableEl.focus(); 1707 } else { 1708 privacyBanner.focus(); 1709 } 1710 } 1711 } 1712 1713 // Prova subito a inizializzare 1714 if (!initPrivacyBannerTrap()) { 1715 // Se il banner non esiste ancora, osserva il DOM per quando viene aggiunto 1716 var domObserver = new MutationObserver(function(mutations, observer) { 1717 if (document.getElementById('eu-privacy')) { 1718 if (initPrivacyBannerTrap()) { 1719 observer.disconnect(); // Smetti di osservare una volta inizializzato 1720 } 1721 } 1722 }); 1723 1724 domObserver.observe(document.body, { 1725 childList: true, 1726 subtree: true 1727 }); 1728 } 1729 1730 // Registra focus guard globale in capturing phase 1731 document.addEventListener('focus', handleFocusGuard, true); 1732 })(); 1733 1734 1735 // Lightbox accessibile per immagini con id="img-[numero]" e cursor:pointer 1736 (function() { 1737 // STEP 1: Disabilita COMPLETAMENTE FlexJS.ui.lightbox 1738 // Sovrascrive con funzione vuota e blocca future istanziazioni 1739 function disableFlexLightbox() { 1740 var emptyLightbox = function() { 1741 return { 1742 open: function(){}, 1743 close: function(){}, 1744 destroy: function(){} 1745 }; 1746 }; 1747 1748 // Se FlexJS esiste già , sovrascrivi 1749 if (typeof FlexJS !== 'undefined') { 1750 FlexJS.ui = FlexJS.ui || {}; 1751 FlexJS.ui.lightbox = emptyLightbox; 1752 } 1753 1754 // Crea/sovrascrivi su window per bloccare futuri caricamenti 1755 window.FlexJS = window.FlexJS || {}; 1756 window.FlexJS.ui = window.FlexJS.ui || {}; 1757 window.FlexJS.ui.lightbox = emptyLightbox; 1758 1759 // Blocca anche eventuali definizioni con Object.defineProperty 1760 try { 1761 Object.defineProperty(window.FlexJS.ui, 'lightbox', { 1762 value: emptyLightbox, 1763 writable: false, 1764 configurable: false 1765 }); 1766 } catch(e) {} 1767 } 1768 1769 disableFlexLightbox(); 1770 1771 // Trova tutte le immagini con id che inizia con "img-" e cursor:pointer 1772 var lightboxImages = document.querySelectorAll('img[id^="img-"][style*="cursor"]'); 1773 1774 if (lightboxImages.length === 0) return; 1775 1776 // Array per memorizzare le immagini per slick-lightbox 1777 var imagesData = []; 1778 1779 lightboxImages.forEach(function(img, index) { 1780 // Salta se l'immagine è già avvolta in un link (non gestito da noi) 1781 if (img.parentElement && img.parentElement.tagName === 'A' && !img.parentElement.classList.contains('fx-lightbox-link')) return; 1782 1783 // Ottieni l'URL dell'immagine (full size o src) 1784 var imgSrc = img.getAttribute('data-full') || img.getAttribute('data-src') || img.src; 1785 var imgAlt = img.alt || 'Immagine ' + (index + 1); 1786 var imgTitle = img.title || imgAlt; 1787 1788 // Salva dati immagine 1789 imagesData.push({ 1790 src: imgSrc, 1791 caption: imgAlt, 1792 originalImg: img 1793 }); 1794 1795 // STEP 2: Rimuovi TUTTI gli event listener clonando l'elemento 1796 var newImg = img.cloneNode(true); 1797 1798 // Rimuovi onclick inline dal clone 1799 newImg.removeAttribute('onclick'); 1800 newImg.onclick = null; 1801 1802 // Rimuovi cursor:pointer inline 1803 newImg.style.cursor = ''; 1804 1805 // Aggiungi attributi per accessibilità e identificazione 1806 newImg.setAttribute('data-lightbox-index', index); 1807 newImg.setAttribute('tabindex', '0'); 1808 newImg.setAttribute('role', 'button'); 1809 newImg.setAttribute('aria-label', 'Ingrandisci immagine: ' + imgAlt); 1810 newImg.setAttribute('title', 'Clicca per ingrandire: ' + imgTitle); 1811 newImg.classList.add('fx-lightbox-img'); 1812 1813 // Sostituisci l'originale con il clone (rimuove tutti gli event listener) 1814 img.parentNode.replaceChild(newImg, img); 1815 }); 1816 1817 if (imagesData.length === 0) return; 1818 1819 // Funzione per aprire il lightbox 1820 function openLightbox(index) { 1821 if (typeof $.fn.slickLightbox !== 'function') { 1822 console.warn('slick-lightbox non disponibile'); 1823 return; 1824 } 1825 1826 // Crea container temporaneo per slick-lightbox
1827 var $tempContainer = $('<div class="fx-lightbox-temp"></div>'); 1828 1829 imagesData.forEach(function(imgData) { 1830 $tempContainer.append('<a href="' + imgData.src + '" data-caption="' + imgData.caption.replace(/"/g, '"') + '"><img src="' + imgData.src + '" alt="' + imgData.caption.replace(/"/g, '"') + '"></a>'); 1831 }); 1832 1833 $('body').append($tempContainer); 1834 1835 // Salva l'elemento che aveva il focus prima di aprire 1836 var previousFocus = document.activeElement; 1837 1838 // ------------------------------------------------------- 1839 // IMPORTANTE: Registra MutationObserver PRIMA di aprire 1840 // la lightbox per catturare l'aggiunta al DOM 1841 // ------------------------------------------------------- 1842 var lightboxObserver = new MutationObserver(function(mutations) { 1843 mutations.forEach(function(mutation) { 1844 mutation.addedNodes.forEach(function(node) { 1845 if (node.nodeType === 1 && node.classList && node.classList.contains('slick-lightbox')) { 1846 lightboxObserver.disconnect(); 1847 setupLightboxTrap(node); 1848 } 1849 }); 1850 }); 1851 }); 1852 1853 lightboxObserver.observe(document.body, { childList: true }); 1854 1855 // Inizializza slick-lightbox 1856 $tempContainer.slickLightbox({ 1857 itemSelector: 'a', 1858 navigateByKeyboard: true, 1859 captionPosition: 'bottom', 1860 caption: function(element, info) { 1861 return '<span class="slick-lightbox-caption">' + 1862 ($(element).data('caption') || 'Immagine ' + (info.index + 1) + ' di ' + info.length) + 1863 '</span>'; 1864 }, 1865 slick: { 1866 initialSlide: index, 1867 accessibility: true, 1868 adaptiveHeight: true, 1869 arrows: true, 1870 dots: false, 1871 infinite: true, 1872 prevArrow: '<button type="button" class="slick-prev" aria-label="Immagine precedente"><span class="sr-only">Precedente</span></button>', 1873 nextArrow: '<button type="button" class="slick-next" aria-label="Immagine successiva"><span class="sr-only">Successiva</span></button>' 1874 }, 1875 layouts: { 1876 closeButton: '<button type="button" class="slick-lightbox-close" aria-label="Chiudi lightbox"><span aria-hidden="true">×</span></button>' 1877 } 1878 }); 1879 1880 // Apri il lightbox cliccando sul link corretto 1881 $tempContainer.find('a').eq(index).click(); 1882 1883 function setupLightboxTrap(lightboxEl) { 1884 var $lightbox = $(lightboxEl); 1885 var totalImages = imagesData.length; 1886 var currentSlideIndex = index; 1887 1888 // ------------------------------------------------------- 1889 // Live region per screen reader: creata una sola volta 1890 // ------------------------------------------------------- 1891 var liveRegion = document.getElementById('fx-lightbox-live'); 1892 if (!liveRegion) { 1893 liveRegion = document.createElement('div'); 1894 liveRegion.id = 'fx-lightbox-live'; 1895 liveRegion.setAttribute('role', 'status'); 1896 liveRegion.setAttribute('aria-live', 'assertive'); 1897 liveRegion.setAttribute('aria-atomic', 'true'); 1898 liveRegion.setAttribute('aria-relevant', 'additions text'); 1899 liveRegion.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'; 1900 document.body.appendChild(liveRegion); 1901 } 1902 1903 function announceToScreenReader(msg) { 1904 // Forza rilancio anche se stesso testo 1905 liveRegion.textContent = ''; 1906 setTimeout(function() { 1907 liveRegion.textContent = msg; 1908 }, 50); 1909 } 1910 1911 function buildSlideAnnouncement(slideIdx) { 1912 var caption = imagesData[slideIdx] ? imagesData[slideIdx].caption : ('Immagine ' + (slideIdx + 1)); 1913 return 'Immagine ' + (slideIdx + 1) + ' di ' + totalImages + ': ' + caption; 1914 } 1915 1916 // ------------------------------------------------------- 1917 // Titolo nascosto per aria-labelledby del dialog 1918 // ------------------------------------------------------- 1919 var dialogTitleId = 'fx-lightbox-title'; 1920 var dialogTitle = lightboxEl.querySelector('#' + dialogTitleId); 1921 if (!dialogTitle) { 1922 dialogTitle = document.createElement('span'); 1923 dialogTitle.id = dialogTitleId; 1924 dialogTitle.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'; 1925 dialogTitle.textContent = 'Visualizzatore immagini'; 1926 lightboxEl.insertBefore(dialogTitle, lightboxEl.firstChild); 1927 } 1928 1929 // ------------------------------------------------------- 1930 // Attributi ARIA sul dialog 1931 // ------------------------------------------------------- 1932 $lightbox.attr({ 1933 'role': 'dialog',
1934 'aria-modal': 'true', 1935 'aria-labelledby': dialogTitleId 1936 }); 1937 $lightbox.removeAttr('aria-label'); 1938 1939 // Applica inert e tabindex=-1 a TUTTI gli elementi fuori dalla lightbox 1940 $('body > *:not(.slick-lightbox)').each(function() { 1941 var $el = $(this); 1942 if ($el.is('script, style, link, noscript')) return; 1943 $el.attr('inert', ''); 1944 $el.attr('aria-hidden', 'true'); 1945 // Disabilita anche tutti gli elementi focusable dentro 1946 $el.find('a, button, input, select, textarea, [tabindex]').each(function() { 1947 var $focusable = $(this); 1948 var origTabindex = $focusable.attr('tabindex'); 1949 if (origTabindex !== undefined) { 1950 $focusable.attr('data-orig-tabindex', origTabindex); 1951 } 1952 $focusable.attr('tabindex', '-1'); 1953 }); 1954 }); 1955 1956 // ------------------------------------------------------- 1957 // Annuncio apertura per screen reader 1958 // ------------------------------------------------------- 1959 setTimeout(function() { 1960 var openMsg = 'Visualizzatore immagini aperto. ' + 1961 buildSlideAnnouncement(currentSlideIndex) + '. ' + 1962 'Usa Tab per navigare tra i controlli, Frecce sinistra e destra per cambiare immagine, Escape per chiudere.'; 1963 announceToScreenReader(openMsg); 1964 }, 100); 1965 1966 // ------------------------------------------------------- 1967 // Aggiorna live region al cambio slide (evento slick) 1968 // ------------------------------------------------------- 1969 var slickInner = lightboxEl.querySelector('.slick-initialized'); 1970 if (slickInner) { 1971 $(slickInner).on('afterChange.fxLightbox', function(event, slick, slideIdx) { 1972 currentSlideIndex = slideIdx; 1973 announceToScreenReader(buildSlideAnnouncement(slideIdx)); 1974 }); 1975 } 1976 1977 // ------------------------------------------------------- 1978 // Funzione helper: raccoglie tutti i focusabili visibili 1979 // ------------------------------------------------------- 1980 function getLightboxFocusables() { 1981 var nodes = lightboxEl.querySelectorAll( 1982 'button:not([disabled]), a[href], input:not([disabled]), ' + 1983 'select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])' 1984 ); 1985 var result = []; 1986 for (var i = 0; i < nodes.length; i++) { 1987 if (nodes[i].offsetParent !== null && !nodes[i].hidden) { 1988 result.push(nodes[i]); 1989 } 1990 } 1991 return result; 1992 } 1993 1994 // ------------------------------------------------------- 1995 // FOCUS TRAP: Definisci handlers SUBITO (sincrono) 1996 // ------------------------------------------------------- 1997 function lightboxFocusTrap(e) { 1998 if (e.key !== 'Tab') return; 1999 2000 e.preventDefault(); 2001 e.stopPropagation(); 2002 e.stopImmediatePropagation(); 2003 2004 var focusables = getLightboxFocusables(); 2005 2006 if (focusables.length === 0) { 2007 lightboxEl.focus(); 2008 return; 2009 } 2010 2011 var first = focusables[0]; 2012 var last = focusables[focusables.length - 1]; 2013 var idx = focusables.indexOf(document.activeElement); 2014 2015 if (e.shiftKey) { 2016 if (idx <= 0) { 2017 last.focus(); 2018 } else { 2019 focusables[idx - 1].focus(); 2020 } 2021 } else { 2022 if (idx === -1 || idx >= focusables.length - 1) { 2023 first.focus(); 2024 } else { 2025 focusables[idx + 1].focus(); 2026 } 2027 } 2028 } 2029 2030 function lightboxEscHandler(e) { 2031 if (e.key !== 'Escape') return; 2032 e.preventDefault(); 2033 e.stopPropagation(); 2034 e.stopImmediatePropagation(); 2035 var closeBtn = lightboxEl.querySelector('.slick-lightbox-close'); 2036 if (closeBtn) closeBtn.click(); 2037 } 2038 2039 function lightboxFocusGuard(e) { 2040 if (lightboxEl.contains(e.target)) return; 2041 e.preventDefault(); 2042 e.stopPropagation(); 2043 var closeBtn = lightboxEl.querySelector('.slick-lightbox-close'); 2044 if (closeBtn && closeBtn.offsetParent !== null) { 2045 closeBtn.focus(); 2046 } else { 2047 lightboxEl.focus(); 2048 } 2049 } 2050 2051 // ------------------------------------------------------- 2052 // REGISTRA handlers SINCRONO (PRIMA di spostare il focus) 2053 // ------------------------------------------------------- 2054 document.addEventListener('keydown', lightboxFocusTrap, true); 2055 document.addEventListener('keydown', lightboxEscHandler, true); 2056 document.addEventListener('focus', lightboxFocusGuard, true); 2057 2058 // ------------------------------------------------------- 2059 // FOCUS IMMEDIATO: Entra subito nel lightbox 2060 // ------------------------------------------------------- 2061 lightboxEl.setAttribute('tabindex', '-1'); 2062 2063 // Blocca IMMEDIATAMENTE qualsiasi focus esterno 2064 lightboxEl.focus(); 2065 2066 // -------------------------------------------------------
2067 // Sposta il focus sulla X con polling robusto 2068 // Usa requestAnimationFrame + retry per assicurarsi che 2069 // il close button sia presente e visibile 2070 // ------------------------------------------------------- 2071 function focusCloseButton(attempts) { 2072 if (attempts <= 0) return; 2073 2074 var closeBtn = lightboxEl.querySelector('.slick-lightbox-close'); 2075 if (closeBtn && closeBtn.offsetParent !== null) { 2076 closeBtn.focus(); 2077 return; 2078 } 2079 2080 // Prova ancora al prossimo frame 2081 requestAnimationFrame(function() { 2082 focusCloseButton(attempts - 1); 2083 }); 2084 } 2085 2086 // Inizia il polling dopo il primo paint 2087 requestAnimationFrame(function() { 2088 requestAnimationFrame(function() { 2089 focusCloseButton(10); // Max 10 tentativi (~160ms) 2090 }); 2091 }); 2092 2093 // Cleanup - osserva rimozione lightbox 2094 var cleanupObserver = new MutationObserver(function(mutations) { 2095 mutations.forEach(function(mutation) { 2096 mutation.removedNodes.forEach(function(node) { 2097 if (node === lightboxEl || (node.nodeType === 1 && node.classList && node.classList.contains('slick-lightbox'))) { 2098 // Rimuovi handlers 2099 document.removeEventListener('keydown', lightboxFocusTrap, true); 2100 document.removeEventListener('keydown', lightboxEscHandler, true); 2101 document.removeEventListener('focus', lightboxFocusGuard, true); 2102 cleanupObserver.disconnect(); 2103 2104 // Annuncio chiusura per screen reader 2105 if (liveRegion) { 2106 announceToScreenReader('Visualizzatore immagini chiuso.'); 2107 } 2108 2109 // Controlla PRIMA se il banner cookie era già chiuso 2110 var $privacyBanner = $('#eu-privacy'); 2111 var bannerWasClosed = $privacyBanner.length && 2112 ($privacyBanner.is(':hidden') || 2113 $privacyBanner.css('display') === 'none' || 2114 $privacyBanner.hasClass('eu-privacy-hide') || 2115 $privacyBanner.attr('aria-hidden') === 'true'); 2116 2117 // Ripristina elementi (escludi banner se era chiuso) 2118 $('body > *[inert]').each(function() { 2119 var $el = $(this); 2120 2121 // Salta il banner cookie se era già chiuso 2122 if ($el.attr('id') === 'eu-privacy' && bannerWasClosed) { 2123 return; // continua al prossimo elemento 2124 } 2125 2126 $el.removeAttr('inert'); 2127 $el.removeAttr('aria-hidden'); 2128 $el.find('[data-orig-tabindex]').each(function() { 2129 var $focusable = $(this); 2130 $focusable.attr('tabindex', $focusable.attr('data-orig-tabindex')); 2131 $focusable.removeAttr('data-orig-tabindex'); 2132 }); 2133 $el.find('a[tabindex="-1"], button[tabindex="-1"], input[tabindex="-1"], select[tabindex="-1"], textarea[tabindex="-1"]').each(function() { 2134 if (!$(this).attr('data-orig-tabindex')) { 2135 $(this).removeAttr('tabindex'); 2136 } 2137 }); 2138 }); 2139 2140 // Ripristina focus 2141 setTimeout(function() { 2142 if (previousFocus && typeof previousFocus.focus === 'function') { 2143 previousFocus.focus(); 2144 } 2145 }, 50); 2146 } 2147 }); 2148 }); 2149 }); 2150 2151 cleanupObserver.observe(document.body, { childList: true }); 2152 } 2153 2154 // Rimuovi container quando lightbox si chiude 2155 $(document).one('afterHide.slickLightbox', function() { 2156 $tempContainer.remove(); 2157 }); 2158 } 2159 2160 // STEP 3: Usa CAPTURING phase per intercettare click PRIMA di altri handler 2161 document.addEventListener('click', function(e) { 2162 var img = e.target.closest('.fx-lightbox-img'); 2163 if (!img) return; 2164 2165 e.preventDefault(); 2166 e.stopPropagation(); 2167 e.stopImmediatePropagation(); 2168 2169 var index = parseInt(img.getAttribute('data-lightbox-index'), 10); 2170 if (!isNaN(index)) { 2171 openLightbox(index); 2172 } 2173 2174 return false;
2175 }, true); // true = capturing phase 2176 2177 // Supporto tastiera (Enter e Space) - anche in capturing 2178 document.addEventListener('keydown', function(e) { 2179 if (e.key !== 'Enter' && e.key !== ' ') return; 2180 2181 var img = e.target.closest('.fx-lightbox-img'); 2182 if (!img) return; 2183 2184 e.preventDefault(); 2185 e.stopPropagation(); 2186 e.stopImmediatePropagation(); 2187 2188 var index = parseInt(img.getAttribute('data-lightbox-index'), 10); 2189 if (!isNaN(index)) { 2190 openLightbox(index); 2191 } 2192 2193 return false; 2194 }, true); // true = capturing phase 2195 2196 // Aggiungi CSS per focus visibile e cursore sulle immagini lightbox 2197 var lightboxStyle = document.createElement('style'); 2198 lightboxStyle.textContent = '\ 2199 .fx-lightbox-img { \ 2200 cursor: pointer !important; \ 2201 } \ 2202 .fx-lightbox-img:focus-visible { \ 2203 outline: 3px solid var(--color-focus, #005fcc); \ 2204 outline-offset: 3px; \ 2205 border-radius: 2px; \ 2206 } \ 2207 .slick-lightbox-close:focus-visible { \ 2208 outline: 3px solid #fff; \ 2209 outline-offset: 2px; \ 2210 } \ 2211 .slick-lightbox .slick-prev:focus-visible, \ 2212 .slick-lightbox .slick-next:focus-visible { \ 2213 outline: 3px solid #fff; \ 2214 outline-offset: 2px; \ 2215 } \ 2216 .fx-lightbox-temp { \ 2217 display: none; \ 2218 } \ 2219 '; 2220 document.head.appendChild(lightboxStyle); 2221 })(); 2222 2223 // Rimuove attributo title dai link nella navbar dell'header 2224 (function() { 2225 document.querySelectorAll('header .navbar-nav a[title]').forEach(function(link) { 2226 link.removeAttribute('title'); 2227 }); 2228 })(); 2229 2230 // Imposta aria-current="true" sugli elementi strong nel menu laterale e nella nav 2231 $('.contMenuV .indexBlock .indexList ol li.LIStrong strong, nav ol li strong').attr('aria-current', 'true'); 2232 2233 // Aggiunge alt="" alle immagini che non hanno l'attributo alt 2234 $('img:not([alt])').attr('alt', ''); 2235 2236 // Accessibilità Slick Slider 2237 (function() { 2238 // Traduzioni per aria-label 2239 var translations = { 2240 'Previous': 'Vai alla slide precedente', 2241 'Next': 'Vai alla slide successiva', 2242 'Go to slide': 'Vai alla slide' 2243 }; 2244 2245 function fixSlickAccessibility() { 2246 // 1. Rimuovi tabindex="0" dagli slick-slide (tutti, non solo visibili) 2247 document.querySelectorAll('.slick-slider .slick-slide[tabindex="0"]').forEach(function(slide) { 2248 slide.removeAttribute('tabindex'); 2249 }); 2250 2251 // 2. Rendi focusabili i li di slick-dots e i loro button 2252 document.querySelectorAll('.slick-slider .slick-dots li').forEach(function(li, index) { 2253 var button = li.querySelector('button'); 2254 if (button) { 2255 // Rimuovi title se presente 2256 if (button.hasAttribute('title')) { 2257 button.removeAttribute('title'); 2258 } 2259 button.removeAttribute('tabindex'); 2260 } 2261 }); 2262 2263 // 3. Traduci aria-label dei pulsanti prev/next e sostituisci title con aria-label 2264 document.querySelectorAll('.slick-slider .slick-prev').forEach(function(btn) { 2265 if (btn.hasAttribute('title')) { 2266 btn.removeAttribute('title'); 2267 } 2268 btn.setAttribute('aria-label', translations['Previous']); 2269 }); 2270 2271 document.querySelectorAll('.slick-slider .slick-next').forEach(function(btn) { 2272 if (btn.hasAttribute('title')) { 2273 btn.removeAttribute('title'); 2274 } 2275 btn.setAttribute('aria-label', translations['Next']); 2276 }); 2277 2278 // 4. Traduci "Go to slide" in "Vai alla slide" negli span .slick-sr-only 2279 document.querySelectorAll('.slick-slider .slick-dots li .slick-sr-only').forEach(function(span) { 2280 if (span.textContent && span.textContent.indexOf('Go to slide') === 0) { 2281 span.textContent = span.textContent.replace('Go to slide', translations['Go to slide']); 2282 } 2283 }); 2284 2285 // 5. Gestione ordine tab: prima contenuti slide, poi dots alla fine 2286 document.querySelectorAll('.slick-slider').forEach(function(slider) { 2287 var $slider = $(slider); 2288 if (!$slider.hasClass('slick-initialized')) return; 2289 2290 // Nascondi dots e controlli dalla navigazione tab finché non si è navigato tutte le slide 2291 var dots = slider.querySelector('.slick-dots'); 2292 var autoplayBtn = slider.querySelector('.slick-autoplay-toggle-button'); 2293 2294 if (dots) { 2295 // I dots vengono resi tabbabili solo dopo le slide 2296 dots.querySelectorAll('button').forEach(function(btn
2296) { 2297 btn.setAttribute('tabindex', '0'); 2298 }); 2299 } 2300 2301 if (autoplayBtn) { 2302 autoplayBtn.setAttribute('tabindex', '0'); 2303 } 2304 2305 // Rendi non focusabili i contenuti delle slide non attive 2306 slider.querySelectorAll('.slick-slide:not(.slick-active)').forEach(function(slide) { 2307 slide.querySelectorAll('a, button, input, select, textarea, [tabindex]').forEach(function(el) { 2308 el.setAttribute('tabindex', '-1'); 2309 }); 2310 }); 2311 2312 // Rendi focusabili i contenuti della slide attiva 2313 slider.querySelectorAll('.slick-slide.slick-active').forEach(function(slide) { 2314 slide.querySelectorAll('a, button, input, select, textarea, [tabindex="-1"]').forEach(function(el) { 2315 // Ripristina tabindex solo per elementi che non sono controlli slick 2316 if (!el.classList.contains('slick-prev') && !el.classList.contains('slick-next')) { 2317 el.setAttribute('tabindex', '0'); 2318 } 2319 }); 2320 }); 2321 }); 2322 } 2323 2324 // Gestione navigazione tastiera: scorre automaticamente alla slide quando un elemento riceve focus 2325 $(document).on('focusin', '.slick-slider .slick-slide', function(e) { 2326 var $slide = $(this); 2327 var $slider = $slide.closest('.slick-slider'); 2328 2329 if (!$slider.hasClass('slick-initialized')) return; 2330 2331 // Ottieni l'indice reale della slide (slick usa data-slick-index) 2332 var slideIndex = $slide.data('slick-index'); 2333 2334 // Se la slide non è attiva, scorri ad essa 2335 if (!$slide.hasClass('slick-active') && typeof slideIndex !== 'undefined') { 2336 $slider.slick('slickGoTo', slideIndex); 2337 2338 // Dopo lo scorrimento, rimetti il focus sull'elemento che lo aveva 2339 setTimeout(function() { 2340 if (document.activeElement && $.contains($slide[0], document.activeElement)) { 2341 // Il focus è già corretto 2342 } else { 2343 // Trova il primo elemento focusabile nella slide e dagli focus 2344 var $focusable = $slide.find('a, button, input, select, textarea, [tabindex="0"]').filter(':visible').first(); 2345 if ($focusable.length) { 2346 $focusable.focus(); 2347 } 2348 } 2349 }, 100); 2350 } 2351 }); 2352 2353 // Esegui fix dopo inizializzazione slick 2354 // Usa MutationObserver per catturare quando slick viene inizializzato 2355 var observer = new MutationObserver(function(mutations) { 2356 mutations.forEach(function(mutation) { 2357 mutation.addedNodes.forEach(function(node) { 2358 if (node.nodeType === 1) { 2359 if (node.classList && (node.classList.contains('slick-slider') || node.classList.contains('slick-initialized'))) { 2360 setTimeout(fixSlickAccessibility, 100); 2361 } 2362 if (node.querySelectorAll) { 2363 var sliders = node.querySelectorAll('.slick-slider, .slick-initialized'); 2364 if (sliders.length) { 2365 setTimeout(fixSlickAccessibility, 100); 2366 } 2367 } 2368 } 2369 }); 2370 }); 2371 }); 2372 2373 observer.observe(document.body, { childList: true, subtree: true }); 2374 2375 // Esegui anche al caricamento per slider già esistenti 2376 $(document).ready(function() { 2377 setTimeout(fixSlickAccessibility, 500); 2378 }); 2379 2380 // Esegui dopo ogni cambio slide per mantenere le correzioni 2381 $(document).on('afterChange', '.slick-slider', function() { 2382 fixSlickAccessibility(); 2383 }); 2384 2385 // Esegui anche su init di slick 2386 $(document).on('init', '.slick-slider', function() { 2387 setTimeout(fixSlickAccessibility, 100); 2388 }); 2389 })(); 2390 2391 // Accessibilità errori form: aggiunge role="alert" e annuncia a screen reader 2392 (function() { 2393 // Crea una live region nascosta per annunci screen reader 2394 var liveRegion = document.createElement('div'); 2395 liveRegion.id = 'fx-form-error-live'; 2396 liveRegion.setAttribute('role', 'status'); 2397 liveRegion.setAttribute('aria-live', 'assertive'); 2398 liveRegion.setAttribute('aria-atomic', 'true'); 2399 liveRegion.style.cssText = 'position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;'; 2400 document.body.appendChild(liveRegion); 2401 2402 function announceToScreenReader(message) { 2403 // Forza rilancio anche se stesso testo 2404 liveRegion.textContent = ''; 2405 setTimeout(function() { 2406 liveRegion.textContent = message; 2407 }, 100); 2408 } 2409 2410 function addAlertRole(element) { 2411 if (!element.hasAttribute('role')) { 2412 element.setAttribute('role', 'alert'); 2413 } 2414 } 2415 2416 function collectAndAnnounceErrors() { 2417 var errors = document.querySelectorAll('.formError, .formErrorList'); 2418 if (errors.length === 0) return; 2419 2420 // Aggiungi role="alert" a tutti gli errori
2421 errors.forEach(addAlertRole); 2422 2423 // Raccogli il testo degli errori per l'annuncio 2424 var errorMessages = []; 2425 errors.forEach(function(el) { 2426 var text = el.textContent.trim(); 2427 if (text && errorMessages.indexOf(text) === -1) { 2428 errorMessages.push(text); 2429 } 2430 }); 2431 2432 if (errorMessages.length > 0) { 2433 var announcement = 'Attenzione: ' + 2434 (errorMessages.length === 1 2435 ? 'si è verificato un errore. ' 2436 : 'si sono verificati ' + errorMessages.length + ' errori. ') + 2437 errorMessages.join('. '); 2438 2439 announceToScreenReader(announcement); 2440 2441 // Sposta il focus sul primo errore per facilitare la correzione 2442 var firstError = document.querySelector('.formError, .formErrorList'); 2443 if (firstError) { 2444 firstError.setAttribute('tabindex', '-1'); 2445 firstError.focus(); 2446 } 2447 } 2448 } 2449 2450 // Esegui al caricamento pagina (per errori già presenti dopo submit) 2451 collectAndAnnounceErrors(); 2452 2453 // Osserva il DOM per elementi aggiunti dinamicamente (validazione AJAX) 2454 var observer = new MutationObserver(function(mutations) { 2455 var hasNewErrors = false; 2456 2457 mutations.forEach(function(mutation) { 2458 mutation.addedNodes.forEach(function(node) { 2459 if (node.nodeType !== 1) return; 2460 2461 // Controlla se il nodo stesso è un errore form 2462 if (node.classList && (node.classList.contains('formError') || node.classList.contains('formErrorList'))) { 2463 hasNewErrors = true; 2464 } 2465 2466 // Controlla i figli del nodo 2467 if (node.querySelectorAll) { 2468 var childErrors = node.querySelectorAll('.formError, .formErrorList'); 2469 if (childErrors.length > 0) { 2470 hasNewErrors = true; 2471 } 2472 } 2473 }); 2474 }); 2475 2476 // Se ci sono nuovi errori, annunciali 2477 if (hasNewErrors) { 2478 // Piccolo delay per raccogliere tutti gli errori aggiunti insieme 2479 setTimeout(collectAndAnnounceErrors, 50); 2480 } 2481 }); 2482 2483 observer.observe(document.body, { childList: true, subtree: true }); 2484 })(); 2485 2486 // Sposta value precompilato in placeholder e svuota value 2487 (function() { 2488 var inputs = document.querySelectorAll('form input[type="text"], form input[type="email"], form input[type="tel"], form input[type="url"], form input[type="number"], form textarea'); 2489 2490 inputs.forEach(function(input) { 2491 var value = input.value.trim(); 2492 // Se ha un value precompilato e non ha già un placeholder 2493 if (value && !input.hasAttribute('placeholder')) { 2494 input.setAttribute('placeholder', value); 2495 input.value = ''; 2496 } 2497 }); 2498 })(); 2499 2500 // Accessibilità Owl Carousel: aggiunge aria-label ai pulsanti di navigazione 2501 (function() { 2502 function fixOwlNavAccessibility() { 2503 // Pulsanti prev 2504 document.querySelectorAll('.owl-nav .owl-prev, .owl-nav button.owl-prev').forEach(function(btn) { 2505 if (!btn.hasAttribute('aria-label')) { 2506 btn.setAttribute('aria-label', 'Elemento precedente'); 2507 } 2508 }); 2509 2510 // Pulsanti next 2511 document.querySelectorAll('.owl-nav .owl-next, .owl-nav button.owl-next').forEach(function(btn) { 2512 if (!btn.hasAttribute('aria-label')) { 2513 btn.setAttribute('aria-label', 'Elemento successivo'); 2514 } 2515 }); 2516 2517 // Pulsanti dots (se presenti) 2518 document.querySelectorAll('.owl-dots .owl-dot, .owl-dots button.owl-dot').forEach(function(btn, index) { 2519 if (!btn.hasAttribute('aria-label')) { 2520 btn.setAttribute('aria-label', 'Vai all\'elemento ' + (index + 1)); 2521 } 2522 }); 2523 } 2524 2525 // Esegui al caricamento 2526 fixOwlNavAccessibility(); 2527 2528 // Osserva il DOM per carousel inizializzati dinamicamente 2529 var observer = new MutationObserver(function(mutations) { 2530 var hasOwlChanges = false;
2531 2532 mutations.forEach(function(mutation) { 2533 mutation.addedNodes.forEach(function(node) { 2534 if (node.nodeType !== 1) return; 2535 2536 if (node.classList && (node.classList.contains('owl-nav') || node.classList.contains('owl-dots') || node.classList.contains('owl-carousel'))) { 2537 hasOwlChanges = true; 2538 } 2539 2540 if (node.querySelectorAll) { 2541 var owlElements = node.querySelectorAll('.owl-nav, .owl-dots, .owl-carousel'); 2542 if (owlElements.length > 0) { 2543 hasOwlChanges = true; 2544 } 2545 } 2546 }); 2547 }); 2548 2549 if (hasOwlChanges) { 2550 setTimeout(fixOwlNavAccessibility, 100); 2551 } 2552 }); 2553 2554 observer.observe(document.body, { childList: true, subtree: true }); 2555 })(); 2556 2557 2558});</script>
2558 2559 2560</body> 2561</html>
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.