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