Bitllets i tarifes

Quin bitllet necessites?
Escriu el nom del bitllet...
S'ha produït un error mentre es processava la plantilla.
For "." left-hand operand: Expected a hash, but this has evaluated to a string (wrapper: f.t.SimpleScalar): ==> jTitlePrices [in template "20155#20195#881487" at line 370, column 69] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign currentCodeTitle = jTitlePric... [in template "20155#20195#881487" at line 370, column 41] ----
1<#assign url = themeDisplay.getURLCurrent()>
2<#assign httpComponentsUtil = staticUtil["com.liferay.portal.kernel.util.HttpComponentsUtil"]>
3<#assign strOptionURL = portalUtil.getOriginalServletRequest(request).getParameter("q")!"">
4<#assign strOptionURL = httpComponentsUtil.decodeURL(strOptionURL)>
5<#assign pagination = 8>
6<#attempt>
7 <#assign jTitlePrices = jsonFactoryUtil.createJSONArray(serviceTool.getLlistatBitllets(groupId))>
8 <#assign num = jTitlePrices.length()-1>
9<#recover>
10 <#assign jTitlePrices = "">
11 <#assign num = 0>
12</#attempt>
13<#assign counter = 1>
14<#assign Integer = 0>
15<#assign abonaments = abonament.getSiblings()>
16<#assign imagesFolder = themeDisplay.getPathThemeImages()>
17<#assign jsonFilterOptions = jsonFactoryUtil.createJSONObject()>
18<#assign group = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService").getGroup(groupId)>
19<#assign domain = group.getExpandoBridge().getAttribute("MAPS_TMB_DOMAIN")>
20<#assign api_id = group.getExpandoBridge().getAttribute("API_ID")>
21<#assign api_key = group.getExpandoBridge().getAttribute("API_KEY")>
22<#assign equipmentCode = group.getExpandoBridge().getAttribute("ECOMMERCE_EQUIPMENT_CODE")>
23<#assign ecommerceDomain = group.getExpandoBridge().getAttribute("ECOMMERCE_DOMAIN")>
24<#assign ecommerceEndpoint = group.getExpandoBridge().getAttribute("ECOMMERCE_ENDPOINT")>
25<#assign urlCompra = languageUtil.get(locale, "context.ecommerce.url")>
26<#assign travelCardsMap = {
27 "es_ES": {
28 'general' : '0',
29 'niños_y_jovenes' : '1',
30 'gente_mayor_y_personas_con_discapacidad' : '2',
31 'familias_numerosas_y_monoparentales' : '3',
32 'persones_en_paro' : '4',
33 'integrados' : '0',
34 'otros' : '0'
35 },
36 "en_US": {
37 'general' : '0',
38 'children_and_youth' : '1',
39 'senior_citizens_and_disabled' : '2',
40 'large_and_single_parent_families' : '3',
41 'unemployed' : '4',
42 'integrats' : '0',
43 'others' : '0'
44 },
45 "ca_ES": {
46 'general' : '0',
47 'infants_i_joves' : '1',
48 'gent_gran_i_persones_amb_discapacitat' : '2',
49 'families_nombroses_i_monoparentals' : '3',
50 'persones_en_atur' : '4',
51 'integrats' : '0',
52 'altres' : '0'
53 }
54 }>
55<#assign optionURL = travelCardsMap[locale.toString()][strOptionURL]!"">
56<#-- Sorting dels abonaments pel camp ordre_tipus. ------------------------------------------------------------->
57<#assign n = abonaments?size-1>
58<#assign abonaments = tmbPortalUtil.sortListByField(abonament.getSiblings(), "ordre_tipus", "asc")>
59<#--<#assign abonaments = abonament.getSiblings()>-->
60<#-- Filtratge del llistat de bitllets ------------------------------------------------------------------------->
61<div class="bitllets-catalog-new grid__row">
62 <div class="secondary">
63 <div>
64 <h3 class="bitllets-intro-text">${intro_text.getData()}</h3>
65 </div>
66 <#assign select_filtreOpt = []>
67 <#if (select_filtre.getOptions()?size> 0)>
68 <#assign classNameService = serviceLocator.findService("com.liferay.portal.kernel.service.ClassNameLocalService")>
69 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
70 <#assign structureService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStructureLocalService")>
71 <#assign groupId = getterUtil.getLong(groupId)>
72 <#assign structureClassNameId = classNameService.getClassNameId("com.liferay.journal.model.JournalArticle")>
73 <#assign curArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].getData())>
74 <#assign structure = curArticle.getDDMStructure()>
75
76 <div class="tickets-catalog">
77 <section class="collapsible-content js-collapsible is-expanded">
78 <header class="collapsible-content__header">
79 <h2 class="collapsible-content__title js-collapsible__title">
80 <@liferay.language key="label.with.filter"/>
81 </h2>
82 </header>
83 <#assign node0 = jsonFactoryUtil.createJSONObject("{ categories : {} }")>
84 <#assign jsonFilterOptions = jsonFilterOptions.put("0", node0)>
85
86
87 <div class="collapsible-content__body js-collapsible__content">
88 <form action="" class="form form--validate">
89 <#foreach item in select_filtre.getOptions()>
90 <#if item == "1">
91 <#assign select_filtreOpt = select_filtreOpt + [item]>
92 <div class="choose-elements choose-ticket__type">
93 <h4 class="title title--3 "><@liferay.language key="view.t-mobilitat.cataleg.tipus.bitllet2"/></h4>
94 <ul class="option-group__items option-group__items--h">
95 <li class="option-group__item">
96 <label for="f__radio__1" class="radio">
97 <input title="[títol]" id="f__radio__1" name="f__radios__1_cbillets" class="user-success" type="radio" value="0">
98 <@liferay.language key="view.t-mobilitat.cataleg.tipus.bitllet.abonaments1"/>
99 </label>
100 </li>
101 <#assign node1 = jsonFactoryUtil.createJSONObject("{ categories : {} }")>
102 <#assign jsonFilterOptions = jsonFilterOptions.put("1", node1)>
103 <li class="option-group__item form__field__control--correct">
104 <label for="f__radio__2" class="radio">
105 <input title="[títol]" id="f__radio__2" name="f__radios__1_cbillets" class="user-success" type="radio" value="1">
106 <@liferay.language key="view.t-mobilitat.cataleg.tipus.bitllet.visitabarcelona"/>
107 </label>
108 </li>
109 <#assign node2 = jsonFactoryUtil.createJSONObject("{ categories : {} }")>
110 <#assign jsonFilterOptions = jsonFilterOptions.put("2", node2)>
111 <li class="option-group__item">
112 <label for="f__radio__3" class="radio">
113 <input title="[títol]" id="f__radio__3" name="f__radios__1_cbillets" class="user-success checkedFocus" type="radio" value="2">
114 <@liferay.language key="view.t-mobilitat.cataleg.tipus.bitllet.senzills"/>
115 </label>
116 </li>
117 </ul>
118 </div>
119
120 </#if>
121 <#if item == "2">
122 <#assign select_filtreOpt = select_filtreOpt + [item]>
123 <#assign ddmFormFieldsMap = structure.getDDMForm().getDDMFormFieldsMap(true)>
124 <#assign selectValidesaAbonament = ddmFormFieldsMap['select_validesa_abonament']>
125 <#assign ddmOptions = selectValidesaAbonament.getProperties()["options"]>
126 <#assign options = ddmOptions.getOptions()>
127 <select id="validesaTemplate" style="display:none;">
128 <#foreach option in options?keys>
129 <#assign value = options[option].getString(locale)>
130 <option value="${option}">${value}</option>
131 </#foreach>
132 </select>
133 <select id="tipus_abonament_template" style="display:none;">
134 </select>
135
136 <#assign selectGrupAbonament = ddmFormFieldsMap['select_grup_abonament']>
137 <#assign ddmOptions = selectGrupAbonament.getProperties()["options"]>
138 <#assign options = ddmOptions.getOptions()>
139
140 <div class="choose-elements choose-category" style="display: none;">
141 <h3 class="title title--3 "><@liferay.language key="label.group"/></h3>
142 <#assign jsonAllFilter = jsonFilterOptions.getJSONObject('0')>
143 <#assign jsonAllCategories = jsonAllFilter.getJSONObject('categories')>
144 <ul class="option-group__items option-group__items--h" id="f__tipus__abonament_inputs">
145 <#foreach option in options?keys>
146 <#assign value = options[option].getString(locale)>
147 <#assign emptyValidesa = jsonFactoryUtil.createJSONObject('{ validesa : [] }')/>
148 <#assign jsonAllCategories = jsonAllCategories.put(option, emptyValidesa) />
149 <li class="option-group__item" value="${option}">
150 <label for="f__radio_category__${option}" class="radio">
151 <input title="[títol]" id="f__radio_category__${option}" name="f__radios__1_categories" <#if optionURL == option > checked="checked" </#if> class="user-success" type="radio" value="${option}"> ${value}
152 </label>
153 </li>
154 </#foreach>
155 </ul>
156 </div>
157
158 <div class="form__field form__field--select" style="display: none">
159 <div class="form__field__control">
160 <select title="<@liferay.language key='label.categories'/>" id="f__tipus__abonament">
161 <#assign jsonAllFilter = jsonFilterOptions.getJSONObject("0")>
162 <#assign jsonAllCategories = jsonAllFilter.getJSONObject("categories")>
163
164 <#foreach option in options?keys>
165 <#assign value = options[option].getString(locale)>
166 <#assign emptyValidesa = jsonFactoryUtil.createJSONObject("{ validesa : [] }")>
167 <#assign jsonAllCategories = jsonAllCategories.put(option, emptyValidesa)>
168 <option value="${option}" <#if optionURL == option> selected </#if>> ${value}</option>
169 </#foreach>
170 </select>
171 </div>
172 </div>
173
174 <#assign selectValidesaAbonament = ddmFormFieldsMap['select_validesa_abonament']>
175 <#assign ddmOptions = selectValidesaAbonament.getProperties()["options"]>
176 <#assign options = ddmOptions.getOptions()>
177
178 <div class="choose-elements choose-validesa" style="display: none">
179 <h3 class="title title--3 "><@liferay.language key="label.categoria"/></h3>
180 <ul class="option-group__items option-group__items--h" id="f__validesa_inputs">
181 <#foreach option in options?keys>
182 <#assign value = options[option].getString(locale)>
183 <#assign emptyValidesa = jsonFactoryUtil.createJSONObject('{ validesa : [] }')/>
184 <#assign jsonAllCategories = jsonAllCategories.put(option, emptyValidesa) />
185 <li class="option-group__item" value="${option}">
186 <label for="f__radio_validesa__${option}" class="radio">
187 <input title="[títol]" id="f__radio_validesa__${option}" name="f__radios__1_validesa" class="user-success" type="radio" value="${option}"> ${value}
188 </label>
189 </li>
190 </#foreach>
191 </ul>
192 </div>
193
194 <div style="display: none">
195 <h3 class="title title--3 ">
196 <@liferay.language key="label.validity"/>
197 </h3>
198
199 <div class="form__field form__field--select">
200 <div class="form__field__control">
201 <select title="<@liferay.language key='label.all'/>" id="f__validesa" disabled="disabled">
202 <option value="0">
203 <@liferay.language key="label.all"/>
204 </option>
205 </select>
206 </div>
207 </div>
208 </div>
209 </#if>
210 </#foreach>
211 </form>
212 </div>
213 </section>
214 </div>
215 </#if>
216</div>
217<#-- Llistat de bitllets -------------------------------------------------------------------------------------
218-->
219<div class="primary">
220 <h2 class="title-bitllets-primary"><@liferay.language key="label.tickets.title"/></h2>
221 <div class="filters-bitllets">
222 <button class="filter-levels filter-first-level">
223 <span></span>
224 <img class="filter-unit__image" src="${imagesFolder}/basic/10px/svg/close-black.svg" alt="<@liferay.language key='label.close'/>">
225 </button>
226 <button class="filter-levels filter-second-level">
227 <span></span>
228 <img class="filter-unit__image" src="${imagesFolder}/basic/10px/svg/close-black.svg" alt="<@liferay.language key='label.close'/>">
229 </button>
230 <button class="filter-levels filter-third-level">
231 <span></span>
232 <img class="filter-unit__image" src="${imagesFolder}/basic/10px/svg/close-black.svg" alt="<@liferay.language key='label.close'/>">
233 </button>
234 <button class="delete-all-filters">
235 <img class="filter-unit__image" src="${imagesFolder}/basic/12px/svg/delete.svg" alt="<@liferay.language key='label.delete.data'/>">
236 <span><@liferay.language key="label.delete.filters"/><span>
237 </button>
238 </div>
239 <section class="tickets-pop">
240 <div class="distributor distributor--alt distributor--alt-media">
241 <div class="result-notfound-tickets">
242 <span><@liferay.language key="label.notfound.ticket"/></span>
243 </div>
244 <ul id="result-list" class="distributor__items">
245 <#assign lang = locale.getLanguage()>
246 <#assign String = "">
247 <#foreach bitllet in abonaments>
248 <#assign preu = -1>
249 <#assign isZone = "false">
250 <#assign isUnique = false>
251 <#assign showDesde = false>
252 <#assign titolTitle = "">
253 <#if bitllet.en_titol_detall.getData() != "">
254 <#assign titolTitle = bitllet.en_titol_detall.getData()>
255 </#if>
256 <#assign abonamentTypes = "">
257 <#foreach abonType in bitllet.select_grup_abonament.getSiblings()>
258 <#if abonamentTypes != "">
259 <#assign abonamentTypes = abonamentTypes + "," + abonType.getData()>
260 <#else>
261 <#assign abonamentTypes = abonType.getData()>
262 </#if>
263 </#foreach>
264 <#assign validesaTypes = "">
265 <#foreach validType in bitllet.select_validesa_abonament.getSiblings()>
266 <#if validesaTypes != "">
267 <#assign validesaTypes = validesaTypes + "," + validType.getData()>
268 <#else>
269 <#assign validesaTypes = validType.getData()>
270 </#if>
271 </#foreach>
272 <#assign bitllet_tipus = bitllet.bitllet_tipus.getData()!"">
273 <#if bitllet_tipus == "">
274 <#assign bitllet_tipus = "0">
275 </#if>
276 <#assign jsonFilterInfo = jsonFilterOptions.getJSONObject(bitllet_tipus)>
277 <#assign jsonBitllet = jsonFilterInfo.getJSONObject("categories")>
278
279 <#assign jsonAllFilter = jsonFilterOptions.getJSONObject("0")>
280 <#assign jsonAllCategories = jsonAllFilter.getJSONObject("categories")>
281
282
283
284 <#foreach abonType in bitllet.select_grup_abonament.getSiblings()>
285 <#assign validesa_array = []>
286 <#if !jsonBitllet.has(abonType.getData())>
287 <#assign emptyValidesa = jsonFactoryUtil.createJSONObject("{ validesa : [] }")>
288 <#assign jsonBitllet = jsonBitllet.put(abonType.getData(), emptyValidesa)>
289 </#if>
290
291 <#-- Sin filtrar por tipo de billete ni categoría
292 -->
293 <#assign jsonNoFilterInfo = jsonAllCategories.getJSONObject("0")!jsonFactoryUtil.createJSONObject("{ validesa : [] }")>
294 <#assign jsonNoFilterValidesa = jsonNoFilterInfo.getJSONArray("validesa")>
295 <#-- Filtra por categoría pero no por tipo de billete-->
296 <#assign jsonAllCategoryInfo = jsonAllCategories.getJSONObject(abonType.getData())>
297 <#assign jsonAllValidesa = jsonAllCategoryInfo.getJSONArray("validesa")>
298 <#-- Filtra por tipo de billete pero no por categoría
299 -->
300 <#assign jsonBasicCategoryInfo = jsonBitllet.getJSONObject("0")!jsonFactoryUtil.createJSONObject("{ validesa : [] }")>
301 <#assign jsonBasicValidesa = jsonBasicCategoryInfo.getJSONArray("validesa")>
302 <#-- Filtra por categoría y por tipo de billete
303 -->
304 <#assign jsonBitlletCategoryInfo = jsonBitllet.getJSONObject(abonType.getData())>
305 <#assign jsonBCValidesa = jsonBitlletCategoryInfo.getJSONArray("validesa")>
306
307 <#foreach validesaData in bitllet.select_validesa_abonament.getSiblings()>
308 <#assign val = validesaData.getData()>
309 <#assign noFilterValString = jsonNoFilterValidesa.toString()>
310 <#assign noFilterValLength = noFilterValString?length-1>
311 <#assign noFilterValidesa_array = noFilterValString?substring(1, noFilterValLength)?replace("\"", "")?split(",")>
312
313 <#if !noFilterValidesa_array?seq_contains(val)>
314 <#assign jsonNoFilterValidesa = jsonNoFilterValidesa.put(val)>
315 </#if>
316
317 <#assign basicValString = jsonBasicValidesa.toString()>
318 <#assign basicValLength = basicValString?length-1>
319 <#assign basicValidesa_array = basicValString?substring(1, basicValLength)?replace("\"", "")?split(",")>
320
321 <#if !basicValidesa_array?seq_contains(val)>
322 <#assign jsonBasicValidesa = jsonBasicValidesa.put(val)>
323 </#if>
324 <#assign allValString = jsonAllValidesa.toString()>
325 <#assign allValLength = allValString?length-1>
326 <#assign allValidesa_array = allValString?substring(1, allValLength)?replace("\"", "")?split(",")>
327
328 <#if !allValidesa_array?seq_contains(val)>
329 <#assign jsonAllValidesa = jsonAllValidesa.put(val)>
330 </#if>
331
332 <#assign bcValString = jsonBCValidesa.toString()>
333 <#assign bcValLength = bcValString?length-1>
334 <#assign bcValidesa_array = bcValString?substring(1, bcValLength)?replace("\"", "")?split(",")>
335 <#if !bcValidesa_array?seq_contains(val)>
336 <#assign jsonBCValidesa = jsonBCValidesa.put(val)>
337 </#if>
338 </#foreach>
339 </#foreach>
340
341 <li class="distributor__item"
342 data-filter-ticket-type="${abonamentTypes}"
343 data-filter-validity="${validesaTypes}"
344 data-filter-bitllet="${bitllet.bitllet_tipus.getData()}"
345 data-bitllet-code="${bitllet.codi_titol_abonament.getData()}"
346 <#if (counter>pagination)> style="display:none;" </#if>
347 >
348 <div class="list-unit">
349 <div class="list-unit__container">
350
351 <div class="list-unit__media <#if bitllet.venda_online?has_content && bitllet.venda_online.getData() == "true">
352 list-unit__media--app </#if>
353 ">
354 <#if bitllet.imatge_abonament.getData() == "">
355 <img class="list-unit__image" src="${imagesFolder}/figures/img-distribuidora-3col.png" alt="<@liferay.language key="label.image.ticket"/>
356 ">
357 <#else>
358 <img class="list-unit__image" src="${bitllet.imatge_abonament.getData()}" alt="${bitllet.alt.getData()}">
359 </#if>
360 </div>
361 <div class="list-unit__content">
362 <h3 class="list-unit__title">
363 <a class="list-unit__link" title="${titolTitle}" href="${bitllet.url_detall_abonament.getFriendlyUrl()}">
364 ${bitllet.titol_abonament.getData()}
365 </a>
366 </h3>
367 <p class="list-unit__intro">
368 ${bitllet.descripcio_abonament.getData()}</p>
369 <#foreach i in 0..num>
370 <#assign currentCodeTitle = jTitlePrices.getJSONObject(i).getString("id")>
371 <#if bitllet.codi_titol_abonament.getData() == currentCodeTitle>
372 <#assign preu = jTitlePrices.getJSONObject(i).getDouble("preu")>
373 <#if preu == preu?floor>
374 <#assign preu = preu?string(",##0.##")>
375 <#else>
376 <#assign preu = preu?string(",##0.00")>
377 </#if>
378 <#if lang == "en">
379 <#assign preu = preu?replace(",", ".")>
380 <#else>
381 <#assign preu = preu?replace(".", ",")>
382 </#if>
383 <#assign isZone = jTitlePrices.getJSONObject(i).getString("teZones")>
384 <#break>
385 </#if>
386 </#foreach>
387 <#if preu?string == "-1">
388 <#assign preu = "">
389 <#else>
390 <#if bitllet.showDesde?? && bitllet.showDesde?has_content>
391 <#assign showDesde = getterUtil.getBoolean(bitllet.showDesde.getData())>
392 </#if>
393 <#assign fromText = "">
394 <#if showDesde>
395 <#assign fromText = languageUtil.get(locale, 'label.from')>
396 </#if>
397 <#if bitllet.isUnique?? && bitllet.isUnique?has_content>
398 <#assign isUnique = getterUtil.getBoolean(bitllet.isUnique.getData())>
399 </#if>
400 <#assign priceText = "">
401 <#if isUnique>
402 <#assign priceText = languageUtil.get(locale, 'label.price')>
403 </#if>
404
405 <#if lang == "en">
406 <#if isUnique>
407 <#assign preu = priceText + ": <b class='list-unit__meta-price'>€" + preu +"</b>">
408 <#else>
409 <#assign preu = fromText + " <b class='list-unit__meta-price'>€" + preu +"</b>">
410 </#if>
411 <#else>
412 <#if isUnique>
413 <#assign preu = priceText + ": <b class='list-unit__meta-price'>" + preu + " €" + "</b>">
414 <#else>
415 <#assign preu = fromText + " <b class='list-unit__meta-price'>" + preu + " €" + "</b>">
416 </#if>
417 </#if>
418 </#if>
419 <div class="list-unit__block">
420 <p class="list-unit__meta">
421 <#if bitllet.manualPrice??>
422 <#assign manualPrice = getterUtil.getBoolean(bitllet.manualPrice.getData())>
423 </#if>
424 <#if manualPrice?? && manualPrice && bitllet.priceInfo?? && bitllet.priceInfo.getData() != "">
425 <span class="list-unit__tag">
426 ${bitllet.priceInfo.getData()}
427 </span>
428 <#elseif preu != "">
429 <span class="list-unit__tag">
430 ${preu}
431 </span>
432 </#if>
433 </p>
434 <#if bitllet.onlineSell??>
435 <#assign onlineSell = getterUtil.getBoolean(bitllet.onlineSell.getData())>
436 </#if>
437 <div class="list-unit__actions" <#if onlineSell?? && onlineSell>style="display: block;"<#else>style="display: none;"</#if>>
438 <#if bitllet.url_externa_compra_online.getData() != "">
439 <a class="button button--a" tabindex="0" title="${bitllet.titol_abonament.getData()}" data-name-bitllet=""
440 data-titol="${bitllet.codi_titol_abonament.getData()}" data-code="" target="_blank" rel="external" href="${bitllet.url_externa_compra_online.getData()}">
441 <#elseif getterUtil.getBoolean(bitllet.saleTmobilitat.getData())>
442 <a class="button button--a" tabindex="0" title="${bitllet.titol_abonament.getData()}" data-name-bitllet=""
443 data-titol="${bitllet.codi_titol_abonament.getData()}" data-code="" rel="nofollow" onclick="saleMobilitatUrl(this)" onkeydown="handleKeyDown(event, 'sale')">
444 <#else>
445 <a class="button button--a" tabindex="0" title="${bitllet.titol_abonament.getData()}" data-name-bitllet=""
446 data-titol="${bitllet.codi_titol_abonament.getData()}" data-code="" rel="nofollow" onclick="notSaleMobilitatUrl(this)" onkeydown="handleKeyDown(event, 'notsale')">
447 </#if>
448 <@liferay.language key="label.buy.online"/>
449 </a>
450 </div>
451
452 </div>
453 </div>
454 </div>
455 </div>
456 </li>
457 <#assign counter = counter + 1>
458 </#foreach>
459
460 </ul>
461 <#-- Paginació del llistat de bitllets ------------------------------------------------------------------------->
462 <#if (abonaments?size>pagination)>
463 <div class="load-more">
464 <a href="javascript:void(0);" class="button button--a button-more" onclick="paginate();">
465 <@liferay.language key="view.more"/>
466 </a>
467 </div>
468 </#if>
469 </div>
470 </section>
471</div>
472</div>
473
474<script type="text/javascript">
475 var self = this;
476 var jsonOptions;
477 var jsonFilterOptions;
478 TJS.eventPagination = ${pagination};
479 var $firstLevelValue = null;
480 var $secondLevelValue = null;
481 var $thirdLevelValue = null;
482 var $selectedFirstLevel = false;
483 var $selectedSecondLevel = false;
484 var $selectedThirdLevel = false;
485 var $hideOtherFilters = false;
486
487 function initCompraOnline(versionCode){
488 jQuery.ajax({
489 url : "${domain}/${ecommerceEndpoint}/v2/business-parameters/"+versionCode+"/catalog/product/parent-variants?equipmentCode=${equipmentCode}&app_id=${api_id}&app_key=${api_key}",
490 type : "GET",
491 dataType: "json",
492 success: function(data) {
493 var productsNoVariants = data.productsWithoutVariants;
494 var productsWithVariants = data.productsWithVariants;
495
496 for(var i in productsNoVariants){
497 var product = productsNoVariants[i];
498 var ticketCode = product.ticketCode;
499 var productCode = product.code;
500 $('#result-list li.distributor__item[data-bitllet-code="' + ticketCode + '"]').each(function () {
501 $(this).find('.list-unit__actions').show();
502
503 var index = $( "#result-list li.distributor__item" ).index( this );
504 $(this).find('.list-unit__actions .button.button--a').attr('data-name-bitllet', product.originalName);
505 $(this).find('.list-unit__actions .button.button--a').attr('data-code', productCode);
506 Analytics.EnhancedEcommerce.addImpression(productCode, product.originalName, ++index, 'Catàleg de bitllets');
507
508
509 });
510
511 }
512
513 for(var pv in productsWithVariants){
514 var productVariants = productsWithVariants[pv];
515 var productParentVariants = productVariants.productParentVariants;
516 for(var ppv in productParentVariants){
517 var productParent = productParentVariants[ppv];
518 var productWVCode = productParent.variantFieldGroupingValue;
519 $('#result-list li.distributor__item[data-bitllet-code="' + productWVCode + '"]').each(function () {
520 $(this).find('.list-unit__actions').show();
521
522 var index = $( "#result-list li.distributor__item" ).index( this );
523 var productVariantLanguages = productParent.parentProductVariantLanguages;
524 for(var pvl in productVariantLanguages){
525 var language = productVariantLanguages[pvl];
526 if(language.languageCode == "CAT"){
527 $(this).find('.list-unit__actions .button.button--a').attr('data-name-bitllet', language.shortName);
528 $(this).find('.list-unit__actions .button.button--a').attr('data-code', productWVCode);
529 Analytics.EnhancedEcommerce.addImpression(productWVCode, language.shortName, ++index, 'Catàleg de bitllets');
530 break;
531 }
532 }
533
534 });
535 }
536 }
537
538 },
539 error : function(error) {
540 console.log(error);
541 }
542 });
543 }
544
545 function loadEcommerce() {
546 jQuery.ajax({
547 url : "${domain}/${ecommerceEndpoint}/v2/business-parameters/versions?equipmentCode=${equipmentCode}&app_id=${api_id}&app_key=${api_key}",
548 type : "GET",
549 dataType: "json",
550 success: function(data) {
551 if(data.length > 0){
552 initCompraOnline(data[0].versionCode);
553 }
554 },
555 error : function(error) {
556 console.log(error);
557 }
558 });
559 }
560
561 $(document).ready(function() {
562 Analytics.EnhancedEcommerce.loadEC();
563
564 loadEcommerce();
565 var allCategoriesAvailabes = $('#f__tipus__abonament option[value != "0"]').clone();
566 $('#tipus_abonament_template').append(allCategoriesAvailabes);
567
568 <#if select_filtreOpt?seq_contains("2") || select_filtreOpt?seq_contains("1")>
569 jsonFilterOptions = JSON.parse('${jsonFilterOptions}');
570
571 $('#f__validesa').change(function() {
572 loadResults();
573 });
574
575 $('#f__tipus__abonament').change(function() {
576 $('#f__validesa option[value != "0"]').remove();
577 var optionValue = $(this).val();
578
579 var tipusBitllet = ${select_filtreOpt?seq_contains("1")?string("true", "false")} ? $('input[name=f__radios__1_cbillets]:checked').val() : 0;
580
581 var valOptions;
582
583 if($('#f__tipus__abonament').val() == 0){
584 $('#f__validesa option[value != "0"]').remove();
585 valOptions = jsonFilterOptions[tipusBitllet].categories[0];
586 } else{
587 valOptions = jsonFilterOptions[tipusBitllet].categories[optionValue];
588 }
589
590 if(valOptions){
591 var validesaOptions= $('#validesaTemplate option').clone();
592 validesaOptions = jQuery.grep(validesaOptions, function(n, i) {
593 return jQuery.inArray(n.value, valOptions.validesa) >= 0;
594 });
595 $('#f__validesa').append(validesaOptions);
596 }
597
598 loadResults();
599
600 });
601
602 $('input[type=radio][name=f__radios__1_validesa]').change(function() {
603 $selectedThirdLevel = true;
604
605 $thirdLevelValue = ${select_filtreOpt?seq_contains("2")?string("true", "false")} ? $('input[name=f__radios__1_validesa]:checked').val() : 0;
606 loadResults();
607
608 var bitlletText = $('input[name=f__radios__1_validesa]:checked').parent().text().trim();
609 $('.filter-third-level span').text(bitlletText);
610 $('.filter-third-level').css("display", "flex");
611 });
612
613 $('input[type=radio][name=f__radios__1_categories]').change(function() {
614 $selectedSecondLevel = true;
615
616 var optionValue = $(this).val();
617 var tipusBitllet = ${select_filtreOpt?seq_contains("1")?string("true", "false")} ? $('input[name=f__radios__1_cbillets]:checked').val() : 0;
618 $secondLevelValue = ${select_filtreOpt?seq_contains("2")?string("true", "false")} ? $('input[name=f__radios__1_categories]:checked').val() : 0;
619
620 if(!$selectedThirdLevel) {
621 $('.choose-validesa').css("display", "flex");
622 } else {
623 $thirdLevelValue = '0';
624 $('#f__validesa_inputs li input').first().prop("checked", true).trigger("click");
625 var bitlletText = $('input[name=f__radios__1_validesa]:checked').parent().text().trim();
626 $('.filter-third-level span').text(bitlletText);
627 $('.filter-third-level').css("display", "flex");
628 }
629
630 loadResults();
631
632 var bitlletText = $('input[name=f__radios__1_categories]:checked').parent().text().trim();
633 $('.filter-second-level span').text(bitlletText);
634
635 $('.filter-second-level').css("display", "flex");
636 if($('input[name=f__radios__1_validesa]:checked').length > 0) $('.filter-third-level').show();
637 else $('.filter-third-level').css("display", "none");
638 });
639
640 $('input[type=radio][name=f__radios__1_cbillets]').change(function() {
641 $selectedFirstLevel = true;
642
643 var tipusBitllet = $(this).val();
644 hideOtherFilters = tipusBitllet != "0" ? true : false;
645 $firstLevelValue = $('input[name=f__radios__1_cbillets]:checked').val();
646 var options = jsonFilterOptions[tipusBitllet].categories;
647
648 $('#f__tipus__abonament_inputs li').each(function(n) {
649 if(options.hasOwnProperty($(this).val())) {
650 $(this).show();
651 } else {
652 if($(this).val() != 0) {
653 $(this).hide();
654 }
655 }
656 });
657
658 if(hideOtherFilters) {
659 deleteFilter('0');
660 loadResults();
661 } else if(!$selectedSecondLevel) {
662 $('.choose-category').css("display", "flex");
663 loadResults();
664 } else {
665 $secondLevelValue = '0';
666 $('#f__tipus__abonament_inputs li input').first().prop("checked", true).trigger("click");
667 $('input[type=radio][name=f__radios__1_categories]').change();
668 }
669
670 var bitlletText = $('input[name=f__radios__1_cbillets]:checked').parent().text().trim();
671 $('.filter-first-level span').text(bitlletText);
672 $('.filter-first-level').css("display", "flex");
673 if($('input[name=f__radios__1_categories]:checked').length > 0) $('.filter-second-level').css("display", "flex");
674 else $('.filter-second-level').css("display", "none");
675 if($('input[name=f__radios__1_validesa]:checked').length > 0) $('.filter-third-level').css("display", "flex");
676 else $('.filter-third-level').css("display", "none");
677 $('.filters-bitllets').css("display", "flex");
678 });
679
680 loadResults();
681
682 function loadResults() {
683 var tipusSelected = ${select_filtreOpt?seq_contains("1")?string("true", "false")} ? $firstLevelValue : null;
684 var grupSelected = ${select_filtreOpt?seq_contains("2")?string("true", "false")} ? $secondLevelValue : null;
685 var categorySelected = ${select_filtreOpt?seq_contains("2")?string("true", "false")} ? $thirdLevelValue : null;
686
687 $('#result-list li.distributor__item').hide();
688 $('#result-list li.distributor__item').removeClass('active');
689
690 if (!tipusSelected) {
691 $('#result-list li.distributor__item').addClass('active');
692 //$('#result-list li.distributor__item').hide();
693 } else {
694 $('#result-list li.distributor__item').each(function () {
695 let tipusValue = $(this).attr("data-filter-bitllet");
696 let grupValue = $(this).attr("data-filter-ticket-type");
697 let categoryValue = $(this).attr("data-filter-validity");
698
699 if(!grupSelected) {
700 if (tipusValue.indexOf(tipusSelected) != -1) {
701 $(this).addClass('active');
702 }
703 } else if(!categorySelected) {
704 if (tipusValue.indexOf(tipusSelected) != -1 && grupValue.indexOf(grupSelected) != -1 ) {
705 $(this).addClass('active');
706 }
707 } else {
708 if (tipusValue.indexOf(tipusSelected) != -1 && grupValue.indexOf(grupSelected) != -1 && (categoryValue.indexOf(categorySelected) != -1 || categorySelected == 0)) {
709 $(this).addClass('active');
710 }
711 }
712 });
713 }
714
715 resetPagination();
716
717 $('.distributor__item').is(":visible") ? $('.result-notfound-tickets').hide() : $('.result-notfound-tickets').show();
718 }
719 </#if>
720 <#if optionURL != "">
721 $('#filterButton').trigger('click');
722 <#assign optionURL = "">
723 </#if>
724
725 $('input[name=f__radios__1_cbillets]').first().parent().removeClass('checked');
726
727 $('.filter-first-level').click(function() {
728 deleteFilter('1');
729 loadResults();
730 });
731 $('.filter-second-level').click(function() {
732 deleteFilter('2');
733 loadResults();
734 });
735 $('.filter-third-level').click(function() {
736 deleteFilter('3');
737 loadResults();
738 });
739 $('.delete-all-filters').click(function() {
740 deleteFilter('1');
741 loadResults();
742 });
743
744 selectFiltersFromURL();
745 });
746
747 function selectFiltersFromURL() {
748 const paramsNames = {
749 "type": [
750 'tipus',
751 'tipo',
752 'type'
753 ],
754 "group": [
755 'grup',
756 'grupo',
757 'group'
758 ],
759 "category": [
760 'categoria',
761 'categoria',
762 'category'
763 ]
764 }
765 const params = getURLParameters(window.location.href);
766 const type = params[paramsNames["type"][0]] || params[paramsNames["type"][1]] || params[paramsNames["type"][2]];
767 const group = params[paramsNames["group"][0]] || params[paramsNames["group"][1]] || params[paramsNames["group"][2]];
768 const category = params[paramsNames["category"][0]] || params[paramsNames["category"][1]] || params[paramsNames["category"][2]];
769
770 let previous = selectElement($(".choose-elements.choose-ticket__type ul li label"), type, true);
771 previous = selectElement($(".choose-elements.choose-category ul li label"), group, previous);
772 selectElement($(".choose-elements.choose-validesa ul li label"), category, previous);
773 }
774
775 function selectElement(element, filter, previous) {
776 let selected = false;
777 if(element && filter && previous) {
778 element.each(function( index ) {
779 if(filter.toLowerCase() === $(this).text().trim().toLowerCase()) {
780 $(this).click();
781 $(this).addClass('checked');
782 selected = true;
783 }
784 });
785 }
786 return selected;
787 }
788
789 function getURLParameters(url) {
790 let params = {};
791 let parser = document.createElement('a');
792 parser.href = url;
793
794 let query = parser.search.substring(1); // Remove the leading '?'
795 let vars = query.split('&');
796
797 for (let i = 0; i < vars.length; i++) {
798 let pair = vars[i].split('=');
799 params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
800 }
801
802 return params;
803 }
804
805 function handleKeyDown(event, type) {
806 if (event.key === "Enter") {
807 event.preventDefault();
808 if(type == "sale") {
809 saleMobilitatUrl(event.target);
810 } else {
811 notSaleMobilitatUrl(event.target);
812 }
813 }
814 }
815
816 function notSaleMobilitatUrl(button) {
817 var product = $('#result-list li.distributor__item[data-bitllet-code="' + $(button).attr("data-titol") + '"]');
818 var index = $( "#result-list li.distributor__item" ).index( product );
819 Analytics.EnhancedEcommerce.addProduct($(button).attr("data-code"), $(button).attr("data-name-bitllet"), ++index, 'Catàleg de bitllets');
820
821 Analytics.Ecommerce.eventPurchase.purchase('JOTMBE / Catàleg de bitllets', $(button).attr("data-name-bitllet"));
822 var ecommerceURL = '${ecommerceDomain}/${lang}/${urlCompra}/'+$(button).attr("data-titol") + '';
823 window.location.href = ecommerceURL;
824 }
825
826 function saleMobilitatUrl(button) {
827 var product = $('#result-list li.distributor__item[data-bitllet-code="' + $(button).attr("data-titol") + '"]');
828 var index = $( "#result-list li.distributor__item" ).index( product );
829 Analytics.EnhancedEcommerce.addProduct($(button).attr("data-code"), $(button).attr("data-name-bitllet"), ++index, 'Catàleg de bitllets');
830
831 Analytics.Ecommerce.eventPurchase.purchase('JOTMBE / Catàleg de bitllets', $(button).attr("data-name-bitllet"));
832 var ecommerceURL = '${ecommerceDomain}/${lang}';
833 window.location.href = ecommerceURL;
834 }
835
836 function loadValidesa(){
837 var valOptions;
838
839 if($('#f__tipus__abonament').val() == 0){
840 $('#f__validesa option[value != "0"]').remove();
841 valOptions = {"validesa":["1","2","3","4","5","6","7","8","9","10","11"]};
842 }
843 else{
844 valOptions = jsonFilterOptions[tipusBitllet].categories[optionValue];
845 }
846
847 if(valOptions){
848 var validesaOptions= $('#validesaTemplate option').clone();
849 validesaOptions = jQuery.grep(validesaOptions, function(n, i) {
850 return jQuery.inArray(n.value, valOptions.validesa) >= 0;
851 });
852 $('#f__validesa').append(validesaOptions);
853 }
854
855 loadResults();
856 }
857 function paginate() {
858 TJS.velocity.paginate(${pagination}, '#result-list li.active');
859 if (TJS.eventPagination >= $('#result-list li.active').length) {
860 $('.load-more').hide();
861 }
862 return false;
863 }
864
865 function resetPagination() {
866 TJS.eventPagination = ${pagination};
867 $('#result-list li.active:lt(' + ${pagination} + ')').show();
868 if ($('#result-list li.active').length <= ${pagination}) {
869 $('.load-more').hide();
870 } else {
871 $('.load-more').show();
872 }
873 }
874
875 function deleteFilter(level) {
876 if(level == 0) {
877 $('.filter-second-level').css("display", "none");
878 $('.filter-third-level').css("display", "none");
879
880 $('input[name=f__radios__1_categories]:checked').parent().removeClass('checked');
881 $('input[name=f__radios__1_categories]:checked').prop('checked', false);
882
883 $('input[name=f__radios__1_validesa]:checked').parent().removeClass('checked');
884 $('input[name=f__radios__1_validesa]:checked').prop('checked', false);
885
886 $secondLevelValue = null;
887 $thirdLevelValue = null;
888
889 $selectedSecondLevel = false;
890 $selectedThirdLevel = false;
891
892 $('.choose-category').css("display", "none");
893 $('.choose-validesa').css("display", "none");
894 }
895 if(level == 1) {
896 $('.filter-first-level').css("display", "none");
897 $('.filter-second-level').css("display", "none");
898 $('.filter-third-level').css("display", "none");
899 $('.filters-bitllets').css("display", "none");
900
901 $('input[name=f__radios__1_cbillets]:checked').parent().removeClass('checked');
902 $('input[name=f__radios__1_cbillets]:checked').prop('checked', false);
903
904 $('input[name=f__radios__1_categories]:checked').parent().removeClass('checked');
905 $('input[name=f__radios__1_categories]:checked').prop('checked', false);
906
907 $('input[name=f__radios__1_validesa]:checked').parent().removeClass('checked');
908 $('input[name=f__radios__1_validesa]:checked').prop('checked', false);
909
910 $firstLevelValue = null;
911 $secondLevelValue = null;
912 $thirdLevelValue = null;
913
914 $selectedFirstLevel = false;
915 $selectedSecondLevel = false;
916 $selectedThirdLevel = false;
917
918 $('.choose-category').css("display", "none");
919 $('.choose-validesa').css("display", "none");
920 } else if(level == 2) {
921 $('.filter-second-level').css("display", "none");
922 $('.filter-third-level').css("display", "none");
923
924 $('input[name=f__radios__1_categories]:checked').parent().removeClass('checked');
925 $('input[name=f__radios__1_categories]:checked').prop('checked', false);
926
927 $('input[name=f__radios__1_validesa]:checked').parent().removeClass('checked');
928 $('input[name=f__radios__1_validesa]:checked').prop('checked', false);
929
930 $secondLevelValue = null;
931 $thirdLevelValue = null;
932
933 $selectedSecondLevel = false;
934 $selectedThirdLevel = false;
935
936 $('.choose-validesa').css("display", "none");
937 } else if(level == 3) {
938 $('.filter-third-level').css("display", "none");
939
940 $('input[name=f__radios__1_validesa]:checked').parent().removeClass('checked');
941 $('input[name=f__radios__1_validesa]:checked').prop('checked', false);
942
943 $thirdLevelValue = null;
944
945 $selectedThirdLevel = false;
946 }
947 };
948
949</script>
Altres bitllets per visitar Barcelona
Et portem a descobrir la ciutat i el seu entorn en els nostres transports turístics.
-
Barcelona Bus Turístic
Visita els llocs, els monuments i les atraccions més emblemàtiques de Barcelona en el bus turístic oficial. -
Catalunya Bus Turístic
Excursions guiades per apropar-te a Montserrat, conèixer l’art de Dalí, viure Girona o fer les millors compres. -
Telefèric de Montjuïc
Puja a la muntanya de Montjuïc a través de 750 metres de recorregut per l’aire. mentre contemples tota la ciutat.
Et pot interessar
Tota la informació que necessites sobre els bitllets per viatjar amb transport públic a Barcelona i l'àrea metropolitana.
-
Reducció de tarifes
Coneix la reducció dels preus dels títols de transport i valora quin títol et convé més. -
T-mobilitat
Mou-te de forma intel·ligent en transport públic. -
Mapa de zones
L’àmbit geogràfic del Sistema Tarifari Integrat de l’àrea de Barcelona inclou 296 municipis distribuïts en zones. -
Condicions d'ús dels bitllets
Guia d’ús dels títols per viatjar amb metro i bus a Barcelona. -
Punts de venda
On pots comprar els bitllets de transport públic? -
Compra de billets online
Pots comprar els bitllets i abonaments d’una manera ràpida i còmoda a través del web o de TMB App. -
Validació amb targeta bancària
Compra i valida el bitllet senzill de bus en un sol pas amb la targeta bancària.
Gestiona la T-mobilitat amb TMB App, l'#AppQueEtPorta!
Amb la nova TMB App tens tot el transport públic en una sola app. A més, pots comprar, recarregar i fer totes les gestions de la T-mobilitat. Deixa't portar per TMB App. Descarrega-te-la!

Tanca
© OpenStreetMap contributors