-

New TMB shop

We’re opening the new physical shop at the Sagrada Família metro station

At the new physical shop at Sagrada Família metro station (L2 and L5), TMB has put on sale a selection of official products with the aim of bringing TMB’s values and its mobility services—metro, bus, cable car, and tourist bus—closer to users.

This establishment joins the Hola Barcelona Store at Catalunya station, where products related to TMB’s tourist transport services are sold.

The official TMB collection is now available for you!

TMB is launching official branded products to bring its corporate values closer to citizens and convey the pride of a public transport system that is a benchmark in Europe. The goal is to go beyond the travel experience and turn public transport into an urban icon.

With the opening of the TMB Shop, Barcelona joins other European cities with renowned brands from their public transport operators, such as London and Madrid.

At the shop, you’ll find T-shirts, tote bags, notebooks, and other items inspired by the bus and metro networks. These products feature symbols of mobility in Barcelona, such as the metro “M,” the bus “B,” the suburban network map, metro lines, the Montjuïc Cable Car, and the Barcelona Bus Turístic.

In this first phase, the shop offers a small selection of products to test users’ tastes and preferences. Based on this, the incorporation of new product types into the shop's portfolio and the opening of new locations will be considered.

Come visit us!

Location:

The TMB shop is located in the concourse of Line 5 at Sagrada Família station.

Opening hours:

  • Weekdays and Saturdays: 10am–2pm and 4–8pm.
  • Public holiday eves: 10am–2pm.
  • Closed on Sundays and interweek holidays in the city of Barcelona.

46th La Cursa El Corte Inglés

How to get there!

When: 10.05.2026


Where: From avinguda Diagonal


If you're taking part in the La Cursa El Corte Inglés, get there by public transport. TMB will take you there.

We recommend reaching the starting point by metro, at the Maria Cristina and Palau Reial stations on line 3.

You can use the Journey planner to find other transport options.

We are informing about the impacts on the bus service and the transportation recommendations soon.

Until early afternoon on Sunday, May 11, we recommend using the metro as the main means of transport. The length and duration of the race will cause disruptions to many bus lines.

Transport ticket

For this edition, TMB has contributed 30,000 single tickets to promote public transport.

TMB, with the major events in the city

Since its first edition in 1986, the La Cursa El Corte Inglés has been one of the most popular and well-established races in the city.
In this year’s edition, 40,000 runners will take part for free, covering 10 km through the main streets of Barcelona.

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.

An immersive journey through 100 years of the metro

Live the present, the past, and the future of the metro’s history in virtual reality.

When: 30.12.2025 to 31.03.2026


Where: Espai Mercè Sala


Access: Validating the transport ticket

To commemorate the centenary of the Barcelona Metro, we invite you to enjoy a multi-user virtual reality experience that will take you through the history, present, and future of the subway network.

Wearing virtual reality glasses and in groups of up to 10 people, you will relive one hundred years of metro, discover the strengths of today’s service, and imagine what the metro of the future will look like.

This activity is free of charge and intended for people aged 10 and over.

Before you start your journey, you should know...

Location:

Espai Mercè Sala, at Diagonal station.

Dates:

The experience will be available from December 30 to March 31, 2026. 

Opening hours:

Monday to Sunday, from 10 a.m. to 8 p.m.

Important information:

  • The activity lasts 10 minutes, with sessions every twenty minutes in groups of 10 people.
  • A single booking can include tickets for up to 5 people.
  • Requesting a new date will cancel the previous booking.
  • Access to the experience will not be allowed once it has started, and a new booking will need to be made.

What will you learn from this experience?

  • You will witness the importance of developing collective metro transport for the evolution of a city like Barcelona and its metropolitan area.
  • You will connect with the collective memory of the people and the most significant milestones that have taken place in the city over the past hundred years.
  • You will discover the link between the metro network and the city’s growth in terms of urban planning and population, as well as the active role of the metro in the cohesion of the metropolitan area.
  • You will learn more about the quality of a service that has been a pioneer since its beginnings.

Suitability tests for performing in the metro

New call for artists aspiring to perform in the subway network

When: 26.03.2026


Where: Universitat station


Access: Access validating the transport ticket

From the TMB Foundation, the Street Musicians Association (AMUC BCN) is organizing another edition of these aptitude tests, in which around fifty performers and groups will be evaluated to perform at the designated spots in the Barcelona metro network.

The suitability test follows the same methodology as in previous editions: each candidate must perform several pieces chosen at random by the jury from the repertoire they have submitted, consisting of about 20 songs. The jury will assess criteria such as interpretative quality and repertoire variety, the originality and creative richness of the proposal, and cultural, stylistic, and instrumental diversity.

If the jury’s evaluation is favorable, the musician will obtain the AMUC BCN membership card and will be able to participate in the association’s projects, including performances in the metro.

Date: March 26 (from 9 a.m. to 8 p.m.)
Location: Universitat station (L2)

New image for Música al metro on its 25th anniversary

Música al metro aims to turn the metro into a platform for promoting new talent and spreading music, and it has become a true benchmark at the European level.

Last December, the project celebrated its 25th anniversary with a new graphic identity. The new visual design features larger and more visible signage, with different color tones and a variety of artist profiles.

The initiative was also renamed in a more gender‑inclusive way: from Músics del metro to Música al metro.

We are launching the metro map with the music points and a new web space

All this information is now gathered in the section dedicated to the musical project, which has been updated to include, in addition to the project’s basic information, the new visual identity and a map of the network of music points.


Currently, there are around fifty music points in the Barcelona metro network where artists offer live performances on different days of the week. To make it easier to locate all 50 points, an expandable map has been created showing the locations of the music points across the various metro stations, available for download in two formats: PDF and JPG.

International Women’s Day at TMB

We promote several initiatives around the presence of women in public transport.

This 8 March, as every year, at TMB we have promoted several initiatives to highlight the presence of women both in public transport and in society. The proposals you will find these days across the metro network add to all those we continuously develop.

Internally, we foster female talent with the conviction that efficient, sustainable and safe urban mobility is only possible if it is also inclusive. That is why we work every day to guarantee equal opportunities and non-discrimination. In addition, we promote and strengthen the talent of women in a traditionally male sector through training and awareness‑raising actions aimed at the entire workforce.

And we also do so outwardly: we work in a network with organisations that help us break gender stereotypes and, through TMB Educa, we promote workshops that spark interest in STEM disciplines and encourage diversity from a gender perspective.

For all these reasons, TMB’s commitment to International Women’s Day goes far beyond ensuring mobility on a day when the city turns purple and the streets vibrate with chants and slogans. TMB is also part of the heartbeat of 8 March.

Discover the proposals we have prepared!

Mural intervention at the Espanya station and in the workplaces

For a world in which we are socially equal, humanly different, and totally free. Rosa Luxemburg (1871–1919).

This phrase is the winner of the vote carried out by the TMB staff in the weeks prior to 8M, chosen from a selection of quotes by renowned feminist thinkers. Thus, this motto by Rosa Luxemburg is the main feature of the mural intervention created by the artist Valerie Blanchard in the connecting corridor between metro lines 1 and 3 at the Espanya station, which you can see starting 3 March. The artwork will also be displayed in TMB workplaces.

 

Sound and visual art at Passeig de Gràcia - until March 11th

The interactive installation ARS Gràcia, at the Passeig de Gràcia station, also joins this celebration with an artistic proposal that evokes sorority. As you walk through the connecting corridor, let yourself be guided by the lights and melodies of the cubes, which will individually lead you to become part of a whole. The sound proposal, featuring the voices of women artists from AMUC BCN, is inspired by two prominent women: Susan McClary and Éliane Radigue.

 

In the face of gender-based violence, ask for help!

When you travel with TMB, you are not alone. Your safety is a priority and, together, we can make public transport a space free of violence. The help gesture, used internationally to discreetly identify women who are experiencing gender‑based violence or who are at risk, can be crucial in triggering a quick and safe response, also in mobility spaces such as public transport.

Our transport services are equipped with video surveillance cameras both in the metro network and throughout the bus fleet. This allows us to see what is happening in real time when a user presses the SOS button and to collaborate with law‑enforcement bodies and security services. For safety purposes, we have improved the lighting in the metro network facilities. 

Find more information on the campaign page.

 

I want to move the world

TMB joins the campaign I want to move the world. Public transport needs more female talent, promoted by the Asociación de Transportes Públicos Urbanos Metropolitanos (ATUC).

You need to allow marketing and social media cookies to watch this YouTube video. Thank you!

The Maria Canals Competition goes down to the metro again

When: 13.03.2026 to 25.03.2026


Where: Diagonal metro station


Access: Access by validating the transport ticket

The 71st edition of the Maria Canals International Music Competition, which will hold its official section from 15 to 26 March, once again brings music into public transport with the installation of a baby grand piano in the lobby of Diagonal metro station on Line 5 (Rambla Catalunya or Rosselló / FGC entrances).

The instrument will be available for anyone who wishes to play it, and every afternoon the station will host one-hour recitals featuring local choirs and students from nearby music schools. In total, 27 performances will take place, designed to bring music closer to metro users and fill the space with a unique cultural atmosphere.

The TMB Foundation, through the TMB Culture project, renews once again its long-standing collaboration with the OFF Competition El Maria Canals porta cua, an initiative that installs more than one hundred grand pianos in public spaces across the territory to encourage citizen participation and bring music into everyday life.

Concert programme

  • Saturday, 14 March
    • 11 am - 1 pm: Conservatori de Badalona
    • 7 - 8 pm: Cor La Nau

 

  • Sunday, 15 March
    • 6 - 7 pm: Associació Musical Músics de Gràcia i Giravolt

 

  • Monday, 16 March
    • 6 - 7 pm: Escola de Música Alegrededalt

 

  • Tuesday, 17 March
    • 2 - 3 pm: Joan Carles (Música al Metro)
    • 4 -5 pm: Conservatori Superior el Liceu

 

  • Wednesday, 18 March
    • 4 - 5 pm: Conservatori Superior del Liceu
    • 6 - 7 pm: Estudi Musical 143

 

  • Thursday, 19 March
    • 4 - 5 pm: Conservatori Superior del Liceu
    • 6 - 7 pm: EM Vibrant Barcelona
    • 8 - 9 pm: Cor Roig Korai

 

  • Friday, 20 March
    • 2.30 - 3.30 pm: Cor Facultat Geografia i Història de la UB
    • 4 - 5 pm: Conservatori Superior del Liceu
    • 7 - 8 pm: Cor Gospel Optometrist

 

  • Saturday, 21 March
    • 6 - 7 pm: Acadèmia Marshall

 

  • Sunday, 22 March
    • 6 - 7 pm: Em Ritme i So
    • 7 - 8 pm: Cor Coral·lí

 

  • Monday, 23 March
    • 4 - 5 pm: Conservatori Superior del Liceu
    • 6 - 7 pm EM Acadèmia Tort
    • 7 - 8 pm: Cor Somos Voces

 

  • Tuesday, 24 March
    • 11- 12 am: Joan Carles (Música al Metro)
    • 4 - 5 pm: Conservatori Superio del Liceu
    • 8.30 - 9.30 pm: Cor Twocats

 

  • Wednesday, 25 March
    • 4 - 5 pm: Conservatori Superior del Liceu
    • 6 - 7 pm: Cor Koralia BCN
    • 7 - 8 pm: Cor Més enllà de la veu

Two pianos at the station for two weeks

The baby grand piano featured in this 2026 edition joins the one already installed permanently in the same station since the 2025 edition, inviting passengers to take on the challenge of stopping, sitting down, and playing its keys 365 days a year.

Find out more.

Zurich Marató Barcelona

How to get there!

When: 15.03.2026


Where: From Passeig de Gràcia


If you are participating in the Zurich Marató Barcelona, 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.

Check the Journey planner for other transport options.

Get informed about the bus service disruptions and transport recommendations in the specific service notice.

Until the early afternoon on Sunday, 15th 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.

TMB, with the major events in the city

The Zurich Marathon of Barcelona is one of the most important races held annually in the city.

For this edition, 32.000 single tickets have been issued and included in the runner’s bag.

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.

Arrive at the race on time and without surprises with TMB App!

 With TMB App, you have access to public transport and bicycle routes and options, you can manage T-mobilitat, and make all the necessary inquiries to organize your trips around Barcelona and its metropolitan area. It also allows you to quickly check the status of the lines and stops you use most, and locate nearby stations and stops thanks to the new built‑in ddTag scanner.

Come and play piano in Diagonal!

We host a piano permanently and bring music closer to the users.

When: From 23.03.2025


Where: Diagonal Station


Access: Access valdating the transport ticket

Transports Metropolitans de Barcelona (TMB), through its Foundation, collaborates annually with the prestigious Maria Canals Piano Competition.

In the 2025 edition, the 70th anniversary of the competition was celebrated with an exhibition titled Maria Canals, a competition with soul and the Metro Centenary. Taking advantage of both celebrations, the two entities launched the initiative of placing a piano in the lobby of Line 5 at Diagonal station.

In front of the Espai Mercè Sala, an upright piano was installed, which has been kept there permanently.

We bring music closer to all users.

The piano invites passengers to accept the challenge of stopping, sitting down, and playing its keys.

An error occurred while processing the template.
The following has evaluated to null or missing:
==> title  [in template "20155#20195#1501272" at line 634, column 202]

----
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: ${title}  [in template "20155#20195#1501272" at line 634, column 200]
----
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"  
173									<#if element.typeLink.getData() == "extern">  
174										href="${element.External_Link.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
175									<#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content>  
176										href="${element.Internal_Link.getFriendlyUrl()}" target="_self"  
177										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
178									<#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content>  
179										href="${element.External_Link.getData()}" target="_self"  
180										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
181									</#if> 
182
183								</#if> 
184									<div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>"> 
185										<#if element.typeLink.getData() == "video"> 
186											<div class="hero__media-video__container"> 
187												<span class="hero__media-video__img"> 
188												</span> 
189											</div> 
190										</#if> 
191										<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>> 
192									</div> 
193									<div class="hero__content white__banner"> 
194										<p class="hero__title" > 
195											${element.titleElem.getData()} 
196										</p> 
197										<p class="hero__desc-alt" > 
198											${element.descElem.getData()} 
199										</p> 
200									</div> 
201								</a> 
202							</div> 
203						</div> 
204					</#foreach> 
205				</#if> 
206			</div> 
207		</div> 
208	</div> 
209 
210	<div class="dialog"> 
211		<div id="carrusel-banner-video" class="u-hidden"> 
212			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
213			</div> 
214		</div> 
215	</div> 
216	<script type="text/javascript"> 
217		initSliderCarruselBanner1(); 
218 
219		function initSliderCarruselBanner1() { 
220			if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) { 
221				$(".js-carousel-banner-al_1").slick("unslick"); 
222
223			$('.js-carousel-banner-al_1 .slick-toggle-play').remove(); 
224			$('.js-carousel-banner-al_1').slick({ 
225				slidesToShow: 1, 
226				arrows: true, 
227				draggable: true, 
228				infinite: false, 
229				variableWidth: false, 
230				autoplaySpeed: 4000, 
231				dots: true, 
232				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>', 
233				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>', 
234				responsive: [ 
235
236						breakpoint: 767, 
237						settings: { 
238							slidesToShow: 1, 
239							arrows: false, 
240							variableWidth: true, 
241							dots: true 
242
243
244
245			}).each(function () { 
246				var carousel = $(this), 
247				toggleButton, 
248				toggleIcon; 
249 
250				carousel.find('.slick-next__icon').attr({ 
251					'alt': carousel.data('next-text') 
252				}); 
253 
254				carousel.find('.slick-prev__icon').attr({ 
255					'alt': carousel.data('prev-text') 
256				}); 
257			}); 
258 
259			if ($('.hero-carousel__container .hero').length == 1) { 
260				$('.hero-carousel__container .slick-toggle-play').hide(); 
261
262 
263			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
264			if($(".js-carousel-banner-al_1 .slick-dots").length > 0) { 
265				setDotsPositionBanner1(); 
266
267
268 
269		function showVideoModalBanner(link) { 
270			const start = link.indexOf("v=") + 2; 
271			const end = start + 2 + 11; 
272 
273			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-"); 
274			$('#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>'); 
275
276		function setDotsPositionBanner1() { 
277			$(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent()); 
278
279 
280		window.addEventListener('resize', function(event){ 
281			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
282			if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) { 
283				setDotsPositionBanner1(); 
284
285		});    
286 
287	</script> 
288</#if> 
289 
290 
291<#--  BASICA-TITOL-TEXT  --> 
292 
293<#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()))> 
294	<div class="full-body__container basica-titol-text"> 
295		<#foreach elem in basicaTitolText.elementsBasica.getSiblings()> 
296			<div class="basica-titol-text-wrapper"> 
297				<#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if> 
298				<#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if> 
299			</div> 
300			<#foreach subelem in elem.subelementsBasica.getSiblings()> 
301				<div class="basica-titol-text-wrapper"> 
302					<#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if> 
303					<#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if> 
304				</div> 
305			</#foreach> 
306		</#foreach> 
307	</div> 
308</#if> 
309 
310 
311<#--  bloc-detall-agenda  --> 
312 
313<#if detallAgenda?? && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))> 
314    <#assign hasElementDetallAgenda = false> 
315    <#if detallAgenda.elementsDetallAgenda??  
316          && detallAgenda.elementsDetallAgenda.getSiblings()??  
317          && (detallAgenda.elementsDetallAgenda.getSiblings()?size > 0)> 
318        <#assign firstSibling = detallAgenda.elementsDetallAgenda.getSiblings()[0]> 
319        <#if (firstSibling.titleDetallAgenda?? && firstSibling.titleDetallAgenda.getData()?has_content)  
320              || (firstSibling.contentDetallAgenda?? && firstSibling.contentDetallAgenda.getData()?has_content)> 
321            <#assign hasElementDetallAgenda = true> 
322        </#if> 
323    </#if> 
324     
325    <div class="full-body__container detall-agenda" <#if !hasElementDetallAgenda>style="margin-top:0;"</#if>> 
326		<#if detallAgenda.elementsDetallAgenda.getSiblings()??> 
327			<#assign siblings = detallAgenda.elementsDetallAgenda.getSiblings()> 
328			<#if siblings?size gt 0> 
329				<#foreach elem in siblings> 
330					<div class="detall-agenda-wrapper"> 
331						<#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content> 
332							<h2 class="">${elem.titleDetallAgenda.getData()}</h2> 
333						</#if> 
334						<#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content> 
335							<div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div> 
336						</#if> 
337					</div> 
338				</#foreach> 
339			</#if> 
340		</#if> 
341 
342         
343        <#if detallAgenda.buttonsDetallAgenda??  
344              && detallAgenda.buttonsDetallAgenda.getSiblings()??  
345              && (detallAgenda.buttonsDetallAgenda.getSiblings()?size > 0) 
346              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda??  
347              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda.getData()?has_content> 
348            <div class="detall-agenda-buttons-wrapper"> 
349                <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()> 
350                    <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>"  
351                       type="button"  
352                       class="button button--a"  
353                       <#if subelem.linkTypeDetallAgenda.getData() == "extern"  
354                             && subelem.External_LinkDetallAgenda??  
355                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
356                           href="${subelem.External_LinkDetallAgenda.getData()}"  
357                           rel="external"  
358                           target="_blank"  
359                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
360                             && subelem.Internal_LinkDetallAgenda??  
361                             && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content>  
362                           href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}"  
363                           target="_self"   
364                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
365                             && subelem.External_LinkDetallAgenda??  
366                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
367                           href="${subelem.External_LinkDetallAgenda.getData()}"  
368                           target="_self"  
369                       </#if>> 
370                        <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span> 
371                    </a> 
372                </#foreach> 
373            </div> 
374        </#if> 
375    </div> 
376</#if> 
377 
378 
379 
380 
381<#--  DT_PP_TITULO_VIDEO  --> 
382 
383<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))> 
384	<style> 
385		.points-video__video-cover.no_video::after{ 
386			background: none; 
387
388	</style> 
389	<#assign hasLink = false> 
390	<#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content> 
391		<#assign hasLink = true> 
392	</#if> 
393	<section class="points-video bg-gray pt-56"> 
394		<div class="main__container"> 
395			<div class="full-body"> 
396				<div class="full-body__container points-video__header-extra-container"> 
397					<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content> 
398						<a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}"> 
399						</a> 
400					</#if> 
401					<#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content> 
402						<div class="points-video__header"> 
403							<div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>> 
404								<h2 class="points-video__title"> 
405								${stPpVideo.titol.getData()}</h2> 
406								<#if hasLink> 
407									<a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
408								</#if> 
409							</div> 
410							<p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>> 
411							${stPpVideo.descriptiu.getData()}</p> 
412						</div> 
413					</#if> 
414					 
415					<div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies"> 
416						<#if stPpVideo.linkFieldSet.link.getData()?has_content> 
417							<#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2> 
418							<#--13 because v= + 11 char for youtube ids 
419							--> 
420							<#assign end = start + 11> 
421							<a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}" 
422								rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}"> 
423								<div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
424									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
425								</div> 
426								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
427									<p class="points-video__caption"> 
428									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
429								</#if> 
430							</a> 
431						<#else> 
432							<a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"> 
433								<div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
434									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
435								</div> 
436								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
437									<p class="points-video__caption"> 
438									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
439								</#if> 
440							</a> 
441							 
442						</#if> 
443					</div> 
444					<div class='cookieconsent-optout-marketing media-unit__content'> 
445						<@liferay.language key="cookiebot.youtube.no-marketing"/> 
446					</div> 
447					<#if hasLink> 
448						<a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
449					</#if> 
450				</div> 
451			</div> 
452		</div> 
453	</section> 
454	<section class="video-dialog js__video-dialog u-hidden <#if stPpVideo.linkFieldSet.link?? && stPpVideo.linkFieldSet.link.getData()?has_content>${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}</#if>"> 
455		<div class="u-hidden" id="fragment-show-video"> 
456			<div class="video-dialog__panel"> 
457				<header class="video-dialog__header"> 
458					<button class="video-dialog__close js__video-dialog-close"> 
459					Cerrar</button> 
460				</header> 
461				<div class="video-dialog__content"> 
462					<div class="video-dialog__inner js__video-dialog-container"> 
463						<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=""> 
464						</iframe> 
465					</div> 
466				</div> 
467			</div> 
468		</div> 
469		<div class="video-dialog__overlay js__video-dialog-close"> 
470		</div> 
471	</section> 
472</#if> 
473 
474 
475<#--  TEXT-CARRUSEL-IMATGES-ALT  --> 
476 
477<#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()))> 
478	<#assign imagesFolder = themeDisplay.getPathThemeImages()> 
479 
480	<#assign entriesMapList = []> 
481	<#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()> 
482		<#if elem.elementsFieldSetFieldSetAlt.order?has_content> 
483			<#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()> 
484		</#if> 
485		<#if !currentOrder?has_content || currentOrder == "null"> 
486			<#assign currentOrder = "99"> 
487		</#if> 
488		<#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}> 
489		<#assign entriesMapList = entriesMapList + [currEntryMap]> 
490	</#foreach> 
491 
492	<#assign sortedEntriesMapList = entriesMapList?sort_by("order")> 
493	<#assign sortedEntriesRootElems = []> 
494 
495	<#foreach currEntryMap in sortedEntriesMapList> 
496		<#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]> 
497	</#foreach> 
498 
499	<#assign leftContent = ""> 
500	<#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content> 
501		<#assign leftContent = "true"> 
502	</#if> 
503 
504	<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>"> 
505		<#if leftContent?has_content> 
506			<div class="hero-carousel__container-banner"> 
507				<h2 class="hero-carousel-banner-alt-title"> 
508					${textCarruselImatges2.titleHeaderAlt.getData()} 
509				</h2> 
510				<p class="hero-carousel-banner-alt-desc"> 
511					${textCarruselImatges2.descHeaderAlt.getData()} 
512				</p> 
513			</div> 
514		</#if> 
515		<div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable"> 
516			<div class="hero-carousel__container js-carousel-banner-al_alt is-playing" 
517				data-prev-text='<@liferay.language key="label.carousel.prev"/>' 
518				data-next-text='<@liferay.language key="label.carousel.next"/>' 
519				data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>' 
520				data-stop-text='<@liferay.language key="label.carousel.pause"/>' 
521				data-play-text='<@liferay.language key="label.carousel.start"/>'> 
522				<#if sortedEntriesRootElems?has_content>				 
523					<#foreach element in sortedEntriesRootElems> 
524						<div class="hero hero--super"> 
525							<div class="hero__container"> 
526								<#if element.typeLinkAlt.getData() == "video"> 
527									<a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link"  
528										<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content> 
529											title="${element.titleLinkAlt.getData()}" 
530										</#if> 
531
532								<#else> 
533									<a class="hero__link"  
534										<#if element.typeLinkAlt.getData() == "extern">  
535											href="${element.External_LinkAlt.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
536										<#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_LinkAlt?? && element.Internal_LinkAlt.getFriendlyUrl()?has_content>  
537											href="${element.Internal_LinkAlt.getFriendlyUrl()}" target="_self"  
538											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
539										<#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content>  
540											href="${element.External_LinkAlt.getData()}" target="_self"  
541											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
542										</#if> 
543
544								</#if> 
545									<div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>"> 
546										<#if element.typeLinkAlt.getData() == "video"> 
547											<div class="hero__media-video__container"> 
548												<span class="hero__media-video__img"> 
549												</span> 
550											</div> 
551										</#if> 
552										<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>> 
553									</div> 
554									<div class="hero__content white__banner"> 
555										<p class="hero__title" > 
556											${element.titleElemAlt.getData()} 
557										</p> 
558										<p class="hero__desc-alt" > 
559											${element.descElemAlt.getData()} 
560										</p> 
561									</div> 
562								</a> 
563							</div> 
564						</div> 
565					</#foreach> 
566				</#if> 
567			</div> 
568		</div> 
569	</div> 
570 
571	<div class="dialog"> 
572		<div id="carrusel-banner-video" class="u-hidden"> 
573			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
574			</div> 
575		</div> 
576	</div> 
577	<script type="text/javascript"> 
578		initSliderCarruselBanner2(); 
579 
580		function initSliderCarruselBanner2() { 
581			if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) { 
582				$(".js-carousel-banner-al_alt").slick("unslick"); 
583
584			$('.js-carousel-banner-al_alt .slick-toggle-play').remove(); 
585			$('.js-carousel-banner-al_alt').slick({ 
586				slidesToShow: 1, 
587				arrows: true, 
588				draggable: true, 
589				infinite: false, 
590				variableWidth: false, 
591				autoplaySpeed: 4000, 
592				dots: true, 
593				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>', 
594				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>', 
595				responsive: [ 
596
597						breakpoint: 767, 
598						settings: { 
599							slidesToShow: 1, 
600							arrows: false, 
601							variableWidth: true, 
602							dots: true 
603
604
605
606			}).each(function () { 
607				var carousel = $(this), 
608				toggleButton, 
609				toggleIcon; 
610 
611				carousel.find('.slick-next__icon').attr({ 
612					'alt': carousel.data('next-text') 
613				}); 
614 
615				carousel.find('.slick-prev__icon').attr({ 
616					'alt': carousel.data('prev-text') 
617				}); 
618			}); 
619 
620			if ($('.hero-carousel__container .hero').length == 1) { 
621				$('.hero-carousel__container .slick-toggle-play').hide(); 
622
623 
624			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
625			if($(".js-carousel-banner-al_alt .slick-dots").length > 0) { 
626				setDotsPositionBanner2(); 
627
628
629 
630		function showVideoModalBanner2(link) { 
631			const start = link.indexOf("v=") + 2; 
632			const end = start + 2 + 11; 
633 
634			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-${title}"); 
635			$('#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>'); 
636
637		function setDotsPositionBanner2() { 
638			$(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent()); 
639
640 
641		window.addEventListener('resize', function(event){ 
642			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
643			if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) { 
644				setDotsPositionBanner2(); 
645
646		});    
647 
648	</script> 
649</#if> 
650 
651 
652<#--  CARRUSEL-TRES-CARD  --> 
653 
654<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))> 
655	<#assign colorClass = "" /> 
656	<#assign fullBody = "" /> 
657	<#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??> 
658		<#if fondoColorCarruselCards.getData()=="blanc"> 
659			<#assign colorClass = "hola-bcn-carrusel-standard--white" /> 
660			<#assign fullBody = "full-body__container" /> 
661		<#else> 
662			<#assign colorClass = "hola-bcn-carrusel-standard--gray" /> 
663			<#assign fullBody = "full-body__container" /> 
664		</#if> 
665	</#if> 
666 
667	<section class="hola-bcn-carrusel-standard ${colorClass}"> 
668		<div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}"> 
669			<div class="hola-bcn-carrusel-standard--container"> 
670				<div class="hola-bcn-carrusel-standard--outer"> 
671						<div class="hola-bcn-carrusel-standard_new-header"> 
672							<h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new"> 
673							<#if titleCarruselCards?? && titleCarruselCards.getData()?has_content> 
674                ${titleCarruselCards.getData()} 
675              <#else> 
676                <@liferay.language key="title.carrusel.cards.default" /> 
677              </#if> 
678							</h2> 
679							<p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p> 
680						</div> 
681					<ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider"> 
682						<#assign tmbGroupId = 20182> 
683						<#assign fundacioGroupId = 79790> 
684						<#list referencesFieldSet.getSiblings() as element> 
685							<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
686							<#assign articleId = element.referenceId.getData()> 
687							<#assign groupId = getterUtil.getLong(groupId)> 
688							<#attempt> 
689								<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) /> 
690							<#recover> 
691								<#if groupId == tmbGroupId> 
692									<#assign groupId = fundacioGroupId> 
693								<#else> 
694									<#assign groupId = tmbGroupId> 
695								</#if> 
696								<#attempt> 
697									<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!> 
698								<#recover> 
699									<#assign journalArticle = ""> 
700								</#attempt> 
701							</#attempt> 
702							<#if journalArticle?has_content && journalArticle != ""> 
703								<#assign document = saxReaderUtil.read(journalArticle.getContent())> 
704								<#assign rootElement = document.getRootElement()> 
705 
706								<#assign resourceprimKey = journalArticle.getResourcePrimKey()> 
707								<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)> 
708								<#assign assetRenderer = assetEntry.getAssetRenderer()> 
709								<#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")> 
710								<#assign articleFriendlyURL = assetRenderer.getUrlTitle()> 
711								<#assign newwindow = ""> 
712								<#if !articleURL?has_content> 
713									<#assign newwindow = "target='_blank'"> 
714									<#if !isFundacio> 
715										<#if currentURL?contains("pre3")> 
716											<#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
717										<#else> 
718											<#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
719										</#if> 
720									<#else> 
721										<#if currentURL?contains("pre3")> 
722											<#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
723										<#else> 
724											<#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
725										</#if> 
726									</#if> 
727								</#if> 
728 
729								<#assign title = ""> 
730								<#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
731								<#if titleSel.selectSingleNode(rootElement)?has_content> 
732									<#assign title = titleSel.selectSingleNode(rootElement).getStringValue()> 
733								</#if> 
734								 
735								<#assign subtitle = ""> 
736								<#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
737								<#if subtitleSel.selectSingleNode(rootElement)?has_content> 
738									<#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()> 
739								</#if> 
740 
741								<#assign initDateNovetatAgenda = ""> 
742								<#assign fromInitDateNovetatAgenda = ""> 
743								<#assign endDateNovetatAgenda = ""> 
744								<#assign whereNovetatAgenda = ""> 
745								<#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!""> 
746								<#if novetatAgendaSel?has_content> 
747									<#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!""> 
748 
749									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
750										<#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
751									</#if> 
752 
753									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
754										<#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
755									</#if> 
756 
757									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
758										<#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
759									</#if> 
760 
761									<#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!""> 
762									<#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
763										<#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
764									</#if> 
765								</#if> 
766 
767								<#assign typeNovetatAgenda = ""> 
768								<#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
769								<#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
770									<#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
771								</#if> 
772 
773								<#assign filterNovetatAgenda = ""> 
774								<#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
775								<#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
776									<#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
777								</#if> 
778								 
779								<#assign imageNovetatAgenda = ""> 
780								<#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
781								<#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
782									<#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
783									<#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!""> 
784									<#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid> 
785								</#if> 
786 
787								<#assign imageAltNovetatAgenda = ""> 
788								<#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
789								<#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
790									<#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
791								</#if> 
792 
793								<#assign pubDateNovetatAgenda = ""> 
794								<#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
795								<#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
796									<#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
797								</#if> 
798 
799								<#assign pubTimeNovetatAgenda = ""> 
800								<#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
801								<#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
802									<#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
803								</#if> 
804 
805								<#assign despubDateNovetatAgenda = ""> 
806								<#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
807								<#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
808									<#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
809								</#if> 
810 
811								<#assign despubTimeNovetatAgenda = ""> 
812								<#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
813								<#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
814									<#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
815								</#if> 
816 
817								<#assign isExpiredNovetatAgenda = ""> 
818								<#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
819								<#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
820									<#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
821								</#if> 
822 
823								<#assign isPublishedNA = false> 
824								<#if (pubDateNovetatAgenda?has_content)> 
825									<#if pubTimeNovetatAgenda?has_content> 
826										<#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]> 
827										<#assign timeActFormat = timeActDate?string["HH:mm"]> 
828									<#else> 
829										<#assign timeActDate = ""> 
830										<#assign timeActFormat = ""> 
831									</#if> 
832									<#attempt>	 
833										<#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]> 
834										 
835										<#if timeActFormat?has_content && timeActFormat != ""> 
836											<#assign dataActMil = miliSeconds(timeActFormat dataAct?long)> 
837											<#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))> 
838										</#if> 
839										<#assign dataActMil = dataAct?long> 
840										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
841										<#assign isPublishedNA = (dataActMil - now ) < 0 /> 
842									<#recover> 
843									</#attempt> 
844								</#if> 
845 
846								<#assign isDespublishedNA = false> 
847								<#if (despubDateNovetatAgenda?has_content)> 
848									<#if despubTimeNovetatAgenda?has_content> 
849										<#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]> 
850										<#assign timeExpFormat = timeExpDate?string["HH:mm"]> 
851									<#else> 
852										<#assign timeExpDate = ""> 
853										<#assign timeExpFormat = ""> 
854									</#if> 
855									<#attempt> 
856										<#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]> 
857										 
858										<#if timeExpFormat?has_content && timeExpFormat != ""> 
859											<#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)> 
860											<#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))> 
861										</#if> 
862										<#assign dataExpMil = dataExp?long> 
863										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
864										<#assign isDespublishedNA = (dataExpMil - now) < 0 /> 
865									<#recover> 
866									</#attempt> 
867								</#if> 
868 
869								<#assign isExpiredNA = false> 
870								<#if journalArticle.expirationDate??> 
871									<#assign dataExp = journalArticle.expirationDate?datetime> 
872									<#attempt> 
873										<#assign dataExpMil = dataExp?long> 
874										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
875										<#assign isExpiredNA = (dataExpMil - now) < 0 /> 
876									<#recover> 
877									</#attempt> 
878								</#if> 
879 
880								<#assign showNovetatAgenda = false> 
881								<#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1"> 
882									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true"> 
883								<#else> 
884									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true"> 
885								</#if> 
886 
887								<#if showNovetatAgenda> 
888									<#if title?has_content> 
889										<li class="hola-bcn-carrusel-standard_new-li"> 
890											<a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}"> 
891												<div class="hola-bcn-carrusel-standard__card-cover"> 
892													<div class="hola-bcn-carrusel-standard__card-cover-filter"></div> 
893													<img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>> 
894													<div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>> 
895														<span><@liferay.language key='label.bloc.novetatagenda.finished' /></span> 
896													</div> 
897													<#if filterNovetatAgenda?has_content> 
898														<div class="hola-bcn-carrusel-standard-highlight"> 
899															<span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span> 
900														</div> 
901													</#if> 
902												</div> 
903												<div class="hola-bcn-carrusel-standard-container"> 
904													<div> 
905														<h3 class="hola-bcn-carrusel-standard__card-title"> 
906															${title} 
907															<#if newwindow?? && newwindow?has_content> 
908																<span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span> 
909															</#if> 
910														</h3> 
911														<span class="hola-bcn-carrusel-standard__card-description"> 
912															${subtitle} 
913														</span> 
914													</div> 
915													<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)> 
916														<div class="hola-bcn-carrusel-standard_bottom-extra"> 
917															<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content> 
918																<div class="hola-bcn-carrusel-standard-date"> 
919																	<#if fromInitDateNovetatAgenda == "true"> 
920																		<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> 
921																	<#else> 
922																		<#if initDateNovetatAgenda?has_content && !endDateNovetatAgenda?has_content> 
923																			<span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span> 
924																		<#else> 
925																			<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> 
926																		</#if> 
927																	</#if> 
928																</div> 
929															</#if> 
930															<#if whereNovetatAgenda?has_content> 
931																<div class="hola-bcn-carrusel-standard-where"> 
932																	<span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span> 
933																</div> 
934															</#if> 
935														</div> 
936													</#if> 
937												</div> 
938											</a> 
939										</li> 
940									</#if> 
941								</#if> 
942							</#if> 
943						</#list> 
944					</ul> 
945				</div> 
946			</div> 
947		</div> 
948	</section> 
949 
950	<script type="text/javascript"> 
951 
952		$(document).ready(function() { 
953			initSliderBcnStandard(); 
954		}); 
955 
956		function initSliderBcnStandard() { 
957			if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) { 
958				$(".js__hola-bcn-standard-slider").slick("unslick"); 
959
960 
961			$('.js__hola-bcn-standard-slider').slick({ 
962				slidesToShow: 3, 
963				slidesToScroll: 1, 
964				arrows: false, 
965				dots: false, 
966				draggable: false, 
967				infinite: false, 
968				responsive: [ 
969
970						breakpoint: 767, 
971						settings: { 
972							variableWidth: true, 
973							slidesToShow: 1, 
974							slidesToScroll: 1, 
975							arrows: false, 
976							dots: true, 
977							draggable: true, 
978							infinite: true 
979
980
981
982			}); 
983
984 
985	</script> 
986</#if> 

On the metro, travel with your dog responsibly

We inform you how to travel correctly with your dog, for its safety and that of other passengers.

When traveling with your dog on the metro, remember to always keep it on a non-extendable leash, no more than 50 cm away from you, and wearing a muzzle.

It is also important that, for their safety, you do not take them on the escalators, as they may be prone to an accident. Always use the stairs.

We provide you with all the details.

Travel during the allowed time slots

  • Dogs can access the metro from 5:00 to 7:00 AM, from 9:00 AM to 5:00 PM, and after 7:30 PM on weekdays between September 11 and June 24.
  • On weekends, public holidays, and all days during the summer period (from June 24 to September 11), they can access without any time restrictions.
  • During times of heavy crowding and when the safety of users and the animals themselves requires it, TMB may limit the admission of dogs.

Before traveling by metro, you should know...

  • Only one dog is allowed per person.
  • Minors under 18 years old are not allowed to carry dogs considered potentially dangerous according to current regulations. The individuals carrying them must have the license and the certification proving the dog's registration in the municipal register.
  • From the metro entrance to the street exit, the rules regarding the muzzle, distance, and leash must be followed.
  • Dogs are only allowed to use elevators and fixed stairs.
  • Dogs are not allowed to occupy seats.

Traveling with your dog is your responsibility

  • The person responsible for the animal’s behavior is the one who is carrying it. Therefore, you must ensure that no situation of danger or inconvenience occurs to other users. You should also avoid blocking passages or doors, both in the vestibules, corridors, and on the trains.
  • The person carrying the dog is responsible for any damages or harm the dog may cause to both users and the company. The dog's owner is subsidiarily responsible.
  • If the conditions established for the access of dogs to the metro are not respected, the person carrying the dog may commit, depending on the circumstances, a serious or minor offense, in accordance with articles 64.s) or 65.p) of Law 4/2006, of March 31, Railway Law.

Hyundai Mitja Marató Barcelona

We explain how to get there!

When: 12.02.2026


Where: Parc de la Ciutadella


If you participate in the Hyundai 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.

Consult the impacts on the bus service foreseen in the specific notice.

Check the Journey planner for other transport options.

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.

TMB, with the major events of the city

The Hyundai Mitja Marató Barcelona, is one of the most important races held annually in the city.

For this edition, 36.000 single tickets have been issued and included in the runner’s bag.

TMB, as the main public transport operator in Barcelona and its metropolitan area, works to manage the impact that an event of this scale can have on the transport network. In addition, it plays an active role in these events, maintaining a constant presence and collaborating at both a logistical and brand level.

Arrive at the race on time and without surprises with TMB App!

With TMB App, you have access to public transport and bicycle routes and options, you can manage T-mobilitat, and make all the necessary inquiries to organize your trips around Barcelona and its metropolitan area. It also allows you to quickly check the status of the lines and stops you use most, and locate nearby stations and stops thanks to the new built‑in ddTag scanner.

                                                         


 

We are always there

The metro and buses have real-time video surveillance cameras so you can travel safely.

Gracias a los sistemas de videovigilancia, los profesionales de TMB velan por tu seguridad durante todas las horas del servicio, tanto en metro como en bus.

Video surveillance in the metro

La red de metro cuenta con casi 10.000 cámaras que están repartidas por trenes y estaciones y también en cocheras, talleres y otras dependencias de TMB.

Estas cámaras permiten ver lo que está sucediendo en directo cuando un usuario pulsa el botón SOS o el de información en un tren o en una estación. Las imágenes captadas por estos dispositivos de videovigilancia se reciben en el Centro de Control de Metro y en el Centro de Seguridad y Protección Civil.

Video surveillance on the bus

La red de bus dispone de más de 4.500 cámaras que actualmente cubren prácticamente todo el servicio regular de la flota.

Este sistema de videovigilancia permite al Centro de Control de Seguridad de Bus visualizar en tiempo real imágenes del interior de los vehículos, así como descargar al momento cualquiera de las grabaciones.

Images available to security forces

Las imágenes captadas por estos dispositivos de videovigilancia, tanto de la red de bus como la de metro, quedan grabadas y pueden ser revisadas cuando los Mossos d'Esquadra u otros cuerpos de seguridad lo requieran.

On escalators, avoid accidents

Following the rules of use is essential to ensure your own safety and that of others

How to use scalatores correctly

In the TMB metro network, entrapment accidents on escalators are one of the most common hazards, especially when proper precautions are not taken.

The metro escalators help us move faster, improve accessibility, and make it easier to get around during peak hours. However, incorrect use can lead to dangerous situations that put all users’ safety at risk.

Entrapment incidents on metro escalators often happen accidentally when the yellow step area is invaded. Items such as users’ own footwear or clothing can get caught, but there are also other types of accidents that can be very serious and result from improper use of the facilities. Actions such as using the escalators with dogs not being carried are strictly prohibited. Entering with large objects such as suitcases, baby strollers, or shopping carts that invade the marked yellow area can obstruct the escalator mechanism and increase the risk not only of entrapment but also of falls.

It’s important to follow the basic rules and, before stepping onto the escalator, make sure you're not carrying anything that could get caught in the sides or corners of the steps—such as large bags, belts, bulky clothing, long dresses or robes, scarves, and similar items. And if you’re with your dog, remember: use the stone stairs—not just for your safety, but for your pet’s safety too.

Avoid accidents

Entrapment incidents on metro escalators often happen accidentally when the yellow step area is invaded. Items such as users’ own footwear or clothing can get caught, but there are also other types of accidents that can be very serious and result from improper use of the facilities. Actions such as using the escalators with dogs not being carried are strictly prohibited. Entering with large objects such as suitcases, baby strollers, or shopping carts that invade the marked yellow area can obstruct the escalator mechanism and increase the risk not only of entrapment but also of falls.

It’s important to follow the basic rules and, before stepping onto the escalator, make sure you're not carrying anything that could get caught in the sides or corners of the steps—such as large bags, belts, bulky clothing, long dresses or robes, scarves, and similar items. And if you’re with your dog, remember: use the stone stairs—not just for your safety, but for your pet’s safety too.

Avoid the risk of accidents at metro doors

Do not enter or exit once the door closing sound or light signal has started.

Faced with gender-based violence, seek help!

We explain how to ask for help when you encounter sexist situations on TMB transport

How to ask for help on the metro and the bus

The help gesture, used internationally to discreetly identify women who are suffering from gender-based violence or are at risk, can be crucial in triggering a quick and safe response, including in mobility spaces such as public transport.

  • When travelling by metro, you have SOS buttons available throughout all facilities. You can also go to TMB Points and contact our staff directly, who are ready to assist you.
  • On your bus journeys, if you encounter a situation of gender-based violence, immediately inform our staff, who will activate the assistance protocol.

Remember that you can always call the emergency number 112 or the 24-hour helplines against gender-based violence: 900 900 120 and 016.

Quan viatges amb TMB, no estàs sola

Our transport services are equipped with CCTV cameras across the metro network – with nearly 10,000 cameras – and throughout the entire bus fleet. This measure allows real-time monitoring when a user presses the SOS button on a vehicle or at a station, as well as collaboration with security forces and surveillance services.

For safety purposes, we have improved lighting in metro facilities. We also train our staff to assist you whenever needed. We act under the motto #xarxavioleta and apply a zero-tolerance policy towards gender-based violence.

Don’t hesitate – ask for help! Raise your voice against gender-based violence!

Your safety is a priority and, together, we can make public transport a space free from violence.

At TMB, zero tolerance for gender-based violence

At TMB, we work to prevent and respond to any situation of gender-based violence. As a responsible company, we stand by victims and take a firm stance against any aggressor. At the same time, we call on citizens to act, because everyone is needed in the fight against gender-based violence, and safety is a shared responsibility.

TMB’s Decalogue for the Prevention of Gender-Based Violence:

  1. TMB declares its strong commitment to real and effective equality between men and women.
  2. TMB undertakes to promote respectful and calm behaviour across public transport networks, fostering peaceful coexistence among users.
  3. TMB commits to adopting appropriate measures to prevent any form of discrimination based on sex against users of its transport networks.
  4. TMB expresses its absolute rejection of any behaviour contrary to the freedom, dignity, and physical and psychological integrity of users, as well as of any other person linked to public transport networks.
  5. TMB confirms its intention to continue developing awareness and sensitisation actions to combat any offensive manifestation based on a person’s sex during their travel experience.
  6. TMB strongly disapproves of gestures, looks, and insinuations of a lascivious or intimidating nature among metro or bus users, regardless of their physical appearance or clothing.
  7. TMB advocates active listening to all women who feel sexually harassed or harassed because of their sex, as well as those who suspect such unwanted behaviour.
  8. TMB reaffirms its commitment to continue strengthening preventive and intervention measures against gender-based violence to protect women using metro and bus networks.
  9. TMB explicitly states its intention to work jointly with competent authorities and agencies to develop a protocol for action against gender-based violence, ensuring that public transport networks are safe, respectful, and comfortable mobility environments for everyone.
  10. TMB assumes responsibility for disseminating the content and purpose of this document through all possible channels.
An error occurred while processing the template.
The following has evaluated to null or missing:
==> title  [in template "20155#20195#1501272" at line 634, column 202]

----
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: ${title}  [in template "20155#20195#1501272" at line 634, column 200]
----
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"  
173									<#if element.typeLink.getData() == "extern">  
174										href="${element.External_Link.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
175									<#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content>  
176										href="${element.Internal_Link.getFriendlyUrl()}" target="_self"  
177										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
178									<#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content>  
179										href="${element.External_Link.getData()}" target="_self"  
180										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
181									</#if> 
182
183								</#if> 
184									<div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>"> 
185										<#if element.typeLink.getData() == "video"> 
186											<div class="hero__media-video__container"> 
187												<span class="hero__media-video__img"> 
188												</span> 
189											</div> 
190										</#if> 
191										<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>> 
192									</div> 
193									<div class="hero__content white__banner"> 
194										<p class="hero__title" > 
195											${element.titleElem.getData()} 
196										</p> 
197										<p class="hero__desc-alt" > 
198											${element.descElem.getData()} 
199										</p> 
200									</div> 
201								</a> 
202							</div> 
203						</div> 
204					</#foreach> 
205				</#if> 
206			</div> 
207		</div> 
208	</div> 
209 
210	<div class="dialog"> 
211		<div id="carrusel-banner-video" class="u-hidden"> 
212			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
213			</div> 
214		</div> 
215	</div> 
216	<script type="text/javascript"> 
217		initSliderCarruselBanner1(); 
218 
219		function initSliderCarruselBanner1() { 
220			if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) { 
221				$(".js-carousel-banner-al_1").slick("unslick"); 
222
223			$('.js-carousel-banner-al_1 .slick-toggle-play').remove(); 
224			$('.js-carousel-banner-al_1').slick({ 
225				slidesToShow: 1, 
226				arrows: true, 
227				draggable: true, 
228				infinite: false, 
229				variableWidth: false, 
230				autoplaySpeed: 4000, 
231				dots: true, 
232				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>', 
233				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>', 
234				responsive: [ 
235
236						breakpoint: 767, 
237						settings: { 
238							slidesToShow: 1, 
239							arrows: false, 
240							variableWidth: true, 
241							dots: true 
242
243
244
245			}).each(function () { 
246				var carousel = $(this), 
247				toggleButton, 
248				toggleIcon; 
249 
250				carousel.find('.slick-next__icon').attr({ 
251					'alt': carousel.data('next-text') 
252				}); 
253 
254				carousel.find('.slick-prev__icon').attr({ 
255					'alt': carousel.data('prev-text') 
256				}); 
257			}); 
258 
259			if ($('.hero-carousel__container .hero').length == 1) { 
260				$('.hero-carousel__container .slick-toggle-play').hide(); 
261
262 
263			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
264			if($(".js-carousel-banner-al_1 .slick-dots").length > 0) { 
265				setDotsPositionBanner1(); 
266
267
268 
269		function showVideoModalBanner(link) { 
270			const start = link.indexOf("v=") + 2; 
271			const end = start + 2 + 11; 
272 
273			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-"); 
274			$('#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>'); 
275
276		function setDotsPositionBanner1() { 
277			$(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent()); 
278
279 
280		window.addEventListener('resize', function(event){ 
281			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
282			if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) { 
283				setDotsPositionBanner1(); 
284
285		});    
286 
287	</script> 
288</#if> 
289 
290 
291<#--  BASICA-TITOL-TEXT  --> 
292 
293<#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()))> 
294	<div class="full-body__container basica-titol-text"> 
295		<#foreach elem in basicaTitolText.elementsBasica.getSiblings()> 
296			<div class="basica-titol-text-wrapper"> 
297				<#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if> 
298				<#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if> 
299			</div> 
300			<#foreach subelem in elem.subelementsBasica.getSiblings()> 
301				<div class="basica-titol-text-wrapper"> 
302					<#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if> 
303					<#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if> 
304				</div> 
305			</#foreach> 
306		</#foreach> 
307	</div> 
308</#if> 
309 
310 
311<#--  bloc-detall-agenda  --> 
312 
313<#if detallAgenda?? && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))> 
314    <#assign hasElementDetallAgenda = false> 
315    <#if detallAgenda.elementsDetallAgenda??  
316          && detallAgenda.elementsDetallAgenda.getSiblings()??  
317          && (detallAgenda.elementsDetallAgenda.getSiblings()?size > 0)> 
318        <#assign firstSibling = detallAgenda.elementsDetallAgenda.getSiblings()[0]> 
319        <#if (firstSibling.titleDetallAgenda?? && firstSibling.titleDetallAgenda.getData()?has_content)  
320              || (firstSibling.contentDetallAgenda?? && firstSibling.contentDetallAgenda.getData()?has_content)> 
321            <#assign hasElementDetallAgenda = true> 
322        </#if> 
323    </#if> 
324     
325    <div class="full-body__container detall-agenda" <#if !hasElementDetallAgenda>style="margin-top:0;"</#if>> 
326		<#if detallAgenda.elementsDetallAgenda.getSiblings()??> 
327			<#assign siblings = detallAgenda.elementsDetallAgenda.getSiblings()> 
328			<#if siblings?size gt 0> 
329				<#foreach elem in siblings> 
330					<div class="detall-agenda-wrapper"> 
331						<#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content> 
332							<h2 class="">${elem.titleDetallAgenda.getData()}</h2> 
333						</#if> 
334						<#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content> 
335							<div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div> 
336						</#if> 
337					</div> 
338				</#foreach> 
339			</#if> 
340		</#if> 
341 
342         
343        <#if detallAgenda.buttonsDetallAgenda??  
344              && detallAgenda.buttonsDetallAgenda.getSiblings()??  
345              && (detallAgenda.buttonsDetallAgenda.getSiblings()?size > 0) 
346              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda??  
347              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda.getData()?has_content> 
348            <div class="detall-agenda-buttons-wrapper"> 
349                <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()> 
350                    <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>"  
351                       type="button"  
352                       class="button button--a"  
353                       <#if subelem.linkTypeDetallAgenda.getData() == "extern"  
354                             && subelem.External_LinkDetallAgenda??  
355                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
356                           href="${subelem.External_LinkDetallAgenda.getData()}"  
357                           rel="external"  
358                           target="_blank"  
359                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
360                             && subelem.Internal_LinkDetallAgenda??  
361                             && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content>  
362                           href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}"  
363                           target="_self"   
364                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
365                             && subelem.External_LinkDetallAgenda??  
366                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
367                           href="${subelem.External_LinkDetallAgenda.getData()}"  
368                           target="_self"  
369                       </#if>> 
370                        <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span> 
371                    </a> 
372                </#foreach> 
373            </div> 
374        </#if> 
375    </div> 
376</#if> 
377 
378 
379 
380 
381<#--  DT_PP_TITULO_VIDEO  --> 
382 
383<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))> 
384	<style> 
385		.points-video__video-cover.no_video::after{ 
386			background: none; 
387
388	</style> 
389	<#assign hasLink = false> 
390	<#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content> 
391		<#assign hasLink = true> 
392	</#if> 
393	<section class="points-video bg-gray pt-56"> 
394		<div class="main__container"> 
395			<div class="full-body"> 
396				<div class="full-body__container points-video__header-extra-container"> 
397					<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content> 
398						<a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}"> 
399						</a> 
400					</#if> 
401					<#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content> 
402						<div class="points-video__header"> 
403							<div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>> 
404								<h2 class="points-video__title"> 
405								${stPpVideo.titol.getData()}</h2> 
406								<#if hasLink> 
407									<a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
408								</#if> 
409							</div> 
410							<p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>> 
411							${stPpVideo.descriptiu.getData()}</p> 
412						</div> 
413					</#if> 
414					 
415					<div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies"> 
416						<#if stPpVideo.linkFieldSet.link.getData()?has_content> 
417							<#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2> 
418							<#--13 because v= + 11 char for youtube ids 
419							--> 
420							<#assign end = start + 11> 
421							<a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}" 
422								rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}"> 
423								<div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
424									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
425								</div> 
426								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
427									<p class="points-video__caption"> 
428									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
429								</#if> 
430							</a> 
431						<#else> 
432							<a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"> 
433								<div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
434									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
435								</div> 
436								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
437									<p class="points-video__caption"> 
438									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
439								</#if> 
440							</a> 
441							 
442						</#if> 
443					</div> 
444					<div class='cookieconsent-optout-marketing media-unit__content'> 
445						<@liferay.language key="cookiebot.youtube.no-marketing"/> 
446					</div> 
447					<#if hasLink> 
448						<a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
449					</#if> 
450				</div> 
451			</div> 
452		</div> 
453	</section> 
454	<section class="video-dialog js__video-dialog u-hidden <#if stPpVideo.linkFieldSet.link?? && stPpVideo.linkFieldSet.link.getData()?has_content>${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}</#if>"> 
455		<div class="u-hidden" id="fragment-show-video"> 
456			<div class="video-dialog__panel"> 
457				<header class="video-dialog__header"> 
458					<button class="video-dialog__close js__video-dialog-close"> 
459					Cerrar</button> 
460				</header> 
461				<div class="video-dialog__content"> 
462					<div class="video-dialog__inner js__video-dialog-container"> 
463						<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=""> 
464						</iframe> 
465					</div> 
466				</div> 
467			</div> 
468		</div> 
469		<div class="video-dialog__overlay js__video-dialog-close"> 
470		</div> 
471	</section> 
472</#if> 
473 
474 
475<#--  TEXT-CARRUSEL-IMATGES-ALT  --> 
476 
477<#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()))> 
478	<#assign imagesFolder = themeDisplay.getPathThemeImages()> 
479 
480	<#assign entriesMapList = []> 
481	<#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()> 
482		<#if elem.elementsFieldSetFieldSetAlt.order?has_content> 
483			<#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()> 
484		</#if> 
485		<#if !currentOrder?has_content || currentOrder == "null"> 
486			<#assign currentOrder = "99"> 
487		</#if> 
488		<#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}> 
489		<#assign entriesMapList = entriesMapList + [currEntryMap]> 
490	</#foreach> 
491 
492	<#assign sortedEntriesMapList = entriesMapList?sort_by("order")> 
493	<#assign sortedEntriesRootElems = []> 
494 
495	<#foreach currEntryMap in sortedEntriesMapList> 
496		<#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]> 
497	</#foreach> 
498 
499	<#assign leftContent = ""> 
500	<#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content> 
501		<#assign leftContent = "true"> 
502	</#if> 
503 
504	<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>"> 
505		<#if leftContent?has_content> 
506			<div class="hero-carousel__container-banner"> 
507				<h2 class="hero-carousel-banner-alt-title"> 
508					${textCarruselImatges2.titleHeaderAlt.getData()} 
509				</h2> 
510				<p class="hero-carousel-banner-alt-desc"> 
511					${textCarruselImatges2.descHeaderAlt.getData()} 
512				</p> 
513			</div> 
514		</#if> 
515		<div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable"> 
516			<div class="hero-carousel__container js-carousel-banner-al_alt is-playing" 
517				data-prev-text='<@liferay.language key="label.carousel.prev"/>' 
518				data-next-text='<@liferay.language key="label.carousel.next"/>' 
519				data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>' 
520				data-stop-text='<@liferay.language key="label.carousel.pause"/>' 
521				data-play-text='<@liferay.language key="label.carousel.start"/>'> 
522				<#if sortedEntriesRootElems?has_content>				 
523					<#foreach element in sortedEntriesRootElems> 
524						<div class="hero hero--super"> 
525							<div class="hero__container"> 
526								<#if element.typeLinkAlt.getData() == "video"> 
527									<a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link"  
528										<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content> 
529											title="${element.titleLinkAlt.getData()}" 
530										</#if> 
531
532								<#else> 
533									<a class="hero__link"  
534										<#if element.typeLinkAlt.getData() == "extern">  
535											href="${element.External_LinkAlt.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
536										<#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_LinkAlt?? && element.Internal_LinkAlt.getFriendlyUrl()?has_content>  
537											href="${element.Internal_LinkAlt.getFriendlyUrl()}" target="_self"  
538											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
539										<#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content>  
540											href="${element.External_LinkAlt.getData()}" target="_self"  
541											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
542										</#if> 
543
544								</#if> 
545									<div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>"> 
546										<#if element.typeLinkAlt.getData() == "video"> 
547											<div class="hero__media-video__container"> 
548												<span class="hero__media-video__img"> 
549												</span> 
550											</div> 
551										</#if> 
552										<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>> 
553									</div> 
554									<div class="hero__content white__banner"> 
555										<p class="hero__title" > 
556											${element.titleElemAlt.getData()} 
557										</p> 
558										<p class="hero__desc-alt" > 
559											${element.descElemAlt.getData()} 
560										</p> 
561									</div> 
562								</a> 
563							</div> 
564						</div> 
565					</#foreach> 
566				</#if> 
567			</div> 
568		</div> 
569	</div> 
570 
571	<div class="dialog"> 
572		<div id="carrusel-banner-video" class="u-hidden"> 
573			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
574			</div> 
575		</div> 
576	</div> 
577	<script type="text/javascript"> 
578		initSliderCarruselBanner2(); 
579 
580		function initSliderCarruselBanner2() { 
581			if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) { 
582				$(".js-carousel-banner-al_alt").slick("unslick"); 
583
584			$('.js-carousel-banner-al_alt .slick-toggle-play').remove(); 
585			$('.js-carousel-banner-al_alt').slick({ 
586				slidesToShow: 1, 
587				arrows: true, 
588				draggable: true, 
589				infinite: false, 
590				variableWidth: false, 
591				autoplaySpeed: 4000, 
592				dots: true, 
593				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>', 
594				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>', 
595				responsive: [ 
596
597						breakpoint: 767, 
598						settings: { 
599							slidesToShow: 1, 
600							arrows: false, 
601							variableWidth: true, 
602							dots: true 
603
604
605
606			}).each(function () { 
607				var carousel = $(this), 
608				toggleButton, 
609				toggleIcon; 
610 
611				carousel.find('.slick-next__icon').attr({ 
612					'alt': carousel.data('next-text') 
613				}); 
614 
615				carousel.find('.slick-prev__icon').attr({ 
616					'alt': carousel.data('prev-text') 
617				}); 
618			}); 
619 
620			if ($('.hero-carousel__container .hero').length == 1) { 
621				$('.hero-carousel__container .slick-toggle-play').hide(); 
622
623 
624			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
625			if($(".js-carousel-banner-al_alt .slick-dots").length > 0) { 
626				setDotsPositionBanner2(); 
627
628
629 
630		function showVideoModalBanner2(link) { 
631			const start = link.indexOf("v=") + 2; 
632			const end = start + 2 + 11; 
633 
634			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-${title}"); 
635			$('#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>'); 
636
637		function setDotsPositionBanner2() { 
638			$(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent()); 
639
640 
641		window.addEventListener('resize', function(event){ 
642			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
643			if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) { 
644				setDotsPositionBanner2(); 
645
646		});    
647 
648	</script> 
649</#if> 
650 
651 
652<#--  CARRUSEL-TRES-CARD  --> 
653 
654<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))> 
655	<#assign colorClass = "" /> 
656	<#assign fullBody = "" /> 
657	<#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??> 
658		<#if fondoColorCarruselCards.getData()=="blanc"> 
659			<#assign colorClass = "hola-bcn-carrusel-standard--white" /> 
660			<#assign fullBody = "full-body__container" /> 
661		<#else> 
662			<#assign colorClass = "hola-bcn-carrusel-standard--gray" /> 
663			<#assign fullBody = "full-body__container" /> 
664		</#if> 
665	</#if> 
666 
667	<section class="hola-bcn-carrusel-standard ${colorClass}"> 
668		<div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}"> 
669			<div class="hola-bcn-carrusel-standard--container"> 
670				<div class="hola-bcn-carrusel-standard--outer"> 
671						<div class="hola-bcn-carrusel-standard_new-header"> 
672							<h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new"> 
673							<#if titleCarruselCards?? && titleCarruselCards.getData()?has_content> 
674                ${titleCarruselCards.getData()} 
675              <#else> 
676                <@liferay.language key="title.carrusel.cards.default" /> 
677              </#if> 
678							</h2> 
679							<p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p> 
680						</div> 
681					<ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider"> 
682						<#assign tmbGroupId = 20182> 
683						<#assign fundacioGroupId = 79790> 
684						<#list referencesFieldSet.getSiblings() as element> 
685							<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
686							<#assign articleId = element.referenceId.getData()> 
687							<#assign groupId = getterUtil.getLong(groupId)> 
688							<#attempt> 
689								<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) /> 
690							<#recover> 
691								<#if groupId == tmbGroupId> 
692									<#assign groupId = fundacioGroupId> 
693								<#else> 
694									<#assign groupId = tmbGroupId> 
695								</#if> 
696								<#attempt> 
697									<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!> 
698								<#recover> 
699									<#assign journalArticle = ""> 
700								</#attempt> 
701							</#attempt> 
702							<#if journalArticle?has_content && journalArticle != ""> 
703								<#assign document = saxReaderUtil.read(journalArticle.getContent())> 
704								<#assign rootElement = document.getRootElement()> 
705 
706								<#assign resourceprimKey = journalArticle.getResourcePrimKey()> 
707								<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)> 
708								<#assign assetRenderer = assetEntry.getAssetRenderer()> 
709								<#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")> 
710								<#assign articleFriendlyURL = assetRenderer.getUrlTitle()> 
711								<#assign newwindow = ""> 
712								<#if !articleURL?has_content> 
713									<#assign newwindow = "target='_blank'"> 
714									<#if !isFundacio> 
715										<#if currentURL?contains("pre3")> 
716											<#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
717										<#else> 
718											<#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
719										</#if> 
720									<#else> 
721										<#if currentURL?contains("pre3")> 
722											<#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
723										<#else> 
724											<#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
725										</#if> 
726									</#if> 
727								</#if> 
728 
729								<#assign title = ""> 
730								<#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
731								<#if titleSel.selectSingleNode(rootElement)?has_content> 
732									<#assign title = titleSel.selectSingleNode(rootElement).getStringValue()> 
733								</#if> 
734								 
735								<#assign subtitle = ""> 
736								<#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
737								<#if subtitleSel.selectSingleNode(rootElement)?has_content> 
738									<#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()> 
739								</#if> 
740 
741								<#assign initDateNovetatAgenda = ""> 
742								<#assign fromInitDateNovetatAgenda = ""> 
743								<#assign endDateNovetatAgenda = ""> 
744								<#assign whereNovetatAgenda = ""> 
745								<#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!""> 
746								<#if novetatAgendaSel?has_content> 
747									<#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!""> 
748 
749									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
750										<#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
751									</#if> 
752 
753									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
754										<#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
755									</#if> 
756 
757									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
758										<#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
759									</#if> 
760 
761									<#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!""> 
762									<#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
763										<#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
764									</#if> 
765								</#if> 
766 
767								<#assign typeNovetatAgenda = ""> 
768								<#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
769								<#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
770									<#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
771								</#if> 
772 
773								<#assign filterNovetatAgenda = ""> 
774								<#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
775								<#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
776									<#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
777								</#if> 
778								 
779								<#assign imageNovetatAgenda = ""> 
780								<#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
781								<#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
782									<#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
783									<#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!""> 
784									<#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid> 
785								</#if> 
786 
787								<#assign imageAltNovetatAgenda = ""> 
788								<#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
789								<#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
790									<#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
791								</#if> 
792 
793								<#assign pubDateNovetatAgenda = ""> 
794								<#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
795								<#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
796									<#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
797								</#if> 
798 
799								<#assign pubTimeNovetatAgenda = ""> 
800								<#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
801								<#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
802									<#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
803								</#if> 
804 
805								<#assign despubDateNovetatAgenda = ""> 
806								<#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
807								<#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
808									<#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
809								</#if> 
810 
811								<#assign despubTimeNovetatAgenda = ""> 
812								<#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
813								<#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
814									<#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
815								</#if> 
816 
817								<#assign isExpiredNovetatAgenda = ""> 
818								<#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
819								<#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
820									<#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
821								</#if> 
822 
823								<#assign isPublishedNA = false> 
824								<#if (pubDateNovetatAgenda?has_content)> 
825									<#if pubTimeNovetatAgenda?has_content> 
826										<#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]> 
827										<#assign timeActFormat = timeActDate?string["HH:mm"]> 
828									<#else> 
829										<#assign timeActDate = ""> 
830										<#assign timeActFormat = ""> 
831									</#if> 
832									<#attempt>	 
833										<#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]> 
834										 
835										<#if timeActFormat?has_content && timeActFormat != ""> 
836											<#assign dataActMil = miliSeconds(timeActFormat dataAct?long)> 
837											<#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))> 
838										</#if> 
839										<#assign dataActMil = dataAct?long> 
840										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
841										<#assign isPublishedNA = (dataActMil - now ) < 0 /> 
842									<#recover> 
843									</#attempt> 
844								</#if> 
845 
846								<#assign isDespublishedNA = false> 
847								<#if (despubDateNovetatAgenda?has_content)> 
848									<#if despubTimeNovetatAgenda?has_content> 
849										<#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]> 
850										<#assign timeExpFormat = timeExpDate?string["HH:mm"]> 
851									<#else> 
852										<#assign timeExpDate = ""> 
853										<#assign timeExpFormat = ""> 
854									</#if> 
855									<#attempt> 
856										<#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]> 
857										 
858										<#if timeExpFormat?has_content && timeExpFormat != ""> 
859											<#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)> 
860											<#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))> 
861										</#if> 
862										<#assign dataExpMil = dataExp?long> 
863										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
864										<#assign isDespublishedNA = (dataExpMil - now) < 0 /> 
865									<#recover> 
866									</#attempt> 
867								</#if> 
868 
869								<#assign isExpiredNA = false> 
870								<#if journalArticle.expirationDate??> 
871									<#assign dataExp = journalArticle.expirationDate?datetime> 
872									<#attempt> 
873										<#assign dataExpMil = dataExp?long> 
874										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
875										<#assign isExpiredNA = (dataExpMil - now) < 0 /> 
876									<#recover> 
877									</#attempt> 
878								</#if> 
879 
880								<#assign showNovetatAgenda = false> 
881								<#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1"> 
882									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true"> 
883								<#else> 
884									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true"> 
885								</#if> 
886 
887								<#if showNovetatAgenda> 
888									<#if title?has_content> 
889										<li class="hola-bcn-carrusel-standard_new-li"> 
890											<a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}"> 
891												<div class="hola-bcn-carrusel-standard__card-cover"> 
892													<div class="hola-bcn-carrusel-standard__card-cover-filter"></div> 
893													<img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>> 
894													<div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>> 
895														<span><@liferay.language key='label.bloc.novetatagenda.finished' /></span> 
896													</div> 
897													<#if filterNovetatAgenda?has_content> 
898														<div class="hola-bcn-carrusel-standard-highlight"> 
899															<span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span> 
900														</div> 
901													</#if> 
902												</div> 
903												<div class="hola-bcn-carrusel-standard-container"> 
904													<div> 
905														<h3 class="hola-bcn-carrusel-standard__card-title"> 
906															${title} 
907															<#if newwindow?? && newwindow?has_content> 
908																<span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span> 
909															</#if> 
910														</h3> 
911														<span class="hola-bcn-carrusel-standard__card-description"> 
912															${subtitle} 
913														</span> 
914													</div> 
915													<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)> 
916														<div class="hola-bcn-carrusel-standard_bottom-extra"> 
917															<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content> 
918																<div class="hola-bcn-carrusel-standard-date"> 
919																	<#if fromInitDateNovetatAgenda == "true"> 
920																		<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> 
921																	<#else> 
922																		<#if initDateNovetatAgenda?has_content && !endDateNovetatAgenda?has_content> 
923																			<span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span> 
924																		<#else> 
925																			<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> 
926																		</#if> 
927																	</#if> 
928																</div> 
929															</#if> 
930															<#if whereNovetatAgenda?has_content> 
931																<div class="hola-bcn-carrusel-standard-where"> 
932																	<span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span> 
933																</div> 
934															</#if> 
935														</div> 
936													</#if> 
937												</div> 
938											</a> 
939										</li> 
940									</#if> 
941								</#if> 
942							</#if> 
943						</#list> 
944					</ul> 
945				</div> 
946			</div> 
947		</div> 
948	</section> 
949 
950	<script type="text/javascript"> 
951 
952		$(document).ready(function() { 
953			initSliderBcnStandard(); 
954		}); 
955 
956		function initSliderBcnStandard() { 
957			if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) { 
958				$(".js__hola-bcn-standard-slider").slick("unslick"); 
959
960 
961			$('.js__hola-bcn-standard-slider').slick({ 
962				slidesToShow: 3, 
963				slidesToScroll: 1, 
964				arrows: false, 
965				dots: false, 
966				draggable: false, 
967				infinite: false, 
968				responsive: [ 
969
970						breakpoint: 767, 
971						settings: { 
972							variableWidth: true, 
973							slidesToShow: 1, 
974							slidesToScroll: 1, 
975							arrows: false, 
976							dots: true, 
977							draggable: true, 
978							infinite: true 
979
980
981
982			}); 
983
984 
985	</script> 
986</#if> 
An error occurred while processing the template.
The following has evaluated to null or missing:
==> title  [in template "20155#20195#1501272" at line 634, column 202]

----
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: ${title}  [in template "20155#20195#1501272" at line 634, column 200]
----
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"  
173									<#if element.typeLink.getData() == "extern">  
174										href="${element.External_Link.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
175									<#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content>  
176										href="${element.Internal_Link.getFriendlyUrl()}" target="_self"  
177										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
178									<#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content>  
179										href="${element.External_Link.getData()}" target="_self"  
180										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
181									</#if> 
182
183								</#if> 
184									<div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>"> 
185										<#if element.typeLink.getData() == "video"> 
186											<div class="hero__media-video__container"> 
187												<span class="hero__media-video__img"> 
188												</span> 
189											</div> 
190										</#if> 
191										<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>> 
192									</div> 
193									<div class="hero__content white__banner"> 
194										<p class="hero__title" > 
195											${element.titleElem.getData()} 
196										</p> 
197										<p class="hero__desc-alt" > 
198											${element.descElem.getData()} 
199										</p> 
200									</div> 
201								</a> 
202							</div> 
203						</div> 
204					</#foreach> 
205				</#if> 
206			</div> 
207		</div> 
208	</div> 
209 
210	<div class="dialog"> 
211		<div id="carrusel-banner-video" class="u-hidden"> 
212			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
213			</div> 
214		</div> 
215	</div> 
216	<script type="text/javascript"> 
217		initSliderCarruselBanner1(); 
218 
219		function initSliderCarruselBanner1() { 
220			if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) { 
221				$(".js-carousel-banner-al_1").slick("unslick"); 
222
223			$('.js-carousel-banner-al_1 .slick-toggle-play').remove(); 
224			$('.js-carousel-banner-al_1').slick({ 
225				slidesToShow: 1, 
226				arrows: true, 
227				draggable: true, 
228				infinite: false, 
229				variableWidth: false, 
230				autoplaySpeed: 4000, 
231				dots: true, 
232				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>', 
233				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>', 
234				responsive: [ 
235
236						breakpoint: 767, 
237						settings: { 
238							slidesToShow: 1, 
239							arrows: false, 
240							variableWidth: true, 
241							dots: true 
242
243
244
245			}).each(function () { 
246				var carousel = $(this), 
247				toggleButton, 
248				toggleIcon; 
249 
250				carousel.find('.slick-next__icon').attr({ 
251					'alt': carousel.data('next-text') 
252				}); 
253 
254				carousel.find('.slick-prev__icon').attr({ 
255					'alt': carousel.data('prev-text') 
256				}); 
257			}); 
258 
259			if ($('.hero-carousel__container .hero').length == 1) { 
260				$('.hero-carousel__container .slick-toggle-play').hide(); 
261
262 
263			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
264			if($(".js-carousel-banner-al_1 .slick-dots").length > 0) { 
265				setDotsPositionBanner1(); 
266
267
268 
269		function showVideoModalBanner(link) { 
270			const start = link.indexOf("v=") + 2; 
271			const end = start + 2 + 11; 
272 
273			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-"); 
274			$('#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>'); 
275
276		function setDotsPositionBanner1() { 
277			$(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent()); 
278
279 
280		window.addEventListener('resize', function(event){ 
281			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
282			if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) { 
283				setDotsPositionBanner1(); 
284
285		});    
286 
287	</script> 
288</#if> 
289 
290 
291<#--  BASICA-TITOL-TEXT  --> 
292 
293<#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()))> 
294	<div class="full-body__container basica-titol-text"> 
295		<#foreach elem in basicaTitolText.elementsBasica.getSiblings()> 
296			<div class="basica-titol-text-wrapper"> 
297				<#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if> 
298				<#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if> 
299			</div> 
300			<#foreach subelem in elem.subelementsBasica.getSiblings()> 
301				<div class="basica-titol-text-wrapper"> 
302					<#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if> 
303					<#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if> 
304				</div> 
305			</#foreach> 
306		</#foreach> 
307	</div> 
308</#if> 
309 
310 
311<#--  bloc-detall-agenda  --> 
312 
313<#if detallAgenda?? && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))> 
314    <#assign hasElementDetallAgenda = false> 
315    <#if detallAgenda.elementsDetallAgenda??  
316          && detallAgenda.elementsDetallAgenda.getSiblings()??  
317          && (detallAgenda.elementsDetallAgenda.getSiblings()?size > 0)> 
318        <#assign firstSibling = detallAgenda.elementsDetallAgenda.getSiblings()[0]> 
319        <#if (firstSibling.titleDetallAgenda?? && firstSibling.titleDetallAgenda.getData()?has_content)  
320              || (firstSibling.contentDetallAgenda?? && firstSibling.contentDetallAgenda.getData()?has_content)> 
321            <#assign hasElementDetallAgenda = true> 
322        </#if> 
323    </#if> 
324     
325    <div class="full-body__container detall-agenda" <#if !hasElementDetallAgenda>style="margin-top:0;"</#if>> 
326		<#if detallAgenda.elementsDetallAgenda.getSiblings()??> 
327			<#assign siblings = detallAgenda.elementsDetallAgenda.getSiblings()> 
328			<#if siblings?size gt 0> 
329				<#foreach elem in siblings> 
330					<div class="detall-agenda-wrapper"> 
331						<#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content> 
332							<h2 class="">${elem.titleDetallAgenda.getData()}</h2> 
333						</#if> 
334						<#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content> 
335							<div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div> 
336						</#if> 
337					</div> 
338				</#foreach> 
339			</#if> 
340		</#if> 
341 
342         
343        <#if detallAgenda.buttonsDetallAgenda??  
344              && detallAgenda.buttonsDetallAgenda.getSiblings()??  
345              && (detallAgenda.buttonsDetallAgenda.getSiblings()?size > 0) 
346              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda??  
347              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda.getData()?has_content> 
348            <div class="detall-agenda-buttons-wrapper"> 
349                <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()> 
350                    <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>"  
351                       type="button"  
352                       class="button button--a"  
353                       <#if subelem.linkTypeDetallAgenda.getData() == "extern"  
354                             && subelem.External_LinkDetallAgenda??  
355                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
356                           href="${subelem.External_LinkDetallAgenda.getData()}"  
357                           rel="external"  
358                           target="_blank"  
359                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
360                             && subelem.Internal_LinkDetallAgenda??  
361                             && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content>  
362                           href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}"  
363                           target="_self"   
364                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
365                             && subelem.External_LinkDetallAgenda??  
366                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
367                           href="${subelem.External_LinkDetallAgenda.getData()}"  
368                           target="_self"  
369                       </#if>> 
370                        <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span> 
371                    </a> 
372                </#foreach> 
373            </div> 
374        </#if> 
375    </div> 
376</#if> 
377 
378 
379 
380 
381<#--  DT_PP_TITULO_VIDEO  --> 
382 
383<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))> 
384	<style> 
385		.points-video__video-cover.no_video::after{ 
386			background: none; 
387
388	</style> 
389	<#assign hasLink = false> 
390	<#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content> 
391		<#assign hasLink = true> 
392	</#if> 
393	<section class="points-video bg-gray pt-56"> 
394		<div class="main__container"> 
395			<div class="full-body"> 
396				<div class="full-body__container points-video__header-extra-container"> 
397					<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content> 
398						<a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}"> 
399						</a> 
400					</#if> 
401					<#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content> 
402						<div class="points-video__header"> 
403							<div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>> 
404								<h2 class="points-video__title"> 
405								${stPpVideo.titol.getData()}</h2> 
406								<#if hasLink> 
407									<a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
408								</#if> 
409							</div> 
410							<p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>> 
411							${stPpVideo.descriptiu.getData()}</p> 
412						</div> 
413					</#if> 
414					 
415					<div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies"> 
416						<#if stPpVideo.linkFieldSet.link.getData()?has_content> 
417							<#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2> 
418							<#--13 because v= + 11 char for youtube ids 
419							--> 
420							<#assign end = start + 11> 
421							<a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}" 
422								rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}"> 
423								<div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
424									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
425								</div> 
426								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
427									<p class="points-video__caption"> 
428									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
429								</#if> 
430							</a> 
431						<#else> 
432							<a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"> 
433								<div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
434									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
435								</div> 
436								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
437									<p class="points-video__caption"> 
438									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
439								</#if> 
440							</a> 
441							 
442						</#if> 
443					</div> 
444					<div class='cookieconsent-optout-marketing media-unit__content'> 
445						<@liferay.language key="cookiebot.youtube.no-marketing"/> 
446					</div> 
447					<#if hasLink> 
448						<a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
449					</#if> 
450				</div> 
451			</div> 
452		</div> 
453	</section> 
454	<section class="video-dialog js__video-dialog u-hidden <#if stPpVideo.linkFieldSet.link?? && stPpVideo.linkFieldSet.link.getData()?has_content>${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}</#if>"> 
455		<div class="u-hidden" id="fragment-show-video"> 
456			<div class="video-dialog__panel"> 
457				<header class="video-dialog__header"> 
458					<button class="video-dialog__close js__video-dialog-close"> 
459					Cerrar</button> 
460				</header> 
461				<div class="video-dialog__content"> 
462					<div class="video-dialog__inner js__video-dialog-container"> 
463						<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=""> 
464						</iframe> 
465					</div> 
466				</div> 
467			</div> 
468		</div> 
469		<div class="video-dialog__overlay js__video-dialog-close"> 
470		</div> 
471	</section> 
472</#if> 
473 
474 
475<#--  TEXT-CARRUSEL-IMATGES-ALT  --> 
476 
477<#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()))> 
478	<#assign imagesFolder = themeDisplay.getPathThemeImages()> 
479 
480	<#assign entriesMapList = []> 
481	<#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()> 
482		<#if elem.elementsFieldSetFieldSetAlt.order?has_content> 
483			<#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()> 
484		</#if> 
485		<#if !currentOrder?has_content || currentOrder == "null"> 
486			<#assign currentOrder = "99"> 
487		</#if> 
488		<#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}> 
489		<#assign entriesMapList = entriesMapList + [currEntryMap]> 
490	</#foreach> 
491 
492	<#assign sortedEntriesMapList = entriesMapList?sort_by("order")> 
493	<#assign sortedEntriesRootElems = []> 
494 
495	<#foreach currEntryMap in sortedEntriesMapList> 
496		<#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]> 
497	</#foreach> 
498 
499	<#assign leftContent = ""> 
500	<#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content> 
501		<#assign leftContent = "true"> 
502	</#if> 
503 
504	<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>"> 
505		<#if leftContent?has_content> 
506			<div class="hero-carousel__container-banner"> 
507				<h2 class="hero-carousel-banner-alt-title"> 
508					${textCarruselImatges2.titleHeaderAlt.getData()} 
509				</h2> 
510				<p class="hero-carousel-banner-alt-desc"> 
511					${textCarruselImatges2.descHeaderAlt.getData()} 
512				</p> 
513			</div> 
514		</#if> 
515		<div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable"> 
516			<div class="hero-carousel__container js-carousel-banner-al_alt is-playing" 
517				data-prev-text='<@liferay.language key="label.carousel.prev"/>' 
518				data-next-text='<@liferay.language key="label.carousel.next"/>' 
519				data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>' 
520				data-stop-text='<@liferay.language key="label.carousel.pause"/>' 
521				data-play-text='<@liferay.language key="label.carousel.start"/>'> 
522				<#if sortedEntriesRootElems?has_content>				 
523					<#foreach element in sortedEntriesRootElems> 
524						<div class="hero hero--super"> 
525							<div class="hero__container"> 
526								<#if element.typeLinkAlt.getData() == "video"> 
527									<a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link"  
528										<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content> 
529											title="${element.titleLinkAlt.getData()}" 
530										</#if> 
531
532								<#else> 
533									<a class="hero__link"  
534										<#if element.typeLinkAlt.getData() == "extern">  
535											href="${element.External_LinkAlt.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
536										<#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_LinkAlt?? && element.Internal_LinkAlt.getFriendlyUrl()?has_content>  
537											href="${element.Internal_LinkAlt.getFriendlyUrl()}" target="_self"  
538											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
539										<#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content>  
540											href="${element.External_LinkAlt.getData()}" target="_self"  
541											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
542										</#if> 
543
544								</#if> 
545									<div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>"> 
546										<#if element.typeLinkAlt.getData() == "video"> 
547											<div class="hero__media-video__container"> 
548												<span class="hero__media-video__img"> 
549												</span> 
550											</div> 
551										</#if> 
552										<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>> 
553									</div> 
554									<div class="hero__content white__banner"> 
555										<p class="hero__title" > 
556											${element.titleElemAlt.getData()} 
557										</p> 
558										<p class="hero__desc-alt" > 
559											${element.descElemAlt.getData()} 
560										</p> 
561									</div> 
562								</a> 
563							</div> 
564						</div> 
565					</#foreach> 
566				</#if> 
567			</div> 
568		</div> 
569	</div> 
570 
571	<div class="dialog"> 
572		<div id="carrusel-banner-video" class="u-hidden"> 
573			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
574			</div> 
575		</div> 
576	</div> 
577	<script type="text/javascript"> 
578		initSliderCarruselBanner2(); 
579 
580		function initSliderCarruselBanner2() { 
581			if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) { 
582				$(".js-carousel-banner-al_alt").slick("unslick"); 
583
584			$('.js-carousel-banner-al_alt .slick-toggle-play').remove(); 
585			$('.js-carousel-banner-al_alt').slick({ 
586				slidesToShow: 1, 
587				arrows: true, 
588				draggable: true, 
589				infinite: false, 
590				variableWidth: false, 
591				autoplaySpeed: 4000, 
592				dots: true, 
593				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>', 
594				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>', 
595				responsive: [ 
596
597						breakpoint: 767, 
598						settings: { 
599							slidesToShow: 1, 
600							arrows: false, 
601							variableWidth: true, 
602							dots: true 
603
604
605
606			}).each(function () { 
607				var carousel = $(this), 
608				toggleButton, 
609				toggleIcon; 
610 
611				carousel.find('.slick-next__icon').attr({ 
612					'alt': carousel.data('next-text') 
613				}); 
614 
615				carousel.find('.slick-prev__icon').attr({ 
616					'alt': carousel.data('prev-text') 
617				}); 
618			}); 
619 
620			if ($('.hero-carousel__container .hero').length == 1) { 
621				$('.hero-carousel__container .slick-toggle-play').hide(); 
622
623 
624			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
625			if($(".js-carousel-banner-al_alt .slick-dots").length > 0) { 
626				setDotsPositionBanner2(); 
627
628
629 
630		function showVideoModalBanner2(link) { 
631			const start = link.indexOf("v=") + 2; 
632			const end = start + 2 + 11; 
633 
634			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-${title}"); 
635			$('#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>'); 
636
637		function setDotsPositionBanner2() { 
638			$(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent()); 
639
640 
641		window.addEventListener('resize', function(event){ 
642			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
643			if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) { 
644				setDotsPositionBanner2(); 
645
646		});    
647 
648	</script> 
649</#if> 
650 
651 
652<#--  CARRUSEL-TRES-CARD  --> 
653 
654<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))> 
655	<#assign colorClass = "" /> 
656	<#assign fullBody = "" /> 
657	<#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??> 
658		<#if fondoColorCarruselCards.getData()=="blanc"> 
659			<#assign colorClass = "hola-bcn-carrusel-standard--white" /> 
660			<#assign fullBody = "full-body__container" /> 
661		<#else> 
662			<#assign colorClass = "hola-bcn-carrusel-standard--gray" /> 
663			<#assign fullBody = "full-body__container" /> 
664		</#if> 
665	</#if> 
666 
667	<section class="hola-bcn-carrusel-standard ${colorClass}"> 
668		<div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}"> 
669			<div class="hola-bcn-carrusel-standard--container"> 
670				<div class="hola-bcn-carrusel-standard--outer"> 
671						<div class="hola-bcn-carrusel-standard_new-header"> 
672							<h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new"> 
673							<#if titleCarruselCards?? && titleCarruselCards.getData()?has_content> 
674                ${titleCarruselCards.getData()} 
675              <#else> 
676                <@liferay.language key="title.carrusel.cards.default" /> 
677              </#if> 
678							</h2> 
679							<p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p> 
680						</div> 
681					<ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider"> 
682						<#assign tmbGroupId = 20182> 
683						<#assign fundacioGroupId = 79790> 
684						<#list referencesFieldSet.getSiblings() as element> 
685							<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
686							<#assign articleId = element.referenceId.getData()> 
687							<#assign groupId = getterUtil.getLong(groupId)> 
688							<#attempt> 
689								<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) /> 
690							<#recover> 
691								<#if groupId == tmbGroupId> 
692									<#assign groupId = fundacioGroupId> 
693								<#else> 
694									<#assign groupId = tmbGroupId> 
695								</#if> 
696								<#attempt> 
697									<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!> 
698								<#recover> 
699									<#assign journalArticle = ""> 
700								</#attempt> 
701							</#attempt> 
702							<#if journalArticle?has_content && journalArticle != ""> 
703								<#assign document = saxReaderUtil.read(journalArticle.getContent())> 
704								<#assign rootElement = document.getRootElement()> 
705 
706								<#assign resourceprimKey = journalArticle.getResourcePrimKey()> 
707								<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)> 
708								<#assign assetRenderer = assetEntry.getAssetRenderer()> 
709								<#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")> 
710								<#assign articleFriendlyURL = assetRenderer.getUrlTitle()> 
711								<#assign newwindow = ""> 
712								<#if !articleURL?has_content> 
713									<#assign newwindow = "target='_blank'"> 
714									<#if !isFundacio> 
715										<#if currentURL?contains("pre3")> 
716											<#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
717										<#else> 
718											<#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
719										</#if> 
720									<#else> 
721										<#if currentURL?contains("pre3")> 
722											<#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
723										<#else> 
724											<#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
725										</#if> 
726									</#if> 
727								</#if> 
728 
729								<#assign title = ""> 
730								<#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
731								<#if titleSel.selectSingleNode(rootElement)?has_content> 
732									<#assign title = titleSel.selectSingleNode(rootElement).getStringValue()> 
733								</#if> 
734								 
735								<#assign subtitle = ""> 
736								<#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
737								<#if subtitleSel.selectSingleNode(rootElement)?has_content> 
738									<#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()> 
739								</#if> 
740 
741								<#assign initDateNovetatAgenda = ""> 
742								<#assign fromInitDateNovetatAgenda = ""> 
743								<#assign endDateNovetatAgenda = ""> 
744								<#assign whereNovetatAgenda = ""> 
745								<#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!""> 
746								<#if novetatAgendaSel?has_content> 
747									<#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!""> 
748 
749									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
750										<#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
751									</#if> 
752 
753									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
754										<#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
755									</#if> 
756 
757									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
758										<#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
759									</#if> 
760 
761									<#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!""> 
762									<#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
763										<#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
764									</#if> 
765								</#if> 
766 
767								<#assign typeNovetatAgenda = ""> 
768								<#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
769								<#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
770									<#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
771								</#if> 
772 
773								<#assign filterNovetatAgenda = ""> 
774								<#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
775								<#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
776									<#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
777								</#if> 
778								 
779								<#assign imageNovetatAgenda = ""> 
780								<#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
781								<#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
782									<#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
783									<#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!""> 
784									<#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid> 
785								</#if> 
786 
787								<#assign imageAltNovetatAgenda = ""> 
788								<#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
789								<#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
790									<#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
791								</#if> 
792 
793								<#assign pubDateNovetatAgenda = ""> 
794								<#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
795								<#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
796									<#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
797								</#if> 
798 
799								<#assign pubTimeNovetatAgenda = ""> 
800								<#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
801								<#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
802									<#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
803								</#if> 
804 
805								<#assign despubDateNovetatAgenda = ""> 
806								<#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
807								<#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
808									<#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
809								</#if> 
810 
811								<#assign despubTimeNovetatAgenda = ""> 
812								<#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
813								<#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
814									<#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
815								</#if> 
816 
817								<#assign isExpiredNovetatAgenda = ""> 
818								<#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
819								<#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
820									<#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
821								</#if> 
822 
823								<#assign isPublishedNA = false> 
824								<#if (pubDateNovetatAgenda?has_content)> 
825									<#if pubTimeNovetatAgenda?has_content> 
826										<#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]> 
827										<#assign timeActFormat = timeActDate?string["HH:mm"]> 
828									<#else> 
829										<#assign timeActDate = ""> 
830										<#assign timeActFormat = ""> 
831									</#if> 
832									<#attempt>	 
833										<#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]> 
834										 
835										<#if timeActFormat?has_content && timeActFormat != ""> 
836											<#assign dataActMil = miliSeconds(timeActFormat dataAct?long)> 
837											<#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))> 
838										</#if> 
839										<#assign dataActMil = dataAct?long> 
840										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
841										<#assign isPublishedNA = (dataActMil - now ) < 0 /> 
842									<#recover> 
843									</#attempt> 
844								</#if> 
845 
846								<#assign isDespublishedNA = false> 
847								<#if (despubDateNovetatAgenda?has_content)> 
848									<#if despubTimeNovetatAgenda?has_content> 
849										<#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]> 
850										<#assign timeExpFormat = timeExpDate?string["HH:mm"]> 
851									<#else> 
852										<#assign timeExpDate = ""> 
853										<#assign timeExpFormat = ""> 
854									</#if> 
855									<#attempt> 
856										<#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]> 
857										 
858										<#if timeExpFormat?has_content && timeExpFormat != ""> 
859											<#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)> 
860											<#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))> 
861										</#if> 
862										<#assign dataExpMil = dataExp?long> 
863										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
864										<#assign isDespublishedNA = (dataExpMil - now) < 0 /> 
865									<#recover> 
866									</#attempt> 
867								</#if> 
868 
869								<#assign isExpiredNA = false> 
870								<#if journalArticle.expirationDate??> 
871									<#assign dataExp = journalArticle.expirationDate?datetime> 
872									<#attempt> 
873										<#assign dataExpMil = dataExp?long> 
874										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
875										<#assign isExpiredNA = (dataExpMil - now) < 0 /> 
876									<#recover> 
877									</#attempt> 
878								</#if> 
879 
880								<#assign showNovetatAgenda = false> 
881								<#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1"> 
882									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true"> 
883								<#else> 
884									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true"> 
885								</#if> 
886 
887								<#if showNovetatAgenda> 
888									<#if title?has_content> 
889										<li class="hola-bcn-carrusel-standard_new-li"> 
890											<a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}"> 
891												<div class="hola-bcn-carrusel-standard__card-cover"> 
892													<div class="hola-bcn-carrusel-standard__card-cover-filter"></div> 
893													<img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>> 
894													<div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>> 
895														<span><@liferay.language key='label.bloc.novetatagenda.finished' /></span> 
896													</div> 
897													<#if filterNovetatAgenda?has_content> 
898														<div class="hola-bcn-carrusel-standard-highlight"> 
899															<span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span> 
900														</div> 
901													</#if> 
902												</div> 
903												<div class="hola-bcn-carrusel-standard-container"> 
904													<div> 
905														<h3 class="hola-bcn-carrusel-standard__card-title"> 
906															${title} 
907															<#if newwindow?? && newwindow?has_content> 
908																<span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span> 
909															</#if> 
910														</h3> 
911														<span class="hola-bcn-carrusel-standard__card-description"> 
912															${subtitle} 
913														</span> 
914													</div> 
915													<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)> 
916														<div class="hola-bcn-carrusel-standard_bottom-extra"> 
917															<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content> 
918																<div class="hola-bcn-carrusel-standard-date"> 
919																	<#if fromInitDateNovetatAgenda == "true"> 
920																		<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> 
921																	<#else> 
922																		<#if initDateNovetatAgenda?has_content && !endDateNovetatAgenda?has_content> 
923																			<span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span> 
924																		<#else> 
925																			<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> 
926																		</#if> 
927																	</#if> 
928																</div> 
929															</#if> 
930															<#if whereNovetatAgenda?has_content> 
931																<div class="hola-bcn-carrusel-standard-where"> 
932																	<span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span> 
933																</div> 
934															</#if> 
935														</div> 
936													</#if> 
937												</div> 
938											</a> 
939										</li> 
940									</#if> 
941								</#if> 
942							</#if> 
943						</#list> 
944					</ul> 
945				</div> 
946			</div> 
947		</div> 
948	</section> 
949 
950	<script type="text/javascript"> 
951 
952		$(document).ready(function() { 
953			initSliderBcnStandard(); 
954		}); 
955 
956		function initSliderBcnStandard() { 
957			if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) { 
958				$(".js__hola-bcn-standard-slider").slick("unslick"); 
959
960 
961			$('.js__hola-bcn-standard-slider').slick({ 
962				slidesToShow: 3, 
963				slidesToScroll: 1, 
964				arrows: false, 
965				dots: false, 
966				draggable: false, 
967				infinite: false, 
968				responsive: [ 
969
970						breakpoint: 767, 
971						settings: { 
972							variableWidth: true, 
973							slidesToShow: 1, 
974							slidesToScroll: 1, 
975							arrows: false, 
976							dots: true, 
977							draggable: true, 
978							infinite: true 
979
980
981
982			}); 
983
984 
985	</script> 
986</#if> 
An error occurred while processing the template.
The following has evaluated to null or missing:
==> title  [in template "20155#20195#1501272" at line 634, column 202]

----
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: ${title}  [in template "20155#20195#1501272" at line 634, column 200]
----
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"  
173									<#if element.typeLink.getData() == "extern">  
174										href="${element.External_Link.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
175									<#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content>  
176										href="${element.Internal_Link.getFriendlyUrl()}" target="_self"  
177										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
178									<#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content>  
179										href="${element.External_Link.getData()}" target="_self"  
180										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
181									</#if> 
182
183								</#if> 
184									<div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>"> 
185										<#if element.typeLink.getData() == "video"> 
186											<div class="hero__media-video__container"> 
187												<span class="hero__media-video__img"> 
188												</span> 
189											</div> 
190										</#if> 
191										<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>> 
192									</div> 
193									<div class="hero__content white__banner"> 
194										<p class="hero__title" > 
195											${element.titleElem.getData()} 
196										</p> 
197										<p class="hero__desc-alt" > 
198											${element.descElem.getData()} 
199										</p> 
200									</div> 
201								</a> 
202							</div> 
203						</div> 
204					</#foreach> 
205				</#if> 
206			</div> 
207		</div> 
208	</div> 
209 
210	<div class="dialog"> 
211		<div id="carrusel-banner-video" class="u-hidden"> 
212			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
213			</div> 
214		</div> 
215	</div> 
216	<script type="text/javascript"> 
217		initSliderCarruselBanner1(); 
218 
219		function initSliderCarruselBanner1() { 
220			if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) { 
221				$(".js-carousel-banner-al_1").slick("unslick"); 
222
223			$('.js-carousel-banner-al_1 .slick-toggle-play').remove(); 
224			$('.js-carousel-banner-al_1').slick({ 
225				slidesToShow: 1, 
226				arrows: true, 
227				draggable: true, 
228				infinite: false, 
229				variableWidth: false, 
230				autoplaySpeed: 4000, 
231				dots: true, 
232				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>', 
233				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>', 
234				responsive: [ 
235
236						breakpoint: 767, 
237						settings: { 
238							slidesToShow: 1, 
239							arrows: false, 
240							variableWidth: true, 
241							dots: true 
242
243
244
245			}).each(function () { 
246				var carousel = $(this), 
247				toggleButton, 
248				toggleIcon; 
249 
250				carousel.find('.slick-next__icon').attr({ 
251					'alt': carousel.data('next-text') 
252				}); 
253 
254				carousel.find('.slick-prev__icon').attr({ 
255					'alt': carousel.data('prev-text') 
256				}); 
257			}); 
258 
259			if ($('.hero-carousel__container .hero').length == 1) { 
260				$('.hero-carousel__container .slick-toggle-play').hide(); 
261
262 
263			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
264			if($(".js-carousel-banner-al_1 .slick-dots").length > 0) { 
265				setDotsPositionBanner1(); 
266
267
268 
269		function showVideoModalBanner(link) { 
270			const start = link.indexOf("v=") + 2; 
271			const end = start + 2 + 11; 
272 
273			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-"); 
274			$('#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>'); 
275
276		function setDotsPositionBanner1() { 
277			$(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent()); 
278
279 
280		window.addEventListener('resize', function(event){ 
281			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
282			if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) { 
283				setDotsPositionBanner1(); 
284
285		});    
286 
287	</script> 
288</#if> 
289 
290 
291<#--  BASICA-TITOL-TEXT  --> 
292 
293<#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()))> 
294	<div class="full-body__container basica-titol-text"> 
295		<#foreach elem in basicaTitolText.elementsBasica.getSiblings()> 
296			<div class="basica-titol-text-wrapper"> 
297				<#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if> 
298				<#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if> 
299			</div> 
300			<#foreach subelem in elem.subelementsBasica.getSiblings()> 
301				<div class="basica-titol-text-wrapper"> 
302					<#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if> 
303					<#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if> 
304				</div> 
305			</#foreach> 
306		</#foreach> 
307	</div> 
308</#if> 
309 
310 
311<#--  bloc-detall-agenda  --> 
312 
313<#if detallAgenda?? && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))> 
314    <#assign hasElementDetallAgenda = false> 
315    <#if detallAgenda.elementsDetallAgenda??  
316          && detallAgenda.elementsDetallAgenda.getSiblings()??  
317          && (detallAgenda.elementsDetallAgenda.getSiblings()?size > 0)> 
318        <#assign firstSibling = detallAgenda.elementsDetallAgenda.getSiblings()[0]> 
319        <#if (firstSibling.titleDetallAgenda?? && firstSibling.titleDetallAgenda.getData()?has_content)  
320              || (firstSibling.contentDetallAgenda?? && firstSibling.contentDetallAgenda.getData()?has_content)> 
321            <#assign hasElementDetallAgenda = true> 
322        </#if> 
323    </#if> 
324     
325    <div class="full-body__container detall-agenda" <#if !hasElementDetallAgenda>style="margin-top:0;"</#if>> 
326		<#if detallAgenda.elementsDetallAgenda.getSiblings()??> 
327			<#assign siblings = detallAgenda.elementsDetallAgenda.getSiblings()> 
328			<#if siblings?size gt 0> 
329				<#foreach elem in siblings> 
330					<div class="detall-agenda-wrapper"> 
331						<#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content> 
332							<h2 class="">${elem.titleDetallAgenda.getData()}</h2> 
333						</#if> 
334						<#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content> 
335							<div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div> 
336						</#if> 
337					</div> 
338				</#foreach> 
339			</#if> 
340		</#if> 
341 
342         
343        <#if detallAgenda.buttonsDetallAgenda??  
344              && detallAgenda.buttonsDetallAgenda.getSiblings()??  
345              && (detallAgenda.buttonsDetallAgenda.getSiblings()?size > 0) 
346              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda??  
347              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda.getData()?has_content> 
348            <div class="detall-agenda-buttons-wrapper"> 
349                <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()> 
350                    <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>"  
351                       type="button"  
352                       class="button button--a"  
353                       <#if subelem.linkTypeDetallAgenda.getData() == "extern"  
354                             && subelem.External_LinkDetallAgenda??  
355                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
356                           href="${subelem.External_LinkDetallAgenda.getData()}"  
357                           rel="external"  
358                           target="_blank"  
359                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
360                             && subelem.Internal_LinkDetallAgenda??  
361                             && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content>  
362                           href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}"  
363                           target="_self"   
364                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
365                             && subelem.External_LinkDetallAgenda??  
366                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
367                           href="${subelem.External_LinkDetallAgenda.getData()}"  
368                           target="_self"  
369                       </#if>> 
370                        <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span> 
371                    </a> 
372                </#foreach> 
373            </div> 
374        </#if> 
375    </div> 
376</#if> 
377 
378 
379 
380 
381<#--  DT_PP_TITULO_VIDEO  --> 
382 
383<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))> 
384	<style> 
385		.points-video__video-cover.no_video::after{ 
386			background: none; 
387
388	</style> 
389	<#assign hasLink = false> 
390	<#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content> 
391		<#assign hasLink = true> 
392	</#if> 
393	<section class="points-video bg-gray pt-56"> 
394		<div class="main__container"> 
395			<div class="full-body"> 
396				<div class="full-body__container points-video__header-extra-container"> 
397					<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content> 
398						<a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}"> 
399						</a> 
400					</#if> 
401					<#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content> 
402						<div class="points-video__header"> 
403							<div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>> 
404								<h2 class="points-video__title"> 
405								${stPpVideo.titol.getData()}</h2> 
406								<#if hasLink> 
407									<a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
408								</#if> 
409							</div> 
410							<p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>> 
411							${stPpVideo.descriptiu.getData()}</p> 
412						</div> 
413					</#if> 
414					 
415					<div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies"> 
416						<#if stPpVideo.linkFieldSet.link.getData()?has_content> 
417							<#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2> 
418							<#--13 because v= + 11 char for youtube ids 
419							--> 
420							<#assign end = start + 11> 
421							<a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}" 
422								rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}"> 
423								<div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
424									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
425								</div> 
426								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
427									<p class="points-video__caption"> 
428									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
429								</#if> 
430							</a> 
431						<#else> 
432							<a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"> 
433								<div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
434									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
435								</div> 
436								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
437									<p class="points-video__caption"> 
438									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
439								</#if> 
440							</a> 
441							 
442						</#if> 
443					</div> 
444					<div class='cookieconsent-optout-marketing media-unit__content'> 
445						<@liferay.language key="cookiebot.youtube.no-marketing"/> 
446					</div> 
447					<#if hasLink> 
448						<a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
449					</#if> 
450				</div> 
451			</div> 
452		</div> 
453	</section> 
454	<section class="video-dialog js__video-dialog u-hidden <#if stPpVideo.linkFieldSet.link?? && stPpVideo.linkFieldSet.link.getData()?has_content>${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}</#if>"> 
455		<div class="u-hidden" id="fragment-show-video"> 
456			<div class="video-dialog__panel"> 
457				<header class="video-dialog__header"> 
458					<button class="video-dialog__close js__video-dialog-close"> 
459					Cerrar</button> 
460				</header> 
461				<div class="video-dialog__content"> 
462					<div class="video-dialog__inner js__video-dialog-container"> 
463						<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=""> 
464						</iframe> 
465					</div> 
466				</div> 
467			</div> 
468		</div> 
469		<div class="video-dialog__overlay js__video-dialog-close"> 
470		</div> 
471	</section> 
472</#if> 
473 
474 
475<#--  TEXT-CARRUSEL-IMATGES-ALT  --> 
476 
477<#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()))> 
478	<#assign imagesFolder = themeDisplay.getPathThemeImages()> 
479 
480	<#assign entriesMapList = []> 
481	<#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()> 
482		<#if elem.elementsFieldSetFieldSetAlt.order?has_content> 
483			<#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()> 
484		</#if> 
485		<#if !currentOrder?has_content || currentOrder == "null"> 
486			<#assign currentOrder = "99"> 
487		</#if> 
488		<#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}> 
489		<#assign entriesMapList = entriesMapList + [currEntryMap]> 
490	</#foreach> 
491 
492	<#assign sortedEntriesMapList = entriesMapList?sort_by("order")> 
493	<#assign sortedEntriesRootElems = []> 
494 
495	<#foreach currEntryMap in sortedEntriesMapList> 
496		<#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]> 
497	</#foreach> 
498 
499	<#assign leftContent = ""> 
500	<#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content> 
501		<#assign leftContent = "true"> 
502	</#if> 
503 
504	<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>"> 
505		<#if leftContent?has_content> 
506			<div class="hero-carousel__container-banner"> 
507				<h2 class="hero-carousel-banner-alt-title"> 
508					${textCarruselImatges2.titleHeaderAlt.getData()} 
509				</h2> 
510				<p class="hero-carousel-banner-alt-desc"> 
511					${textCarruselImatges2.descHeaderAlt.getData()} 
512				</p> 
513			</div> 
514		</#if> 
515		<div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable"> 
516			<div class="hero-carousel__container js-carousel-banner-al_alt is-playing" 
517				data-prev-text='<@liferay.language key="label.carousel.prev"/>' 
518				data-next-text='<@liferay.language key="label.carousel.next"/>' 
519				data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>' 
520				data-stop-text='<@liferay.language key="label.carousel.pause"/>' 
521				data-play-text='<@liferay.language key="label.carousel.start"/>'> 
522				<#if sortedEntriesRootElems?has_content>				 
523					<#foreach element in sortedEntriesRootElems> 
524						<div class="hero hero--super"> 
525							<div class="hero__container"> 
526								<#if element.typeLinkAlt.getData() == "video"> 
527									<a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link"  
528										<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content> 
529											title="${element.titleLinkAlt.getData()}" 
530										</#if> 
531
532								<#else> 
533									<a class="hero__link"  
534										<#if element.typeLinkAlt.getData() == "extern">  
535											href="${element.External_LinkAlt.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
536										<#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_LinkAlt?? && element.Internal_LinkAlt.getFriendlyUrl()?has_content>  
537											href="${element.Internal_LinkAlt.getFriendlyUrl()}" target="_self"  
538											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
539										<#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content>  
540											href="${element.External_LinkAlt.getData()}" target="_self"  
541											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
542										</#if> 
543
544								</#if> 
545									<div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>"> 
546										<#if element.typeLinkAlt.getData() == "video"> 
547											<div class="hero__media-video__container"> 
548												<span class="hero__media-video__img"> 
549												</span> 
550											</div> 
551										</#if> 
552										<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>> 
553									</div> 
554									<div class="hero__content white__banner"> 
555										<p class="hero__title" > 
556											${element.titleElemAlt.getData()} 
557										</p> 
558										<p class="hero__desc-alt" > 
559											${element.descElemAlt.getData()} 
560										</p> 
561									</div> 
562								</a> 
563							</div> 
564						</div> 
565					</#foreach> 
566				</#if> 
567			</div> 
568		</div> 
569	</div> 
570 
571	<div class="dialog"> 
572		<div id="carrusel-banner-video" class="u-hidden"> 
573			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
574			</div> 
575		</div> 
576	</div> 
577	<script type="text/javascript"> 
578		initSliderCarruselBanner2(); 
579 
580		function initSliderCarruselBanner2() { 
581			if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) { 
582				$(".js-carousel-banner-al_alt").slick("unslick"); 
583
584			$('.js-carousel-banner-al_alt .slick-toggle-play').remove(); 
585			$('.js-carousel-banner-al_alt').slick({ 
586				slidesToShow: 1, 
587				arrows: true, 
588				draggable: true, 
589				infinite: false, 
590				variableWidth: false, 
591				autoplaySpeed: 4000, 
592				dots: true, 
593				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>', 
594				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>', 
595				responsive: [ 
596
597						breakpoint: 767, 
598						settings: { 
599							slidesToShow: 1, 
600							arrows: false, 
601							variableWidth: true, 
602							dots: true 
603
604
605
606			}).each(function () { 
607				var carousel = $(this), 
608				toggleButton, 
609				toggleIcon; 
610 
611				carousel.find('.slick-next__icon').attr({ 
612					'alt': carousel.data('next-text') 
613				}); 
614 
615				carousel.find('.slick-prev__icon').attr({ 
616					'alt': carousel.data('prev-text') 
617				}); 
618			}); 
619 
620			if ($('.hero-carousel__container .hero').length == 1) { 
621				$('.hero-carousel__container .slick-toggle-play').hide(); 
622
623 
624			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
625			if($(".js-carousel-banner-al_alt .slick-dots").length > 0) { 
626				setDotsPositionBanner2(); 
627
628
629 
630		function showVideoModalBanner2(link) { 
631			const start = link.indexOf("v=") + 2; 
632			const end = start + 2 + 11; 
633 
634			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-${title}"); 
635			$('#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>'); 
636
637		function setDotsPositionBanner2() { 
638			$(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent()); 
639
640 
641		window.addEventListener('resize', function(event){ 
642			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
643			if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) { 
644				setDotsPositionBanner2(); 
645
646		});    
647 
648	</script> 
649</#if> 
650 
651 
652<#--  CARRUSEL-TRES-CARD  --> 
653 
654<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))> 
655	<#assign colorClass = "" /> 
656	<#assign fullBody = "" /> 
657	<#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??> 
658		<#if fondoColorCarruselCards.getData()=="blanc"> 
659			<#assign colorClass = "hola-bcn-carrusel-standard--white" /> 
660			<#assign fullBody = "full-body__container" /> 
661		<#else> 
662			<#assign colorClass = "hola-bcn-carrusel-standard--gray" /> 
663			<#assign fullBody = "full-body__container" /> 
664		</#if> 
665	</#if> 
666 
667	<section class="hola-bcn-carrusel-standard ${colorClass}"> 
668		<div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}"> 
669			<div class="hola-bcn-carrusel-standard--container"> 
670				<div class="hola-bcn-carrusel-standard--outer"> 
671						<div class="hola-bcn-carrusel-standard_new-header"> 
672							<h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new"> 
673							<#if titleCarruselCards?? && titleCarruselCards.getData()?has_content> 
674                ${titleCarruselCards.getData()} 
675              <#else> 
676                <@liferay.language key="title.carrusel.cards.default" /> 
677              </#if> 
678							</h2> 
679							<p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p> 
680						</div> 
681					<ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider"> 
682						<#assign tmbGroupId = 20182> 
683						<#assign fundacioGroupId = 79790> 
684						<#list referencesFieldSet.getSiblings() as element> 
685							<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
686							<#assign articleId = element.referenceId.getData()> 
687							<#assign groupId = getterUtil.getLong(groupId)> 
688							<#attempt> 
689								<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) /> 
690							<#recover> 
691								<#if groupId == tmbGroupId> 
692									<#assign groupId = fundacioGroupId> 
693								<#else> 
694									<#assign groupId = tmbGroupId> 
695								</#if> 
696								<#attempt> 
697									<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!> 
698								<#recover> 
699									<#assign journalArticle = ""> 
700								</#attempt> 
701							</#attempt> 
702							<#if journalArticle?has_content && journalArticle != ""> 
703								<#assign document = saxReaderUtil.read(journalArticle.getContent())> 
704								<#assign rootElement = document.getRootElement()> 
705 
706								<#assign resourceprimKey = journalArticle.getResourcePrimKey()> 
707								<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)> 
708								<#assign assetRenderer = assetEntry.getAssetRenderer()> 
709								<#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")> 
710								<#assign articleFriendlyURL = assetRenderer.getUrlTitle()> 
711								<#assign newwindow = ""> 
712								<#if !articleURL?has_content> 
713									<#assign newwindow = "target='_blank'"> 
714									<#if !isFundacio> 
715										<#if currentURL?contains("pre3")> 
716											<#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
717										<#else> 
718											<#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
719										</#if> 
720									<#else> 
721										<#if currentURL?contains("pre3")> 
722											<#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
723										<#else> 
724											<#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
725										</#if> 
726									</#if> 
727								</#if> 
728 
729								<#assign title = ""> 
730								<#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
731								<#if titleSel.selectSingleNode(rootElement)?has_content> 
732									<#assign title = titleSel.selectSingleNode(rootElement).getStringValue()> 
733								</#if> 
734								 
735								<#assign subtitle = ""> 
736								<#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
737								<#if subtitleSel.selectSingleNode(rootElement)?has_content> 
738									<#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()> 
739								</#if> 
740 
741								<#assign initDateNovetatAgenda = ""> 
742								<#assign fromInitDateNovetatAgenda = ""> 
743								<#assign endDateNovetatAgenda = ""> 
744								<#assign whereNovetatAgenda = ""> 
745								<#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!""> 
746								<#if novetatAgendaSel?has_content> 
747									<#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!""> 
748 
749									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
750										<#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
751									</#if> 
752 
753									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
754										<#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
755									</#if> 
756 
757									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
758										<#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
759									</#if> 
760 
761									<#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!""> 
762									<#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
763										<#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
764									</#if> 
765								</#if> 
766 
767								<#assign typeNovetatAgenda = ""> 
768								<#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
769								<#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
770									<#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
771								</#if> 
772 
773								<#assign filterNovetatAgenda = ""> 
774								<#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
775								<#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
776									<#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
777								</#if> 
778								 
779								<#assign imageNovetatAgenda = ""> 
780								<#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
781								<#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
782									<#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
783									<#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!""> 
784									<#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid> 
785								</#if> 
786 
787								<#assign imageAltNovetatAgenda = ""> 
788								<#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
789								<#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
790									<#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
791								</#if> 
792 
793								<#assign pubDateNovetatAgenda = ""> 
794								<#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
795								<#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
796									<#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
797								</#if> 
798 
799								<#assign pubTimeNovetatAgenda = ""> 
800								<#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
801								<#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
802									<#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
803								</#if> 
804 
805								<#assign despubDateNovetatAgenda = ""> 
806								<#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
807								<#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
808									<#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
809								</#if> 
810 
811								<#assign despubTimeNovetatAgenda = ""> 
812								<#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
813								<#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
814									<#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
815								</#if> 
816 
817								<#assign isExpiredNovetatAgenda = ""> 
818								<#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
819								<#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
820									<#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
821								</#if> 
822 
823								<#assign isPublishedNA = false> 
824								<#if (pubDateNovetatAgenda?has_content)> 
825									<#if pubTimeNovetatAgenda?has_content> 
826										<#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]> 
827										<#assign timeActFormat = timeActDate?string["HH:mm"]> 
828									<#else> 
829										<#assign timeActDate = ""> 
830										<#assign timeActFormat = ""> 
831									</#if> 
832									<#attempt>	 
833										<#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]> 
834										 
835										<#if timeActFormat?has_content && timeActFormat != ""> 
836											<#assign dataActMil = miliSeconds(timeActFormat dataAct?long)> 
837											<#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))> 
838										</#if> 
839										<#assign dataActMil = dataAct?long> 
840										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
841										<#assign isPublishedNA = (dataActMil - now ) < 0 /> 
842									<#recover> 
843									</#attempt> 
844								</#if> 
845 
846								<#assign isDespublishedNA = false> 
847								<#if (despubDateNovetatAgenda?has_content)> 
848									<#if despubTimeNovetatAgenda?has_content> 
849										<#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]> 
850										<#assign timeExpFormat = timeExpDate?string["HH:mm"]> 
851									<#else> 
852										<#assign timeExpDate = ""> 
853										<#assign timeExpFormat = ""> 
854									</#if> 
855									<#attempt> 
856										<#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]> 
857										 
858										<#if timeExpFormat?has_content && timeExpFormat != ""> 
859											<#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)> 
860											<#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))> 
861										</#if> 
862										<#assign dataExpMil = dataExp?long> 
863										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
864										<#assign isDespublishedNA = (dataExpMil - now) < 0 /> 
865									<#recover> 
866									</#attempt> 
867								</#if> 
868 
869								<#assign isExpiredNA = false> 
870								<#if journalArticle.expirationDate??> 
871									<#assign dataExp = journalArticle.expirationDate?datetime> 
872									<#attempt> 
873										<#assign dataExpMil = dataExp?long> 
874										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
875										<#assign isExpiredNA = (dataExpMil - now) < 0 /> 
876									<#recover> 
877									</#attempt> 
878								</#if> 
879 
880								<#assign showNovetatAgenda = false> 
881								<#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1"> 
882									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true"> 
883								<#else> 
884									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true"> 
885								</#if> 
886 
887								<#if showNovetatAgenda> 
888									<#if title?has_content> 
889										<li class="hola-bcn-carrusel-standard_new-li"> 
890											<a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}"> 
891												<div class="hola-bcn-carrusel-standard__card-cover"> 
892													<div class="hola-bcn-carrusel-standard__card-cover-filter"></div> 
893													<img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>> 
894													<div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>> 
895														<span><@liferay.language key='label.bloc.novetatagenda.finished' /></span> 
896													</div> 
897													<#if filterNovetatAgenda?has_content> 
898														<div class="hola-bcn-carrusel-standard-highlight"> 
899															<span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span> 
900														</div> 
901													</#if> 
902												</div> 
903												<div class="hola-bcn-carrusel-standard-container"> 
904													<div> 
905														<h3 class="hola-bcn-carrusel-standard__card-title"> 
906															${title} 
907															<#if newwindow?? && newwindow?has_content> 
908																<span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span> 
909															</#if> 
910														</h3> 
911														<span class="hola-bcn-carrusel-standard__card-description"> 
912															${subtitle} 
913														</span> 
914													</div> 
915													<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)> 
916														<div class="hola-bcn-carrusel-standard_bottom-extra"> 
917															<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content> 
918																<div class="hola-bcn-carrusel-standard-date"> 
919																	<#if fromInitDateNovetatAgenda == "true"> 
920																		<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> 
921																	<#else> 
922																		<#if initDateNovetatAgenda?has_content && !endDateNovetatAgenda?has_content> 
923																			<span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span> 
924																		<#else> 
925																			<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> 
926																		</#if> 
927																	</#if> 
928																</div> 
929															</#if> 
930															<#if whereNovetatAgenda?has_content> 
931																<div class="hola-bcn-carrusel-standard-where"> 
932																	<span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span> 
933																</div> 
934															</#if> 
935														</div> 
936													</#if> 
937												</div> 
938											</a> 
939										</li> 
940									</#if> 
941								</#if> 
942							</#if> 
943						</#list> 
944					</ul> 
945				</div> 
946			</div> 
947		</div> 
948	</section> 
949 
950	<script type="text/javascript"> 
951 
952		$(document).ready(function() { 
953			initSliderBcnStandard(); 
954		}); 
955 
956		function initSliderBcnStandard() { 
957			if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) { 
958				$(".js__hola-bcn-standard-slider").slick("unslick"); 
959
960 
961			$('.js__hola-bcn-standard-slider').slick({ 
962				slidesToShow: 3, 
963				slidesToScroll: 1, 
964				arrows: false, 
965				dots: false, 
966				draggable: false, 
967				infinite: false, 
968				responsive: [ 
969
970						breakpoint: 767, 
971						settings: { 
972							variableWidth: true, 
973							slidesToShow: 1, 
974							slidesToScroll: 1, 
975							arrows: false, 
976							dots: true, 
977							draggable: true, 
978							infinite: true 
979
980
981
982			}); 
983
984 
985	</script> 
986</#if> 

We are lauching the new X3 line Paral·lel - L'Hospitalet (Av. Carrilet) line

Starting from May 26, debut the new line that is joining the XPRESBus network

Faster, better connected, and more direct

  • A faster line: With the X3 XPRESBus Paral·lel - L'Hospitalet (Av. Carrilet) line from TMB, you save time because it offers more efficient routes, with a frequency of 20 minutes on weekdays and 30 minutes on holidays.
  • Better connected: We are increasing connectivity between L'Hospitalet and Barcelona with this line, as it links with metro lines 2 and 3 at Paral·lel. Additionally, the X3 XPRESBus  travels through areas with less traffic congestion, significantly improving mobility in the La Marina del Prat Vermell neighborhood.
  • More direct: The X3 XPRESBus takes you directly from Paral·lel to L'Hospitalet, passing through Montjuïc mountain, while maintaining the connection with Plaça d'Espanya.

XPRESBus

We are working on expanding TMB’s bus network by adding a new XPRESBus line to the two that are already in service, as well as to the proximity lines, conventional lines, and high-performance lines.

The XPRESBus is a concept of lines that was launched in 2021 with the goal of offering faster and more efficient routes, improving connections, and using sustainable buses.

XPRESBus lines are identified by the color black, in contrast to the other lines.

The first line of this kind is the X1, which entered service in September 2021 and connects Plaça Francesc Macià with Glòries. The X2 - Prat XPRES, which connects El Prat with Barcelona, started operating in October 2024.

Now, we are taking another step: with a new X3 XPRESBus line, we will provide the fastest connection between the Av. Carrilet area in L'Hospitalet and the center of Barcelona, at Paral·lel.

Try it starting May 26!

More info on XPRESBus project page.

An error occurred while processing the template.
The following has evaluated to null or missing:
==> title  [in template "20155#20195#1501272" at line 634, column 202]

----
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: ${title}  [in template "20155#20195#1501272" at line 634, column 200]
----
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"  
173									<#if element.typeLink.getData() == "extern">  
174										href="${element.External_Link.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
175									<#elseif element.typeLink.getData() == "intern" && element.Internal_Link?? && element.Internal_Link.getFriendlyUrl()?has_content>  
176										href="${element.Internal_Link.getFriendlyUrl()}" target="_self"  
177										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
178									<#elseif element.typeLink.getData() == "intern" && element.External_Link?? && element.External_Link.getData()?has_content>  
179										href="${element.External_Link.getData()}" target="_self"  
180										<#if element.titleLink?? && element.titleLink.getData()?has_content>title="${element.titleLink.getData()}"</#if>  
181									</#if> 
182
183								</#if> 
184									<div class="hero__media <#if (!element.titleElem?? || !element.titleElem.getData()?has_content) && (!element.descElem?? || !element.descElem.getData()?has_content)>hero__media-no-fade</#if>"> 
185										<#if element.typeLink.getData() == "video"> 
186											<div class="hero__media-video__container"> 
187												<span class="hero__media-video__img"> 
188												</span> 
189											</div> 
190										</#if> 
191										<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>> 
192									</div> 
193									<div class="hero__content white__banner"> 
194										<p class="hero__title" > 
195											${element.titleElem.getData()} 
196										</p> 
197										<p class="hero__desc-alt" > 
198											${element.descElem.getData()} 
199										</p> 
200									</div> 
201								</a> 
202							</div> 
203						</div> 
204					</#foreach> 
205				</#if> 
206			</div> 
207		</div> 
208	</div> 
209 
210	<div class="dialog"> 
211		<div id="carrusel-banner-video" class="u-hidden"> 
212			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
213			</div> 
214		</div> 
215	</div> 
216	<script type="text/javascript"> 
217		initSliderCarruselBanner1(); 
218 
219		function initSliderCarruselBanner1() { 
220			if($(".js-carousel-banner-al_1").hasClass('slick-initialized')) { 
221				$(".js-carousel-banner-al_1").slick("unslick"); 
222
223			$('.js-carousel-banner-al_1 .slick-toggle-play').remove(); 
224			$('.js-carousel-banner-al_1').slick({ 
225				slidesToShow: 1, 
226				arrows: true, 
227				draggable: true, 
228				infinite: false, 
229				variableWidth: false, 
230				autoplaySpeed: 4000, 
231				dots: true, 
232				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>', 
233				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>', 
234				responsive: [ 
235
236						breakpoint: 767, 
237						settings: { 
238							slidesToShow: 1, 
239							arrows: false, 
240							variableWidth: true, 
241							dots: true 
242
243
244
245			}).each(function () { 
246				var carousel = $(this), 
247				toggleButton, 
248				toggleIcon; 
249 
250				carousel.find('.slick-next__icon').attr({ 
251					'alt': carousel.data('next-text') 
252				}); 
253 
254				carousel.find('.slick-prev__icon').attr({ 
255					'alt': carousel.data('prev-text') 
256				}); 
257			}); 
258 
259			if ($('.hero-carousel__container .hero').length == 1) { 
260				$('.hero-carousel__container .slick-toggle-play').hide(); 
261
262 
263			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
264			if($(".js-carousel-banner-al_1 .slick-dots").length > 0) { 
265				setDotsPositionBanner1(); 
266
267
268 
269		function showVideoModalBanner(link) { 
270			const start = link.indexOf("v=") + 2; 
271			const end = start + 2 + 11; 
272 
273			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-"); 
274			$('#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>'); 
275
276		function setDotsPositionBanner1() { 
277			$(".js-carousel-banner-al_1 .slick-dots").appendTo($(".js-carousel-banner-al_1").parent()); 
278
279 
280		window.addEventListener('resize', function(event){ 
281			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
282			if($(".js-carousel-banner-al_1 .slick-dots").length > 0 && width > 768) { 
283				setDotsPositionBanner1(); 
284
285		});    
286 
287	</script> 
288</#if> 
289 
290 
291<#--  BASICA-TITOL-TEXT  --> 
292 
293<#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()))> 
294	<div class="full-body__container basica-titol-text"> 
295		<#foreach elem in basicaTitolText.elementsBasica.getSiblings()> 
296			<div class="basica-titol-text-wrapper"> 
297				<#if elem.titleBasica?? && elem.titleBasica.getData()?has_content><h2 class="">${elem.titleBasica.getData()}</h2></#if> 
298				<#if elem.contentBasica?? && elem.contentBasica.getData()?has_content><div class="basica-titol-text-content">${elem.contentBasica.getData()}</div></#if> 
299			</div> 
300			<#foreach subelem in elem.subelementsBasica.getSiblings()> 
301				<div class="basica-titol-text-wrapper"> 
302					<#if subelem.subelementTitleBasica?? && subelem.subelementTitleBasica.getData()?has_content><h3>${subelem.subelementTitleBasica.getData()}</h3></#if> 
303					<#if subelem.subelementContentBasica?? && subelem.subelementContentBasica.getData()?has_content><div class="basica-titol-text-content">${subelem.subelementContentBasica.getData()}</div></#if> 
304				</div> 
305			</#foreach> 
306		</#foreach> 
307	</div> 
308</#if> 
309 
310 
311<#--  bloc-detall-agenda  --> 
312 
313<#if detallAgenda?? && (!detallAgenda.hideDetallAgenda?? || !getterUtil.getBoolean(detallAgenda.hideDetallAgenda.getData()))> 
314    <#assign hasElementDetallAgenda = false> 
315    <#if detallAgenda.elementsDetallAgenda??  
316          && detallAgenda.elementsDetallAgenda.getSiblings()??  
317          && (detallAgenda.elementsDetallAgenda.getSiblings()?size > 0)> 
318        <#assign firstSibling = detallAgenda.elementsDetallAgenda.getSiblings()[0]> 
319        <#if (firstSibling.titleDetallAgenda?? && firstSibling.titleDetallAgenda.getData()?has_content)  
320              || (firstSibling.contentDetallAgenda?? && firstSibling.contentDetallAgenda.getData()?has_content)> 
321            <#assign hasElementDetallAgenda = true> 
322        </#if> 
323    </#if> 
324     
325    <div class="full-body__container detall-agenda" <#if !hasElementDetallAgenda>style="margin-top:0;"</#if>> 
326		<#if detallAgenda.elementsDetallAgenda.getSiblings()??> 
327			<#assign siblings = detallAgenda.elementsDetallAgenda.getSiblings()> 
328			<#if siblings?size gt 0> 
329				<#foreach elem in siblings> 
330					<div class="detall-agenda-wrapper"> 
331						<#if elem.titleDetallAgenda?? && elem.titleDetallAgenda.getData()?has_content> 
332							<h2 class="">${elem.titleDetallAgenda.getData()}</h2> 
333						</#if> 
334						<#if elem.contentDetallAgenda?? && elem.contentDetallAgenda.getData()?has_content> 
335							<div class="detall-agenda-content">${elem.contentDetallAgenda.getData()}</div> 
336						</#if> 
337					</div> 
338				</#foreach> 
339			</#if> 
340		</#if> 
341 
342         
343        <#if detallAgenda.buttonsDetallAgenda??  
344              && detallAgenda.buttonsDetallAgenda.getSiblings()??  
345              && (detallAgenda.buttonsDetallAgenda.getSiblings()?size > 0) 
346              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda??  
347              && detallAgenda.buttonsDetallAgenda.getSiblings()[0].linkTextDetallAgenda.getData()?has_content> 
348            <div class="detall-agenda-buttons-wrapper"> 
349                <#foreach subelem in detallAgenda.buttonsDetallAgenda.getSiblings()> 
350                    <a title="<#if subelem.accessibleTitleButtons?? && subelem.accessibleTitleButtons.getData()?has_content>${subelem.accessibleTitleButtons.getData()}</#if>"  
351                       type="button"  
352                       class="button button--a"  
353                       <#if subelem.linkTypeDetallAgenda.getData() == "extern"  
354                             && subelem.External_LinkDetallAgenda??  
355                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
356                           href="${subelem.External_LinkDetallAgenda.getData()}"  
357                           rel="external"  
358                           target="_blank"  
359                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
360                             && subelem.Internal_LinkDetallAgenda??  
361                             && subelem.Internal_LinkDetallAgenda.getFriendlyUrl()?has_content>  
362                           href="${subelem.Internal_LinkDetallAgenda.getFriendlyUrl()}"  
363                           target="_self"   
364                       <#elseif subelem.linkTypeDetallAgenda.getData() == "intern"  
365                             && subelem.External_LinkDetallAgenda??  
366                             && subelem.External_LinkDetallAgenda.getData()?has_content>  
367                           href="${subelem.External_LinkDetallAgenda.getData()}"  
368                           target="_self"  
369                       </#if>> 
370                        <span class="button__label">${subelem.linkTextDetallAgenda.getData()}</span> 
371                    </a> 
372                </#foreach> 
373            </div> 
374        </#if> 
375    </div> 
376</#if> 
377 
378 
379 
380 
381<#--  DT_PP_TITULO_VIDEO  --> 
382 
383<#if stPpVideo?? && stPpVideo.linkFieldSet.link.getData()?has_content && (!stPpVideo.hideStPpVideo?? || !getterUtil.getBoolean(stPpVideo.hideStPpVideo.getData()))> 
384	<style> 
385		.points-video__video-cover.no_video::after{ 
386			background: none; 
387
388	</style> 
389	<#assign hasLink = false> 
390	<#if stPpVideo.linkHeader?? && stPpVideo.linkHeader.getData()?has_content && stPpVideo.linkHeaderText?? && stPpVideo.linkHeaderText.getData()?has_content> 
391		<#assign hasLink = true> 
392	</#if> 
393	<section class="points-video bg-gray pt-56"> 
394		<div class="main__container"> 
395			<div class="full-body"> 
396				<div class="full-body__container points-video__header-extra-container"> 
397					<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?has_content && stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()?trim?has_content> 
398						<a name="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}" id="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.ancoraVideo.getData()}"> 
399						</a> 
400					</#if> 
401					<#if stPpVideo.titol?? && stPpVideo.titol.getData()?has_content> 
402						<div class="points-video__header"> 
403							<div class="points-video__header-extra" <#if !hasLink>style="justify-content: center; margin-right: 0;"</#if>> 
404								<h2 class="points-video__title"> 
405								${stPpVideo.titol.getData()}</h2> 
406								<#if hasLink> 
407									<a class="points-video__subtitle-link" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
408								</#if> 
409							</div> 
410							<p class="points-video__description" <#if !hasLink>style="text-align: center; max-width: 100%;"</#if>> 
411							${stPpVideo.descriptiu.getData()}</p> 
412						</div> 
413					</#if> 
414					 
415					<div class="points-video__video-item cookieconsent-optin-marketing media-unit__content" id="marketingCookies"> 
416						<#if stPpVideo.linkFieldSet.link.getData()?has_content> 
417							<#assign start = stPpVideo.linkFieldSet.link.getData()?index_of("v=") + 2> 
418							<#--13 because v= + 11 char for youtube ids 
419							--> 
420							<#assign end = start + 11> 
421							<a href="${stPpVideo.linkFieldSet.link.getData()}" class="points-video__video-stPpVideo.linkFieldSet.link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}" 
422								rel="dialog-video" data-video="${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}"> 
423								<div class="points-video__video-cover" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
424									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
425								</div> 
426								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
427									<p class="points-video__caption"> 
428									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
429								</#if> 
430							</a> 
431						<#else> 
432							<a class="points-video__video-link" title="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}"> 
433								<div class="points-video__video-cover no_video" style="background-image: url(${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()});"> 
434									<img src="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideo.getData()}" alt="${stPpVideo.linkFieldSet.linkFieldSetFieldSet.imgVideoFieldSet.imgVideoFieldSetFieldSet.alt.getData()}" class="points-video__video-image"> 
435								</div> 
436								<#if stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()?has_content> 
437									<p class="points-video__caption"> 
438									${stPpVideo.linkFieldSet.linkFieldSetFieldSet.descriptiuVideo.getData()}</p> 
439								</#if> 
440							</a> 
441							 
442						</#if> 
443					</div> 
444					<div class='cookieconsent-optout-marketing media-unit__content'> 
445						<@liferay.language key="cookiebot.youtube.no-marketing"/> 
446					</div> 
447					<#if hasLink> 
448						<a class="points-video__subtitle-link-mobile" href="${stPpVideo.linkHeader.getData()}">${stPpVideo.linkHeaderText.getData()}</a> 
449					</#if> 
450				</div> 
451			</div> 
452		</div> 
453	</section> 
454	<section class="video-dialog js__video-dialog u-hidden <#if stPpVideo.linkFieldSet.link?? && stPpVideo.linkFieldSet.link.getData()?has_content>${stPpVideo.linkFieldSet.link.getData()?substring(start, end)}</#if>"> 
455		<div class="u-hidden" id="fragment-show-video"> 
456			<div class="video-dialog__panel"> 
457				<header class="video-dialog__header"> 
458					<button class="video-dialog__close js__video-dialog-close"> 
459					Cerrar</button> 
460				</header> 
461				<div class="video-dialog__content"> 
462					<div class="video-dialog__inner js__video-dialog-container"> 
463						<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=""> 
464						</iframe> 
465					</div> 
466				</div> 
467			</div> 
468		</div> 
469		<div class="video-dialog__overlay js__video-dialog-close"> 
470		</div> 
471	</section> 
472</#if> 
473 
474 
475<#--  TEXT-CARRUSEL-IMATGES-ALT  --> 
476 
477<#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()))> 
478	<#assign imagesFolder = themeDisplay.getPathThemeImages()> 
479 
480	<#assign entriesMapList = []> 
481	<#foreach elem in textCarruselImatges2.elementsFieldSetAlt.getSiblings()> 
482		<#if elem.elementsFieldSetFieldSetAlt.order?has_content> 
483			<#assign currentOrder = elem.elementsFieldSetFieldSetAlt.order.getData()> 
484		</#if> 
485		<#if !currentOrder?has_content || currentOrder == "null"> 
486			<#assign currentOrder = "99"> 
487		</#if> 
488		<#assign currEntryMap = {"entry" : elem.elementsFieldSetFieldSetAlt , "order" : currentOrder?number}> 
489		<#assign entriesMapList = entriesMapList + [currEntryMap]> 
490	</#foreach> 
491 
492	<#assign sortedEntriesMapList = entriesMapList?sort_by("order")> 
493	<#assign sortedEntriesRootElems = []> 
494 
495	<#foreach currEntryMap in sortedEntriesMapList> 
496		<#assign sortedEntriesRootElems = sortedEntriesRootElems + [currEntryMap.entry]> 
497	</#foreach> 
498 
499	<#assign leftContent = ""> 
500	<#if textCarruselImatges2.titleHeaderAlt?? && textCarruselImatges2.titleHeaderAlt.getData()?has_content && textCarruselImatges2.descHeaderAlt?? && textCarruselImatges2.descHeaderAlt?has_content> 
501		<#assign leftContent = "true"> 
502	</#if> 
503 
504	<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>"> 
505		<#if leftContent?has_content> 
506			<div class="hero-carousel__container-banner"> 
507				<h2 class="hero-carousel-banner-alt-title"> 
508					${textCarruselImatges2.titleHeaderAlt.getData()} 
509				</h2> 
510				<p class="hero-carousel-banner-alt-desc"> 
511					${textCarruselImatges2.descHeaderAlt.getData()} 
512				</p> 
513			</div> 
514		</#if> 
515		<div aria-live="polite" aria-atomic="false" aria-relevant="all" class="slick-list draggable"> 
516			<div class="hero-carousel__container js-carousel-banner-al_alt is-playing" 
517				data-prev-text='<@liferay.language key="label.carousel.prev"/>' 
518				data-next-text='<@liferay.language key="label.carousel.next"/>' 
519				data-pagination-text='<@liferay.language key="label.carousel.outstanding"/>' 
520				data-stop-text='<@liferay.language key="label.carousel.pause"/>' 
521				data-play-text='<@liferay.language key="label.carousel.start"/>'> 
522				<#if sortedEntriesRootElems?has_content>				 
523					<#foreach element in sortedEntriesRootElems> 
524						<div class="hero hero--super"> 
525							<div class="hero__container"> 
526								<#if element.typeLinkAlt.getData() == "video"> 
527									<a href="#" onclick='showVideoModalBanner(`${element.External_LinkAlt.getData()}`);return false;' class="hero__link"  
528										<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content> 
529											title="${element.titleLinkAlt.getData()}" 
530										</#if> 
531
532								<#else> 
533									<a class="hero__link"  
534										<#if element.typeLinkAlt.getData() == "extern">  
535											href="${element.External_LinkAlt.getData()}" target="_blank" title="<@liferay.language key="label.externalLink.title"/>"  
536										<#elseif element.typeLinkAlt.getData() == "intern" && element.Internal_LinkAlt?? && element.Internal_LinkAlt.getFriendlyUrl()?has_content>  
537											href="${element.Internal_LinkAlt.getFriendlyUrl()}" target="_self"  
538											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
539										<#elseif element.typeLinkAlt.getData() == "intern" && element.External_LinkAlt?? && element.External_LinkAlt.getData()?has_content>  
540											href="${element.External_LinkAlt.getData()}" target="_self"  
541											<#if element.titleLinkAlt?? && element.titleLinkAlt.getData()?has_content>title="${element.titleLinkAlt.getData()}"</#if>  
542										</#if> 
543
544								</#if> 
545									<div class="hero__media <#if (!element.titleElemAlt?? || !element.titleElemAlt.getData()?has_content) && (!element.descElemAlt?? || !element.descElemAlt.getData()?has_content)>hero__media-no-fade</#if>"> 
546										<#if element.typeLinkAlt.getData() == "video"> 
547											<div class="hero__media-video__container"> 
548												<span class="hero__media-video__img"> 
549												</span> 
550											</div> 
551										</#if> 
552										<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>> 
553									</div> 
554									<div class="hero__content white__banner"> 
555										<p class="hero__title" > 
556											${element.titleElemAlt.getData()} 
557										</p> 
558										<p class="hero__desc-alt" > 
559											${element.descElemAlt.getData()} 
560										</p> 
561									</div> 
562								</a> 
563							</div> 
564						</div> 
565					</#foreach> 
566				</#if> 
567			</div> 
568		</div> 
569	</div> 
570 
571	<div class="dialog"> 
572		<div id="carrusel-banner-video" class="u-hidden"> 
573			<div class="dialog__body dialog__body--jotmbe" id="carrusel-banner-video-content"> 
574			</div> 
575		</div> 
576	</div> 
577	<script type="text/javascript"> 
578		initSliderCarruselBanner2(); 
579 
580		function initSliderCarruselBanner2() { 
581			if($(".js-carousel-banner-al_alt").hasClass('slick-initialized')) { 
582				$(".js-carousel-banner-al_alt").slick("unslick"); 
583
584			$('.js-carousel-banner-al_alt .slick-toggle-play').remove(); 
585			$('.js-carousel-banner-al_alt').slick({ 
586				slidesToShow: 1, 
587				arrows: true, 
588				draggable: true, 
589				infinite: false, 
590				variableWidth: false, 
591				autoplaySpeed: 4000, 
592				dots: true, 
593				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>', 
594				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>', 
595				responsive: [ 
596
597						breakpoint: 767, 
598						settings: { 
599							slidesToShow: 1, 
600							arrows: false, 
601							variableWidth: true, 
602							dots: true 
603
604
605
606			}).each(function () { 
607				var carousel = $(this), 
608				toggleButton, 
609				toggleIcon; 
610 
611				carousel.find('.slick-next__icon').attr({ 
612					'alt': carousel.data('next-text') 
613				}); 
614 
615				carousel.find('.slick-prev__icon').attr({ 
616					'alt': carousel.data('prev-text') 
617				}); 
618			}); 
619 
620			if ($('.hero-carousel__container .hero').length == 1) { 
621				$('.hero-carousel__container .slick-toggle-play').hide(); 
622
623 
624			$('.slick-cloned[aria-describedby]').removeAttr('aria-describedby'); 
625			if($(".js-carousel-banner-al_alt .slick-dots").length > 0) { 
626				setDotsPositionBanner2(); 
627
628
629 
630		function showVideoModalBanner2(link) { 
631			const start = link.indexOf("v=") + 2; 
632			const end = start + 2 + 11; 
633 
634			TMB.dialog.newModal(langJotmbeClose, "dialog--jotmbe__no-footer dialog--jotmbe__no-icon dialog--jotmbe__with-actions dialog-video-iframe", "carrusel-banner-video", "", "Modal-${title}"); 
635			$('#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>'); 
636
637		function setDotsPositionBanner2() { 
638			$(".js-carousel-banner-al_alt .slick-dots").appendTo($(".js-carousel-banner-al_alt").parent()); 
639
640 
641		window.addEventListener('resize', function(event){ 
642			const width  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 
643			if($(".js-carousel-banner-al_alt .slick-dots").length > 0 && width > 768) { 
644				setDotsPositionBanner2(); 
645
646		});    
647 
648	</script> 
649</#if> 
650 
651 
652<#--  CARRUSEL-TRES-CARD  --> 
653 
654<#if referencesFieldSet?? && 0 < referencesFieldSet.getSiblings()?size && referencesFieldSet.getSiblings()[0].referenceId.getData()?has_content && (!hideTresCards?? || !getterUtil.getBoolean(hideTresCards.getData()))> 
655	<#assign colorClass = "" /> 
656	<#assign fullBody = "" /> 
657	<#if fondoColorCarruselCards?? && fondoColorCarruselCards.getData()??> 
658		<#if fondoColorCarruselCards.getData()=="blanc"> 
659			<#assign colorClass = "hola-bcn-carrusel-standard--white" /> 
660			<#assign fullBody = "full-body__container" /> 
661		<#else> 
662			<#assign colorClass = "hola-bcn-carrusel-standard--gray" /> 
663			<#assign fullBody = "full-body__container" /> 
664		</#if> 
665	</#if> 
666 
667	<section class="hola-bcn-carrusel-standard ${colorClass}"> 
668		<div class="hola-bcn-carrusel-standard-cont-ext hola-bcn-carrusel-standard-cont-ext-extra hola-bcn-carrusel-standard-cont-ext-flex ${fullBody}"> 
669			<div class="hola-bcn-carrusel-standard--container"> 
670				<div class="hola-bcn-carrusel-standard--outer"> 
671						<div class="hola-bcn-carrusel-standard_new-header"> 
672							<h2 class="title title--1 hola-bcn-carrusel-standard__title hola-bcn-carrusel-standard__title_new"> 
673							<#if titleCarruselCards?? && titleCarruselCards.getData()?has_content> 
674                ${titleCarruselCards.getData()} 
675              <#else> 
676                <@liferay.language key="title.carrusel.cards.default" /> 
677              </#if> 
678							</h2> 
679							<p class="hola-bcn-carrusel-standard__intro-text">${subtitleCarruselCards.getData()}</p> 
680						</div> 
681					<ul id="result-list" class="hola-bcn-carrusel-standard__items js__hola-bcn-standard-slider"> 
682						<#assign tmbGroupId = 20182> 
683						<#assign fundacioGroupId = 79790> 
684						<#list referencesFieldSet.getSiblings() as element> 
685							<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
686							<#assign articleId = element.referenceId.getData()> 
687							<#assign groupId = getterUtil.getLong(groupId)> 
688							<#attempt> 
689								<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId) /> 
690							<#recover> 
691								<#if groupId == tmbGroupId> 
692									<#assign groupId = fundacioGroupId> 
693								<#else> 
694									<#assign groupId = tmbGroupId> 
695								</#if> 
696								<#attempt> 
697									<#assign journalArticle = JournalArticleLocalService.getArticle(groupId, articleId)!> 
698								<#recover> 
699									<#assign journalArticle = ""> 
700								</#attempt> 
701							</#attempt> 
702							<#if journalArticle?has_content && journalArticle != ""> 
703								<#assign document = saxReaderUtil.read(journalArticle.getContent())> 
704								<#assign rootElement = document.getRootElement()> 
705 
706								<#assign resourceprimKey = journalArticle.getResourcePrimKey()> 
707								<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey)> 
708								<#assign assetRenderer = assetEntry.getAssetRenderer()> 
709								<#assign articleURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, "")> 
710								<#assign articleFriendlyURL = assetRenderer.getUrlTitle()> 
711								<#assign newwindow = ""> 
712								<#if !articleURL?has_content> 
713									<#assign newwindow = "target='_blank'"> 
714									<#if !isFundacio> 
715										<#if currentURL?contains("pre3")> 
716											<#assign articleURL = "https://pre3-fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
717										<#else> 
718											<#assign articleURL = "https://fundacio.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
719										</#if> 
720									<#else> 
721										<#if currentURL?contains("pre3")> 
722											<#assign articleURL = "https://pre3.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
723										<#else> 
724											<#assign articleURL = "https://www.tmb.cat/" + locale.getLanguage() + "/w/" + articleFriendlyURL> 
725										</#if> 
726									</#if> 
727								</#if> 
728 
729								<#assign title = ""> 
730								<#assign titleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='titleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
731								<#if titleSel.selectSingleNode(rootElement)?has_content> 
732									<#assign title = titleSel.selectSingleNode(rootElement).getStringValue()> 
733								</#if> 
734								 
735								<#assign subtitle = ""> 
736								<#assign subtitleSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='subtitleGlobal']/dynamic-content[@language-id='" + locale + "']")> 
737								<#if subtitleSel.selectSingleNode(rootElement)?has_content> 
738									<#assign subtitle = subtitleSel.selectSingleNode(rootElement).getStringValue()> 
739								</#if> 
740 
741								<#assign initDateNovetatAgenda = ""> 
742								<#assign fromInitDateNovetatAgenda = ""> 
743								<#assign endDateNovetatAgenda = ""> 
744								<#assign whereNovetatAgenda = ""> 
745								<#assign novetatAgendaSel = rootElement.selectSingleNode("dynamic-element[@field-reference='blocInfoAgenda']")!""> 
746								<#if novetatAgendaSel?has_content> 
747									<#assign dateNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whenBlocInfoAgenda']")!""> 
748 
749									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
750										<#assign initDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='initDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
751									</#if> 
752 
753									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
754										<#assign fromInitDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='fromInitDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
755									</#if> 
756 
757									<#if dateNovetatAgendaSelSel?has_content && dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
758										<#assign endDateNovetatAgenda = dateNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='endDateBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
759									</#if> 
760 
761									<#assign whereNovetatAgendaSelSel = novetatAgendaSel.selectSingleNode("dynamic-element[@field-reference='whereBlocInfoAgenda']")!""> 
762									<#if whereNovetatAgendaSelSel?has_content && whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']")?has_content> 
763										<#assign whereNovetatAgenda = whereNovetatAgendaSelSel.selectSingleNode("dynamic-element[@field-reference='textWhereBlocInfoAgenda']/dynamic-content[@language-id='" + locale + "']").getStringValue()> 
764									</#if> 
765								</#if> 
766 
767								<#assign typeNovetatAgenda = ""> 
768								<#assign typeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='typeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
769								<#if typeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
770									<#assign typeNovetatAgenda = typeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
771								</#if> 
772 
773								<#assign filterNovetatAgenda = ""> 
774								<#assign filterNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='filterNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
775								<#if filterNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
776									<#assign filterNovetatAgenda = filterNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
777								</#if> 
778								 
779								<#assign imageNovetatAgenda = ""> 
780								<#assign imageNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='imageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
781								<#if imageNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
782									<#assign image = imageNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
783									<#assign imageUuid = jsonFactoryUtil.createJSONObject(image).uuid!""> 
784									<#assign imageNovetatAgenda = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + groupId + "/" + imageUuid> 
785								</#if> 
786 
787								<#assign imageAltNovetatAgenda = ""> 
788								<#assign imageAltNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='altImageCardNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
789								<#if imageAltNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
790									<#assign imageAltNovetatAgenda = imageAltNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
791								</#if> 
792 
793								<#assign pubDateNovetatAgenda = ""> 
794								<#assign pubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
795								<#if pubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
796									<#assign pubDateNovetatAgenda = pubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
797								</#if> 
798 
799								<#assign pubTimeNovetatAgenda = ""> 
800								<#assign pubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='pubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
801								<#if pubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
802									<#assign pubTimeNovetatAgenda = pubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
803								</#if> 
804 
805								<#assign despubDateNovetatAgenda = ""> 
806								<#assign despubDateNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubDateNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
807								<#if despubDateNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
808									<#assign despubDateNovetatAgenda = despubDateNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
809								</#if> 
810 
811								<#assign despubTimeNovetatAgenda = ""> 
812								<#assign despubTimeNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='despubTimeNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
813								<#if despubTimeNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
814									<#assign despubTimeNovetatAgenda = despubTimeNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
815								</#if> 
816 
817								<#assign isExpiredNovetatAgenda = ""> 
818								<#assign isExpiredNovetatAgendaSel = saxReaderUtil.createXPath("dynamic-element[@field-reference='isExpiredNovetatAgenda']/dynamic-content[@language-id='" + locale + "']")> 
819								<#if isExpiredNovetatAgendaSel.selectSingleNode(rootElement)?has_content> 
820									<#assign isExpiredNovetatAgenda = isExpiredNovetatAgendaSel.selectSingleNode(rootElement).getStringValue()> 
821								</#if> 
822 
823								<#assign isPublishedNA = false> 
824								<#if (pubDateNovetatAgenda?has_content)> 
825									<#if pubTimeNovetatAgenda?has_content> 
826										<#assign timeActDate = pubTimeNovetatAgenda?date["HH:mm"]> 
827										<#assign timeActFormat = timeActDate?string["HH:mm"]> 
828									<#else> 
829										<#assign timeActDate = ""> 
830										<#assign timeActFormat = ""> 
831									</#if> 
832									<#attempt>	 
833										<#assign dataAct = pubDateNovetatAgenda?date["yyyy-MM-dd"]> 
834										 
835										<#if timeActFormat?has_content && timeActFormat != ""> 
836											<#assign dataActMil = miliSeconds(timeActFormat dataAct?long)> 
837											<#assign dataAct = dateUtil.newDate(getterUtil.getLong(dataActMil))> 
838										</#if> 
839										<#assign dataActMil = dataAct?long> 
840										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
841										<#assign isPublishedNA = (dataActMil - now ) < 0 /> 
842									<#recover> 
843									</#attempt> 
844								</#if> 
845 
846								<#assign isDespublishedNA = false> 
847								<#if (despubDateNovetatAgenda?has_content)> 
848									<#if despubTimeNovetatAgenda?has_content> 
849										<#assign timeExpDate = despubTimeNovetatAgenda?date["HH:mm"]> 
850										<#assign timeExpFormat = timeExpDate?string["HH:mm"]> 
851									<#else> 
852										<#assign timeExpDate = ""> 
853										<#assign timeExpFormat = ""> 
854									</#if> 
855									<#attempt> 
856										<#assign dataExp = despubDateNovetatAgenda?date["yyyy-MM-dd"]> 
857										 
858										<#if timeExpFormat?has_content && timeExpFormat != ""> 
859											<#assign dataExpMil = miliSeconds(timeExpFormat dataExp?long)> 
860											<#assign dataExp = dateUtil.newDate(getterUtil.getLong(dataExpMil))> 
861										</#if> 
862										<#assign dataExpMil = dataExp?long> 
863										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
864										<#assign isDespublishedNA = (dataExpMil - now) < 0 /> 
865									<#recover> 
866									</#attempt> 
867								</#if> 
868 
869								<#assign isExpiredNA = false> 
870								<#if journalArticle.expirationDate??> 
871									<#assign dataExp = journalArticle.expirationDate?datetime> 
872									<#attempt> 
873										<#assign dataExpMil = dataExp?long> 
874										<#assign now = .now?long+timeZoneUtil.getTimeZone("Europe/Madrid").getOffset(.now?long)> 
875										<#assign isExpiredNA = (dataExpMil - now) < 0 /> 
876									<#recover> 
877									</#attempt> 
878								</#if> 
879 
880								<#assign showNovetatAgenda = false> 
881								<#if typeNovetatAgenda?has_content && typeNovetatAgenda == "1"> 
882									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && !isDespublishedNA && isExpiredNovetatAgenda != "true"> 
883								<#else> 
884									<#assign showNovetatAgenda = isPublishedNA && !isExpiredNA && isExpiredNovetatAgenda != "true"> 
885								</#if> 
886 
887								<#if showNovetatAgenda> 
888									<#if title?has_content> 
889										<li class="hola-bcn-carrusel-standard_new-li"> 
890											<a ${newwindow} class="hola-bcn-carrusel-standard_new <#if isDespublishedNA>hola-bcn-carrusel-standard_new-finished</#if>" href="${articleURL}"> 
891												<div class="hola-bcn-carrusel-standard__card-cover"> 
892													<div class="hola-bcn-carrusel-standard__card-cover-filter"></div> 
893													<img class="hola-bcn-carrusel-standard__image" src="${imageNovetatAgenda}" <#if imageAltNovetatAgenda?has_content>alt="${imageAltNovetatAgenda}"<#else>alt=""</#if>> 
894													<div class="hola-bcn-carrusel-standard-finished-text" <#if isDespublishedNA>style="display: block;"</#if>> 
895														<span><@liferay.language key='label.bloc.novetatagenda.finished' /></span> 
896													</div> 
897													<#if filterNovetatAgenda?has_content> 
898														<div class="hola-bcn-carrusel-standard-highlight"> 
899															<span><@liferay.language key='label.bloc.novetatagenda.filter.${filterNovetatAgenda}' /></span> 
900														</div> 
901													</#if> 
902												</div> 
903												<div class="hola-bcn-carrusel-standard-container"> 
904													<div> 
905														<h3 class="hola-bcn-carrusel-standard__card-title"> 
906															${title} 
907															<#if newwindow?? && newwindow?has_content> 
908																<span class="icon-external-black" alt="Enllaç extern" title="(Obre una nova finestra)"></span> 
909															</#if> 
910														</h3> 
911														<span class="hola-bcn-carrusel-standard__card-description"> 
912															${subtitle} 
913														</span> 
914													</div> 
915													<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content || (whereNovetatAgenda?has_content)> 
916														<div class="hola-bcn-carrusel-standard_bottom-extra"> 
917															<#if initDateNovetatAgenda?has_content || endDateNovetatAgenda?has_content> 
918																<div class="hola-bcn-carrusel-standard-date"> 
919																	<#if fromInitDateNovetatAgenda == "true"> 
920																		<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> 
921																	<#else> 
922																		<#if initDateNovetatAgenda?has_content && !endDateNovetatAgenda?has_content> 
923																			<span><b><@liferay.language key='label.bloc.novetatagenda.when' /></b> ${initDateNovetatAgenda?date["yyyy-MM-dd"]?string("dd/MM/yyyy")}</span> 
924																		<#else> 
925																			<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> 
926																		</#if> 
927																	</#if> 
928																</div> 
929															</#if> 
930															<#if whereNovetatAgenda?has_content> 
931																<div class="hola-bcn-carrusel-standard-where"> 
932																	<span><b><@liferay.language key='label.bloc.novetatagenda.where' /> <span class="hola-bcn-carrusel-standard-where-inner">${whereNovetatAgenda}</span></b></span> 
933																</div> 
934															</#if> 
935														</div> 
936													</#if> 
937												</div> 
938											</a> 
939										</li> 
940									</#if> 
941								</#if> 
942							</#if> 
943						</#list> 
944					</ul> 
945				</div> 
946			</div> 
947		</div> 
948	</section> 
949 
950	<script type="text/javascript"> 
951 
952		$(document).ready(function() { 
953			initSliderBcnStandard(); 
954		}); 
955 
956		function initSliderBcnStandard() { 
957			if($(".js__hola-bcn-standard-slider").hasClass('slick-initialized')) { 
958				$(".js__hola-bcn-standard-slider").slick("unslick"); 
959
960 
961			$('.js__hola-bcn-standard-slider').slick({ 
962				slidesToShow: 3, 
963				slidesToScroll: 1, 
964				arrows: false, 
965				dots: false, 
966				draggable: false, 
967				infinite: false, 
968				responsive: [ 
969
970						breakpoint: 767, 
971						settings: { 
972							variableWidth: true, 
973							slidesToShow: 1, 
974							slidesToScroll: 1, 
975							arrows: false, 
976							dots: true, 
977							draggable: true, 
978							infinite: true 
979
980
981
982			}); 
983
984 
985	</script> 
986</#if> 
Go back up

Are you sure you want to remove '{0}' from your favourites?

Remember that you will no longer receive disruption report alerts for this line

You have added the '{0}' line to your favourites

You can activate an alert in order to receive updates on any disruptions planned for this line via email or on your mobile:

You do not have any alerts activated

Are you sure you want to alerts notifications for your favourites?

This action will temporarily mute all the alerts that you have configured, until you decide to activate them again.

You have added the '{0}' stop to your favourites

Rename the stop to make it easier to identify

You can activate an alert in order to receive updates on any disruptions planned for this line via email or on your mobile::

You do not have any alerts activated

Sign up

Sign up now and enjoy all the advantages of JoTMBé

  • A personalised web experience

  • Set up alerts for your favourite lines, stops and stations

  • Speed up your searches via your places and journeys

  • Win prizes and rewards with the Loyalty Program

Or enter your details

Very weak password

Weak password
Basic password
Safe password
Very safe password
Minimum requirements for your password:
- It must contain a minimum of 8 characters
- It must not match the user name
- It must not be vulnerable

Nearly done! Confirm your email address

label.jotmbe.register.confirm.caption

We sent an e-mail to so you can activate your account.

Did you not get it?
Send the email again

Terms of Service

Already have an account? Log in

You have still not chosen a password. We have sent an email to emaildeusuari@gmail.com whereby you can set one.

You have {0} an alert

Remember that you can manage your alerts from the My favourites

label.jotmbe.modal.confirm-a2.title

If you also want to receive notifications on changes in the line, you should add it to your favourites
Remember that you can manage your alerts from the your favourites

You have removed {0} '{1}' from your favourites

Remember that you can manage your alerts from the label.jotmbe.modal.confirm-b.link=My Favourites section My favourites

You have removed your account

You have changed your profile

You have changed your login details

Remember that the next time you access JoTMBé you should use your new details

We have sent an email to reset your password to the email address {0}.

You have changed your password

You are registered as a new JoTMBé user

You can save places and routes and add lines, stops and stations as favourites. This will speed up your searches and you will receive only the information that interests you.

You have deleted this address from your places

Remember that you can manage your sites and journeys from the section Places and journeys

You have deleted this journey from your journeys

Remember that you can manage your sites and journeys from the section Places and journeys

Reset Password

Forgotten your password?
Enter the email address associated with your account and we will send you a link to reset your password

Are you sure you want to remove '{0}' from your favourites?

Remember that you will no longer receive disruption report alerts for this line

Are you sure you want to delete your account?

Remember that all your account information will be lost and you will no longer receive information updates or benefit from fast, easy searches.

Are you sure you want to remove this address from your places?

Remember that this will slow down your searches for this place

Are you sure you want to remove this route from your journeys?

Remember that this will slow down your searches for this journey

Are you sure you want to delete this address from your places?

Remember that you will lose the chance to carry out quicker searches regarding this place

Are you sure you want to delete this journey from your journey?

Remember that you will lose the chance to carry out quicker searches regarding this journey

Are you sure you want to remove '{0}' from your favourites?

You have added the ’{0}’ stop to your favourites

Remember that if you also want to receive notifications on changes in the line, you should add it to your favourites.


You do not have any alerts activated

Save places to speed up your searches

Enter a personalised name such as ’home’ or ’work’

List of personal data processing activities

Save places to speed up your searches

Location

Error

Enter a personalised name such as ’home’ or ’work’

List of personal data processing activities

You have added the ’{0}’ stop to your favourites

Remember that if you also want to receive notifications on changes in the line, you should add it to your favourites.


You do not have any alerts activated

Save places to speed up your searches

Location

Error

Enter a personalised name such as ’home’ or ’work’

List of personal data processing activities

Save routes to speed up your searches

Enter a personalised name such as ’home’ or ’work’

List of personal data processing activities

Save your places and routes to speed up your searches

Location

Error

Enter a personalised name such as ’home’ or ’work’

Location

Error

Enter a personalised name such as ’home’ or ’work’

Route

From Carrer dels Penitents 7, Barcelona

To Plaça de Catalunya 4, Barcelona

Enter a personalised name such as ’home’ or ’work’

List of personal data processing activities

You have added the ’{0}’ stop to your favourites

Could not change the settings in notifications.

Due to a communication problem with the TMB server, the changes to the notification settings could not be saved. Try again later, sorry for the inconvenience.

There’s been an error

Due to a communication problem with the TMB server, the changes to the notification settings could not be saved. Try again later, sorry for the inconvenience.

Download TMB App

The trending app