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