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#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.time_infos?has_content>
170 <p class="text-dark font-bold text-lg mb-0 mt-3">
171 ${d40.getLabel("date_apertura")}
172 </p>
173 </#if>
174 </div>
175
176 <#if doc.timetables.time_infos?has_content>
177 <div class="flex min-h-12">
178 <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5">
179 <summary class="btn btn-link text-dark no-underline my-1 ml-12">
180 <i class="fal fa-calendar-alt"></i>
181 <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>
182 <i class="fal fa-chevron-down fa-lg ml-5"></i>
183 </summary>
184
185 <div class="card-body px-5 lg:px-10">
186 <ul>
187 <#list doc.timetables.time_infos.iterator() as datetime>
188 <li class="text-dark mb-1">
189 ${d40.getLabel("dal")} ${datetime.date_from}
190 ${d40.getLabel("al")} ${datetime.date_to}
191 ${d40.getLabel("dalle")} ${datetime.time_from}
192 ${d40.getLabel("alle")} ${datetime.time_to}
193 </li>
194 </#list>
195 </ul>
196 </div>
197 </details>
198 </div>
199 </#if>
200 <div class="card-body px-5 lg:px-10">
201 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
202 <#attempt>
203 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
204 <p class="text-dark text-lg mb-0">
205 Tel: ${phone}
206 </p>
207 </#list>
208 <#recover>
209 <p class="text-dark text-lg mb-0">
210 Tel: ${doc.contacts.getJSONObject(0).telephone}
211 </p>
212 </#attempt>
213
214 </#if>
215 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
216 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0">
217 <i class="far fa-envelope text-dark"></i>
218 <u>${doc.contacts.getJSONObject(0).mail}</u>
219 </a>
220 </#if>
221 <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content>
222 <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
223 <i class="far fa-external-link text-dark"></i>
224 <u>${d40.getLabel("sito_web")}</u>
225 </a>
226 </#if>
227
228 <#if langId == 'en'>
229 <#assign ri_url = "/contact-tourist-office-trento" />
230 <#elseif langId == 'de'>
231 <#assign ri_url = "/kontakt-info-anfrage-trento" />
232 <#else>
233 <#assign ri_url = "/richiesta-informazioni" />
234 </#if>
235
236 <a href="#contact-form" class="btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10">
237 ${d40.getLabel("richiedi_info")}
238 </a>
239 </div>
240
241 <#if hasCoords>
242 <div class="relative flex h-70">
243 <div class="absolute w-full lg:w-105% h-full right-0">
244 <div id="suggesto-map" class="monochrome-map size-full border-0"></div>
245 </div>
246 </div>
247 <div class="card-body p-5 lg:px-10">
248 <!-- https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=lat,lon
249 https://www.google.com/maps/@${lat},${lng}
250 -->
251 <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">
252 <span class="font-bold text-dark uppercase">
253 ${d40.getLabel("indicazioni_stradali")}
254 </span>
255 <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" />
256 </a>
257 </div>
258 </#if>
259 </div>
260 </div>
261 </div>
262 </div>
263 </section>
264
265 <#if doc.details.images?has_content>
266 <#assign usePreview = false>
267
268 <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40">
269 <div class="container">
270 <p class="text-dark uppercase text-lg lg:text-3xl mb-7">
271 ${d40.getLabel("galleria_immagini")}
272 </p>
273
274 <div class="swiper-container">
275 <div class="swiper-wrapper">
276 <#if doc.details.cover != "[]">
277 <#assign usePreview = true>
278
279 <#list doc.details.cover.iterator() as pic>
280 <div class="swiper-slide">
281 <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">
282 <div class="relative">
283 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
284 </div>
285 </a>
286 </div>
287
288 <#--assign z=request.setAttribute("ogImage","${pic[langId]}")-->
289 <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")>
290
291 <#break>
292 </#list>
293 </#if>
294
295 <#list doc.details.images.iterator() as pic>
296 <#if usePreview>
297 <#assign counter = pic?counter>
298 <#else>
299 <#assign counter = pic?index>
300 </#if>
301
302 <div class="swiper-slide">
303 <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">
304 <div class="relative">
305 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
306 </div>
307 </a>
308 </div>
309 </#list>
310 </div>
311 </div>
312 </div>
313 <div class="btn-square absolute btn-prev bg-white left-0">
314 <span class="sr-only">${d40.getLabel("precedente")}</span>
315 <i class="fas fa-chevron-left text-dark w-6 h-6"></i>
316 </div>
317 <div class="btn-square absolute btn-next bg-white right-0">
318 <span class="sr-only">${d40.getLabel("successivo")}</span>
319 <i class="fas fa-chevron-right text-dark w-6 h-6"></i>
320 </div>
321 </section>
322
323 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
324 <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none">
325 <div class="modal-content bg-transparent">
326 <div class="modal-body overflow-hidden">
327 <div class="absolute top-0 right-0 z-5">
328 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
329 <span class="sr-only">${d40.getLabel("chiudi")}</span>
330 <i class="fal fa-times fa-lg"></i>
331 </button>
332 </div>
333
334 <#-- lightbox -->
335 <div id="lightbox-swiper" class="swiper-container h-75 my-auto">
336 <div class="swiper-button-prev 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-left fa-2x text-white"></i>
340 </span>
341 </span>
342 </div>
343
344 <div class="swiper-button-next w-12 h-12">
345 <span class="sticker sticker-circle bg-green size-full">
346 <span class="sticker-overlay">
347 <i class="fas fa-chevron-right fa-2x text-white"></i>
348 </span>
349 </span>
350 </div>
351
352 <div class="swiper-wrapper h-full">
353 <#if doc.details.cover != "[]">
354 <#list doc.details.cover.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 <#break>
359 </#list>
360 </#if>
361
362 <#list doc.details.images.iterator() as pic>
363 <div class="swiper-slide h-full">
364 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt="">
365 </div>
366 </#list>
367 </div>
368 </div>
369
370 <#-- thumbnails -->
371 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider="">
372 <div class="swiper-wrapper">
373 <#if doc.details.cover != "[]">
374 <#list doc.details.cover.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 <#break>
379 </#list>
380 </#if>
381
382 <#list doc.details.images.iterator() as pic>
383 <div class="swiper-slide">
384 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt="">
385 </div>
386 </#list>
387 </div>
388 </div>
389 </div>
390 </div>
391 </div>
392 </div>
393 </#if>
394
395 <#-- SEZIONE NON USATA
396 <section class="mt-20">
397 <div class="container">
398 <div class="bg-light max-w-xl p-5 lg:p-10">
399 <div class="card-row space-x-5">
400 <div class="autofit-col">
401 <div class="autofit-section">
402 <i class="fas fa-download text-dark w-7 h-7"></i>
403 </div>
404 </div>
405 <div class="autofit-col autofit-col-expand">
406 <div class="autofit-section">
407 <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p>
408 </div>
409 </div>
410 </div>
411 </div>
412
413 <div class="row mt-10 lg:mt-20">
414 <div class="col-12 col-lg-8">
415 <div class="space-y-10">
416 <p class="text-dark uppercase text-lg lg:text-3xl">
417 ${d40.getLabel("dettagli")}
418 </p>
419 <div class="space-y-5">
420 <div class="row">
421 <div class="col-12 col-md-3 col-lg-2">
422 <p class="text-dark font-bold uppercase">Data</p>
423 </div>
424 <div class="col-12 col-md-9 col-lg-10">
425 <div class="text-dark font-light text-lg">
426 Dettagli
427 </div>
428 </div>
429 </div>
430 </div>
431 </div>
432 </div>
433 </div>
434 </div>
435 </section>
436 -->
437
438 <section class="mt-20">
439 <div class="container">
440 <div class="bg-light">
441 <div class="space-y-10 p-5 lg:p-10">
442 <p class="text-dark uppercase text-lg lg:text-3xl mb-0">
443 ${d40.getLabel("organizzazione")}
444 </p>
445 <div class="space-y-2">
446 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content>
447 <p class="text-dark mb-0">
448 ${doc.contacts.getJSONObject(0).address.fulltext}
449 </p>
450 </#if>
451
452 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
453 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline">
454 ${doc.contacts.getJSONObject(0).mail}
455 </a>
456 </#if>
457
458 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
459 <#attempt>
460 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
461 <p class="text-dark mb-0">
462 <span class="font-bold">${d40.getLabel("telefono")}:</span>
463 ${phone}
464 </p>
465 </#list>
466 <#recover>
467 <p class="text-dark mb-0">
468 <span class="font-bold">${d40.getLabel("telefono")}:</span>
469 ${doc.contacts.getJSONObject(0).telephone}
470 </p>
471 </#attempt>
472 </#if>
473 </div>
474 </div>
475 </div>
476 </div>
477 </section>
478
479 <#--
480 <section class="mt-10">
481 <div class="container">
482 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p>
483 <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>
484 </div>
485 </section>
486 -->
487 <#else>
488 <div class="text-center mt-35">
489 <p class="text-dark">
490 ${d40.getLabel("errore_caricamento_contenuto")}
491 </p>
492 </div>
493 </#if>
494</div>
495
496<script type="module">
497 import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js";
498
499 createApp({
500 isMobile: window.innerWidth < 768,
501 favorites: [],
502 getFavorites() {
503 if(localStorage.getItem("favorites") !== null) {
504 this.favorites = JSON.parse(localStorage.getItem("favorites"));
505 }
506 },
507 setFavorite(e, item) {
508 e.preventDefault();
509 this.getFavorites();
510
511 var newFavorite = {
512 id: item.id,
513 contentJSON: {
514 title: item.contentJSON.title,
515 previewDescription: item.contentJSON.previewDescription,
516 description: item.contentJSON.description,
517 geoRef: item.contentJSON.geoRef,
518 previewPicture: item.contentJSON.previewPicture,
519 viewUrl: item.contentJSON.viewUrl,
520 type: "lfr",
521 }
522 };
523
524 this.favorites.push(newFavorite);
525 this.saveFavorites();
526 },
527 removeFavorite(e, itemId) {
528 e.preventDefault();
529 this.favorites = this.favorites.filter((obj) => obj.id !== itemId);
530 this.saveFavorites();
531 },
532 saveFavorites() {
533 localStorage.setItem("favorites", JSON.stringify(this.favorites));
534 },
535 isFavorite(itemId) {
536 if (this.favorites.some((e) => e.id == itemId)) {
537 return true;
538 }
539
540 return false;
541 },
542 buildMap(lat, lng) {
543 var map = new SuggestoMap("suggesto-map"),
544 location = [parseFloat(lat), parseFloat(lng)];
545
546 var svgIcon = L.divIcon({
547 html: `
548 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343">
549 <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"/>
550 <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"/>
551 <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"/>
552 <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"/>
553 </svg>`,
554 className: "",
555 iconSize: [44.537, 64.343],
556 iconAnchor: [22.287, 64.343],
557 });
558
559 var mapData = {
560 tilelayer: "osm",
561 gestureHandling: true,
562 fitBounds: false,
563 mapcenter: location,
564 zoom: 15,
565 markersFilter: "*",
566 markers: [],
567 layers: []
568 };
569
570 map.sm.createMap(mapData);
571
572 L.circleMarker(location, {
573 radius: 0,
574 color: "#000",
575 fillOpacity: 0,
576 weight: 0
577 }).addTo(map.sm.lmap);
578
579 L.marker(location, {
580 icon: svgIcon
581 }).addTo(map.sm.lmap);
582 },
583 share(title, desc, mode = "legacy") {
584 if (this.isMobile) {
585 var shareData = {
586 title: title,
587 text: desc,
588 url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D")
589 };
590
591 try {
592 navigator.share(shareData);
593 } catch (err) {
594 console.error("Error sharing: " + err);
595
596 if (mode == "legacy") {
597 this.legacyShare();
598 } else if (mode == "social") {
599 this.socialShare(title, desc);
600 }
601 }
602 } else {
603 if (mode == "legacy") {
604 this.legacyShare();
605 } else if (mode == "social") {
606 this.socialShare(title, desc);
607 }
608 }
609 },
610 legacyShare() {
611 var clip = document.createElement("input"),
612 toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D");
613
614 document.body.appendChild(clip);
615 clip.value = toCopy;
616 clip.select();
617 clip.setSelectionRange(0, 999999);
618
619 navigator.clipboard.writeText(clip.value);
620 document.body.removeChild(clip);
621
622 alert("Link copiato");
623 },
624 socialShare(title, desc, image = "") {
625 var link = "#",
626 winHeight = 450,
627 winWidth = 600,
628 winTop = window.screen.height / 2 - winHeight / 2,
629 winLeft = window.screen.width / 2 - winWidth / 2,
630 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop;
631
632 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;
633
634 window.open(link, "Facebook", params);
635 }
636 }).mount("#${d40.portletNamespace}");
637</script>
638
639<#if doc?has_content>
640 <script>
641 document.addEventListener("DOMContentLoaded", function(){
642
643 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => {
644 anchor.addEventListener('click', function (e) {
645 e.preventDefault();
646
647 document.querySelector(this.getAttribute('href')).scrollIntoView({
648 behavior: 'smooth'
649 });
650 });
651 });
652
653
654 if(${(doc.details.images?has_content)?c}){
655 new Swiper("#gallery .swiper-container", {
656 slidesPerView: 1,
657 spaceBetween: 50,
658 centerSlides: true,
659 centerInsufficientSlides: true,
660 breakpoints: {
661 768: {
662 slidesPerView: 2,
663 spaceBetween: 25
664 },
665 992: {
666 slidesPerView: 3,
667 spaceBetween: 25
668 }
669 },
670 navigation: {
671 prevEl: "#gallery .btn-prev",
672 nextEl: "#gallery .btn-next"
673 }
674 });
675
676 var thumbnails = new Swiper("#thumbnail-swiper", {
677 spaceBetween: 10,
678 slidesPerView: 2,
679 centerInsufficientSlides: true,
680 freeMode: true,
681 watchSlidesVisibility: true,
682 watchSlidesProgress: true,
683 breakpoints: {
684 768: {
685 slidesPerView: 3
686 },
687 992: {
688 slidesPerView: 4
689 },
690 1200: {
691 slidesPerView: 5
692 }
693 },
694 });
695
696 var lightbox = new Swiper("#lightbox-swiper", {
697 spaceBetween: 10,
698 autoHeight: true,
699 observer: true,
700 observeSlideChildren: true,
701 keyboard: {
702 enabled: true
703 },
704 navigation: {
705 nextEl: ".swiper-button-next",
706 prevEl: ".swiper-button-prev"
707 },
708 thumbs: {
709 swiper: thumbnails
710 }
711 });
712
713 $("#lightbox-modal").on("shown.bs.modal", function(e){
714 lightbox.update();
715 thumbnails.update();
716 lightbox.slideTo($(e.relatedTarget).data("slider"));
717 lightbox.update();
718 });
719
720 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
721 if($(e.target).attr("class").includes("swiper-slide")){
722 $("#lightbox-modal").modal("hide");
723 }
724 });
725
726 if ($(window).width() > 991) {
727 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight();
728 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight();
729 var marg_h = right_col_h - left_col_h + 40;
730
731 if(right_col_h > left_col_h)
732 {
733 $('#gallery').removeClass('lg:mt-40 mt-20');
734 $('#gallery').css({'margin-top':marg_h+'px'});
735 }
736 }
737 }
738 });
739 </script>
740</#if>