Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing: ==> response.data.docs.getJSONObject(0) [in template "3572636#3572671#4339473" at line 24, 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#4339473" at line 24, 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 currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
18<#assign z=request.setAttribute("ogUrl","${currentUrl}")>
19
20<#if uuid?has_content>
21 <#assign response = d40.fetchData("https://guestapp.d40.it/v1/search/apt-trento/${contentType}/?uuid=${uuid}")>
22
23 <#if !response.error && response.data.docs?has_content>
24 <#assign doc = response.data.docs.getJSONObject(0)>
25
26 ${request.session.removeAttribute("circularCategories")}
27 ${request.session.setAttribute("circularCategories", doc.details.assetCategoryIds)}
28 </#if>
29</#if>
30
31<#if doc?has_content>
32 <#if doc.details?? && doc.details.name[langId]?has_content>
33 ${PUTIL.setPageTitle(doc.details.name[langId], request)}
34 </#if>
35
36 <#assign vueActions = "getFavorites();">
37
38 <#if doc.details.location.geoCoords.lat?has_content && doc.details.location.geoCoords.lon?has_content>
39 <#assign
40 hasCoords = true
41 lat = doc.details.location.geoCoords.lat
42 lng = doc.details.location.geoCoords.lon
43 vueActions = "getFavorites();buildMap(${lat}, ${lng})"
44 />
45 </#if>
46</#if>
47
48<style>
49 .swiper-button-next:after{
50 content: "";
51 }
52 .swiper-button-prev:after{
53 content: "";
54 }
55 .bg-darkgray{
56 background-color: #e5e5e5 !important;
57 }
58 .min-h-12{
59 min-height: 3rem;
60 }
61 .-ml-5{
62 margin-left: -5%;
63 }
64</style>
65
66<div v-scope id="${d40.portletNamespace}" @vue:mounted="${vueActions}" v-cloak>
67 <#if doc?has_content>
68 <#if themeDisplay.getLayout().getAncestors()?has_content>
69 <section id="breadcrumb" class="z-15 mt-25">
70 <div class="container">
71 <ol class="breadcrumb flex lg:justify-center">
72 <li class="pl-1 text-sm mr-2 relative">${d40.getLabel("sei_in")}:</li>
73
74 <li class="breadcrumb-item">
75 <a href="/" class="breadcrumb-link" title="Home">
76 <span class="breadcrumb-text-truncate text-dark underline">Home</span>
77 </a>
78 </li>
79
80 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor>
81 <li class="breadcrumb-item">
82 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${d40.escape(ancestor.getHTMLTitle(locale))}">
83 <span class="breadcrumb-text-truncate text-dark underline">
84 ${d40.escape(ancestor.getHTMLTitle(locale))}
85 </span>
86 </a>
87 </li>
88 </#list>
89
90 <li class="breadcrumb-item active">
91 <span class="breadcrumb-text-truncate text-dark">
92 ${doc.details.name[langId]}
93 </span>
94 </li>
95 </ol>
96 </div>
97 </section>
98 </#if>
99
100 <section class="relative mt-20">
101 <div class="container">
102 <div class="row">
103 <div class="col-12 col-lg-7">
104 <div class="card-row flex-col lg:flex-row mb-10">
105 <div class="autofit-col autofit-col-expand order-2 lg:order-1">
106 <div class="autofit-section">
107 <p class="text-dark font-semibold font-heading text-3xl lg:text-4xl uppercase">
108 ${doc.details.name[langId]}
109 <#assign z=request.setAttribute("ogTitle","${doc.details.name[langId]}")>
110 </p>
111 </div>
112 </div>
113 <div class="autofit-col justify-start order-1 lg:order-2 mb-3 lg:mb-0">
114 <div class="autofit-section">
115 <div class="flex space-x-4">
116 <button type="button" v-if="isFavorite('${doc.uuid}')" @click="removeFavorite($event, '${doc.uuid}')" class="btn btn-link px-2">
117 <i class="fas fa-heart text-dark fa-2x"></i>
118 </button>
119 <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">
120 <i class="fal fa-heart text-dark fa-2x"></i>
121 </button>
122
123 <button type="button" @click="share('${doc.details.name[langId]}', '')" class="btn btn-link px-2">
124 <i class="fas fa-share-alt text-dark fa-2x"></i>
125 </button>
126 </div>
127 </div>
128 </div>
129 </div>
130
131 <#if doc.timetables.timeDescription[langId]?has_content>
132 <div class="text-dark text-lg font-light mb-15 mt-5">
133 ${doc.timetables.timeDescription[langId]}
134 </div>
135 </#if>
136
137 <#if doc.details.description[langId]?has_content>
138 <div class="underline-grow text-dark font-light lg:text-lg leading-loose">
139 ${doc.details.description[langId]}
140
141 <#attempt>
142 <#if doc.details.description[langId]?length lt 160>
143 <#assign
144 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}")
145 />
146 <#else>
147 <#assign
148 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])?substring(0,160)}")
149 />
150 </#if>
151 <#recover>
152 <#assign
153 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}")
154 />
155 </#attempt>
156 </div>
157 </#if>
158 </div>
159
160 <div class="xl:absolute col-12 col-lg-5 xl:max-w-xl lg:right-0">
161 <div class="bg-light">
162 <div class="card-body px-5 pt-5 lg:px-10 lg:pt-10 pb-0">
163 <p class="text-dark font-bold uppercase text-lg mb-0">
164 ${d40.getLabel("informazioni_contatti")}
165 </p>
166 <#if doc.details.townLabel != "{}">
167 <p class="text-dark text-lg mb-0">
168 ${d40.getLabel("localita")}: <span class="text-capitalize">${doc.details.townLabel[langId]}</span>
169 </p>
170 </#if>
171 <#if doc.timetables.time_infos?has_content>
172 <p class="text-dark font-bold text-lg mb-0 mt-3">
173 ${d40.getLabel("date_apertura")}
174 </p>
175 </#if>
176 </div>
177
178 <#if doc.timetables.time_infos?has_content>
179 <div class="flex min-h-12">
180 <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5">
181 <summary class="btn btn-link text-dark no-underline my-1 ml-12">
182 <i class="fal fa-calendar-alt"></i>
183 <span>${doc.timetables.time_infos.getJSONObject(0).date_from} - ${doc.timetables.time_infos.getJSONObject(0).time_from} - ${doc.timetables.time_infos.getJSONObject(0).time_to}</span>
184 <i class="fal fa-chevron-down fa-lg ml-5"></i>
185 </summary>
186
187 <div class="card-body px-5 lg:px-10">
188 <ul>
189 <#list doc.timetables.time_infos.iterator() as datetime>
190 <li class="text-dark mb-1">
191 ${d40.getLabel("dal")} ${datetime.date_from}
192 ${d40.getLabel("al")} ${datetime.date_to}
193 ${d40.getLabel("dalle")} ${datetime.time_from}
194 ${d40.getLabel("alle")} ${datetime.time_to}
195 </li>
196 </#list>
197 </ul>
198 </div>
199 </details>
200 </div>
201 </#if>
202 <div class="card-body px-5 lg:px-10">
203 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
204 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
205 <p class="text-dark text-lg mb-0">
206 Tel: ${phone}
207 </p>
208 </#list>
209 </#if>
210 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
211 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0">
212 <i class="far fa-envelope text-dark"></i>
213 <u>${doc.contacts.getJSONObject(0).mail}</u>
214 </a>
215 </#if>
216 <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content>
217 <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
218 <i class="far fa-external-link text-dark"></i>
219 <u>${d40.getLabel("sito_web")}</u>
220 </a>
221 </#if>
222
223 <#if langId == 'en'>
224 <#assign ri_url = "/contact-tourist-office-trento" />
225 <#elseif langId == 'de'>
226 <#assign ri_url = "/kontakt-info-anfrage-trento" />
227 <#else>
228 <#assign ri_url = "/richiesta-informazioni" />
229 </#if>
230
231 <a href="#contact-form" class="d-none btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10">
232 ${d40.getLabel("richiedi_info")}
233 </a>
234 </div>
235
236 <#if hasCoords>
237 <div class="relative flex h-70">
238 <div class="absolute w-full lg:w-105% h-full right-0">
239 <div id="suggesto-map" class="monochrome-map size-full border-0"></div>
240 </div>
241 </div>
242 <div class="card-body p-5 lg:px-10">
243 <!-- https://www.google.com/maps/@${lat},${lng},14z -->
244 <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">
245 <span class="font-bold text-dark uppercase">
246 ${d40.getLabel("indicazioni_stradali")}
247 </span>
248 <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" />
249 </a>
250 </div>
251 </#if>
252 </div>
253 </div>
254 </div>
255 </div>
256 </section>
257
258 <#if doc.details.images?has_content>
259 <#assign usePreview = false>
260
261 <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40">
262 <div class="container">
263 <p class="text-dark uppercase text-lg lg:text-3xl mb-7">
264 ${d40.getLabel("galleria_immagini")}
265 </p>
266
267 <div class="swiper-container">
268 <div class="swiper-wrapper">
269 <#if doc.details.cover != "[]">
270 <#assign usePreview = true>
271
272 <#list doc.details.cover.iterator() as pic>
273 <div class="swiper-slide">
274 <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">
275 <div class="relative">
276 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
277 </div>
278 </a>
279 </div>
280 <#-- assign z=request.setAttribute("ogImage","${pic[langId]}")-->
281 <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")>
282
283 <#break>
284 </#list>
285 </#if>
286
287 <#list doc.details.images.iterator() as pic>
288 <#if usePreview>
289 <#assign counter = pic?counter>
290 <#else>
291 <#assign counter = pic?index>
292 </#if>
293
294 <div class="swiper-slide">
295 <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">
296 <div class="relative">
297 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
298 </div>
299 </a>
300 </div>
301 </#list>
302 </div>
303 </div>
304 </div>
305 <div class="btn-square absolute btn-prev bg-white left-0">
306 <span class="sr-only">${d40.getLabel("precedente")}</span>
307 <i class="fas fa-chevron-left text-dark w-6 h-6"></i>
308 </div>
309 <div class="btn-square absolute btn-next bg-white right-0">
310 <span class="sr-only">${d40.getLabel("successivo")}</span>
311 <i class="fas fa-chevron-right text-dark w-6 h-6"></i>
312 </div>
313 </section>
314
315 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
316 <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none">
317 <div class="modal-content bg-transparent">
318 <div class="modal-body overflow-hidden">
319 <div class="absolute top-0 right-0 z-5">
320 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
321 <span class="sr-only">${d40.getLabel("chiudi")}</span>
322 <i class="fal fa-times fa-lg"></i>
323 </button>
324 </div>
325
326 <#-- lightbox -->
327 <div id="lightbox-swiper" class="swiper-container h-75 my-auto">
328 <div class="swiper-button-prev w-12 h-12">
329 <span class="sticker sticker-circle bg-green size-full">
330 <span class="sticker-overlay">
331 <i class="fas fa-chevron-left fa-2x text-white"></i>
332 </span>
333 </span>
334 </div>
335
336 <div class="swiper-button-next w-12 h-12">
337 <span class="sticker sticker-circle bg-green size-full">
338 <span class="sticker-overlay">
339 <i class="fas fa-chevron-right fa-2x text-white"></i>
340 </span>
341 </span>
342 </div>
343
344 <div class="swiper-wrapper h-full">
345 <#if doc.details.cover != "[]">
346 <#list doc.details.cover.iterator() as pic>
347 <div class="swiper-slide h-full">
348 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt="">
349 </div>
350 <#break>
351 </#list>
352 </#if>
353
354 <#list doc.details.images.iterator() as pic>
355 <div class="swiper-slide h-full">
356 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt="">
357 </div>
358 </#list>
359 </div>
360 </div>
361
362 <#-- thumbnails -->
363 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider="">
364 <div class="swiper-wrapper">
365 <#if doc.details.cover != "[]">
366 <#list doc.details.cover.iterator() as pic>
367 <div class="swiper-slide">
368 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt="">
369 </div>
370 <#break>
371 </#list>
372 </#if>
373
374 <#list doc.details.images.iterator() as pic>
375 <div class="swiper-slide">
376 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt="">
377 </div>
378 </#list>
379 </div>
380 </div>
381 </div>
382 </div>
383 </div>
384 </div>
385 </#if>
386
387 <#-- SEZIONE NON USATA
388 <section class="mt-20">
389 <div class="container">
390 <div class="bg-light max-w-xl p-5 lg:p-10">
391 <div class="card-row space-x-5">
392 <div class="autofit-col">
393 <div class="autofit-section">
394 <i class="fas fa-download text-dark w-7 h-7"></i>
395 </div>
396 </div>
397 <div class="autofit-col autofit-col-expand">
398 <div class="autofit-section">
399 <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p>
400 </div>
401 </div>
402 </div>
403 </div>
404
405 <div class="row mt-10 lg:mt-20">
406 <div class="col-12 col-lg-8">
407 <div class="space-y-10">
408 <p class="text-dark uppercase text-lg lg:text-3xl">
409 ${d40.getLabel("dettagli")}
410 </p>
411 <div class="space-y-5">
412 <div class="row">
413 <div class="col-12 col-md-3 col-lg-2">
414 <p class="text-dark font-bold uppercase">Data</p>
415 </div>
416 <div class="col-12 col-md-9 col-lg-10">
417 <div class="text-dark font-light text-lg">
418 Dettagli
419 </div>
420 </div>
421 </div>
422 </div>
423 </div>
424 </div>
425 </div>
426 </div>
427 </section>
428 -->
429
430 <section class="mt-20">
431 <div class="container">
432 <div class="bg-light">
433 <div class="space-y-10 p-5 lg:p-10">
434 <p class="text-dark uppercase text-lg lg:text-3xl mb-0">
435 ${d40.getLabel("organizzazione")}
436 </p>
437 <div class="space-y-2">
438 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content>
439 <p class="text-dark mb-0">
440 ${doc.contacts.getJSONObject(0).address.fulltext}
441 </p>
442 </#if>
443
444 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
445 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline">
446 ${doc.contacts.getJSONObject(0).mail}
447 </a>
448 </#if>
449
450 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
451 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
452 <p class="text-dark mb-0">
453 <span class="font-bold">${d40.getLabel("telefono")}:</span>
454 ${phone}
455 </p>
456 </#list>
457 </#if>
458 </div>
459 </div>
460 </div>
461 </div>
462 </section>
463
464 <#--
465 <section class="mt-10">
466 <div class="container">
467 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p>
468 <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>
469 </div>
470 </section>
471 -->
472 <#else>
473 <div class="text-center mt-35">
474 <p class="text-dark">
475 ${d40.getLabel("errore_caricamento_contenuto")}
476 </p>
477 </div>
478 </#if>
479</div>
480
481<script type="module">
482 import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js";
483
484 createApp({
485 isMobile: window.innerWidth < 768,
486 favorites: [],
487 getFavorites() {
488 if(localStorage.getItem("favorites") !== null) {
489 this.favorites = JSON.parse(localStorage.getItem("favorites"));
490 }
491 },
492 setFavorite(e, item) {
493 e.preventDefault();
494 this.getFavorites();
495
496 var newFavorite = {
497 id: item.id,
498 contentJSON: {
499 title: item.contentJSON.title,
500 previewDescription: item.contentJSON.previewDescription,
501 description: item.contentJSON.description,
502 geoRef: item.contentJSON.geoRef,
503 previewPicture: item.contentJSON.previewPicture,
504 viewUrl: item.contentJSON.viewUrl,
505 type: "lfr",
506 }
507 };
508
509 this.favorites.push(newFavorite);
510 this.saveFavorites();
511 },
512 removeFavorite(e, itemId) {
513 e.preventDefault();
514 this.favorites = this.favorites.filter((obj) => obj.id !== itemId);
515 this.saveFavorites();
516 },
517 saveFavorites() {
518 localStorage.setItem("favorites", JSON.stringify(this.favorites));
519 },
520 isFavorite(itemId) {
521 if (this.favorites.some((e) => e.id == itemId)) {
522 return true;
523 }
524
525 return false;
526 },
527 buildMap(lat, lng) {
528 var map = new SuggestoMap("suggesto-map"),
529 location = [parseFloat(lat), parseFloat(lng)];
530
531 var svgIcon = L.divIcon({
532 html: `
533 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343">
534 <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"/>
535 <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"/>
536 <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"/>
537 <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"/>
538 </svg>`,
539 className: "",
540 iconSize: [44.537, 64.343],
541 iconAnchor: [22.287, 64.343],
542 });
543
544 var mapData = {
545 tilelayer: "osm",
546 gestureHandling: true,
547 fitBounds: false,
548 mapcenter: location,
549 zoom: 15,
550 markersFilter: "*",
551 markers: [],
552 layers: []
553 };
554
555 map.sm.createMap(mapData);
556
557 L.circleMarker(location, {
558 radius: 0,
559 color: "#000",
560 fillOpacity: 0,
561 weight: 0
562 }).addTo(map.sm.lmap);
563
564 L.marker(location, {
565 icon: svgIcon
566 }).addTo(map.sm.lmap);
567 },
568 share(title, desc, mode = "legacy") {
569 if (this.isMobile) {
570 var shareData = {
571 title: title,
572 text: desc,
573 url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D")
574 };
575
576 try {
577 navigator.share(shareData);
578 } catch (err) {
579 console.error("Error sharing: " + err);
580
581 if (mode == "legacy") {
582 this.legacyShare();
583 } else if (mode == "social") {
584 this.socialShare(title, desc);
585 }
586 }
587 } else {
588 if (mode == "legacy") {
589 this.legacyShare();
590 } else if (mode == "social") {
591 this.socialShare(title, desc);
592 }
593 }
594 },
595 legacyShare() {
596 var clip = document.createElement("input"),
597 toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D");
598
599 document.body.appendChild(clip);
600 clip.value = toCopy;
601 clip.select();
602 clip.setSelectionRange(0, 999999);
603
604 navigator.clipboard.writeText(clip.value);
605 document.body.removeChild(clip);
606
607 alert("Link copiato");
608 },
609 socialShare(title, desc, image = "") {
610 var link = "#",
611 winHeight = 450,
612 winWidth = 600,
613 winTop = window.screen.height / 2 - winHeight / 2,
614 winLeft = window.screen.width / 2 - winWidth / 2,
615 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop;
616
617 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;
618
619 window.open(link, "Facebook", params);
620 }
621 }).mount("#${d40.portletNamespace}");
622</script>
623
624<#if doc?has_content>
625 <script>
626 document.addEventListener("DOMContentLoaded", function(){
627
628 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => {
629 anchor.addEventListener('click', function (e) {
630 e.preventDefault();
631
632 document.querySelector(this.getAttribute('href')).scrollIntoView({
633 behavior: 'smooth'
634 });
635 });
636 });
637
638 var form_title = "${d40.getLabel('contatta_ufficio_apt')}";
639
640 $("<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');
641
642 if(${(doc.details.images?has_content)?c}){
643 new Swiper("#gallery .swiper-container", {
644 slidesPerView: 1,
645 spaceBetween: 50,
646 centerSlides: true,
647 centerInsufficientSlides: true,
648 breakpoints: {
649 768: {
650 slidesPerView: 2,
651 spaceBetween: 25
652 },
653 992: {
654 slidesPerView: 3,
655 spaceBetween: 25
656 }
657 },
658 navigation: {
659 prevEl: "#gallery .btn-prev",
660 nextEl: "#gallery .btn-next"
661 }
662 });
663
664 var thumbnails = new Swiper("#thumbnail-swiper", {
665 spaceBetween: 10,
666 slidesPerView: 2,
667 centerInsufficientSlides: true,
668 freeMode: true,
669 watchSlidesVisibility: true,
670 watchSlidesProgress: true,
671 breakpoints: {
672 768: {
673 slidesPerView: 3
674 },
675 992: {
676 slidesPerView: 4
677 },
678 1200: {
679 slidesPerView: 5
680 }
681 },
682 });
683
684 var lightbox = new Swiper("#lightbox-swiper", {
685 spaceBetween: 10,
686 autoHeight: true,
687 observer: true,
688 observeSlideChildren: true,
689 keyboard: {
690 enabled: true
691 },
692 navigation: {
693 nextEl: ".swiper-button-next",
694 prevEl: ".swiper-button-prev"
695 },
696 thumbs: {
697 swiper: thumbnails
698 }
699 });
700
701 $("#lightbox-modal").on("shown.bs.modal", function(e){
702 lightbox.update();
703 thumbnails.update();
704 lightbox.slideTo($(e.relatedTarget).data("slider"));
705 lightbox.update();
706 });
707
708 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
709 if($(e.target).attr("class").includes("swiper-slide")){
710 $("#lightbox-modal").modal("hide");
711 }
712 });
713
714
715 if ($(window).width() > 991) {
716 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight();
717 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight();
718 var marg_h = right_col_h - left_col_h + 40;
719
720 if(right_col_h > left_col_h)
721 {
722 $('#gallery').removeClass('lg:mt-40 mt-20');
723 $('#gallery').css({'margin-top':marg_h+'px'});
724 }
725 }
726 }
727 });
728 </script>
729</#if>
L'invio della richiesta è andata a buon fine
L'invio della richiesta non è andata a buon fine
Acconsento al passaggio dei miei dati personali al destinatario della mia richiesta per l'invio delle informazioni richieste (privacy policy)