Lunghi litorali di sabbia finissima che abbracciano vivaci cittadine costiere, intime calette nascoste tra pareti di roccia che si specchiano sulle acque azzurre dell’Adriatico, baie meravigliose immerse in paesaggi incontaminati. Le spiagge delle Marche raccontano i tanti modi di vivere il mare.

Leggi tutto Riduci
Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> curExtraSearchField.inputAspect  [in template "20097#20123#204862" at line 108, column 94]

----
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: #if curExtraSearchField.inputAspect =...  [in template "20097#20123#204862" at line 108, column 89]
	- Reached through: @ricerca_components["ricerca-form"] s...  [in template "20097#20123#204862" at line 58, column 33]
----
1<#-- instance id --> 
2<#assign instanceId = themeDisplay.getPortletDisplay().getId()?keep_after("INSTANCE_") /> 
3 
4<#-- Ricavo servizi utili in seguito --> 
5<#-- Servizio per i layout di pagina --> 
6<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") /> 
7<#-- Servizio utile per ricavare i documenti della DM --> 
8<#assign dlFileEntryLocalService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryLocalService') /> 
9 
10<#-- Etichette --> 
11<#-- localita --> 
12<#assign label_localita_s = languageUtil.get(locale, "label_localita_s") /> 
13<#assign label_localita_p = languageUtil.get(locale, "label_localita_p") /> 
14<#assign ricerca_extra_field_place = languageUtil.get(locale, "ricerca_extra_field_place") /> 
15<#assign ricerca_extra_field_place_placeholder = languageUtil.get(locale, "ricerca_extra_field_place_placeholder") /> 
16<#assign label_chiama_telefono = languageUtil.get(locale, "label_chiama_telefono") /> 
17<#assign label_invia_email_a = languageUtil.get(locale, "label_invia_email_a") /> 
18<#assign label_e_mail = languageUtil.get(locale, "label_e_mail") /> 
19<#assign label_sito_web = languageUtil.get(locale, "label_sito_web") /> 
20<#assign label_vai_sito_web = languageUtil.get(locale, "label_vai_sito_web") /> 
21<#-- generiche --> 
22<#assign label_filtro_cosa = languageUtil.get(locale, "label_filtro_cosa") /> 
23<#assign label_placeholder_filtro_cosa = languageUtil.get(locale, "label_placeholder_filtro_cosa") /> 
24<#assign label_button_cerca = languageUtil.get(locale, "label_button_cerca") /> 
25<#assign label_button_cerca_su_mappa = languageUtil.get(locale, "label_button_cerca_su_mappa") /> 
26<#assign label_categorie = languageUtil.get(locale, "label_categorie") /> 
27<#assign label_seleziona = languageUtil.get(locale, "label_seleziona") /> 
28<#assign label_vai_dettaglio = languageUtil.get(locale, "label_vai_dettaglio") /> 
29<#assign label_leggi_tutto = languageUtil.get(locale, "label_leggi_tutto") /> 
30<#assign label_aggiungi_lista_viaggio = languageUtil.get(locale, "label_aggiungi_lista_viaggio") /> 
31<#assign label_scarica_formato_csv = languageUtil.get(locale, "label_scarica_formato_csv") /> 
32 
33<#-- Inclusione widget template con macros e relativi servizi --> 
34<#include "${templatesPath}/RICERCA_COMMON_MACROS" /> 
35 
36<#-- campi personalizzati --> 
37<#-- ricavo il valore del vocabolario DESTINAZIONI, che serve per recuperare le relative categorie --> 
38<#assign DESTINAZIONI_VOCABULARY_ID = "" /> 
39<#if validator.isNotNull(themeDisplay.getLayout().getGroup().getExpandoBridge()) > 
40	<#if (( themeDisplay.getLayout().getGroup().getExpandoBridge().hasAttribute("destinazioni_vocabulary_id"))) > 
41		<#if themeDisplay.getLayout().getGroup().getExpandoBridge().getAttribute("destinazioni_vocabulary_id")??> 
42			<#assign DESTINAZIONI_VOCABULARY_ID = themeDisplay.getLayout().getGroup().getExpandoBridge().getAttribute("destinazioni_vocabulary_id")/> 
43		</#if> 
44	</#if> 
45</#if> 
46 
47<#-- html --> 
48<div class="col-12"> 
49	<div class="search-template search-template-localita"> 
50		 
51		<#-- da qui inizia l'html così come da mockup: solo modalita desktop --> 
52		<div class="search-form-container search-form-container-desktop py-3"> 
53    		<#-- aggiunta classe m-0 --> 
54    		<div class="row m-0"> 
55        		<div class="col-12"> 
56		 
57					<#-- form con ricerca testuale, per data, e pulsanti --> 
58			       	<@ricerca_components["ricerca-form"] searchUrl="${searchUrl}" method="get" id="search-localita-form-desktop"> 
59			       	 
60			       		<#-- contenitore con sfondo --> 
61			       		<div class="search-form"> 
62			       		 
63			       			<#-- campo hidden per ricerca senza risultati --> 
64			       			<input type="hidden" name="searchSubmit" value="true"> 
65			       		 
66				       		<#-- campo hidden per ordinamento: non usato --> 
67							<#-- 
68							<input type="hidden" value="${searchInput.orderBy}" name="orderBy" id="orderByInputHiddenDesktop"> 
69							--> 
70							 
71							<#-- campo hidden per cambio vista: non usato --> 
72							<#-- 
73							<input type="hidden" value="${viewTypeKey}${ricercaPortletConfig.configViewParamsSeparator}${viewTypeValue}" name="viewParams" id="input-viewParams-viewType">    
74							--> 
75							 
76							<#-- inizio barra filtri orizzontatli --> 
77							<div class="form-row align-items-center"> 
78 
79								<#if ricercaPortletConfig.configInputqTitleLabel != ""> 
80									<#assign label_filtro_cosa = ricercaPortletConfig.configInputqTitleLabel /> 
81								</#if> 
82							 
83								<#-- campo di ricerca testuale --> 
84								<div class="col-12 <#if searchInput.extraSearchFields?has_content || (ricercaPortletConfig.configShowCategoriesFilterInSearchbar == true)>col-md mb-md-2<#else>col-md</#if> text-uppercase search-form-title">				        		 
85									<label for="input-ricerca-q" class="mb-0">${label_filtro_cosa}</label> 
86									<@ricerca_components["ricerca-input-q"] cssClass="form-control"  
87										value="${searchInput.q}" 
88										placeholder="${label_placeholder_filtro_cosa}"> 
89									</@> 
90									<#if SUGGERIMENTI_RICERCA_CONTENT?? && SUGGERIMENTI_RICERCA_CONTENT !=""> 
91										${SUGGERIMENTI_RICERCA_CONTENT} 
92									</#if> 
93								</div> 
94	 
95								<#-- campo di ricerca per località: campo dinamico prelevato da configurazione --> 
96								<#if searchInput.extraSearchFields?has_content> 
97									<#list searchInput.extraSearchFields as curExtraSearchField > 
98										<#assign curExtraSearchFieldValue = "" /> 
99										<#if curExtraSearchField.value?has_content> 
100											<#assign curExtraSearchFieldValue = curExtraSearchField.value /> 
101										</#if> 
102										 
103										<#assign curExtraSearchFieldName = curExtraSearchField.fieldNamePrefix+curExtraSearchField.field /> 
104										<#assign curExtraSearchFieldLabel = curExtraSearchField.fieldLabel /> 
105										 
106										<div id="${curExtraSearchFieldName}_container" class="col-12 col-md text-uppercase search-form-extra-field mb-md-2"> 
107											<label for="${curExtraSearchFieldName}" class="mb-0">${curExtraSearchFieldLabel}</label> 
108											<#if curExtraSearchField.inputAspect = "OPTIONS"> 
109												<select class="form-control" id="${curExtraSearchFieldName}" name="${curExtraSearchFieldName}" value="${curExtraSearchFieldValue}"> 
110													<option value="">${label_seleziona}</option> 
111													<#assign keyName = curExtraSearchField.field /> 
112													<#assign selectOptions = selectsItemsLabels[keyName] /> 
113													<#if selectOptions?has_content> 
114														<#list selectOptions as opt> 
115															<#assign isSelected = "" /> 
116															<#if curExtraSearchFieldValue?string?lower_case == opt?lower_case> 
117																<#assign isSelected = "selected" /> 
118															</#if> 
119															<option value="${opt}" ${isSelected}>${opt}</option> 
120														</#list> 
121													</#if> 
122												</select> 
123											<#else> 
124												<input type="text" class="form-control" id="${curExtraSearchFieldName}" name="${curExtraSearchFieldName}" value="${curExtraSearchFieldValue}" placeholder="${label_placeholder_filtro_cosa}"> 
125											</#if> 
126										</div> 
127										 
128										<#if curExtraSearchField.autoCompleteUrl?? && curExtraSearchField.autoCompleteUrl != ""> 
129											<#if curExtraSearchField.inputAspect = "TEXTFIELD"> 
130												<script> 
131												$('#${curExtraSearchFieldName}').autocomplete({ 
132													paramName: 'q', 
133													appendTo: '#${curExtraSearchFieldName}_container', 
134													serviceUrl: '${curExtraSearchField.autoCompleteUrl}', 
135													dataType: 'json', 
136													transformResult: function(response) { 
137														return { 
138															suggestions: $.map(response.data, function(dataItem) { 
139																return dataItem.displayName; 
140															}) 
141														}; 
142
143												}); 
144												</script> 
145											</#if> 
146										</#if> 
147									</#list> 
148								</#if> 
149																		 
150								<#if ricercaPortletConfig.configSearchbarCategoriesFieldLabel != ""> 
151									<#assign label_categorie = ricercaPortletConfig.configSearchbarCategoriesFieldLabel /> 
152								</#if> 
153											 
154								<#if (ricercaPortletConfig.configShowCategoriesFilterInSearchbar == true)> 
155									<#-- visualizzo searchbar categories --> 
156									<#if (searchbarCategoriesAsKeyValue?size > 0)> 
157										<div class="col-12 col-md text-uppercase search-form-extra-field mb-md-2"> 
158											<label for="searchbar-select-ricerca-categorie" class="mb-0">${label_categorie}</label> 
159											<select name="categoryIdsSearchbar" class="form-control" id="searchbar-select-ricerca-categorie"> 
160												<option value="">${label_seleziona}</option> 
161												<#list searchbarCategoriesAsKeyValue?keys as prop> 
162													<#assign isSelected = "" /> 
163													<#if searchInput.categoryIdsSearchbar?has_content> 
164														<#list searchInput.categoryIdsSearchbar as categoryId> 
165															<#if categoryId?string == prop> 
166																<#assign isSelected = "selected" /> 
167															</#if> 
168														</#list> 
169													</#if> 
170													<option value="${prop}" ${isSelected}>${searchbarCategoriesAsKeyValue[prop]}</option> 
171												</#list>   
172											</select> 
173										</div> 
174									</#if> 
175									<#-- visualizzo searchbar extra categories --> 
176									<#if categoriesExtraSearchFieldsObject?has_content> 
177										<#list categoriesExtraSearchFieldsObject as curVoc> 
178											<div class="col-12 col-md text-uppercase search-form-extra-field mb-md-2"> 
179												<label for="searchbar-select-ricerca-categorie-${curVoc.vocabularyId}" class="mb-0"> 
180													${curVoc.vocabularyLabel} 
181												</label> 
182												<select name="categoryIdsSearchbar" class="form-control" id="searchbar-select-ricerca-categorie-${curVoc.vocabularyId}"> 
183													<option value=""> 
184														${label_seleziona} 
185													</option> 
186													<#list curVoc.categories?keys as curCat> 
187														<#assign isSelected="" /> 
188														<#if searchInput.categoryIdsSearchbar?has_content> 
189															<#list searchInput.categoryIdsSearchbar as categoryId> 
190																<#if categoryId?string == curCat> 
191																	<#assign isSelected="selected" /> 
192																</#if> 
193															</#list> 
194														</#if> 
195														<option value="${curCat}" ${isSelected}> 
196															${curVoc.categories[curCat]} 
197														</option> 
198													</#list> 
199												</select> 
200											</div> 
201										</#list> 
202									</#if>	 
203								</#if>	 
204											 
205								<#-- pulsante di ricerca --> 
206								<div class="col-12 col-md-2 search-form-button"> 
207				       				<button type="submit" class="btn-dark btn-block"><span class="fa fa-search mr-1" aria-hidden="true"></span>${label_button_cerca}</button> 
208								</div> 
209	 
210								<#-- codice aggiunto per la ricerca geo su mappa, funziona con la variabile impostata a true nell'init --> 
211								<#assign latValue="" /> 
212								<#if searchInput.lat?has_content> 
213									<#assign latValue="${searchInput.lat}" /> 
214								</#if> 
215								<#assign lngValue="" /> 
216								<#if searchInput.lng?has_content> 
217									<#assign lngValue="${searchInput.lng}" /> 
218								</#if> 
219								<#assign distanceValue="" /> 
220								<#if searchInput.distance?has_content> 
221									<#assign distanceValue="${searchInput.distance}" /> 
222								</#if> 
223								 
224								<#-- variabili per gestire accessibilità e visualizzazione mappa, nel caso in cui cè una ricerca geo in atto --> 
225								<#assign statusCollapse = "" /> 
226								<#assign statusCollapseAria = "false" /> 
227								<#if (searchInput.lat?has_content) && (searchInput.lng?has_content) && (searchInput.distance?has_content)> 
228									<#assign statusCollapse = "show" /> 
229									<#assign statusCollapseAria = "true" /> 
230								</#if> 
231								 
232								<#-- pulsante per visualizzare la mappa nascosta --> 
233								<div class="col-12 col-md-3 search-form-map-button"> 
234									<button class="container-fluid position-relative transition btn-dark btn-map" type="button" data-toggle="collapse" data-target="#map-container-desktop" aria-expanded="${statusCollapseAria}" aria-controls="map-container-desktop"> 
235										<span class="position-relative"><span class="fa fa-map-marker mr-1" aria-hidden="true"></span>${label_button_cerca_su_mappa}</span> 
236									</button> 
237								</div> 
238			       			</div> 
239			       			 
240							<#-- richiamo taglib mappa: ha il suo html base --> 
241							<#-- rich-map: wrapper class for rich marker --> 
242							<div id="map-container-desktop" class="rich-map-container collapse my-4 ${statusCollapse}"> 
243								<@ricerca_components["ricerca-map"]> 
244								</@> 
245							</div> 
246						</div> 
247						 
248						<#-- IMPORTANTE: inizializzo la mappa, da fare subito dopo la chiusura della taglib --> 
249						<#-- poichè il form ha un id custom, lo riporto come parametro nell'init --> 
250						<script> 
251							TglSearchMap.init({ 
252								centerLatitude: 43.3285259, 
253							    centerLongitude: 13.0509109, 
254							    initialZoom: 13, 
255								geoSearch: true, 
256								searchFormId: "search-localita-form-desktop", 
257								submitOnGeoSearch: true 
258							}); 
259						</script> 
260						 
261						<#-- nel caso di una ricerca geo, passo alla mappa i valori impostati nelle variabili sopra create--> 
262						<script type="text/javascript"> 
263							TglSearchMap.setSearchCircle('${latValue}', '${lngValue}', '${distanceValue}'); 
264						</script> 
265						 
266					</@> 
267				</div> 
268			</div> 
269		</div> 
270		 
271		<#if entries?has_content> 
272			<#list entries as curEntry> 
273				 
274				<#-- sezione divisa in due colonne: categorie e lista risultati --> 
275				<div id="search-results" class="search-results"> 
276					 
277					<#-- aggiunta classe m-0 --> 
278					<div class="row m-0"> 
279 
280						<#-- ricerca per categorie --> 
281	                	<#if (ricercaPortletConfig.configSearchByCategories == true) && (ricercaPortletConfig.configShowCategoriesFilterInSidebar == true) && (categoriesAsKeyValue?size > 0)> 
282	                	 
283	                		<#-- setto una variabile booleana per far partire gli accordion o aperti o chiusi a seconda della configurazione --> 
284	                		<#assign vocabulariesCollapsed = false /> 
285	                		<#if ricercaPortletConfig.configStartWithCollapsedVocabularies?? && ricercaPortletConfig.configStartWithCollapsedVocabularies == true> 
286		                		<#assign vocabulariesCollapsed = true /> 
287	                		</#if> 
288	                	 
289							<#-- modificato da col-md-3 a col-lg-3 --> 
290							<div class="col-12 col-lg-3 search-filters-container"> 
291							 
292			                	<div class="search-filters filters-desktop"> 
293				                    <#-- caso di ricerca per categorie multiple --> 
294				                    <#if ricercaPortletConfig.configSelectMultipleCategories == true> 
295				                    	<#-- caso di visualizzazione di tutte le categorie --> 
296				                    	<#if ricercaPortletConfig.allVocabulariesCategories == true> 
297											<#-- caso di elenco di categorie e sottocategorie indentate con nome vocabolario - sfrutta macro presente nel template RICERCA_COMMON_MACROS --> 
298											<#if ricercaPortletConfig.configAllowVocabulariesLabelFilter == true> 
299												<span class="d-flex align-items-center justify-content-between text-uppercase" data-toggle="collapse" data-target="#list-filters" role="button" aria-expanded="true" aria-controls="list-filters"> 
300													<span>${label_categorie} 
301														<#if searchInput.categoryIds?has_content> 
302															<span class="badge">${searchInput.categoryIds?size}</span> 
303														</#if> 
304													</span> 
305												</span> 
306												<div id="list-filters" class="list-filters collapse show mt-4"> 
307													<ul class="list-unstyled"> 
308														<#list hierarchicalVocabulariesOptions as voKey, voValue> 
309															<#if voKey == DESTINAZIONI_VOCABULARY_ID> 
310																<#-- nn lo visualizzo --> 
311															<#else> 
312																<li class="mb-2"> 
313																	<a class="accordion-title h4" href="#accordion-content_${voKey}" data-toggle="collapse" aria-expanded="<#if !vocabulariesCollapsed>true<#else>false</#if>"> 
314																		${voValue.value.label} 
315																	</a> 
316																	<div id="accordion-content_${voKey}" class="accordion-content collapse <#if !vocabulariesCollapsed>show</#if>"> 
317																		<@getAllCategoriesDesktop voValue.children /> 
318																	</div> 
319																</li> 
320															</#if> 
321														</#list> 
322													</ul> 
323												</div> 
324											<#else> 
325												<#-- caso di elenco categorie e sottocategorie indentate ma senza nome vocabolario - sfrutta macro presente nel template RICERCA_COMMON_MACROS --> 
326												<#if hierarchicalCategoriesOptions?? && hierarchicalCategoriesOptions?has_content> 
327													<span class="d-flex align-items-center justify-content-between text-uppercase" data-toggle="collapse" data-target="#list-filters" role="button" aria-expanded="true" aria-controls="list-filters"> 
328														<span>${label_categorie} 
329															<#if searchInput.categoryIds?has_content> 
330																<span class="badge">${searchInput.categoryIds?size}</span> 
331															</#if> 
332														</span> 
333													</span> 
334													<div id="list-filters" class="list-filters collapse show mt-4"> 
335														<#-- ciclo sulle categorie --> 
336														<@getAllCategoriesDesktop hierarchicalCategoriesOptions /> 
337													</div> 
338												</#if> 
339											</#if> 
340										<#else> 
341											<#-- caso di categorie selezionate manualmente dalla select di configurazione --> 
342											<#-- caso di elenco di categorie e sottocategorie indentate con nome vocabolario - sfrutta macro presente nel template RICERCA_COMMON_MACROS --> 
343											<#if ricercaPortletConfig.configAllowVocabulariesLabelFilter == true> 
344												<span class="d-flex align-items-center justify-content-between text-uppercase" data-toggle="collapse" data-target="#list-filters" role="button" aria-expanded="true" aria-controls="list-filters"> 
345													<span>${label_categorie} 
346														<#if searchInput.categoryIds?has_content> 
347															<span class="badge">${searchInput.categoryIds?size}</span> 
348														</#if> 
349													</span> 
350												</span> 
351												<div id="list-filters" class="list-filters collapse show mt-4"> 
352													<ul class="list-unstyled"> 
353														<#list flatVocabulariesAndCategoriesAsKeyValueForMultiSelect as voKey, voValue> 
354															<#if voKey == DESTINAZIONI_VOCABULARY_ID> 
355																<#-- nn lo visualizzo --> 
356															<#else> 
357																<li class="mb-2"> 
358																	<a class="accordion-title h4" href="#accordion-content_${voKey}" data-toggle="collapse" aria-expanded="<#if !vocabulariesCollapsed>true<#else>false</#if>"> 
359																		${voValue.value.label} 
360																	</a> 
361																	<div id="accordion-content_${voKey}" class="accordion-content collapse <#if !vocabulariesCollapsed>show</#if>"> 
362																		<@getAllCategoriesDesktop voValue.children /> 
363																	</div> 
364																</li> 
365															</#if> 
366														</#list> 
367													</ul> 
368												</div> 
369											<#else> 
370												<#-- caso di elenco categorie e sottocategorie indentate ma senza nome vocabolario - sfrutta macro presente nel template RICERCA_COMMON_MACROS --> 
371												<#if flatCategoriesAsKeyValueForMultiSelect?? && flatCategoriesAsKeyValueForMultiSelect?has_content> 
372													<span class="d-flex align-items-center justify-content-between text-uppercase" data-toggle="collapse" data-target="#list-filters" role="button" aria-expanded="true" aria-controls="list-filters"> 
373														<span>${label_categorie} 
374															<#if searchInput.categoryIds?has_content> 
375																<span class="badge">${searchInput.categoryIds?size}</span> 
376															</#if> 
377														</span> 
378													</span> 
379													<div id="list-filters" class="list-filters collapse show mt-4"> 
380														<@getAllCategoriesDesktop flatCategoriesAsKeyValueForMultiSelect /> 
381													</div> 
382												</#if> 
383											</#if> 
384										</#if> 
385									<#else> 
386										<#-- visualizzo una select singola --> 
387										<label for="select-ricerca-categorie" class="d-block text-uppercase mb-4">${label_categorie}</label> 
388					                    <select name="categoryIds" class="form-control" id="select-ricerca-categorie"> 
389				                            <option value="">${label_seleziona}</option> 
390					                        <#list categoriesAsKeyValue?keys as prop> 
391					                        	<#assign isSelected = "" /> 
392					                        	<#if searchInput.categoryIds?has_content> 
393													<#list searchInput.categoryIds as categoryId> 
394														<#if categoryId?string == prop> 
395															<#assign isSelected = "selected" /> 
396														</#if> 
397													</#list> 
398												</#if> 
399					                            <option value="${prop}" ${isSelected}>${categoriesAsKeyValue[prop]}</option> 
400					                        </#list>   
401					                    </select> 
402									</#if> 
403								</div> 
404							</div>				 
405						</#if> 
406					 
407						<#-- lista risultati --> 
408						<#-- modificato da col-md-9 a col-lg-9 --> 
409						<#if (ricercaPortletConfig.configSearchByCategories == true) && (ricercaPortletConfig.configShowCategoriesFilterInSidebar == true) && (categoriesAsKeyValue?size > 0)> 
410							<div class="col-12 col-lg-9 p-0 search-list-results-container"> 
411						<#else>	 
412							<div class="col-12 p-0 search-list-results-container"> 
413						</#if>							 
414							<#-- numero risultati + range di ricerca corrente + pulsante cambio data --> 
415							<#-- aggiunta classe m-0 --> 
416							<#if (ricercaPortletConfig.configShowResultNumber == true) || 
417								(ricercaPortletConfig.configShowResultTitle == true && ricercaPortletConfig.configResultTitleLabel != "")|| 
418								(ricercaPortletConfig.configCanExportSearchResults == true)>	 
419								<div class="row search-list-results-setting m-0"> 
420									<div class="col-10 col-sm-10 col-md-10 col-lg-10 col-xl-8 d-flex align-items-center"> 
421										<#if (ricercaPortletConfig.configShowResultNumber == true) || (ricercaPortletConfig.configShowResultTitle == true && ricercaPortletConfig.configResultTitleLabel != "")> 
422											<div class="d-inline-block mb-0 position-relative h3 search-list-results-number no-arrow"> 
423												<#if ricercaPortletConfig.configShowResultNumber == true>${curEntry.paging.totalRecordsCount} </#if><#if ricercaPortletConfig.configShowResultTitle == true && ricercaPortletConfig.configResultTitleLabel != "">${ricercaPortletConfig.configResultTitleLabel}</#if> 
424											</div> 
425										</#if> 
426									</div> 
427									 
428									<#if ricercaPortletConfig.configCanExportSearchResults == true> 
429										<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-4"> 
430											<button onclick="downloadCsv('${ricercaPortletConfig.configExportCsvUrl}')" class="btn btn-secondary btn-sm float-right" title="${label_scarica_formato_csv}"><span class="fa-solid fa-download" aria-hidden="true"></span></button> 
431										</div> 
432									</#if> 
433								</div> 
434							</#if> 
435							 
436							<#if curEntry.records?has_content> 
437								<#-- GRIGLIA: solo questa modalita, per cui non vengono utilizzati i vari controlli per lo switch -->								 
438                   				<#-- contenitori vista griglia --> 
439								<div class="search-list-results grid-view"> 
440									<div class="grid-view-container"> 
441										<#-- aggiunta classe m-0 --> 
442										<div class="row row-cols-2 row-cols-sm-2 row-cols-md-2 row-cols-lg-3 list-results m-0"> 
443											 
444											<#-- ciclo sugli elementi restituiti dalla ricerca --> 
445											<#list curEntry.records as record> 
446							                    <#if record.metadata?has_content> 
447							                     
448							                    	<#-- assegno alla variabile il titolo di liferay o di struttura, ripulito dai caratteri accentati, da usare come alt o title --> 
449					                    			<#assign titoloScheda = "" /> 
450													<#if record.title?has_content> 
451						                    			<#assign titoloScheda = htmlUtil.escapeAttribute(record.title) /> 
452					                    			</#if> 
453					                    			<#if record.metadata.destinationDestinationName?has_content && record.metadata.destinationDestinationName.value?has_content> 
454						                    			<#assign titoloScheda = htmlUtil.escapeAttribute(record.metadata.destinationDestinationName.value) /> 
455					                    			</#if> 
456					                    			 
457					                    			<#-- singolo elemento --> 
458													<div class="col position-relative"> 
459														<#-- funzione aggiungi a trip planner: visualizzo il cuore solo se esistono le coordinate --> 
460														<#-- creo variabile di appoggio, poiche devo eventualmente anche eliminare l'angolo bianco della card che sta sotto -->  
461														<#-- al contrario dei template, qui i valori delle coordinate sono numeri e non stringhe --> 
462														<#assign existLatLong = false /> 
463														<#if (record.latitude?has_content && record.latitude != 0) && (record.longitude?has_content && record.longitude != 0)> 
464															<#assign existLatLong = true /> 
465															<span class="fa-regular fa-heart transition" title="${label_aggiungi_lista_viaggio}" data-id="idPoi_${record.entryClassPk}"></span> 
466														</#if> 
467														 
468														<div class="result-container"> 
469															<#-- aggiunta classe m-0 --> 
470							                    			<div class="row d-flex justify-content-center align-items-center position-relative card-container <#if !existLatLong>no-fa-heart</#if> transition m-0"> 
471							                    			 
472								                    			<#-- richiamo l'immagine: fa parte di un fieldset ripetibile, e potrebbe essere una sequenza o una semplice stringa --> 
473								                    			<#-- creo una variabile di appoggio per l'url dell'img da usare nella mappa --> 
474								                    			<#assign mapImageUrlJs = "" /> 
475																<#if record.metadata.destinationImage?has_content && record.metadata.destinationImage.value?has_content> 
476									                    			<#if record.metadata.destinationImage.value?is_sequence> 
477									                    				<#assign numImg = 0 /> 
478									                    				<#list record.metadata.destinationImage.value as curImage> 
479									                    					<#if curImage?? && curImage?has_content> 
480											                    				<#attempt> 
481															                    	<#assign curImageJson = jsonFactoryUtil.createJSONObject(curImage) /> 
482															                    	<#if curImageJson?? && curImageJson?has_content && curImageJson.uuid?? && curImageJson.groupId??> 
483													                    				<#assign numImg = numImg + 1 /> 
484																						<#assign curImageDLFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(curImageJson.uuid,curImageJson.groupId?number) /> 
485																						<#assign curImageUrl = "/documents/"+groupId+"/"+curImageDLFileEntry.getFolderId()+"/"+curImageDLFileEntry.getFileName()+"/"+curImageJson.uuid /> 
486														                    			<#assign mapImageUrlJs = curImageUrl /> 
487																						 
488																						<div class="col-12 p-0 m-0"> 
489																							<div class="position-relative image-container transition"> 
490																								<img src="${curImageUrl}" class="image-preview-object-fit" alt="${titoloScheda}"> 
491																							</div> 
492																						</div> 
493																						 
494														                    		</#if> 
495											                    				<#recover> 
496											                    					<#-- in caso di problemi sull'immagine, non visualizzo nulla --> 
497											                    				</#attempt> 
498																			</#if> 
499																			<#if numImg == 1> 
500																				<#break> 
501																			</#if>	 
502									                    				</#list> 
503									                    			<#else> 
504									                    				<#attempt> 
505													                    	<#assign imageJson = jsonFactoryUtil.createJSONObject(record.metadata.destinationImage.value) /> 
506													                    	<#if imageJson?? && imageJson?has_content && imageJson.uuid?? && imageJson.groupId??> 
507																				<#assign imageDLFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(imageJson.uuid,imageJson.groupId?number) /> 
508																				<#assign imageUrl = "/documents/"+groupId+"/"+imageDLFileEntry.getFolderId()+"/"+imageDLFileEntry.getFileName()+"/"+imageJson.uuid /> 
509												                    			<#assign mapImageUrlJs = imageUrl /> 
510												                    			 
511												                    			<div class="col-12 p-0 m-0"> 
512																					<div class="position-relative image-container transition"> 
513																						<img src="${imageUrl}" class="image-preview-object-fit" alt="${titoloScheda}"> 
514																					</div> 
515																				</div> 
516												                    		</#if> 
517										                    			<#recover> 
518										                    				<#-- in caso di problemi sull'immagine, non visualizzo nulla -->	 
519										                    			</#attempt> 
520									                    			</#if> 
521								                    			</#if> 
522							                    			 
523							                    				<#-- testi --> 
524																<div class="col-md-12 p-3"> 
525							                    					<div class="text-center text-container"> 
526							                    						 
527								                    					<#-- titolo di struttura --> 
528																		<#if record.metadata.destinationDestinationName?has_content && record.metadata.destinationDestinationName.value?has_content> 
529																			<#if record.detailUrl?has_content> 
530																				<a href="${record.detailUrl}" title="${label_vai_dettaglio} ${htmlUtil.escapeAttribute(record.metadata.destinationDestinationName.value)}"> 
531																			<#else> 
532																				<a href="javascript:void(0);" title="${label_vai_dettaglio} ${htmlUtil.escapeAttribute(record.metadata.destinationDestinationName.value)}"> 
533																			</#if> 
534																				<div class="transition tit-link check-highlight"> 
535																					<span class="fa fa-map-marker" aria-hidden="true"></span> ${record.metadata.destinationDestinationName.value?trim} 
536																				</div> 
537																			</a> 
538										                    			</#if> 
539								                    					 
540							                    						<#-- luogo --> 
541							                    						<#assign mapAddressJs = "" /> 
542																		<#if (record.metadata.destinationAddressCity?has_content && record.metadata.destinationAddressCity.value?has_content) || 
543																			(record.metadata.destinationAddressProvince?has_content && record.metadata.destinationAddressProvince.value?has_content)> 
544																			<div class="mb-3 search-extra-field-place"> 
545																				<strong class="text-uppercase">( 
546																					<#if record.metadata.destinationAddressCity?has_content && record.metadata.destinationAddressCity.value?has_content> 
547																						<#assign mapAddressJs = mapAddressJs + record.metadata.destinationAddressCity.value /> 
548																						${record.metadata.destinationAddressCity.value} 
549																					</#if> 
550																					<#if (record.metadata.destinationAddressCity?has_content && record.metadata.destinationAddressCity.value?has_content) && 
551																						(record.metadata.destinationAddressProvince?has_content && record.metadata.destinationAddressProvince.value?has_content)> 
552																						<#assign mapAddressJs = mapAddressJs + " - " /> 
553																						<span> - </span> 
554																					</#if> 
555																					<#if record.metadata.destinationAddressProvince?has_content && record.metadata.destinationAddressProvince.value?has_content> 
556																						<#assign mapAddressJs = mapAddressJs + record.metadata.destinationAddressProvince.value /> 
557																						${record.metadata.destinationAddressProvince.value} 
558																					</#if> 
559																				)</strong> 
560																			</div> 
561																		</#if> 
562																		 
563																		<#-- sito web: campo visibile nella card, mentre gli altri li aggiungo solo nel marker --> 
564							                    						<#assign mapInfoJs = "" /> 
565																		<#if record.metadata.destinationWebsite?has_content && record.metadata.destinationWebsite.value?has_content> 
566																			<#assign mapInfoJs += "<a href='${record.metadata.destinationWebsite.value?ensure_starts_with('[a-zA-Z]+://', 'http://')}' target='_blank' class='link sito d-inline-block mx-1' title='${label_vai_sito_web}: ${record.metadata.destinationWebsite.value}'><span class='fa-solid fa-earth' aria-hidden='true'></span> ${label_sito_web}</a>" /> 
567																			<a href="${record.metadata.destinationWebsite.value?ensure_starts_with('[a-zA-Z]+://', 'http://')}" target="_blank" class="link sito d-inline-block" title="${label_vai_sito_web}: ${record.metadata.destinationWebsite.value}"> 
568																				<span class="fa-solid fa-earth" aria-hidden="true"></span>  
569																				${label_sito_web} 
570																			</a> 
571										                    			</#if> 
572							                    						<#if record.metadata.destinationPhoneNumber?has_content && record.metadata.destinationPhoneNumber.value?has_content && record.metadata.destinationPhoneNumber.value != "0039"> 
573																			<#assign mapInfoJs += "<a href='tel:${record.metadata.destinationPhoneNumber.value}' class='link tel d-inline-block mx-1' title='${label_chiama_telefono}: ${record.metadata.destinationPhoneNumber.value}'><span class='fa-solid fa-phone' aria-hidden='true'></span> ${record.metadata.destinationPhoneNumber.value}</a>" /> 
574																		</#if> 
575							                    						<#if record.metadata.destinationEmail?? && record.metadata.destinationEmail.value?has_content> 
576																			<#assign mapInfoJs += "<a href='mailto:${record.metadata.destinationEmail.value}' class='link sito d-inline-block mx-1' title='${label_invia_email_a}: ${record.metadata.destinationEmail.value}'><span class='fa-solid fa-envelope' aria-hidden='true'></span> ${label_e_mail}</a>" /> 
577								                    					</#if> 
578							                    			 
579							                    						<#-- leggi tutto --> 
580							                    						<#if record.detailUrl?has_content> 
581																			<a href="${record.detailUrl}" title="${label_vai_dettaglio} ${titoloScheda}"> 
582																		<#else> 
583																			<a href="javascript:void(0);" title="${label_vai_dettaglio} ${titoloScheda}"> 
584																		</#if> 
585																			<div class="sub-link"> 
586																				${label_leggi_tutto} <span class="fa fa-angle-right transition" aria-hidden="true"></span> 
587																			</div> 
588																		</a> 
589																		 
590																		<#-- ******************************* CATEGORIE - COMMENTATO ******************************* --> 
591																		<#-- QUESTO CODICE È COMMENTATO, POICHÈ LE CATEGORIE NN SONO PREVISTE NEI MOCKUP, MA POTREBBE ESSERE SEMPRE UTILE --> 
592																		 
593																		<#-- metodo tramite record (ricerca) --> 
594									                    				<#-- recupero l'elenco delle categorie dall'oggetto record anzichè passando dall'articolo --> 
595									                    				<#-- 
596									                    				<#if record.categories?? && (record.categories?size > 0)> 
597									                    					<#list record.categories as key, value> 
598																				<#if (key?? && key != 0) && (value?? && value != "")> 
599																					<div class="chip chip-simple chip-outline-secondary chip-no-link"> 
600																						<span class="chip-label">${value}</span> 
601																					</div> 
602																				</#if> 
603																			</#list> 
604									                    				</#if> 
605									                    				--> 
606									                    				 
607									                    				<#-- categorie: metodo tramite api --> 
608									                    				<#-- 
609																		<#assign categorie = []> 
610																		<#assign categorie = getListCategoryByArticlePrimKey(record.entryClassPk) /> 
611																		<#if categorie?? && (categorie?size > 0)>	 
612																			<#list categorie as cur_cat> 
613																				<#if validator.isNotNull(cur_cat) && cur_cat != ""> 
614																					<div class="chip chip-simple chip-outline-secondary chip-no-link"> 
615																						<span class="chip-label">${cur_cat.getTitle(locale)}</span> 
616																					</div> 
617																				</#if> 
618																			</#list> 
619																		</#if> 
620									                    				--> 
621																		<#-- ******************************* CATEGORIE - COMMENTATO ******************************* --> 
622							                    			 
623							                    					</div> 
624							                    				</div> 
625							                    				<#-- fine testi --> 
626							                    			 
627							                    			</div> 
628							                    		</div> 
629							                    	</div> 
630							                    	<#-- fine singolo elemento --> 
631							                    	 
632								                    <#-- valorizzo il marker sulla mappa, se esiste latitudine e longitudine --> 
633					                    			<#if (record.latitude?has_content && record.latitude != 0) && (record.longitude?has_content && record.longitude != 0)> 
634						               					<script> 
635								      						var marker = L.marker(L.latLng([${record.latitude},${record.longitude}])); 
636								      						 
637								      						var infoBox = ""; 
638								      						// apertura contenitore infobox e card 
639								      						infoBox += "<div class='info-box'><div class='card bg-white m-0 border-0 shadow-none'>"; 
640								      						// immagine 
641								      						<#if mapImageUrlJs?? && mapImageUrlJs != ""> 
642								      							infoBox += "<div class='card-img-wrapper'><img src='${mapImageUrlJs}' class='card-img-top' alt='${titoloScheda}'></div>"; 
643								      						</#if> 
644								      						// inizio body 
645								      						infoBox += "<div class='card-body p-2'>" 
646								      						//titolo 
647								      						infoBox += "<h2 class='card-title mb-2'><a href='${record.detailUrl}' title='${label_vai_dettaglio} ${titoloScheda}'>${titoloScheda}</a></h2>" 
648								      						// indirizzo 
649															<#if mapAddressJs?? && mapAddressJs != ""> 
650						               							infoBox += "<p class='mt-0 mb-2'><span class='fa fa-map-marker mr-1'></span><strong>${mapAddressJs}</strong></p>" 
651						               						</#if> 
652						               						// info	 
653															<#if mapInfoJs?? && mapInfoJs != ""> 
654						               							infoBox += "<p class='mt-0 mb-2'>${mapInfoJs}</p>" 
655						               						</#if>	 
656						               						// fine body	 
657						               						infoBox += "</div>" 
658						               						// fine contenitore infobox e card 
659						               						infoBox += "</div></div>" 
660						                 						 
661						               						var popup = marker.bindPopup(infoBox); 
662						               						TglSearchMap.addMarker(marker); 
663						               					</script> 
664						           					</#if> 
665							                    	 
666							                    </#if> 
667											</#list> 
668											<#-- fine ciclo --> 
669											 
670										</div> 
671									</div>							 
672								</div> 
673								<#-- FINE GRIGLIA --> 
674							</#if> 
675							<#-- fine curEntry --> 
676							 
677							<#-- paginazione mediante taglib--> 
678		                    <#-- aggiunta classe m-0 --> 
679		                    <div class="row mb-0"> 
680		                    	<div class="col-12 text-center"> 
681						            <@ricerca_components["ricerca-pagination"] 
682						                currentPage=curEntry.paging.page?number 
683						                totalPages=curEntry.paging.totalPagesCount?number 
684						                paginationUrl="${portletURL}"></@> 
685		                    	</div> 
686					        </div> 
687							 
688						</div>	 
689					</div>	 
690				</div> 
691		 
692			</#list> 
693		</#if> 
694		 
695	</div> 
696</div> 
697 
698<script> 
699	$(document).ready(function(){ 
700		// carico la mappa 
701		TglSearchMap.loadMap(true); 
702		 
703		// scroll fino a ricerca 
704		$('html, body').animate({ 
705             scrollTop: $(".search-template-localita").offset().top 
706		}, 500); 
707		 
708		// quando il container collapsed viene visualizzato, ricostruisco la mappa e applico il fitbounds, oltre che a visualizzare il popover, se non ancora visualizzato 
709		$('#map-container-desktop').on('shown.bs.collapse', function () { 
710			TglSearchMap.getMap().invalidateSize(); 
711			TglSearchMap.fitBounds(); 
712			 
713			// popover on draw circle function 
714			if( $('.leaflet-draw-draw-circle').length === 1){ 
715				if (sessionStorage.getItem('showedPopoverMap') == undefined) { 
716					showTooltipOnMap('.search-template-localita .leaflet-draw-draw-circle'); 
717
718				if(isShowedPopover){ 
719					hideTooltipOnMap('.search-template-localita .leaflet-draw-draw-circle','body'); 
720
721
722		}); 
723		 
724		// leggo i parametri dall'url: se esiste showMap ed è uguale a true, apro il collapse che contiene la mappa 
725		// succede se arrivo dal template form_ricerca (form fittizia) 
726		let searchParams = new URLSearchParams(window.location.search) 
727		if (searchParams.has('showMap')){ 
728			let searchParamShowMap = searchParams.get('showMap'); 
729			if (searchParamShowMap == 'true'){ 
730				$('#map-container-desktop').collapse('show'); 
731
732
733		 
734		<#-- js per filtri categorie --> 
735		<#if (ricercaPortletConfig.configSearchByCategories == true) && (categoriesAsKeyValue?size > 0)> 
736			<#-- filtri categorie multiple --> 
737			<#if ricercaPortletConfig.configSelectMultipleCategories == true> 
738				/*bind checkbox category_*/ 
739				$('.search-template-localita input[id^="category_"]').click(function(){ 
740				    var $currentElem = $( this ); 
741					if(!$currentElem.prop('checked')){ 
742				        $(".search-template-localita #search-localita-form-desktop #form_"+$currentElem.attr('id')).remove(); 
743				    } 
744				    else{ 
745				       $(".search-template-localita #search-localita-form-desktop #form_"+$currentElem.attr('id')).remove(); 
746						var input = '<input class="mr-2 hide" style="display:none" type="checkbox" name="'+$currentElem.attr('name')+'" id="form_'+$currentElem.attr('id')+'" value="'+$currentElem.val()+'" checked="">'; 
747						$('.search-template-localita #search-localita-form-desktop .search-form').append(input); 
748				    } 
749				    $('.search-template-localita #search-localita-form-desktop').submit(); 
750				});  
751				/*initialize checkbox category_*/ 
752				$('.search-template-localita input[id^="category_"]').each(function(){ 
753				    var $currentElem = $( this ); 
754					if($currentElem.prop('checked')){ 
755				        $(".search-template-localita #search-localita-form-desktop #form_"+$currentElem.attr('id')).remove(); 
756				        var input = '<input class="mr-2 hide" style="display:none" type="checkbox" name="'+$currentElem.attr('name')+'" id="form_'+$currentElem.attr('id')+'" value="'+$currentElem.val()+'" checked="">'; 
757				        $('.search-template-localita #search-localita-form-desktop .search-form').append(input); 
758				    } 
759				}); 
760 
761			<#else> 
762			 
763				<#-- filtri categorie singola --> 
764				/*bind checkbox category_*/ 
765				$('.search-template-localita #select-ricerca-categorie').on('change', function() { 
766					var $currentElem = $(this); 
767					var optionVal = $currentElem.val(); 
768					 
769					if(optionVal===undefined || optionVal==null || optionVal==''){ 
770						$(".search-template-localita #search-localita-form-desktop input[id^='form_']").remove(); 
771
772					else{ 
773						if ($('.search-template-localita #select-ricerca-categorie option[value=optionVal]').is(':selected')){ 
774							$(".search-template-localita #search-localita-form-desktop input[id^='form_']").remove(); 
775						}else{ 
776							$(".search-template-localita #search-localita-form-desktop input[id^='form_']").remove(); 
777							var input = '<input class="mr-2 hide" style="display:none;" type="checkbox" name="'+$currentElem.attr('name')+'" id="form_'+$currentElem.attr('id')+'" value="'+optionVal+'" checked="">'; 
778							$('.search-template-localita #search-localita-form-desktop .search-form').append(input); 
779
780
781				    $('.search-template-localita #search-localita-form-desktop').submit(); 
782				}); 
783				/*initialize checkbox category_*/ 
784				$('.search-template-localita #select-ricerca-categorie option').each(function(){ 
785					var $currentElem = $( this ); 
786					var optionVal = $currentElem.val(); 
787					if(optionVal!==undefined && optionVal!=null && optionVal!=''){ 
788						if($currentElem.is(':selected')){ 
789							$(".search-template-localita #search-localita-form-desktop input[id^='form_']").remove(); 
790							var input = '<input class="mr-2 hide" style="display:none;" type="checkbox" name="'+$currentElem.attr('name')+'" id="form_'+$currentElem.attr('id')+'" value="'+$currentElem.val()+'" checked="">'; 
791							$('.search-template-localita #search-localita-form-desktop .search-form').append(input); 
792		    			} 
793
794				}); 
795			</#if> 
796		</#if> 
797		 
798	}); 
799</script>