Thanks to video surveillance systems, TMB professionals ensure your safety during all service hours, both on the metro and bus.
You are in:
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.
Video surveillance in the metro
The metro network has almost 10,000 cameras that are distributed throughout trains and stations, as well as in depots, workshops and other TMB facilities.
These cameras allow users to see what is happening live when they press the SOS or information button on a train or station. The images captured by these video surveillance devices are received by the Metro Control Centre and the Civil Protection and Security Centre.
Video surveillance on the bus
The bus network has more than 4,500 cameras that currently cover practically all of the fleet's regular service.
This video surveillance system allows the Bus Safety Control Center to view images from inside the vehicles in real time, as well as download any of the recordings instantly.
Images available to security forces
The images captured by these video surveillance devices on both the bus and metro networks are recorded and can be reviewed when the Mossos d'Esquadra or other security forces require it.
-
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
Better with AMBici!
The metropolitan electric bicycle
You are in:
Better with AMBici!
The metropolitan electric bicycle
Over 200 stations connecting you to transport and other municipalities, and more than 2,500 100% electric bikes for you to ride comfortably to your destination.
From home to work
Better mobility means traveling healthily while maintaining an active lifestyle with 100% electric bikes equipped with pedal assistance.
To connect with public transport
For a smoke-free city
-
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely. -
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service.
You are in:
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service.
Never go down to the tracks
Mai no baixis a les vies. No ho facis sota cap concepte.
- Si has de creuar a l’altra andana, fes-ho utilitzant les escales o els ascensors.
- Si t’ha caigut algun objecte a la via, acciona l’intèrfon SOS de l’andana i t’ajudarem a recuperar-lo quan sigui possible.
- Actua cívicament, respecta les instal·lacions.
Baixar a la via, no és la via. Comporta risc de mort.
Do not board the train when the doors are closing
Quan s’activa l’avís de tancament de portes, no es pot entrar ni sortir del vagó.
- Si arribes a l’andana i el tren fa sonar l’avís de tancament de portes (sonora i visual), és imprescindible que el respectis i esperis el següent tren.
Un cop s’inicï l’avís sonor/visual, ja no s’hi pot pujar.
- Si ets a bord del tren i t’adones tard que has de baixar, cal que esperis a la següent estació. Quan hi arribis, podràs baixar i tornar enrere fins on volies anar.
Un cop s’inicï l’avís sonor/visual, ja no s’hi pot baixar.
- Mai no intentis forçar les portes del tren. Hi podries quedar atrapat i patir un accident molt greu.
If you feel unwell on the metro, ask for help
Tant si ets a l’andana com dins el vagó, fer servir l’intèrfon SOS. El metro disposa de 2.300 intèrfons distribuïts a totes les andanes i vestíbuls de les estacions.
- Quan comencis a trobar-te malament, surt del tren en el possible i demana ajuda a l’intèrfon SOS de l’andana, o mira si algú ho pot fer per tu.
- Si els símptomes apareixen abans de pujar al tren, queda’t a l’andana i prem el botó SOS de l’intèrfon.
- Si sospites que una persona està patint una aturada cardíaca, localitza el desfibril·lador a l’andana i segueix les instruccions. La xarxa de metro està cardioprotegida.
More information
Trobaràs més informació a Com es viatja en metro.
Remember!
Never go down onto the track, it is a risk of death.
Do not get on the train when the doors are closing.
If you feel unwell, do not get on the train. Ask for help on the SOS intercom on the platform.
-
FinishedCampaign
Better with AMBici!
The metropolitan electric bicycle -
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.
You are in:
Put yourself in their shoes, not in their seat
Respect the absolute priority in public transport.
Attention!
In the bus and the metro, the spaces reserved for wheelchairs are reserved for wheelchairs. Additionally, people with disabilities or reduced mobility have absolute priority to sit in the priority seats and to use the elevator.
Put yourself in their shoes, not in their seat.
On the bus and the metro, give absolute priority to those who need it.
From Transports Metropolitans de Barcelona and the Institut Municipal de Persones amb Discapacitat (Municipal Institute of People with Disabilities), we promote the correct use of priority seats, spaces reserved for wheelchairs, and elevators in the city's public transport network.
By giving more visibility to the group of people with reduced mobility and people with disabilities, we hope to raise awareness among users who do not respect these spaces, not always intentionally.
The testimonies in this campaign are real, as their issue is also very real.
-
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.
You are in:
The TMB community exceeds one and a half million followers
The community of TMB users who follow us on social networks and on JoTMBé already numbers more than one and a half million people.
Social networks and JoTMBé
At TMB, we are celebrating! Our user community continues to grow, and the people connected through our social media profiles and JoTMBé are now more than one and a half million.
Many of you follow us on Instagram, Facebook, X, LinkedIn, Spotify, YouTube, and WeChat to stay up to date with all the news, services, and initiatives we launch. And, since January 31, 2025, also on TikTok.
In addition, through JoTMBé, thousands of you enjoy updated service information, exclusive benefits, and can buy and recharge transport tickets with total ease. Subscribers to the Hola Barcelona blog can also take advantage of the best suggestions and tips so you don't miss anything about the city.
We want to thank you for your trust and support. Your participation is key to continue improving day by day and providing you with the best service possible.
We still have a long journey ahead of us together!
Join the TMB community and experience public transport like never before!
Follow us on our social media, sign up for JoTMBé and subscribe to the Hola Barcelona blog newsletter to discover everything we have prepared for you. You will stay up to date with the latest news, participate in contests, receive tips for your journeys, access exclusive promotions, and many more benefits of being part of it.
You may also be interested in
-
FinishedCampaign
Put yourself in their shoes, not in their seat
Respect the absolute priority in public transport. -
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier.

You are in:
Dansa Metropolitana at the metro
We transform the everyday life of the metro into an artistic and emotional experience that connects users with a moment of contemplation.
When: 15.03.2025
Where: Universitat L1 station
Access: Free entry*
On March 15th at 12 p.m., metro users can enjoy a live artistic experience. Once again, the TMB Foundation collaborates with the Dansa Metropolitana festival to bring the emotion of dance to the subway. Specifically, at the lower lobby of Universitat L1 metro station.
In the performance Un attimo, by the company Paloma Muñoz - Siberia Danza, the dancers move to the sound of Mozart’s music and create an atmosphere that transforms the space through a simple play of lights and reflections. The proposal explores the interaction of moving bodies and the architectural surroundings, inviting us to take a break from the routine and contemplate the beauty in a space usually associated with stress and hurry. A project that seeks to transform the everyday experience of the metro into an artistic and emotional one, connecting users with a moment of contemplation.
Dance performances in all municipalities, until March 30th
From March 13th to 30th, Dansa Metropolitana will schedule dance performances in different spaces across 12 municipalities in the metropolitan area of Barcelona: Badalona, Barcelona, Cornellà, Granollers, l'Hospitalet, Esplugues, El Prat, Santa Coloma, Sabadell, Sant Cugat, Terrassa, and Viladecans.
This year, the festival focuses on the intimate connection between sound and movement, exploring how vibration creates unique dialogues between body and music. This interaction becomes an artistic language that transcends disciplines and evokes shared emotions. Because dance is not only seen, it is lived, and it is in this shared movement where we find the vibration that unites us.
També et poden interessar
-
FinishedExhibition
Exhibition The little story of the metro
A journey of 100 years in drawings.When: From 10/01/2025 to 19/03/2025Where: Espai Mercè Sala - Fundació TMB -
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.

You are in:
Zurich Marathon of Barcelona
How to get there!
When: 16.03.2025
Where: From Passeig de Gràcia
If you are participating in the Barcelona Marathon, get there by public transport. TMB will take you there.
We recommend accessing the start point by metro at the Catalunya (L1 and L3) and Passeig de Gràcia (L2, L3, and L4) stations. You also have the option of arriving by FGC.
See the bus service disruptions and transport recommendations in the specific service notice.
Check the Journey planner for other transport options.
Until the early afternoon on Sunday, 16th March, we recommend using the metro as your main mode of transport. The wide route of the Marathon and the duration of the race will cause disruptions to the service of around sixty bus routes.

Exclusive transport ticket
For this edition, 25,000 single tickets have been issued, which are included in the runner’s bag while the stocks last.
TMB, with the major events in the city
The Zurich Marathon of Barcelona, with 27,000 participants, is one of the most important races held annually in the city.
TMB, as the main public transport operator in Barcelona and its metropolitan area, works on the impact that an event of this scale can have on the transport network. In addition, it is also actively involved with events, being present in a latent way and collaborating at the logistical and branding level.
Get there with the TMB App!
Plan your route, set up alerts for the transport you need, and get to the race without surprises.
-
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
Put yourself in their shoes, not in their seat
Respect the absolute priority in public transport. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.

You are in:
Aptitude tests for metro musicians
New edition of the selection tests for aspiring musicians to play at the designated points on the metro network.
When: 14.03.2025
Where: Universitat L2 station
Access: Free entry*
On March 14th, a new edition of the selection tests for musicians aspiring to perform at designated points within the metro network will take place. Transports Metropolitans de Barcelona (TMB) and the AMUC BCN (Street and metro musicians association of Barcelona) are the organizers of this call, which will be held at the entrance hall of the Universitat L2 station, from 8:00 AM to 8:00 PM.
The suitability test involves each candidate performing a couple of excerpts from their repertoire, with a maximum duration of three to five minutes. A jury, composed of professional music teachers, will audit the test and evaluate criteria such as interpretative quality, repertoire variety, originality and creative richness of the proposal, and cultural, stylistic, and instrumental diversity.
If the jury's evaluation is favorable, the musician will receive the AMUC BCN membership card and will be able to participate in the association's projects, including performances at the metro.
També et poden interessar
-
FinishedPerforming arts
Dansa Metropolitana at the metro
We transform the everyday life of the metro into an artistic and emotional experience that connects users with a moment of contemplation.When: From 15/03/2025Where: Universitat L1 station -
FinishedExhibition
Exhibition The little story of the metro
A journey of 100 years in drawings.When: From 10/01/2025 to 19/03/2025Where: Espai Mercè Sala - Fundació TMB -
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" 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#1501272" 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?? && 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 <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
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 title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" 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?? && 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 <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
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 articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <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>
852 <#else>
853 <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>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

You are in:
Exhibition The little story of the metro
A journey of 100 years in drawings.
When: 10.01.2025 to 19.03.2025
Where: Espai Mercè Sala - Fundació TMB
Access: Free entry*
Barcelona celebrates 100 years of the metro: on December 30, 1924, the first train of the Barcelona metro network left the Lesseps station heading towards Passeig de Gràcia. Since then, the city's subway has been growing and adapting to new times.
TMB and the TMB Foundation have created a range of actions that, framed within a large communication campaign, will take place throughout the subway network during 2025: book publications, a variety of events, guided tours, exhibitions, and much more.
One of the most special publications is La petita història del metro, (The little story of the metro, in catalan) a 100-year journey through the magnificent illustrations by Pilarín Bayés and the texts by Daniel Venteo. This book, in addition to bringing both young and old closer to the history of the metro through its explanations, exudes a peculiar tenderness, which we have wanted to bring to the walls of the Espai Mercè Sala.
Whether you have already had the opportunity to get your hands on this book or not, come visit the exhibition and enjoy the journey!
What will I find at the exhibition?
Do you know when the first Barcelona metro line was opened? And how many stations there were?
Did you know that during the Republican Government of Catalonia the metro reached as far as Hospitalet de Llobregat?
Or that during the Spanish Civil War, people often used it as a shelter to protect themselves from bombs?
Did you know that it was not until the early sixties that the metro service was municipalized, becoming the public service that guarantees the universal right to mobility that it is today?
Did you know that in 1992, with the Barcelona Olympic Games, the metro was expanded further, opening the way to Santa Coloma de Gramenet and Badalona?
Did you know that today it has 125 kilometres of track and up to 165 stations, facilitating nearly 280 million trips a year? Or that Line 9, which ends at El Prat airport, is automatic and is one of the most modern in Europe?
The Barcelona metro brings together a thousand and one stories from the past, present and future.
You may be interested in
-
FinishedCampaign
When travelling by bus, take it easy
Your journey will be more agile and practical, and you will also make the driver's job easier. -
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" 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#1501272" 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?? && 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 <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
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 title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" 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?? && 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 <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
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 articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <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>
852 <#else>
853 <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>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

You are in:
eDreams Mitja Marató Barcelona
We explain how to get there!
When: 16.02.2025
Where: Parc de la Ciutadella
If you participate in the eDreams Mitja Marató Barcelona, get there by public transport. At TMB, we'll take you there.
We recommend accessing the starting point by metro. You can do so from the Arc de Triomf (L1) and Ciutadella - Vila Olímpica (L4) stations.
Check the Journey planner for other transport options.
Get informed about disruptions to bus service and recommended transport.
Important! Keep in mind that large-scale races can affect surface transportation in the city. Check the status of the public transport network before leaving home.

Exclusive transport ticket
Para esta edición, se han editado 30.000 billetes sencillos, que se incluyen en la bolsa del corredor.
TMB, with the major events of the city.
La eDreams Mitja Marató Barcelona, con 30.000 participantes, es una de las carreras más importantes que se celebran anualmente en la ciudad.
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 implica de forma activa con los eventos, estando presente de forma latente y colaborando a nivel logístico y de marca.
Get there with the TMB App!
Design your route, set up alerts for the transport you need, and arrive at the race without surprises!
-
FinishedCampaign
When travelling by metro, do so safely
We ensure your safety, but you should also avoid actions that could endanger your well-being and the proper functioning of the service. -
FinishedCampaign
Put yourself in their shoes, not in their seat
Respect the absolute priority in public transport. -
FinishedCampaign
We are always there
The metro and buses have real-time video surveillance cameras so you can travel safely.
The following has evaluated to null or missing: ==> detallAgenda.elementsDetallAgenda.getSiblings()[0].titleDetallAgenda [in template "20155#20195#1501272" 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#1501272" 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?? && 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 <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>">
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 title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>" 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?? && 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 <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>">
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 articleFriendlyURL = assetRenderer.getUrlTitle()>
642 <#assign newwindow = "">
643 <#if !articleURL?has_content>
644 <#assign newwindow = "target='_blank'">
645 <#if !isFundacio>
646 <#if currentURL?contains("pre3")>
647 <#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
648 <#else>
649 <#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
650 </#if>
651 <#else>
652 <#if currentURL?contains("pre3")>
653 <#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
654 <#else>
655 <#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL>
656 </#if>
657 </#if>
658 </#if>
659
660 <#assign title = "">
661 <#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")>
662 <#if titleSel.selectSingleNode(rootElement)?has_content>
663 <#assign title = titleSel.selectSingleNode(rootElement).getStringValue()>
664 </#if>
665
666 <#assign subtitle = "">
667 <#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")>
668 <#if subtitleSel.selectSingleNode(rootElement)?has_content>
669 <#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()>
670 </#if>
671
672 <#assign initDateNovetatAgenda = "">
673 <#assign fromInitDateNovetatAgenda = "">
674 <#assign endDateNovetatAgenda = "">
675 <#assign whereNovetatAgenda = "">
676 <#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!"">
677 <#if novetatAgendaSel?has_content>
678 <#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!"">
679
680 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
681 <#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
682 </#if>
683
684 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
685 <#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
686 </#if>
687
688 <#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
689 <#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
690 </#if>
691
692 <#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!"">
693 <#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content>
694 <#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()>
695 </#if>
696 </#if>
697
698 <#assign typeNovetatAgenda = "">
699 <#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
700 <#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
701 <#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
702 </#if>
703
704 <#assign filterNovetatAgenda = "">
705 <#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
706 <#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
707 <#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
708 </#if>
709
710 <#assign imageNovetatAgenda = "">
711 <#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
712 <#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
713 <#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
714 <#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!"">
715 <#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid>
716 </#if>
717
718 <#assign imageAltNovetatAgenda = "">
719 <#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
720 <#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
721 <#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
722 </#if>
723
724 <#assign pubDateNovetatAgenda = "">
725 <#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
726 <#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
727 <#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
728 </#if>
729
730 <#assign pubTimeNovetatAgenda = "">
731 <#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
732 <#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
733 <#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
734 </#if>
735
736 <#assign despubDateNovetatAgenda = "">
737 <#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
738 <#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
739 <#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
740 </#if>
741
742 <#assign despubTimeNovetatAgenda = "">
743 <#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
744 <#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
745 <#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
746 </#if>
747
748 <#assign isExpiredNovetatAgenda = "">
749 <#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")>
750 <#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content>
751 <#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()>
752 </#if>
753
754 <#assign isPublishedNA = false>
755 <#if (pubDateNovetatAgenda?has_content)>
756 <#if pubTimeNovetatAgenda?has_content>
757 <#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]>
758 <#assign timeActFormat = timeActDate?string["HH:mm"]>
759 <#else>
760 <#assign timeActDate = "">
761 <#assign timeActFormat = "">
762 </#if>
763 <#attempt>
764 <#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]>
765
766 <#if timeActFormat?has_content && timeActFormat != "">
767 <#assign dataActMil = miliSeconds(timeActFormat dataAct?long)>
768 <#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))>
769 </#if>
770 <#assign dataActMil = dataAct?long>
771 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
772 <#assign isPublishedNA = (dataActMil - now ) < 0 />
773 <#recover>
774 </#attempt>
775 </#if>
776
777 <#assign isDespublishedNA = false>
778 <#if (despubDateNovetatAgenda?has_content)>
779 <#if despubTimeNovetatAgenda?has_content>
780 <#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]>
781 <#assign timeExpFormat = timeExpDate?string["HH:mm"]>
782 <#else>
783 <#assign timeExpDate = "">
784 <#assign timeExpFormat = "">
785 </#if>
786 <#attempt>
787 <#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]>
788
789 <#if timeExpFormat?has_content && timeExpFormat != "">
790 <#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)>
791 <#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))>
792 </#if>
793 <#assign dataExpMil = dataExp?long>
794 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
795 <#assign isDespublishedNA = (dataExpMil - now) < 0 />
796 <#recover>
797 </#attempt>
798 </#if>
799
800 <#assign isExpiredNA = false>
801 <#if journalArticle.expirationDate??>
802 <#assign dataExp = journalArticle.expirationDate?datetime>
803 <#attempt>
804 <#assign dataExpMil = dataExp?long>
805 <#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)>
806 <#assign isExpiredNA = (dataExpMil - now) < 0 />
807 <#recover>
808 </#attempt>
809 </#if>
810
811 <#assign showNovetatAgenda = false>
812 <#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1">
813 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true">
814 <#else>
815 <#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true">
816 </#if>
817
818 <#if showNovetatAgenda>
819 <#if title?has_content>
820 <li class="hola-bcn-carrusel-standard_new-li">
821 <a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}">
822 <div class="hola-bcn-carrusel-standard__card-cover">
823 <div class="hola-bcn-carrusel-standard__card-cover-filter"></div>
824 <img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>>
825 <div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>>
826 <span><@liferay.language key='label.bloc.novetatagenda.finished' /></span>
827 </div>
828 <#if filterNovetatAgenda?has_content>
829 <div class="hola-bcn-carrusel-standard-highlight">
830 <span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span>
831 </div>
832 </#if>
833 </div>
834 <div class="hola-bcn-carrusel-standard-container">
835 <div>
836 <h3 class="hola-bcn-carrusel-standard__card-title">
837 ${title}
838 <#if newwindow?? && newwindow?has_content>
839 <span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span>
840 </#if>
841 </h3>
842 <span class="hola-bcn-carrusel-standard__card-description">
843 ${subtitle}
844 </span>
845 </div>
846 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)>
847 <div class="hola-bcn-carrusel-standard_bottom-extra">
848 <#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content>
849 <div class="hola-bcn-carrusel-standard-date">
850 <#if fromInitDateNovetatAgenda == "true">
851 <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>
852 <#else>
853 <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>
854 </#if>
855 </div>
856 </#if>
857 <#if whereNovetatAgenda?has_content>
858 <div class="hola-bcn-carrusel-standard-where">
859 <span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span>
860 </div>
861 </#if>
862 </div>
863 </#if>
864 </div>
865 </a>
866 </li>
867 </#if>
868 </#if>
869 </#if>
870 </#list>
871 </ul>
872 </div>
873 </div>
874 </div>
875 </section>
876
877 <script type="text/javascript">
878
879 $(document).ready(function() {
880 initSliderBcnStandard();
881 });
882
883 function initSliderBcnStandard() {
884 if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) {
885 $(".js__hola-bcn-standard-slider").slick("unslick");
886 }
887
888 $('.js__hola-bcn-standard-slider').slick({
889 slidesToShow: 3,
890 slidesToScroll: 1,
891 arrows: false,
892 dots: false,
893 draggable: false,
894 infinite: false,
895 responsive: [
896 {
897 breakpoint: 767,
898 settings: {
899 variableWidth: true,
900 slidesToShow: 2,
901 slidesToScroll: 1,
902 arrows: false,
903 dots: true,
904 draggable: true,
905 infinite: true
906 }
907 }
908 ]
909 });
910 }
911
912 </script>
913</#if>

You are in:
Exhibition QUINCE, Through the Eyes of a Generation
The Street Child Foundation brings visibility to the lives of children surviving in terrible conditions around the world.
When: 06.09.2024 to 31.12.2024
Where: Espai Mercè Sala - Fundació TMB
Access: Free entry*
Street Child Spain Foundation and TMB Foundation present the photography exhibition <em>QUINCE: Through the Eyes of a Generation</em> at Espai Mercè.
This exhibition is a participatory photography project carried out in collaboration with local photographers from Bangladesh, Nepal, Nigeria, Ukraine, and Uganda, who led photographic creation workshops with 15-year-olds in these unique and complex corners of the world. From areas of active conflict and refugee camps to remote communities, this exhibition explores what it means to be 15 years old in drastically different contexts.
The origin of this exhibition is based on a successful pilot participatory photography project by the Street Child Foundation in collaboration with Nigerian independent photographer and filmmaker Nelson Apochi Owoicho, aimed at empowering and inspiring girls at risk of dropping out of school in Nigeria. Later, in each of the countries, Street Child worked with local photographers and partners to organize participatory photography workshops with 15-year-olds.
Alongside the foundation's educational programs in these communities, the training provided them with the opportunity to express themselves through creativity.
The added value of this exhibition lies in the opportunity to offer children and young people, who are the driving force of change and the primary reason for Street Child's existence, an expressive tool and a safe space to tell their own stories. At the same time, it emphasizes the importance of their education for their personal development and that of their communities.
With this initiative, TMB Foundation showcases the work of a social entity developing cooperation and development projects, aligning with the TMB Solidarity project, while also focusing on the education of children and adolescents, in line with the TMB Education project.