An error occurred while processing the template.
The following has evaluated to null or missing:
==> response.data.docs.getJSONObject(0) [in template "3572636#3572671#4340004" at line 28, column 24]
----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign doc = response.data.docs.getJ... [in template "3572636#3572671#4340004" at line 28, column 9]
---- 1<#import "_TEMPLATE_CONTEXT_/3572636/3574130/23609/3793037" as d40> 2 3<#setting url_escaping_charset="UTF-8"> 4 5<#assign 6 PUTIL = objectUtil("com.liferay.portal.kernel.util.PortalUtil") 7 uuid = themeDisplay.getURLCurrent()?keep_after("-/c/n/")?keep_before("?")?keep_after_last("_") 8 langId = locale?keep_before("_") 9 contentType = "poi" 10 vueActions = "" 11 doc = "" 12 lat = "0" 13 lng = "0" 14 hasCoords = false 15/> 16 17<#-- <#assign z=request.setAttribute("ogTitle","title")> 18<#assign z=request.setAttribute("ogImage","imgg")> 19<#assign z=request.setAttribute("ogDesc","desc")> --> 20 21<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 22<#assign z=request.setAttribute("ogUrl","${currentUrl}")> 23 24<#if uuid?has_content> 25 <#assign response = d40.fetchData("https://guestapp.d40.it/v1/search/apt-trento/${contentType}/?uuid=${uuid}")> 26 27 <#if !response.error && response.data.docs?has_content> 28 <#assign doc = response.data.docs.getJSONObject(0)> 29 30 ${request.session.removeAttribute("circularCategories")} 31 ${request.session.setAttribute("circularCategories", doc.details.assetCategoryIds)} 32 </#if> 33</#if> 34 35<#if doc?has_content> 36 <#if doc.details?? && doc.details.name[langId]?has_content> 37 ${PUTIL.setPageTitle(doc.details.name[langId], request)} 38 </#if> 39 40 <#assign vueActions = "getFavorites();"> 41 42 <#if doc.details.location.geoCoords.lat?has_content && doc.details.location.geoCoords.lon?has_content> 43 <#assign 44 hasCoords = true 45 lat = doc.details.location.geoCoords.lat 46 lng = doc.details.location.geoCoords.lon 47 vueActions = "getFavorites();buildMap(${lat}, ${lng})" 48 /> 49 </#if> 50</#if> 51 52<style> 53 .swiper-button-next:after{ 54 content: ""; 55 } 56 .swiper-button-prev:after{ 57 content: ""; 58 } 59 .bg-darkgray{ 60 background-color: #e5e5e5 !important; 61 } 62 .min-h-12{ 63 min-height: 3rem; 64 } 65 .-ml-5{ 66 margin-left: -5%; 67 } 68</style> 69 70<div v-scope id="${d40.portletNamespace}" @vue:mounted="${vueActions}" v-cloak> 71 <#if doc?has_content> 72 <#if themeDisplay.getLayout().getAncestors()?has_content> 73 <section id="breadcrumb" class="z-15 mt-25"> 74 <div class="container"> 75 <ol class="breadcrumb flex lg:justify-center"> 76 <li class="pl-1 text-sm mr-2 relative">${d40.getLabel("sei_in")}:</li> 77 78 <li class="breadcrumb-item"> 79 <a href="/" class="breadcrumb-link" title="Home"> 80 <span class="breadcrumb-text-truncate text-dark underline">Home</span> 81 </a> 82 </li> 83 84 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor> 85 <li class="breadcrumb-item"> 86 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${d40.escape(ancestor.getHTMLTitle(locale))}"> 87 <span class="breadcrumb-text-truncate text-dark underline"> 88 ${d40.escape(ancestor.getHTMLTitle(locale))} 89 </span> 90 </a> 91 </li> 92 </#list> 93 94 <li class="breadcrumb-item active"> 95 <span class="breadcrumb-text-truncate text-dark"> 96 ${doc.details.name[langId]} 97 </span> 98 </li> 99 </ol> 100 </div> 101 </section> 102 </#if> 103 104 <section class="relative mt-20"> 105 <div class="container"> 106 <div class="row"> 107 <div class="col-12 col-lg-7"> 108 <div class="card-row flex-col lg:flex-row mb-10"> 109 <div class="autofit-col autofit-col-expand order-2 lg:order-1"> 110 <div class="autofit-section"> 111 <p class="text-dark font-semibold font-heading text-3xl lg:text-4xl uppercase"> 112 ${doc.details.name[langId]} 113 <#assign z=request.setAttribute("ogTitle","${doc.details.name[langId]}")> 114 </p> 115 </div> 116 </div> 117 <div class="autofit-col justify-start order-1 lg:order-2 mb-3 lg:mb-0"> 118 <div class="autofit-section"> 119 <div class="flex space-x-4"> 120 <button type="button" v-if="isFavorite('${doc.uuid}')" @click="removeFavorite($event, '${doc.uuid}')" class="btn btn-link px-2"> 121 <i class="fas fa-heart text-dark fa-2x"></i> 122 </button> 123 <button type="button" v-else @click="setFavorite($event, {id: '${doc.uuid}', contentJSON: {title: '${doc.details.name[langId]?js_string}', previewDescription: '', description: '', geoRef: '', previewPicture: '${d40.getDTNPreview(doc)}', viewUrl: '${d40.getDTNUrl(doc.details.name[langId], doc.uuid, contentType)}'}})" class="btn btn-link px-2"> 124 <i class="fal fa-heart text-dark fa-2x"></i> 125 </button> 126 127 <button type="button" @click="share('${doc.details.name[langId]}', '')" class="btn btn-link px-2"> 128 <i class="fas fa-share-alt text-dark fa-2x"></i> 129 </button> 130 </div> 131 </div> 132 </div> 133 </div> 134 135 <#if doc.timetables.timeDescription[langId]?has_content> 136 <div class="text-dark text-lg font-light mb-15 mt-5"> 137 ${doc.timetables.timeDescription[langId]} 138 </div> 139 </#if> 140 141 <#if doc.details.description[langId]?has_content> 142 <div class="underline-grow text-dark font-light lg:text-lg leading-loose"> 143 ${doc.details.description[langId]} 144 145 <#if doc.details.description[langId]?length lt 160> 146 <#assign 147 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}") 148 /> 149 <#else> 150 <#assign 151 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])?substring(0,160)}") 152 /> 153 </#if> 154 </div> 155 </#if> 156 </div> 157 158 <div class="xl:absolute col-12 col-lg-5 xl:max-w-xl lg:right-0"> 159 <div class="bg-light"> 160 <div class="card-body px-5 pt-5 lg:px-10 lg:pt-10 pb-0"> 161 <p class="text-dark font-bold uppercase text-lg mb-0"> 162 ${d40.getLabel("informazioni_contatti")} 163 </p> 164 <#if doc.details.townLabel != "{}"> 165 <p class="text-dark text-lg mb-0"> 166 ${d40.getLabel("localita")}: <span class="text-capitalize">${doc.details.townLabel[langId]}</span> 167 </p> 168 </#if> 169 <#if doc.timetables.timeInfos?has_content> 170 <p class="text-dark font-bold text-lg mb-0 mt-3 d-none"> 171 ${d40.getLabel("date_apertura")} 172 </p> 173 </#if> 174 </div> 175 176 177 <#if doc.timetables.timeInfos?has_content> 178 <div class="flex"> 179 <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5 d-none"> 180 <summary class="btn btn-link text-dark no-underline my-1 ml-12"> 181 <i class="fal fa-calendar-alt"></i> 182 <span>${doc.timetables.timeInfos.getJSONObject(0).dateFrom} - ${doc.timetables.timeInfos.getJSONObject(0).timeFrom} - ${doc.timetables.timeInfos.getJSONObject(0).timeTo}</span> 183 <i class="fal fa-chevron-down fa-lg ml-5"></i> 184 </summary> 185 186 <div class="card-body px-5 lg:px-10"> 187 <ul> 188 <#list doc.timetables.timeInfos.iterator() as datetime> 189 <li class="text-dark mb-1"> 190 ${d40.getLabel("dal")} ${datetime.dateFrom} 191 ${d40.getLabel("al")} ${datetime.dateTo} 192 ${d40.getLabel("dalle")} ${datetime.timeFrom} 193 ${d40.getLabel("alle")} ${datetime.timeTo} 194 </li> 195 </#list> 196 </ul> 197 </div> 198 </details> 199 </div> 200 </#if> 201 202 203 <div class="card-body px-5 lg:px-10"> 204 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 205 <#attempt> 206 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 207 <p class="text-dark text-lg mb-0"> 208 Tel: ${phone} 209 </p> 210 </#list> 211 <#recover> 212 <p class="text-dark text-lg mb-0"> 213 Tel: ${doc.contacts.getJSONObject(0).telephone} 214 </p> 215 </#attempt> 216 217 </#if> 218 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 219 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0"> 220 <i class="far fa-envelope text-dark"></i> 221 <u>${doc.contacts.getJSONObject(0).mail}</u> 222 </a> 223 </#if> 224 <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content> 225 <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank"> 226 <i class="far fa-external-link text-dark"></i> 227 <u>${d40.getLabel("sito_web")}</u> 228 </a> 229 </#if> 230 231 <#if langId == 'en'> 232 <#assign ri_url = "/contact-tourist-office-trento" /> 233 <#elseif langId == 'de'> 234 <#assign ri_url = "/kontakt-info-anfrage-trento" /> 235 <#else> 236 <#assign ri_url = "/richiesta-informazioni" /> 237 </#if> 238 239 <a href="#contact-form" class="d-none btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10"> 240 ${d40.getLabel("richiedi_info")} 241 </a> 242 </div> 243 244 <#if hasCoords> 245 <div class="relative flex h-70"> 246 <div class="absolute w-full lg:w-105% h-full right-0"> 247 <div id="suggesto-map" class="monochrome-map size-full border-0"></div> 248 </div> 249 </div> 250 <div class="card-body p-5 lg:px-10"> 251 <!-- https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=lat,lon 252 https://www.google.com/maps/@${lat},${lng} 253 --> 254 <a href="https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=${lat},${lng}" class="d-block no-underline space-x-5" target="_blank"> 255 <span class="font-bold text-dark uppercase"> 256 ${d40.getLabel("indicazioni_stradali")} 257 </span> 258 <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" /> 259 </a> 260 </div> 261 </#if> 262 </div> 263 </div> 264 </div> 265 </div> 266 </section> 267 268 <#if doc.details.images?has_content> 269 <#assign usePreview = false> 270 271 <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40"> 272 <div class="container"> 273 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> 274 ${d40.getLabel("galleria_immagini")} 275 </p> 276 277 <div class="swiper-container"> 278 <div class="swiper-wrapper"> 279 <#if doc.details.cover != "[]"> 280 <#assign usePreview = true> 281 282 <#list doc.details.cover.iterator() as pic> 283 <div class="swiper-slide"> 284 <a href="javascript:void(0);" class="card shadow-none border-0 bg-transparent no-underline" data-toggle="modal" data-target="#lightbox-modal" data-slider="${pic?index}" data-senna-off="true"> 285 <div class="relative"> 286 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 287 </div> 288 </a> 289 </div> 290 291 <#--assign z=request.setAttribute("ogImage","${pic[langId]}")--> 292 <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")> 293 294 <#break> 295 </#list> 296 </#if> 297 298 <#list doc.details.images.iterator() as pic> 299 <#if usePreview> 300 <#assign counter = pic?counter> 301 <#else> 302 <#assign counter = pic?index> 303 </#if> 304 305 <div class="swiper-slide"> 306 <a href="javascript:void(0);" class="card shadow-none border-0 bg-transparent no-underline" data-toggle="modal" data-target="#lightbox-modal" data-slider="${counter}" data-senna-off="true"> 307 <div class="relative"> 308 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 309 </div> 310 </a> 311 </div> 312 </#list> 313 </div> 314 </div> 315 </div> 316 <div class="btn-square absolute btn-prev bg-white left-0"> 317 <span class="sr-only">${d40.getLabel("precedente")}</span> 318 <i class="fas fa-chevron-left text-dark w-6 h-6"></i> 319 </div> 320 <div class="btn-square absolute btn-next bg-white right-0"> 321 <span class="sr-only">${d40.getLabel("successivo")}</span> 322 <i class="fas fa-chevron-right text-dark w-6 h-6"></i> 323 </div> 324 </section> 325 326 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade"> 327 <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none"> 328 <div class="modal-content bg-transparent"> 329 <div class="modal-body overflow-hidden"> 330 <div class="absolute top-0 right-0 z-5"> 331 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3"> 332 <span class="sr-only">${d40.getLabel("chiudi")}</span> 333 <i class="fal fa-times fa-lg"></i> 334 </button> 335 </div> 336 337 <#-- lightbox --> 338 <div id="lightbox-swiper" class="swiper-container h-75 my-auto"> 339 <div class="swiper-button-prev w-12 h-12"> 340 <span class="sticker sticker-circle bg-green size-full"> 341 <span class="sticker-overlay"> 342 <i class="fas fa-chevron-left fa-2x text-white"></i> 343 </span> 344 </span> 345 </div> 346 347 <div class="swiper-button-next w-12 h-12"> 348 <span class="sticker sticker-circle bg-green size-full"> 349 <span class="sticker-overlay"> 350 <i class="fas fa-chevron-right fa-2x text-white"></i> 351 </span> 352 </span> 353 </div> 354 355 <div class="swiper-wrapper h-full"> 356 <#if doc.details.cover != "[]"> 357 <#list doc.details.cover.iterator() as pic> 358 <div class="swiper-slide h-full"> 359 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 360 </div> 361 <#break> 362 </#list> 363 </#if> 364 365 <#list doc.details.images.iterator() as pic> 366 <div class="swiper-slide h-full"> 367 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 368 </div> 369 </#list> 370 </div> 371 </div> 372 373 <#-- thumbnails --> 374 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider=""> 375 <div class="swiper-wrapper"> 376 <#if doc.details.cover != "[]"> 377 <#list doc.details.cover.iterator() as pic> 378 <div class="swiper-slide"> 379 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 380 </div> 381 <#break> 382 </#list> 383 </#if> 384 385 <#list doc.details.images.iterator() as pic> 386 <div class="swiper-slide"> 387 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 388 </div> 389 </#list> 390 </div> 391 </div> 392 </div> 393 </div> 394 </div> 395 </div> 396 </#if> 397 398 <#-- SEZIONE NON USATA 399 <section class="mt-20"> 400 <div class="container"> 401 <div class="bg-light max-w-xl p-5 lg:p-10"> 402 <div class="card-row space-x-5"> 403 <div class="autofit-col"> 404 <div class="autofit-section"> 405 <i class="fas fa-download text-dark w-7 h-7"></i> 406 </div> 407 </div> 408 <div class="autofit-col autofit-col-expand"> 409 <div class="autofit-section"> 410 <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p> 411 </div> 412 </div> 413 </div> 414 </div> 415 416 <div class="row mt-10 lg:mt-20"> 417 <div class="col-12 col-lg-8"> 418 <div class="space-y-10"> 419 <p class="text-dark uppercase text-lg lg:text-3xl"> 420 ${d40.getLabel("dettagli")} 421 </p> 422 <div class="space-y-5"> 423 <div class="row"> 424 <div class="col-12 col-md-3 col-lg-2"> 425 <p class="text-dark font-bold uppercase">Data</p> 426 </div> 427 <div class="col-12 col-md-9 col-lg-10"> 428 <div class="text-dark font-light text-lg"> 429 Dettagli 430 </div> 431 </div> 432 </div> 433 </div> 434 </div> 435 </div> 436 </div> 437 </div> 438 </section> 439 --> 440 441 <section class="mt-20"> 442 <div class="container"> 443 <div class="bg-light"> 444 <div class="space-y-10 p-5 lg:p-10"> 445 <p class="text-dark uppercase text-lg lg:text-3xl mb-0"> 446 ${d40.getLabel("organizzazione")} 447 </p> 448 <div class="space-y-2"> 449 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content> 450 <p class="text-dark mb-0"> 451 ${doc.contacts.getJSONObject(0).address.fulltext} 452 </p> 453 </#if> 454 455 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 456 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline"> 457 ${doc.contacts.getJSONObject(0).mail} 458 </a> 459 </#if> 460 461 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 462 <#attempt> 463 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 464 <p class="text-dark mb-0"> 465 <span class="font-bold">${d40.getLabel("telefono")}:</span> 466 ${phone} 467 </p> 468 </#list> 469 <#recover> 470 <p class="text-dark mb-0"> 471 <span class="font-bold">${d40.getLabel("telefono")}:</span> 472 ${doc.contacts.getJSONObject(0).telephone} 473 </p> 474 </#attempt> 475 </#if> 476 </div> 477 </div> 478 </div> 479 </div> 480 </section> 481 482 <#-- 483 <section class="mt-10"> 484 <div class="container"> 485 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p> 486 <p class="text-dark text-lg font-light mb-0"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> 487 </div> 488 </section> 489 --> 490 <#else> 491 <div class="text-center mt-35"> 492 <p class="text-dark"> 493 ${d40.getLabel("errore_caricamento_contenuto")} 494 </p> 495 </div> 496 </#if> 497</div> 498 499<script type="module"> 500 import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js"; 501 502 createApp({ 503 isMobile: window.innerWidth < 768, 504 favorites: [], 505 getFavorites() { 506 if(localStorage.getItem("favorites") !== null) { 507 this.favorites = JSON.parse(localStorage.getItem("favorites")); 508 } 509 }, 510 setFavorite(e, item) { 511 e.preventDefault(); 512 this.getFavorites(); 513 514 var newFavorite = { 515 id: item.id, 516 contentJSON: { 517 title: item.contentJSON.title, 518 previewDescription: item.contentJSON.previewDescription, 519 description: item.contentJSON.description, 520 geoRef: item.contentJSON.geoRef, 521 previewPicture: item.contentJSON.previewPicture, 522 viewUrl: item.contentJSON.viewUrl, 523 type: "lfr", 524 } 525 }; 526 527 this.favorites.push(newFavorite); 528 this.saveFavorites(); 529 }, 530 removeFavorite(e, itemId) { 531 e.preventDefault(); 532 this.favorites = this.favorites.filter((obj) => obj.id !== itemId); 533 this.saveFavorites(); 534 }, 535 saveFavorites() { 536 localStorage.setItem("favorites", JSON.stringify(this.favorites)); 537 }, 538 isFavorite(itemId) { 539 if (this.favorites.some((e) => e.id == itemId)) { 540 return true; 541 } 542 543 return false; 544 }, 545 buildMap(lat, lng) { 546 var map = new SuggestoMap("suggesto-map"), 547 location = [parseFloat(lat), parseFloat(lng)]; 548 549 var svgIcon = L.divIcon({ 550 html: ` 551 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343"> 552 <path d="M32.952,68c-4.491-5.935-9.221-11.692-12.837-18.251-3.4-6.175-5.892-12.453-4.094-19.725,2.422-9.787,12.253-17.363,22.112-16.878,11.322.558,20.189,8.638,21.649,19.385.8,5.867-1.25,10.892-3.84,15.837A105.38,105.38,0,0,1,43.958,65.889c-.687.844-1.309,1.739-1.96,2.611-.953,1.06-1.971,2.068-2.841,3.191-.965,1.245-1.729,1.629-2.844.1A50.506,50.506,0,0,0,32.952,68m4.722-46.328A14.156,14.156,0,0,0,23.76,35.59c-.168,7.053,6.542,13.748,13.813,13.783A14.234,14.234,0,0,0,51.46,35.693,14.138,14.138,0,0,0,37.674,21.676" transform="translate(-15.419 -13.129)" fill="#5098c6"/> 553 <path d="M31.941,63.206A50.288,50.288,0,0,1,35.3,67c1.116,1.526,1.878,1.142,2.844-.1.87-1.123,1.889-2.132,2.841-3.191a8.579,8.579,0,0,1,5.414,2.22c1.659,1.642,1.586,3.631-.455,4.627a21.209,21.209,0,0,1-16.871.723c-1.611-.565-3.293-1.51-3.092-3.645.19-2.018,1.855-2.718,3.511-3.342.833-.315,1.791-.363,2.447-1.079" transform="translate(-14.408 -8.331)" fill="#222"/> 554 <path d="M36.946,20.929A14.137,14.137,0,0,1,50.732,34.944,14.236,14.236,0,0,1,36.844,48.626c-7.27-.036-13.98-6.732-13.813-13.783A14.157,14.157,0,0,1,36.946,20.929m-.023,5.445a8.4,8.4,0,1,0,8.394,8.22,8.5,8.5,0,0,0-8.394-8.22" transform="translate(-14.69 -12.381)" fill="#fdfcf9"/> 555 <path d="M36.45,25.9a8.4,8.4,0,0,1,.077,16.809A8.405,8.405,0,1,1,36.45,25.9" transform="translate(-14.218 -11.905)" fill="#222"/> 556 </svg>`, 557 className: "", 558 iconSize: [44.537, 64.343], 559 iconAnchor: [22.287, 64.343], 560 }); 561 562 var mapData = { 563 tilelayer: "osm", 564 gestureHandling: true, 565 fitBounds: false, 566 mapcenter: location, 567 zoom: 15, 568 markersFilter: "*", 569 markers: [], 570 layers: [] 571 }; 572 573 map.sm.createMap(mapData); 574 575 L.circleMarker(location, { 576 radius: 0, 577 color: "#000", 578 fillOpacity: 0, 579 weight: 0 580 }).addTo(map.sm.lmap); 581 582 L.marker(location, { 583 icon: svgIcon 584 }).addTo(map.sm.lmap); 585 }, 586 share(title, desc, mode = "legacy") { 587 if (this.isMobile) { 588 var shareData = { 589 title: title, 590 text: desc, 591 url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D") 592 }; 593 594 try { 595 navigator.share(shareData); 596 } catch (err) { 597 console.error("Error sharing: " + err); 598 599 if (mode == "legacy") { 600 this.legacyShare(); 601 } else if (mode == "social") { 602 this.socialShare(title, desc); 603 } 604 } 605 } else { 606 if (mode == "legacy") { 607 this.legacyShare(); 608 } else if (mode == "social") { 609 this.socialShare(title, desc); 610 } 611 } 612 }, 613 legacyShare() { 614 var clip = document.createElement("input"), 615 toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D"); 616 617 document.body.appendChild(clip); 618 clip.value = toCopy; 619 clip.select(); 620 clip.setSelectionRange(0, 999999); 621 622 navigator.clipboard.writeText(clip.value); 623 document.body.removeChild(clip); 624 625 alert("Link copiato"); 626 }, 627 socialShare(title, desc, image = "") { 628 var link = "#", 629 winHeight = 450, 630 winWidth = 600, 631 winTop = window.screen.height / 2 - winHeight / 2, 632 winLeft = window.screen.width / 2 - winWidth / 2, 633 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop; 634 635 link = "http://www.facebook.com/sharer.php?s=100&p[title]=" + encodeURIComponent(title) + "&p[summary]=" + encodeURIComponent(desc) + "&p[url]=" + window.location.href + "&p[images][0]=" + image; 636 637 window.open(link, "Facebook", params); 638 } 639 }).mount("#${d40.portletNamespace}"); 640</script> 641 642<#if doc?has_content> 643 <script> 644 document.addEventListener("DOMContentLoaded", function(){ 645 646 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => { 647 anchor.addEventListener('click', function (e) { 648 e.preventDefault(); 649 650 document.querySelector(this.getAttribute('href')).scrollIntoView({ 651 behavior: 'smooth' 652 }); 653 }); 654 }); 655 656 var form_title = "${d40.getLabel('contatta_ufficio_apt')}"; 657 658 $("<div class='container-fluid bg-light-green'><div class='container'><h3 class='text-light font-semibold font-heading text-3xl lg:text-4xl uppercase pt-4 mb-0'>" + form_title + "</h3></div></div>").insertBefore('#contact-form'); 659 660 661 if(${(doc.details.images?has_content)?c}){ 662 new Swiper("#gallery .swiper-container", { 663 slidesPerView: 1, 664 spaceBetween: 50, 665 centerSlides: true, 666 centerInsufficientSlides: true, 667 breakpoints: { 668 768: { 669 slidesPerView: 2, 670 spaceBetween: 25 671 }, 672 992: { 673 slidesPerView: 3, 674 spaceBetween: 25 675 } 676 }, 677 navigation: { 678 prevEl: "#gallery .btn-prev", 679 nextEl: "#gallery .btn-next" 680 } 681 }); 682 683 var thumbnails = new Swiper("#thumbnail-swiper", { 684 spaceBetween: 10, 685 slidesPerView: 2, 686 centerInsufficientSlides: true, 687 freeMode: true, 688 watchSlidesVisibility: true, 689 watchSlidesProgress: true, 690 breakpoints: { 691 768: { 692 slidesPerView: 3 693 }, 694 992: { 695 slidesPerView: 4 696 }, 697 1200: { 698 slidesPerView: 5 699 } 700 }, 701 }); 702 703 var lightbox = new Swiper("#lightbox-swiper", { 704 spaceBetween: 10, 705 autoHeight: true, 706 observer: true, 707 observeSlideChildren: true, 708 keyboard: { 709 enabled: true 710 }, 711 navigation: { 712 nextEl: ".swiper-button-next", 713 prevEl: ".swiper-button-prev" 714 }, 715 thumbs: { 716 swiper: thumbnails 717 } 718 }); 719 720 $("#lightbox-modal").on("shown.bs.modal", function(e){ 721 lightbox.update(); 722 thumbnails.update(); 723 lightbox.slideTo($(e.relatedTarget).data("slider")); 724 lightbox.update(); 725 }); 726 727 $("#lightbox-modal .swiper-wrapper").on("click", function(e){ 728 if($(e.target).attr("class").includes("swiper-slide")){ 729 $("#lightbox-modal").modal("hide"); 730 } 731 }); 732 733 if ($(window).width() > 991) { 734 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight(); 735 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight(); 736 var marg_h = right_col_h - left_col_h + 40; 737 738 if(right_col_h > left_col_h) 739 { 740 $('#gallery').removeClass('lg:mt-40 mt-20'); 741 $('#gallery').css({'margin-top':marg_h+'px'}); 742 } 743 } 744 } 745 }); 746 </script> 747</#if> Your request was sent successfully
The sending of the request was not successful
I consent to the transfer of my personal data to the recipient of my request for sending the requested information (privacy policy)