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 629, column 169] ---- FTL stack trace ("~" means nesting-related): - Failed at: ${lookAtLatitude.getText()} [in template "37703#37743#1559015" at line 629, 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 <#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! />
442 <#assign slideThumbnail2 = dlTool.getThumbnailByJSON(Slide.data, "2")! />
443 <#assign slidePath = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
444 <#assign slideUrl = Slide.SlideUrl.data />
445 <#assign dataMap = "" />
446
447 <#if slideUrl?has_content>
448
449 <#assign slideTitle = "${languageUtil.get(request, 'video')} ${Slide?index}" />
450 <#if Slide.SlideTitulo.data?has_content>
451 <#assign slideTitle = Slide.SlideTitulo.data />
452 </#if>
453
454 <#-- Youtube -->
455 <#assign slideUrl = stringUtil.replace(slideUrl, 'watch?v=', 'embed/') />
456 <#assign slideThumbnail2 = stringUtil.replace(slideUrl, 'www', 'img') />
457 <#assign slideThumbnail2 = stringUtil.replace(slideThumbnail2, 'embed', 'vi') />
458 <#assign slideThumbnail2 = '${slideThumbnail2}/mqdefault.jpg' />
459
460 <#-- Vimeo -->
461 <#if slideUrl?contains("vimeo")>
462 <#assign slideUrl = stringUtil.replace(slideUrl, 'http://vimeo.com/', 'https://player.vimeo.com/video/') />
463 <#assign slideVimeoId = stringUtil.extractLast(slideUrl, 'https://player.vimeo.com/video/') />
464 <#if slideVimeoId?has_content>
465 <#assign slideVimeoJsonPath = 'http://vimeo.com/api/v2/video/${slideVimeoId}.json' />
466 <#assign slideVimeoJsonContent = getUrlContent.getContent(slideVimeoJsonPath)! />
467 <#if slideVimeoJsonContent?has_content>
468 <#assign slideVimeoJsonArray = jsonFactoryUtil.createJSONArray(slideVimeoJsonContent) />
469 <#assign slideVimeoJsonItem = slideVimeoJsonArray.get(0) />
470 <#assign slideThumbnail2 = slideVimeoJsonItem.thumbnail_medium />
471 </#if>
472 </#if>
473 </#if>
474
475 <div id="slide-${Slide?index}" class="slide">
476 <a class="card card-simple card-video" href="#" onclick="javascript: event.preventDefault(); showDialogIframe('${slideUrl}', '${slideTitle}', 800, 600, 'videoPopup', 'videoPopupIframe');" title="${slideTitle}">
477 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2}');">
478 <img class="hide-accessible" alt="${slideTitle}" src="${slideThumbnail2}">
479 </a>
480 </div>
481 <#else>
482
483 <#assign slideTitle = "${languageUtil.get(request, 'image')} ${Slide?index}" />
484 <#if Slide.SlideTitulo.data?has_content>
485 <#assign slideTitle = Slide.SlideTitulo.data />
486 </#if>
487
488 <div class="slide">
489 <a class="card card-simple lightbox" href="${slidePath}" title="${slideTitle}">
490 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2}');">
491 <img class="hide-accessible" alt="${slideTitle}" src="${slideThumbnail2}">
492 </a>
493 </div>
494 </#if>
495 </#list>
496 </div>
497 </#if>
498
499 <#if hasTab1>
500 <div id="tab1" class="article-section accordion-item">
501 <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">
502 ${languageUtil.get(request,'info')}
503 </a>
504 <div id="tabContent1" class="article-section-content article-section-info accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading">
505 <#if Contacto.ContactoTexto.data?has_content>
506 ${Contacto.ContactoTexto.data}
507 </#if>
508 <#if Informacion.InformacionTexto.data?has_content>
509 ${Informacion.InformacionTexto.data}
510 </#if>
511 </div>
512 </div>
513
514 </#if>
515
516 <#if hasTab2>
517
518 <#assign coordenadas=stringUtil.split(Geolocalizacion.Coordenadas.data) />
519
520 <div id="tab2" class="article-section accordion-item">
521 <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">
522 ${languageUtil.get(request,'map')}
523 </a>
524 <div id="tabContent2" class="article-section-content accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading2">
525 <script src="/o/turismo-asturias-theme/js/leaflet/leaflet.js"></script>
526 <script type="text/javascript">
527 <#assign xpath = saxReaderUtil.createXPath("//root:StyleMap", "root", "http://www.opengis.net/kml/2.2")/>
528 <#assign style_maps = xpath.selectNodes(document)/>
529
530 var style_mapsJS = {};
531 var line_stylesJS = {};
532
533 <#list style_maps as style_map>
534 <#assign style_map_styleurl_path = "${style_map.getUniquePath()}/*[name()='Pair']/*[name()='styleUrl']"/>
535 <#assign style_map_styleurl_node = style_map.selectSingleNode(style_map_styleurl_path)/>
536 <#assign nodeText = style_map_styleurl_node.getText()/>
537 style_mapsJS['${style_map.selectSingleNode("${style_map.getUniquePath()}/@id").getText()}'] = '${nodeText?substring(1)}';
538 </#list>
539 <#assign xpath = saxReaderUtil.createXPath("//root:Style", "root", "http://www.opengis.net/kml/2.2")/>
540 <#assign line_styles = xpath.selectNodes(document)/>
541
542 <#list line_styles as line_style>
543 <#assign line_style_color_path = "${line_style.getUniquePath()}/*[name()='LineStyle']/*[name()='color']"/>
544 <#assign line_style_color_node = line_style.selectSingleNode(line_style_color_path)!/>
545 <#if validator.isNotNull(line_style_color_node)>
546 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};
547 </#if>
548 </#list>
549 </script>
550
551
552 <script type="text/javascript">
553 var route = {};//Ruta
554 var totalDistance = 0;
555 <#list placemarksName as name>
556
557 var nombreTramo = "${name.getText()}";
558 nombreTramo = nombreTramo.replace("Tramo ","");
559 nombreTramo = nombreTramo.replace(/[–]/gi,'-');
560 nombreTramo = nombreTramo.trim();
561
562
563 var tramo = {};//Datos del tramo
564 var coordinatesJS = [];//Coordenadas del tramo
565
566 <#-- Identificador color del Tramo -->
567 <#assign xpath = saxReaderUtil.createXPath("//root:LineString/ancestor::root:Placemark[root:name='${name.getText()}']/root:styleUrl", "root", "http://www.opengis.net/kml/2.2")/>
568 <#assign styleUrl = xpath.selectSingleNode(document)!>
569
570 <#-- Obtener los puntos de ruta para dibujarlos -->
571 <#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")/>
572 <#assign coordinates = xpath.selectSingleNode(document)!>
573 <#-- Hacemos un split para separar las coordenadas -->
574 <#assign arrayCoordinates = coordinates.getText()?split(" ")/>
575 <#assign start=""/>
576 <#assign end=""/>
577 <#list arrayCoordinates as coordinate>
578 <#assign splitCoordinates = coordinate?split(",")/>
579
580
581 <#if splitCoordinates?size gte 2>
582 coordinatesJS.push(new L.LatLng(${splitCoordinates[1]}, ${splitCoordinates[0]}));
583 <#if validator.isNull(start)>
584 <#assign start = "${splitCoordinates[1]} +',' + ${splitCoordinates[0]}">
585 </#if>
586 <#assign end = "${splitCoordinates[1]} +',' + ${splitCoordinates[0]}">
587 </#if>
588
589 </#list>
590 tramo['start'] = ${start};
591 tramo['end'] = ${end};
592
593 var distance = 0;
594 var previousPoint="";
595
596 tramo['name'] = nombreTramo;
597 tramo['lineStyle'] = line_stylesJS[style_mapsJS['${styleUrl.getText()?substring(1)}']];
598 tramo['coordinates'] = coordinatesJS;
599
600 coordinatesJS.forEach(function (latLng) {
601 if (previousPoint) {
602 distance += previousPoint.distanceTo(latLng);
603 }
604 previousPoint = latLng;
605 });
606
607 tramo['distance'] = (distance/1000).toFixed(1)/1;
608 totalDistance +=(distance/1000).toFixed(1)/1;
609
610 <#if tramosAlternativosArray?size!=0>
611 tramo['isAlternative'] = ${tramosAlternativosArray[count]};
612 <#else>
613 tramo['isAlternative'] = false;
614 </#if>
615
616
617 route['${counter}'] = tramo;
618
619 <#assign counter = counter +1/>
620 <#assign count = count +1/>
621
622 </#list>
623 </script>
624 <div class="article-section-content">
625 <div id="article-map-wrapper-${articleId}" class="article-map-wrapper">
626 <div id="article-map-content-${articleId}" style="width: 100%; height: 400px; z-index:1"><!-- MAP --></div>
627 <div class="article-map-form">
628 <div class="name important">${title}</div>
629 <div class="gps"><span class="label">GPS:</span> <span class="value important" itemprop="geo">${lookAtLatitude.getText()}, ${lookAtLongitude.getText()}</span></div>
630 <form action="https://maps.google.es/maps" method="get" target="_blank">
631 <input type="hidden" name="daddr" value="${lookAtLatitude.getText()}, ${lookAtLongitude.getText()}">
632 <label for="saddr"><span class="label">${languageUtil.get(request,'infoasturias-from')}: </span></label>
633 <input class="form-control" type="text" maxlength="40" name="saddrText" id="saddrText" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
634 <input class="form-control" type="hidden" name="saddr" id="saddr" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
635 <button class="btn btn-text" type="submit">${languageUtil.get(request,'infoasturias-como-llegar')} »</button>
636 </form>
637 </div>
638 </div>
639
640 <script type="text/javascript">
641 AUI().ready('aui-base', function(A){
642 var lookAt = new L.LatLng(${lookAtLatitude.getText()}, ${lookAtLongitude.getText()});//Cámara
643
644 <#if validator.isNotNull (Geolocalizacion.Coordenadas.data)>
645 lookAt = new L.LatLng(${Geolocalizacion.Coordenadas.data});//contenido
646 </#if>
647 const mapContent = new L.Map('article-map-content-${articleId}', { center: lookAt, zoom: 10 });
648 const osm = new L.TileLayer('http://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}');
649
650
651 mapContent.addLayer(osm);
652
653 //definir iconos inicio y fin tramo
654 var startMarker;
655 var middleMarker;
656 var endMarker;
657 var colorSeries = ["e9ecef","f5f7f9","fff"];
658 var colorSeriesSelector = 0;
659 var generalDistance =0;
660
661 var endIconTheme = '/o/turismo-asturias-theme/images/icons/routes/Icono_Fin_Ruta_${tipoRuta}_min.png';
662 var endIcon = L.icon({
663 iconUrl: endIconTheme,
664 iconSize: [27, 35],
665 iconAnchor: [13, 35],
666 iconShadow: [0,0],
667 popupAnchor: [0, -30]
668 });
669 var middleIconTheme = '/o/turismo-asturias-theme/images/icons/routes/gmaps-marker-icon-grey.png';
670 var middleIcon = L.icon({
671 iconUrl: middleIconTheme,
672 iconSize: [20, 28],
673 iconAnchor: [10, 28],
674 iconShadow: [0,0],
675 popupAnchor: [0, -30]
676 });
677
678 var startIconTheme = '/o/turismo-asturias-theme/images/icons/routes/Icono_Inicio_Ruta_${tipoRuta}_min.png';
679 var startIcon = L.icon({
680 iconUrl: startIconTheme,
681 iconSize: [27, 35],
682 iconAnchor: [13, 35],
683 iconShadow: [0,0],
684 popupAnchor: [0, -30]
685 });
686
687 for (const ruta in route) {
688 var stretch = route[ruta];
689
690 var name = stretch.name;
691 var nameArray = name.split("-");
692 var coordinates = stretch.coordinates;
693 var distance =''+ stretch.distance;
694 var isStrechAlternative = stretch.isAlternative;
695 var lineStyle = stretch.lineStyle || { color: '#3c3be3', opacity: 1 };
696 var startCoordinates = stretch.start.split(",");
697 var endCoordinates = stretch.end.split(",");
698
699 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>');
700 var track_size = ((distance/totalDistance*100) + '%');
701 track_node.setStyles({width: track_size, backgroundColor: '#' + colorSeries[colorSeriesSelector]});
702 track_node.appendTo(A.one('.route-resume-tracks'));
703
704
705 if(distance)
706 A.one('.template .route-'+ ruta + ' .route-distance').text(distance.replace(".",",") + ' Kms');
707
708 if(!isStrechAlternative)
709 generalDistance = generalDistance + stretch.distance;
710
711 if(Object.keys(route).length == 1){
712 A.one('.route-resume-track-marker-first .route-point-text').text(nameArray[0]);
713 A.one('.route-resume-track-marker-last .route-km-text').text('Km ' + distance.replace(".",","));
714 A.one('.route-resume-track-marker-last .route-point-text').text(nameArray[nameArray.length-1]);
715 startMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: startIcon}).bindPopup(nameArray[0]).addTo(mapContent);
716 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
717 }
718 else{
719 var track_point =A.Node.create('<div class="route-resume-point"></div>');
720 if(ruta==1){
721 A.one('.route-resume-track-marker-first .route-point-text').text(nameArray[0]);
722 var track_point_text = A.Node.create('<div class="route-point-text">' + nameArray[1] + '</div><div class="route-km-text">Km '+distance+'</div>');
723 startMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: startIcon}).bindPopup(nameArray[0]).addTo(mapContent);
724
725 if(ruta == Object.keys(route).length-1 && route[Object.keys(route).length].isAlternative)
726 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
727 else
728 middleMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray.length-1).addTo(mapContent);
729
730 track_point_text.appendTo(track_point);
731 track_point.appendTo(A.one('.route-resume-tracks'));
732 }
733 else if(ruta == Object.keys(route).length){
734 A.one('.route-resume-track-marker-last .route-km-text').text('Km ' + distance.replace(".",","));
735 A.one('.route-resume-track-marker-last .route-point-text').text(nameArray[nameArray.length-1]);
736
737 if(isStrechAlternative){
738 middleMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray[nameArray.length-1]).addTo(mapContent);
739 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>');
740 alternativetrack_node.appendTo(A.one('.template-rutas .info-route'));
741 }
742 else{
743 endMarker = L.marker([endCoordinates[0],endCoordinates[1]], {icon: endIcon}).bindPopup(nameArray[nameArray.length-1]).addTo(mapContent);
744 }
745 }
746 else{
747 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>');
748 track_point_text.appendTo(track_point);
749 track_point.appendTo(A.one('.route-resume-tracks'));
750 middleMarker = L.marker([startCoordinates[0],startCoordinates[1]], {icon: middleIcon}).bindPopup(nameArray[0]).addTo(mapContent);
751 }
752 }
753
754 var polyline = new L.Polyline(coordinates, {
755 color: '' + lineStyle.color,
756 opacity: lineStyle.opacity
757 });
758 polyline.bindPopup(name).addTo(mapContent);
759
760
761 colorSeriesSelector++;
762 if(colorSeriesSelector == 3)
763 colorSeriesSelector = 0;
764
765 }//fin rutas
766
767 if(generalDistance)
768 A.one('.template .text-distance').text(''+ Math.round(generalDistance * 100) / 100);
769
770 //Contributor
771 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
772 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors.'
773 }).addTo(mapContent);
774
775 }); //AUI.ready
776 </script>
777 </div>
778 <#if validator.isNotNull(dlFileEntryKML) && tipoRuta!="coche">
779
780 <#assign params = {
781 "displayStyle":"ddmTemplate_435797",
782 "displayStyleGroupId":"${themeDisplay.getCompanyGroupId()}",
783 "portletId": portletTool.getPortletId(request),
784 "articleId":"${articleId}",
785 "dlFileEntryuuId":"${dlFileEntryKML.getUuid()}"
786 }>
787 <#assign portletURL = portletTool.createURL(request, "as_asac_adtvisor_portlet_AdtVisorDialogPortlet", themeDisplay.getPlid(), "RENDER_PHASE", "pop_up", params) />
788 <div class="button-row button-row-center my-3">
789 <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');">
790 ${languageUtil.get(request,'infoasturias-ver-perfil-elevacion')}
791 </button>
792 </div>
793
794 </#if>
795 </div>
796 </div>
797
798 <#assign showFirstTab = false>
799 </#if>
800
801 <#if hasTab3>
802 <div id="tab3" class="article-section accordion-item hide">
803 <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>
804 <div id="tabContent3" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading3">
805 <#list Informacion.Itinerario.getSiblings() as Item>
806 <#if Item.data?has_content>
807 <div class=" itinerario <#if !Item?is_last>pb-5</#if>"><p>${Item.data}</p></div>
808 </#if>
809 </#list>
810 </div>
811 </div>
812 <#assign showFirstTab = false>
813 </#if>
814
815 <#if hasTab4>
816 <div id="tab4" class="article-section accordion-item">
817 <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>
818 <div id="tabContent4" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading4">
819 <#list Informacion.TextoTramos.getSiblings() as Item>
820 <#if validator.isNotNull(Item.data)>
821 <p>${Item.data}</p>
822 </#if>
823 </#list>
824 <#list Tramos.getSiblings() as Item>
825 <h4 id="track-${Item?index+1}" class="h4 mt-5 route-${Item?index+1}">
826 <#if tipoRuta=="coche">${languageUtil.get(request,"day")} ${Item?index+1}:</#if> ${Item.OrigenDestino.data}
827 <span class="route-distance btn btn-link float-right text-capitalize">
828 ${Item.DistanciaTramo.data}
829 </span>
830 </h4>
831 <ul class="article-list list-unstyled article-list-info">
832 <#if getterUtil.getBoolean(Item.TramoAlternativo.getData()) && getterUtil.getBoolean(Item.TramoAlternativo.getData())>
833 <li class="article-list-item">
834 <span class="fas fa-route">
835 <span class="hide-accessible">${languageUtil.get(request,"infoasturias-tramo-alternativo")}</span>
836 </span>
837 <span class="field-wrapper">
838 <span class="field">${languageUtil.get(request, "infoasturias-tramo-alternativo")}:</span>
839 </span>
840 </li>
841 </#if>
842 </ul>
843 <#if Item.DescripcionTramo.data?has_content>
844 ${Item.DescripcionTramo.data}
845 </#if>
846
847 </#list>
848 </div>
849 </div>
850 <#assign showFirstTab = false>
851 </#if>
852
853 <#if hasTab5>
854 <div id="tab5" class="article-section accordion-item">
855 <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>
856 <div id="tabContent5" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading5">
857 <#assign htmlGallery = journalTool.getHTMLGallery(Detalle.DetalleImagen.getSiblings(), 3, "gallery-thumbs") />
858
859 <#if Detalle.DetalleTexto.data?has_content>
860 ${Detalle.DetalleTexto.data}
861 </#if>
862
863 <#if validator.isNotNull(htmlGallery)>
864 <section class="image-gallery">
865 <div class="h5 pb-0">${languageUtil.get(locale, "image-gallery")}</div>
866 ${htmlGallery}
867 </section>
868 </#if>
869 </div>
870 </div>
871 <#assign showFirstTab = false>
872 </#if>
873 </div>
874 <#if Informacion.Observaciones.data?has_content>
875 <div class="article-border">
876 ${Informacion.Observaciones.data}
877 </div>
878 </#if>
879 </div>
880
881 <#-- Related -->
882 <#assign relatedJournalArticles = assetTool.getRelatedJournalArticlesApproved(assetEntry)/>
883 <#if validator.isNotNull(relatedJournalArticles) && relatedJournalArticles?size gt 0>
884 <div class="article-related portlet-background-grey-container">
885 <div class="container">
886 <h3 class="title-section">${languageUtil.get(request,'related-assets')}</h3>
887 <div class="slick article-related-slick">
888 <#list relatedJournalArticles as currentJournalArticle>
889 <#assign viewURL = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true)/>
890 <div class="slide">
891 <a class="card background card-background-9-14" href="${viewURL}" title="${languageUtil.format(request, 'go-to-x', currentJournalArticle.getTitle(locale))}">
892 <span class="d-block image-wrapper aspect-ratio-bg-cover" style="background-image: url('${currentJournalArticle.getSmallImageURL()}');">
893 <img class="hide-accessible" src="${currentJournalArticle.getSmallImageURL()}" alt="${currentJournalArticle.getTitle(locale)}">
894 <span class="card-body">
895 <span class="card-title">${currentJournalArticle.getTitle(locale)}</span>
896 </span>
897 </span>
898 </a>
899 </div>
900 </#list>
901 </div>
902 </div>
903 </div>
904 </#if>
905
906 <#-- Nearby -->
907 <#assign classTypeIds = []>
908 <#assign assetsNearJournalArticles = assetNearTool.getNearJournalArticles(themeDisplay.getScopeGroupId(), assetEntry.getEntryId(), 50.0, classTypeIds, 10)! />
909 <#if validator.isNotNull(assetsNearJournalArticles) && assetsNearJournalArticles?size gt 0>
910 <div class="article-nearby portlet-container-margin">
911 <div class="container">
912 <div class="article-nearby-container">
913 <h3 class="title-section">${languageUtil.get(request,'infoasturias-near-here')}</h3>
914 <div class="slick article-nearby-slick">
915 <#list assetsNearJournalArticles as currentJournalArticle>
916 <#assign viewURL = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true)/>
917 <div class="slide">
918 <a class="card" href="${viewURL}" title="${languageUtil.format(request, 'go-to-x', currentJournalArticle.getTitle(locale))}">
919 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${currentJournalArticle.getSmallImageURL()}');">
920 <img class="hide-accessible" src="${currentJournalArticle.getSmallImageURL()}" alt="${currentJournalArticle.getTitle(locale)}">
921 <span class="card-hover">
922 <span class="card-text">${currentJournalArticle.getDescription(locale)}</span>
923 </span>
924 </span>
925 <span class="card-body">
926 <span class="card-title">${currentJournalArticle.getTitle(locale)}</span>
927 <span class="card-subtitle">
928 <span class="d-block">${currentJournalArticle.getVersion()} Kms</span>
929 <span class="d-block">${journalTool.getCategoriesNames(groupId, currentJournalArticle.getArticleId(), locale, ["Concejos"])}</span>
930 </span>
931 </span>
932 </a>
933 </div>
934 </#list>
935 </div>
936 </div>
937 </div>
938 </div>
939 </#if>
940</article>