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