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#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="d-none 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 var form_title = "${d40.getLabel('contatta_ufficio_apt')}";
622
623 $("<div class='container-fluid bg-light-green'><div class='container'><h3 class='text-light font-semibold font-heading text-3xl lg:text-4xl uppercase pt-4 mb-0'>" + form_title + "</h3></div></div>").insertBefore('#contact-form');
624
625 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => {
626 anchor.addEventListener('click', function (e) {
627 e.preventDefault();
628
629 document.querySelector(this.getAttribute('href')).scrollIntoView({
630 behavior: 'smooth'
631 });
632 });
633 });
634
635
636 if(${(doc.details.images?has_content)?c}){
637 new Swiper("#gallery .swiper-container", {
638 slidesPerView: 1,
639 spaceBetween: 50,
640 centerSlides: true,
641 centerInsufficientSlides: true,
642 breakpoints: {
643 768: {
644 slidesPerView: 2,
645 spaceBetween: 25
646 },
647 992: {
648 slidesPerView: 3,
649 spaceBetween: 25
650 }
651 },
652 navigation: {
653 prevEl: "#gallery .btn-prev",
654 nextEl: "#gallery .btn-next"
655 }
656 });
657
658 var thumbnails = new Swiper("#thumbnail-swiper", {
659 spaceBetween: 10,
660 slidesPerView: 2,
661 centerInsufficientSlides: true,
662 freeMode: true,
663 watchSlidesVisibility: true,
664 watchSlidesProgress: true,
665 breakpoints: {
666 768: {
667 slidesPerView: 3
668 },
669 992: {
670 slidesPerView: 4
671 },
672 1200: {
673 slidesPerView: 5
674 }
675 },
676 });
677
678 var lightbox = new Swiper("#lightbox-swiper", {
679 spaceBetween: 10,
680 autoHeight: true,
681 observer: true,
682 observeSlideChildren: true,
683 keyboard: {
684 enabled: true
685 },
686 navigation: {
687 nextEl: ".swiper-button-next",
688 prevEl: ".swiper-button-prev"
689 },
690 thumbs: {
691 swiper: thumbnails
692 }
693 });
694
695 $("#lightbox-modal").on("shown.bs.modal", function(e){
696 lightbox.update();
697 thumbnails.update();
698 lightbox.slideTo($(e.relatedTarget).data("slider"));
699 lightbox.update();
700 });
701
702 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
703 if($(e.target).attr("class").includes("swiper-slide")){
704 $("#lightbox-modal").modal("hide");
705 }
706 });
707
708 if ($(window).width() > 991) {
709 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight();
710 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight();
711 var marg_h = right_col_h - left_col_h + 40;
712
713 if(right_col_h > left_col_h)
714 {
715 $('#gallery').removeClass('lg:mt-40 mt-20');
716 $('#gallery').css({'margin-top':marg_h+'px'});
717 }
718 }
719 }
720 });
721 </script>
722</#if>
L'invio della richiesta è andata a buon fine
L'invio della richiesta non è andata a buon fine
Acconsento al passaggio dei miei dati personali al destinatario della mia richiesta per l'invio delle informazioni richieste (privacy policy)