Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> response.data.docs.getJSONObject(0)  [in template "3572636#3572671#4340004" at line 28, column 24]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign doc = response.data.docs.getJ...  [in template "3572636#3572671#4340004" at line 28, column 9]
----
1<#import "_TEMPLATE_CONTEXT_/3572636/3574130/23609/3793037" as d40> 
2 
3<#setting url_escaping_charset="UTF-8"> 
4 
5<#assign 
6    PUTIL = objectUtil("com.liferay.portal.kernel.util.PortalUtil") 
7    uuid = themeDisplay.getURLCurrent()?keep_after("-/c/n/")?keep_before("?")?keep_after_last("_") 
8    langId = locale?keep_before("_") 
9    contentType = "poi" 
10    vueActions = "" 
11    doc = "" 
12    lat = "0" 
13    lng = "0" 
14    hasCoords = false 
15/> 
16 
17<#-- <#assign z=request.setAttribute("ogTitle","title")> 
18<#assign z=request.setAttribute("ogImage","imgg")> 
19<#assign z=request.setAttribute("ogDesc","desc")> --> 
20 
21<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
22<#assign z=request.setAttribute("ogUrl","${currentUrl}")> 
23 
24<#if uuid?has_content> 
25    <#assign response = d40.fetchData("https://guestapp.d40.it/v1/search/apt-trento/${contentType}/?uuid=${uuid}")> 
26     
27    <#if !response.error && response.data.docs?has_content> 
28        <#assign doc = response.data.docs.getJSONObject(0)> 
29         
30        ${request.session.removeAttribute("circularCategories")} 
31        ${request.session.setAttribute("circularCategories", doc.details.assetCategoryIds)} 
32    </#if> 
33</#if> 
34 
35<#if doc?has_content> 
36    <#if doc.details?? && doc.details.name[langId]?has_content> 
37        ${PUTIL.setPageTitle(doc.details.name[langId], request)} 
38    </#if> 
39     
40    <#assign vueActions = "getFavorites();"> 
41     
42    <#if doc.details.location.geoCoords.lat?has_content && doc.details.location.geoCoords.lon?has_content> 
43        <#assign 
44            hasCoords = true 
45            lat = doc.details.location.geoCoords.lat 
46            lng = doc.details.location.geoCoords.lon 
47            vueActions = "getFavorites();buildMap(${lat}, ${lng})" 
48        /> 
49    </#if> 
50</#if> 
51 
52<style> 
53    .swiper-button-next:after{ 
54        content: ""; 
55
56    .swiper-button-prev:after{ 
57        content: ""; 
58
59    .bg-darkgray{ 
60        background-color: #e5e5e5 !important; 
61
62    .min-h-12{ 
63        min-height: 3rem; 
64
65    .-ml-5{ 
66        margin-left: -5%; 
67
68</style> 
69 
70<div v-scope id="${d40.portletNamespace}" @vue:mounted="${vueActions}" v-cloak> 
71    <#if doc?has_content> 
72        <#if themeDisplay.getLayout().getAncestors()?has_content> 
73            <section id="breadcrumb" class="z-15 mt-25"> 
74                <div class="container"> 
75                    <ol class="breadcrumb flex lg:justify-center"> 
76                        <li class="pl-1 text-sm mr-2 relative">${d40.getLabel("sei_in")}:</li> 
77                         
78                        <li class="breadcrumb-item"> 
79                            <a href="/" class="breadcrumb-link" title="Home"> 
80                                <span class="breadcrumb-text-truncate text-dark underline">Home</span> 
81                            </a> 
82                        </li> 
83                         
84                        <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor> 
85                            <li class="breadcrumb-item"> 
86                                <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${d40.escape(ancestor.getHTMLTitle(locale))}"> 
87                                    <span class="breadcrumb-text-truncate text-dark underline"> 
88                                        ${d40.escape(ancestor.getHTMLTitle(locale))} 
89                                    </span> 
90                                </a> 
91                            </li> 
92                        </#list> 
93                         
94                        <li class="breadcrumb-item active"> 
95                            <span class="breadcrumb-text-truncate text-dark"> 
96                                ${doc.details.name[langId]} 
97                            </span> 
98                        </li> 
99                    </ol> 
100                </div> 
101            </section> 
102        </#if> 
103         
104        <section class="relative mt-20"> 
105            <div class="container"> 
106                <div class="row"> 
107                    <div class="col-12 col-lg-7"> 
108                        <div class="card-row flex-col lg:flex-row mb-10"> 
109                            <div class="autofit-col autofit-col-expand order-2 lg:order-1"> 
110                                <div class="autofit-section"> 
111                                    <p class="text-dark font-semibold font-heading text-3xl lg:text-4xl uppercase"> 
112                                        ${doc.details.name[langId]} 
113                                        <#assign z=request.setAttribute("ogTitle","${doc.details.name[langId]}")> 
114                                    </p> 
115                                </div> 
116                            </div> 
117                            <div class="autofit-col justify-start order-1 lg:order-2 mb-3 lg:mb-0"> 
118                                <div class="autofit-section"> 
119                                    <div class="flex space-x-4"> 
120                                        <button type="button" v-if="isFavorite('${doc.uuid}')" @click="removeFavorite($event, '${doc.uuid}')" class="btn btn-link px-2"> 
121                                            <i class="fas fa-heart text-dark fa-2x"></i> 
122                                        </button> 
123                                        <button type="button" v-else @click="setFavorite($event, {id: '${doc.uuid}', contentJSON: {title: '${doc.details.name[langId]?js_string}', previewDescription: '', description: '', geoRef: '', previewPicture: '${d40.getDTNPreview(doc)}', viewUrl: '${d40.getDTNUrl(doc.details.name[langId], doc.uuid, contentType)}'}})" class="btn btn-link px-2"> 
124                                            <i class="fal fa-heart text-dark fa-2x"></i> 
125                                        </button> 
126                                         
127                                        <button type="button" @click="share('${doc.details.name[langId]}', '')" class="btn btn-link px-2"> 
128                                            <i class="fas fa-share-alt text-dark fa-2x"></i> 
129                                        </button> 
130                                    </div> 
131                                </div> 
132                            </div> 
133                        </div> 
134                         
135                        <#if doc.timetables.timeDescription[langId]?has_content> 
136                            <div class="text-dark text-lg font-light mb-15 mt-5"> 
137                                ${doc.timetables.timeDescription[langId]} 
138                            </div> 
139                        </#if> 
140                         
141                        <#if doc.details.description[langId]?has_content> 
142                            <div class="underline-grow text-dark font-light lg:text-lg leading-loose"> 
143                                ${doc.details.description[langId]} 
144                                 
145                                <#if doc.details.description[langId]?length lt 160> 
146                                    <#assign  
147                                        z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}") 
148                                    /> 
149                                <#else> 
150                                    <#assign  
151                                        z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])?substring(0,160)}") 
152                                    /> 
153                                </#if> 
154                            </div> 
155                        </#if> 
156                    </div> 
157                     
158                    <div class="xl:absolute col-12 col-lg-5 xl:max-w-xl lg:right-0"> 
159                        <div class="bg-light"> 
160                            <div class="card-body px-5 pt-5 lg:px-10 lg:pt-10 pb-0"> 
161                                <p class="text-dark font-bold uppercase text-lg mb-0"> 
162                                    ${d40.getLabel("informazioni_contatti")} 
163                                </p> 
164                                <#if doc.details.townLabel != "{}"> 
165                                    <p class="text-dark text-lg mb-0"> 
166                                        ${d40.getLabel("localita")}: <span class="text-capitalize">${doc.details.townLabel[langId]}</span> 
167                                    </p> 
168                                </#if> 
169                                <#if doc.timetables.time_infos?has_content> 
170                                    <p class="text-dark font-bold text-lg mb-0 mt-3"> 
171                                        ${d40.getLabel("date_apertura")} 
172                                    </p> 
173                                </#if> 
174                            </div> 
175                             
176                            <#if doc.timetables.time_infos?has_content> 
177                                <div class="flex min-h-12"> 
178                                    <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5"> 
179                                        <summary class="btn btn-link text-dark no-underline my-1 ml-12"> 
180                                            <i class="fal fa-calendar-alt"></i> 
181                                            <span>${doc.timetables.time_infos.getJSONObject(0).date_from} - ${doc.timetables.time_infos.getJSONObject(0).time_from} - ${doc.timetables.time_infos.getJSONObject(0).time_to}</span> 
182                                            <i class="fal fa-chevron-down fa-lg ml-5"></i> 
183                                        </summary> 
184                                         
185                                        <div class="card-body px-5 lg:px-10"> 
186                                            <ul> 
187                                                <#list doc.timetables.time_infos.iterator() as datetime> 
188                                                    <li class="text-dark mb-1"> 
189                                                        ${d40.getLabel("dal")} ${datetime.date_from} 
190                                                        ${d40.getLabel("al")} ${datetime.date_to} 
191                                                        ${d40.getLabel("dalle")} ${datetime.time_from} 
192                                                        ${d40.getLabel("alle")} ${datetime.time_to} 
193                                                    </li> 
194                                                </#list> 
195                                            </ul> 
196                                        </div> 
197                                    </details> 
198                                </div> 
199                            </#if> 
200                            <div class="card-body px-5 lg:px-10"> 
201                                <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 
202                                    <#attempt> 
203                                        <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 
204                                            <p class="text-dark text-lg mb-0"> 
205                                                Tel: ${phone} 
206                                            </p> 
207                                        </#list> 
208                                    <#recover> 
209                                        <p class="text-dark text-lg mb-0"> 
210                                            Tel: ${doc.contacts.getJSONObject(0).telephone} 
211                                        </p> 
212                                    </#attempt> 
213                                     
214                                </#if> 
215                                <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 
216                                    <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0"> 
217                                        <i class="far fa-envelope text-dark"></i> 
218                                        <u>${doc.contacts.getJSONObject(0).mail}</u> 
219                                    </a> 
220                                </#if> 
221                                <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content> 
222                                    <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank"> 
223                                        <i class="far fa-external-link text-dark"></i> 
224                                        <u>${d40.getLabel("sito_web")}</u> 
225                                    </a> 
226                                </#if> 
227                                 
228                                <#if langId == 'en'> 
229                                    <#assign ri_url = "/contact-tourist-office-trento" /> 
230                                <#elseif langId == 'de'> 
231                                    <#assign ri_url = "/kontakt-info-anfrage-trento" /> 
232                                <#else> 
233                                    <#assign ri_url = "/richiesta-informazioni" /> 
234                                </#if> 
235                                 
236                                <a href="#contact-form" class="btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10"> 
237                                    ${d40.getLabel("richiedi_info")} 
238                                </a> 
239                            </div> 
240                             
241                            <#if hasCoords> 
242                                <div class="relative flex h-70"> 
243                                    <div class="absolute w-full lg:w-105% h-full right-0"> 
244                                        <div id="suggesto-map" class="monochrome-map size-full border-0"></div> 
245                                    </div> 
246                                </div> 
247                                <div class="card-body p-5 lg:px-10"> 
248                                    <!-- https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=lat,lon  
249                                    https://www.google.com/maps/@${lat},${lng} 
250                                    --> 
251                                    <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"> 
252                                        <span class="font-bold text-dark uppercase"> 
253                                            ${d40.getLabel("indicazioni_stradali")} 
254                                        </span> 
255                                        <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" /> 
256                                    </a> 
257                                </div> 
258                            </#if> 
259                        </div> 
260                    </div> 
261                </div> 
262            </div> 
263        </section> 
264         
265        <#if doc.details.images?has_content> 
266            <#assign usePreview = false> 
267             
268            <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40"> 
269                <div class="container"> 
270                    <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> 
271                        ${d40.getLabel("galleria_immagini")} 
272                    </p> 
273                     
274                    <div class="swiper-container"> 
275                        <div class="swiper-wrapper"> 
276                            <#if doc.details.cover != "[]"> 
277                                <#assign usePreview = true> 
278                                 
279                                <#list doc.details.cover.iterator() as pic> 
280                                    <div class="swiper-slide"> 
281                                        <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"> 
282                                            <div class="relative"> 
283                                                <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 
284                                            </div> 
285                                        </a> 
286                                    </div> 
287                                     
288                                    <#--assign z=request.setAttribute("ogImage","${pic[langId]}")--> 
289                                  <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")>                           
290                                   
291                                    <#break> 
292                                </#list> 
293                            </#if> 
294                             
295                            <#list doc.details.images.iterator() as pic> 
296                                <#if usePreview> 
297                                    <#assign counter = pic?counter> 
298                                <#else> 
299                                    <#assign counter = pic?index> 
300                                </#if> 
301                                 
302                                <div class="swiper-slide"> 
303                                    <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"> 
304                                        <div class="relative"> 
305                                            <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 
306                                        </div> 
307                                    </a> 
308                                </div> 
309                            </#list> 
310                        </div> 
311                    </div> 
312                </div> 
313                <div class="btn-square absolute btn-prev bg-white left-0"> 
314                    <span class="sr-only">${d40.getLabel("precedente")}</span> 
315                    <i class="fas fa-chevron-left text-dark w-6 h-6"></i> 
316                </div> 
317                <div class="btn-square absolute btn-next bg-white right-0"> 
318                    <span class="sr-only">${d40.getLabel("successivo")}</span> 
319                    <i class="fas fa-chevron-right text-dark w-6 h-6"></i> 
320                </div> 
321            </section> 
322             
323            <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade"> 
324                <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none"> 
325                    <div class="modal-content bg-transparent"> 
326                        <div class="modal-body overflow-hidden"> 
327                            <div class="absolute top-0 right-0 z-5"> 
328                                <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3"> 
329                                    <span class="sr-only">${d40.getLabel("chiudi")}</span> 
330                                    <i class="fal fa-times fa-lg"></i> 
331                                </button> 
332                            </div> 
333                             
334                            <#-- lightbox --> 
335            				<div id="lightbox-swiper" class="swiper-container h-75 my-auto"> 
336            				    <div class="swiper-button-prev w-12 h-12"> 
337                                    <span class="sticker sticker-circle bg-green size-full"> 
338                                        <span class="sticker-overlay"> 
339                                            <i class="fas fa-chevron-left fa-2x text-white"></i> 
340                                        </span> 
341                                    </span> 
342                                </div> 
343                                 
344                                <div class="swiper-button-next w-12 h-12"> 
345                                    <span class="sticker sticker-circle bg-green size-full"> 
346                                        <span class="sticker-overlay"> 
347                                            <i class="fas fa-chevron-right fa-2x text-white"></i> 
348                                        </span> 
349                                    </span> 
350                                </div> 
351                                 
352                                <div class="swiper-wrapper h-full"> 
353                                    <#if doc.details.cover != "[]"> 
354                                        <#list doc.details.cover.iterator() as pic> 
355                                            <div class="swiper-slide h-full"> 
356                                                <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 
357                                            </div> 
358                                            <#break> 
359                                        </#list> 
360                                    </#if> 
361                                     
362                                    <#list doc.details.images.iterator() as pic> 
363                                        <div class="swiper-slide h-full"> 
364                                            <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 
365                                        </div> 
366                                    </#list> 
367                                </div> 
368                            </div> 
369                             
370                            <#-- thumbnails --> 
371            				<div id="thumbnail-swiper" class="swiper-container" thumbsSlider=""> 
372                                <div class="swiper-wrapper"> 
373                                    <#if doc.details.cover != "[]"> 
374                                        <#list doc.details.cover.iterator() as pic> 
375                                            <div class="swiper-slide"> 
376                                                <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 
377                                            </div> 
378                                            <#break> 
379                                        </#list> 
380                                    </#if> 
381                                     
382                                    <#list doc.details.images.iterator() as pic> 
383                                        <div class="swiper-slide"> 
384                                            <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 
385                                        </div> 
386                                    </#list> 
387                                </div> 
388                            </div> 
389                        </div> 
390                    </div> 
391                </div> 
392            </div> 
393        </#if> 
394         
395        <#-- SEZIONE NON USATA 
396        <section class="mt-20"> 
397            <div class="container"> 
398                <div class="bg-light max-w-xl p-5 lg:p-10"> 
399                    <div class="card-row space-x-5"> 
400                        <div class="autofit-col"> 
401                            <div class="autofit-section"> 
402                                <i class="fas fa-download text-dark w-7 h-7"></i> 
403                            </div> 
404                        </div> 
405                        <div class="autofit-col autofit-col-expand"> 
406                            <div class="autofit-section"> 
407                                <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p> 
408                            </div> 
409                        </div> 
410                    </div> 
411                </div> 
412                 
413                <div class="row mt-10 lg:mt-20"> 
414                    <div class="col-12 col-lg-8"> 
415                        <div class="space-y-10"> 
416                            <p class="text-dark uppercase text-lg lg:text-3xl"> 
417                                ${d40.getLabel("dettagli")} 
418                            </p> 
419                            <div class="space-y-5"> 
420                                <div class="row"> 
421                                    <div class="col-12 col-md-3 col-lg-2"> 
422                                        <p class="text-dark font-bold uppercase">Data</p> 
423                                    </div> 
424                                    <div class="col-12 col-md-9 col-lg-10"> 
425                                        <div class="text-dark font-light text-lg"> 
426                                            Dettagli 
427                                        </div> 
428                                    </div> 
429                                </div> 
430                            </div> 
431                        </div> 
432                    </div> 
433                </div> 
434            </div> 
435        </section> 
436        --> 
437         
438        <section class="mt-20"> 
439            <div class="container"> 
440                <div class="bg-light"> 
441                    <div class="space-y-10 p-5 lg:p-10"> 
442                        <p class="text-dark uppercase text-lg lg:text-3xl mb-0"> 
443                            ${d40.getLabel("organizzazione")} 
444                        </p> 
445                        <div class="space-y-2"> 
446                            <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content> 
447                                <p class="text-dark mb-0"> 
448                                    ${doc.contacts.getJSONObject(0).address.fulltext} 
449                                </p> 
450                            </#if> 
451                             
452                            <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 
453                                <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline"> 
454                                    ${doc.contacts.getJSONObject(0).mail} 
455                                </a> 
456                            </#if> 
457                             
458                            <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 
459                                <#attempt> 
460                                    <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 
461                                        <p class="text-dark mb-0"> 
462                                            <span class="font-bold">${d40.getLabel("telefono")}:</span> 
463                                            ${phone} 
464                                        </p> 
465                                    </#list> 
466                                <#recover> 
467                                    <p class="text-dark mb-0"> 
468                                        <span class="font-bold">${d40.getLabel("telefono")}:</span> 
469                                        ${doc.contacts.getJSONObject(0).telephone} 
470                                    </p> 
471                                </#attempt> 
472                            </#if> 
473                        </div> 
474                    </div> 
475                </div> 
476            </div> 
477        </section> 
478         
479        <#-- 
480        <section class="mt-10"> 
481            <div class="container"> 
482                <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p> 
483                <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> 
484            </div> 
485        </section> 
486        --> 
487    <#else> 
488        <div class="text-center mt-35"> 
489            <p class="text-dark"> 
490                ${d40.getLabel("errore_caricamento_contenuto")} 
491            </p> 
492        </div> 
493    </#if> 
494</div> 
495 
496<script type="module"> 
497    import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js"; 
498 
499    createApp({ 
500        isMobile: window.innerWidth < 768, 
501        favorites: [], 
502        getFavorites() { 
503            if(localStorage.getItem("favorites") !== null) { 
504    			this.favorites = JSON.parse(localStorage.getItem("favorites")); 
505
506        }, 
507        setFavorite(e, item) { 
508            e.preventDefault(); 
509    		this.getFavorites(); 
510     
511    		var newFavorite = { 
512    			id: item.id, 
513        			contentJSON: { 
514    				title: item.contentJSON.title, 
515    				previewDescription: item.contentJSON.previewDescription, 
516    				description: item.contentJSON.description, 
517    				geoRef: item.contentJSON.geoRef, 
518    				previewPicture: item.contentJSON.previewPicture, 
519    				viewUrl: item.contentJSON.viewUrl, 
520    				type: "lfr", 
521
522    		}; 
523     
524    		this.favorites.push(newFavorite); 
525    		this.saveFavorites(); 
526    	}, 
527    	removeFavorite(e, itemId) { 
528    	    e.preventDefault(); 
529    		this.favorites = this.favorites.filter((obj) => obj.id !== itemId); 
530    		this.saveFavorites(); 
531    	}, 
532    	saveFavorites() { 
533    		localStorage.setItem("favorites", JSON.stringify(this.favorites)); 
534    	}, 
535    	isFavorite(itemId) { 
536    		if (this.favorites.some((e) => e.id == itemId)) { 
537    			return true; 
538
539     
540    		return false; 
541    	}, 
542    	buildMap(lat, lng) { 
543            var map = new SuggestoMap("suggesto-map"), 
544                location = [parseFloat(lat), parseFloat(lng)]; 
545             
546            var svgIcon = L.divIcon({ 
547                html: ` 
548                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343"> 
549                        <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"/> 
550                        <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"/> 
551                        <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"/> 
552                        <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"/> 
553                    </svg>`, 
554                className: "", 
555                iconSize: [44.537, 64.343], 
556                iconAnchor: [22.287, 64.343], 
557            }); 
558                 
559            var mapData = { 
560                tilelayer: "osm", 
561                gestureHandling: true, 
562                fitBounds: false, 
563                mapcenter: location, 
564                zoom: 15, 
565                markersFilter: "*", 
566                markers: [], 
567                layers: [] 
568            }; 
569                 
570            map.sm.createMap(mapData); 
571             
572            L.circleMarker(location, { 
573                radius: 0, 
574                color: "#000", 
575                fillOpacity: 0, 
576                weight: 0 
577            }).addTo(map.sm.lmap); 
578             
579            L.marker(location, { 
580                icon: svgIcon 
581            }).addTo(map.sm.lmap); 
582        }, 
583        share(title, desc, mode = "legacy") { 
584            if (this.isMobile) { 
585                var shareData = { 
586                    title: title, 
587                    text: desc, 
588                    url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D") 
589                }; 
590 
591                try { 
592                    navigator.share(shareData); 
593                } catch (err) { 
594                    console.error("Error sharing: " + err); 
595 
596                    if (mode == "legacy") { 
597                        this.legacyShare(); 
598                    } else if (mode == "social") { 
599                        this.socialShare(title, desc); 
600
601
602            } else { 
603                if (mode == "legacy") { 
604                    this.legacyShare(); 
605                } else if (mode == "social") { 
606                    this.socialShare(title, desc); 
607
608
609        }, 
610        legacyShare() { 
611            var clip = document.createElement("input"), 
612                toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D"); 
613 
614            document.body.appendChild(clip); 
615            clip.value = toCopy; 
616            clip.select(); 
617            clip.setSelectionRange(0, 999999); 
618 
619            navigator.clipboard.writeText(clip.value); 
620            document.body.removeChild(clip); 
621 
622            alert("Link copiato"); 
623        }, 
624        socialShare(title, desc, image = "") { 
625            var link = "#", 
626                winHeight = 450, 
627                winWidth = 600, 
628                winTop = window.screen.height / 2 - winHeight / 2, 
629                winLeft = window.screen.width / 2 - winWidth / 2, 
630                params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop; 
631 
632            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; 
633 
634            window.open(link, "Facebook", params); 
635
636    }).mount("#${d40.portletNamespace}"); 
637</script> 
638 
639<#if doc?has_content> 
640    <script> 
641        document.addEventListener("DOMContentLoaded", function(){ 
642         
643            document.querySelectorAll('a[href^="#contact"]').forEach(anchor => { 
644                anchor.addEventListener('click', function (e) { 
645                    e.preventDefault(); 
646             
647                    document.querySelector(this.getAttribute('href')).scrollIntoView({ 
648                        behavior: 'smooth' 
649                    }); 
650                }); 
651            }); 
652         
653         
654            if(${(doc.details.images?has_content)?c}){ 
655                new Swiper("#gallery .swiper-container", { 
656                    slidesPerView: 1, 
657                    spaceBetween: 50, 
658                    centerSlides: true, 
659                    centerInsufficientSlides: true, 
660                    breakpoints: { 
661                        768: { 
662                            slidesPerView: 2, 
663                            spaceBetween: 25 
664                        }, 
665                        992: { 
666                            slidesPerView: 3, 
667                            spaceBetween: 25 
668
669                    }, 
670                    navigation: { 
671                        prevEl: "#gallery .btn-prev", 
672                        nextEl: "#gallery .btn-next" 
673
674                }); 
675                 
676                var thumbnails = new Swiper("#thumbnail-swiper", { 
677                    spaceBetween: 10, 
678                    slidesPerView: 2, 
679                    centerInsufficientSlides: true, 
680                    freeMode: true, 
681                    watchSlidesVisibility: true, 
682                    watchSlidesProgress: true, 
683        			breakpoints: { 
684        				768: { 
685        					slidesPerView: 3 
686        				}, 
687        				992: { 
688        					slidesPerView: 4 
689        				}, 
690        				1200: { 
691        					slidesPerView: 5 
692
693        			}, 
694                }); 
695                 
696                var lightbox = new Swiper("#lightbox-swiper", { 
697        		    spaceBetween: 10, 
698                    autoHeight: true, 
699                    observer: true, 
700                    observeSlideChildren: true, 
701                    keyboard: { 
702                        enabled: true 
703                    }, 
704                    navigation: { 
705                        nextEl: ".swiper-button-next", 
706                        prevEl: ".swiper-button-prev" 
707                    }, 
708                    thumbs: { 
709                        swiper: thumbnails 
710
711                }); 
712                 
713                $("#lightbox-modal").on("shown.bs.modal", function(e){ 
714                    lightbox.update(); 
715                    thumbnails.update(); 
716                    lightbox.slideTo($(e.relatedTarget).data("slider")); 
717                    lightbox.update(); 
718                }); 
719                 
720                $("#lightbox-modal .swiper-wrapper").on("click", function(e){ 
721                    if($(e.target).attr("class").includes("swiper-slide")){ 
722                        $("#lightbox-modal").modal("hide"); 
723
724                }); 
725                 
726                if ($(window).width() > 991) { 
727                    var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight(); 
728                    var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight(); 
729                    var marg_h = right_col_h - left_col_h + 40; 
730                     
731                    if(right_col_h > left_col_h) 
732
733                        $('#gallery').removeClass('lg:mt-40 mt-20'); 
734                        $('#gallery').css({'margin-top':marg_h+'px'});  
735
736
737
738        }); 
739    </script> 
740</#if>