An error occurred while processing the template.
The following has evaluated to null or missing:
==> firstImage.getFile  [in template "20099#20135#5861246" at line 989, column 69]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to 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 relativeImageUrl = firstImage...  [in template "20099#20135#5861246" at line 989, column 41]
----
1<#-- 
2Template ID: 5861247 
3Template Key: 5861246 
4Type: display 
5Mode: None 
6--> 
7 
8<style> 
9    .link-list .link-container:last-child { 
10        border-bottom: 4px solid #395a3e; 
11
12    .link-sidebar-1 .link .label { 
13        font-size: 1.1rem; 
14
15</style> 
16 
17<#assign structureService = serviceLocator.findService("it.inera.structure.service.StructureService")> 
18<#assign dlAppServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")/> 
19<#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()> 
20<#assign itinerarioStructureId = structureService.getStructureItinerarioId()> 
21 
22<#assign segmentoStructureKey = structureService.getStructureSegmentoKey()> 
23<#assign segmentoStructureId = structureService.getStructureSegmentoId()> 
24 
25<#assign elasticService = serviceLocator.findService("it.inera.elastic.service.ElasticService")> 
26<#assign journalArticleId = .vars['reserved-article-id'].data/> 
27 
28<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
29<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
30<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
31 
32<#-- GESTIONE RALATED ASSETS IMPORTS--> 
33<#assign journalArticleConverter = serviceLocator.findService("it.inera.journalarticleconverter.service.JournalArticleConverter")> 
34<#assign searchService = serviceLocator.findService("it.inera.structure.search.service.SearchService")> 
35<#-- FINE GESTIONE RALATED ASSETS IMPORTS--> 
36 
37<#assign vocabularyIdUmbria = structureService.getVocabularyIdByVocabularyName("Vocabolario Umbria") > 
38 
39<#assign isGroupUmbria = structureService.isGroupUmbria(themeDisplay)> 
40 
41<#assign latitude = "" > 
42<#assign longitude = "" > 
43<#if coordinate_principali.getData()?has_content> 
44    <#assign coordinatePrincipaliJson = coordinate_principali.getData()?eval_json > 
45    <#if coordinatePrincipaliJson.lat?has_content > 
46        <#assign latitude = (coordinatePrincipaliJson.lat?c)!"" > 
47    </#if> 
48    <#if coordinatePrincipaliJson.longitude?has_content > 
49        <#assign longitude = (coordinatePrincipaliJson.lng?c)!"" > 
50    </#if> 
51</#if> 
52 
53<#function createTranslatedFilters> 
54 
55    <#assign arr = jsonFactoryUtil.createJSONArray() /> 
56 
57    <#assign o1 = jsonFactoryUtil.createJSONObject() /> 
58    <#assign o1 = o1.put("label", languageUtil.get(locale, "label.for.noleggi")) /> 
59    <#assign o1 = o1.put("value", "rental") /> 
60    <#assign o1 = o1.put("icon", "${themeDisplay.getPathThemeImages()}/icons/meccanico-simple.svg") /> 
61    <#assign arr = arr.put(o1) /> 
62 
63    <#assign o2 = jsonFactoryUtil.createJSONObject() /> 
64    <#assign o2 = o2.put("label", languageUtil.get(locale, "label.attrattori")) /> 
65    <#assign o2 = o2.put("value", "attrattore") /> 
66    <#assign o2 = o2.put("icon", "${themeDisplay.getPathThemeImages()}/icons/binocle.svg") /> 
67    <#assign arr = arr.put(o2) /> 
68 
69    <#assign o3 = jsonFactoryUtil.createJSONObject() /> 
70    <#assign o3 = o3.put("label", languageUtil.get(locale, "label.for.hotel")) /> 
71    <#assign o3 = o3.put("value", "accommodation") /> 
72    <#assign o3 = o3.put("icon", "${themeDisplay.getPathThemeImages()}/icons/hotel-simple.svg") /> 
73    <#assign arr = arr.put(o3) /> 
74 
75    <#assign o4 = jsonFactoryUtil.createJSONObject() /> 
76    <#assign o4 = o4.put("label", languageUtil.get(locale, "label.for.Ristoranti")) /> 
77    <#assign o4 = o4.put("value", "restaurant") /> 
78    <#assign o4 = o4.put("icon", "${themeDisplay.getPathThemeImages()}/icons/restaurants.svg") /> 
79    <#assign arr = arr.put(o4) /> 
80 
81    <#assign o5 = jsonFactoryUtil.createJSONObject() /> 
82    <#assign o5 = o5.put("label", languageUtil.get(locale, "label.informazioni.utili")) /> 
83    <#assign o5 = o5.put("value", "info") /> 
84    <#assign o5 = o5.put("icon", "${themeDisplay.getPathThemeImages()}/icons/infos.svg") /> 
85    <#assign arr = arr.put(o5) /> 
86 
87    <#return arr> 
88</#function> 
89 
90<#assign filtersJson = createTranslatedFilters().toString() /> 
91 
92<#assign currentArticle = journalArticleLocalService.getArticle(groupId, journalArticleId) /> 
93<#assign currentObject = journalArticleConverter.getItinerario(currentArticle, locale)> 
94<#assign relatedAssets = currentObject.getDirectRelatedAssets()> 
95 
96<#assign segmentsList = []/> 
97<#list relatedAssets![] as asset> 
98    <#if asset.getDDMStructureKey() != segmentoStructureKey?string> <#continue> </#if> 
99 
100    <#assign segmentData = { 
101        "segmento": (journalArticleConverter.getSegmento(asset, locale))!, 
102        "articleId": asset.getArticleId(), 
103    "resourcePrimKey": asset.getResourcePrimKey()?c 
104    }> 
105    <#assign segmentsList += [segmentData]> 
106</#list> 
107 
108<#--  LanguageId  --> 
109<#assign lang = "it"/> 
110<#if themeDisplay.getLanguageId()?contains("_")> 
111    <#assign lang = themeDisplay.getLanguageId()?split("_")[0]/> 
112<#else> 
113    <#assign lang = themeDisplay.getLanguageId()/> 
114</#if> 
115 
116<#-- GESTIONE RALATED ASSETS VALORIZZAZIONE ARRAY--> 
117 
118<#assign currentArticleResourcePrimKey = currentArticle.getResourcePrimKey() /> 
119<#assign currentArticleAssetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", currentArticleResourcePrimKey) /> 
120<#assign currentArticleAssetEntryId = currentArticleAssetEntry.getEntryId() /> 
121 
122<#assign assetRenderer = currentArticleAssetEntry.getAssetRenderer() /> 
123<#assign assetObject = assetRenderer.getAssetObject() /> 
124<#assign categoryList = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", assetObject.resourcePrimKey) /> 
125 
126<#assign vocabularyIdTerritori = structureService.getVocabularyIdByVocabularyName("Territori") > 
127<#assign municipalityNames = [] > 
128<#assign municipalityNamesString = "" > 
129<#assign territoryNameString = "" > 
130 
131<#list categoryList as category> 
132    <#if vocabularyIdTerritori == category.getVocabularyId() > 
133        <#assign municipalityName = category.getTitle(themeDisplay.getLanguageId()) > 
134 
135        <#assign childCategories = assetCategoryLocalService.getChildCategories(category.getCategoryId()) > 
136        <#if childCategories?has_content> 
137            <#assign territoryNameString = category.getTitle(themeDisplay.getLanguageId())> 
138            <#list childCategories as curChildCategory> 
139                <#assign municipalityNameC = curChildCategory.getTitle(themeDisplay.getLanguageId()) > 
140                <#if curChildCategory?counter != 1 || municipalityNamesString?has_content> 
141                    <#assign municipalityNamesString = municipalityNamesString + "," + municipalityNameC> 
142                <#else> 
143                    <#assign municipalityNamesString = municipalityNamesString + municipalityNameC> 
144                </#if> 
145                <#assign municipalityNames = municipalityNames + [municipalityNameC]> 
146            </#list> 
147        <#else> 
148            <#assign municipalityNames = municipalityNames + [municipalityName]> 
149            <#if municipalityNamesString?has_content> 
150                <#assign municipalityNamesString = municipalityNamesString + "," + municipalityName> 
151            <#else> 
152                <#assign municipalityNamesString = municipalityNamesString + municipalityName> 
153            </#if> 
154        </#if> 
155    </#if> 
156</#list> 
157 
158<#assign isgu = structureService.isGroupUmbria(themeDisplay)> 
159<#assign sitiESottositiCategories = ""> 
160<#if !isgu> 
161    <#assign sitiESottositiCategories = structureService.getSiteCategoryIdsByVocabularyName(themeDisplay, "Siti-e-sottositi") > 
162</#if> 
163 
164<#if isgu> 
165    <#assign results = elasticService.getRelatedArticlesOrderByPriority(themeDisplay, latitude, longitude, distanza.getData(), itinerarioStructureKey, itinerarioStructureId?c, locale, "6", null , null, journalArticleId, null, null, null) /> 
166<#else> 
167    <#assign results = elasticService.getRelatedArticlesOrderByPriority(themeDisplay, latitude, longitude, distanza.getData(), itinerarioStructureKey, itinerarioStructureId?c, locale, "6", null , sitiESottositiCategories, journalArticleId, null, null, null) /> 
168</#if> 
169 
170<#-- per categoria --> 
171<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")> 
172<#assign vocabularyName = "Vocabolario Umbria"/> 
173<#assign specificVocabulary = assetVocabularyLocalService.getGroupVocabulary(themeDisplay.getCompany().getGroupId(), vocabularyName)/> 
174<#if validator.isNotNull(specificVocabulary)> 
175    <#assign cats = specificVocabulary.getCategories()/> 
176</#if> 
177 
178<#assign assetRenderer = currentArticleAssetEntry.getAssetRenderer() /> 
179<#assign assetObject = assetRenderer.getAssetObject() /> 
180<#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", assetObject.resourcePrimKey)![]  /> 
181 
182<#assign tomBaseImagePath = propsUtil.get("tom.base.image.url") /> 
183 
184<div class="container-fluid"> 
185    <div class="row"> 
186        <div class="header-block header-under-nav header-block-image-layer header-block-1 header-block-image-main header-block-tagged"> 
187            <#if ((immagine_banner.getData())!)?has_content> 
188                <img class="bg" src="${immagine_banner.getData()}" 
189                     data-fileentryid="${immagine_banner.getAttribute("fileEntryId")!immagine_banner.getAttribute("classPK")!""}" 
190                     alt="${testo_alternativo_immagine_banner.getData()!}"> 
191            </#if> 
192            <div class="container title title-main"> 
193                <#assign titleCategory = ""> 
194                <#assign titleParentCategory = ""> 
195                <#list categoryList as category> 
196                    <#if vocabularyIdUmbria != category.getVocabularyId()> <#continue> </#if> 
197 
198                    <#assign titleCategory = category.getTitle(themeDisplay.getLocale())> 
199                    <#assign parentCategoryId = category.getParentCategoryId()> 
200                    <#if parentCategoryId?? && parentCategoryId?has_content && parentCategoryId != 0> 
201                        <#assign pc = assetCategoryLocalService.getCategory(parentCategoryId) > 
202                        <#if pc?? && pc?has_content> 
203                            <#assign titleParentCategory = pc.getTitle("it_IT")> 
204                        </#if> 
205                    </#if> 
206                    <#if (titleCategory!)?has_content> 
207                        <span class="hidden" id="tagmanager_init_pagegroup">${titleParentCategory}</span> 
208                        <span class="hidden" id="tagmanager_init_pagecategory">${titleCategory}</span> 
209                        <div class="badge badge-light badge-uppercase"> 
210                            ${titleCategory} 
211                        </div> 
212                    </#if> 
213                </#list> 
214                <h1 class="title-1 text-weight-300 margin-top-em-0 margin-bottom-em-0"> 
215                    ${titolo.getData()} 
216                </h1> 
217            </div> 
218        </div> 
219    </div> 
220</div> 
221 
222<#assign validDatiTecnici = [] /> 
223<#list dati_tecnici_chiaveFieldSet.getSiblings()![] as datoTecnico> 
224    <#if ((datoTecnico.dati_tecnici_valore.getData())!)?has_content> 
225        <#assign validDatiTecnici = validDatiTecnici + [datoTecnico] /> 
226    </#if> 
227</#list> 
228 
229<#assign itemCount = validDatiTecnici?size /> 
230 
231<div class="bg-white"> 
232    <#if validDatiTecnici?has_content> 
233    <div class="container bridge bridge-top"> 
234        <div class="card-bar card-bar-1 card-bar-dark"> 
235            <div class="card-row"> 
236                <#list validDatiTecnici as datoTecnico> 
237                <div class="col-${(itemCount > 3)?then(4?c, (12 / itemCount)?c)}"> 
238                    <div class="card card-horizontal card-3"> 
239                        <div class="card-row"> 
240                            <div class="card-icon card-item-first"> 
241                                <#if ((datoTecnico.dati_tecnici_icona.getData())!)?has_content> 
242                                <i class="fas ${datoTecnico.dati_tecnici_icona.getData()}"></i> 
243                                </#if> 
244                            </div> 
245                            <div class="card-body"> 
246                                <div class="card-subtitle title-6"> 
247                                    ${(datoTecnico.dati_tecnici_chiave.getData())!} 
248                                </div> 
249                                <div class="card-title"> 
250                                    ${(datoTecnico.dati_tecnici_valore.getData())!} 
251                                </div> 
252                            </div> 
253                        </div> 
254                    </div> 
255                </div> 
256                </#list> 
257            </div> 
258        </div> 
259    </div> 
260    </#if> 
261    <article class="container padding-bottom-em-0"> 
262        <div class="row padding-bottom-em-4"> 
263            <#if isGroupUmbria> 
264            <div class="col-12"> 
265                <#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
266                <a href="${currentUrl}" data-id="${journalArticleId}" 
267                   class="link link-tripplanner link-tripplanner-1 link-tripplanner-extended link-tripplanner-top-right margin-right-em-1 padding-right-rem-1" data-tom="false"> 
268                    <i class="far fa-heart text-red"></i> 
269                    <i class="fas fa-heart text-red" style="display:none"></i> 
270                    <span class="label hidden display-inline-lg"> 
271                        <@liferay.language key="label.aggiungi.al.mio.viaggio" /> 
272                    </span> 
273                </a> 
274                <div class="hidden infos"> 
275                    <div class="hidden" id="tagmanager_item_"> 
276                        <span id="tagmanager_item_id">${currentArticleAssetEntryId}</span> 
277                        <span id="tagmanager_item_category">${titleCategory}</span> 
278                        <span id="tagmanager_item_name">${titolo.getData()}</span> 
279                        <span id="tagmanager_item_list_name">${titleCategory}</span> 
280                        <span id="tagmanager_item_list_id"></span> 
281                        <span id="tagmanager_item_brand">${titleParentCategory}</span> 
282                        <span id="tagmanager_index">1</span> 
283                    </div> 
284                </div> 
285            </div> 
286            </#if> 
287            <div class="col-12 col-md-8"> 
288                <div class="text-block text-block-left d-flex flex-column"> 
289                    <div class="title-4 padding-bottom-em-1"> 
290                        ${sottotitolo.getData()} 
291                    </div> 
292                    <div class="text-block-expandable"> 
293                        <div class="text"> 
294                            ${descrizione.getData()} 
295                        </div> 
296                    </div> 
297                    <div class="margin-top-em-2 btn btn-flat btn-red btn-default btn-small btn-text-block-expand show-more" data-showmore="<@liferay.language key="label.mostra.tutto" />" data-showless="<@liferay.language key="label.mostra.meno" />"> 
298                        <@liferay.language key="label.mostra.tutto" /> 
299                    </div> 
300                </div> 
301            </div> 
302 
303            <#assign downloadItems = [] /> 
304            <#if file_tecniciFieldSet.getSiblings()?has_content 
305            && (file_tecniciFieldSet.getSiblings()?first.file.getData())?? 
306            && file_tecniciFieldSet.getSiblings()?first.file.getData()?has_content> 
307                <#list file_tecniciFieldSet.getSiblings() as cur_file_tecnici> 
308                    <#if ((cur_file_tecnici.file.getData())!)?has_content > 
309                        <#assign rawUrl = cur_file_tecnici.file.getData()?trim /> 
310                        <#if rawUrl?has_content> 
311                            <#assign urlNoQuery = (rawUrl?keep_before("?"))!rawUrl /> 
312                            <#assign ext = (urlNoQuery?lower_case?keep_after_last(".")?keep_before("/"))!"" /> 
313                            <#assign label = "File" /> 
314                            <#if cur_file_tecnici.file_tecnici.getData()??> 
315                                <#assign label = cur_file_tecnici.file_tecnici.getData() /> 
316                            </#if> 
317                            <#assign downloadItems = downloadItems + [{"url": rawUrl, "label": label}] /> 
318                        </#if> 
319                    </#if> 
320                </#list> 
321            </#if> 
322            <#assign gpxFilesList = [] /> 
323            <#assign gpxFileEntryIds = [] /> 
324            <#assign gpxFilesListWithWaypoints = [] /> 
325 
326            <#--  Aggiunta di tutti i gpx di segmento scaricabili  --> 
327            <#list segmentsList![] as segmentData> 
328                <#assign segmento = segmentData.segmento> 
329                <#assign gpxSegmento = segmento.getGpxSegmento()! /> 
330                <#if (gpxSegmento.getPublicUrl())!?has_content> 
331                    <#assign rawUrl = gpxSegmento.getPublicUrl()?trim /> 
332                    <#if rawUrl?has_content> 
333                        <#assign urlNoQuery = (rawUrl?keep_before("?"))!rawUrl /> 
334                        <#assign ext = "" /> 
335                        <#if (gpxSegmento.getExtension())!?has_content> 
336                            <#assign ext = gpxSegmento.getExtension() /> 
337                        <#else> 
338                            <#assign ext = (urlNoQuery?lower_case?keep_after_last(".")?keep_before("/"))!"" /> 
339                        </#if> 
340                        <#if ext == "gpx"> 
341                            <#assign label = "File GPX"/> 
342                            <#if (segmento.getNomeGpxSegmento()!)?has_content> 
343                                <#assign label = segmento.getNomeGpxSegmento() /> 
344                            </#if> 
345                            <#if (segmento.getTitolo()!)?has_content> 
346                                <#assign label = segmento.getTitolo() /> 
347                            </#if> 
348 
349                            <#assign gpxFileEntryId = ""/> 
350 
351                            <#assign gpxFilesListWithWaypoints += [{"gpxfile": rawUrl, "infoDiv": label}] /> 
352                            <#assign gpxFilesList += [{"gpxfile": rawUrl, "infoDiv": "#segment-${segmentData_index + 1}"}] /> 
353 
354                            <#if gpxSegmento.getFileEntryId()??> 
355                                <#assign gpxFileEntryId = gpxSegmento.getFileEntryId() /> 
356                                <#assign gpxFileEntryIds += [gpxFileEntryId] /> 
357                            <#elseif gpxSegmento.getClassPK()??> 
358                            <#-- Se non c'è fileEntryId ma c'è classPK, uso quello --> 
359                                <#assign gpxFileEntryId = gpxSegmento.getClassPK() /> 
360                                <#assign gpxFileEntryIds += [gpxFileEntryId] /> 
361                            </#if> 
362                        </#if> 
363                    </#if> 
364                </#if> 
365            </#list> 
366            <#if downloadItems?size gt 0 || gpxFilesListWithWaypoints?size gt 0> 
367                <aside class="col-12 col-md-4 margin-top-em-3 margin-top-md-em-0"> 
368                    <div class="text-block text-block-1"> 
369                        <div class="link-sidebar link-sidebar-1"> 
370                            <div class="title" style="border-top: 4px solid #395a3e; margin-top: 40px; padding-top: 1.5rem;"> 
371                                <@liferay.language key="label.download"/> 
372                            </div> 
373                            <ul class="link-list"> 
374                                <#list downloadItems![] as item> 
375                                    <li class="link-container"> 
376                                        <a class="link" href="${item.url}"> 
377                                            <i class="fas fa-angle-right"></i> 
378                                            <span class="label"> 
379                                            ${item.label} 
380                                        </span> 
381                                        </a> 
382                                    </li> 
383                                </#list> 
384 
385                                <#list gpxFilesListWithWaypoints![] as gpxFile> 
386                                    <li class="link-container"> 
387                                        <a class="link" href="${gpxFile.gpxfile}" download> 
388                                            <i class="fas fa-angle-right"></i> 
389                                            <span class="label">${gpxFile.infoDiv}</span> 
390                                        </a> 
391                                    </li> 
392                                </#list> 
393                            </ul> 
394                        </div> 
395                    </div> 
396 
397                    <#--  Link contenuto accessibile per link tra le 2 ciclovie  --> 
398                    <#attempt> 
399                        <#assign linkContenutoAccessibile = "" /> 
400                        <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("link_card_contenuto_accessibile")?has_content> 
401                            <#assign linkContAccessibile = currentArticle.getExpandoBridge().getAttribute("link_card_contenuto_accessibile") /> 
402                            <#list linkContAccessibile?keys as key> 
403                                <#if key == locale> 
404                                    <#assign linkContenutoAccessibile = linkContAccessibile?values[key_index] /> 
405                                </#if> 
406                            </#list> 
407                        </#if> 
408 
409                        <#assign titoloContenutoAccessibile = "" /> 
410                        <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("titolo_card_contenuto_accessibile")?has_content> 
411                            <#assign titoloContAccessibile = currentArticle.getExpandoBridge().getAttribute("titolo_card_contenuto_accessibile") /> 
412                            <#list titoloContAccessibile?keys as key> 
413                                <#if key == locale> 
414                                    <#assign titoloContenutoAccessibile = titoloContAccessibile?values[key_index] /> 
415                                </#if> 
416                            </#list> 
417                        </#if> 
418 
419                        <#assign sottotitoloContenutoAccessibile = "" /> 
420                        <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("sottotitolo_card_contenuto_accessibile")?has_content> 
421                            <#assign sottotitoloContAccessibile = currentArticle.getExpandoBridge().getAttribute("sottotitolo_card_contenuto_accessibile") /> 
422                            <#list sottotitoloContAccessibile?keys as key> 
423                                <#if key == locale> 
424                                    <#assign sottotitoloContenutoAccessibile = sottotitoloContAccessibile?values[key_index] /> 
425                                </#if> 
426                            </#list> 
427                        </#if> 
428 
429                        <#assign immagineContenutoAccessibile = "" /> 
430                        <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("immagine_card_contenuto_accessibile")?has_content> 
431                            <#assign immagineContenutoAccessibile = currentArticle.getExpandoBridge().getAttribute("immagine_card_contenuto_accessibile") /> 
432                        </#if> 
433 
434                        <#if linkContenutoAccessibile?has_content && titoloContenutoAccessibile?has_content && immagineContenutoAccessibile?has_content > 
435                            <div class="card card-horizontal card-event-1 card-event-default"> 
436                                <a class="card-link" href="${linkContenutoAccessibile}" aria-label="${titoloContenutoAccessibile}"></a> 
437                                <span class="card-row"> 
438                                <span class="card-image aspect-ratio card-item-first"> 
439                                    <img class="aspect-ratio-item aspect-ratio-item-center-ceil aspect-ratio-item-fluid bike-card" src="${immagineContenutoAccessibile}" alt="${titoloContenutoAccessibile}"> 
440                                </span> 
441                                <span class="card-body"> 
442                                    <div class="row"> 
443                                        <div class="col-12"><span class="card-title" style="font-size:20px;">${titoloContenutoAccessibile}</span></div> 
444                                        <#if sottotitoloContenutoAccessibile?has_content> 
445                                            <div class="col-12"><span class="card-subtitle title-6">${sottotitoloContenutoAccessibile}</span></div> 
446                                        </#if> 
447                                    </div> 
448                                </span> 
449                            </span> 
450                            </div> 
451                        </#if> 
452                        <#recover> 
453                    </#attempt> 
454                </aside> 
455            </#if> 
456        </div> 
457    </article> 
458</div> 
459 
460<#if ((accessibilita.getData())!)?has_content> 
461<div class="bg-white"> 
462    <div class="container"> 
463        <div class="row"> 
464            <div class="col-12 col-md-8"> 
465                <div class="text-block text-block-left"> 
466                    <div class="text"> 
467                        <strong><@liferay.language key="label.accessibilita" /></strong> 
468                        ${accessibilita.getData()} 
469                    </div> 
470                </div> 
471            </div> 
472        </div> 
473    </div> 
474</div> 
475</#if> 
476 
477<#if ((sicurezza.getData())!)?has_content> 
478<div class="bg-white"> 
479    <div class="container"> 
480        <div class="row"> 
481            <div class="col-12 col-md-8"> 
482                <div class="text-block text-block-left"> 
483                    <div class="text"> 
484                        <strong><@liferay.language key="label.sicurezza" /></strong> 
485                        ${sicurezza.getData()} 
486                    </div> 
487                </div> 
488            </div> 
489        </div> 
490    </div> 
491</div> 
492</#if> 
493 
494 
495<#--  Chiamata API per informazioni utili  --> 
496<#assign baseUrl = structureService.getSiteBaseUrl(themeDisplay)> 
497<#if baseUrl?ends_with("/")> 
498    <#assign baseUrl = baseUrl?remove_ending("/")> 
499</#if> 
500 
501<#assign apiPath = "/o/itinerary/useful-informations"> 
502<#assign queryParams = "?group-id=${groupId}&article-id=${journalArticleId}&language-id=${themeDisplay.getLanguageId()}"> 
503<#assign fullBaseUrl = themeDisplay.getPortalURL()> 
504<#assign fullApiUrl = apiPath + queryParams> 
505<#assign apiGpxPath = "/o/itinerary/gpx-poi"> 
506 
507<div class="container-fluid margin-bottom-em-2"> 
508    <div class="row row-mappa"> 
509        <div class="info-fullscreen-toggle"> 
510            <button class="btn btn-info-toggle" aria-label="nascondi / mostra info mappa"> 
511                <div class="arrow-container"><i class="fa-solid fa-chevron-left"></i></div> 
512            </button> 
513        </div> 
514        <div class="col-12 col-md-5 col-colmap border scrollable sidebar-map-view" style="padding-left: 30px;  padding-right:30px;"> 
515            <div class="text-block text-block-left pt-0 h-100" id="global-track"> 
516                <div class="title-4 padding-bottom-em-1 text-center text-md-left padding-top-em-1"> 
517                    <@liferay.language key="label.dettagli.tecnici.percorso"/> 
518                </div> 
519 
520                <#list dati_tecnici_chiaveFieldSet.getSiblings()![] as datiTecnici> 
521                    <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
522                        <#if ((datiTecnici.dati_tecnici_chiave.getData())!)?has_content && datiTecnici.getData() != "null"> 
523                            <div class="text font-weight-bold text-capitalize">${datiTecnici.dati_tecnici_chiave.getData()}</div> 
524                        </#if> 
525                        <#if ((datiTecnici.dati_tecnici_valore.getData())!)?has_content && datiTecnici.dati_tecnici_valore.getData() != "null"> 
526                            <div class="text text-right">${datiTecnici.dati_tecnici_valore.getData()}</div> 
527                        </#if> 
528                    </div> 
529                    <hr> 
530                </#list> 
531 
532                <div class="stages-itinerary mb-3"> 
533                    <div class="title-4 padding-bottom-em-1 text-center text-md-left padding-top-em-1"> 
534                        <@liferay.language key="label.segmenti.percorso"/> 
535                    </div> 
536 
537                    <#list segmentsList![] as segmentData> 
538                        <#assign segmento = segmentData.segmento> 
539                        <div class="stage-itinerary" data-stage-more="segment-${segmentData_index + 1}"> 
540                            <div class="mb-2 itinerary-stage"> 
541                                <div class="itinerary-sidebar flex-row justify-content-between"> 
542                                    <div class="marker p-0"> 
543                                        <div class="marker-label text-red"> 
544                                            <#if ((segmento.getTitolo())!)?has_content> 
545                                                ${segmento.getTitolo()} 
546                                            </#if> 
547                                        </div> 
548                                    </div> 
549                                </div> 
550                            </div> 
551                            <#--  Controlli immagine  --> 
552                            <#assign noLogoUrl = fullBaseUrl + baseUrl + "/o/umbria-theme/images/loghi/logo_no_image.png" /> 
553                            <#assign imgAltText = "" /> 
554 
555                            <#if ((segmento.getImmagineCopertina().getImmagineCopertina().getPublicUrl())!)?has_content> 
556                                <#assign immagineCopertinaSet = segmento.getImmagineCopertina()> 
557                                <#assign imgAltText = "Immagine senza titolo"> 
558                                <#if immagineCopertinaSet.getTestoAlternativoCopertina()?has_content> 
559                                    <#assign imgAltText = immagineCopertinaSet.getTestoAlternativoCopertina()> 
560                                <#elseif immagineCopertinaSet.getDescrizioneImmagine()?has_content> 
561                                    <#assign imgAltText = "Immagine: " + immagineCopertinaSet.getDescrizioneImmagine()> 
562                                </#if> 
563                            </#if> 
564 
565                            <div class="cover"> 
566                                <img class="cover-img" 
567                                     src="${(immagineCopertinaSet.getImmagineCopertina().getPublicUrl())!noLogoUrl}" 
568                                     data-fileentryid="${(immagineCopertinaSet.getImmagineCopertina().getFileEntryId())!(immagineCopertinaSet.getImmagineCopertina().getClassPK())!""}" 
569                                     alt="${imgAltText}"> 
570                            </div> 
571 
572                            <#--  Descrizione breve  --> 
573                            <div class="stage-infos mt-2"> 
574                                <div class="text margin-right-em-1"> 
575                                    <#if segmento.getDescrizioneBreve()?has_content> 
576                                        ${segmento.getDescrizioneBreve()} 
577                                    </#if> 
578                                </div> 
579                            </div> 
580                            <div class="margin-top-em-2 btn btn-flat btn-red btn-default btn-small"> 
581                                <@liferay.language key="label.mostra.tutto" /> 
582                            </div> 
583                        </div> 
584                        <hr> 
585                    </#list> 
586 
587                </div> 
588            </div> 
589            <#if segmentsList?has_content> 
590                <#list segmentsList as segmentData> 
591                    <#assign segmento = segmentData.segmento> 
592                    <#assign segmentResourcePrimKey = segmentData.resourcePrimKey /> 
593                    <#assign segmentArticleId = segmentData.articleId> 
594                    <div class="div-more" id="segment-${segmentData_index + 1}" > 
595                        <div class="d-flex justify-content-between"> 
596                            <button class="btn mt-2 pl-0 d-flex btn-back" aria-label="indietro"><svg class="svg-inline--fa fa-arrow-left mr-3" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-left" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"></path></svg><!-- <i class="fa-solid fa-arrow-left mr-3"></i> Font Awesome fontawesome.com --><@liferay.language key="label.torna.al.percorso"/></button> 
597                        </div> 
598 
599                        <div class="text-block text-block-left pt-0"> 
600                            <div class="title-4 padding-bottom-em-1 text-center padding-top-em-1"> 
601                                <#if segmento.getTitolo()?has_content> 
602                                    ${segmento.getTitolo()} 
603                                </#if> 
604                            </div> 
605                            <div class="text padding-bottom-em-1 font-weight-bold text-center"> 
606                                <@liferay.language key="label.dettagli.tecnici.segmento"/> 
607                            </div> 
608                            <#--  Tempi di percorrenza  --> 
609                            <#if segmento.getTempoPercorrenzaChiave()?has_content> 
610 
611                                <#assign showSection = true> 
612                                <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza> 
613                                    <#if !(tempoPercorrenza.getTempoPercorrenzaChiave()?has_content 
614                                    && tempoPercorrenza.getTempoPercorrenzaValore()?has_content 
615                                    && tempoPercorrenza.getTempoPercorrenzaIcona()?has_content)> 
616                                        <#assign showSection = false> 
617                                    </#if> 
618                                </#list> 
619 
620                                <#if showSection> 
621                                    <div class="overflow-auto"> 
622                                        <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
623                                            <div class="text font-weight-bold"><@liferay.language key="label.tempo.percorrenza"/></div> 
624                                            <div class="d-flex flex-justify-content-start pl-xl-3"> 
625                                                <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza> 
626                                                    <button class="p-1 rounded align-middle hover-overlay pl-md-0 pl-xl-1 border-0" aria-label="mostra durata percorso A piedi"> 
627                                                        <div class="btn button-durata" data-divapertura="div-but-${tempoPercorrenza_index}"> 
628                                                            <i class="${tempoPercorrenza.getTempoPercorrenzaIcona()}"></i> 
629                                                        </div> 
630                                                    </button> 
631                                                </#list> 
632                                            </div> 
633                                        </div> 
634 
635                                        <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza> 
636                                            <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row hideTime" id="div-but-${tempoPercorrenza_index}"> 
637                                                <div class="text">${tempoPercorrenza.getTempoPercorrenzaChiave()}</div> 
638                                                <div class="text">${tempoPercorrenza.getTempoPercorrenzaValore()}</div> 
639                                            </div> 
640                                        </#list> 
641                                    </div> 
642                                    <hr> 
643                                </#if> 
644 
645                            </#if> 
646                            <#--  Caratteristiche tecniche  --> 
647                            <#if segmento.getCaratteristicheTecniche()?has_content> 
648 
649                                <#list segmento.getCaratteristicheTecniche() as caratteristichePrimoLivello> 
650                                    <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
651                                        <div class="text font-weight-bold"> 
652                                            <#if caratteristichePrimoLivello.getChiavePrimoLivello()?has_content && caratteristichePrimoLivello.getChiavePrimoLivello() != "null"> 
653                                                ${caratteristichePrimoLivello.getChiavePrimoLivello()} 
654                                            </#if> 
655                                        </div> 
656 
657                                        <div class="text text-right"> 
658                                            <#if caratteristichePrimoLivello.getValorePrimoLivello()?has_content && caratteristichePrimoLivello.getValorePrimoLivello() != "null"> 
659                                                ${caratteristichePrimoLivello.getValorePrimoLivello()} 
660                                            </#if> 
661                                        </div> 
662                                    </div> 
663 
664                                <#--  Lista puntata per chiave-valore di secondo livello  --> 
665                                <#--  Chiave secondo livello (ripetibile)  --> 
666                                    <#if caratteristichePrimoLivello.getCaratteristicheTecnicheSecondoLivello()?has_content> 
667                                        <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
668                                            <ul> 
669                                                <#list caratteristichePrimoLivello.getCaratteristicheTecnicheSecondoLivello() as caratteristicheSecondoLivello> 
670                                                    <#if caratteristicheSecondoLivello.getChiaveSecondoLivello()?has_content && caratteristicheSecondoLivello.getChiaveSecondoLivello() != "null"> 
671                                                        <li> 
672                                                            <div class="text"> 
673                                                                ${caratteristicheSecondoLivello.getChiaveSecondoLivello()} 
674                                                                <#if caratteristicheSecondoLivello.getValoreSecondoLivello()?has_content && caratteristicheSecondoLivello.getValoreSecondoLivello() != "null"> 
675                                                                    : ${caratteristicheSecondoLivello.getValoreSecondoLivello()} 
676                                                                </#if> 
677                                                            </div> 
678                                                        </li> 
679                                                    </#if> 
680                                                </#list> 
681                                            </ul> 
682                                            <hr> 
683                                        </div> 
684                                    </#if> 
685                                </#list> 
686 
687                            <#--  GRAFICO DISLIVELLO ESTRATTO DAL GPX  --> 
688                                <#if segmento.getMostraAltimetriaSegmento() == true> 
689                                    <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
690                                        <canvas id="segment-${segmentData_index + 1}-elevationChart"  width="400" height="200"></canvas> 
691                                    </div> 
692                                <#else> 
693                                    <div class="d-none flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
694                                        <canvas id="segment-${segmentData_index + 1}-elevationChart"  width="400" height="200"></canvas> 
695                                    </div> 
696                                </#if> 
697                            <#--  DATA ULTIMO AGGIORNAMENTO  --> 
698                                <#if segmento.getDataUltimoAggiornamento()?has_content> 
699                                    <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
700                                        <div class="text font-weight-bold"> 
701                                            <@liferay.language key="label.data.ultimo.aggiornamento"/> 
702                                        </div> 
703                                        <div class="text text-right"> 
704                                            ${segmento.getDataUltimoAggiornamento()?string("dd MMM yyyy")} 
705                                        </div> 
706                                    </div> 
707                                    <hr> 
708                                </#if> 
709 
710                            </#if> 
711 
712                            <#--  Difficolta lungo il percorso  --> 
713                            <#if segmento.getAccessibilitaDifficolta()?has_content> 
714                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
715                                    <div class="text font-weight-bold"><@liferay.language key="label.difficolta.lungo.segmento"/></div> 
716                                </div> 
717                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
718                                    <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
719                                        ${segmento.getAccessibilitaDifficolta()} 
720                                    </div> 
721                                </div> 
722                                <hr> 
723                            </#if> 
724 
725                            <#--  Video  --> 
726                            <#if ((segmento.getVideo().getPublicUrl())!)?has_content> 
727                            <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
728                                <div class="text font-weight-bold lineheight-2-5"> 
729                                    <@liferay.language key="label.video.guida"/> 
730                                </div> 
731                                <div class="text text-right"> 
732                                    <button class="btn modalvideo font-1-5rem" aria-label="apri video tappa" 
733                                            data-toggle="modal" data-target="#modalvideocontainer" 
734                                            data-urlvideo="${segmento.getVideo().getPublicUrl()}"> 
735                                        <i class="fas fa-play"></i> 
736                                    </button> 
737                                </div> 
738                            </div> 
739                            <hr> 
740                            </#if> 
741 
742                            <#--  Audio  --> 
743                            <#if ((segmento.getAudio().getPublicUrl())!)?has_content> 
744                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
745                                    <div class="text font-weight-bold"><@liferay.language key="label.audio.descrizione"/></div> 
746                                    <div class="text text-right"> 
747                                        <audio controls preload="none"> 
748                                            <source src="${segmento.getAudio().getPublicUrl()}" type="audio/ogg"> 
749                                            <source src="${segmento.getAudio().getPublicUrl()}" type="audio/mpeg"> 
750                                        </audio> 
751                                    </div> 
752                                </div> 
753                                <hr> 
754                            </#if> 
755                            <#if segmento.getImmagine()?has_content > 
756                                <div> 
757                                    <div class="text font-weight-bold"> 
758                                        <@liferay.language key="label.foto"/> 
759                                    </div> 
760                                    <div class="photo-carousel" 
761                                         data-config-img-ajax="{&quot;url&quot;:&quot;/o/itinerary/img-tappa?languageId=${themeDisplay.languageId}&amp;articleId=${segmentArticleId}&amp;groupId=${groupId}&amp;resourcePrimKey=${segmentData.resourcePrimKey}&quot;,&quot;container&quot;:&quot;#carosel-segment-${segmentData_index + 1}&quot;,&quot;template&quot;:&quot;#template-imgs-tappa&quot;,&quot;data&quot;:{&quot;tappa&quot;:&quot;segment-${segmentData_index + 1}&quot;},&quot;append&quot;:true}"> 
762                                        <div class="carousel-container transparent little-carousel"> 
763                                            <div id="carosel-segment-${segmentData_index + 1}" 
764                                                 class="tns-carousel tns-carousel-default tns-controlpreload" 
765                                                 data-tns-config="{&quot;loop&quot;:false,&quot;items&quot;:2,&quot;responsive&quot;:{&quot;768&quot;:{&quot;items&quot;:3},&quot;991&quot;:{&quot;items&quot;:4}}}"> 
766                                            </div> 
767                                        </div> 
768                                    </div> 
769                                </div> 
770                                <hr> 
771                            </#if> 
772                            <#--  Note caratteristiche tecniche  --> 
773                            <#if segmento.getNoteCaratteristicheTecniche()?has_content> 
774                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
775                                    <div class="text font-weight-bold pb-4"><@liferay.language key="label.note.caratteristiche.tecniche"/></div> 
776                                </div> 
777                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
778                                    <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
779                                        <div class="text"> 
780                                            ${segmento.getNoteCaratteristicheTecniche()} 
781                                        </div> 
782                                    </div> 
783                                </div> 
784                                <hr> 
785                            </#if> 
786 
787                            <#if (segmento.getDescrizioneBreve()?has_content) 
788                            || ((segmento.getDescrizione()?has_content))> 
789                                <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row"> 
790                                    <div class="text font-weight-bold pb-4"><@liferay.language key="label.descrizione"/></div> 
791                                </div> 
792                                <div class="pb-4d d-flex flex-column"> 
793                                    <#if (segmento.getDescrizioneBreve()?has_content)> 
794                                        <div class="summary"> 
795                                            <div class="text">${segmento.getDescrizioneBreve()}</div> 
796                                        </div> 
797                                    </#if> 
798                                    <#if ((segmento.getDescrizione()?has_content))> 
799                                        <div class="d-none descrizione"> 
800                                            <div class="text">${segmento.getDescrizione()}</div> 
801                                        </div> 
802                                    </#if> 
803                                    <#if segmento.getDescrizione()?has_content> 
804                                        <div class="margin-top-em-2 mx-auto btn btn-flat btn-big btn-green more"> 
805                                            <div class="text"><@liferay.language key="label.mostra.tutto"/></div> 
806                                        </div> 
807                                        <div class="margin-top-em-2 mx-auto btn btn-flat btn-big d-none btn-green less"> 
808                                            <div class="text"><@liferay.language key="label.mostra.meno"/></div> 
809                                        </div> 
810                                    </#if> 
811                                </div> 
812                                <hr> 
813                            </#if> 
814                            <div> 
815                                <div class="container-infosnew"> 
816                                    <div class="event-button" data-ajax-button="{&quot;method&quot;:&quot;get&quot;,&quot;url&quot;:&quot;${fullApiUrl}&quot;,&quot;container&quot;:&quot;#results-segment-${segmentData_index + 1}&quot;,&quot;preload&quot;:true,&quot;template&quot;:&quot;#template-points&quot;,&quot;pageParam&quot;:&quot;page&quot;,&quot;current_segment&quot;:&quot;segment-${segmentData_index + 1}&quot;,&quot;page&quot;:0,&quot;append&quot;:true,&quot;__class&quot;:&quot;&quot;}" data-page="1" style="display: none;"> </div> 
817                                </div> 
818                                <div class="resultsHandlebarsSec" id="results-segment-${segmentData_index + 1}"></div>                            </div> 
819                        </div> 
820                    </div> 
821                </#list> 
822            </#if> 
823        </div> 
824        <script id="template-points" type="text/x-handlebars-template"> 
825            {{#if_ContentObj this.segments_points this.segment}} 
826            <div class="d-flex justify-content-between align-items-center pb-4"> 
827                <div class="text font-weight-bold"><@liferay.language key="label.informazioni.utili"/></div> 
828                <div class="div-filters"> 
829                    <div class="container-switch d-flex align-items-center"> 
830                        <label class="form-check-label me-2" for="marker-switch"> 
831            <@liferay.language key="label.mostra.su.mappa"/> 
832            </label> 
833            <div class="form-check form-switch"> 
834                <input class="marker-switch form-check-input" type="checkbox" role="switch" data-divparent="{{this.segment}}"> 
835            </div> 
836        </div> 
837    </div> 
838</div> 
839{{/if_ContentObj}} 
840{{#each this.segments_points as | point |}} 
841{{#each_Condition point.data ../this.segment}} 
842<div class="div"> 
843    <div class="row m-0"> 
844        <div class="d-flex flex-row w-100"> 
845            <div class="col-2 col-sm-4 col-lg-2"> 
846                <div class="iconinfo text-center" style="line-height:1"><i class="fa-2xl font-3rem {{this.info.icon}}"></i></div> 
847            </div> 
848            <div class="col-8 col-sm-6 col-lg-9 padding-left-lg-em-0 pl-4"> 
849                <div class="ml-2"> 
850                    <div class="itinerary-sidebar flex-row"> 
851                        <div class="marker-label text-red font-weight-bold">{{this.info.title}}</div> 
852                    </div>{{#each this.data}} 
853                    {{#if (eq this.idsezione ../../this.segment) }} 
854                    {{#if this.coordinates}} 
855                    <div> 
856                        <div class="itinerary-stage" id="{{this.id}}" data-popup-url="{{this.url}}" data-icon-marker="{{../this.info.icon}}" data-type="{{this.type}}" data-parent-tappa="{{this.idsezione}}" data-coords="[{&quot;lat&quot;:&quot;{{this.coordinates.lat}}&quot;,&quot;lng&quot;:&quot;{{this.coordinates.lng}}&quot;}]" data-title="{{this.name}}" data-altri-data="data-altri-data"> 
857                            <div class="name-place">{{this.name}}</div> 
858                        </div> 
859                    </div>{{else}} 
860                    <div> 
861                        <div class="itinerary-stage-nomarker" id="{{this.id}}"> 
862                            <div class="name-place">{{this.name}}</div> 
863                        </div> 
864                    </div>{{/if}} 
865                    {{/if}} 
866                    {{/each}} 
867                </div> 
868            </div> 
869        </div> 
870    </div> 
871</div> 
872<hr/>{{/each_Condition}} 
873{{/each}} 
874        </script> 
875 
876 
877        <#assign gpxJson = "[" /> 
878        <#list gpxFilesList as gpxFile> 
879            <#assign gpxJson += '{"gpxfile":"${gpxFile.gpxfile}", "infoDiv":"${gpxFile.infoDiv}"}' /> 
880            <#if gpxFile_has_next> 
881                <#assign gpxJson += "," /> 
882            </#if> 
883        </#list> 
884        <#assign gpxJson += "]" /> 
885 
886        <#-- Converti l'array in stringa JSON --> 
887        <#assign gpxFileEntryIdsJson = "[" /> 
888        <#list gpxFileEntryIds as id> 
889            <#assign gpxFileEntryIdsJson += id?c /><#-- ?c converte in stringa --> 
890            <#if id_has_next> 
891                <#assign gpxFileEntryIdsJson += "," /> 
892            </#if> 
893        </#list> 
894        <#assign gpxFileEntryIdsJson += "]" /> 
895 
896        <div class="col-12 col-md-7 col-map map-align p-0"> 
897            <div class="sidebar"> 
898                <div class="map map-container map-view"> 
899                    <div class="map-content"> 
900                        <div id="map-handlebarsplus" 
901                             class="leaflet-interactive-map map-summary-itinerary map-itinerary-gpx leaflet-container leaflet-touch leaflet-fade-anim leaflet-touch-zoom" 
902                             data-kml="" 
903                             data-gpx='${gpxJson}' 
904                             data-idgpx='${gpxFileEntryIdsJson}' 
905                             data-gpxglobal="${(gpx_globale.getData())!""}" 
906                             data-config="{&quot;otherTemplate&quot;:false,&quot;isItinerary&quot;:true,&quot;clustering&quot;:true,&quot;multiLayer&quot;:true,&quot;customFilters&quot;:true,&quot;filters&quot;:${filtersJson?html},&quot;dataAjaxpoint&quot;:{&quot;groupId&quot;:&quot;${groupId}&quot;},&quot;ajaxpointutl&quot;:&quot;${apiGpxPath}&quot;,&quot;articleId&quot;:&quot;${journalArticleId}&quot;}"> 
907                        </div> 
908                    </div> 
909                </div> 
910            </div> 
911        </div> 
912    </div> 
913</div> 
914 
915<#if ((descrizione_immagineFieldSet.getSiblings()[0].immagine.getData())!)?has_content> 
916<div class="bg-white"> 
917    <div class="carousel-container carousel-no-ctrl transparent margin-bottom-em-1 tns-overflow-show carousel-image-slide carousel-draggable"> 
918        <div class="tns-carousel tns-carousel-no-ctrl" data-tns-config="{&quot;autoWidth&quot;:true,&quot;items&quot;:2,&quot;autoplay&quot;:false, 
919            &quot;responsive&quot;:{&quot;768&quot;:{&quot;items&quot;:3},&quot;992&quot;:{&quot;items&quot;:4}}}"> 
920            <#list descrizione_immagineFieldSet.getSiblings() as cur_immagine> 
921                <div class="item-with-caption"> 
922                    <#if ((cur_immagine.immagine.getData())!)?has_content> 
923                    <img class="slide-image" src="${cur_immagine.immagine.getData()}" 
924                         data-fileentryid="${(cur_immagine.immagine.getAttribute("fileEntryId"))!(cur_immagine.immagine.getAttribute("classPK"))!""}" 
925                         alt="${cur_immagine.testo_alternativo.getData()}"> 
926                    </#if> 
927                    <#if ((cur_immagine.didascalia.getData())!)?has_content> 
928                    <p class="caption">${cur_immagine.didascalia.getData()}</p> 
929                    </#if> 
930                </div> 
931            </#list> 
932        </div> 
933    </div> 
934</div> 
935</#if> 
936 
937<#assign tomApi = serviceLocator.findService("it.inera.tom.api.TOMAPI")> 
938<#assign offerResults = [] /> 
939<#attempt> 
940    <#assign offerResults = (tomApi.getJsonOffersListResultByMunicipalities(municipalityNames, lang).getResponse().getResults())![] /> 
941<#recover> 
942</#attempt> 
943 
944<#if offerResults?has_content> 
945<aside class="bg-white" id="hideable"> 
946    <div class="container padding-top-em-3"> 
947        <div class="row"> 
948            <div class="col-12 col-md-10 offset-md-1 margin-bottom-lg-em-0 margin-bottom-em-2"> 
949                <div class="text-block text-block-center"> 
950                    <div class="title-2"> 
951                        <@liferay.language key="label.migliori.offerte" /> 
952                    </div> 
953                    <div class="text"> 
954                        <@liferay.language key="label.proposte.vivere.umbria" /> 
955                    </div> 
956                </div> 
957            </div> 
958        </div> 
959 
960        <div class="row"> 
961            <div class="col-12"> 
962                <div class="d-flex flex-justify-content-end"> 
963                    <a class="link-showall" href="/offerte-luogo?municipality=${municipalityNamesString}&territory=${territoryNameString}"><@liferay.language key="label.vedi.tutte" /> 
964                        <i class="fas fa-angle-right"></i> 
965                    </a> 
966                </div> 
967            </div> 
968            <div class="col-12"> 
969                <div class="carousel-container transparent margin-top-em-1 margin-bottom-em-2"> 
970                    <div class="tns-carousel tns-carousel-default"> 
971                        <#list offerResults as offerResult> 
972                        <div> 
973                            <div class="card card-1 card-offerta has-info-commercial"> 
974                                <a class="card-link" 
975                                   href="/dettaglio-offerta/-/dettaglio/${offerResult.getSlug()}_${offerResult.getId()}_${offerResult.getType()}" 
976                                   aria-label="${offerResult.getTitle()}"></a> 
977                                <div class="card-header"> 
978                                    <div class="hidden" id="tagmanager_item_card"> 
979                                        <span id="tagmanager_item_id">${offerResult.getId()}</span> 
980                                        <span id="tagmanager_item_category_card">${offerResult.getType()}</span> 
981                                        <span id="tagmanager_item_name">${offerResult.getTitle()}</span> 
982                                        <span id="tagmanager_item_list_name_card">Le migliori offerte per te</span> 
983                                        <span id="tagmanager_item_list_id"></span> 
984                                        <span id="tagmanager_item_brand">${offerResult.getType()}</span> 
985                                        <span id="tagmanager_index">${offerResult_index}</span> 
986                                    </div> 
987                                    <div class="card-header-bg aspect-ratio aspect-ratio-4-3"> 
988                                        <#assign firstImage = (offerResult.getGalleries().getImages()[0])!> 
989                                        <#assign relativeImageUrl = firstImage.getFile()!/> 
990                                        <#assign fullImageUrl = "/o/umbria-theme/images/loghi/logo_no_image.png"/> 
991                                        <#assign alt = "logo_no_image"/> 
992                                        <#if relativeImageUrl?has_content> 
993                                            <#assign fullImageUrl = propsUtil.get("tom.base.image.url") + relativeImageUrl/> 
994                                            <#assign alt ="Titolo: " + offerResult.getTitle()!/> 
995 
996                                            <#if (firstImage.getAlt()!)?has_content> 
997                                            <#assign alt = offerResult.getGalleries().getImages()[0].getAlt()/> 
998                                            </#if> 
999                                        </#if> 
1000                                        <img src="${fullImageUrl}" alt="${alt}"> 
1001                                    </div> 
1002 
1003 
1004                                    <button class="link link-tripplanner link-tripplanner-1 link-tripplanner-top-right margin-top-em-2 margin-right-em-1" 
1005                                            data-detail-type="${offerResult.getType()}<#if offerResult.getType()! != "accommodation">/offer</#if>" 
1006                                            data-id="${offerResult.getId()}" data-tom="true" 
1007                                            aria-label="<@liferay.language key="label.aggiungi.elimina.viaggio"/>"> 
1008                                        <i class="far fa-heart text-red"></i> 
1009                                        <i class="fas fa-heart text-red" style="display:none;"></i> 
1010                                    </button> 
1011                                    <div class="card-header-info"> 
1012                                        <div class="card-badges"> 
1013                                            <div class="badge badge-light-blue"> 
1014                                                <#if offerResult.getType() == 'guide'> 
1015                                                    <@liferay.language key="label.guide" /> 
1016                                                </#if> 
1017                                                <#if offerResult.getType() == 'travelagency'> 
1018                                                    <@liferay.language key="label.pacchetti.turistici" /> 
1019                                                </#if> 
1020                                                <#if offerResult.getType() == 'consortium'> 
1021                                                    <@liferay.language key="label.pacchetti.turistici" /> 
1022                                                </#if> 
1023                                                <#if offerResult.getType() == 'accommodation'> 
1024                                                    <@liferay.language key="label.accommodation" /> 
1025                                                </#if> 
1026                                                <#if offerResult.getType() == 'service'> 
1027                                                    <@liferay.language key="label.esperienze.in.azienda" /> 
1028                                                </#if> 
1029                                                <#if offerResult.getType() == 'educationalfarm'> 
1030                                                    <@liferay.language key="label.percorsi.didattici" /> 
1031                                                </#if> 
1032                                            </div> 
1033                                        </div> 
1034                                        <div class="header-title title-5">${offerResult.getTitle()}</div> 
1035                                    </div> 
1036                                </div> 
1037                                <div class="card-body"> 
1038                                    <div class="card-body-title title-4"> 
1039                                        ${offerResult.getTitle()} 
1040                                    </div> 
1041                                    <#if offerResult.getSubtitle()?has_content> 
1042                                    <div class="card-body-subtitle"> 
1043                                        ${offerResult.getSubtitle()} 
1044                                    </div> 
1045                                    </#if> 
1046                                </div> 
1047                                <div class="card-info card-info-commercial"> 
1048                                    <div class="info info-commercial"> 
1049                                    <#if ((offerResult.getDuration().getCount())!)?has_content 
1050                                    && ((offerResult.getDuration().getType())!)?has_content> 
1051                                        <div class="label"><@liferay.language key="label.durata" /></div> 
1052                                        <div class="title text-bold"> 
1053                                            ${offerResult.getDuration().getCount()} ${offerResult.getDuration().getType()} 
1054                                        </div> 
1055                                    </#if> 
1056                                    </div> 
1057                                    <div class="info info-commercial"> 
1058                                        <#if ((offerResult.getMinimumPrice()!0) > 0)> 
1059                                        <div class="label"> 
1060                                            <@liferay.language key="label.a.partire.da" /> 
1061                                        </div> 
1062                                        <div class="title text-bold"> 
1063                                            <@liferay.language key="label.euro" /> ${offerResult.getMinimumPrice()} 
1064                                        </div> 
1065                                        <#else> 
1066                                        <div class="label"> 
1067                                            <@liferay.language key="label.prezzo.su.richiesta" /> 
1068                                        </div> 
1069                                        </#if> 
1070                                    </div> 
1071                                </div> 
1072                            </div> 
1073                        </div> 
1074                        </#list> 
1075                    </div> 
1076                </div> 
1077            </div> 
1078        </div> 
1079    </div> 
1080</aside> 
1081</#if> 
1082 
1083 
1084<#if results?has_content> 
1085<aside class="bg-gray"> 
1086    <div class="container padding-top-em-3 padding-bottom-em-5"> 
1087        <div class="row"> 
1088            <div class="col-12 col-md-10 offset-md-1 margin-bottom-em-2 margin-bottom-lg-em-0"> 
1089                <div class="text-block text-block-center"> 
1090                    <div class="title-2"> 
1091                        <@liferay.language key="label.potrebbe.interessarti.anche"/> 
1092                    </div> 
1093                    <div class="text"> 
1094                        <@liferay.language key="label.scopri.proposte.uniche"/> 
1095                    </div> 
1096                </div> 
1097            </div> 
1098 
1099            <div class="col-12 same-heigh-cards"> 
1100                <div class="carousel-container transparent carousel-controls-bottom margin-top-em-1 margin-bottom-em-2 carousel-draggable"> 
1101                    <div class="tns-carousel tns-carousel-default tns-nav-off"> 
1102                        <#list results as related> 
1103                            <#assign contentByLocale = related.getContentByLocale(themeDisplay.getLanguageId()) /> 
1104                            <#assign document = saxReaderUtil.read(contentByLocale) > 
1105                            <#assign rootElement = document.getRootElement()> 
1106 
1107                            <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 
1108                            <#assign relatedTitolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 
1109 
1110                            <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 
1111                            <#assign relatedSottotitolo = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()> 
1112 
1113                            <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='immagine_banner']")> 
1114                            <#assign relatedImmagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()> 
1115                            <#if relatedImmagineBanner?has_content > 
1116                                <#assign imgBannerJson = relatedImmagineBanner?eval_json /> 
1117                                <#assign imgBannerId = (imgBannerJson.fileEntryId!imgBannerJson.classPK!0)?number /> 
1118                            <#else> 
1119                                <#assign imgBannerId = 0 > 
1120                            </#if> 
1121                            <#assign xPathTestoAlternativoImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_banner']")> 
1122                            <#assign relatedTestoAlternativoImmagineBanner = xPathTestoAlternativoImmagineBanner.selectSingleNode(rootElement).getStringValue()> 
1123 
1124                            <#assign resourcePrimKey = related.getResourcePrimKey() /> 
1125                            <#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey)![]  /> 
1126 
1127                            <#assign categoryNames = [] > 
1128 
1129                            <#list categories as category> 
1130                                <#if vocabularyIdUmbria == category.getVocabularyId() > 
1131                                    <#assign categoryNames = categoryNames + [category.getTitle(themeDisplay.getLanguageId())] > 
1132                                </#if> 
1133                            </#list> 
1134 
1135                            <#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)> 
1136                        <div> 
1137                            <a href="${detailBaseUrl}/-/${related.getUrlTitle(locale)}" aria-label="${related.getTitle()}" 
1138                               class="card card-1 card-1-styled"> 
1139                                <div class="card-header"> 
1140                                    <div class="hidden" id="tagmanager_item_card_potrebbe_interessarti"> 
1141                                        <span id="tagmanager_item_id_potrebbe_interessarti">${related.getId()}</span> 
1142                                        <span id="tagmanager_item_category_card_potrebbe_interessarti">${titleCategory}</span> 
1143                                        <span id="tagmanager_item_name_potrebbe_interessarti">${related.getTitle()}</span> 
1144                                        <span id="tagmanager_item_list_name_potrebbe_interessarti">Potrebbe interessarti</span> 
1145                                        <span id="tagmanager_item_list_id_potrebbe_interessarti"></span> 
1146                                        <span id="tagmanager_item_brand_potrebbe_interessarti">${titleCategory}</span> 
1147                                        <span id="tagmanager_index_potrebbe_interessarti">${related_index}</span> 
1148                                    </div> 
1149 
1150                                    <div class="card-header-bg aspect-ratio aspect-ratio-4-3"> 
1151                                        <#if imgBannerId gt 0> 
1152                                            <@adaptive_media_image["img"] 
1153                                            alt=relatedTestoAlternativoImmagineBanner 
1154                                            fileVersion=dlAppServiceUtil.getFileEntry(imgBannerId).getFileVersion()/> 
1155                                        </#if> 
1156                                    </div> 
1157                                    <button class="link link-tripplanner link-tripplanner-top-right margin-top-em-2 margin-right-em-1 link-tripplanner-styled" data-id="${related.getArticleId()}" data-tom="false" aria-label="<@liferay.language key="label.aggiungi.elimina.viaggio"/>"> 
1158                                        <i class="far fa-heart text-red" data-prefix="far"></i> 
1159                                        <i class="fas fa-heart text-red" data-prefix="fas" style="display:none"></i> 
1160                                    </button> 
1161                                    <div class="card-header-info"> 
1162                                        <#list categoryNames as categoryName> 
1163                                        <div class="badge btn-trasparent"> 
1164                                            ${categoryName} 
1165                                        </div> 
1166                                        </#list> 
1167                                    </div> 
1168                                </div> 
1169                                <div class="card-body"> 
1170                                    <div class="card-body-title title-4"> 
1171                                        ${relatedTitolo} 
1172                                    </div> 
1173                                    <div class="card-body-subtitle"> 
1174                                        ${relatedSottotitolo} 
1175                                    </div> 
1176                                </div> 
1177                                <div class="card-info mt-4"></div> 
1178                            </a> 
1179                        </div> 
1180                        </#list> 
1181                    </div> 
1182                </div> 
1183            </div> 
1184        </div> 
1185    </div> 
1186</aside> 
1187</#if> 
1188 
1189<script> 
1190    $("#backLink").click(function(event) { 
1191        event.preventDefault(); 
1192        history.back(1); 
1193    }); 
1194</script> 
1195 
1196<script id="map-popup-1-template" type="text/x-handlebars-template"> 
1197    <div class="map-popup map-popup-1"> 
1198        {{#if (eq url '') }} 
1199        <div class="border-0 p-0 m-0 title" id="itinerary-popup">{{title}}</div> 
1200        {{else}} 
1201        <a href="{{url}}" target="_blank"><div class="title">{{title}}</div></a> 
1202        {{/if}} 
1203    </div> 
1204</script> 
1205<script id="map-popup-2-template" type="text/x-handlebars-template"> 
1206    <div class="map-popup map-popup-1" style="width:301px"> 
1207        <a class="card card-5" href="#" aria-label="{{title}}"> 
1208            <div class="card-header"> 
1209                <div class="card-image"><img src="{{image}}" alt="{{alt}}"/></div> 
1210            </div> 
1211            <div class="card-body"> 
1212                <div class="card-info">{{type}}</div> 
1213                <div class="card-title">{{title}}</div> 
1214                <div class="card-text">{{text}}</div> 
1215            </div> 
1216            <div class="card-footer"> 
1217                <div class="card-info"> 
1218                    <div class="button-container" style="text-align: right; margin-top: 1em;"> 
1219                        <button id="button-popup" class="btn-transparent" data-href="{{href}}">Scopri di più</button> 
1220                    </div> 
1221                </div> 
1222            </div> 
1223        </a> 
1224    </div> 
1225</script> 
1226<script id="map-popup-3-template" type="text/x-handlebars-template"> 
1227    <div class="map-popup map-popup-1" style="width:301px"> 
1228        <a class="card card-5" href="#" aria-label="{{title}}"> 
1229            <div class="card-header"> 
1230                <div class="card-image"><img src="{{image}}" alt="{{alt}}"/></div> 
1231            </div> 
1232            <div class="card-body"> 
1233                <div class="card-info">{{type}}</div> 
1234                <div class="card-title">{{title}}</div> 
1235                <div class="card-text">{{text}}</div> 
1236            </div> 
1237            <div class="card-footer"> 
1238                <div class="card-info"></div> 
1239            </div> 
1240        </a> 
1241    </div> 
1242</script> 
1243 
1244<div class="modal bs-modal fade" id="modalvideocontainer" tabindex="-1" role="dialog" aria-label="Modal video" aria-hidden="true"> 
1245    <div class="modal-dialog" role="document"> 
1246        <div class="modal-content"> 
1247            <div class="modal-header"> 
1248                <button class="btn btn-close modalvidoe-close" type="button" data-dismiss="modal" aria-label="Chiudi finestra modale"><span aria-hidden="true">&times;</span></button> 
1249            </div> 
1250            <div class="modal-body"> 
1251                <div id="modalVideoView"></div> 
1252            </div> 
1253        </div> 
1254    </div> 
1255</div> 
1256 
1257<div class="modal bs-modal fade" id="filterModal" tabindex="-1" role="dialog" aria-label="Modal filtri" aria-hidden="true"> 
1258    <div class="modal-dialog modal-dialog-centered basic-modal"> 
1259        <div class="modal-content"> 
1260            <div class="modal-header"> 
1261                <h5 class="modal-title" data-asw-orgfontsize="20" style="font-size: 20px;"><@liferay.language key="label.filtri"/></h5> 
1262                <div class="buttons-modal"> 
1263                    <button class="btn" type="button" data-dismiss="modal" aria-label="Close"><@liferay.language key="label.cancella.filtri"/></button> 
1264                    <button class="close" type="button" data-dismiss="modal" aria-label="Close"><span aria-hidden="true" style="font-size:25px" data-asw-orgfontsize="25">×</span></button> 
1265                </div> 
1266            </div> 
1267            <div class="modal-body" data-has-scroll-event="true"> 
1268                <div class="text-block pt-0 pb-3"> 
1269                    <div class="text font-weight-bold"><@liferay.language key="label.informazioni.utili"/></div> 
1270                    <div class="points-container border p-3"> 
1271                        <button class="badge badge-pill badge-light text-md" data-istype="fontane"><@liferay.language key="label.fontane"/></button> 
1272                        <button class="badge badge-pill badge-light text-md" data-istype="parcheggi"><@liferay.language key="label.parcheggi"/></button> 
1273                        <button class="badge badge-pill badge-light text-md" data-istype="bagni"><@liferay.language key="label.bagni"/></button> 
1274                        <button class="badge badge-pill badge-light text-md" data-istype="ristoranti"><@liferay.language key="label.for.Ristoranti"/></button> 
1275                    </div> 
1276                </div> 
1277                <div class="text-block pt-0 pb-3"> 
1278                    <div class="text font-weight-bold"><@liferay.language key="label.punti.interesse"/></div> 
1279                    <div class="points-container border p-3"> 
1280                        <button class="badge badge-pill badge-light text-1rem" data-istype="accommodation">Accommodation</button> 
1281                        <button class="badge badge-pill badge-light text-1rem" data-istype="rental">Rental</button> 
1282                    </div> 
1283                </div> 
1284            </div> 
1285        </div> 
1286    </div> 
1287</div> 
1288 
1289<script id="template-imgs-tappa" type="text/x-handlebars-template"> 
1290    {{#each this.imgs}} 
1291    <div> 
1292        <a href="{{this.src}}" data-lightbox="gallery-slide-{{../this.tappaid}}" data-title="{{this.didascalia}}" data-alt="{{this.alt}}"> 
1293            <img class="image-mini m-0" src="{{this.src}}" alt="{{this.alt}}" loading="lazy"> 
1294        </a> 
1295    </div> 
1296    {{/each}} 
1297</script>