An error occurred while processing the template.
For "." left-hand operand: Expected a hash, but this has evaluated to a string (wrapper: f.t.SimpleScalar): ==> lookAtLatitude [in template "37703#37743#1559015" at line 631, column 169] ---- FTL stack trace ("~" means nesting-related): - Failed at: ${lookAtLatitude.getText()} [in template "37703#37743#1559015" at line 631, column 167] ----
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
6<#-- Reserved vbles -->
7<#assign title = .vars['reserved-article-title'].data>
8<#assign articleId=.vars["reserved-article-id"].data />
9<#assign description=.vars["reserved-article-description"].data />
10<#assign smallImageUrl=.vars["reserved-article-small-image-url"].data />
11<#assign date=.vars["reserved-article-display-date"].data />
12<#assign request = .vars['request']>
13
14<#-- Init -->
15<#assign assetEntry = journalTool.getAssetEntryByArticleId(groupId, articleId)>
16<#assign journalArticle = journalTool.getJournalArticleByAssetEntry(assetEntry)>
17<#assign articleURL = themeDisplay.getURLPortal()+themeDisplay.getURLCurrent()>
18<#assign articleSocialBookmarks = themeDisplay.getThemeSetting("article-social-bookmarks")!>
19<#assign layoutSetBannerPath = layoutTool.getLayoutSetBannerPath(groupId, themeDisplay.getLayout().isPrivateLayout())!>
20<#assign articleMainImageThumbnail3 = dlTool.getThumbnail(smallImageUrl, "3", layoutSetBannerPath)! />
21<#assign articleMainImageThumbnail1 = dlTool.getThumbnail(smallImageUrl, "1")! />
22<#assign ddmStructureNameNormalize = "template-${friendlyURLNormalizerTool.normalize(journalArticle.getDDMStructure().getName(localeUtil.getDefault()))}" />
23<#assign baseUrl = themeDisplay.getURLPortal()/>
24
25<#-- Build -->
26<#if Nombre.data?has_content>
27 <#assign title = Nombre.data>
28</#if>
29<#assign address = []>
30<#if Contacto.Zona.data?has_content>
31 <#assign address = address + [Contacto.Zona.data] />
32</#if>
33
34<#-- KML -->
35<#assign dlFileEntryKML = dlTool.getDLFileEntryByPath(TrazadoRuta.getData())!/>
36<#assign document = "" />
37<#assign lookAtLongitude = ""/>
38<#assign lookAtLatitude = ""/>
39<#assign coordinates_all = "" />
40<#if validator.isNotNull(dlFileEntryKML)>
41 <#assign document = saxReaderUtil.read(dlFileEntryKML.getContentStream())/>
42 <#assign rootElement = document.getRootElement()/>
43 <#assign xpath = saxReaderUtil.createXPath("//root:Camera/root:longitude", "root", "http://www.opengis.net/kml/2.2")/>
44 <#assign lookAtLongitude = xpath.selectSingleNode(document)!>
45 <#assign xpath = saxReaderUtil.createXPath("//root:Camera/root:latitude", "root", "http://www.opengis.net/kml/2.2")/>
46 <#assign lookAtLatitude = xpath.selectSingleNode(document)!>
47</#if>
48
49<#if validator.isNotNull(document) && validator.isNull(lookAtLongitude)>
50 <#assign xpath = saxReaderUtil.createXPath("//root:LookAt/root:longitude", "root", "http://www.opengis.net/kml/2.2")/>
51 <#assign lookAtLongitude = xpath.selectSingleNode(document)!>
52</#if>
53
54<#if validator.isNotNull(document) && validator.isNull(lookAtLatitude)>
55 <#assign xpath = saxReaderUtil.createXPath("//root:LookAt/root:latitude", "root", "http://www.opengis.net/kml/2.2")/>
56 <#assign lookAtLatitude = xpath.selectSingleNode(document)!>
57</#if>
58
59<#-- En caso de que no haya ni lookAt ni camera -->
60<#if validator.isNotNull(document) && (validator.isNull(lookAtLongitude) || validator.isNull(lookAtLatitude))>
61 <#assign xpath = saxReaderUtil.createXPath("//root:Placemark/root:LineString/root:coordinates", "root", "http://www.opengis.net/kml/2.2")/>
62 <#assign coordinates_all = xpath.selectSingleNode(document)!>
63 <#assign coordinates_array = coordinates_all.data?split(" ")>
64 <#assign coordinate_middle_pos = getterUtil.getInteger(coordinates_array?size/2)>
65 <#assign coordinate_middle = coordinates_array[coordinate_middle_pos]?split(",")>
66 <#assign lookAtLongitude = coordinate_middle[0]>
67 <#assign lookAtLatitude = coordinate_middle[1]>
68</#if>
69
70<#if validator.isNotNull(document) && validator.isNotNull(coordinates_all) >
71 <#assign xpath = saxReaderUtil.createXPath("//root:Placemark/root:LineString/root:coordinates", "root", "http://www.opengis.net/kml/2.2")/>
72 <#assign coordinates_all = xpath.selectSingleNode(document)!>
73 <#assign coordinates_array = coordinates_all.getData()?split(" ")/>
74 <#assign coordinates_start = coordinates_array[0]?split(",")/>
75</#if>
76
77<#assign tramosAlternativosArray = []/>
78
79<#if Tramos.getSiblings()?size!=0>
80
81 <#list Tramos.getSiblings() as tramo>
82 <#if tramo.TramoAlternativo.getData()=="true">
83 <#assign tramosAlternativosArray = tramosAlternativosArray + ["true"] />
84 <#else>
85 <#assign tramosAlternativosArray = tramosAlternativosArray + [ "false" ] />
86 </#if>
87
88 </#list>
89
90</#if>
91
92<#-- Id de los tramos -->
93<#assign counter = 1>
94<#assign count = 0>
95
96<#-- Obtener el nombre de los tramos -->
97<#assign xpath = saxReaderUtil.createXPath("//root:LineString/ancestor::root:Placemark/root:name", "root", "http://www.opengis.net/kml/2.2")>
98<#assign placemarksName = xpath.selectNodes(document)>
99
100<#assign tipoRuta = stringUtil.lowerCase(TipoRuta.getData())/>
101<#assign modalURL = "https://www06.internet.asac.as/web/turismo-asturias-migracion/sample-rutas/ruta-slide-"/>
102
103<article class="template ${ddmStructureNameNormalize}" role="article" itemscope itemtype="http://schema.org/TouristicAttraction">
104
105 <header class="article-header-wrapper row no-gutters">
106
107 <div class="article-header-container article-header-container-static">
108 <div class="container">
109 <div class="row no-gutters">
110 <div class="col-md-6">
111 <div class="article-image" style="background-image: url('${articleMainImageThumbnail3}')">
112 <img class="sr-only" src="${articleMainImageThumbnail3}" alt="${languageUtil.format(request,'go-to-x','image')} ${title}" itemprop="image"/>
113 </div>
114 </div>
115 <div class="article-info-wrapper col-md-6">
116 <div class="article-info">
117
118 <div class="article-title" itemprop="name">${title}</div>
119 <div class="article-list-wrapper">
120
121 <ul class="article-list list-unstyled article-list-info">
122 <li class="article-list-item mb-4">
123 <span class="fas fa-map-marker-alt">
124 <span class="hide-accessible">${languageUtil.get(request,"address")}</span>
125 </span>
126 <span class="field-wrapper" itemprop="address">
127 <span class="important">
128 <#assign concejos = []/>
129 <#list Contacto.Concejos.getSiblings() as Item>
130 <#if Item.data?has_content>
131 <#assign concejos = [Item.data] />
132 </#if>
133 </#list>
134 ${stringUtil.merge(concejos)}
135 </span>
136 <span class="text d-block">${stringUtil.merge(address)}</span>
137 </span>
138 </li>
139 </ul>
140
141 <div class="article-info-table article-info-table-fixed">
142 <div class="article-info-table-row">
143 <div class="article-info-table-cell">
144 <div class="article-list-wrapper">
145 <ul class="article-list list-unstyled article-list-info info-route">
146
147 <#if Contacto.Distancia.data?has_content>
148 <li class="article-list-item">
149 <span class="fas fa-ruler-horizontal">
150 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-distancia")}</span>
151 </span>
152 <span class="field-wrapper">
153 <span class="field">${languageUtil.get(request, "infoasturias-distancia")}:</span>
154 <#list Contacto.Distancia.getSiblings() as Item>
155 <span class="text btn btn-primary btn-thin text-capitalize"><span class="font-size-11 text-distance">${Item.data}</span> kms</span><#if Item_has_next> </#if>
156 </#list>
157 </span>
158 </li>
159 </#if>
160
161 <#if Contacto.Dificultad.data?has_content && tipoRuta!="coche">
162 <#assign dificultadMap = {
163 "1": languageUtil.get(request,"infoasturias-dificultad-baja"),
164 "2": languageUtil.get(request,"infoasturias-dificultad-media"),
165 "3": languageUtil.get(request,"infoasturias-dificultad-alta")
166 }
167 />
168 <li class="article-list-item">
169 <span class="fas fa-layer-group">
170 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-dificultad")}</span>
171 </span>
172 <span class="field-wrapper">
173 <span class="field">${languageUtil.get(request, "infoasturias-dificultad")}:</span>
174 <span class="text">
175 <span>${dificultadMap[Contacto.Dificultad.data]}</span>
176 </span>
177 </span>
178 </li>
179 </#if>
180
181 <#if Contacto.Codigo.data?has_content>
182 <li class="article-list-item">
183 <span class="fas fa-info">
184 <span class="hide-accessible">${languageUtil.get(request,"code")}</span>
185 </span>
186 <span class="field-wrapper">
187 <span class="field">${languageUtil.get(request, "code")}:</span>
188 <span class="text">
189 <span>${Contacto.Codigo.data}</span>
190 </span>
191 </span>
192 </li>
193 </#if>
194
195 <#if Contacto.Altitud.data?has_content>
196 <li class="article-list-item">
197 <span class="fas fa-ruler-vertical">
198 <span class="hide-accessible">${languageUtil.get(request,"metadata.Geographic.ALTITUDE")}</span>
199 </span>
200 <span class="field-wrapper">
201 <span class="field">${languageUtil.get(request, "metadata.Geographic.ALTITUDE")}:</span>
202 <span class="text">${Contacto.Altitud.data}</span>
203 </span>
204 </li>
205 </#if>
206
207 <#if Contacto.Desnivel.data?has_content>
208 <li class="article-list-item">
209 <span class="fas fa-chart-line">
210 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-desnivel")}</span>
211 </span>
212 <span class="field-wrapper">
213 <span class="field">${languageUtil.get(request, "infoasturias-desnivel")}:</span>
214 <span class="text">${Contacto.Desnivel.data}</span>
215 </span>
216 </li>
217 </#if>
218 </ul>
219 </div>
220 </div>
221 <div class="article-info-table-cell">
222 <div class="article-list-wrapper">
223 <ul class="article-list list-unstyled article-list-info">
224 <#if Contacto.TiempoBTT.data?has_content>
225 <li class="article-list-item">
226 <span class="fas fa-bicycle">
227 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-btt")}</span>
228 </span>
229 <span class="field-wrapper">
230 <span class="field">${languageUtil.get(request, "infoasturias-btt")}:</span>
231 <span class="text">${Contacto.TiempoBTT.data}</span>
232 </span>
233 </li>
234 </#if>
235
236 <#if Contacto.TiempoAPie.data?has_content>
237 <li class="article-list-item">
238 <span class="fas fa-shoe-prints">
239 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-a-pie")}</span>
240 </span>
241 <span class="field-wrapper">
242 <span class="field">${languageUtil.get(request, "infoasturias-a-pie")}:</span>
243 <span class="text">${Contacto.TiempoAPie.data}</span>
244 </span>
245 </li>
246 </#if>
247
248 <#if Contacto.TiempoCoche.data?has_content>
249 <li class="article-list-item">
250 <span class="fas fa-car">
251 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-coches")}</span>
252 </span>
253 <span class="field-wrapper">
254 <span class="field">${languageUtil.get(request, "infoasturias-coches")}:</span>
255 <span class="text">${Contacto.TiempoCoche.data}</span>
256 </span>
257 </li>
258 </#if>
259
260 <#if Contacto.TiempoViasVerdes.data?has_content>
261 <li class="article-list-item">
262 <span class="fas fa-route">
263 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-vias-verdes")}</span>
264 </span>
265 <span class="field-wrapper">
266 <span class="field">${languageUtil.get(request, "infoasturias-vias-verdes")}:</span>
267 <span class="text">${Contacto.TiempoViasVerdes.data}</span>
268 </span>
269 </li>
270 </#if>
271
272 <#if Contacto.TiempoAscension.data?has_content>
273 <li class="article-list-item">
274 <span class="fas fa-hiking">
275 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-ascension")}</span>
276 </span>
277 <span class="field-wrapper">
278 <span class="field">${languageUtil.get(request, "infoasturias-ascension")}:</span>
279 <span class="text">${Contacto.TiempoAscension.data}</span>
280 </span>
281 </li>
282 </#if>
283 </ul>
284 </div>
285 </div>
286 </div>
287 <div class="article-info-table-row">
288 <div class="article-info-table-cell">
289 <div class="article-list-wrapper">
290 <ul class="article-list list-unstyled article-list-info">
291 <#if Contacto.SituacionGeografica.data?has_content>
292 <li class="article-list-item">
293 <span class="fas fa-map-marked-alt">
294 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-situacion-geografica")}</span>
295 </span>
296 <span class="field-wrapper">
297 <span class="field">${languageUtil.get(request, "infoasturias-situacion-geografica")}:</span>
298 <span class="text">${Contacto.SituacionGeografica.data}</span>
299 </span>
300 </li>
301 </#if>
302
303 <#if Contacto.PuntoDePartida.data?has_content>
304 <li class="article-list-item">
305 <span class="fas fa-map-marker">
306 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-punto-de-partida")}</span>
307 </span>
308 <span class="field-wrapper">
309 <span class="field">${languageUtil.get(request, "infoasturias-punto-de-partida")}:</span>
310 <span class="text">${Contacto.PuntoDePartida.data}</span>
311 </span>
312 </li>
313 </#if>
314
315 <#if TipoRuta.data?has_content>
316 <li class="article-list-item hide"><#-- Se oculta por indicación de Noemí 27062022 -->
317 <span class="fas fa-route">
318 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-tipo-de-ruta")}</span>
319 </span>
320 <span class="field-wrapper">
321 <span class="field">${languageUtil.get(request, "infoasturias-tipo-de-ruta")}:</span>
322 <span class="text">${TipoRuta.data}</span>
323 </span>
324 </li>
325 </#if>
326
327 <#if Contacto.TipoDeRecorrido.data?has_content>
328 <li class="article-list-item">
329 <span class="fas fa-route">
330 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-tipo-recorrido")}</span>
331 </span>
332 <span class="field-wrapper">
333 <span class="field">${languageUtil.get(request, "infoasturias-tipo-recorrido")}:</span>
334 <span class="text">${Contacto.TipoDeRecorrido.data}</span>
335 </span>
336 </li>
337 </#if>
338 </ul>
339 </div>
340 </div>
341 <div class="article-info-table-cell">
342 <div class="article-list-wrapper">
343 <ul class="article-list list-unstyled article-list-info">
344 <#if Folletos.Folleto.data?has_content>
345 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Folletos.Folleto.data) />
346 <#if validator.isNotNull(dlFileEntry)>
347 <#assign downloadURL = "/documents/${groupId}/${dlFileEntry.getUuid()}" />
348 <#assign ext = dlFileEntry.getExtension()/>
349 <li class="article-list-item document document-${ext}">
350 <i class="far fa-file-pdf"></i>
351 <span class="field-wrapper">
352 <span class="field">${languageUtil.get(request, "visuality-issuu")}:</span>
353 <span class="text">
354 <#list Folletos.Folleto.getSiblings() as Item>
355 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Item.data) />
356 <#if validator.isNotNull(dlFileEntry)>
357 <#assign downloadURL = "/documents/${groupId}/${dlFileEntry.getUuid()}" />
358 <a href="${downloadURL}" title='${dlFileEntry.getTitle()}' class="">${dlFileEntry.getTitle()}</a><#if Item_has_next>, </#if>
359 </#if>
360 </#list>
361 </span>
362 </span>
363 </li>
364 </#if>
365 </#if>
366
367 <#if TrazadoRuta.data?has_content || TrazadoRutaGPX.data?has_content>
368 <li class="article-list-item document">
369 <span class="far fa-file">
370 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-trazado-de-la-ruta")}</span>
371 </span>
372 <span class="field-wrapper">
373 <span class="field">${languageUtil.get(request, "infoasturias-trazado-de-la-ruta")}:</span>
374 <span class="text">
375
376 <#assign tracks = [] />
377 <#if TrazadoRuta.data?has_content>
378 <#assign tracks = tracks + [TrazadoRuta.data] />
379 </#if>
380 <#if TrazadoRutaGPX.data?has_content >
381 <#assign tracks = tracks + [TrazadoRutaGPX.data] />
382 </#if>
383
384 <#if tracks?has_content >
385 <#list tracks as track>
386 <#assign dlFileEntryTrack = dlTool.getDLFileEntryByPath(track) />
387 <#if validator.isNotNull(dlFileEntryTrack)>
388 <#assign downloadURLkml = "/documents/${groupId}/${dlFileEntryTrack.getUuid()}" />
389 <#assign extKML = dlFileEntryTrack.getExtension()/>
390 <a href="${downloadURLkml}" class="${extKML}" title="${languageUtil.get(request,'infoasturias-download')} ${extKML}">${languageUtil.get(request,'infoasturias-download')} ${extKML}</a><#if track?has_next>, </#if>
391 </#if>
392 </#list>
393 </#if>
394
395 </span>
396 </span>
397 </li>
398 </#if>
399 </ul>
400 </div>
401 </div>
402 </div>
403 </div>
404 </div>
405 </div>
406 </div>
407 </div>
408 </div>
409 </div>
410 </header>
411
412 <div class="sheet sheet-lg">
413
414
415 <div class="article-great <#if validator.isNull(Informacion.Resumen.data)>hide</#if>">
416 <div class="route-resume-tracks-box hide">
417 <div class="route-resume-tracks">
418 <div class="route-resume-track-marker route-resume-track-marker-first"><div class="route-point-text"></div><div class="route-km-text">Km 0</div></div>
419 <div class="route-resume-track-marker route-resume-track-marker-last"><div class="route-point-text"></div><div class="route-km-text">Km 0</div></div>
420 </div>
421 </div>
422 <#if Informacion.Resumen.data?has_content>
423 <p>${htmlUtil.extractText(Informacion.Resumen.data)}</p>
424 </#if>
425 </div>
426
427
428
429 <#assign hasTab1 = Contacto.ContactoTexto.data?has_content || Informacion.InformacionTexto.data?has_content>
430 <#assign hasTab2 = Geolocalizacion.Coordenadas.data?has_content || validator.isNotNull(TrazadoRuta.getData())>
431 <#assign hasTab3 = Informacion.Itinerario.data?has_content>
432 <#assign hasTab4 = Informacion.TextoTramos.data?has_content || validator.isNotNull(Tramos.TramoAlternativo.data) || Tramos.OrigenDestino.data?has_content || Tramos.DistanciaTramo.data?has_content || Tramos.DescripcionTramo.data?has_content>
433 <#assign hasTab5 = Detalle.DetalleTexto.data?has_content || Detalle.DetalleImagen.data?has_content>
434 <#assign showFirstTab = true>
435
436 <div class="article-accordion accordion">
437
438 <#if Visualizador.Slide.getData()?has_content>
439 <div class="slick article-slick article-section <#if Visualizador.Slide.getSiblings()?size==1>hide</#if>">
440 <#list Visualizador.Slide.getSiblings() as Slide>
441 <#if validator.isNotNull(Slide.getData()) || validator.isNotNull(Slide.SlideUrl.getData())>
442 <#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! />
443 <#assign slideThumbnail2 = dlTool.getThumbnailByJSON(Slide.data, "2")! />
444 <#assign slidePath = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
445 <#assign slideUrl = Slide.SlideUrl.data />
446 <#assign dataMap = "" />
447
448 <#if slideUrl?has_content>
449
450 <#assign slideTitle = "${languageUtil.get(request, 'video')} ${Slide?index}" />
451 <#if Slide.SlideTitulo.data?has_content>
452 <#assign slideTitle = Slide.SlideTitulo.data />
453 </#if>
454
455 <#-- Youtube -->
456 <#assign slideUrl = stringUtil.replace(slideUrl, 'watch?v=', 'embed/') />
457 <#assign slideThumbnail2 = stringUtil.replace(slideUrl, 'www', 'img') />
458 <#assign slideThumbnail2 = stringUtil.replace(slideThumbnail2, 'embed', 'vi') />
459 <#assign slideThumbnail2 = '${slideThumbnail2}/mqdefault.jpg' />
460
461 <#-- Vimeo -->
462 <#if slideUrl?contains("vimeo")>
463 <#assign slideUrl = stringUtil.replace(slideUrl, 'http://vimeo.com/', 'https://player.vimeo.com/video/') />
464 <#assign slideVimeoId = stringUtil.extractLast(slideUrl, 'https://player.vimeo.com/video/') />
465 <#if slideVimeoId?has_content>
466 <#assign slideVimeoJsonPath = 'http://vimeo.com/api/v2/video/${slideVimeoId}.json' />
467 <#assign slideVimeoJsonContent = getUrlContent.getContent(slideVimeoJsonPath)! />
468 <#if slideVimeoJsonContent?has_content>
469 <#assign slideVimeoJsonArray = jsonFactoryUtil.createJSONArray(slideVimeoJsonContent) />
470 <#assign slideVimeoJsonItem = slideVimeoJsonArray.get(0) />
471 <#assign slideThumbnail2 = slideVimeoJsonItem.thumbnail_medium />
472 </#if>
473 </#if>
474 </#if>
475
476 <div id="slide-${Slide?index}" class="slide">
477 <a class="card card-simple card-video" href="#" onclick="javascript: event.preventDefault(); showDialogIframe('${slideUrl}', '${slideTitle}', 800, 600, 'videoPopup', 'videoPopupIframe');" title="${slideTitle}">
478 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2}');">
479 <img class="hide-accessible" alt="${slideTitle}" src="${slideThumbnail2}">
480 </a>
481 </div>
482 <#else>
483
484 <#assign slideTitle = "${languageUtil.get(request, 'image')} ${Slide?index}" />
485 <#if Slide.SlideTitulo.data?has_content>
486 <#assign slideTitle = Slide.SlideTitulo.data />
487 </#if>
488
489 <div class="slide">
490 <a class="card card-simple lightbox" href="${slidePath}" title="${slideTitle}">
491 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2}');">
492 <img class="hide-accessible" alt="${slideTitle}" src="${slideThumbnail2}">
493 </a>
494 </div>
495 </#if>
496 </#if>
497 </#list>
498 </div>
499 </#if>
500
501 <#if hasTab1>
502 <div id="tab1" class="article-section accordion-item">
503 <a href="#tabContent1" id="tabHeading" class="h3 accordion-header <#if !showFirstTab>collapsed</#if>" aria-expanded="${getterUtil.getString(showFirstTab)}" data-toggle="liferay-collapse" aria-controls="tabContent1" role="button">
504 ${languageUtil.get(request,'info')}
505 </a>
506 <div id="tabContent1" class="article-section-content article-section-info accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading">
507 <#if Contacto.ContactoTexto.data?has_content>
508 ${Contacto.ContactoTexto.data}
509 </#if>
510 <#if Informacion.InformacionTexto.data?has_content>
511 ${Informacion.InformacionTexto.data}
512 </#if>
513 </div>
514 </div>
515
516 </#if>
517
518 <#if hasTab2>
519
520 <#assign coordenadas=stringUtil.split(Geolocalizacion.Coordenadas.data) />
521
522 <div id="tab2" class="article-section accordion-item">
523 <a href="#tabContent2" id="tabHeading2" class="h3 accordion-header <#if !showFirstTab>collapsed</#if>" aria-expanded="${getterUtil.getString(showFirstTab)}" data-toggle="liferay-collapse" aria-controls="tabContent2" role="button">
524 ${languageUtil.get(request,'map')}
525 </a>
526 <div id="tabContent2" class="article-section-content accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading2">
527 <script src="/o/turismo-asturias-theme/js/leaflet/leaflet.js"></script>
528 <script type="text/javascript">
529 <#assign xpath = saxReaderUtil.createXPath("//root:StyleMap", "root", "http://www.opengis.net/kml/2.2")/>
530 <#assign style_maps = xpath.selectNodes(document)/>
531
532 var style_mapsJS = {};
533 var line_stylesJS = {};
534
535 <#list style_maps as style_map>
536 <#assign style_map_styleurl_path = "${style_map.getUniquePath()}/*[name()='Pair']/*[name()='styleUrl']"/>
537 <#assign style_map_styleurl_node = style_map.selectSingleNode(style_map_styleurl_path)/>
538 <#assign nodeText = style_map_styleurl_node.getText()/>
539 style_mapsJS['${style_map.selectSingleNode("${style_map.getUniquePath()}/@id").getText()}'] = '${nodeText?substring(1)}';
540 </#list>
541 <#assign xpath = saxReaderUtil.createXPath("//root:Style", "root", "http://www.opengis.net/kml/2.2")/>
542 <#assign line_styles = xpath.selectNodes(document)/>
543
544 <#list line_styles as line_style>
545 <#assign line_style_color_path = "${line_style.getUniquePath()}/*[name()='LineStyle']/*[name()='color']"/>
546 <#assign line_style_color_node = line_style.selectSingleNode(line_style_color_path)!/>
547 <#if validator.isNotNull(line_style_color_node)>
548 line_stylesJS['${line_style.selectSingleNode("${line_style.getUniquePath()}/@id").getText()}'] = {color: '#${line_style_color_node.getText()?substring(6,8)}${line_style_color_node.getText()?substring(4,6)}${line_style_color_node.getText()?substring(2,4)}', opacity: 0x${line_style_color_node.getText()?substring(0,2)}/0xFF};
549 </#if>
550 </#list>
551 </script>
552
553
554 <script type="text/javascript">
555 var route = {};//Ruta
556 var totalDistance = 0;
557 <#list placemarksName as name>
558
559 var nombreTramo = "${name.getText()}";
560 nombreTramo = nombreTramo.replace("Tramo ","");
561 nombreTramo = nombreTramo.replace(/[–]/gi,'-');
562 nombreTramo = nombreTramo.trim();
563
564
565 var tramo = {};//Datos del tramo
566 var coordinatesJS = [];//Coordenadas del tramo
567
568 <#-- Identificador color del Tramo -->
569 <#assign xpath = saxReaderUtil.createXPath("//root:LineString/ancestor::root:Placemark[root:name='${name.getText()}']/root:styleUrl", "root", "http://www.opengis.net/kml/2.2")/>
570 <#assign styleUrl = xpath.selectSingleNode(document)!>
571
572 <#-- Obtener los puntos de ruta para dibujarlos -->
573 <#assign xpath = saxReaderUtil.createXPath("//root:LineString/ancestor::root:Placemark[root:name='${name.getText()}']/root:LineString/root:coordinates", "root", "http://www.opengis.net/kml/2.2")/>
574 <#assign coordinates = xpath.selectSingleNode(document)!>
575 <#-- Hacemos un split para separar las coordenadas -->
576 <#assign arrayCoordinates = coordinates.getText()?split(" ")/>
577 <#assign start=""/>
578 <#assign end=""/>
579 <#list arrayCoordinates as coordinate>
580 <#assign splitCoordinates = coordinate?split(",")/>
581
582
583 <#if splitCoordinates?size gte 2>
584 coordinatesJS.push(new L.LatLng(${splitCoordinates[1]}, ${splitCoordinates[0]}));
585 <#if validator.isNull(start)>
586 <#assign start = "${splitCoordinates[1]} +',' + ${splitCoordinates[0]}">
587 </#if>
588 <#assign end = "${splitCoordinates[1]} +',' + ${splitCoordinates[0]}">
589 </#if>
590
591 </#list>
592 tramo['start'] = ${start};
593 tramo['end'] = ${end};
594
595 var distance = 0;
596 var previousPoint="";
597
598 tramo['name'] = nombreTramo;
599 tramo['lineStyle'] = line_stylesJS[style_mapsJS['${styleUrl.getText()?substring(1)}']];
600 tramo['coordinates'] = coordinatesJS;
601
602 coordinatesJS.forEach(function (latLng) {
603 if (previousPoint) {
604 distance += previousPoint.distanceTo(latLng);
605 }
606 previousPoint = latLng;
607 });
608
609 tramo['distance'] = (distance/1000).toFixed(1)/1;
610 totalDistance +=(distance/1000).toFixed(1)/1;
611
612 <#if tramosAlternativosArray?size!=0>
613 tramo['isAlternative'] = ${tramosAlternativosArray[count]};
614 <#else>
615 tramo['isAlternative'] = false;
616 </#if>
617
618
619 route['${counter}'] = tramo;
620
621 <#assign counter = counter +1/>
622 <#assign count = count +1/>
623
624 </#list>
625 </script>
626 <div class="article-section-content">
627 <div id="article-map-wrapper-${articleId}" class="article-map-wrapper">
628 <div id="article-map-content-${articleId}" style="width: 100%; height: 400px; z-index:1"><!-- MAP --></div>
629 <div class="article-map-form">
630 <div class="name important">${title}</div>
631 <div class="gps"><span class="label">GPS:</span> <span class="value important" itemprop="geo">${lookAtLatitude.getText()}, ${lookAtLongitude.getText()}</span></div>
632 <form action="https://maps.google.es/maps" method="get" target="_blank">
633 <input type="hidden" name="daddr" value="${lookAtLatitude.getText()}, ${lookAtLongitude.getText()}">
634 <label for="saddr"><span class="label">${languageUtil.get(request,'infoasturias-from')}: </span></label>
635 <input class="form-control" type="text" maxlength="40" name="saddrText" id="saddrText" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
636 <input class="form-control" type="hidden" name="saddr" id="saddr" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
637 <button class="btn btn-text" type="submit">${languageUtil.get(request,'infoasturias-como-llegar')} »</button>
638 </form>
639 </div>
640 </div>
641
642 <script type="text/javascript">
643 AUI().ready('aui-base', function(A){
644 var lookAt = new L.LatLng(${lookAtLatitude.getText()}, ${lookAtLongitude.getText()});//Cámara
645
646 <#if validator.isNotNull (Geolocalizacion.Coordenadas.data)>
647 lookAt = new L.LatLng(${Geolocalizacion.Coordenadas.data});//contenido
648 </#if>
649 const mapContent = new L.Map('article-map-content-${articleId}', { center: lookAt, zoom: 10 });
650 const osm = new L.TileLayer('http://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}');
651
652
653 mapContent.addLayer(osm);
654
655 //definir iconos inicio y fin tramo
656 var startMarker;
657 var middleMarker;
658 var endMarker;
659 var colorSeries = ["e9ecef","f5f7f9","fff"];
660 var colorSeriesSelector = 0;
661 var generalDistance =0;
662
663 var endIconTheme = '/o/turismo-asturias-theme/images/icons/routes/Icono_Fin_Ruta_${tipoRuta}_min.png';
664 var endIcon = L.icon({
665 iconUrl: endIconTheme,
666 iconSize: [27, 35],
667 iconAnchor: [13, 35],
668 iconShadow: [0,0],
669 popupAnchor: [0, -30]
670 });
671 var middleIconTheme = '/o/turismo-asturias-theme/images/icons/routes/gmaps-marker-icon-grey.png';
672 var middleIcon = L.icon({
673 iconUrl: middleIconTheme,
674 iconSize: [20, 28],
675 iconAnchor: [10, 28],
676 iconShadow: [0,0],
677 popupAnchor: [0, -30]
678 });
679
680 var startIconTheme = '/o/turismo-asturias-theme/images/icons/routes/Icono_Inicio_Ruta_${tipoRuta}_min.png';
681 var startIcon = L.icon({
682 iconUrl: startIconTheme,
683 iconSize: [27, 35],
684 iconAnchor: [13, 35],
685 iconShadow: [0,0],
686 popupAnchor: [0, -30]
687 });
688
689 for (const ruta in route) {
690 var stretch = route[ruta];
691
692 var name = stretch.name;
693 var nameArray = name.split("-");
694 var coordinates = stretch.coordinates;
695 var distance =''+ stretch.distance;
696 var isStrechAlternative = stretch.isAlternative;
697 var lineStyle = stretch.lineStyle || { color: '#3c3be3', opacity: 1 };
698 var startCoordinates = stretch.start.split(",");
699 var endCoordinates = stretch.end.split(",");
700
701 var track_node = A.Node.create('<div class="route-resume-track ' + (ruta==1?'route-resume-track-first':'') + '"><a class="route-resume-track-link" href="#track-'+(ruta)+'"></a></div>');
702 var track_size = ((distance/totalDistance*100) + '%');
703 track_node.setStyles({width: track_size, backgroundColor: '#' + colorSeries[colorSeriesSelector]});
704 track_node.appendTo(A.one('.route-resume-tracks'));
705
706
707 if(distance)
708 A.one('.template .route-'+ ruta + ' .route-distance').text(distance.replace(".",",") + ' Kms');
709
710 if(!isStrechAlternative)
711 generalDistance = generalDistance + stretch.distance;
712
713 if(Object.keys(route).length == 1){
714 A.one('.route-resume-track-marker-first .route-point-text').text(nameArray[0]);
715 A.one('.route-resume-track-marker-last .route-km-text').text('Km ' + distance.replace(".",","));
716 A.one('.route-resume-track-marker-last .route-point-text').text(nameArray[nameArray.length-1]);
717 startMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: startIcon}).bindPopup(nameArray[0]).addTo(mapContent);
718 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
719 }
720 else{
721 var track_point =A.Node.create('<div class="route-resume-point"></div>');
722 if(ruta==1){
723 A.one('.route-resume-track-marker-first .route-point-text').text(nameArray[0]);
724 var track_point_text = A.Node.create('<div class="route-point-text">' + nameArray[1] + '</div><div class="route-km-text">Km '+distance+'</div>');
725 startMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: startIcon}).bindPopup(nameArray[0]).addTo(mapContent);
726
727 if(ruta == Object.keys(route).length-1 && route[Object.keys(route).length].isAlternative)
728 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
729 else
730 middleMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
731
732 track_point_text.appendTo(track_point);
733 track_point.appendTo(A.one('.route-resume-tracks'));
734 }
735 else if(ruta == Object.keys(route).length){
736 A.one('.route-resume-track-marker-last .route-km-text').text('Km ' + distance.replace(".",","));
737 A.one('.route-resume-track-marker-last .route-point-text').text(nameArray[nameArray.length-1]);
738
739 if(isStrechAlternative){
740 middleMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray[nameArray.length-1]).addTo(mapContent);
741 var alternativetrack_node = A.Node.create('<li class="article-list-item distance-wrapper"><span class="fas fa-ruler-horizontal"><span class="hide-accessible"> ${languageUtil.get(request, "infoasturias-tramo-alternativo")}</span></span><span class="field-wrapper"><span class="field">${languageUtil.get(request, "infoasturias-tramo-alternativo")}: </span><span class="text btn btn-secondary btn-thin text-lowercase"><span class="font-size-11 text-white text-distance-alternative">'+distance +'</span> kms</span></span></li>');
742 alternativetrack_node.appendTo(A.one('.template .info-route'));
743 }
744 else{
745 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray[nameArray.length-1]).addTo(mapContent);
746 }
747 }
748 else{
749 var track_point_text = A.Node.create('<div class="route-point-text">' + nameArray[nameArray.length-1] + '</div><div class="route-km-text">Km '+distance+'</div>');
750 track_point_text.appendTo(track_point);
751 track_point.appendTo(A.one('.route-resume-tracks'));
752 middleMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray[0]).addTo(mapContent);
753 }
754 }
755
756 var polyline = new L.Polyline(coordinates, {
757 color: '' + lineStyle.color,
758 opacity: lineStyle.opacity
759 });
760 polyline.bindPopup(name).addTo(mapContent);
761
762
763 colorSeriesSelector++;
764 if(colorSeriesSelector == 3)
765 colorSeriesSelector = 0;
766
767 }//fin rutas
768
769 if(generalDistance)
770 A.one('.template .text-distance').text(''+ Math.round(generalDistance * 100) / 100);
771
772 //Contributor
773 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
774 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors.'
775 }).addTo(mapContent);
776
777 }); //AUI.ready
778 </script>
779 </div>
780 <#if validator.isNotNull(dlFileEntryKML) && tipoRuta!="coche">
781
782 <#assign params = {
783 "displayStyle":"ddmTemplate_435797",
784 "displayStyleGroupId":"${themeDisplay.getCompanyGroupId()}",
785 "portletId": portletTool.getPortletId(request),
786 "articleId":"${articleId}",
787 "dlFileEntryuuId":"${dlFileEntryKML.getUuid()}"
788 }>
789 <#assign portletURL = portletTool.createURL(request, "as_asac_adtvisor_portlet_AdtVisorDialogPortlet", themeDisplay.getPlid(), "RENDER_PHASE", "pop_up", params) />
790 <div class="button-row button-row-center my-3">
791 <button type="button" class="btn btn-primary btn-small text-center text-uppercase" onclick="event.preventDefault(); showDialogIframe('${portletURL}','${languageUtil.get(request,'profile')}', '800px', '','elevationProfile', 'elevationProfileIframe');">
792 ${languageUtil.get(request,'infoasturias-ver-perfil-elevacion')}
793 </button>
794 </div>
795
796 </#if>
797 </div>
798 </div>
799
800 <#assign showFirstTab = false>
801 </#if>
802
803 <#if hasTab3>
804 <div id="tab3" class="article-section accordion-item hide">
805 <a href="#tabContent3" id="tabHeading3" class="h3 accordion-header <#if !showFirstTab>collapsed</#if>" aria-expanded="${getterUtil.getString(showFirstTab)}" data-toggle="liferay-collapse" aria-controls="tabContent3" role="button">${languageUtil.get(request,'infoasturias-itinerario')}</a>
806 <div id="tabContent3" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading3">
807 <#list Informacion.Itinerario.getSiblings() as Item>
808 <#if Item.data?has_content>
809 <div class=" itinerario <#if !Item?is_last>pb-5</#if>"><p>${Item.data}</p></div>
810 </#if>
811 </#list>
812 </div>
813 </div>
814 <#assign showFirstTab = false>
815 </#if>
816
817 <#if hasTab4>
818 <div id="tab4" class="article-section accordion-item">
819 <a href="#tabContent4" id="tabHeading4" class="h3 accordion-header <#if !showFirstTab>collapsed</#if>" aria-expanded="${getterUtil.getString(showFirstTab)}" data-toggle="liferay-collapse" aria-controls="tabContent4" role="button">${languageUtil.get(request,'infoasturias-recorrido')}</a>
820 <div id="tabContent4" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading4">
821 <#list Informacion.TextoTramos.getSiblings() as Item>
822 <#if validator.isNotNull(Item.data)>
823 <p>${Item.data}</p>
824 </#if>
825 </#list>
826 <#list Tramos.getSiblings() as Item>
827 <h4 id="track-${Item?index+1}" class="h4 mt-5 route-${Item?index+1}">
828 <#if tipoRuta=="coche">${languageUtil.get(request,"day")} ${Item?index+1}:</#if> ${Item.OrigenDestino.data}
829 <span class="route-distance btn btn-link float-right text-capitalize">
830 ${Item.DistanciaTramo.data}
831 </span>
832 </h4>
833 <ul class="article-list list-unstyled article-list-info">
834 <#if getterUtil.getBoolean(Item.TramoAlternativo.getData()) && getterUtil.getBoolean(Item.TramoAlternativo.getData())>
835 <li class="article-list-item">
836 <span class="fas fa-route">
837 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-tramo-alternativo")}</span>
838 </span>
839 <span class="field-wrapper">
840 <span class="field">${languageUtil.get(request, "infoasturias-tramo-alternativo")}:</span>
841 </span>
842 </li>
843 </#if>
844 </ul>
845 <#if Item.DescripcionTramo.data?has_content>
846 ${Item.DescripcionTramo.data}
847 </#if>
848
849 </#list>
850 </div>
851 </div>
852 <#assign showFirstTab = false>
853 </#if>
854
855 <#if hasTab5>
856 <div id="tab5" class="article-section accordion-item">
857 <a href="#tabContent5" id="tabHeading5" class="h3 accordion-header <#if !showFirstTab>collapsed</#if>" aria-expanded="${getterUtil.getString(showFirstTab)}" data-toggle="liferay-collapse" aria-controls="tabContent5" role="button">${languageUtil.get(request,'detail')}</a>
858 <div id="tabContent5" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading5">
859 <#assign htmlGallery = journalTool.getHTMLGallery(Detalle.DetalleImagen.getSiblings(), 3, "gallery-thumbs") />
860
861 <#if Detalle.DetalleTexto.data?has_content>
862 ${Detalle.DetalleTexto.data}
863 </#if>
864
865 <#if validator.isNotNull(htmlGallery)>
866 <section class="image-gallery">
867 <div class="h5 pb-0">${languageUtil.get(locale, "image-gallery")}</div>
868 ${htmlGallery}
869 </section>
870 </#if>
871 </div>
872 </div>
873 <#assign showFirstTab = false>
874 </#if>
875 </div>
876 <#if Informacion.Observaciones.data?has_content>
877 <div class="article-border">
878 ${Informacion.Observaciones.data}
879 </div>
880 </#if>
881 </div>
882
883 <#-- Related -->
884 <#assign relatedJournalArticles = assetTool.getRelatedJournalArticlesApproved(assetEntry)/>
885 <#if validator.isNotNull(relatedJournalArticles) && relatedJournalArticles?size gt 0>
886 <div class="article-related portlet-background-grey-container">
887 <div class="container">
888 <h3 class="title-section">${languageUtil.get(request,'related-assets')}</h3>
889 <div class="slick article-related-slick">
890 <#list relatedJournalArticles as currentJournalArticle>
891 <#assign viewURL = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true)/>
892 <div class="slide">
893 <a class="card background card-background-9-14" href="${viewURL}" title="${languageUtil.format(request, 'go-to-x', currentJournalArticle.getTitle(locale))}">
894 <span class="d-block image-wrapper aspect-ratio-bg-cover" style="background-image: url('${currentJournalArticle.getSmallImageURL()}');">
895 <img class="hide-accessible" src="${currentJournalArticle.getSmallImageURL()}" alt="${currentJournalArticle.getTitle(locale)}">
896 <span class="card-body">
897 <span class="card-title">${currentJournalArticle.getTitle(locale)}</span>
898 </span>
899 </span>
900 </a>
901 </div>
902 </#list>
903 </div>
904 </div>
905 </div>
906 </#if>
907
908 <#-- Nearby -->
909 <#assign classTypeIds = [598853,582814,625593,623117,609431,593783]>
910 <#assign assetsNearJournalArticles = assetNearTool.getNearJournalArticles(themeDisplay.getScopeGroupId(), assetEntry.getEntryId(), 50.0, classTypeIds, 25)! />
911 <#if validator.isNotNull(assetsNearJournalArticles) && assetsNearJournalArticles?size gt 0>
912 <div class="article-nearby portlet-container-margin">
913 <div class="container">
914 <div class="article-nearby-container">
915 <h3 class="title-section">${languageUtil.get(request,'infoasturias-near-here')}</h3>
916 <div class="slick article-nearby-slick">
917 <#list assetsNearJournalArticles as currentJournalArticle>
918 <#assign viewURL = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true)/>
919 <div class="slide">
920 <a class="card" href="${viewURL}" title="${languageUtil.format(request, 'go-to-x', currentJournalArticle.getTitle(locale))}">
921 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${currentJournalArticle.getSmallImageURL()}');">
922 <img class="hide-accessible" src="${currentJournalArticle.getSmallImageURL()}" alt="${currentJournalArticle.getTitle(locale)}">
923 <span class="card-hover">
924 <span class="card-text">${currentJournalArticle.getDescription(locale)}</span>
925 </span>
926 </span>
927 <span class="card-body">
928 <span class="card-title">${currentJournalArticle.getTitle(locale)}</span>
929 <span class="card-subtitle">
930 <span class="d-block">${currentJournalArticle.getVersion()} Kms</span>
931 <span class="d-block">${journalTool.getCategoriesNames(groupId, currentJournalArticle.getArticleId(), locale, ["Concejos"])}</span>
932 </span>
933 </span>
934 </a>
935 </div>
936 </#list>
937 </div>
938 </div>
939 </div>
940 </div>
941 </#if>
942</article>