- Una línea más rápida: con la línea de bus X3 XPRESBus Paral·lel - L'Hospitalet (Avda. Carrilet) de TMB ahorras tiempo, porque hace recorridos más ágiles, con una frecuencia de 20 minutos en laborables y 30 minutos en festivos.
- Mejor conectada: aumentamos la conectividad entre Hospitalet y Barcelona con esta línea, ya que en el Paral·lel se puede enlazar con las líneas 2 y 3 de metro. Además, el X3 XPRESBus circula por zonas con menos aglomeración de tráfico, mejorando notablemente la movilidad del barrio de La Marina del Prat Vermell.
- Más directa: la X3 XPRESBus te lleva directamente del Paral·lel a L'Hospitalet pasando por la montaña de Montjuïc, manteniendo la conexión con la Plaza de España.
Te encuentras en:
Estrenamos la nueva línea X3 Paral·lel - L'Hospitalet (Av. Carrilet)
A partir del 26 de mayo, estrena la nueva línea que se incorpora a XPRESBus
Más rápida, mejor conectada y más directa
XPRESBus
Trabajamos en la ampliación de la red de buses de TMB incorporando una nueva línea XPRESBus a las dos que actualmente ya están en servicio, así como a las líneas de proximidad, las convencionales y las de altas prestaciones.
XPRESBus es un concepto de líneas que nació en 2021 con el fin de ofrecer recorridos más rápidos y ágiles, mejorando conexiones y con buses sostenibles
Las líneas XPRESBus se identifican por el color negro, a diferencia del resto de líneas.
La primera línea de estas características fue la X1, que entró en servicio en septiembre de 2021 y conecta la plaza Francesc Macià con Glòries. La X2 - Prat XPRES, que conecta El Prat y Barcelona, entró en servicio en octubre de 2024.
Ahora damos un paso más: con la nueva línea X3 XPRESBus conectamos de la forma más rápida la zona de la Av. Carrilet de Hospitalet y el centro de Barcelona, en el Paral·lel.
¡Estrenála a partir del 26 de mayo!
Infórmate en la página del proyecto de XPRESBus.
-
Finalizado
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público. -
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor. -
FinalizadoNuevo en TMB
La comunidad TMB supera el millón y medio de seguidores
La comunidad de usuarios de TMB que nos siguen en las redes sociales y en JoTMBé ya suman más de un millón y medio de personas.

Te encuentras en:
11ª Carrera Diagonal DiR Guardia Urbana
¡Te explicamos cómo llegar!
Cuando: 24.05.2025 a 25.05.2025
Dónde: Avenida Diagonal
Si participas en cualquiera de las dos modalidades de la 11ª Carrera Diagonal DiR Guàrdia Urbana , llega en transporte público. En TMB te llevamos.
Recomendamos acceder al punto de salida en metro, en la estación Palau Reial de la línea 3.
Consulta las afectaciones en el servicio de bus y las recomendaciones de transporte.
Dispones de Cómo llegar para encontrar otras opciones de transporte.
Hasta primera hora de la tarde del domingo 25 de mayo, recomendamos usar el metro como medio de transporte principal en la zona. La amplitud del recorrido y la duración la carrera provocarán alteraciones en el servicio a varias líneas de autobús.

Dos carreras en una
La 11ª Carrera Diagonal DiR Guàrdia Urbana by Ultima es una carrera de 5 y 10 km, que recorrerá la mítica Avenida Diagonal de Barcelona de montaña a mar, con el punto de salida y llegada en lugares diferentes.
TMB, con los grandes eventos de la ciudad
La Carrera Diagonal DiR Guàrdia Urbana se ha consolidado como una de las más conocidas y concurridas de la ciudad. En la edición de este año, los 12.500 corredores que participarán recorrerán la principal arteria de Barcelona, la Avenida Diagonal
TMB, como principal operador de transporte público de Barcelona y su área metropolitana, trabaja en el impacto que una celebración de esta magnitud puede tener en la red de transporte. Además, también se involucra de forma activa con los eventos, estando presente de forma latente y colaborando a nivel logístico y de marca.
Ve con TMB App!
Diseña tu ruta, configura las alertas del transporte que necesites y llega a la carrera sin sorpresas.
-
FinalizadoNuevo en TMB
Estrenamos la nueva línea X3 Paral·lel - L'Hospitalet (Av. Carrilet)
A partir del 26 de mayo, estrena la nueva línea que se incorpora a XPRESBus -
Finalizado
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio.
Te encuentras en:
Si te mueves en bus o en metro, tu opinión es importante
Participa en la encuesta y ayúdanos a mejorar el servicio.
Te llevará pocos minutos. ¡Ayúdanos a mejorar!
Un año más, Transports Metropolitans de Barcelona te proponemos participar en la recogida anual de datos de satisfacción de los usuarios de bus y de metro que forma parte de los estudios comparativos que llevan a cabo el International Bus Benchmarking Group (IBBG) y los grupos de metro CoMET y Nova.
Esta es la decimoséptima edición de esta experiencia internacional, en la que participan empresas de transporte público de grandes ciudades de todo el mundo, entre las cuales se encuentran Nueva York, Londres, Singapur, Berlín, Shenzhen, Bruselas, París y Madrid.
Con este trabajo conjunto, queremos analizar el servicio de bus y metro y estudiar sus prácticas con el objetivo de mejorarlo a partir de las opiniones directas de los usuarios.
En este cuestionario anónimo y confidencial podrás valorar tu experiencia de viaje e indicar tu grado de conformidad o disconformidad con algunos aspectos del servicio, como disponibilidad, accesibilidad, información, tiempo, atención al cliente, confort, seguridad e impacto ambiental.
¡Empieza!
- Participa en la encuesta de bus.
- Participa en la encuesta de metro
.
-
Finalizado
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público. -
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio.
Te encuentras en:
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público.
¡Atención!
En el bus y el metro, los espacios reservados para sillas de ruedas están reservados para sillas de ruedas. Además, las personas con discapacidad o movilidad reducida tienen prioridad absoluta para sentarse en los asientos de uso preferente y para utilizar el ascensor.
Ponte en su piel, no en su lugar.
En el bus y en el metro, da prioridad absoluta a quien lo necesite
Desde Transports Metropolitans de Barcelona y el Instituto Municipal de Personas con Discapacidad fomentamos el uso correcto de los asientos preferentes, los espacios reservados para sillas de ruedas y los ascensores de la red de transporte público de la ciudad.
Al dar más visibilidad al colectivo de personas con movilidad reducida y personas con discapacidad, esperamos llegar a la conciencia de los usuarios que no respetan estos espacios, no siempre de manera intencionada.
Los testimonios de esta campaña son reales, ya que su problemática también lo es.
¡Recuerda!
En el transporte público, siempre tenemos que dar prioridad absoluta a quien lo necesite.
-
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio. -
FinalizadoCampaña
Siempre estamos
El metro y los buses cuentan con cámaras de videovigilancia en tiempo real para que viajes con seguridad.

Te encuentras en:
¡Ven a tocar el piano a Diagonal!
Una prueba piloto para acoger un piano de forma fija y acercar la música a los usuarios.
Cuando: Desde 23.03.2025
Dónde: Estación Diagonal
Acceso: Acceso validando el billete de transporte
Transports Metropolitans de Barcelona (TMB) a través de su Fundación, ha colaborado un año más con el prestigioso Concurso de Piano Maria Canals , que se celebró del 23 de marzo al 3 de abril.
En esta edición se celebraron los 70 años del concurso con una exposición bajo el título Maria Canals, un concurso con alma y el Centenario del metro
.
En el Espacio Mercè Sala se colocaron dos pianos: uno de media cola, como el que se ha instalado otros años, que estuvo a disposición de la ciudadanía, de coros y de escuelas de música durante 15 días, y un segundo piano de pared, que se instaló con la vocación de quedarse de manera permanente.

Una prueba para acercar la música a todos los usuarios y usuarias
Aprovechando sendas celebraciones, ambas entidades iniciaron la experiencia de dejar un piano de forma permanente en el vestíbulo de la L5 de la estación Diagonal .
El piano invita a los pasajeros a aceptar el reto de detenerse, sentarse y hacer sonar sus teclas. Si la iniciativa se evalúa como positiva, la previsión es que el piano de pared se quede de forma permanente en la red para que todo aquel que lo desee pueda tocarlo.
De momento, se trata de una prueba piloto que busca mejorar la experiencia de viaje. Esperamos que los resultados sean positivos y podamos disfrutar durante mucho tiempo de las intervenciones musicales de piano en el metro.

Te encuentras en:
Abrimos el Espacio Mercè Sala en La Noche de los Museos
Visítanos la noche del 17 al 18 de mayo.
Cuando: 17.05.2025
Dónde: Espacio Mercè Sala (Estación Diagonal)
Acceso: Acceso libre con validación del billete de transporte.
Un año más, TMB se suma a La Noche de los Museos abriendo al público la sala de exposiciones de la estación Diagonal
.
¿Alguna vez has entrado en un museo cuando cae la noche? El sábado, 17 de mayo, de 19:00 a 01:00 horas, ¡tienes la oportunidad de hacerlo! Llega La Noche de los Museos con una nueva edición llena de propuestas y experiencias en 94 espacios. Además de las puertas abiertas, encontrarás hasta 94 actividades extraordinarias, desde conciertos y recitales hasta mapping, talleres y actuaciones, así como visitas guiadas que darán una nueva dimensión a las colecciones y exposiciones.
Este año se incorporan equipamientos que no participaron el año pasado y también vuelven a participar espacios de Badalona, Cornellà de Llobregat, Esplugues de Llobregat, L'Hospitalet de Llobregat, Sant Adrià de Besòs, Santa Coloma de Gramenet y Sant Joan Despí, que abrirán sus puertas para hacer de esta velada un gran evento.
Así que ya lo sabes: consulta la programación, planifica la ruta y asegúrate de averiguar si es necesario reservar con antelación para alguna actividad.

Te presentamos la exposición Maria Canals, un cocurso con alma
El Concurso Internacional de Piano Maria Canals y TMB se unen para conmemorar, después de una larga colaboración, tres hitos importantes que llegan en 2025: los cien años del metro de Barcelona, los quince años del Espai Mercè Sala y el 70º aniversario del concurso musical.
Para celebrar, el Espacio Mercè Sala acoge una exposición conmemorativa del concurso Maria Canals que se puede visitar hasta el 21 de junio. La exposición repasa todas las actividades y logros alcanzados a lo largo del tiempo como promotor de intérpretes profesionales, además de destacar su labor educativa y social, resaltando la vitalidad del proyecto en la actualidad.
La visita a esta retrospectiva fotográfica incluye citas y breves audiovisuales que rinden homenaje a las personas que han formado parte de la historia del concurso, fundado en 1954 por la pianista y pedagoga Maria Canals.
Si quieres descubrir más detalles, visita la página de la exposición .
Ven a la exposición... ¡A tocar el piano!
Esta velada especial estará amenizada con la música del piano que la asociación Maria Canals ha cedido a TMB, y que está situado justo delante del Espai Mercè Sala.
Durante el evento, el piano contará con intérpretes espontáneos y con la participación de asociaciones de amigos y amantes de la música como Orpheus (de música clásica), AMUC (Músicos del Metro y de la Calle) y Taller de Músics. Todos juntos, formarán una jam session abierta a quien quiera unirse.
Será una ocasión fantástica para disfrutar de la música en un ambiente colaborativo y cercano. ¡Te esperamos!
Te encuentras en:
Tarifas de los títulos de transporte vigentes a partir del 15 de enero de 2025
Las tarifas del 2024 son vigentes hasta el 14 de enero de 2025
Título | 1 zona | 2 zonas | 3 zonas | 4 zonas | 5 zonas | 6 zonas |
---|---|---|---|---|---|---|
Billete sencillo* | 2,65 € | 3,80 € | 4,95 € | 6,35 € | 8,10 € | 9,45 € |
T-casual | 12,55 € | 24,65 € | 33,55 € | 43,15 € | 49,55 € | 52,70 € |
T-usual** | 22,00 € | 29,65 € | 41,60 € | 50,90 € | 58,35 € | 62,55 € |
T-dia | 11,55 € | 17,65 € | 22,15 € | 24,75 € | 27,70 € | 31,00 € |
T-familiar | 11,05 € | 20,95 € | 29,70 € | 38,50 € | 44,00 € | 46,20 € |
T-aire | 2,30 € | 4,45 € | 6,05 € | 7,80 € | 8,95 € | 9,50 € |
*En TMB, solo se pueden comprar billetes sencillos para metro y bus de Barcelona. Son billetes sencillos de zona única y tienen el precio de los billetes sencillos de una zona.
**El precio de la T-usual ya tiene aplicada la reducción del 50%.
Precio de otros títulos
T-4 (precio con la reducción del 50% ya aplicada): 2,15 €.
T-joven (precio único para todas las zonas y con la reducción del 50% ya aplicada): 44,00 €.
T-usual bonificada (precio único para todas las zonas y con la reducción del 50% ya aplicada): 5,50 €.
Billet Aeropuerto (solo se vende para metro de Barcelona): 5,70 €.
Consulta los precios de las modalidades para familias monoparentales y para familias numerosas en la página Reducción de precios de títulos de transporte.
Caducidad y canje de los títulos comprados entre el 15 de enero de 2024 y el 14 de enero de 2025
Caducidad
En general, los títulos adquiridos entre el 15 de enero de 2024 y el 14 de enero de 2025 (es decir, antes del cambio de tarifas), se pudieron utilizar hasta el 28 de febrero de 2025. La T-joven y la T-70/90, en todas sus modalidades, caducaron el 30 de abril de 2025.
Canje
Los títulos comprados entre el 15 de enero de 2024 y el 14 de enero de 2025 se pudieron canjear por títulos de tarifa 2025 hasta el 30 de abril de 2025.
También te pueden interesar
-
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio. -
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor. -
FinalizadoCampaña
Siempre estamos
El metro y los buses cuentan con cámaras de videovigilancia en tiempo real para que viajes con seguridad.
Te encuentras en:
La comunidad TMB supera el millón y medio de seguidores
La comunidad de usuarios de TMB que nos siguen en las redes sociales y en JoTMBé ya suman más de un millón y medio de personas.
Redes sociales y JoTMBé
¡En TMB estamos de enhorabuena! Nuestra comunidad de usuarios sigue creciendo y las personas conectadas a través de nuestros perfiles en las redes sociales y en JoTMBé ya son más de un millón y medio.
Sois muchos los que nos seguís en Instagram, Facebook, X, LinkedIn, Spotify, YouTube y WeChat para estar al tanto de todas las novedades, servicios e iniciativas que ponemos en marcha. Y, desde el 31 de enero de 2025, también en TikTok .
Además, a través de JoTMBé, miles de vosotros disfrutáis de información actualizada del servicio, ventajas exclusivas y compráis y recargáis títulos de transporte con total agilidad. También los suscriptores del blog Hola Barcelona aprovecháis las mejores propuestas y consejos para no perderos nada de la ciudad.
Queremos agradeceros la confianza y el apoyo. Vuestra participación es clave para seguir mejorando día a día y ofreceros el mejor servicio posible.
¡Nos queda mucho camino por recorrer juntos!
Únete a la comunidad de TMB y vive el transporte público como nunca antes.
Síguenos en nuestras redes sociales, regístrate en JoTMBé y suscríbete al boletín del blog Hola Barcelona para descubrir todo lo que tenemos preparado para ti. Estarás al día de las novedades, podrás participar en concursos, recibirás consejos para tus trayectos, accederás a promociones exclusivas y muchos más beneficios por formar parte de ella.
También te pueden interesar
-
Finalizado
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio. -
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor.

Te encuentras en:
45ª Carrera El Corte Inglés
¡Te explicamos cómo llegar!
Cuando: 11.05.2025
Dónde: Desde la avenida Diagonal
Si participas en la Carrera El Corte Inglés , llega en transporte público. En TMB te llevamos.
Recomendamos acceder al punto de salida en metro, en las estaciones Maria Cristina y Palau Reial de la línea 3.
Dispones de Cómo llegar para encontrar otras opciones de transporte.
Consulta las afectaciones en el servicio de bus y las recomendaciones de transporte.
Hasta primera hora de la tarde del domingo 11 de mayo, recomendamos usar el metro como medio de transporte principal. La amplitud del recorrido y la duración la carrera provocarán alteraciones en el servicio a varias líneas de autobús.

Billete de transporte exclusivo
Para esta edición, se han editado 30.000 billetes sencillos, que se incluyen en la bolsa de los corredores hasta agotar las existencias.
TMB, con los grandes eventos de la ciudad
Desde su primera edición en el año 1986, la Carrera El Corte Inglés es una de las más conocidas y consolidadas de la ciudad. En la edición de este año, los 40.000 corredores que participarán de forma gratuita recorrerán 10 km por las principales calles de Barcelona.
TMB, como principal operador de transporte público de Barcelona y su área metropolitana, trabaja en el impacto que una celebración de esta magnitud puede tener en la red de transporte. Además, también se involucra de forma activa con los eventos, estando presente de forma latente y colaborando a nivel logístico y de marca.
¡Ve con TMB App!
Diseña tu ruta, configura las alertas del transporte que necesites y llega a la carrera sin sorpresas.
-
Finalizado
Ponte en su piel, no en su lugar
Respeta la prioridad absoluta en el transporte público. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio. -
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1502536" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1502536" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign newwindow = "">
642 <#if !isFundacio>
643 <#if articleURL?contains("/fundacio-tmb")>
644 <#assign link1 = articleURL?split("fundacio-tmb")>
645 <#if (getterUtil.getInteger(link1?size)>0)>
646 <#assign newwindow = "target='_blank'">
647 <#if articleURL?contains("pre3")>
648 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
649 <#else>
650 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
651 </#if>
652 <#elseif getterUtil.getInteger(link1?size) == 0>
653 <#assign newwindow = "target='_blank'">
654 <#if articleURL?contains("pre3")>
655 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage()>
656 <#else>
657 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage()>
658 </#if>
659 </#if>
660 </#if>
661 <#else>
662 <#if articleURL?contains("/web/tmb")>
663 <#assign link1 = articleURL?split("web/tmb")>
664 <#if (getterUtil.getInteger(link1?size)>0)>
665 <#assign newwindow = "target='_blank'">
666 <#if articleURL?contains("pre3")>
667 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + link1[1]>
668 <#else>
669 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + link1[1]>
670 </#if>
671 <#elseif getterUtil.getInteger(link1?size) == 0>
672 <#assign newwindow = "target='_blank'">
673 <#if articleURL?contains("pre3")>
674 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage()>
675 <#else>
676 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage()>
677 </#if>
678 </#if>
679 </#if>
680 </#if>
681
682 <#assign title = "">
683 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
684 <#if titleSel.selectSingleNode(rootElement)?has_content>
685 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
686 </#if>
687
688 <#assign subtitle = "">
689 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
690 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
691 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
692 </#if>
693
694 <#assign initDateNovetatAgenda = "">
695 <#assign fromInitDateNovetatAgenda = "">
696 <#assign endDateNovetatAgenda = "">
697 <#assign whereNovetatAgenda = "">
698 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
699 <#if novetatAgendaSel?has_content>
700 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
701
702 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
703 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
704 </#if>
705
706 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
707 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
708 </#if>
709
710 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
711 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
712 </#if>
713
714 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
715 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
716 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
717 </#if>
718 </#if>
719
720 <#assign typeNovetatAgenda = "">
721 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
722 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
723 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
724 </#if>
725
726 <#assign filterNovetatAgenda = "">
727 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
728 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
729 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
730 </#if>
731
732 <#assign imageNovetatAgenda = "">
733 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
734 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
735 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
736 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
737 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
738 </#if>
739
740 <#assign imageAltNovetatAgenda = "">
741 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
742 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
743 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
744 </#if>
745
746 <#assign pubDateNovetatAgenda = "">
747 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
748 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
749 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
750 </#if>
751
752 <#assign pubTimeNovetatAgenda = "">
753 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
754 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
755 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
756 </#if>
757
758 <#assign despubDateNovetatAgenda = "">
759 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
760 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
761 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
762 </#if>
763
764 <#assign despubTimeNovetatAgenda = "">
765 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
766 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
767 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
768 </#if>
769
770 <#assign isExpiredNovetatAgenda = "">
771 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
772 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
773 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
774 </#if>
775
776 <#assign isPublishedNA = false>
777 <#if (pubDateNovetatAgenda?has_content)>
778 <#if pubTimeNovetatAgenda?has_content>
779 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
780 <#assign timeActFormat = timeActDate?string["HH:mm"]>
781 <#else>
782 <#assign timeActDate = "">
783 <#assign timeActFormat = "">
784 </#if>
785 <#attempt>
786 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
787
788 <#if timeActFormat?has_content && timeActFormat != "">
789 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
790 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
791 </#if>
792 <#assign dataActMil = dataAct?long>
793 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
794 <#assign isPublishedNA = (dataActMil - now ) < 0 />
795 <#recover>
796 </#attempt>
797 </#if>
798
799 <#assign isDespublishedNA = false>
800 <#if (despubDateNovetatAgenda?has_content)>
801 <#if despubTimeNovetatAgenda?has_content>
802 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
803 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
804 <#else>
805 <#assign timeExpDate = "">
806 <#assign timeExpFormat = "">
807 </#if>
808 <#attempt>
809 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
810
811 <#if timeExpFormat?has_content && timeExpFormat != "">
812 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
813 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
814 </#if>
815 <#assign dataExpMil = dataExp?long>
816 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
817 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
818 <#recover>
819 </#attempt>
820 </#if>
821
822 <#assign isExpiredNA = false>
823 <#if journalArticle.expirationDate??>
824 <#assign dataExp = journalArticle.expirationDate?datetime>
825 <#attempt>
826 <#assign dataExpMil = dataExp?long>
827 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
828 <#assign isExpiredNA = (dataExpMil - now) < 0 />
829 <#recover>
830 </#attempt>
831 </#if>
832
833 <#assign showNovetatAgenda = false>
834 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
835 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
836 <#else>
837 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
838 </#if>
839
840 <#if showNovetatAgenda>
841 <#if title?has_content>
842 <li class="hola-bcn-carrusel-standard_new-li">
843 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
844 <div class="hola-bcn-carrusel-standard__card-cover">
845 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
846 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
847 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
848 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
849 </div>
850 <#if filterNovetatAgenda?has_content>
851 <div class="hola-bcn-carrusel-standard-highlight">
852 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
853 </div>
854 </#if>
855 </div>
856 <div class="hola-bcn-carrusel-standard-container">
857 <div>
858 <h3 class="hola-bcn-carrusel-standard__card-title">
859 ${title}
860 <#if newwindow?? && newwindow?has_content>
861 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
862 </#if>
863 </h3>
864 <span class="hola-bcn-carrusel-standard__card-description">
865 ${subtitle}
866 </span>
867 </div>
868 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
869 <div class="hola-bcn-carrusel-standard_bottom-extra">
870 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
871 <div class="hola-bcn-carrusel-standard-date">
872 <#if fromInitDateNovetatAgenda == "true">
873 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
874 <#else>
875 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
876 </#if>
877 </div>
878 </#if>
879 <#if whereNovetatAgenda?has_content>
880 <div class="hola-bcn-carrusel-standard-where">
881 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
882 </div>
883 </#if>
884 </div>
885 </#if>
886 </div>
887 </a>
888 </li>
889 </#if>
890 </#if>
891 </#if>
892 </#list>
893 </ul>
894 </div>
895 </div>
896 </div>
897 </section>
898
899 <script type="text/javascript">
900
901 $(document).ready(function() {
902 initSliderBcnStandard();
903 });
904
905 function initSliderBcnStandard() {
906 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
907 $(".js__hola-bcn-standard-slider").slick("unslick");
908 }
909
910 $('.js__hola-bcn-standard-slider').slick({
911 slidesToShow: 3,
912 slidesToScroll: 1,
913 arrows: false,
914 dots: false,
915 draggable: false,
916 infinite: false,
917 responsive: [
918 {
919 breakpoint: 767,
920 settings: {
921 variableWidth: true,
922 slidesToShow: 2,
923 slidesToScroll: 1,
924 arrows: false,
925 dots: true,
926 draggable: true,
927 infinite: true
928 }
929 }
930 ]
931 });
932 }
933
934 </script>
935</#if>
Te encuentras en:
Siempre estamos
El metro y los buses cuentan con cámaras de videovigilancia en tiempo real para que viajes con seguridad.
Gracias a los sistemas de videovigilancia, los profesionales de TMB velan por tu seguridad durante todas las horas del servicio, tanto en metro como en bus.
Videovigilancia en el metro
La red de metro cuenta con casi 10.000 cámaras que están repartidas por trenes y estaciones y también en cocheras, talleres y otras dependencias de TMB.
Estas cámaras permiten ver lo que está sucediendo en directo cuando un usuario pulsa el botón SOS o el de información en un tren o en una estación. Las imágenes captadas por estos dispositivos de videovigilancia se reciben en el Centro de Control de Metro y en el Centro de Seguridad y Protección Civil.
Videovigilancia en el bus
La red de bus dispone de más de 4.500 cámaras que actualmente cubren prácticamente todo el servicio regular de la flota.
Este sistema de videovigilancia permite al Centro de Control de Seguridad de Bus visualizar en tiempo real imágenes del interior de los vehículos, así como descargar al momento cualquiera de las grabaciones.
Imágenes a disposición de los cuerpos de seguridad
Las imágenes captadas por estos dispositivos de videovigilancia, tanto de la red de bus como la de metro, quedan grabadas y pueden ser revisadas cuando los Mossos d'Esquadra u otros cuerpos de seguridad lo requieran.
-
FinalizadoCampaña
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor. -
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio.
Te encuentras en:
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio.
Nunca bajes a las vías
No lo hagas bajo ningún concepto.
- Si necesitas cruzar a la otra plataforma, usa las escaleras o los ascensores.
- Si algún objeto cae a la vía, utiliza el interfono SOS de la plataforma y te ayudaremos a recuperarlo cuando sea seguro.
- Actúa cívicamente y respeta las instalaciones.
Bajar a la vía es peligroso y puede ser mortal.
No subas al tren cuando se estén cerrando las puertas
Cuando se active la señal de cierre de puertas, no podrás entrar ni salir del vagón.
- Si llegas a la plataforma y suena la señal de cierre (sonora y visual), debes respetarla y esperar el siguiente tren.
Una vez que la señal sonora/visual se inicie, ya no podrás subir ni bajar.
- Si estás a bordo del tren y te das cuenta tarde de que necesitas bajar, debes esperar a la siguiente estación. Al llegar allí, podrás bajar y regresar hasta donde querías ir.
Una vez que se inicie la señal sonora/visual, ya no se podrá bajar.
- Nunca intentes forzar las puertas del tren. Podrías quedar atrapado y sufrir un accidente grave.
Si te sientes mal en el metro, pide ayuda
Tanto si estás en la plataforma como dentro del vagón, utiliza el interfono SOS. El metro dispone de 2.300 interfonos distribuidos por todas las plataformas y vestíbulos de las estaciones.
- Cuando empieces a sentirte mal, sal del tren lo antes posible y pide ayuda a través del interfono SOS en la plataforma, o mira si alguien puede hacerlo por ti.
- Si los síntomas aparecen antes de subir al tren, quédate en la plataforma y presiona el botón SOS del interfono.
- Si sospechas que una persona está sufriendo un paro cardíaco, localiza el desfibrilador en la plataforma y sigue las instrucciones. La red de metro está cardioprotegida.
Más información
Encontrarás más información en Cómo se viaja en metro.
¡Recuerda!
Nunca bajes a la vía, conlleva riesgo de muerte.
No subas al tren cuando se estén cerrando las puertas.
Si te encuentras mal, no subas al vagón. Pide ayuda al interfono SOS del andén.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1502536" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1502536" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign newwindow = "">
642 <#if !isFundacio>
643 <#if articleURL?contains("/fundacio-tmb")>
644 <#assign link1 = articleURL?split("fundacio-tmb")>
645 <#if (getterUtil.getInteger(link1?size)>0)>
646 <#assign newwindow = "target='_blank'">
647 <#if articleURL?contains("pre3")>
648 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
649 <#else>
650 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
651 </#if>
652 <#elseif getterUtil.getInteger(link1?size) == 0>
653 <#assign newwindow = "target='_blank'">
654 <#if articleURL?contains("pre3")>
655 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage()>
656 <#else>
657 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage()>
658 </#if>
659 </#if>
660 </#if>
661 <#else>
662 <#if articleURL?contains("/web/tmb")>
663 <#assign link1 = articleURL?split("web/tmb")>
664 <#if (getterUtil.getInteger(link1?size)>0)>
665 <#assign newwindow = "target='_blank'">
666 <#if articleURL?contains("pre3")>
667 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + link1[1]>
668 <#else>
669 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + link1[1]>
670 </#if>
671 <#elseif getterUtil.getInteger(link1?size) == 0>
672 <#assign newwindow = "target='_blank'">
673 <#if articleURL?contains("pre3")>
674 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage()>
675 <#else>
676 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage()>
677 </#if>
678 </#if>
679 </#if>
680 </#if>
681
682 <#assign title = "">
683 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
684 <#if titleSel.selectSingleNode(rootElement)?has_content>
685 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
686 </#if>
687
688 <#assign subtitle = "">
689 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
690 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
691 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
692 </#if>
693
694 <#assign initDateNovetatAgenda = "">
695 <#assign fromInitDateNovetatAgenda = "">
696 <#assign endDateNovetatAgenda = "">
697 <#assign whereNovetatAgenda = "">
698 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
699 <#if novetatAgendaSel?has_content>
700 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
701
702 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
703 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
704 </#if>
705
706 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
707 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
708 </#if>
709
710 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
711 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
712 </#if>
713
714 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
715 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
716 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
717 </#if>
718 </#if>
719
720 <#assign typeNovetatAgenda = "">
721 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
722 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
723 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
724 </#if>
725
726 <#assign filterNovetatAgenda = "">
727 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
728 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
729 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
730 </#if>
731
732 <#assign imageNovetatAgenda = "">
733 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
734 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
735 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
736 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
737 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
738 </#if>
739
740 <#assign imageAltNovetatAgenda = "">
741 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
742 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
743 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
744 </#if>
745
746 <#assign pubDateNovetatAgenda = "">
747 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
748 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
749 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
750 </#if>
751
752 <#assign pubTimeNovetatAgenda = "">
753 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
754 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
755 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
756 </#if>
757
758 <#assign despubDateNovetatAgenda = "">
759 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
760 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
761 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
762 </#if>
763
764 <#assign despubTimeNovetatAgenda = "">
765 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
766 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
767 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
768 </#if>
769
770 <#assign isExpiredNovetatAgenda = "">
771 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
772 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
773 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
774 </#if>
775
776 <#assign isPublishedNA = false>
777 <#if (pubDateNovetatAgenda?has_content)>
778 <#if pubTimeNovetatAgenda?has_content>
779 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
780 <#assign timeActFormat = timeActDate?string["HH:mm"]>
781 <#else>
782 <#assign timeActDate = "">
783 <#assign timeActFormat = "">
784 </#if>
785 <#attempt>
786 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
787
788 <#if timeActFormat?has_content && timeActFormat != "">
789 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
790 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
791 </#if>
792 <#assign dataActMil = dataAct?long>
793 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
794 <#assign isPublishedNA = (dataActMil - now ) < 0 />
795 <#recover>
796 </#attempt>
797 </#if>
798
799 <#assign isDespublishedNA = false>
800 <#if (despubDateNovetatAgenda?has_content)>
801 <#if despubTimeNovetatAgenda?has_content>
802 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
803 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
804 <#else>
805 <#assign timeExpDate = "">
806 <#assign timeExpFormat = "">
807 </#if>
808 <#attempt>
809 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
810
811 <#if timeExpFormat?has_content && timeExpFormat != "">
812 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
813 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
814 </#if>
815 <#assign dataExpMil = dataExp?long>
816 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
817 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
818 <#recover>
819 </#attempt>
820 </#if>
821
822 <#assign isExpiredNA = false>
823 <#if journalArticle.expirationDate??>
824 <#assign dataExp = journalArticle.expirationDate?datetime>
825 <#attempt>
826 <#assign dataExpMil = dataExp?long>
827 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
828 <#assign isExpiredNA = (dataExpMil - now) < 0 />
829 <#recover>
830 </#attempt>
831 </#if>
832
833 <#assign showNovetatAgenda = false>
834 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
835 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
836 <#else>
837 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
838 </#if>
839
840 <#if showNovetatAgenda>
841 <#if title?has_content>
842 <li class="hola-bcn-carrusel-standard_new-li">
843 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
844 <div class="hola-bcn-carrusel-standard__card-cover">
845 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
846 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
847 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
848 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
849 </div>
850 <#if filterNovetatAgenda?has_content>
851 <div class="hola-bcn-carrusel-standard-highlight">
852 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
853 </div>
854 </#if>
855 </div>
856 <div class="hola-bcn-carrusel-standard-container">
857 <div>
858 <h3 class="hola-bcn-carrusel-standard__card-title">
859 ${title}
860 <#if newwindow?? && newwindow?has_content>
861 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
862 </#if>
863 </h3>
864 <span class="hola-bcn-carrusel-standard__card-description">
865 ${subtitle}
866 </span>
867 </div>
868 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
869 <div class="hola-bcn-carrusel-standard_bottom-extra">
870 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
871 <div class="hola-bcn-carrusel-standard-date">
872 <#if fromInitDateNovetatAgenda == "true">
873 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
874 <#else>
875 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
876 </#if>
877 </div>
878 </#if>
879 <#if whereNovetatAgenda?has_content>
880 <div class="hola-bcn-carrusel-standard-where">
881 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
882 </div>
883 </#if>
884 </div>
885 </#if>
886 </div>
887 </a>
888 </li>
889 </#if>
890 </#if>
891 </#if>
892 </#list>
893 </ul>
894 </div>
895 </div>
896 </div>
897 </section>
898
899 <script type="text/javascript">
900
901 $(document).ready(function() {
902 initSliderBcnStandard();
903 });
904
905 function initSliderBcnStandard() {
906 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
907 $(".js__hola-bcn-standard-slider").slick("unslick");
908 }
909
910 $('.js__hola-bcn-standard-slider').slick({
911 slidesToShow: 3,
912 slidesToScroll: 1,
913 arrows: false,
914 dots: false,
915 draggable: false,
916 infinite: false,
917 responsive: [
918 {
919 breakpoint: 767,
920 settings: {
921 variableWidth: true,
922 slidesToShow: 2,
923 slidesToScroll: 1,
924 arrows: false,
925 dots: true,
926 draggable: true,
927 infinite: true
928 }
929 }
930 ]
931 });
932 }
933
934 </script>
935</#if>
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1502536" at line 308, column 85] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if detallAgenda?? && 0 < detallAgend... [in template "20155#20195#1502536" at line 308, column 1] ----
1<#assign imagesFolder = themeDisplay.getPathThemeImages()>
2<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
3<#assign currentURL = request.getRequestURL() />
4<#assign isFundacio = false>
5<#if currentURL?contains("fundacio")>
6 <#assign isFundacio = true>
7</#if>
8
9<#function miliSeconds dateString firstDate>
10 <#assign params = dateString?split(":")>
11
12 <#if params?size == 2>
13 <#assign param1 = params[0]>
14 <#assign param2 = params[1]>
15 <#assign param1 = getterUtil.getLong(param1)*3600000>
16 <#assign param2 = getterUtil.getLong(param2)*60000>
17 <#assign finalMilSec = param1 + param2>
18 <#assign finalMilSecLong = getterUtil.getLong(finalMilSec)>
19 <#assign resultLong = firstDate + finalMilSecLong>
20
21 <#return resultLong>
22 </#if>
23</#function>
24
25<#-- header-image -->
26
27<#if upperImage?? && upperImage.getData()?has_content>
28 <div class="header-image">
29 <img src="${upperImage.getData()}" <#if upperImageAlt?? && upperImageAlt.getData()?has_content>alt="${upperImageAlt.getData()}"</#if>>
30 </div>
31</#if>
32
33
34<#-- breadcrumbs -->
35
36<div class="full-body__container breadcrumbs" style="float: unset; margin-right: auto; padding-bottom: 22px; padding-top: 22px;">
37 <p class="breadcrumbs__title"><@liferay.language key='header.breadcrumbs.text' />:</p>
38 <#if liferay_portlet?has_content><@liferay.breadcrumbs /></#if>
39</div>
40
41
42<#-- TITOL I SUBTITOL -->
43
44<#if titleGlobal?? && titleGlobal.getData()?has_content || subtitleGlobal?? && subtitleGlobal.getData()?has_content>
45 <div class="full-body__container basicav2-titol-subtitol">
46 <#if titleGlobal?? && titleGlobal.getData()?has_content><h1>${titleGlobal.getData()}</h1></#if>
47 <#if subtitleGlobal?? && subtitleGlobal.getData()?has_content><p>${subtitleGlobal.getData()}</p></#if>
48 </div>
49</#if>
50
51
52<#-- bloc-info-agenda -->
53
54<#if blocInfoAgenda?? && ((blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content) || (blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content)) && (!blocInfoAgenda.hideBlocInfoAgenda?? || !getterUtil.getBoolean(blocInfoAgenda.hideBlocInfoAgenda.getData()))>
55 <div class="full-body__container bloc-info-agenda">
56 <div class="bloc-info-agenda-elements">
57 <#if blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?has_content>
58 <div class="bloc-info-agenda-element">
59 <#if blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()?has_content>
60 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whenBlocInfoAgenda.imageWhenBlocInfoAgenda.getData()}">
61 <#else>
62 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/calendar.svg">
63 </#if>
64 <#if blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData()?has_content && getterUtil.getBoolean(blocInfoAgenda.whenBlocInfoAgenda.fromInitDateBlocInfoAgenda.getData())>
65 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b><@liferay.language key='label.bloc.novetatagenda.from' /> ${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</b></p></div>
66 <#else>
67 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.when"/> <b>${blocInfoAgenda.whenBlocInfoAgenda.initDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}<#if blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda?? && blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?has_content> <@liferay.language key="label.bloc.novetatagenda.to"/> ${blocInfoAgenda.whenBlocInfoAgenda.endDateBlocInfoAgenda.getData()?date["yyyy-MM-dd"]?string("dd.MM.yyyy")}</#if></b></p></div>
68 </#if>
69 </div>
70 <hr>
71 </#if>
72 <#if blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()?has_content>
73 <div class="bloc-info-agenda-element">
74 <#if blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda?? && blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()?has_content>
75 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.whereBlocInfoAgenda.imageWhereBlocInfoAgenda.getData()}">
76 <#else>
77 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/location_on.svg">
78 </#if>
79 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.where"/> <b>${blocInfoAgenda.whereBlocInfoAgenda.textWhereBlocInfoAgenda.getData()}</b></p></div>
80 </div>
81 <hr>
82 </#if>
83 <#if blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()?has_content>
84 <div class="bloc-info-agenda-element">
85 <#if blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda?? && blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()?has_content>
86 <img class="bloc-info-agenda-img" src="${blocInfoAgenda.accesBlocInfoAgenda.imageAccesBlocInfoAgenda.getData()}">
87 <#else>
88 <img class="bloc-info-agenda-img" src="${imagesFolder}/basic/24px/svg/ticket.svg">
89 </#if>
90 <div class="bloc-info-agenda-text"><p><@liferay.language key="label.bloc.novetatagenda.acces"/> <b>${blocInfoAgenda.accesBlocInfoAgenda.textAccesBlocInfoAgenda.getData()}</b></p></div>
91 </div>
92 </#if>
93 </div>
94 <#if blocInfoAgenda.textBottomBlocInfoAgenda?? && blocInfoAgenda.textBottomBlocInfoAgenda.getData()?has_content>
95 <div class="bloc-info-agenda-bottom">
96 <span>${blocInfoAgenda.textBottomBlocInfoAgenda.getData()}</span>
97 </div>
98 </#if>
99 </div>
100</#if>
101
102<#-- text-center -->
103
104<#if textCenter?? && textCenter.getData()?has_content>
105 <div class="full-body__container text-center-basic">
106 ${textCenter.getData()}
107 </div>
108</#if>
109
110
111<#-- image-center -->
112
113<#if imageCenter?? && imageCenter.getData()?has_content>
114 <div class="full-body__container image-center-basic">
115 <img src="${imageCenter.getData()}">
116 </div>
117</#if>
118
119
120<#-- TEXT-CARRUSEL-IMATGES -->
121
122<#if textCarruselImatges1?? && 0 < textCarruselImatges1.elementsFieldSet.getSiblings()?size && textCarruselImatges1.elementsFieldSet.getSiblings()[0].elementsFieldSetFieldSet.image.getData()?has_content && (!textCarruselImatges1.hideTextCarruselImatges?? || !getterUtil.getBoolean(textCarruselImatges1.hideTextCarruselImatges.getData()))>
123 <#assign entriesMapList = []>
124 <#foreach elem in textCarruselImatges1.elementsFieldSet.getSiblings()>
125 <#if elem.elementsFieldSetFieldSet.order?has_content>
126 <#assign currentOrder = elem.elementsFieldSetFieldSet.order.getData()>
127 </#if>
128 <#if !currentOrder?has_content || currentOrder == "null">
129 <#assign currentOrder = "99">
130 </#if>
131 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSet , "order" : currentOrder?number}>
132 <#assign entriesMapList = entriesMapList + [currEntryMap]>
133 </#foreach>
134
135 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
136 <#assign sortedEntriesRootElems = []>
137
138 <#foreach currEntryMap in sortedEntriesMapList>
139 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
140 </#foreach>
141
142 <#assign leftContent = "">
143 <#if textCarruselImatges1.titleHeader?? && textCarruselImatges1.titleHeader.getData()?has_content && textCarruselImatges1.descHeader?? && textCarruselImatges1.descHeader?has_content>
144 <#assign leftContent = "true">
145 </#if>
146
147 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
148 <#if leftContent?has_content>
149 <div class="hero-carousel__container-banner">
150 <h2 class="hero-carousel-banner-alt-title">
151 ${textCarruselImatges1.titleHeader.getData()}
152 </h2>
153 <p class="hero-carousel-banner-alt-desc">
154 ${textCarruselImatges1.descHeader.getData()}
155 </p>
156 </div>
157 </#if>
158 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
159 <div class="hero-carousel__container js-carousel-banner-al_1 is-playing"
160 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
161 data-next-text='<@liferay.language key="label.carousel.next"/>'
162 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
163 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
164 data-play-text='<@liferay.language key="label.carousel.start"/>'>
165 <#if sortedEntriesRootElems?has_content>
166 <#foreach element in sortedEntriesRootElems>
167 <div class="hero hero--super">
168 <div class="hero__container">
169 <#if element.typeLink.getData() == "video">
170 <a href="#" onclick='showVideoModalBanner(`${element.External_Link.getData()}`);return false;' class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>>
171 <#else>
172 <a class="hero__link" <#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if> <#if element.typeLink.getData() == "extern"> href="${element.External_Link.getData()}" target="_blank" <#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content> href="${element.External_Link.getData()}" target="_self" </#if>>
173 </#if>
174 <div class="hero__media">
175 <#if element.typeLink.getData() == "video">
176 <div class="hero__media-video__container">
177 <span class="hero__media-video__img">
178 </span>
179 </div>
180 </#if>
181 <img class="hero__image hero__image-new lazyload" data-src="${element.image.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
182 </div>
183 <div class="hero__content white__banner">
184 <p class="hero__title" >
185 ${element.titleElem.getData()}
186 <#if element.typeLink.getData() == "extern">
187 <span class="window-warning">
188 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
189 </span>
190 </#if>
191 </p>
192 <p class="hero__desc-alt" >
193 ${element.descElem.getData()}
194 </p>
195 </div>
196 </a>
197 </div>
198 </div>
199 </#foreach>
200 </#if>
201 </div>
202 </div>
203 </div>
204
205 <div class="dialog">
206 <div id="carrusel-banner-video" class="u-hidden">
207 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
208 </div>
209 </div>
210 </div>
211 <script type="text/javascript">
212 initSliderCarruselBanner1();
213
214 function initSliderCarruselBanner1() {
215 if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) {
216 $(".js-carousel-banner-al_1").slick("unslick");
217 }
218 $('.js-carousel-banner-al_1 .slick-toggle-play').remove();
219 $('.js-carousel-banner-al_1').slick({
220 slidesToShow: 1,
221 arrows: true,
222 draggable: true,
223 infinite: false,
224 variableWidth: false,
225 autoplaySpeed: 4000,
226 dots: true,
227 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
228 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
229 responsive: [
230 {
231 breakpoint: 767,
232 settings: {
233 slidesToShow: 1,
234 arrows: false,
235 variableWidth: true,
236 dots: true
237 }
238 }
239 ]
240 }).each(function () {
241 var carousel = $(this),
242 toggleButton,
243 toggleIcon;
244
245 carousel.find('.slick-next__icon').attr({
246 'alt': carousel.data('next-text')
247 });
248
249 carousel.find('.slick-prev__icon').attr({
250 'alt': carousel.data('prev-text')
251 });
252 });
253
254 if ($('.hero-carousel__container .hero').length == 1) {
255 $('.hero-carousel__container .slick-toggle-play').hide();
256 }
257
258 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
259 if($(".js-carousel-banner-al_1 .slick-dots").length > 0) {
260 setDotsPositionBanner1();
261 }
262 }
263
264 function showVideoModalBanner(link) {
265 const start = link.indexOf("v=") + 2;
266 const end = start + 2 + 11;
267
268 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
269 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
270 }
271 function setDotsPositionBanner1() {
272 $(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent());
273 }
274
275 window.addEventListener('resize', function(event){
276 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
277 if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) {
278 setDotsPositionBanner1();
279 }
280 });
281
282 </script>
283</#if>
284
285
286<#-- BASICA-TITOL-TEXT -->
287
288<#if basicaTitolText?? && 0 < basicaTitolText.elementsBasica.getSiblings()?size && (basicaTitolText.elementsBasica.getSiblings()[0].titleBasica.getData()?has_content || basicaTitolText.elementsBasica.getSiblings()[0].contentBasica.getData()?has_content) && (!basicaTitolText.hideBasicaTitolText?? || !getterUtil.getBoolean(basicaTitolText.hideBasicaTitolText.getData()))>
289 <div class="full-body__container basica-titol-text">
290 <#foreach elem in basicaTitolText.elementsBasica.getSiblings()>
291 <div class="basica-titol-text-wrapper">
292 <#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if>
293 <#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if>
294 </div>
295 <#foreach subelem in elem.subelementsBasica.getSiblings()>
296 <div class="basica-titol-text-wrapper">
297 <#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if>
298 <#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if>
299 </div>
300 </#foreach>
301 </#foreach>
302 </div>
303</#if>
304
305
306<#-- bloc-detall-agenda -->
307
308<#if detallAgenda?? && 0 < detallAgenda.elementsDetallAgenda.getSiblings()?size && (detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda.getData()?has_content || detallAgenda.elementsDetallAgenda.getSiblings()[0].contentDetallAgenda.getData()?has_content) && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))>
309 <div class="full-body__container detall-agenda">
310 <#foreach elem in detallAgenda.elementsDetallAgenda.getSiblings()>
311 <div class="detall-agenda-wrapper">
312 <#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content><h2 class="">${elem.titleDetallAgenda.getData()}</h2></#if>
313 <#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content><div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div></#if>
314 </div>
315 </#foreach>
316 <div class="detall-agenda-buttons-wrapper">
317 <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()>
318 <a type="button" class="button button--a" <#if subelem.linkTypeDetallAgenda.getData() == "extern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" rel="external" target="_blank" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.Internal_LinkDetallAgenda?? && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content> href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}" target="_self" <#elseif subelem.linkTypeDetallAgenda.getData() == "intern" && subelem.External_LinkDetallAgenda?? && subelem.External_LinkDetallAgenda.getData()?has_content> href="${subelem.External_LinkDetallAgenda.getData()}" target="_self" </#if>>
319 <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span>
320 </a>
321 </#foreach>
322 </div>
323 </div>
324</#if>
325
326
327<#-- DT_PP_TITULO_VIDEO -->
328
329<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))>
330 <style>
331 .points-video__video-cover.no_video::after{
332 background: none;
333 }
334 </style>
335 <#assign hasLink = false>
336 <#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content>
337 <#assign hasLink = true>
338 </#if>
339 <section class="points-video bg-gray pt-56">
340 <div class="main__container">
341 <div class="full-body">
342 <div class="full-body__container points-video__header-extra-container">
343 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content>
344 <a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}">
345 </a>
346 </#if>
347 <#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content>
348 <div class="points-video__header">
349 <div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>>
350 <h2 class="points-video__title">
351 ${stPpVideo.titol.getData()}</h2>
352 <#if hasLink>
353 <a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
354 </#if>
355 </div>
356 <p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>>
357 ${stPpVideo.descriptiu.getData()}</p>
358 </div>
359 </#if>
360
361 <div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies">
362 <#if stPpVideo.linkFieldSet.link.getData()?has_content>
363 <#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2>
364 <#--13 because v= + 11 char for youtube ids
365 -->
366 <#assign end = start + 11>
367 <a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"
368 rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}">
369 <div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
370 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
371 </div>
372 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
373 <p class="points-video__caption">
374 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
375 </#if>
376 </a>
377 <#else>
378 <a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}">
379 <div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});">
380 <img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image">
381 </div>
382 <#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content>
383 <p class="points-video__caption">
384 ${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p>
385 </#if>
386 </a>
387
388 </#if>
389 </div>
390 <div class='cookieconsent-optout-marketing media-unit__content'>
391 <@liferay.language key="cookiebot.youtube.no-marketing"/>
392 </div>
393 <#if hasLink>
394 <a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a>
395 </#if>
396 </div>
397 </div>
398 </div>
399 </section>
400 <section class="video-dialog js__video-dialog u-hidden">
401 <div class="u-hidden" id="fragment-show-video">
402 <div class="video-dialog__panel">
403 <header class="video-dialog__header">
404 <button class="video-dialog__close js__video-dialog-close">
405 Cerrar</button>
406 </header>
407 <div class="video-dialog__content">
408 <div class="video-dialog__inner js__video-dialog-container">
409 <iframe data-cookieconsent="marketing" data-cookieblock-src="https://www.youtube.com/embed/${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}" frameborder="0" class="video-dialog__media" allow="encrypted-media" allowfullscreen="">
410 </iframe>
411 </div>
412 </div>
413 </div>
414 </div>
415 <div class="video-dialog__overlay js__video-dialog-close">
416 </div>
417 </section>
418</#if>
419
420
421<#-- TEXT-CARRUSEL-IMATGES-ALT -->
422
423<#if textCarruselImatges2?? && 0 < textCarruselImatges2.elementsFieldSetAlt.getSiblings()?size && textCarruselImatges2.elementsFieldSetAlt.getSiblings()[0].elementsFieldSetFieldSetAlt.imageAlt.getData()?has_content && (!textCarruselImatges2.hideTextCarruselImatgesAlt?? || !getterUtil.getBoolean(textCarruselImatges2.hideTextCarruselImatgesAlt.getData()))>
424 <#assign imagesFolder = themeDisplay.getPathThemeImages()>
425
426 <#assign entriesMapList = []>
427 <#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()>
428 <#if elem.elementsFieldSetFieldSetAlt.order?has_content>
429 <#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()>
430 </#if>
431 <#if !currentOrder?has_content || currentOrder == "null">
432 <#assign currentOrder = "99">
433 </#if>
434 <#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}>
435 <#assign entriesMapList = entriesMapList + [currEntryMap]>
436 </#foreach>
437
438 <#assign sortedEntriesMapList = entriesMapList?sort_by("order")>
439 <#assign sortedEntriesRootElems = []>
440
441 <#foreach currEntryMap in sortedEntriesMapList>
442 <#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]>
443 </#foreach>
444
445 <#assign leftContent = "">
446 <#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content>
447 <#assign leftContent = "true">
448 </#if>
449
450 <div class="full-body__container hero-carousel-new hero-carousel hero-carousel--super hero-carousel-banner-alt <#if !leftContent?has_content>hero-carousel-banner-solo</#if>">
451 <#if leftContent?has_content>
452 <div class="hero-carousel__container-banner">
453 <h2 class="hero-carousel-banner-alt-title">
454 ${textCarruselImatges2.titleHeaderAlt.getData()}
455 </h2>
456 <p class="hero-carousel-banner-alt-desc">
457 ${textCarruselImatges2.descHeaderAlt.getData()}
458 </p>
459 </div>
460 </#if>
461 <div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable">
462 <div class="hero-carousel__container js-carousel-banner-al_alt is-playing"
463 data-prev-text='<@liferay.language key="label.carousel.prev"/>'
464 data-next-text='<@liferay.language key="label.carousel.next"/>'
465 data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>'
466 data-stop-text='<@liferay.language key="label.carousel.pause"/>'
467 data-play-text='<@liferay.language key="label.carousel.start"/>'>
468 <#if sortedEntriesRootElems?has_content>
469 <#foreach element in sortedEntriesRootElems>
470 <div class="hero hero--super">
471 <div class="hero__container">
472 <#if element.typeLinkAlt.getData() == "video">
473 <a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>>
474 <#else>
475 <a class="hero__link" <#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if> <#if element.typeLinkAlt.getData() == "extern"> href="${element.External_LinkAlt.getData()}" target="_blank" <#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content> href="${element.Internal_Link.getFriendlyUrl()}" target="_self" <#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content> href="${element.External_LinkAlt.getData()}" target="_self" </#if>>
476 </#if>
477 <div class="hero__media">
478 <#if element.typeLinkAlt.getData() == "video">
479 <div class="hero__media-video__container">
480 <span class="hero__media-video__img">
481 </span>
482 </div>
483 </#if>
484 <img class="hero__image hero__image-new lazyload" data-src="${element.imageAlt.getData()}" <#if element.altImage?? && element.altImage.getData()?has_content>alt="${element.altImage.getData()}"</#if>>
485 </div>
486 <div class="hero__content white__banner">
487 <p class="hero__title" >
488 ${element.titleElemAlt.getData()}
489 <#if element.typeLinkAlt.getData() == "extern">
490 <span class="window-warning">
491 <img class="window-warning__icon" src="${imagesFolder}/basic/16px/png/icone-obrir-fora-blanc-16x16.png" alt="<@liferay.language key="label.externalLink.alt"/>" title="<@liferay.language key="label.externalLink.title"/>">
492 </span>
493 </#if>
494 </p>
495 <p class="hero__desc-alt" >
496 ${element.descElemAlt.getData()}
497 </p>
498 </div>
499 </a>
500 </div>
501 </div>
502 </#foreach>
503 </#if>
504 </div>
505 </div>
506 </div>
507
508 <div class="dialog">
509 <div id="carrusel-banner-video" class="u-hidden">
510 <div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content">
511 </div>
512 </div>
513 </div>
514 <script type="text/javascript">
515 initSliderCarruselBanner2();
516
517 function initSliderCarruselBanner2() {
518 if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) {
519 $(".js-carousel-banner-al_alt").slick("unslick");
520 }
521 $('.js-carousel-banner-al_alt .slick-toggle-play').remove();
522 $('.js-carousel-banner-al_alt').slick({
523 slidesToShow: 1,
524 arrows: true,
525 draggable: true,
526 infinite: false,
527 variableWidth: false,
528 autoplaySpeed: 4000,
529 dots: true,
530 nextArrow: '<button type="button" class="slick-next"><img class="slick-next__icon slick-next__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-next-black.svg" alt=\'<@liferay.language key="label.next"/>\'/><img class="slick-next__icon slick-next__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-next-gray.svg" alt=\'<@liferay.language key="label.next"/>\'/></button>',
531 prevArrow: '<button type="button" class="slick-prev"><img class="slick-prev__icon slick-prev__icon-normal" src="${imagesFolder}/basic/18px/svg/arrow-prev-black.svg" alt=\'<@liferay.language key="label.prev"/>\'/><img class="slick-prev__icon slick-prev__icon-disabled" src="${imagesFolder}/basic/18px/svg/arrow-prev-gray.svg" alt=\'<@liferay.language key="label.prev"/>\'/></button>',
532 responsive: [
533 {
534 breakpoint: 767,
535 settings: {
536 slidesToShow: 1,
537 arrows: false,
538 variableWidth: true,
539 dots: true
540 }
541 }
542 ]
543 }).each(function () {
544 var carousel = $(this),
545 toggleButton,
546 toggleIcon;
547
548 carousel.find('.slick-next__icon').attr({
549 'alt': carousel.data('next-text')
550 });
551
552 carousel.find('.slick-prev__icon').attr({
553 'alt': carousel.data('prev-text')
554 });
555 });
556
557 if ($('.hero-carousel__container .hero').length == 1) {
558 $('.hero-carousel__container .slick-toggle-play').hide();
559 }
560
561 $('.slick-cloned[aria-describedby]').removeAttr('aria-describedby');
562 if($(".js-carousel-banner-al_alt .slick-dots").length > 0) {
563 setDotsPositionBanner2();
564 }
565 }
566
567 function showVideoModalBanner2(link) {
568 const start = link.indexOf("v=") + 2;
569 const end = start + 2 + 11;
570
571 TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "");
572 $('#carrusel-banner-video-content').html('<iframe class="home-carrusel-video-iframe" src="https://www.youtube.com/embed/'+link.substring(start, end)+'" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>');
573 }
574 function setDotsPositionBanner2() {
575 $(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent());
576 }
577
578 window.addEventListener('resize', function(event){
579 const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
580 if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) {
581 setDotsPositionBanner2();
582 }
583 });
584
585 </script>
586</#if>
587
588
589<#-- CARRUSEL-TRES-CARD -->
590
591<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))>
592 <#assign colorClass = "" />
593 <#assign fullBody = "" />
594 <#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??>
595 <#if fondoColorCarruselCards.getData()=="blanc">
596 <#assign colorClass = "hola-bcn-carrusel-standard--white" />
597 <#assign fullBody = "full-body__container" />
598 <#else>
599 <#assign colorClass = "hola-bcn-carrusel-standard--gray" />
600 <#assign fullBody = "full-body__container" />
601 </#if>
602 </#if>
603
604 <section class="hola-bcn-carrusel-standard ${colorClass}">
605 <div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}">
606 <div class="hola-bcn-carrusel-standard--container">
607 <div class="hola-bcn-carrusel-standard--outer">
608 <div class="hola-bcn-carrusel-standard_new-header">
609 <h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new">${titleCarruselCards.getData()}</h2>
610 <p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p>
611 </div>
612 <ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider">
613 <#assign tmbGroupId = 20182>
614 <#assign fundacioGroupId = 79790>
615 <#list referencesFieldSet.getSiblings() as element>
616 <#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
617 <#assign articleId = element.referenceId.getData()>
618 <#assign groupId = getterUtil.getLong(groupId)>
619 <#attempt>
620 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) />
621 <#recover>
622 <#if groupId == tmbGroupId>
623 <#assign groupId = fundacioGroupId>
624 <#else>
625 <#assign groupId = tmbGroupId>
626 </#if>
627 <#attempt>
628 <#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!>
629 <#recover>
630 <#assign journalArticle = "">
631 </#attempt>
632 </#attempt>
633 <#if journalArticle?has_content && journalArticle != "">
634 <#assign document = saxReaderUtil.read(journalArticle.getContent())>
635 <#assign rootElement = document.getRootElement()>
636
637 <#assign resourceprimKey = journalArticle.getResourcePrimKey()>
638 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)>
639 <#assign assetRenderer = assetEntry.getAssetRenderer()>
640 <#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")>
641 <#assign newwindow = "">
642 <#if !isFundacio>
643 <#if articleURL?contains("/fundacio-tmb")>
644 <#assign link1 = articleURL?split("fundacio-tmb")>
645 <#if (getterUtil.getInteger(link1?size)>0)>
646 <#assign newwindow = "target='_blank'">
647 <#if articleURL?contains("pre3")>
648 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
649 <#else>
650 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + link1[1]>
651 </#if>
652 <#elseif getterUtil.getInteger(link1?size) == 0>
653 <#assign newwindow = "target='_blank'">
654 <#if articleURL?contains("pre3")>
655 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage()>
656 <#else>
657 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage()>
658 </#if>
659 </#if>
660 </#if>
661 <#else>
662 <#if articleURL?contains("/web/tmb")>
663 <#assign link1 = articleURL?split("web/tmb")>
664 <#if (getterUtil.getInteger(link1?size)>0)>
665 <#assign newwindow = "target='_blank'">
666 <#if articleURL?contains("pre3")>
667 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + link1[1]>
668 <#else>
669 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + link1[1]>
670 </#if>
671 <#elseif getterUtil.getInteger(link1?size) == 0>
672 <#assign newwindow = "target='_blank'">
673 <#if articleURL?contains("pre3")>
674 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage()>
675 <#else>
676 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage()>
677 </#if>
678 </#if>
679 </#if>
680 </#if>
681
682 <#assign title = "">
683 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
684 <#if titleSel.selectSingleNode(rootElement)?has_content>
685 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
686 </#if>
687
688 <#assign subtitle = "">
689 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
690 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
691 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
692 </#if>
693
694 <#assign initDateNovetatAgenda = "">
695 <#assign fromInitDateNovetatAgenda = "">
696 <#assign endDateNovetatAgenda = "">
697 <#assign whereNovetatAgenda = "">
698 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
699 <#if novetatAgendaSel?has_content>
700 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
701
702 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
703 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
704 </#if>
705
706 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
707 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
708 </#if>
709
710 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
711 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
712 </#if>
713
714 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
715 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
716 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
717 </#if>
718 </#if>
719
720 <#assign typeNovetatAgenda = "">
721 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
722 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
723 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
724 </#if>
725
726 <#assign filterNovetatAgenda = "">
727 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
728 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
729 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
730 </#if>
731
732 <#assign imageNovetatAgenda = "">
733 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
734 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
735 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
736 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
737 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
738 </#if>
739
740 <#assign imageAltNovetatAgenda = "">
741 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
742 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
743 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
744 </#if>
745
746 <#assign pubDateNovetatAgenda = "">
747 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
748 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
749 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
750 </#if>
751
752 <#assign pubTimeNovetatAgenda = "">
753 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
754 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
755 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
756 </#if>
757
758 <#assign despubDateNovetatAgenda = "">
759 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
760 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
761 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
762 </#if>
763
764 <#assign despubTimeNovetatAgenda = "">
765 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
766 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
767 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
768 </#if>
769
770 <#assign isExpiredNovetatAgenda = "">
771 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
772 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
773 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
774 </#if>
775
776 <#assign isPublishedNA = false>
777 <#if (pubDateNovetatAgenda?has_content)>
778 <#if pubTimeNovetatAgenda?has_content>
779 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
780 <#assign timeActFormat = timeActDate?string["HH:mm"]>
781 <#else>
782 <#assign timeActDate = "">
783 <#assign timeActFormat = "">
784 </#if>
785 <#attempt>
786 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
787
788 <#if timeActFormat?has_content && timeActFormat != "">
789 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
790 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
791 </#if>
792 <#assign dataActMil = dataAct?long>
793 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
794 <#assign isPublishedNA = (dataActMil - now ) < 0 />
795 <#recover>
796 </#attempt>
797 </#if>
798
799 <#assign isDespublishedNA = false>
800 <#if (despubDateNovetatAgenda?has_content)>
801 <#if despubTimeNovetatAgenda?has_content>
802 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
803 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
804 <#else>
805 <#assign timeExpDate = "">
806 <#assign timeExpFormat = "">
807 </#if>
808 <#attempt>
809 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
810
811 <#if timeExpFormat?has_content && timeExpFormat != "">
812 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
813 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
814 </#if>
815 <#assign dataExpMil = dataExp?long>
816 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
817 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
818 <#recover>
819 </#attempt>
820 </#if>
821
822 <#assign isExpiredNA = false>
823 <#if journalArticle.expirationDate??>
824 <#assign dataExp = journalArticle.expirationDate?datetime>
825 <#attempt>
826 <#assign dataExpMil = dataExp?long>
827 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
828 <#assign isExpiredNA = (dataExpMil - now) < 0 />
829 <#recover>
830 </#attempt>
831 </#if>
832
833 <#assign showNovetatAgenda = false>
834 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
835 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
836 <#else>
837 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
838 </#if>
839
840 <#if showNovetatAgenda>
841 <#if title?has_content>
842 <li class="hola-bcn-carrusel-standard_new-li">
843 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
844 <div class="hola-bcn-carrusel-standard__card-cover">
845 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
846 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
847 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
848 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
849 </div>
850 <#if filterNovetatAgenda?has_content>
851 <div class="hola-bcn-carrusel-standard-highlight">
852 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
853 </div>
854 </#if>
855 </div>
856 <div class="hola-bcn-carrusel-standard-container">
857 <div>
858 <h3 class="hola-bcn-carrusel-standard__card-title">
859 ${title}
860 <#if newwindow?? && newwindow?has_content>
861 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
862 </#if>
863 </h3>
864 <span class="hola-bcn-carrusel-standard__card-description">
865 ${subtitle}
866 </span>
867 </div>
868 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
869 <div class="hola-bcn-carrusel-standard_bottom-extra">
870 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
871 <div class="hola-bcn-carrusel-standard-date">
872 <#if fromInitDateNovetatAgenda == "true">
873 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span>
874 <#else>
875 <span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> <@liferay.language key='label.bloc.novetatagenda.from' /> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}<#if endDateNovetatAgenda?has_content> <@liferay.language key='label.bloc.novetatagenda.to' /> ${endDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</#if></span>
876 </#if>
877 </div>
878 </#if>
879 <#if whereNovetatAgenda?has_content>
880 <div class="hola-bcn-carrusel-standard-where">
881 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
882 </div>
883 </#if>
884 </div>
885 </#if>
886 </div>
887 </a>
888 </li>
889 </#if>
890 </#if>
891 </#if>
892 </#list>
893 </ul>
894 </div>
895 </div>
896 </div>
897 </section>
898
899 <script type="text/javascript">
900
901 $(document).ready(function() {
902 initSliderBcnStandard();
903 });
904
905 function initSliderBcnStandard() {
906 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
907 $(".js__hola-bcn-standard-slider").slick("unslick");
908 }
909
910 $('.js__hola-bcn-standard-slider').slick({
911 slidesToShow: 3,
912 slidesToScroll: 1,
913 arrows: false,
914 dots: false,
915 draggable: false,
916 infinite: false,
917 responsive: [
918 {
919 breakpoint: 767,
920 settings: {
921 variableWidth: true,
922 slidesToShow: 2,
923 slidesToScroll: 1,
924 arrows: false,
925 dots: true,
926 draggable: true,
927 infinite: true
928 }
929 }
930 ]
931 });
932 }
933
934 </script>
935</#if>
Te encuentras en:
Cuando viajes en autobús, hazlo fácil
Tu trayecto sea más ágil y práctico, además de facilitar la labor al conductor.
Levanta la mano cuando quieras subir al autobús
Cuando estés en la parada y el autobús se acerque, levanta la mano con suficiente antelación para avisar al conductor.
Este activará la intermitente derecha y abrirá las puertas para que tú y los demás pasajeros podáis subir.
Presiona el botón cuando quieras bajar
Cuando el autobús se acerque a tu parada, presiona el botón de Stop con suficiente antelación para avisar al conductor que deseas bajarte.
Sonará una alerta acústica y el mensaje Parada solicitada se iluminará dentro del vehículo. De esta manera, el conductor sabrá que hay pasajeros que bajarán en la próxima parada y procederá a detenerse.
Más información
Encontrarás más información en Cómo se viaja en bus.
¡Recuerda!
Para subir al bus levanta la mano cuando se acerque para que pueda detenerse.
Para bajar del bus pulsa el botón antes de llegar a la parada.
-
FinalizadoCampaña
Cuando viajes en metro, hazlo de manera segura
Nosotros velamos por tu seguridad, pero tú también debes evitar acciones que pongan en peligro tu integridad y el buen funcionamiento del servicio. -
FinalizadoCampaña
Siempre estamos
El metro y los buses cuentan con cámaras de videovigilancia en tiempo real para que viajes con seguridad.
Te encuentras en:
Líneas de bus 100% eléctricas
La H16 y la V15, las líneas de cero emisiones.
Las marquesinas de las líneas H16 y V15 lucen unos vinilos específicos que informan de que las líneas están servidas con autobuses cero emisiones.
Las líneas H16 y V15 son las primeras íntegramente de cero emisiones. La línea H16 fue la primera de la ciudad en reconvertirse íntegramente a la emisión cero, en el año 2016. A principios del 2023 también se reconvirtió la línea V15.
Los autobuses eléctricos son autónomos y están plenamente operativos a lo largo de toda la jornada, sin necesidad de baterías voluminosas y pesadas.
Lo más destacado es el sistema de carga de los vehículos, que están equipados con un pantógrafo plegable sobre el techo que se acopla a los puntos de recarga rápida situados en los extremos de la línea. La carga rápida en ruta se combina con la carga lenta durante la noche en la cochera, donde también se ha instalado el equipamiento correspondiente.
Además de estar preparados para la carga rápida en ruta, los autobuses de estas líneas incorporan destacados avances tecnológicos y marcan el camino de un salto hacia adelante tanto en la calidad ambiental como en la seguridad y el confort del transporte público urbano.
La electrificación es uno de los grandes ejes para renovar y actualizar ambientalmente a los autobuses urbanos de Barcelona.