An error occurred while processing the template.
Java method "as.asac.template.tools.DLToolImpl.getPathByJSON(String, long)" threw an exception when invoked on as.asac.template.tools.DLToolImpl object "as.asac.template.tools.DLToolImpl@74cfa682"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign gpxPOIRutaPath = dlTool.getPa...  [in template "37703#37743#8258493" at line 95, column 1]
----
1<#-- Services --> 
2<#assign assetEntryLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")/> 
3<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetLinkLocalService")/> 
4<#assign journalArticleResourceServiceUtil = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")/> 
5<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
6<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
7<#assign ddmStructureLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStructureLocalService")/> 
8 
9<#-- Reserved vbles --> 
10<#assign title = .vars['reserved-article-title'].data> 
11<#assign articleId=.vars["reserved-article-id"].data /> 
12<#assign description=.vars["reserved-article-description"].data /> 
13<#assign smallImageUrl=.vars["reserved-article-small-image-url"].data /> 
14<#assign date=.vars["reserved-article-display-date"].data /> 
15<#assign request = .vars['request']> 
16 
17<#-- Init --> 
18<#assign assetEntry = journalTool.getAssetEntryByArticleId(groupId, articleId)> 
19<#assign journalArticle = journalTool.getJournalArticleByAssetEntry(assetEntry)> 
20<#assign resourcePrimKey = journalArticle.getResourcePrimKey()> 
21<#assign articleURL = themeDisplay.getURLPortal()+themeDisplay.getURLCurrent()> 
22<#assign articleSocialBookmarks = themeDisplay.getThemeSetting("article-social-bookmarks")!> 
23<#assign layoutSetBannerPath = layoutTool.getLayoutSetBannerPath(groupId, themeDisplay.getLayout().isPrivateLayout())!> 
24<#assign articleMainImageThumbnail1 = dlTool.getThumbnail(smallImageUrl, "1", layoutSetBannerPath)! /> 
25<#assign articleMainImageThumbnail3 = dlTool.getThumbnail(smallImageUrl, "3", layoutSetBannerPath)! /> 
26<#assign articleMainImageThumbnail1 = dlTool.getThumbnail(smallImageUrl, "1")! /> 
27<#assign ddmStructureNameNormalize = "template-${friendlyURLNormalizerTool.normalize(journalArticle.getDDMStructure().getName(localeUtil.getDefault()))}" /> 
28<#assign group = themeDisplay.getScopeGroup()/> 
29 
30<#-- Settings --> 
31<#assign schema = "http://schema.org/Article"/> 
32<#assign ddmStructure = journalArticle.getDDMStructure() /> 
33<#assign structureId = "" /> 
34<#assign structureKey = "" /> 
35<#assign filterStructuresIds = ""/> 
36<#assign filterStructuresKeys = []> 
37<#assign filterStructures = []> 
38<#assign filterDDMStructures = []> 
39<#if validator.isNotNull(ddmStructure)> 
40	<#assign structureId = ddmStructure.getStructureId() /> 
41	<#assign structureKey = ddmStructure.getStructureKey()/> 
42	<#assign filterStructuresIdsKey = "${structureId}[filterStructuresIds]"/> 
43	<#assign filterStructuresIdsValue = group.getTypeSettingsProperty(filterStructuresIdsKey)!/> 
44	<#if validator.isNotNull(filterStructuresIdsValue)> 
45		<#assign filterStructuresIds = getterUtil.getLongValues(stringUtil.split(filterStructuresIdsValue))/> 
46		<#list filterStructuresIds as filterStructuresId> 
47			<#assign filterStructure = ddmStructureLocalService.fetchDDMStructure(filterStructuresId)/> 
48			<#if validator.isNotNull(filterStructure)> 
49				<#assign filterStructureKey = filterStructure.getStructureKey()/> 
50				<#assign filterStructuresKeys = filterStructuresKeys + [filterStructureKey] > 
51				<#assign filterDDMStructures = filterDDMStructures + [filterStructure] > 
52			</#if> 
53		</#list> 
54	</#if> 
55	<#assign schemaKey = "${ddmStructure.getStructureKey()}[schema]"/> 
56	<#assign schemaValue = group.getTypeSettingsProperty(schemaKey)!/> 
57	<#if validator.isNotNull(schemaValue)> 
58		<#assign schema = "${schemaValue}"/> 
59	</#if> 
60</#if> 
61 
62<#-- Vocabularies --> 
63<#assign concejosVocabulary = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Concejos")! /> 
64<#assign modeVocabulary = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cicloturismo :: Temática/Modalidad")! /> 
65<#assign routeTypeVocabulary = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cicloturismo :: Tipo de Ruta")! /> 
66<#assign trackVocabulary = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cicloturismo :: Recorrido")! /> 
67<#assign tracksVocabulary = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cicloturismo :: Recorridos")! /> 
68<#assign routeVocabularyIds = [modeVocabulary.getVocabularyId(), routeTypeVocabulary.getVocabularyId() , trackVocabulary.getVocabularyId(), tracksVocabulary.getVocabularyId()] /> 
69 
70<#-- Categories --> 
71<#assign concejos = journalTool.getCategories(groupId, articleId, ["Concejos"])/> 
72<#assign comarcas = journalTool.getCategoriesNames(groupId, articleId, locale, ["Comarcas"])/> 
73<#assign tipoRuta = journalTool.getCategoriesNames(groupId, articleId, locale, ["Cicloturismo :: Tipo de Ruta"])/> 
74<#assign modalidad = journalTool.getCategoriesNames(groupId, articleId, locale, ["Cicloturismo :: Temática/Modalidad"])/> 
75<#assign tipoRecorrido = journalTool.getCategoriesNames(groupId, articleId, locale, ["Cicloturismo :: Recorrido"])/> 
76<#assign dificultad = journalTool.getCategories(groupId, articleId, ["Cicloturismo :: Dificultad"])/> 
77<#assign duracion = journalTool.getCategoriesNames(groupId, articleId, locale, ["Cicloturismo :: Duración"])/> 
78<#assign routeTypesCategories = assetCategoryTool.getAssetCategoriesByVocabularyName(tracksVocabulary)! /> 
79 
80<#-- Build --> 
81<#assign numero = Numero.data> 
82<#assign routeTag = "rutacicloturismo${numero}"> 
83 
84<#assign portletId = portletTool.getPortletId(request)!/> 
85<#assign namespace = "_"+portletId+"_" /> 
86<#if Denominacion.data?has_content> 
87	<#assign title = Denominacion.data> 
88</#if> 
89<#assign markersServicesDDMStructureKeys = [] /> 
90 
91<#-- GPX --> 
92<#assign gpxRutaJSONStr = Documentos.GPXRuta.data! /> 
93<#assign gpxPOIRutaJSONStr = Documentos.GPXPOIRuta.data! /> 
94<#assign gpxRutaPath = dlTool.getPathByJSON(gpxRutaJSONStr, themeDisplay.getScopeGroupId())!/> 
95<#assign gpxPOIRutaPath = dlTool.getPathByJSON(gpxPOIRutaJSONStr, themeDisplay.getScopeGroupId())!/> 
96<#assign gpxRutaJSONObject = jsonFactoryUtil.createJSONObject(Documentos.GPXRuta.data)! /> 
97<#assign gpxRoute = gpxTool.parser(gpxRutaJSONObject.getLong("classPK"), "Parser", themeDisplay)! /> 
98<#assign gpxPOIRutaJSONObject = jsonFactoryUtil.createJSONObject(Documentos.GPXPOIRuta.data)! /> 
99<#assign gpxPOIRoute = gpxTool.parser(gpxPOIRutaJSONObject.getLong("classPK"), "Parser", themeDisplay)! /> 
100 
101<#-- Near routes --> 
102<#assign gpxRoutes = [] /> 
103<#assign classTypeIds = [structureId]/> 
104<#assign routesNearJournalArticles = assetNearTool.getNearJournalArticles(themeDisplay.getScopeGroupId(), assetEntry.getEntryId(), 50.0, classTypeIds, 5, true, [])! /> 
105<#list routesNearJournalArticles as routeNearJournalArticle> 
106 
107	<#assign routeNearJournalArticleArticleId = routeNearJournalArticle.getArticleId()! > 
108	<#assign routeNearJournalArticleResourcePrimKey = routeNearJournalArticle.getResourcePrimKey()! > 
109	<#assign routeNearJournalArticleJSONObject = journalTool.contentXMLtoJSONObject(routeNearJournalArticle.getContentByLocale(locale), locale)/> 
110	<#assign routeNearJournalArticleEntryTitle = htmlUtil.escape(routeNearJournalArticle.getTitle(locale)) /> 
111	<#assign routeNearJournalArticleViewURL = journalTool.getDisplayPage(routeNearJournalArticle, themeDisplay, true) /> 
112	<#assign routeNearJournalArticleThumbnailPath = routeNearJournalArticle.getSmallImageURL()! /> 
113	<#assign routeNearJournalArticleThumbnail = dlTool.getThumbnail(routeNearJournalArticleThumbnailPath, "2", layoutSetBannerPath)! /> 
114 
115	<#-- Categories --> 
116	<#assign rutaCercanaTipoRuta = "" /> 
117	<#assign rutaCercanaModalidad = "" /> 
118	<#assign rutaCercanaTipoRecorrido = "" /> 
119	<#assign rutaCercanaTipoRecorridos = "" /> 
120	<#assign rutaCercanaColor = "000" /> 
121	<#assign journalArticleCategories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", routeNearJournalArticleResourcePrimKey) /> 
122	<#list journalArticleCategories as journalArticleCategory> 
123 
124		<#assign vocabularyId = journalArticleCategory.getVocabularyId() /> 
125		<#assign level = 1 /> 
126		<#if validator.isNotNull(journalArticleCategory.getAncestors())> 
127			<#assign level = journalArticleCategory.getAncestors()?size + 1 /> 
128		</#if> 
129 
130		<#if vocabularyId == routeTypeVocabulary.getVocabularyId()> 
131			<#assign rutaCercanaTipoRuta = journalArticleCategory.getTitle(locale) /> 
132		</#if> 
133 
134		<#if vocabularyId == modeVocabulary.getVocabularyId()> 
135			<#assign rutaCercanaModalidad = journalArticleCategory.getTitle(locale) /> 
136		</#if> 
137 
138		<#if vocabularyId == trackVocabulary.getVocabularyId()> 
139			<#assign rutaCercanaTipoRecorrido = journalArticleCategory.getTitle(locale) /> 
140		</#if> 
141 
142		<#if vocabularyId == tracksVocabulary.getVocabularyId()> 
143			<#if level == 1> 
144				<#assign type = assetCategoryTool.getCategoryProperty(journalArticleCategory.getCategoryId(), "type") /> 
145				<#if type != "links"> 
146					<#assign rutaCercanaColor = assetCategoryTool.getCategoryProperty(journalArticleCategory.getCategoryId(), "color") /> 
147					<#assign rutaCercanaTipoRecorridos = journalArticleCategory.getTitle(locale) /> 
148				</#if> 
149			</#if> 
150		</#if> 
151		 
152	</#list> 
153	 
154	<#assign rutaCercanaIbp = routeNearJournalArticleJSONObject.getString("IBP")! /> 
155	<#assign rutaCercanaDistancia = routeNearJournalArticleJSONObject.getString("Distancia")! /> 
156	<#assign rutaCercanaInicio = routeNearJournalArticleJSONObject.getString("Inicio")! /> 
157	<#assign rutaCercanaFinalizacion = routeNearJournalArticleJSONObject.getString("Finalizacion")! /> 
158	<#assign rutaCercanaGpxRuta = routeNearJournalArticleJSONObject.getJSONObject("Documentos").getString("GPXRuta")! /> 
159	<#assign rutaCercanaGpxPOIRuta = routeNearJournalArticleJSONObject.getJSONObject("Documentos").getString("GPXPOIRuta")! /> 
160	<#assign rutaCercanaKmlRuta = routeNearJournalArticleJSONObject.getJSONObject("Documentos").getString("KMLRuta")! /> 
161	<#assign rutaCercanaDenominacion = routeNearJournalArticleJSONObject.getString("Denominacion")! /> 
162	<#if validator.isNotNull(rutaCercanaDenominacion)> 
163		<#assign routeNearJournalArticleEntryTitle = rutaCercanaDenominacion !/> 
164	</#if> 
165	 
166	<#assign rutaCercanaInicioFinalizacion = rutaCercanaInicio! /> 
167	<#if validator.isNotNull(rutaCercanaFinalizacion)> 
168		<#assign rutaCercanaInicioFinalizacion = rutaCercanaInicio + " - " + rutaCercanaFinalizacion !/> 
169	</#if> 
170	 
171	<#if validator.isNotNull(rutaCercanaGpxRuta)> 
172		<#assign gpxRutaJSONObject = jsonFactoryUtil.createJSONObject(rutaCercanaGpxRuta)! /> 
173		<#assign jsonGPX = gpxTool.parser(gpxRutaJSONObject.getLong("classPK"), "Parser", themeDisplay)! /> 
174			 
175		<#assign jsonGPX = jsonGPX.put("articleId", routeNearJournalArticleArticleId)! /> 
176		<#assign jsonGPX = jsonGPX.put("color", rutaCercanaColor)! /> 
177		<#assign jsonGPX = jsonGPX.put("url", routeNearJournalArticleViewURL)! /> 
178		<#assign jsonGPX = jsonGPX.put("title", routeNearJournalArticleEntryTitle)! /> 
179		<#assign jsonGPX = jsonGPX.put("image", routeNearJournalArticleThumbnail)! /> 
180		<#assign jsonGPX = jsonGPX.put("startEnd", rutaCercanaInicioFinalizacion)! /> 
181		<#assign jsonGPX = jsonGPX.put("routeTypes", rutaCercanaTipoRecorridos)! /> 
182		<#assign jsonGPX = jsonGPX.put("ibp", rutaCercanaIbp)! /> 
183		<#assign jsonGPX = jsonGPX.put("mode", rutaCercanaModalidad)! /> 
184		<#assign jsonGPX = jsonGPX.put("distance", rutaCercanaDistancia)! /> 
185		 
186		<#assign gpxRoutes = gpxRoutes + [jsonGPX] /> 
187	</#if> 
188	 
189</#list> 
190 
191<#-- ALT destacada --> 
192<#assign altImgDestacada = title /> 
193<#if AltImagenDestacada ??> 
194	<#if validator.isNotNull(AltImagenDestacada.getData())> 
195		<#assign altImgDestacada = AltImagenDestacada.getData() /> 
196	</#if> 
197</#if> 
198 
199<article class="template template-cicloturismo template-layout-map template-route template-${ddmStructureNameNormalize} position-relative" role="article" itemscope itemtype="http://schema.org/TravelAction"> 
200 
201	<div class="container"> 
202	<div class="row no-gutters"> 
203		<div class="col-md-5 col-12 col-sidebar"> 
204		 
205		<h2 class="article-title" itemprop="name">${title}</h2> 
206 
207		<div id="article-display-container" class="hide"> 
208			<button id="close-article-display" type="button" class="btn btn-light"> 
209				<span class="fas fa-times"><span class="hide-accessible">${languageUtil.get(locale, "close")}</span></span> 
210			</button> 
211			<div id="article-display"></div> 
212		</div> 
213 
214		<div id="search-container"> 
215 
216			<#if validator.isNotNull(description)> 
217				<div class="article-description" itemprop="description"> 
218					${htmlUtil.extractText(description)} 
219				</div> 
220			</#if> 
221		 
222			<#assign slideImagesCount = 0 /> 
223			<#assign slideImagesSize = Visualizador.Imagen.getSiblings()?size /> 
224			<#if  Visualizador.Imagen.getSiblings()?has_content || validator.isNotNull(smallImageUrl)> 
225				<div id="article-carousel" class="carousel slide carousel-fade carousel-article" data-ride="carousel" data-interval="5000"> 
226					<span aria-hidden="true" class="loading-animation loading-bg"></span> 
227					<div class="carousel-inner"> 
228						<#if validator.isNotNull(smallImageUrl)> 
229							<div class="carousel-item active aspect-ratio-bg-cover" style="background-image: url(${articleMainImageThumbnail3});"> 
230								<img class="hide" src="${articleMainImageThumbnail1}" alt="${altImgDestacada}" title="${altImgDestacada}"/> 
231							</div> 
232							<#assign slideImagesCount = slideImagesCount + 1 /> 
233						</#if> 
234						<#list 0..2 as item> 
235							<#if item < Visualizador.Imagen.getSiblings()?size > 
236								<#assign Slide = Visualizador.Imagen.getSiblings()[item]!/> 
237								<#if Slide?? && validator.isNotNull(Slide) && Slide.data?? && validator.isNotNull(Slide.data)> 
238 
239									<#assign slideThumbnail1 = dlTool.getThumbnailByJSON(Slide.data, "1")! /> 
240									<#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! /> 
241									<#assign slideTitle = "${languageUtil.get(request, 'image')} ${title}" /> 
242									<#assign slideAlt = slideTitle /> 
243									<#if Slide.TituloImagen?? && Slide.TituloImagen.data?has_content> 
244										<#assign slideTitle = Slide.TituloImagen.data />   
245										<#assign slideAlt = slideTitle /> 
246									</#if> 
247									<#if Slide.AltImagen?? && validator.isNotNull(Slide.AltImagen.getData())> 
248										<#assign slideAlt = Slide.AltImagen.getData() /> 
249									</#if> 
250								<#else> 
251									<#continue> 
252								</#if> 
253								<div class="carousel-item aspect-ratio-bg-cover" style="background-image: url(${slideThumbnail3});"> 
254									<img class="hide" src="${slideThumbnail1}" alt="${slideAlt}" title="${slideTitle}"/> 
255								</div> 
256								<#assign slideImagesCount = slideImagesCount + 1 /> 
257							</#if> 
258						</#list> 
259					</div> 
260					<a class="carousel-control-prev" href="#article-carousel" data-slide="prev"> 
261						<span class="carousel-control-prev-icon" aria-hidden="true"><!-- ${languageUtil.get(request, "previous")} --></span> 
262						<span class="hide-accessible">${languageUtil.get(request, "previous")}</span> 
263					</a> 
264					<a class="carousel-control-next" href="#article-carousel" data-slide="next"> 
265						<span class="carousel-control-next-icon" aria-hidden="true"><!-- ${languageUtil.get(request, "next")}--></span> 
266						<span class="hide-accessible">${languageUtil.get(request, "next")}</span> 
267					</a> 
268					<ol class="carousel-indicators d-none"> 
269						<#assign index = 0 /> 
270						<#list 1..slideImagesCount as item> 
271							<li data-target="#article-carousel" data-slide-to="${index}" <#if index==0> class="active"</#if>></li> 
272							<#assign index = index + 1 /> 
273						</#list> 
274					</ol> 
275				</div> 
276			</#if> 
277			 
278			<div class="article-data-wrapper"> 
279			<#if validator.isNotNull(concejos) || validator.isNotNull(Distancia.getData()) || validator.isNotNull(dificultad) || validator.isNotNull(DesnivelAcumulado.getData()) || validator.isNotNull(AltitudMaxima.getData()) 
280			|| validator.isNotNull(AltitudMaxima.getData()) || validator.isNotNull(AltitudMinima.getData()) || validator.isNotNull(IBP.getData()) || validator.isNotNull(tipoRuta) || validator.isNotNull(modalidad) 
281			|| validator.isNotNull(tipoRecorrido) || getterUtil.getBoolean(Transporte.Retorno.getData())> 
282					 
283					<#if validator.isNotNull(PoblacionesPrincipales.getData())> 
284						<ul class="article-list list-unstyled article-list-info"> 
285							<li class="article-list-item"> 
286								<span class="fas fa-map-marker-alt"> 
287									<span class="hide-accessible">${languageUtil.get(request,"address")}</span> 
288								</span>											 
289								<span class="field-wrapper" itemprop="address">						 
290									<span class="text d-block important">${PoblacionesPrincipales.getData()}</span> 
291									<#assign zoneNames = [] /> 
292									<#if concejos?size gt 0> 
293										<#list concejos as concejo> 
294											<#if concejo.getParentCategoryId() == 0> 
295												<#if !zoneNames?seq_contains("${concejo.getTitle(locale)}")> 
296													<#assign zoneNames = zoneNames + ["${concejo.getTitle(locale)}"]/> 
297												</#if> 
298											</#if> 
299										</#list> 
300										<#if validator.isNotNull(zoneNames)> 
301											<span class="text zones d-block">${zoneNames?join(", ")}</span> 
302										</#if> 
303									</#if> 
304								</span> 
305							</li> 
306						</ul> 
307					</#if> 
308				 
309					<div class="article-info-table"> 
310					<div class="article-info-table-row"> 
311						<div class="article-info-table-cell"> 
312						<ul class="article-list list-unstyled article-list-info"> 
313						<#if validator.isNotNull(Distancia.getData())> 
314							<li class="article-list-item"> 
315								<span class="fas fa-ruler-horizontal"> 
316									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-distancia")}</span> 
317								</span> 
318								<span class="field-wrapper"> 
319									<span class="field">${languageUtil.get(request, "infoasturias-distancia")}:</span>	 
320									<span class="text text-featured">${Distancia.getData()} kms</span> 
321								</span> 
322							</li> 
323						</#if> 
324						<#if validator.isNotNull(dificultad) && dificultad?has_content> 
325							<li class="article-list-item"> 
326								<span class="fas fa-layer-group"> 
327									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-dificultad")}</span> 
328								</span> 
329								<span class="field-wrapper"> 
330									<span class="field">${languageUtil.get(request, "infoasturias-dificultad")}:</span> 
331									<span class="text">${dificultad[0].getTitle(locale)}</span> 
332								</span> 
333							</li> 
334						</#if> 
335						<#if validator.isNotNull(DesnivelAcumulado.getData())> 
336							<li class="article-list-item"> 
337								<span class="fas fa-chart-line">	 
338									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-ascenso-acumulado")}</span> 
339								</span> 
340								<span class="field-wrapper"> 
341									<span class="field">${languageUtil.get(request, "infoasturias-route-ascenso-acumulado")}:</span> 
342									<span class="text">${DesnivelAcumulado.data} m</span> 
343								</span> 
344							</li> 
345						</#if> 
346						<#if validator.isNotNull(AltitudMaxima.getData())> 
347							<li class="article-list-item"> 
348								<span class="fas fa-ruler-vertical"> 
349									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-altitud-maxima")}</span> 
350								</span> 
351								<span class="field-wrapper"> 
352									<span class="field">${languageUtil.get(request, "infoasturias-route-altitud-maxima")}:</span> 
353									<span class="text">${AltitudMaxima.data} m</span> 
354								</span> 
355							</li> 
356						</#if> 
357						<#if validator.isNotNull(AltitudMinima.getData())> 
358							<li class="article-list-item"> 
359								<span class="fas fa-ruler-vertical"> 
360									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-altitud-minima")}</span> 
361								</span> 
362								<span class="field-wrapper"> 
363									<span class="field">${languageUtil.get(request, "infoasturias-route-altitud-minima")}:</span> 
364									<span class="text">${AltitudMinima.data} m</span> 
365								</span> 
366							</li> 
367						</#if> 
368						<#if validator.isNotNull(IBP.getData())> 
369							<li class="article-list-item"> 
370								<span class="fas fa-mountain"> 
371									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-ibp-index")}</span> 
372								</span> 
373								<span class="field-wrapper"> 
374									<span class="field">${languageUtil.get(request, "infoasturias-route-ibp-index")}:</span> 
375									<span class="text">${IBP.data}</span> 
376								</span> 
377							</li> 
378						</#if> 
379						</ul> 
380						</div> 
381						<div class="article-info-table-cell"> 
382							<ul class="article-list list-unstyled article-list-info"> 
383								<#if validator.isNotNull(tipoRuta)> 
384									<li class="article-list-item"> 
385										<span class="fas fa-bicycle"> 
386											<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-recorrido")}</span> 
387										</span> 
388										<span class="field-wrapper"> 
389											<span class="field">${tipoRuta}</span> 
390										</span> 
391									</li> 
392								</#if> 
393								<#if validator.isNotNull(modalidad)> 
394									<li class="article-list-item"> 
395										<span class="fas fa-route"> 
396											<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-type")}</span> 
397										</span> 
398										<span class="field-wrapper"> 
399											<span class="field">${languageUtil.get(request, "infoasturias-route-type")}:</span> 
400											<span class="text">${modalidad}</span> 
401										</span> 
402									</li> 
403								</#if> 
404								<#if validator.isNotNull(tipoRecorrido)> 
405									<li class="article-list-item"> 
406										<span class="fas fa-route"> 
407											<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-tipo-recorrido")}</span> 
408										</span> 
409										<span class="field-wrapper"> 
410											<span class="field">${languageUtil.get(request, "infoasturias-route-tipo-recorrido")}:</span> 
411											<span class="text">${tipoRecorrido}</span> 
412										</span> 
413									</li> 
414								</#if> 
415								<li class="article-list-item"> 
416									<span class="fas fa-train"> 
417										<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-retorno-ferrocarril")}</span> 
418									</span> 
419									<span class="field-wrapper"> 
420									<span class="field">${languageUtil.get(request, "infoasturias-route-retorno-ferrocarril")}:</span> 
421									<#if getterUtil.getBoolean(Transporte.Retorno.getData())> 
422										<span class="text">${languageUtil.get(locale, "yes")}</span> 
423									<#else> 
424										<span class="text">${languageUtil.get(locale, "no")}</span> 
425									</#if> 
426									</span> 
427								</li> 
428								<#if validator.isNotNull(Transporte.Empresa.getData()) && getterUtil.getBoolean(Transporte.Retorno.getData())> 
429									<li class="article-list-item"> 
430										<span class="fas fa-train"> 
431											<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-retorno-ferrocarril")}</span> 
432										</span> 
433										<span class="field-wrapper"> 
434										<span class="field">${Transporte.Empresa.getData()} 
435											<#if validator.isNotNull(Transporte.WebInformativa.getData())> 
436												<#list Transporte.WebInformativa.getSiblings() as web> 
437													<a class="fas fa-external-link-alt" href="${web.getData()}" onclick="this.target='_blank'" title="${languageUtil.get(locale, 'go-to')} ${web.getData()}"> 
438														<span class="hide-accessible">${web.getData()}</span> 
439													</a> 
440												</#list> 
441											</#if> 
442										</span> 
443										</span> 
444									</li> 
445								</#if> 
446							</ul> 
447						</div> 
448					</div> 
449				 
450				<div class="article-info-table-row"> 
451					<div class="article-info-table-cell"> 
452					<ul class="article-list list-unstyled article-list-info"> 
453						<#if validator.isNotNull(Inicio.getData())> 
454							<li class="article-list-item"> 
455								<span class="fas fa-map-marker"> 
456									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-lugar-inicio")}</span> 
457								</span> 
458								<span class="field-wrapper"> 
459								<span class="field">${languageUtil.get(request, "infoasturias-route-lugar-inicio")}:</span> 
460									<span class="text">${Inicio.getData()}</span> 
461								</span> 
462							</li> 
463						</#if> 
464						<#if validator.isNotNull(Finalizacion.getData())> 
465							<li class="article-list-item"> 
466								<span class="fas fa-map-marker"> 
467									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-lugar-finalizacion")}</span> 
468								</span> 
469								<span class="field-wrapper"> 
470								<span class="field">${languageUtil.get(request, "infoasturias-route-lugar-finalizacion")}:</span> 
471									<span class="text">${Finalizacion.getData()}</span> 
472								</span> 
473							</li> 
474						</#if> 
475						<#if validator.isNotNull(duracion)> 
476							<li class="article-list-item"> 
477								<span class="fas fa-stopwatch"> 
478									<span class="hide-accessible">${languageUtil.get(request,"infoasturias-route-duracion-estimada")}</span> 
479								</span> 
480								<span class="field-wrapper"> 
481								<span class="field">${languageUtil.get(request, "infoasturias-route-duracion-estimada")}:</span> 
482									<span class="text">${duracion}</span> 
483								</span> 
484							</li> 
485						</#if> 
486						 
487					</ul> 
488					</div> 
489					<div class="article-info-table-cell"> 
490						<#if validator.isNotNull(Documentos.GPXRuta.getData()) || validator.isNotNull(Documentos.GPXPOIRuta.getData()) || validator.isNotNull(Documentos.KMLRuta.getData())> 
491							<ul class="article-list article-list-documents"> 
492								<#if validator.isNotNull(Documentos.GPXRuta.getData())> 
493									<li class="article-list-item"> 
494									<span class="field-wrapper"> 
495									<a class="btn btn-border btn-inline-block btn-thin" href="${Documentos.GPXRuta.getData()}" onclick="this.target='_blank'" title="${languageUtil.get(request, 'infoasturias-download')} GPX"> 
496										<i class="fas fa-file-download"><!--icon--></i> ${languageUtil.format(request, "infoasturias-route-format", "GPX")} 
497									</a> 
498									</span> 
499									</li> 
500								</#if> 
501								<#if validator.isNotNull(Documentos.GPXPOIRuta.getData())> 
502									<li class="article-list-item"> 
503									<span class="field-wrapper"> 
504									<a class="btn btn-border btn-inline-block btn-thin" href="${Documentos.GPXPOIRuta.getData()}" onclick="this.target='_blank'"  title="${languageUtil.get(request, 'infoasturias-download')} POI GPX"> 
505										<i class="fas fa-file-download"><!--icon--></i> ${languageUtil.format(request, "infoasturias-poi-format", "GPX") } 
506									</a> 
507									</span> 
508									</li> 
509								</#if> 
510								<#if validator.isNotNull(Documentos.KMLRuta.getData())> 
511									<li class="article-list-item"> 
512									<span class="field-wrapper"> 
513									<a class="btn btn-border btn-inline-block btn-thin" href="${Documentos.KMLRuta.getData()}" onclick="this.target='_blank'"  title="${languageUtil.get(request, 'infoasturias-download')} KML"> 
514										<i class="fas fa-file-download"><!--icon--></i>  ${languageUtil.format(request, "infoasturias-route-format", "KML")} 
515									</a> 
516									</span> 
517									</li> 
518								</#if> 
519							</ul> 
520						</#if> 
521					</div> 
522				</div> 
523			</#if> 
524 
525			</div> 
526			 
527			<div class="leaflet-elevation-wrapper" id="elevation-div-${articleId}"><!--Elevation--></div> 
528			 
529			</div> 
530			 
531			<#if validator.isNotNull(DescripcionCorta.getData()) || validator.isNotNull(DescripcionLarga.getData())> 
532				<div class="article-text-wrapper article-panel-wrapper article-panel-wrapper-white"> 
533 
534					<div class="article-social-bookmarks article-social-bookmarks-circle text-right"> 
535						<@liferay_social_bookmarks["bookmarks"] 
536							className="com.liferay.journal.model.JournalArticle" 
537							classPK=assetEntry.getEntryId() 
538							displayStyle="menu" 
539							target="_blank" 
540							title=title 
541							types=articleSocialBookmarks 
542							url="${articleURL}" 
543						/> 
544					</div> 
545 
546					<div class="article-text article-panel"> 
547 
548						<#if validator.isNotNull(DescripcionCorta.getData())> 
549							<div class="article-short-description">${DescripcionCorta.getData()}</div> 
550						</#if> 
551						<#if validator.isNotNull(DescripcionLarga.getData()) || validator.isNotNull(Observaciones.getData())> 
552							<div class="article-long-description-wrapper"> 
553							 
554								<#if validator.isNotNull(DescripcionLarga.getData())> 
555									<div class="article-long-description">${DescripcionLarga.getData()}</div> 
556								</#if> 
557 
558								<#if validator.isNotNull(Observaciones.getData())> 
559									<div class="article-observations">${Observaciones.getData()}</div> 
560								</#if> 
561							</div> 
562						</#if> 
563						 
564						<#assign slideImagesCount = slideImagesCount - 1 /> 
565						<#if slideImagesSize gt slideImagesCount > 
566							<#assign index = 0 /> 
567							<div id="article-carousel-round" class="carousel slide carousel-fade carousel-article" data-ride="carousel" data-interval="5000"> 
568								<span aria-hidden="true" class="loading-animation loading-bg"></span> 
569								<div class="carousel-inner"> 
570									<#list slideImagesCount..slideImagesSize-1 as item> 
571										<#assign Slide = Visualizador.Imagen.getSiblings()[item]/> 
572										<#assign slideThumbnail1 = dlTool.getThumbnailByJSON(Slide.data, "1")! /> 
573										<#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! /> 
574										<#assign slideTitle = "${languageUtil.get(request, 'image')} ${title}" /> 
575										<#assign slideAlt = slideTitle /> 
576										<#if Slide.TituloImagen.data?has_content> 
577											<#assign slideTitle = Slide.TituloImagen.data />   
578											<#assign slideAlt = slideTitle /> 
579										</#if> 
580										<#if Slide.AltImagen?? && validator.isNotNull(Slide.AltImagen.getData())> 
581											<#assign slideAlt = Slide.AltImagen.getData() /> 
582										</#if> 
583										<div class="carousel-item aspect-ratio-bg-cover <#if index==0> active</#if>" style="background-image: url(${slideThumbnail3});"> 
584											<img class="hide" src="${slideThumbnail1}" alt="${slideAlt}"  title="${slideTitle}"/> 
585										</div> 
586										<#assign index = index + 1 /> 
587									</#list> 
588								</div> 
589 
590								<#if (index>1)> 
591									<a class="carousel-control-prev" href="#article-carousel-round" data-slide="prev"> 
592										<span class="carousel-control-prev-icon" aria-hidden="true"><!-- ${languageUtil.get(request, "previous")} --></span> 
593										<span class="hide-accessible">${languageUtil.get(request, "previous")}</span> 
594									</a> 
595									<a class="carousel-control-next" href="#article-carousel-round" data-slide="next"> 
596										<span class="carousel-control-next-icon" aria-hidden="true"><!-- ${languageUtil.get(request, "next")}--></span> 
597										<span class="hide-accessible">${languageUtil.get(request, "next")}</span> 
598									</a> 
599									<ol class="carousel-indicators d-none"> 
600										<#assign index = 0 /> 
601										<#list slideImagesCount..slideImagesSize-1 as item> 
602											<li data-target="#article-carousel-round" data-slide-to="${index}" <#if index==0> class="active"</#if>></li> 
603											<#assign index = index + 1 /> 
604										</#list> 
605									</ol> 
606								</#if> 
607							</div> 
608						</#if> 
609					</div> 
610				</div> 
611			</#if> 
612			 
613			<#-- PDI -->		 
614			<#assign arrayPDIs = [] /> 
615			<#if  PDI.getSiblings()?has_content && validator.isNotNull(PDI.getSiblings()[0]) && (PDI.getSiblings()[0].JournalPDI.data?has_content || PDI.getSiblings()[0].TituloPDI.data?has_content)> 
616				<div class="article-panel-wrapper"> 
617					<div class="article-panel"> 
618						<h3 class="title-section">${languageUtil.get(request,'infoasturias-pois')}</h3> 
619						<div class="slide-wrapper"> 
620							<div id="slick-pdi" class="slick slick-slider"> 
621								<#assign pdiCount = 0 /> 
622								<#list PDI.getSiblings() as pdi> 
623									<#assign journalPDIComarcas = "" /> 
624									<#assign pdiJSONObject = "" /> 
625									<#assign pdiArticleId = "" /> 
626									<#assign pdiURL = "#" /> 
627									<#assign pdiTitle = "" /> 
628									<#assign pdiImgAlt = "" /> 
629									<#assign pdiImgTitle = "" /> 
630									<#assign pdiDescription = "" /> 
631									<#assign smallImageThumbnail2 = "" /> 
632									<#if validator.isNotNull(pdi.JournalPDI.getData()) || (validator.isNotNull(pdi.TituloPDI.getData()) && validator.isNotNull(pdi.TituloPDI.ImagenPDI.getData()))> 
633										<#if validator.isNotNull(pdi.JournalPDI.getData())> 
634											<#assign pdiJSON = pdi.JournalPDI.data?eval/> 
635											<#assign journalPDI = journalTool.getJournalArticleByResourcePrimKey(getterUtil.getLong(pdiJSON.classPK))/> 
636											<#if validator.isNotNull(journalPDI)> 
637												<#assign pdiAssetEntry = journalTool.getAssetEntryByArticleId(journalPDI.getGroupId(), journalPDI.getArticleId())/>  
638												<#if validator.isNotNull(pdiAssetEntry)> 
639													<#assign journalPDIComarcas = journalTool.getCategoriesNames(groupId, journalPDI.getArticleId(), locale, ["Comarcas"])/> 
640													<#assign pdiURL = assetPublisherTool.getAssetViewURL(renderRequest, renderResponse, pdiAssetEntry) /> 
641													<#assign smallImageThumbnail2 = dlTool.getThumbnail(journalPDI.getSmallImageURL(), "2", layoutSetBannerPath)! /> 
642													<#assign pdiArticleId = journalPDI.getArticleId() /> 
643													<#assign pdiId = journalPDI.getArticleId() /> 
644													<#assign pdiTitle = journalPDI.getTitle(locale)! /> 
645													<#assign pdiDescription = stringUtil.shorten(htmlUtil.extractText(journalPDI.getDescription(locale)), 150)! /> 
646													<#assign pdiCoordinates = journalTool.getJournalArticleField(groupId, journalPDI.getArticleId(), "Coordenadas")! /> 
647													 
648													<#assign pdiJSONObject = jsonFactoryUtil.createJSONObject()! /> 
649													<#assign pdiJSONObject = pdiJSONObject.put("articleId", journalPDI.getArticleId())! /> 
650													<#assign pdiJSONObject = pdiJSONObject.put("title", pdiTitle)! /> 
651													<#assign pdiJSONObject = pdiJSONObject.put("description", pdiDescription)! /> 
652													<#assign pdiJSONObject = pdiJSONObject.put("subtitle", journalPDIComarcas)! /> 
653													<#assign pdiJSONObject = pdiJSONObject.put("image", smallImageThumbnail2)! /> 
654													<#assign pdiJSONObject = pdiJSONObject.put("url", pdiURL)! /> 
655													<#assign pdiJSONObject = pdiJSONObject.put("coordinates", pdiCoordinates)! /> 
656													<#assign pdiJSONObject = pdiJSONObject.put("icon", "")! /> 
657													<#if pdi.IconFontAwesomePDI?? && validator.isNotNull(pdi.IconFontAwesomePDI.getData())> 
658														<#assign pdiJSONObject = pdiJSONObject.put("icon", pdi.IconFontAwesomePDI.getData())! /> 
659													</#if> 
660												</#if> 
661											</#if> 
662										<#elseif validator.isNotNull(pdi.TituloPDI.getData()) && validator.isNotNull(pdi.TituloPDI.ImagenPDI.getData())> 
663 
664											<#assign pdiId = pdiCount! /> 
665											<#assign pdiTitle = pdi.TituloPDI.getData()! /> 
666											<#assign pdiImgAlt = pdi.TituloPDI.getData()! /> 
667											<#assign pdiImgTitle = pdi.TituloPDI.getData()! /> 
668											<#assign pdiCoordinates = pdi.TituloPDI.CoordenadasPDI.getData()! /> 
669											<#assign smallImageThumbnail2 = dlTool.getThumbnail(pdi.TituloPDI.ImagenPDI.getData(), "2", layoutSetBannerPath)! /> 
670											<#if pdi.TituloPDI.ImagenPDI.TitleImagenPDI??> 
671												<#if validator.isNotNull(pdi.TituloPDI.ImagenPDI.TitleImagenPDI.getData())> 
672													<#assign pdiImgTitle = pdi.TituloPDI.ImagenPDI.TitleImagenPDI.getData()/> 
673												</#if> 
674											</#if> 
675											<#if pdi.TituloPDI.ImagenPDI.AltImagenPDI??> 
676												<#if validator.isNotNull(pdi.TituloPDI.ImagenPDI.AltImagenPDI.getData())> 
677													<#assign pdiImgAlt = pdi.TituloPDI.ImagenPDI.AltImagenPDI.getData()/> 
678												</#if> 
679											</#if> 
680											<#assign pdiJSONObject = jsonFactoryUtil.createJSONObject()! /> 
681											<#assign pdiJSONObject = pdiJSONObject.put("articleId", pdiId)! /> 
682											<#assign pdiJSONObject = pdiJSONObject.put("title", pdiTitle)! /> 
683											<#assign pdiJSONObject = pdiJSONObject.put("description", "")! /> 
684											<#assign pdiJSONObject = pdiJSONObject.put("subtitle", "")! /> 
685											<#assign pdiJSONObject = pdiJSONObject.put("image", smallImageThumbnail2)! /> 
686											<#assign pdiJSONObject = pdiJSONObject.put("url", "")! /> 
687											<#assign pdiJSONObject = pdiJSONObject.put("coordinates", pdiCoordinates)! /> 
688											<#assign pdiJSONObject = pdiJSONObject.put("icon", "")! /> 
689											<#if pdi.IconFontAwesomePDI?? && validator.isNotNull(pdi.IconFontAwesomePDI.getData())> 
690												<#assign pdiJSONObject = pdiJSONObject.put("icon", pdi.IconFontAwesomePDI.getData())! /> 
691											</#if> 
692										</#if> 
693										<#if validator.isNotNull(pdiJSONObject)> 
694											<#assign arrayPDIs = arrayPDIs + [pdiJSONObject] /> 
695										</#if> 
696 
697										<div class="slide"> 
698											<a class="card poi" href="${pdiURL}" data-articleid="${pdiArticleId}" data-id="poi-${pdiId}" title="${languageUtil.format(request, 'go-to-x', htmlUtil.escape(pdiTitle))}"> 
699												<span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url(${smallImageThumbnail2});"> 
700													<img class="hide-accessible" src="${smallImageThumbnail2}" alt="${pdiImgAlt}" /> 
701													<#if validator.isNotNull(pdiDescription)> 
702														<span class="card-hover"> 
703															<span class="card-hover-text" itemprop="description"> 
704																${pdiDescription} 
705															</span> 
706														</span> 
707													</#if> 
708												</span> 
709												<span class="card-body"> 
710													<span class="card-title">${pdiTitle}</span> 
711													<#if validator.isNotNull(journalPDIComarcas)> 
712														<span class="card-subtitle">${journalPDIComarcas}</span> 
713													</#if> 
714												</span> 
715											</a> 
716										</div> 
717										<#assign pdiCount = pdiCount + 1 /> 
718									</#if> 
719								</#list> 
720							</div> 
721						</div> 
722					</div> 
723				</div> 
724 
725				<script type="text/javascript"> 
726 
727					// bootstrap 4 breakpoints 
728					var breakpoint${namespace} = { 
729						// small screen / phone 
730						sm: 576, 
731						// medium screen / tablet 
732						md: 768, 
733						// large screen / desktop 
734						lg: 992, 
735						// extra large screen / wide desktop 
736						xl: 1200 
737					}; 
738 
739					// bootstrap 4 responsive multi column slick carousel 
740					$('#slick-pdi').slick({ 
741						autoplay: false, 
742						autoplaySpeed: 1000, 
743						draggable: true, 
744						pauseOnHover: false, 
745						infinite: false, 
746						dots: false, 
747						arrows: true, 
748						speed: 1000, 
749						mobileFirst: true, 
750						slidesToShow: 1, 
751						slidesToScroll: 1, 
752						centerMode: false, 
753						responsive: [{ 
754							breakpoint: breakpoint${namespace}.sm, 
755							settings: { 
756							slidesToShow: 1, 
757							slidesToScroll: 1 
758
759						}, 
760
761							breakpoint: breakpoint${namespace}.md, 
762							settings: { 
763							slidesToShow: 2, 
764							slidesToScroll: 1 
765
766						}, 
767
768							breakpoint: breakpoint${namespace}.lg, 
769							settings: { 
770							slidesToShow: 2, 
771							slidesToScroll: 1 
772
773						}, 
774
775							breakpoint: breakpoint${namespace}.xl, 
776							settings: { 
777							slidesToShow: 2, 
778							slidesToScroll: 1 
779
780
781
782					}); 
783				</script> 
784			</#if> 
785			 
786			<#-- Services --> 
787			<#assign servicesNearJournalArticles = [] /> 
788			<div id="services-panel" class="article-panel-wrapper article-panel-services hide"> 
789				<div class="article-panel"> 
790					<h3 class="title-section">${languageUtil.get(request,'infoasturias-route-services')}</h3> 
791					 
792					<div class="filter-categories mb-4"> 
793 
794						<#list filterDDMStructures as filterDDMStructure> 
795 
796							<#assign filterStructureCustomNameKey = "${filterDDMStructure.getStructureId()}[customName]"/> 
797							<#assign filterStructureCustomNameValue = group.getTypeSettingsProperty(filterStructureCustomNameKey)!/> 
798 
799							<#assign filterStructureKey = filterDDMStructure.getStructureKey()! /> 
800							<#assign filterStructureName = filterDDMStructure.getName(locale) /> 
801							<#assign filterStructureDescription = filterDDMStructure.getDescription(locale) /> 
802							 
803 
804							<#if validator.isNotNull(filterStructureDescription)> 
805								<#assign filterStructureName = filterStructureDescription! /> 
806							</#if> 
807 
808							<#if validator.isNotNull(filterStructureCustomNameValue)> 
809								<#assign filterStructureName = languageUtil.get(request, filterStructureCustomNameValue)! /> 
810							</#if> 
811 
812							<a class="button-vocabulary-structure btn btn-border btn-thin mb-1 disabled-service" href="#" id="button-vocabulary-structure-id-${filterStructureKey}" data-vocabulary-structure-id="${filterStructureKey}">${filterStructureName}</a> 
813 
814						</#list> 
815 
816					</div> 
817					 
818					<div id="services-entries-container" class="slide-wrapper lfr-spa-loading"> 
819						<div class="lfr-spa-loading-spinner" style="position: absolute;"></div> 
820						<ul class="slider slick slick-slider pl-0"></ul> 
821						<@liferay_aui["script"] use="aui-base"> 
822							$(function() { 
823								$(".slider").slick({ 
824									arrows: true, 
825									dots: false, 
826									slidesToShow: 2, 
827									slidesToScroll: 1, 
828									mobileFirst: false, 
829									centerMode: false, 
830									infinite: false, 
831									responsive: [{ 
832										breakpoint: breakpoint${namespace}.sm, 
833										settings: { 
834										slidesToShow: 1, 
835										slidesToScroll: 1 
836
837									}, 
838
839										breakpoint: breakpoint${namespace}.md, 
840										settings: { 
841										slidesToShow: 2, 
842										slidesToScroll: 1 
843
844									}, 
845
846										breakpoint: breakpoint${namespace}.lg, 
847										settings: { 
848										slidesToShow: 2, 
849										slidesToScroll: 1 
850
851									}, 
852
853										breakpoint: breakpoint${namespace}.xl, 
854										settings: { 
855										slidesToShow: 2, 
856										slidesToScroll: 1 
857
858
859
860								}); 
861							}); 
862						</@> 
863					</div> 
864				</div> 
865			</div> 
866			 
867			<#if validator.isNotNull(routesNearJournalArticles) && routesNearJournalArticles?size gt 0> 
868				<div class="article-panel-wrapper article-panel-wrapper-white template-routes"> 
869					<div class="article-panel"> 
870					<h3 class="title-section">${languageUtil.get(request,'infoasturias-routes-near-here')}</h3> 
871					<div class="slide-wrapper"> 
872						<div id="slick-near" class="slick slick-slider"> 
873							<#list routesNearJournalArticles as currentJournalArticle> 
874								<#assign viewURL = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true)/> 
875								<#assign smallImageThumbnail2 = dlTool.getThumbnail(currentJournalArticle.getSmallImageURL(), "2", layoutSetBannerPath)! /> 
876								<#assign routeTitle = currentJournalArticle.getTitle(locale)/> 
877								<#assign denominacion = journalTool.getJournalArticleField(currentJournalArticle.getGroupId(), currentJournalArticle.getArticleId(), "Denominacion", locale)/> 
878								<#assign assetEntry = journalTool.getAssetEntryByArticleId(groupId, articleId)> 
879								<#if validator.isNotNull(denominacion)> 
880									<#assign routeTitle = denominacion /> 
881								</#if> 
882								<div class="slide"> 
883									<a class="card route-near" data-id="route-near-${currentJournalArticle.getArticleId()}" href="${viewURL}" title="${languageUtil.format(request, 'go-to-x', routeTitle)}"> 
884										<span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${smallImageThumbnail2}');"> 
885											<img class="hide-accessible" src="${smallImageThumbnail2}" alt="${routeTitle}"> 
886											<#if validator.isNotNull(htmlUtil.extractText(currentJournalArticle.getDescription(locale)))> 
887												<span class="card-hover"> 
888													<span class="card-hover-text" itemprop="description"> 
889														${stringUtil.shorten(htmlUtil.extractText(currentJournalArticle.getDescription(locale)), 150)} 
890													</span> 
891												</span> 
892											</#if> 
893										</span> 
894										<span class="card-body"> 
895											<span class="card-title">${routeTitle}</span> 
896											<span class="card-subtitle"> 
897												<#-- <span class="d-block">${currentJournalArticle.getVersion()} Kms</span>--> 
898												<#assign currentJournalArticleConcejos = journalTool.getCategoriesNames(groupId, currentJournalArticle.getArticleId(), locale, ["Concejos"])/> 
899												<#if validator.isNotNull(currentJournalArticleConcejos)> 
900													<#assign currentJournalArticleConcejos = stringUtil.replace(currentJournalArticleConcejos,",",", ") /> 
901													<span class="d-block">${currentJournalArticleConcejos}</span> 
902												</#if> 
903											</span> 
904										</span> 
905									</a> 
906								</div> 
907							</#list> 
908						</div> 
909					</div> 
910					</div> 
911				</div> 
912 
913				<script type="text/javascript"> 
914 
915					// bootstrap 4 breakpoints 
916					var breakpoint${namespace} = { 
917						// small screen / phone 
918						sm: 576, 
919						// medium screen / tablet 
920						md: 768, 
921						// large screen / desktop 
922						lg: 992, 
923						// extra large screen / wide desktop 
924						xl: 1200 
925					}; 
926 
927					// bootstrap 4 responsive multi column slick carousel 
928					$('#slick-near').slick({ 
929						autoplay: false, 
930						autoplaySpeed: 1000, 
931						draggable: true, 
932						pauseOnHover: false, 
933						infinite: false, 
934						dots: false, 
935						arrows: true, 
936						speed: 1000, 
937						mobileFirst: true, 
938						slidesToShow: 1, 
939						slidesToScroll: 1, 
940						centerMode: false, 
941						responsive: [{ 
942							breakpoint: breakpoint${namespace}.sm, 
943							settings: { 
944							slidesToShow: 1, 
945							slidesToScroll: 1 
946
947						}, 
948
949							breakpoint: breakpoint${namespace}.md, 
950							settings: { 
951							slidesToShow: 2, 
952							slidesToScroll: 1 
953
954						}, 
955
956							breakpoint: breakpoint${namespace}.lg, 
957							settings: { 
958							slidesToShow: 2, 
959							slidesToScroll: 1 
960
961						}, 
962
963							breakpoint: breakpoint${namespace}.xl, 
964							settings: { 
965							slidesToShow: 2, 
966							slidesToScroll: 1 
967
968
969
970					}); 
971				</script> 
972			</#if> 
973			</div> 
974		</div> 
975		 
976		<div class="col-md-7 col-12 col-map d-md-inline-block d-none"> 
977			<div id="map" class="lfr-spa-loading"> 
978				<div class="lfr-spa-loading-spinner" style="position: absolute;"></div> 
979				 
980				<#if validator.isNotNull(filterStructuresIds)> 
981					<div id="map-filter" class="hide"> 
982						<div class="vocabularies"> 
983							<#list filterStructuresIds as filterStructuresId> 
984								<#assign filterStructure = ddmStructureLocalService.fetchDDMStructure(filterStructuresId)/> 
985								<#if validator.isNotNull(filterStructure)> 
986									<#assign filterStructureKey = filterStructure.getStructureKey()/> 
987										<#assign markersServicesDDMStructureKeys = arrayUtil.append(markersServicesDDMStructureKeys, filterStructureKey) /> 
988										<#assign filterStructureFontAwesomeKey = "${filterStructure.getStructureId()}[fontAwesome]"/> 
989										<#assign filterStructureFontAwesomeValue = group.getTypeSettingsProperty(filterStructureFontAwesomeKey)!/> 
990										<#assign filterStructureVocabularyKey = "${filterStructure.getStructureId()}[vocabularyId]"/> 
991										<#assign filterStructureVocabularyValue = getterUtil.getLong(group.getTypeSettingsProperty(filterStructureVocabularyKey))!/> 
992										<#assign filterStructurevocabularyLevelCategoriesKey = "${filterStructure.getStructureId()}[vocabularyLevelCategories]"/> 
993										<#assign filterStructurevocabularyLevelCategoriesValue = group.getTypeSettingsProperty(filterStructurevocabularyLevelCategoriesKey)!1/> 
994										<#assign filterStructurevocabularyCategoryIdsKey = "${filterStructure.getStructureId()}[vocabularyCategoryIds]"/> 
995										<#assign filterStructurevocabularyCategoryIdsValue = group.getTypeSettingsProperty(filterStructurevocabularyCategoryIdsKey)!/> 
996										<#assign filterStructurevocabularyTagsKey = "${filterStructure.getStructureId()}[vocabularyTags]"/> 
997										<#assign filterStructurevocabularyTagsValue = group.getTypeSettingsProperty(filterStructurevocabularyTagsKey)!/> 
998										<#assign filterStructureCustomNameKey = "${filterStructure.getStructureId()}[customName]"/> 
999										<#assign filterStructureCustomNameValue = group.getTypeSettingsProperty(filterStructureCustomNameKey)!/> 
1000										<#assign filterStructureStructureIdsKey = "${filterStructure.getStructureId()}[filterStructuresIds]"/> 
1001										<#assign filterStructureStructureIdsValues = group.getTypeSettingsProperty(filterStructureStructureIdsKey)!/> 
1002 
1003										<#assign filterStructureStructureKeys = [filterStructureKey]/> 
1004										<#if validator.isNotNull(filterStructureStructureIdsValues)> 
1005											<#list stringUtil.split(filterStructureStructureIdsValues) as filterStructureStructureIdsValue> 
1006												<#assign ddmStructure = ddmStructureLocalService.fetchDDMStructure(getterUtil.getLong(filterStructureStructureIdsValue))! /> 
1007												<#if validator.isNotNull(ddmStructure)> 
1008													<#assign filterStructureStructureKeys = filterStructureStructureKeys + [ddmStructure.getStructureKey()]/> 
1009												</#if> 
1010											</#list> 
1011										</#if> 
1012										 
1013										<#assign filterStructureJSONObject = jsonFactoryUtil.createJSONObject()> 
1014										<#assign filterStructureJSONObject = filterStructureJSONObject.put("structureId", filterStructuresId)! /> 
1015										<#assign filterStructureJSONObject = filterStructureJSONObject.put("structureKey", filterStructureKey)! /> 
1016										<#assign filterStructureJSONObject = filterStructureJSONObject.put("fontAwesome", filterStructureFontAwesomeValue)! /> 
1017										<#assign filterStructureJSONObject = filterStructureJSONObject.put("vocabularyId", filterStructureVocabularyValue)! /> 
1018										<#assign filterStructureJSONObject = filterStructureJSONObject.put("vocabularyLevelCategories", filterStructurevocabularyLevelCategoriesValue)! /> 
1019										<#assign filterStructureJSONObject = filterStructureJSONObject.put("vocabularyCategoryIds", filterStructurevocabularyCategoryIdsValue)! /> 
1020										<#assign filterStructureJSONObject = filterStructureJSONObject.put("vocabularyTags", filterStructurevocabularyTagsValue)! /> 
1021										<#assign filterStructureJSONObject = filterStructureJSONObject.put("name", filterStructure.getName(locale))! /> 
1022										<#assign filterStructureJSONObject = filterStructureJSONObject.put("customName", filterStructureCustomNameValue)! /> 
1023										<#assign filterStructureJSONObject = filterStructureJSONObject.put("description", filterStructure.getDescription(locale))! /> 
1024										<#assign filterStructureJSONObject = filterStructureJSONObject.put("structureKeys", stringUtil.merge(filterStructureStructureKeys))! /> 
1025										<#assign filterStructures = filterStructures + [filterStructureJSONObject] /> 
1026 
1027									<#assign filterStructureName = filterStructure.getName(locale) /> 
1028									<#assign filterStructureDescription = filterStructure.getDescription(locale) /> 
1029									 
1030									<#if validator.isNotNull(filterStructureDescription)> 
1031										<#assign filterStructureName = filterStructureDescription! /> 
1032									</#if> 
1033 
1034									<#if validator.isNotNull(filterStructureCustomNameValue)> 
1035										<#assign filterStructureName = languageUtil.get(request, filterStructureCustomNameValue)! /> 
1036									</#if> 
1037									 
1038									<div class="vocabulary-wrapper disabled-service" title="${filterStructureName}" data-structurekey="${filterStructure.getStructureKey()}"> 
1039										<div class="vocabulary" id="vocabulary-structure-id-${filterStructure.getStructureKey()}" data-vocabulary-structure-id="${filterStructure.getStructureKey()}"> 
1040											<span class="icon ${filterStructureFontAwesomeValue}"><span class="hide-accessible">${filterStructureName}</span></span> 
1041										</div> 
1042										<#if validator.isNotNull(filterStructureVocabularyValue)> 
1043											<#assign filterStructureVocabulary = assetVocabularyLocalService.fetchAssetVocabulary(filterStructureVocabularyValue)! /> 
1044											<#assign filterStructureVocabularyCategories = assetCategoryTool.getAssetCategoriesByVocabulary(filterStructureVocabulary, getterUtil.getInteger(filterStructurevocabularyLevelCategoriesValue))! /> 
1045											<#if validator.isNotNull(filterStructureVocabularyCategories)> 
1046												<div class="categories"> 
1047													<#list filterStructureVocabularyCategories as filterStructureVocabularyCategory> 
1048														<div class="category"> 
1049															<input type="checkbox" name="category-${filterStructureVocabularyCategory.getCategoryId()}" id="category-${filterStructureVocabularyCategory.getCategoryId()}" data-id="${filterStructureVocabularyCategory.getCategoryId()}" /> 
1050															<label for="category-${filterStructureVocabularyCategory.getCategoryId()}">${filterStructureVocabularyCategory.getTitle(locale)}</label> 
1051														</div> 
1052													</#list> 
1053												</div> 
1054											</#if> 
1055										</#if> 
1056									</div> 
1057								</#if> 
1058							</#list> 
1059						</div> 
1060					</div> 
1061				</#if> 
1062			</div> 
1063		</div> 
1064	</div> 
1065	</div> 
1066	 
1067</article> 
1068 
1069<@liferay_aui["script"] use="aui-base, anim, aui-io-request, cookie"> 
1070 
1071	var mapZoom = ${getterUtil.getInteger(mapZoom, 12)};//MapZoom 
1072	var mapLat = ${getterUtil.getString(mapLat, "43.362597693870434")};//MapLat 
1073	var mapLng = ${getterUtil.getString(mapLng, "-5.846235457402242")};//MapLng 
1074	var osm = new L.TileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 
1075
1076			attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>' 
1077
1078	); 
1079	 
1080	var map = new L.map('map', {center: [${gpxRoute.get("centerLatLon")}], zoom: mapZoom, zoomControl: false, minZoom: 9, bounceAtZoomLimits: false, layers: [osm]}); 
1081	map.doubleClickZoom.disable(); 
1082	map.whenReady(function(){ 
1083		A.one('#map').removeClass('lfr-spa-loading'); 
1084	}); 
1085	 
1086	//Map Height 
1087	mapFullHeight(scroll=true, map); 
1088	 
1089	//FilterStructures 
1090	var fontAwesomeIconClassCSS = []; 
1091	<#list filterStructures as filterStructure> 
1092		fontAwesomeIconClassCSS['${filterStructure["structureKey"]}'] = { 
1093			cssClass:'${filterStructure["fontAwesome"]}',  
1094			vocabularyId: ${filterStructure["vocabularyId"]},  
1095			vocabularyLevelCategories: ${filterStructure["vocabularyLevelCategories"]}, 
1096			vocabularyTags: '${filterStructure["vocabularyTags"]}' 
1097		}; 
1098	</#list> 
1099	 
1100	//ServiceMarkers 
1101	var serviceMarkers = []; 
1102	var markersServicesGroups = {}; 
1103	var servicesContainer = A.one('#services-entries-container'); 
1104	var mapFilter = A.one('#map-filter'); 
1105	var servicesPanel = A.one('#services-panel'); 
1106	 
1107	Liferay.provide(window,'journalArticlesResourcesCount', function(deltaParam, structureKeys, anyCategoryIds, allCategoryIds, anyTagNames, allTagNames){ 
1108		var url = '/o/asac-web-services/ws/journalArticlesResourcesCount'; 
1109		A.io.request(url, { 
1110			method: 'GET', 
1111			type: 'JSON', 
1112			data: { 
1113				companyId: ${companyId}, 
1114				groupId: ${groupId}, 
1115				structureKeys: structureKeys, 
1116				anyCategoryIds: assetAnyCategoryIds, 
1117				allCategoryIds: assetAllCategoryIds, 
1118				anyTagNames: anyTagNames, 
1119				allTagNames: allTagNames 
1120			}, 
1121			on: { 
1122				success: function() { 
1123					var count = this.get('responseData'); 
1124					if(count>deltaParam){ 
1125						var pages = Math.ceil(count/deltaParam); 
1126						for(var cur = 0; cur < pages; cur++){ 
1127							journalArticlesResources(cur, deltaParam, structureKeys, anyCategoryIds, allCategoryIds, anyTagNames, allTagNames, count); 
1128
1129					}else{ 
1130						var cur  = -1; 
1131						var delta  = -1; 
1132						journalArticlesResources(cur, deltaParam, structureKeys, anyCategoryIds, allCategoryIds, anyTagNames, allTagNames, count); 
1133
1134
1135
1136		}); 
1137	}); 
1138	 
1139	Liferay.provide(window,'journalArticlesResources', function(cur, delta, structureKeys, anyCategoryIds, allCategoryIds, anyTagNames, allTagNames, total){ 
1140		var structureKey = structureKeys.split(',')[0]; 
1141		var url = '/o/asac-web-services/ws/journalArticlesResources'; 
1142		A.io.request(url, { 
1143			method: 'GET', 
1144			type: 'JSON', 
1145			data: { 
1146				companyId: ${companyId}, 
1147				groupId: ${groupId}, 
1148				structureKeys: structureKeys, 
1149				anyCategoryIds: anyCategoryIds, 
1150				allCategoryIds: allCategoryIds, 
1151				anyTagNames: anyTagNames, 
1152				allTagNames: allTagNames, 
1153				cur: cur, 
1154				delta: delta, 
1155			}, 
1156			on: { 
1157				success: function() { 
1158					var vocabularyId = 0; 
1159					var points = JSON.parse(this.get('responseData')); 
1160					if(points && points.length>0){ 
1161						for(var index in points) { 
1162						 
1163							var point = points[index]; 
1164							var articleId = point.articleId; 
1165							var title = point.title; 
1166							var descriptionText = point.descriptionText; 
1167							var assetCategories = point.assetCategories; 
1168							var subTypeId = point.subTypeId; 
1169							var subTypeName = point.subTypeName; 
1170							var coordinates = point.coordinates; 
1171							var detailURL = point.detailURL; 
1172							var detailFullURL = point.detailFullURL; 
1173							if(detailFullURL!='') 
1174								detailURL = detailFullURL; 
1175							var image = point.image; 
1176							var imageThumbnail2 = point.imageThumbnail2; 
1177							var icon = fontAwesomeIconClassCSS[subTypeId].cssClass; 
1178							var vocabularyId = (vocabularyId==0) ? fontAwesomeIconClassCSS[structureKey].vocabularyId : vocabularyId; 
1179							var vocabularyLevelCategories = fontAwesomeIconClassCSS[subTypeId].vocabularyLevelCategories; 
1180							var concejosVocabularyId = ${concejosVocabulary.getVocabularyId()}; 
1181							 
1182							const fontAwesomeIcon = L.divIcon({ 
1183								className: 'marker-wrapper', 
1184								html: "<div class='marker-icon-blue'><i class='"+icon+"'><!-- icon--></i></div>", 
1185								iconSize: [26, 30], 
1186								iconAnchor: [13, 30] 
1187							}); 
1188 
1189							if(coordinates!=''){ 
1190								var latLng = coordinates.split(','); 
1191								if(!isNaN(latLng[0]) && !isNaN(latLng[1])){ 
1192									var pointGroup = ''; 
1193									var categoryTitle = ''; 
1194									var categoryConcejos = ''; 
1195									var categoryId = ''; 
1196									for(var assetCategoriesIndex in assetCategories) { 
1197										var assetCategory = assetCategories[assetCategoriesIndex]; 
1198 
1199										if(assetCategory && assetCategory.vocabularyId==concejosVocabularyId){ 
1200											if(categoryConcejos=='') 
1201												categoryConcejos = assetCategory.title; 
1202											else 
1203												categoryConcejos += ', ' + assetCategory.title; 
1204
1205 
1206										if(assetCategory && assetCategory.vocabularyId==vocabularyId){ 
1207											if(vocabularyLevelCategories && vocabularyLevelCategories>0){ 
1208												var level = assetCategory.level; 
1209												if(vocabularyLevelCategories==level){ 
1210													categoryId = assetCategory.categoryId; 
1211													categoryTitle = assetCategory.title; 
1212													if(markersServicesGroups && markersServicesGroups[categoryId]){ 
1213														pointGroup = markersServicesGroups[categoryId]; 
1214													}else{ 
1215														var pointGroup = L.markerClusterGroup({ 
1216															maxClusterRadius: 100, 
1217															showCoverageOnHover: false, 
1218															//zoomToBoundsOnClick: false, 
1219															//spiderfyOnMaxZoom: false, 
1220															iconCreateFunction: function(cluster) { 
1221																var childMarkers = cluster.getAllChildMarkers(); 
1222																var n = 0; 
1223																for (var i = 0; i < childMarkers.length; i++) { 
1224																	n += 1; 
1225
1226																return L.divIcon({ 
1227																	className: 'marker-wrapper', 
1228																	html: "<div class='marker-circle'>"+n+"</i></div>", 
1229																	iconSize: [26, 30], 
1230																	iconAnchor: [13, 5] 
1231																}); 
1232
1233														}); 
1234														markersServicesGroups[categoryId] = pointGroup; 
1235
1236
1237											}else{ 
1238												categoryId = assetCategory.categoryId; 
1239												categoryTitle = assetCategory.title; 
1240												if(markersServicesGroups && markersServicesGroups[categoryId]){ 
1241													pointGroup = markersServicesGroups[categoryId]; 
1242												}else{ 
1243													var pointGroup = L.markerClusterGroup({ 
1244														maxClusterRadius: 100, 
1245														showCoverageOnHover: false, 
1246														//zoomToBoundsOnClick: false, 
1247														//spiderfyOnMaxZoom: false, 
1248														iconCreateFunction: function(cluster) { 
1249															var childMarkers = cluster.getAllChildMarkers(); 
1250															var n = 0; 
1251															for (var i = 0; i < childMarkers.length; i++) { 
1252																n += 1; 
1253
1254															return L.divIcon({ 
1255																className: 'marker-wrapper', 
1256																html: "<div class='marker-circle'>"+n+"</i></div>", 
1257																iconSize: [26, 30], 
1258																iconAnchor: [13, 5] 
1259															}); 
1260
1261													}); 
1262													markersServicesGroups[categoryId] = pointGroup; 
1263
1264
1265
1266
1267								 
1268									var popupContentTemplate = '<a data-articleid="'+articleId+'" href="'+detailURL+'" class="popup popup-service">'+ 
1269									'<span class="popup-image-wrapper" style="background-image: url('+imageThumbnail2+');"><!-- image--></span>'+ 
1270									'<span class="popup-body">'+ 
1271									'<span class="popup-subtitle">'+categoryTitle+'</span>'+ 
1272									'<span class="popup-title">'+title+'</span>'+ 
1273									'<span class="popup-desciption">'+descriptionText+'</span>'+ 
1274									'</span>'+ 
1275									'</a>'; 
1276 
1277									var newNodeObject = A.Node.create(popupContentTemplate); 
1278									newNodeObject.on('click', function(event){ 
1279										event.preventDefault(); 
1280										var nodeArticleId = this.attr('data-articleid'); 
1281										${namespace}getArticleDisplay(nodeArticleId); 
1282									}); 
1283								 
1284									var marker = L.marker([latLng[0],latLng[1]],  
1285
1286											"icon": fontAwesomeIcon, 
1287											"title": title 
1288
1289									); 
1290									marker.articleId='service-'+articleId; 
1291									marker.bindPopup(newNodeObject.getDOMNode()); 
1292									marker.on('popupopen', function(e) { 
1293										map.panTo(this.getLatLng()); 
1294									}); 
1295									marker.on('popupclose', function(e) { 
1296										${namespace}closeArticleDisplay(); 
1297									}); 
1298									//markersServicesGroup.addLayer(marker); 
1299									if(pointGroup){ 
1300										pointGroup.addLayer(marker); 
1301
1302									 
1303									serviceMarkers.push(marker); 
1304 
1305									//CreateObject 
1306									var entry = A.Node.create('<div class="slide service-structure service-structure-'+subTypeId+' service-category-'+categoryId+'"></div>'); 
1307									var anchor = A.Node.create('<a onclick="event.preventDefault(); ${namespace}getArticleDisplay('+articleId+');" class="card service item-card" data-articleid="'+articleId+'" data-id="service-'+articleId+'" href="'+detailURL+'" title="'+title+'"></a>'); 
1308									var anchorImageWrapper = A.Node.create('<span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('+imageThumbnail2+');"></span>'); 
1309									if(descriptionText!=''){ 
1310										var anchorImageWrapperHover = A.Node.create('<span class="card-hover"></span>'); 
1311										var anchorImageWrapperHoverDescription = A.Node.create('<span class="card-hover-text" itemprop="description">'+descriptionText+'</span>'); 
1312										anchorImageWrapperHover.append(anchorImageWrapperHoverDescription); 
1313										anchorImageWrapper.append(anchorImageWrapperHover); 
1314
1315									var anchorImage = A.Node.create('<img class="hide-accessible" src="'+imageThumbnail2+'" alt="'+title+'">'); 
1316									var anchorBody = A.Node.create('<span class="card-body"></span>'); 
1317									var anchorTitle = A.Node.create('<span class="card-title">'+title+'</span>'); 
1318									var anchorCategories = A.Node.create('<span class="card-categories">'+categoryTitle+'</span>'); 
1319									var anchorConcejos = A.Node.create('<span class="card-subtitle">'+categoryConcejos+'</span>'); 
1320									 
1321									anchorImageWrapper.append(anchorImage); 
1322									anchor.append(anchorImageWrapper); 
1323									anchorBody.append(anchorTitle); 
1324									anchorBody.append(anchorCategories); 
1325									anchorBody.append(anchorConcejos); 
1326									anchor.append(anchorBody); 
1327									 
1328									entry.append(anchor); 
1329									$('.slider').slick('slickAdd','<li class="service-structure-'+subTypeId+' service-category-'+categoryId+'">'+entry.outerHTML()+'</li>'); 
1330
1331
1332
1333 
1334						A.all('.card.service').each(function(item){ 
1335							item.on('mouseover', function(event){ 
1336								var articleId = item.getAttribute("data-id"); 
1337								${namespace}markerServicePopup(articleId, true); 
1338							}); 
1339							item.on('mouseout', function(event){ 
1340								var articleId = item.getAttribute("data-id"); 
1341								${namespace}markerServicePopup(articleId, false); 
1342							}); 
1343						}); 
1344 
1345						var vocabularyWrapper = A.one('.vocabulary-wrapper[data-structurekey="' + structureKey + '"]'); 
1346						var vocabularyButtonWrapper = A.one('.filter-categories .button-vocabulary-structure[data-vocabulary-structure-id="' + structureKey + '"]'); 
1347						if(vocabularyWrapper){ 
1348							vocabularyWrapper.addClass("selectable"); 
1349							vocabularyWrapper.one('.vocabulary').on('click', function(){ 
1350								${namespace}toggleMarkersServicesStructure(structureKey); 
1351							}); 
1352							vocabularyWrapper.removeClass("disabled-service"); 
1353							if(vocabularyButtonWrapper) 
1354								vocabularyButtonWrapper.removeClass("disabled-service"); 
1355
1356
1357 
1358					if(serviceMarkers && serviceMarkers.length>0){ 
1359						if(servicesPanel) 
1360							servicesPanel.show(); 
1361						if(mapFilter) 
1362							mapFilter.show(); 
1363
1364
1365
1366		}); 
1367	}); 
1368	 
1369	<#list filterStructures as filterStructure> 
1370	 
1371		var structureKeys = '${filterStructure["structureKeys"]}'; 
1372		var assetAnyCategoryIds = '${filterStructure["vocabularyCategoryIds"]}'; 
1373		var assetAllCategoryIds = ''; 
1374		var assetAnyTags = ''; 
1375		var assetAllTags = '${routeTag}'; 
1376		if('${filterStructure["vocabularyTags"]}'!='' && '${filterStructure["vocabularyTags"]}'!='1') 
1377			var assetAllTags = '${routeTag},${filterStructure["vocabularyTags"]}'; 
1378		var delta = 500; 
1379		journalArticlesResourcesCount(delta, structureKeys, assetAnyCategoryIds, assetAllCategoryIds, assetAnyTags, assetAllTags); 
1380		servicesContainer.removeClass('lfr-spa-loading'); 
1381		 
1382	</#list> 
1383 
1384	//Filter categories 
1385	//console.log(markersServicesGroups); 
1386	A.all('.categories input').each(function(item){ 
1387		item.on('click', function(){ 
1388 
1389			var categoryIds = []; 
1390			var categoryIdsCssClass = ''; 
1391			var vocabularyWrapper = item.ancestor('.vocabulary-wrapper'); 
1392			var vocabulary = vocabularyWrapper.one('.vocabulary'); 
1393			var categoryId = item.getAttribute('data-id'); 
1394			var structureId = vocabulary.getAttribute('data-vocabulary-structure-id'); 
1395			var button = A.one('#button-vocabulary-structure-id-'+structureId); 
1396			var pointsGroup = markersServicesGroups[categoryId]; 
1397			 
1398			if(pointsGroup){ 
1399				if(item.attr('checked')){ 
1400					map.addLayer(pointsGroup); 
1401				}else{ 
1402					map.removeLayer(pointsGroup); 
1403
1404
1405			if(item.attr('checked')){ 
1406				vocabularyWrapper.addClass('selected'); 
1407				button.addClass('selected'); 
1408			}else{ 
1409				var flag = true; 
1410				var categories = vocabularyWrapper.all('.categories input').each(function(index){ 
1411					if(index.attr('checked')) 
1412						flag = false; 
1413				}); 
1414				if(flag){ 
1415					vocabularyWrapper.removeClass('selected'); 
1416					button.removeClass('selected'); 
1417
1418
1419 
1420			A.all('.categories input').each(function(index){ 
1421				if(index.attr('checked')){ 
1422					var categoryId = index.getAttribute('data-id'); 
1423					categoryIds.push('.service-category-'+categoryId); 
1424
1425			}); 
1426 
1427			$(".slider").slick('slickUnfilter'); 
1428			categoryIdsCssClass = categoryIds.join(); 
1429			if(categoryIdsCssClass!='') 
1430				$(".slider").slick('slickFilter', categoryIdsCssClass); 
1431 
1432		}); 
1433	}); 
1434	 
1435	//Filter services 
1436	A.all('.button-vocabulary-structure').each(function(item){ 
1437		item.on('click', function(event){ 
1438			event.preventDefault(); 
1439			var structureId = item.attr('data-vocabulary-structure-id'); 
1440            if($(window).width() > 768) 
1441			    ${namespace}toggleMarkersServicesStructure(structureId); 
1442		}); 
1443	}); 
1444	 
1445	//Route 
1446	var routesPolylines = []; 
1447	var routesNearPolylinesGroup = L.layerGroup(); 
1448	const fontAwesomeRouteStartIcon = L.divIcon({ 
1449		className: 'marker-wrapper', 
1450		html: "<div class='marker-icon marker-icon-start marker-icon-start-min'><i class='fas fa-bicycle'><!-- icon--></i></div>", 
1451		iconSize: [26, 30], 
1452        iconAnchor: [13, 5] 
1453	}); 
1454	const fontAwesomeRouteEndIcon = L.divIcon({ 
1455		className: 'marker-wrapper', 
1456		html: "<div class='marker-icon marker-icon-end marker-icon-end-min'><i class='fas fa-bicycle'><!-- icon--></i></div>", 
1457		iconSize: [26, 30], 
1458        iconAnchor: [13, 30] 
1459	}); 
1460	const fontAwesomeRouteNearIcon = L.divIcon({ 
1461		className: 'marker-wrapper', 
1462		html: "<div class='marker-icon marker-icon-near marker-icon-near-min'><i class='fas fa-bicycle'><!-- icon--></i></div>", 
1463		iconSize: [26, 30], 
1464        iconAnchor: [13, 5] 
1465	}); 
1466	 
1467	<#if gpxRoute?has_content> 
1468		 
1469		<#assign gpxRoute = gpxRoute.put("articleId", articleId)! /> 
1470		<#assign gpxRoute = gpxRoute.put("color", "000")! /> 
1471		<#assign gpxRoute = gpxRoute.put("url", "")! /> 
1472		<#assign gpxRoute = gpxRoute.put("title", title)! /> 
1473		 
1474		var popupTextStartTemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-subtitle">${languageUtil.get(request, 'infoasturias-route-start')}</span><span class="popup-title">${htmlUtil.escape(Inicio.getData())}</span></span></span>'; 
1475		var popupTextEndTemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-subtitle">${languageUtil.get(request, 'infoasturias-route-end')}</span><span class="popup-title">${htmlUtil.escape(Finalizacion.getData())}</span></span></span>'; 
1476		 
1477		//Markers Route Start/End 
1478		var latLng = '${gpxRoute.get("coordinatesStart")}'; 
1479		latLng = latLng.replaceAll(' ', ''); 
1480		latLng = latLng.split(','); 
1481		var markerRouteStart = L.marker([latLng[0],latLng[1]], 
1482
1483				"icon": fontAwesomeRouteStartIcon, 
1484				"title": '${languageUtil.format(request, 'infoasturias-route-start-x', '${htmlUtil.escape(gpxRoute.get("title"))}')}' 
1485
1486		).bindPopup(popupTextStartTemplate).addTo(map); 
1487		var latLng = '${gpxRoute.get("coordinatesEnd")}'; 
1488		latLng = latLng.replaceAll(' ', ''); 
1489		latLng = latLng.split(','); 
1490		var markerRouteEnd = L.marker([latLng[0],latLng[1]],  
1491
1492				"icon": fontAwesomeRouteEndIcon, 
1493				"title": '${languageUtil.format(request, 'infoasturias-route-end-x', '${htmlUtil.escape(gpxRoute.get("title"))}')}' 
1494
1495		).bindPopup(popupTextEndTemplate).addTo(map); 
1496		 
1497		//POIs 
1498		var poiMarkers = []; 
1499		<#if arrayPDIs?has_content> 
1500			<#list arrayPDIs as arrayPDI> 
1501				var poiArticleId = '${arrayPDI.get("articleId")}'; 
1502				var latLng = '${arrayPDI.get("coordinates")}'; 
1503				var url = '${arrayPDI.get("url")}'; 
1504				var image = '${arrayPDI.get("image")}'; 
1505				var title = '${htmlUtil.escape(arrayPDI.get("title"))}'; 
1506				var description = '${htmlUtil.escape(arrayPDI.get("description"))}'; 
1507				var subtitle = '${htmlUtil.escape(arrayPDI.get("subtitle"))}'; 
1508				var icon = 'fas fa-info'; 
1509				<#if arrayPDI.get("icon")?has_content> 
1510					var icon = '${arrayPDI.get("icon")}'; 
1511				</#if> 
1512				if(latLng){ 
1513				 
1514					latLng = latLng.replaceAll(' ', ''); 
1515					latLng = latLng.split(','); 
1516					 
1517					var fontAwesomeRoutePOIIcon = L.divIcon({ 
1518						className: 'marker-wrapper', 
1519						html: "<div class='marker-icon marker-icon-poi marker-icon-poi-min'><i class='"+icon+"'><!-- icon--></i></div>", 
1520						iconSize: [26, 30], 
1521						iconAnchor: [13, 5] 
1522					}); 
1523					 
1524					var popupContentTemplate = '<a data-articleid="'+poiArticleId+'" href="'+url+'" class="popup popup-service">'+ 
1525							'<span class="popup-image-wrapper" style="background-image: url('+image+');"><img src="'+image+'"/></span>'+ 
1526							'<span class="popup-body">'+ 
1527							'<span class="popup-subtitle">'+subtitle+'</span>'+ 
1528							'<span class="popup-title">'+title+'</span>'+ 
1529							'<span class="popup-desciption">'+description+'</span>'+ 
1530							'</span>'+ 
1531							'</a>'; 
1532					 
1533					var newNodeObject = A.Node.create(popupContentTemplate); 
1534					newNodeObject.on('click', function(event){ 
1535						event.preventDefault(); 
1536						var nodeArticleId = this.attr('data-articleid'); 
1537						${namespace}getArticleDisplay(nodeArticleId); 
1538					}); 
1539 
1540					var marker = L.marker([latLng[0],latLng[1]], 
1541
1542							"icon": fontAwesomeRoutePOIIcon, 
1543							"title": title 
1544
1545					); 
1546					marker.articleId = 'poi-'+poiArticleId; 
1547					marker.bindPopup(newNodeObject.getDOMNode()).addTo(map); 
1548					marker.on('popupopen', function(e) { 
1549						map.panTo(this.getLatLng()); 
1550					}); 
1551					marker.getPopup().on('remove', function() { 
1552						${namespace}closeArticleDisplay(); 
1553					}); 
1554					 
1555					poiMarkers.push(marker); 
1556
1557			</#list> 
1558		</#if> 
1559		A.all('.card.poi').each(function(item){ 
1560			item.on('mouseover', function(event){ 
1561				var articleId = item.getAttribute("data-id"); 
1562				${namespace}markerPopup(articleId, true); 
1563			}); 
1564			item.on('mouseout', function(event){ 
1565				var articleId = item.getAttribute("data-id"); 
1566				${namespace}markerPopup(articleId, false); 
1567			}); 
1568		}); 
1569		 
1570		//RouteNears 
1571		routesNearPolylines = []; 
1572		<#list gpxRoutes as gpxRoute> 
1573			var polylinePopupHTML = '<a href="${gpxRoute.get("url")}" class="popup">'+ 
1574				'<span class="popup-image-wrapper" style="background-image: url(${gpxRoute.get("image")});"><img src="${gpxRoute.get("image")}"/>'+ 
1575				<#--'<span class="ribbon ribbon-circle"><span class="ribbon-text ">${gpxRoute.get("distance")}</span><span class="ribbon-text ribbon-text-meta">km</span></span>'+--> 
1576				'</span>'+ 
1577				'<span class="popup-body">'+ 
1578				'<span class="popup-title" style="color: #${gpxRoute.get("color")};">${htmlUtil.escape(gpxRoute.get("title"))}</span>'+ 
1579				'<span class="d-block"><span class="icon fas fa-map-marker-alt"><span class="hide-accessible">${languageUtil.get(request, "infoasturias-route-lugar-inicio-fin")}</span></span> <span class="value important text-uppercase">${htmlUtil.escape(gpxRoute.get("startEnd"))}</span></span>'+ 
1580				'<span class="d-block"><span class="icon fas fa-bicycle"><span class="hide-accessible">${languageUtil.get(request, "infoasturias-route-recorridos")}</span></span> <span class="value">${htmlUtil.escape(gpxRoute.get("routeTypes"))}</span></span>'+ 
1581				'<span class="d-block"><span class="icon fas fa-mountain"><span class="hide-accessible">${languageUtil.get(request, "infoasturias-route-ibp-index")}</span></span> <span class="important">IBP Index: </span> <span class="value">${gpxRoute.get("ibp")}</span></span>'+ 
1582				'<span class="d-block"><span class="icon fas fa-bicycle"><span class="hide-accessible">${languageUtil.get(request, "mode")}</span></span> <span class="value">${gpxRoute.get("mode")}</span></span>'+ 
1583				'</span>'+ 
1584				'</a>'; 
1585			var polyline = L.polyline(${gpxRoute.get("coordinates")}, {color: '#cacaca', opacity: 1, weight: 3, className: "bordered-polyline"}).bindPopup(polylinePopupHTML); 
1586			polyline.articleId = 'route-near-${gpxRoute.get("articleId")}'; 
1587			polyline.flag = true; 
1588			polyline.on('mouseover', function(e) { 
1589				var layer = e.target; 
1590				layer.setStyle({ 
1591					color: '#cacaca', 
1592					opacity: 1, 
1593					weight: 5 
1594				}); 
1595				layer.bringToFront(); 
1596			}); 
1597			polyline.on('mouseout', function(e) { 
1598				if(this.flag){ 
1599					var layer = e.target; 
1600					layer.setStyle({ 
1601						color: '#cacaca', 
1602						opacity: 0.9, 
1603						weight: 3 
1604					}); 
1605
1606			}); 
1607			polyline.on('click', function(e) { 
1608				var popup = this.getPopup(); 
1609				var layer = e.target; 
1610				layer.setStyle({ 
1611					color: '#cacaca', 
1612					opacity: 1, 
1613					weight: 5 
1614				}); 
1615				this.flag = false; 
1616				layer.bringToFront(); 
1617				popup.setLatLng(this.getCenter()); 
1618				popup.openPopup(); 
1619				map.setView(this.getCenter()); 
1620				var pixelesCenter = map.latLngToContainerPoint(this.getCenter()); 
1621				pixelesCenter.y -= map.getSize().y * 0.2; 
1622				var centerMap = map.containerPointToLatLng(pixelesCenter); 
1623				map.setView(centerMap); 
1624			}); 
1625			polyline.on('popupclose', function(e) { 
1626				var layer = e.target; 
1627				layer.setStyle({ 
1628					color: '#cacaca', 
1629					opacity: 0.9, 
1630					weight: 3 
1631				}); 
1632			}); 
1633			routesNearPolylines.push(polyline); 
1634 
1635			var popupTextStartTemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-subtitle">${languageUtil.get(request, 'infoasturias-route-start')}</span><span class="popup-title">${htmlUtil.escape(gpxRoute.get("title"))}</span></span></span>'; 
1636			var popupTextEndTemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-subtitle">${languageUtil.get(request, 'infoasturias-route-end')}</span><span class="popup-title">${htmlUtil.escape(gpxRoute.get("title"))}</span></span></span>'; 
1637			 
1638			//Markers Route Near Start/End 
1639			var latLng = '${gpxRoute.get("coordinatesStart")}'; 
1640			latLng = latLng.replaceAll(' ', ''); 
1641			latLng = latLng.split(','); 
1642			var markerRouteStart = L.marker([latLng[0],latLng[1]], 
1643
1644					"icon": fontAwesomeRouteNearIcon, 
1645					"title": '${languageUtil.format(request, 'infoasturias-route-start-x', '${htmlUtil.escape(gpxRoute.get("title"))}')}' 
1646
1647			).bindPopup(popupTextStartTemplate).addTo(routesNearPolylinesGroup); 
1648			var latLng = '${gpxRoute.get("coordinatesEnd")}'; 
1649			latLng = latLng.replaceAll(' ', ''); 
1650			latLng = latLng.split(','); 
1651			var markerRouteEnd = L.marker([latLng[0],latLng[1]],  
1652
1653					"icon": fontAwesomeRouteNearIcon, 
1654					"title": '${languageUtil.format(request, 'infoasturias-route-end-x', '${htmlUtil.escape(gpxRoute.get("title"))}')}' 
1655
1656			).bindPopup(popupTextEndTemplate).addTo(routesNearPolylinesGroup); 
1657 
1658			routesNearPolylinesGroup.addLayer(polyline); 
1659 
1660		</#list> 
1661		//List 
1662		A.all('.route-near').each(function(item){ 
1663			item.on('mouseover', function(event){ 
1664				var articleId = item.getAttribute("data-id"); 
1665				${namespace}polylinePopup(articleId, true); 
1666			}); 
1667			item.on('mouseout', function(event){ 
1668				var articleId = item.getAttribute("data-id"); 
1669				${namespace}polylinePopup(articleId, false); 
1670			}); 
1671		}); 
1672 
1673		var gropedOverlayslehen = { 
1674			"${languageUtil.get(locale, "infoasturias-routes-near")}": routesNearPolylinesGroup 
1675
1676		var layerControl = L.control.layers('', gropedOverlayslehen, { 
1677			collapsed: false, 
1678			position:'topleft' 
1679		}); 
1680		layerControl.addTo(map); 
1681	 
1682	//Elevation 
1683 
1684	var elevation_options = { 
1685 
1686		// Default chart colors: theme lime-theme, magenta-theme, ... 
1687		theme: "custom-theme", 
1688		 
1689		useHeightIndicator: true,  
1690 
1691		// Chart container outside/inside map container 
1692		detached: true, 
1693 
1694		// if (detached), the elevation chart container 
1695		elevationDiv: "#elevation-div-${articleId}", 
1696 
1697		// if (!detached) autohide chart profile on chart mouseleave 
1698		autohide: false, 
1699 
1700		// if (!detached) initial state of chart profile control 
1701		collapsed: false, 
1702 
1703		// if (!detached) control position on one of map corners 
1704		position: "topright", 
1705 
1706		// Toggle close icon visibility 
1707		closeBtn: false, 
1708 
1709		// Autoupdate map center on chart mouseover. 
1710		followMarker: true, 
1711 
1712		// Autoupdate map bounds on chart update. 
1713		autofitBounds: false, 
1714 
1715		// Chart distance/elevation units. 
1716		imperial: false, 
1717 
1718		// [Lat, Long] vs [Long, Lat] points. (leaflet default: [Lat, Long]) 
1719		reverseCoords: false, 
1720 
1721		// Acceleration chart profile: true || "summary" || "disabled" || false 
1722		acceleration: false, 
1723 
1724		// Slope chart profile: true || "summary" || "disabled" || false 
1725		slope: false, 
1726 
1727		// Speed chart profile: true || "summary" || "disabled" || false 
1728		speed: false, 
1729 
1730		// Altitude chart profile: true || "summary" || "disabled" || false 
1731		altitude: true, 
1732 
1733		// Display time info: true || "summary" || false 
1734		time: false, 
1735 
1736		// Display distance info: true || "summary" || false 
1737		distance: true, 
1738 
1739		// Summary track info style: "inline" || "multiline" || false 
1740		summary: false, 
1741 
1742		// Download link: "link" || false || "modal" 
1743		downloadLink: false, 
1744 
1745		// Toggle chart ruler filter 
1746		ruler: true, 
1747 
1748		// Toggle chart legend filter 
1749		legend: false, 
1750 
1751		// Toggle "leaflet-almostover" integration 
1752		almostOver: true, 
1753 
1754		// Toggle "leaflet-distance-markers" integration 
1755		distanceMarkers: false, 
1756 
1757		// Toggle "leaflet-edgescale" integration 
1758		edgeScale: false, 
1759 
1760		// Toggle "leaflet-hotline" integration 
1761		hotline: true, 
1762 
1763		// Display track datetimes: true || false 
1764		timestamps: false, 
1765 
1766		// Display track waypoints: true || "markers" || "dots" || false 
1767		waypoints: true, 
1768 
1769		// Toggle custom waypoint icons: true || { associative array of <sym> tags } || false 
1770		wptIcons: false, 
1771 
1772		// Toggle waypoint labels: true || "markers" || "dots" || false 
1773		wptLabels: false, 
1774 
1775		// Render chart profiles as Canvas or SVG Paths 
1776		preferCanvas: false, 
1777 
1778		height: 200, 
1779	}; 
1780 
1781	var controlElevation = L.control.elevation(elevation_options).addTo(map); 
1782	controlElevation.load("${gpxRutaPath}"); 
1783 
1784	//Center 
1785	var polyline = L.polyline(${gpxRoute.get("coordinates")}); 
1786	map.fitBounds(polyline.getBounds()); 
1787 
1788	<#assign poiImages = { 
1789		"Beach": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/playa.png", 
1790		<#--"Bike Trail": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/rutaini-ew.png",--> 
1791		<#--"Bike Trail": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/rutaini-we.png",--> 
1792		<#--"Building": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/ciudad.png",--> 
1793		"City Hall": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/ferrocarril.png", 
1794		<#--"Civil": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/rutafin.png",--> 
1795		<#--"Flag, Green": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/ini-vv.png",--> 
1796		<#--"Flag, Red": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/fin-vv.png",--> 
1797		"Light": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/faro.png", 
1798		<#--"Navaid, Blue": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/cultural.png",--> 
1799		<#--"Navaid, Green": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/natural.png",--> 
1800		<#--"Navaid, Red": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/warning.png",--> 
1801		<#--"Residence": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/pueblo.png",--> 
1802		"Scenic Area": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/paisaje.png", 
1803		"Summit": "/o/turismo-asturias-theme/css/images/cicloturismo/pois/cumbre.png" 
1804	}> 
1805	<#assign poiFontAwesome = { 
1806		"": "fas fa-info", 
1807		"Beach": "fas fa-umbrella-beach", 
1808		<#--"Bike Trail": "",--> 
1809		<#--"Bike Trail": "",--> 
1810		<#--"Building": "",--> 
1811		"City Hall": "fas fa-train", 
1812		<#--"Civil": "",--> 
1813		<#--"Flag, Green": "",--> 
1814		<#--"Flag, Red": "",--> 
1815		"Light": "fas fa-monument", 
1816		<#--"Navaid, Blue": "",--> 
1817		<#--"Navaid, Green": "",--> 
1818		<#--"Navaid, Red": "",--> 
1819		<#--"Residence": "",--> 
1820		"Scenic Area": "fas fa-camera", 
1821		"Summit": "fas fa-mountain" 
1822	}> 
1823	 
1824	<#if validator.isNotNull(gpxPOIRoute)> 
1825		<#if gpxPOIRoute.has("wpts") && validator.isNotNull(gpxPOIRoute.has("wpts"))> 
1826			<#assign wptJSONArray = jsonFactoryUtil.createJSONArray(gpxPOIRoute.get("wpts"))! /> 
1827			<#list 0..wptJSONArray.length() as i> 
1828				<#assign wptJSONObject = wptJSONArray.get(i)! /> 
1829				<#if validator.isNotNull(wptJSONObject)> 
1830 
1831					<#assign wptName = wptJSONObject.get("name")! /> 
1832					<#assign wptSym = wptJSONObject.get("sym")! /> 
1833					<#assign wptLat = wptJSONObject.get("lat")! /> 
1834					<#assign wptLon = wptJSONObject.get("lon")! /> 
1835					<#assign wptEle = wptJSONObject.get("ele")! /> 
1836					<#assign wptSymImage = poiImages[wptSym]! /> 
1837					<#assign wptSymFontAwesome = poiFontAwesome[wptSym]! /> 
1838					<#if validator.isNotNull(wptSymFontAwesome)> 
1839 
1840						var divIcon = L.divIcon({ 
1841							className: 'marker-wrapper', 
1842							html: "<div class='marker-icon marker-icon-poi marker-icon-poi-min'><i class='${wptSymFontAwesome}'><!-- icon--></i></div>", 
1843							iconSize: [26, 30], 
1844							iconAnchor: [13, 30] 
1845						}); 
1846						var popupPOITemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-title">${htmlUtil.escape(wptName)}</span></span></span>'; 
1847						var marker = L.marker([${wptLat}, ${wptLon}],  
1848
1849								"icon": divIcon, 
1850								"title": '${htmlUtil.escape(wptName)}' 
1851
1852						).bindPopup(popupPOITemplate).addTo(map); 
1853						marker.on('popupopen', function(e) { 
1854							map.panTo(this.getLatLng()); 
1855						}); 
1856					</#if> 
1857				</#if> 
1858			</#list> 
1859		</#if> 
1860 
1861		<#-- TODO --> 
1862		<#assign dlFileEntryGPXPOI = dlTool.getDLFileEntryByPath(Documentos.GPXPOIRuta.data)!/> 
1863		<#if validator.isNotNull(dlFileEntryGPXPOI)> 
1864			<#assign document = saxReaderUtil.read(dlFileEntryGPXPOI.getContentStream())/> 
1865			<#assign root = document.getRootElement()/> 
1866			<#assign trks = root.elements("trk")!> 
1867			<#if validator.isNotNull(trks)> 
1868				<#list trks as trk> 
1869					<#assign trkName = trk.elementText("name")!> 
1870					<#assign trkseg = trk.element("trkseg")!> 
1871					<#if validator.isNotNull(trkseg)> 
1872						<#assign trkpts = trkseg.elements("trkpt")!> 
1873						<#if validator.isNotNull(trkpts)> 
1874							var trksegsLatLngs = []; 
1875							<#list trkpts as trkpt> 
1876								<#assign trksegLat = trkpt.attributeValue("lat")!> 
1877								<#assign trksegLon = trkpt.attributeValue("lon")!> 
1878								<#if validator.isNotNull(trksegLat) && validator.isNotNull(trksegLon)> 
1879									var trksegsLatLng = [${trksegLat}, ${trksegLon}]; 
1880									trksegsLatLngs.push(trksegsLatLng); 
1881								</#if> 
1882							</#list> 
1883							if(trksegsLatLngs.length>0){ 
1884								var popupGpxPOITemplate = '<span class="popup popup-service"><span class="popup-body"><span class="popup-title">${htmlUtil.escape(trkName)}</span></span></span>'; 
1885								var trkPolyline = L.polyline(trksegsLatLngs, {color: '#006db0', dashArray: '5, 10', lineCap: 'square', opacity: 1, weight: 5, className: "bordered-polyline-white"}).bindPopup(popupGpxPOITemplate).addTo(map); 
1886
1887						</#if> 
1888					</#if> 
1889				</#list> 
1890			</#if> 
1891		</#if> 
1892	</#if> 
1893	 
1894	//Functions 
1895	function ${namespace}markerPopup(articleId, hover){ 
1896		for (var i in poiMarkers){ 
1897			var marker = poiMarkers[i]; 
1898			var id = marker.articleId; 
1899			if (id == articleId){ 
1900				if(hover){ 
1901					marker.openPopup(); 
1902					map.panTo(marker.getLatLng()); 
1903				}else{ 
1904					//marker.closePopup(); 
1905
1906			}; 
1907
1908
1909	 
1910	function ${namespace}markerServicePopup(articleId, hover){ 
1911		for (var i in serviceMarkers){ 
1912			var marker = serviceMarkers[i]; 
1913			var id = marker.articleId; 
1914			if (id == articleId){ 
1915				if(hover){ 
1916					map.addLayer(marker); 
1917					marker.openPopup(); 
1918					map.panTo(marker.getLatLng()); 
1919				}else{ 
1920					//map.removeLayer(marker); 
1921					//marker.closePopup(); 
1922
1923			}; 
1924
1925
1926	 
1927	function ${namespace}polylinePopup(articleId, hover){ 
1928		for (var i in routesNearPolylines){ 
1929			var polyline = routesNearPolylines[i]; 
1930			if (map.hasLayer(routesNearPolylinesGroup)){ 
1931				var id = polyline.articleId; 
1932				if (id == articleId){ 
1933					if(hover){ 
1934						polyline.openPopup(); 
1935						polyline.setStyle({ 
1936							weight: 5, 
1937							opacity: 1 
1938						}); 
1939						map.panTo(polyline.getCenter()); 
1940						polyline.bringToFront(); 
1941					}else{ 
1942						polyline.setStyle({ 
1943							weight: 3, 
1944							opacity: 0.9 
1945						}); 
1946						polyline.closePopup(); 
1947
1948
1949
1950
1951
1952	 
1953	function ${namespace}toggleMarkersServicesStructure(structureId){ 
1954		 
1955		var item = A.one('#vocabulary-structure-id-'+structureId); 
1956		var button = A.one('#button-vocabulary-structure-id-'+structureId); 
1957		if(item){ 
1958			 
1959			var vocabularyWrapper = item.ancestor('.vocabulary-wrapper'); 
1960			if(!vocabularyWrapper.hasClass('selected')){ 
1961				vocabularyWrapper.all('.categories input').attr('checked',''); 
1962				vocabularyWrapper.all('.categories input').each(function(cat){ 
1963					cat.simulate('click'); 
1964				}); 
1965				vocabularyWrapper.addClass('selected'); 
1966				if(button){ 
1967					button.addClass('selected'); 
1968
1969			}else{ 
1970				vocabularyWrapper.all('.categories input').attr('checked','checked'); 
1971				vocabularyWrapper.all('.categories input').each(function(cat){ 
1972					cat.simulate('click'); 
1973				}); 
1974				vocabularyWrapper.removeClass('selected'); 
1975				if(button){ 
1976					button.removeClass('selected'); 
1977					var allNoSelectedButtons = true; 
1978					A.all('.button-vocabulary-structure').each(function(item){ 
1979						if(item.hasClass('selected')) 
1980							allNoSelectedButtons = false; 
1981					}); 
1982
1983
1984
1985
1986 
1987	Liferay.provide(window, '${namespace}closeArticleDisplay', function(){ 
1988		A.one("#article-display-container").hide('fadeOut'); 
1989		A.one("#search-container").show('fadeIn'); 
1990	}); 
1991 
1992	Liferay.provide(window, '${namespace}openArticleDisplay', function(){ 
1993		A.one("#search-container").hide(); 
1994		A.one("#article-display-container").show('fadeIn'); 
1995 
1996		//Map 
1997		var articleDisplayContainerMap = A.one("#article-display-container").one('.article-section-map script[type="text/javascript"]'); 
1998		if(articleDisplayContainerMap) 
1999			eval(articleDisplayContainerMap.html()); 
2000 
2001		//Scroll 
2002		var to = A.one('#article-display-container'); 
2003		if(to){ 
2004			var position = 100; 
2005			var toggleMap = A.one('#toggle-map'); 
2006			if(toggleMap && toggleMap.hasClass('active')){ 
2007				position = 0; 
2008				to = A.one('body'); 
2009
2010			var anim = new A.Anim({ 
2011				duration: 0.2, 
2012				node:  A.getWin(), 
2013				to: { 
2014					scroll: [0, to.getY() - position] 
2015
2016			}).run(); 
2017
2018	}); 
2019 
2020    Liferay.provide(window, '${namespace}getArticleDisplay', function(articleId){ 
2021	 
2022        var url = "${themeDisplay.getURLPortal()+themeDisplay.getLayout().getFriendlyURL(locale)}?p_p_id=${themeDisplay.getPortletDisplay().getId()}&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=journalDisplayContent&p_p_cacheability=cacheLevelPage&_${themeDisplay.getPortletDisplay().getId()}_articleId="+articleId;	 
2023        A.io.request(url, { 
2024            method: 'GET', 
2025            type: 'HTML', 
2026            on: { 
2027                success: function() { 
2028                    var journalArticleContentDisplay = this.get('responseData'); 
2029                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("col-md-6", "col-12"); 
2030                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-info-wrapper", ""); 
2031                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-info-table", ""); 
2032                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-info-table-row", ""); 
2033                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-info-table-cell", ""); 
2034                    journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-info", "article-info m-0 px-4 pt-4"); 
2035					//journalArticleContentDisplay = journalArticleContentDisplay.replaceAll("article-section-map", "article-section-map hide"); 
2036                    A.one("#article-display").html(journalArticleContentDisplay); 
2037                    ${namespace}openArticleDisplay(); 
2038
2039
2040        }); 
2041	}); 
2042		 
2043	</#if> 
2044 
2045	var closeArticleDisplayNode = A.one("#close-article-display"); 
2046	if(closeArticleDisplayNode){ 
2047		closeArticleDisplayNode.on('click', function(event) { 
2048			${namespace}closeArticleDisplay(); 
2049		}); 
2050
2051 
2052	A.all(".template-layout-map .item-card").each(function(item) { 
2053        item.on("click", function(event) { 
2054            event.preventDefault(); 
2055            var articleId = item.attr("data-articleid"); 
2056            ${namespace}getArticleDisplay(articleId); 
2057        }); 
2058    }); 
2059	 
2060	//Map Mobile Toggle 
2061	mapMobileToggle('${languageUtil.get(request, "infoasturias-abrir-mapa")}','${languageUtil.get(request, "infoasturias-cerrar-mapa")}', map, '.leaflet-elevation-wrapper'); 
2062	var toggleMap = A.one('#toggle-map'); 
2063	if(toggleMap){ 
2064		toggleMap.on('click', function(event){ 
2065			A.one('.template-layout-map').toggleClass('template-layout-map-mobile'); 
2066			A.one('#content').toggleClass('content-map-mobile'); 
2067			map.closePopup(); 
2068			if(this.hasClass('active')){ 
2069				${namespace}closeArticleDisplay(); 
2070				//Scroll 
2071				var to = A.one('body'); 
2072				if(to){ 
2073					var anim = new A.Anim({ 
2074						duration: 0.2, 
2075						node:  A.getWin(), 
2076						to: { 
2077							scroll: [0, to.getY()-100] 
2078
2079					}).run(); 
2080
2081
2082		}); 
2083
2084     
2085</@>