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_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="${ri_url}" 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
234 <#if hasCoords>
235 <div class="relative flex h-70">
236 <div class="absolute w-full lg:w-105% h-full right-0">
237 <div id="suggesto-map" class="monochrome-map size-full border-0"></div>
238 </div>
239 </div>
240 <div class="card-body p-5 lg:px-10">
241 <!-- https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=lat,lon
242 https://www.google.com/maps/@${lat},${lng}
243 -->
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
281 <#assign z=request.setAttribute("ogImage","${pic[langId]}")>
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 if(${(doc.details.images?has_content)?c}){
628 new Swiper("#gallery .swiper-container", {
629 slidesPerView: 1,
630 spaceBetween: 50,
631 centerSlides: true,
632 centerInsufficientSlides: true,
633 breakpoints: {
634 768: {
635 slidesPerView: 2,
636 spaceBetween: 25
637 },
638 992: {
639 slidesPerView: 3,
640 spaceBetween: 25
641 }
642 },
643 navigation: {
644 prevEl: "#gallery .btn-prev",
645 nextEl: "#gallery .btn-next"
646 }
647 });
648
649 var thumbnails = new Swiper("#thumbnail-swiper", {
650 spaceBetween: 10,
651 slidesPerView: 2,
652 centerInsufficientSlides: true,
653 freeMode: true,
654 watchSlidesVisibility: true,
655 watchSlidesProgress: true,
656 breakpoints: {
657 768: {
658 slidesPerView: 3
659 },
660 992: {
661 slidesPerView: 4
662 },
663 1200: {
664 slidesPerView: 5
665 }
666 },
667 });
668
669 var lightbox = new Swiper("#lightbox-swiper", {
670 spaceBetween: 10,
671 autoHeight: true,
672 observer: true,
673 observeSlideChildren: true,
674 keyboard: {
675 enabled: true
676 },
677 navigation: {
678 nextEl: ".swiper-button-next",
679 prevEl: ".swiper-button-prev"
680 },
681 thumbs: {
682 swiper: thumbnails
683 }
684 });
685
686 $("#lightbox-modal").on("shown.bs.modal", function(e){
687 lightbox.update();
688 thumbnails.update();
689 lightbox.slideTo($(e.relatedTarget).data("slider"));
690 lightbox.update();
691 });
692
693 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
694 if($(e.target).attr("class").includes("swiper-slide")){
695 $("#lightbox-modal").modal("hide");
696 }
697 });
698
699 if ($(window).width() > 991) {
700 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight();
701 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight();
702 var marg_h = right_col_h - left_col_h + 40;
703
704 if(right_col_h > left_col_h)
705 {
706 $('#gallery').removeClass('lg:mt-40 mt-20');
707 $('#gallery').css({'margin-top':marg_h+'px'});
708 }
709 }
710 }
711 });
712 </script>
713</#if>