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#4212428" at line 27, 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#4212428" at line 27, 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 = "event"
10 vueActions = ""
11 doc = ""
12 lat = "0"
13 lng = "0"
14 hasCoords = false
15/>
16<#-- <#assign z=request.setAttribute("ogTitle","title")>
17<#assign z=request.setAttribute("ogImage","imgg")>
18<#assign z=request.setAttribute("ogDesc","desc")> -->
19
20<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
21<#assign z=request.setAttribute("ogUrl","${currentUrl}")>
22
23<#if uuid?has_content>
24 <#assign response = d40.fetchData("https://guestapp.d40.it/v1/search/apt-trento/${contentType}/?uuid=${uuid}&active=false")>
25
26 <#if !response.error && response.data.docs?has_content>
27 <#assign doc = response.data.docs.getJSONObject(0)>
28
29 ${request.session.removeAttribute("circularCategories")}
30 ${request.session.setAttribute("circularCategories", doc.details.assetCategoryIds)}
31 </#if>
32</#if>
33
34<#if doc?has_content>
35 <#if doc.details?? && doc.details.name[langId]?has_content>
36 ${PUTIL.setPageTitle(doc.details.name[langId], request)}
37 </#if>
38
39 <#assign vueActions = "getFavorites();">
40
41 <#if doc.details.location.geoCoords.lat?has_content && doc.details.location.geoCoords.lon?has_content>
42 <#assign
43 hasCoords = true
44 lat = doc.details.location.geoCoords.lat
45 lng = doc.details.location.geoCoords.lon
46 vueActions = "getFavorites();buildMap(${lat}, ${lng})"
47 />
48 </#if>
49</#if>
50
51<style>
52 .swiper-button-next:after{
53 content: "";
54 }
55 .swiper-button-prev:after{
56 content: "";
57 }
58 .bg-darkgray{
59 background-color: #e5e5e5 !important;
60 }
61 .min-h-12{
62 min-height: 3rem;
63 }
64 .-ml-5{
65 margin-left: -5%;
66 }
67</style>
68
69<div v-scope id="${d40.portletNamespace}" @vue:mounted="${vueActions}" v-cloak>
70 <#if doc?has_content>
71 <#if themeDisplay.getLayout().getAncestors()?has_content>
72 <section id="breadcrumb" class="z-15 mt-25">
73 <div class="container">
74 <ol class="breadcrumb flex lg:justify-center">
75 <li class="pl-1 text-sm mr-2 relative">${d40.getLabel("sei_in")}:</li>
76
77 <li class="breadcrumb-item">
78 <a href="/" class="breadcrumb-link" title="Home">
79 <span class="breadcrumb-text-truncate text-dark underline">Home</span>
80 </a>
81 </li>
82
83 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor>
84 <li class="breadcrumb-item">
85 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${d40.escape(ancestor.getHTMLTitle(locale))}">
86 <span class="breadcrumb-text-truncate text-dark underline">
87 ${d40.escape(ancestor.getHTMLTitle(locale))}
88 </span>
89 </a>
90 </li>
91 </#list>
92
93 <li class="breadcrumb-item active">
94 <span class="breadcrumb-text-truncate text-dark">
95 ${doc.details.name[langId]}
96 </span>
97 </li>
98 </ol>
99 </div>
100 </section>
101 </#if>
102
103 <section class="relative mt-20">
104 <div class="container">
105 <div class="row">
106 <div class="col-12 col-lg-7">
107 <div class="card-row flex-col lg:flex-row mb-10">
108 <div class="autofit-col autofit-col-expand order-2 lg:order-1">
109 <div class="autofit-section">
110 <p class="text-dark font-semibold font-heading text-3xl lg:text-4xl uppercase">
111 ${doc.details.name[langId]}
112
113 <#assign z=request.setAttribute("ogTitle","${doc.details.name[langId]}")>
114
115 </p>
116 </div>
117 </div>
118 <div class="autofit-col justify-start order-1 lg:order-2 mb-3 lg:mb-0">
119 <div class="autofit-section">
120 <div class="flex space-x-4">
121 <button type="button" v-if="isFavorite('${doc.uuid}')" @click="removeFavorite($event, '${doc.uuid}')" class="btn btn-link px-2">
122 <i class="fas fa-heart text-dark fa-2x"></i>
123 </button>
124 <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">
125 <i class="fal fa-heart text-dark fa-2x"></i>
126 </button>
127
128 <button type="button" @click="share('${doc.details.name[langId]}', '')" class="btn btn-link px-2">
129 <i class="fas fa-share-alt text-dark fa-2x"></i>
130 </button>
131 </div>
132 </div>
133 </div>
134 </div>
135
136 <#if doc.details.description[langId]?has_content>
137 <div class="underline-grow text-dark font-light lg:text-lg leading-loose">
138 ${doc.details.description[langId]}
139
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
153 <#if doc.timetables.timeDescription[langId]?has_content>
154 <div class="text-dark text-lg font-light mb-5 mt-10">
155 ${doc.timetables.timeDescription[langId]?keep_before("<br><p><b>")}
156 </div>
157 </#if>
158
159 <#if doc.details.howToArrive?has_content && doc.details.howToArrive[langId]?has_content>
160 <div class="text-dark text-lg font-light mb-5 mt-10">
161 <b>${d40.getLabel("come_arrivare")}:</b>
162 ${doc.details.howToArrive[langId]}
163 </div>
164 </#if>
165
166 <#-- <#if d40.isDev> -->
167 <#if doc.booking?has_content>
168 <#if doc.booking.bookable?has_content && doc.booking.bookable>
169 <#if doc.booking.standartPrices?has_content>
170 <#attempt>
171 <div class="text-dark text-lg font-light mb-5 mt-10">
172 <#list doc.booking.standartPrices.iterator() as single_price >
173 <#if single_price[langId]?has_content>
174
175 <#if single_price?index == 0>
176 <p class="mt-3"><b>${d40.getLabel("costo_biglietto")}:</b></p>
177 <ul style="padding-left:0;list-style: none;">
178 </#if>
179
180 <li>
181 • ${single_price[langId]}
182 </li>
183 </#if>
184 </#list>
185 </ul>
186 </div>
187 <#recover>
188 <div style="display:none !important;"></div>
189 </#attempt>
190 </#if>
191 </#if>
192 </#if>
193 <#-- </#if> -->
194
195 </div>
196
197 <div class="xl:absolute col-12 col-lg-5 xl:max-w-xl lg:right-0">
198 <div class="bg-light">
199 <div class="card-body px-5 pt-5 lg:px-10 lg:pt-10 pb-0">
200 <p class="text-dark font-bold uppercase text-lg mb-0">
201 ${d40.getLabel("informazioni_contatti")}
202 </p>
203 <#if doc.details.townLabel != "{}">
204 <p class="text-dark text-lg mb-0">
205 ${d40.getLabel("localita")}: <span class="text-capitalize">${doc.details.townLabel[langId]}</span>
206 </p>
207 </#if>
208 <#if doc.details.location.address.fulltext?? && doc.details.location.address.fulltext?has_content>
209 <p class="text-dark text-lg mb-0">
210 ${doc.details.location.address.fulltext}
211 </p>
212 </#if>
213 <#if doc.timetables.timeInfos?has_content>
214 <p class="text-dark font-bold text-lg mb-0 mt-3">
215 ${d40.getLabel("date_evento")}
216 </p>
217 </#if>
218 </div>
219
220 <#if doc.timetables.timeInfos?has_content>
221 <div class="flex min-h-12">
222 <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5">
223 <summary class="btn btn-link text-dark no-underline my-1 ml-12">
224 <i class="fal fa-calendar-alt"></i>
225
226 <#attempt>
227 <#assign day_count = 0>
228
229 <#list doc.timetables.timeInfos.getJSONObject(0).openingDays.iterator()?keys as single_day >
230 <#assign day_count += 1>
231 </#list>
232
233 <div style="display:none !important;">
234 ${jsonFactoryUtil.looseSerialize(day_count)}
235 </div>
236 <#recover>
237 <#assign test = doc.timetables.timeInfos.getJSONObject(0).openingDays />
238 <div style="display:none !important;">
239
240 </div>
241 </#attempt>
242
243
244 <#assign
245 split_fdf = doc.timetables.timeRange.rangeFrom?split('-')
246 split_fdt = doc.timetables.timeRange.rangeTo?split('-')
247 fdf = split_fdf[2]+"."+split_fdf[1]+"."+split_fdf[0]
248 fdt = split_fdt[2]+"."+split_fdt[1]+"."+split_fdt[0]
249
250 />
251
252 <#if fdf == fdt>
253 ${fdf}
254 <#else>
255 <#if uuid == 'c8637ac5-e494-57ad-b04c-70a592de363c'>
256 ${d40.getLabel("dal")} 26.10.2024 ${d40.getLabel("al")} 27.10.2024
257 <#else>
258 ${d40.getLabel("dal")} ${fdf} ${d40.getLabel("al")} ${fdt}
259 </#if>
260 </#if>
261
262 <i class="fal fa-chevron-down fa-lg ml-5"></i>
263 </summary>
264
265 <#if doc.timetables.timeDescription[langId]?has_content>
266 <div class="card-body px-5 lg:px-15" style="display:none">
267 <div class="text-dark">
268 ${doc.timetables.timeDescription[langId]?keep_after('<br>')?keep_before("<br><p><b>")}
269 </div>
270 </div>
271 </#if>
272
273 <#-- <#if d40.isDev> -->
274 <#if doc.booking?has_content>
275 <#if doc.booking.bookable?has_content && doc.booking.bookable>
276 <#if doc.booking.standartPrices?has_content && doc.booking.standartPrices.iterator()?has_content>
277 <#attempt>
278 <div class="card-body px-5 lg:px-15">
279 <#list doc.booking.standartPrices.iterator() as single_price >
280 <#if single_price[langId]?has_content>
281
282 <#if single_price?index == 0>
283 <p class="mt-3"><b>${d40.getLabel("costo_biglietto")}:</b></p>
284 <ul style="padding-left:0;list-style: none;">
285 </#if>
286
287 <li>
288 • ${single_price[langId]}
289 </li>
290 </#if>
291 </#list>
292 </ul>
293 </div>
294 <#recover>
295 <div style="display:none !important;"></div>
296 </#attempt>
297 </#if>
298 </#if>
299 </#if>
300 <#-- </#if> -->
301
302 <div class="card-body px-5 lg:px-10" >
303 <ul>
304 <#list doc.timetables.timeInfos.iterator() as datetime>
305 <li class="text-dark mb-1">
306
307 <#assign
308 split_df = datetime.dateFrom?split('-')
309 split_dt = datetime.dateTo?split('-')
310 df = split_df[2]+"."+split_df[1]+"."+split_df[0]
311 dt = split_dt[2]+"."+split_dt[1]+"."+split_dt[0]
312 tf = datetime.timeFrom
313 tt = datetime.timeTo
314 />
315
316 <#if df == dt>
317 <#if tf == '00:00' && tt == '23:59'>
318 ${d40.getLabel("il")} ${df}
319 <#else>
320 ${d40.getLabel("il")} ${df} - ${tf} - ${tt}
321 </#if>
322 <#else>
323 <#if tf == '00:00' && tt == '23:59'>
324 ${d40.getLabel("dal")} ${df} ${d40.getLabel("al")} ${dt}
325 <#else>
326 ${d40.getLabel("dal")} ${df} ${d40.getLabel("al")} ${dt} - ${tf} - ${tt}
327 </#if>
328 </#if>
329 </li>
330 </#list>
331 </ul>
332 </div>
333 </details>
334 </div>
335 </#if>
336
337 <div class="card-body px-5 lg:px-10">
338 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content>
339 <p class="text-dark font-bold uppercase text-lg mb-0">
340 ${d40.getLabel("organizzazione")}
341 </p>
342 </#if>
343
344 <#if doc.contacts.getJSONObject(0).supplierName?? && doc.contacts.getJSONObject(0).supplierName?has_content>
345 <p class="text-dark text-lg mb-1 font-bold">
346 ${doc.contacts.getJSONObject(0).supplierName}
347 </p>
348 </#if>
349
350 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content>
351 <p class="text-dark text-lg mb-1">
352 ${doc.contacts.getJSONObject(0).address.fulltext}
353 </p>
354 </#if>
355
356 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
357 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
358 <#if phone?? && phone?has_content>
359 <a href="tel:${phone}" class="block no-underline text-dark text-lg space-x-2 mb-0">
360 <#assign clear_phone = phone?replace('+39', '')/>
361 <#if clear_phone?starts_with("0461")>
362 <#assign display_phone = clear_phone?replace('0461', '0461 ')/>
363 <#else>
364 <#attempt>
365 <#assign
366 pre_chunk = clear_phone[0..2]
367 display_phone = pre_chunk+" "+clear_phone[3..]
368 />
369 <#recover>
370 </#attempt>
371 </#if>
372
373 <#if display_phone?? && display_phone?has_content>
374 <i class="far fa-phone text-dark"></i>
375 <u>${display_phone}</u>
376 </#if>
377 </a>
378 </#if>
379 </#list>
380 </#if>
381 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
382 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0">
383 <i class="far fa-envelope text-dark"></i>
384 <u>${doc.contacts.getJSONObject(0).mail}</u>
385 </a>
386 </#if>
387 <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content>
388 <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
389 <i class="far fa-external-link text-dark"></i>
390 <u>${d40.getLabel("sito_web")}</u>
391 </a>
392 </#if>
393
394 <#if doc.contacts.getJSONObject(0).socialRefs.facebook?? && doc.contacts.getJSONObject(0).socialRefs.facebook?has_content>
395 <a href="${doc.contacts.getJSONObject(0).socialRefs.facebook[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
396 <i class="fab fa-facebook-square text-dark"></i>
397 <u>facebook</u>
398 </a>
399 </#if>
400
401 <#if doc.contacts.getJSONObject(0).socialRefs.twitter?? && doc.contacts.getJSONObject(0).socialRefs.twitter?has_content>
402 <a href="${doc.contacts.getJSONObject(0).socialRefs.twitter[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
403 <i class="fab fa-twitter-square text-dark"></i>
404 <u>twitter</u>
405 </a>
406 </#if>
407
408 <#if doc.contacts.getJSONObject(0).socialRefs.instagram?? && doc.contacts.getJSONObject(0).socialRefs.instagram?has_content>
409 <a href="${doc.contacts.getJSONObject(0).socialRefs.instagram[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
410 <i class="fab fa-instagram-square text-dark"></i>
411 <u>instagram</u>
412 </a>
413 </#if>
414
415 <#if langId == 'en'>
416 <#assign ri_url = "/contact-tourist-office-trento" />
417 <#elseif langId == 'de'>
418 <#assign ri_url = "/kontakt-info-anfrage-trento" />
419 <#else>
420 <#assign ri_url = "/richiesta-informazioni" />
421 </#if>
422
423 <a href="#contact-form" class="btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10">
424 ${d40.getLabel("richiedi_info")}
425 </a>
426
427 <#attempt>
428 <#if doc.booking.bookingLink?has_content && doc.booking.bookingLink[langId]?has_content>
429 <a href="${doc.booking.bookingLink[langId]}" target="_blank" class="btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10">
430 ${d40.getLabel("prenota")}
431 </a>
432 </#if>
433 <#recover>
434 .
435 </#attempt>
436 </div>
437 <#if hasCoords>
438 <div class="relative flex h-70">
439 <div class="absolute w-full lg:w-105% h-full right-0">
440 <div id="suggesto-map" class="monochrome-map size-full border-0"></div>
441 </div>
442 </div>
443
444 <div class="card-body p-5 lg:px-10">
445 <!-- https://www.google.com/maps/@${lat},${lng},14z -->
446 <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">
447 <span class="font-bold text-dark uppercase">
448 ${d40.getLabel("indicazioni_stradali")}
449 </span>
450 <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" />
451 </a>
452 </div>
453 </#if>
454 </div>
455 </div>
456 </div>
457 </div>
458 </section>
459
460 <#if doc.details.images?has_content>
461 <#assign usePreview = false>
462
463 <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40">
464 <div class="container">
465 <p class="text-dark uppercase text-lg lg:text-3xl mb-7">
466 ${d40.getLabel("galleria_immagini")}
467 </p>
468
469 <div class="swiper-container">
470 <div class="swiper-wrapper">
471 <#if doc.details.cover != "[]">
472 <#assign usePreview = true>
473
474 <#list doc.details.cover.iterator() as pic>
475 <div class="swiper-slide">
476 <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">
477 <div class="relative">
478 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
479 </div>
480 </a>
481 </div>
482
483 <#-- assign z=request.setAttribute("ogImage","${pic[langId]}") -->
484 <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")>
485
486 <#break>
487 </#list>
488 </#if>
489
490 <#list doc.details.images.iterator() as pic>
491 <#if usePreview>
492 <#assign counter = pic?counter>
493 <#else>
494 <#assign counter = pic?index>
495 </#if>
496
497 <div class="swiper-slide">
498 <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">
499 <div class="relative">
500 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" />
501 </div>
502 </a>
503 </div>
504 </#list>
505 </div>
506 </div>
507 </div>
508 <div class="btn-square absolute btn-prev bg-white left-0">
509 <span class="sr-only">${d40.getLabel("precedente")}</span>
510 <i class="fas fa-chevron-left text-dark w-6 h-6"></i>
511 </div>
512 <div class="btn-square absolute btn-next bg-white right-0">
513 <span class="sr-only">${d40.getLabel("successivo")}</span>
514 <i class="fas fa-chevron-right text-dark w-6 h-6"></i>
515 </div>
516 </section>
517
518 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
519 <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none">
520 <div class="modal-content bg-transparent">
521 <div class="modal-body overflow-hidden">
522 <div class="absolute top-0 right-0 z-5">
523 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
524 <span class="sr-only">${d40.getLabel("chiudi")}</span>
525 <i class="fal fa-times fa-lg"></i>
526 </button>
527 </div>
528
529 <#-- lightbox -->
530 <div id="lightbox-swiper" class="swiper-container h-75 my-auto">
531 <div class="swiper-button-prev w-12 h-12">
532 <span class="sticker sticker-circle bg-green size-full">
533 <span class="sticker-overlay">
534 <i class="fas fa-chevron-left fa-2x text-white"></i>
535 </span>
536 </span>
537 </div>
538
539 <div class="swiper-button-next w-12 h-12">
540 <span class="sticker sticker-circle bg-green size-full">
541 <span class="sticker-overlay">
542 <i class="fas fa-chevron-right fa-2x text-white"></i>
543 </span>
544 </span>
545 </div>
546
547 <div class="swiper-wrapper h-full">
548 <#if doc.details.cover != "[]">
549 <#list doc.details.cover.iterator() as pic>
550 <div class="swiper-slide h-full">
551 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt="">
552 </div>
553 <#break>
554 </#list>
555 </#if>
556
557 <#list doc.details.images.iterator() as pic>
558 <div class="swiper-slide h-full">
559 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt="">
560 </div>
561 </#list>
562 </div>
563 </div>
564
565 <#-- thumbnails -->
566 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider="">
567 <div class="swiper-wrapper">
568 <#if doc.details.cover != "[]">
569 <#list doc.details.cover.iterator() as pic>
570 <div class="swiper-slide">
571 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt="">
572 </div>
573 <#break>
574 </#list>
575 </#if>
576
577 <#list doc.details.images.iterator() as pic>
578 <div class="swiper-slide">
579 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt="">
580 </div>
581 </#list>
582 </div>
583 </div>
584 </div>
585 </div>
586 </div>
587 </div>
588 </#if>
589
590 <#-- SEZIONE NON USATA
591 <section class="mt-20">
592 <div class="container">
593 <div class="bg-light max-w-xl p-5 lg:p-10">
594 <div class="card-row space-x-5">
595 <div class="autofit-col">
596 <div class="autofit-section">
597 <i class="fas fa-download text-dark w-7 h-7"></i>
598 </div>
599 </div>
600 <div class="autofit-col autofit-col-expand">
601 <div class="autofit-section">
602 <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p>
603 </div>
604 </div>
605 </div>
606 </div>
607
608 <div class="row mt-10 lg:mt-20">
609 <div class="col-12 col-lg-8">
610 <div class="space-y-10">
611 <p class="text-dark uppercase text-lg lg:text-3xl">
612 ${d40.getLabel("dettagli")}
613 </p>
614 <div class="space-y-5">
615 <div class="row">
616 <div class="col-12 col-md-3 col-lg-2">
617 <p class="text-dark font-bold uppercase">Data</p>
618 </div>
619 <div class="col-12 col-md-9 col-lg-10">
620 <div class="text-dark font-light text-lg">
621 Dettagli
622 </div>
623 </div>
624 </div>
625 </div>
626 </div>
627 </div>
628 </div>
629 </div>
630 </section>
631 -->
632
633 <#-- <section class="mt-20">
634 <div class="container">
635 <div class="bg-light">
636 <div class="space-y-10 p-5 lg:p-10">
637 <p class="text-dark uppercase text-lg lg:text-3xl mb-0">
638 ${d40.getLabel("organizzazione")}
639 </p>
640 <div class="space-y-2">
641 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content>
642 <p class="text-dark mb-0">
643 ${doc.contacts.getJSONObject(0).address.fulltext}
644 </p>
645 </#if>
646
647 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content>
648 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline">
649 ${doc.contacts.getJSONObject(0).mail}
650 </a>
651 </#if>
652
653 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content>
654 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone>
655 <p class="text-dark mb-0">
656 <span class="font-bold">${d40.getLabel("telefono")}:</span>
657 ${phone}
658 </p>
659 </#list>
660 </#if>
661
662 <#if doc.contacts.getJSONObject(0).socialRefs.facebook?? && doc.contacts.getJSONObject(0).socialRefs.facebook?has_content>
663 <a href="${doc.contacts.getJSONObject(0).socialRefs.facebook[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
664 <i class="fab fa-facebook-square text-dark"></i>
665 <u>facebook</u>
666 </a>
667 </#if>
668
669 <#if doc.contacts.getJSONObject(0).socialRefs.twitter?? && doc.contacts.getJSONObject(0).socialRefs.twitter?has_content>
670 <a href="${doc.contacts.getJSONObject(0).socialRefs.twitter[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
671 <i class="fab fa-twitter-square text-dark"></i>
672 <u>twitter</u>
673 </a>
674 </#if>
675
676 <#if doc.contacts.getJSONObject(0).socialRefs.instagram?? && doc.contacts.getJSONObject(0).socialRefs.instagram?has_content>
677 <a href="${doc.contacts.getJSONObject(0).socialRefs.instagram[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank">
678 <i class="fab fa-instagram-square text-dark"></i>
679 <u>instagram</u>
680 </a>
681 </#if>
682 </div>
683 </div>
684 </div>
685 </div>
686 </section> -->
687
688 <#-- SEZIONE NON USATA
689 <section class="mt-10">
690 <div class="container">
691 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p>
692 <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>
693 </div>
694 </section>
695 -->
696 <#else>
697 <div class="text-center mt-35">
698 <p class="text-dark">
699 ${d40.getLabel("errore_caricamento_contenuto")}
700 </p>
701 </div>
702 </#if>
703</div>
704
705<script type="module">
706 import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js";
707
708 createApp({
709 isMobile: window.innerWidth < 768,
710 favorites: [],
711 getFavorites() {
712 if(localStorage.getItem("favorites") !== null) {
713 this.favorites = JSON.parse(localStorage.getItem("favorites"));
714 }
715 },
716 setFavorite(e, item) {
717 e.preventDefault();
718 this.getFavorites();
719
720 var newFavorite = {
721 id: item.id,
722 contentJSON: {
723 title: item.contentJSON.title,
724 previewDescription: item.contentJSON.previewDescription,
725 description: item.contentJSON.description,
726 geoRef: item.contentJSON.geoRef,
727 previewPicture: item.contentJSON.previewPicture,
728 viewUrl: item.contentJSON.viewUrl,
729 type: "lfr",
730 }
731 };
732
733 this.favorites.push(newFavorite);
734 this.saveFavorites();
735 },
736 removeFavorite(e, itemId) {
737 e.preventDefault();
738 this.favorites = this.favorites.filter((obj) => obj.id !== itemId);
739 this.saveFavorites();
740 },
741 saveFavorites() {
742 localStorage.setItem("favorites", JSON.stringify(this.favorites));
743 },
744 isFavorite(itemId) {
745 if (this.favorites.some((e) => e.id == itemId)) {
746 return true;
747 }
748
749 return false;
750 },
751 buildMap(lat, lng) {
752 var map = new SuggestoMap("suggesto-map"),
753 location = [parseFloat(lat), parseFloat(lng)];
754
755 var svgIcon = L.divIcon({
756 html: `
757 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343">
758 <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"/>
759 <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"/>
760 <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"/>
761 <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"/>
762 </svg>`,
763 className: "",
764 iconSize: [44.537, 64.343],
765 iconAnchor: [22.287, 64.343],
766 });
767
768 var mapData = {
769 tilelayer: "osm",
770 gestureHandling: true,
771 fitBounds: false,
772 mapcenter: location,
773 zoom: 15,
774 markersFilter: "*",
775 markers: [],
776 layers: []
777 };
778
779 map.sm.createMap(mapData);
780
781 L.circleMarker(location, {
782 radius: 0,
783 color: "#000",
784 fillOpacity: 0,
785 weight: 0
786 }).addTo(map.sm.lmap);
787
788 L.marker(location, {
789 icon: svgIcon
790 }).addTo(map.sm.lmap);
791 },
792 share(title, desc, mode = "legacy") {
793 if (this.isMobile) {
794 var shareData = {
795 title: title,
796 text: desc,
797 url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D")
798 };
799
800 try {
801 navigator.share(shareData);
802 } catch (err) {
803 console.error("Error sharing: " + err);
804
805 if (mode == "legacy") {
806 this.legacyShare();
807 } else if (mode == "social") {
808 this.socialShare(title, desc);
809 }
810 }
811 } else {
812 if (mode == "legacy") {
813 this.legacyShare();
814 } else if (mode == "social") {
815 this.socialShare(title, desc);
816 }
817 }
818 },
819 legacyShare() {
820 var clip = document.createElement("input"),
821 toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D");
822
823 document.body.appendChild(clip);
824 clip.value = toCopy;
825 clip.select();
826 clip.setSelectionRange(0, 999999);
827
828 navigator.clipboard.writeText(clip.value);
829 document.body.removeChild(clip);
830
831 alert("Link copiato");
832 },
833 socialShare(title, desc, image = "") {
834 var link = "#",
835 winHeight = 450,
836 winWidth = 600,
837 winTop = window.screen.height / 2 - winHeight / 2,
838 winLeft = window.screen.width / 2 - winWidth / 2,
839 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop;
840
841 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;
842
843 window.open(link, "Facebook", params);
844 }
845 }).mount("#${d40.portletNamespace}");
846</script>
847
848<#if doc?has_content>
849 <script>
850 document.addEventListener("DOMContentLoaded", function(){
851
852 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => {
853 anchor.addEventListener('click', function (e) {
854 e.preventDefault();
855
856 document.querySelector(this.getAttribute('href')).scrollIntoView({
857 behavior: 'smooth'
858 });
859 });
860 });
861
862
863 if(${(doc.details.images?has_content)?c}){
864 new Swiper("#gallery .swiper-container", {
865 slidesPerView: 1,
866 spaceBetween: 50,
867 centerSlides: true,
868 centerInsufficientSlides: true,
869 breakpoints: {
870 768: {
871 slidesPerView: 2,
872 spaceBetween: 25
873 },
874 992: {
875 slidesPerView: 3,
876 spaceBetween: 25
877 }
878 },
879 navigation: {
880 prevEl: "#gallery .btn-prev",
881 nextEl: "#gallery .btn-next"
882 }
883 });
884
885 var thumbnails = new Swiper("#thumbnail-swiper", {
886 spaceBetween: 10,
887 slidesPerView: 2,
888 centerInsufficientSlides: true,
889 freeMode: true,
890 watchSlidesVisibility: true,
891 watchSlidesProgress: true,
892 breakpoints: {
893 768: {
894 slidesPerView: 3
895 },
896 992: {
897 slidesPerView: 4
898 },
899 1200: {
900 slidesPerView: 5
901 }
902 },
903 });
904
905 var lightbox = new Swiper("#lightbox-swiper", {
906 spaceBetween: 10,
907 autoHeight: true,
908 observer: true,
909 observeSlideChildren: true,
910 keyboard: {
911 enabled: true
912 },
913 navigation: {
914 nextEl: ".swiper-button-next",
915 prevEl: ".swiper-button-prev"
916 },
917 thumbs: {
918 swiper: thumbnails
919 }
920 });
921
922 $("#lightbox-modal").on("shown.bs.modal", function(e){
923 lightbox.update();
924 thumbnails.update();
925 lightbox.slideTo($(e.relatedTarget).data("slider"));
926 lightbox.update();
927 });
928
929 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
930 if($(e.target).attr("class").includes("swiper-slide")){
931 $("#lightbox-modal").modal("hide");
932 }
933 });
934
935 if ($(window).width() > 991) {
936 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight();
937 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight();
938 var marg_h = right_col_h - left_col_h + 40;
939
940 if(right_col_h > left_col_h)
941 {
942 $('#gallery').removeClass('lg:mt-40 mt-20');
943 $('#gallery').css({'margin-top':marg_h+'px'});
944 }
945 }
946 }
947 });
948 </script>
949</#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)