Agenda de eventos

Se ha producido un error al procesar la plantilla.
Can't convert this string to number: ""
The blamed expression:
==> calendarData.getLatitude()?number  [in template "38913#38948#19259365" at line 119, column 62]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #if calendarData.getLatitude()?number...  [in template "38913#38948#19259365" at line 119, column 57]
----
1<#assign urlDecoderTool = utilLocator.findUtil('lportal-ce-hook', 'as.asac.template.tools.URLDecoder')/> 
2<#assign httpTool = utilLocator.findUtil('lportal-ce-hook', 'as.asac.template.tools.HttpTool') /> 
3 
4<#assign googleMapsKey = prefsPropsUtil.getString(companyId, "googleMapsAPIKey")> 
5 
6<#if entries?has_content> 
7    <div class="events-detail row-fluid template"> 
8        <#list entries as calendarBooking> 
9            <#assign calendarData = ADTUtil.getCalendarData(calendarBooking) /> 
10            <div class="view-detail template-calevent-detail"> 
11                <div id="event${calendarBooking.getCalendarBookingId()}" class="detail calevent event box "> 
12                    <div class="title-wrapper"> 
13                        <div class="title h3">${calendarBooking.getTitle(locale)}</div> 
14                    </div> 
15                    <div class="row mt-4"> 
16                        <div class="col-lg-8"> 
17							<span id="share-${calendarBooking.getCalendarBookingId()}" class="need-share-button-default need-share-button"  
18								data-share-icon-style="box"  
19								data-share-networks="Mailto,Twitter,Whatsapp,Telegram,Facebook" 
20								data-share-url="${urlDecoderTool.decodeURL(htmlUtil.escape(httpTool.toUnicode(themeDisplay.getPortalURL())))}${urlDecoderTool.decodeURL(htmlUtil.escape(httpTool.toUnicode(themeDisplay.getURLCurrent())))}" 
21								data-share-title="${htmlUtil.escape(calendarBooking.getTitle(locale))}"><!--share--></span> 
22								<span><a href="https://api.whatsapp.com/send?text=${calendarBooking.getTitle(locale)}-${urlDecoderTool.decodeURL(htmlUtil.escape(httpTool.toUnicode(themeDisplay.getPortalURL())))}${urlDecoderTool.decodeURL(htmlUtil.escape(httpTool.toUnicode(themeDisplay.getURLCurrent())))}" target="_blank"><i class="fab fa-whatsapp"></i><span class="hide-accessible">Whatsapp: ${calendarBooking.getTitle(locale)} </span></a></span> 
23 
24 
25							<script src="${themeDisplay.getPathThemeRoot()}/js/needsharebutton/needsharebutton.min.js"></script> 
26							<script src="${themeDisplay.getPathThemeRoot()}/js/needsharebutton/needsharebutton.js"></script> 
27							<script type="text/javascript"> 
28								new needShareDropdown(document.getElementById('share-${calendarBooking.getCalendarBookingId()}')); 
29							</script> 
30				 
31							<#if validator.isNotNull(calendarBooking.getDescription(locale))> 
32								<div class="text"> 
33									${calendarBooking.getDescription(locale)} 
34								</div> 
35								 
36								<#assign gallery = ADTUtil.getGalleryTool(calendarData, themeDisplay)/> 
37								<#assign documents = ADTUtil.getDocumentsTool(calendarData, themeDisplay)/> 
38								 
39								 <#if validator.isNotNull(gallery)> 
40									<div class="image-gallery">  
41										<div class="h4">Galería imágenes</div>  
42										${gallery} 
43									</div> 
44								</#if> 
45 
46								<#if validator.isNotNull(documents)> 
47									<div class="documents">  
48										<div class="h4">Documentos</div>  
49										${documents} 
50									</div> 
51								</#if> 
52							</#if> 
53                        </div> 
54                        <div class="col-lg-4"> 
55							<#assign imagePath = ADTUtil.getImagePath(calendarData.getImageUuid(), 3, calendarBooking.getGroupId(), themeDisplay) /> 
56                            <#if validator.isNotNull(calendarData) && validator.isNotNull(imagePath)> 
57                                <div class="d-block image-wrapper mb-2 aspect-ratio-bg-cover lightbox" style="background-image: url(${imagePath}); background-size: cover;"> 
58                                    <img class='image' src="${imagePath}" alt="Imagen ${calendarBooking.getTitle(locale)}" /> 
59                                </div> 
60                            </#if> 
61							 
62                            <#assign inicio = ADTUtil.formatDate(calendarBooking.getStartTime(), "EEEE, dd MMMM YYYY", themeDisplay) /> 
63							<#assign fin = ADTUtil.formatDate(calendarBooking.getEndTime(), "EEEE, dd MMMM YYYY", themeDisplay) /> 
64 
65                            <div class="card"> 
66                                <div class="card-header"> 
67									Fecha 
68                                </div> 
69																 
70								<div class="card-body">  
71									<div class="start">  
72										<span class="start-date d-block">  
73											<span class="icon-calendar"> 
74												<span class="hide-accessible">Calendario</span> 
75											</span>  
76											${inicio}  
77										</span>  
78										 
79										<span class="start-time">  
80											<span class="icon-time"> 
81												<span class="hide-accessible">Tiempo</span> 
82											</span>  
83											<#if calendarBooking.getAllDay()> 
84												${languageUtil.format(locale, 'all-day', calendarBooking.getAllDay())} 
85											<#else> 
86												Inicio: ${ADTUtil.formatDate(calendarBooking.getStartTime(), "HH:mm", themeDisplay)} 
87											</#if> 
88										</span>  
89									</div>  
90									 
91									<div class="end">  
92										<span class="end-date d-block">  
93											<span class="fas fa-calendar-alt"> 
94												<span class="hide-accessible">Calendario</span> 
95											</span>  
96											${fin} 
97										</span> 
98										 
99										<span class="end-time">  
100											<span class="icon-time"> 
101												<span class="hide-accessible">Tiempo</span> 
102											</span>  
103											 
104											<#if calendarBooking.getAllDay()> 
105												${languageUtil.format(locale, 'all-day', calendarBooking.getAllDay())} 
106											<#else> 
107												Fin: ${ADTUtil.formatDate(calendarBooking.getEndTime(), "HH:mm", themeDisplay)} 
108											</#if> 
109										</span>  
110									</div>  
111								</div> 
112                            </div> 
113							 
114							 
115 
116 
117 
118 
119							<#if calendarData.getLatitude()?number != 0 && calendarData.getLongitude()?number != 0> 
120                                <#assign latitude = calendarData.getLatitude() /> 
121                                <#assign longitude = calendarData.getLongitude() /> 
122                                <div class="card"> 
123									<div class="card-header"> 
124										<span class="icon-map-marker"><!--icon --></span> 
125										<span>Localización</span> 
126									</div> 
127									 
128									<div class="map-wrapper-warning" style="position: relative;"> 
129										<div id="map-consent-overlay" class="map-overlay"> 
130											<div class="map-overlay-content"> 
131												<p>Para visualizar este mapa, es necesario aceptar las cookies de terceros de Google Maps. Google utiliza estas cookies para recopilar información sobre el uso del mapa, recordar tus preferencias y personalizar tu experiencia de navegación.</p> 
132												<button onclick="acceptMap()">Aceptar y ver mapa</button> 
133											</div> 
134										</div> 
135										<div id="map-canvas" class="" style="height: 300px; position: relative; overflow: hidden;"><!-- map-canvas --></div> 
136									</div> 
137									 
138									<div class="card-body">									 
139										<#if validator.isNotNull(calendarData.getAddress()) || validator.isNotNull(calendarData.getAddressDescription())> 
140											<#if validator.isNotNull(calendarData.getAddress())> 
141												<p class="card-subtitle">${calendarData.getAddress()}</p> 
142											</#if> 
143											<#if validator.isNotNull(calendarData.getAddressDescription())> 
144												<p class="card-subtitle">${calendarData.getAddressDescription()}</p> 
145											</#if> 
146										</#if> 
147									</div> 
148                                    <script type="text/javascript"> 
149                                        function initMap(){ 
150                                            var latitude = '${latitude}'; 
151                                            var longitude = '${longitude}'; 
152 
153                                            if(latitude || longitude){ 
154                                                var latitude = parseFloat(latitude); 
155                                                var longitude = parseFloat(longitude); 
156 
157                                                if(isNaN(latitude) || isNaN(longitude)){ 
158                                                    var latitude = parseFloat(40.421598993024574); 
159                                                    var longitude = parseFloat(-3.7029075622558594); 
160
161
162 
163                                            var mapDiv = document.getElementById('map-canvas'); 
164                                            var map = new google.maps.Map(mapDiv, { 
165                                                center: new google.maps.LatLng(latitude, longitude), 
166                                                zoom: 13, 
167                                                mapTypeId: google.maps.MapTypeId.ROADMAP 
168                                            }); 
169 
170                                            var latLng = new google.maps.LatLng(latitude, longitude); 
171                                            var marker = new google.maps.Marker({ 
172                                                position: latLng, 
173                                                map: map, 
174                                                draggable: false 
175                                            }); 
176
177										 
178										function acceptMap() { 
179											var overlay = document.getElementById('map-consent-overlay'); 
180											if (overlay) { 
181												// Ocultamos la capa 
182												overlay.style.display = 'none'; 
183												 
184												//Almacenamos cookie 
185												localStorage.setItem('map-consent', 'true'); 
186												 
187												//Inicializamos el mapa sólo cuando lo acepta 
188												initMap();  
189
190
191										 
192										 
193										//Al cargar la página comprueba si ya aceptó las condiciones 
194										window.onload = function() { 
195											if (localStorage.getItem('map-consent') === 'true') { 
196												document.getElementById('map-consent-overlay').style.display = 'none'; 
197
198										}; 
199                                    </script> 
200                                    <script async="async" type="text/javascript" src="//maps.google.com/maps/api/js?key=${googleMapsKey}&language=${themeDisplay.getLocale().getLanguage()}&region=${themeDisplay.getLocale().getCountry()}&callback=initMap"></script> 
201                                </div> 
202                            </#if> 
203                        </div> 
204                    </div> 
205                </div> 
206            </div> 
207        </#list> 
208    </div> 
209</#if>