Si è verificato un errore nell'elaborarazione del modello.
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@6f526bf0"; 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: '© <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</@>