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