Get all the information with the TMB App
Download it now!
Metro network status
Up-to-date information on alterations in the metro network so that you can better plan your journey.
An error occurred while processing the template.
The following has evaluated to null or missing: ==> request.theme [in template "20155#20195#24514" at line 141, column 68] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${request.theme - display.path - them... [in template "20155#20195#24514" at line 141, column 66] ----
1<#assign group = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService").getGroup(groupId)>
2<#assign domain = group.getExpandoBridge().getAttribute("MAPS_TMB_DOMAIN")>
3<#assign api_id = group.getExpandoBridge().getAttribute("API_ID")>
4<#assign api_key = group.getExpandoBridge().getAttribute("API_KEY")>
5
6<#assign images_folder = themeDisplay.getPathThemeImages()>
7<#assign block = 1>
8<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
9
10<#assign portletPreferenceService = serviceLocator.findService("com.liferay.portal.kernel.service.PortletPreferencesLocalService")>
11<#assign portletPreferences = portletPreferenceService.getPortletPreferences(getterUtil.getLong(themeDisplay.getPlid()), themeDisplay.getPortletDisplay().getId())>
12<#assign portletPreferenceValueService = serviceLocator.findService("com.liferay.portal.kernel.service.PortletPreferenceValueLocalService")>
13<#assign preferences1 = portletPreferenceValueService.getPreferences(portletPreferences[0])>
14
15<#assign URLPlid1 = preferences1.getValue("URLPlid1", "")!"">
16<#assign URLPlid2 = preferences1.getValue("URLPlid2", "")!"">
17<#attempt>
18 <#assign URLPlid1Layout = layoutLocalService.getLayout(getterUtil.getLong(URLPlid1))!"">
19 <#assign URLPlid1Friendly = URLPlid1Layout.getFriendlyURL(locale) >
20<#recover>
21 <#assign URLPlid1Layout = "">
22 <#assign URLPlid1Friendly = "">
23</#attempt>
24<#attempt>
25 <#assign URLPlid2Layout = layoutLocalService.getLayout(getterUtil.getLong(URLPlid2))>
26 <#assign URLPlid2Friendly = URLPlid2Layout.getFriendlyURL(locale) >
27<#recover>
28 <#assign URLPlid2Layout = "">
29 <#assign URLPlid2Friendly = "">
30</#attempt>
31
32<#assign metroURL = "-/lineametro">
33<#-- ---------- Date ---------- ##
34-->
35<div class="last-update">
36 <p class="last-update__text">
37 <@liferay.language key="xarxa.bus.time"/>
38 <span id="current_date">
39 ...</span>
40 </p>
41 <a href="#" onclick="location.reload();" class="last-update__update button button--update" >
42 <@liferay.language key="label.update"/>
43 </a>
44</div>
45<div class="content content--featured">
46 <p>
47 ${text.getData()}</p>
48</div>
49<div class="line-status__header">
50 <ul class="line-status__header__items">
51 <li class="line-status__header__item line-status__header__item--traffic">
52 <@liferay.language key="network.traffic"/>
53 </li>
54 <li class="line-status__header__item line-status__header__item--stations">
55 <@liferay.language key="network.stations"/>
56 </li>
57 </ul>
58</div>
59<div class="accordion accordion--standard accordion--metro status--metro js-accordion" role="tablist">
60 <#attempt>
61 <#assign jObjectLiniesMetro = jsonFactoryUtil.createJSONObject(serviceTool.getLiniesMetro(groupId))>
62 <#assign features = jObjectLiniesMetro.getString("features")>
63 <#recover>
64 <#assign features = "">
65 </#attempt>
66 <#assign jLiniesMetro = jsonFactoryUtil.createJSONArray(features)>
67 <#assign num = jLiniesMetro.length()-1>
68 <#if (jLiniesMetro.length()>0)>
69 <#foreach i in 0..num>
70 <#assign linie = jsonFactoryUtil.createJSONObject(jLiniesMetro.getString(i))>
71 <#assign properties = jsonFactoryUtil.createJSONObject(linie.getString("properties"))>
72 <!-- ${properties.getString("NOM_LINIA")} -->
73 <h2 class="js-accordion__title" id="acc-line-${properties.getString("NOM_LINIA")}-title">
74 <span class="line-status__item">
75 <span class="line-status__item__name">
76 <#assign suffix = properties.getString("NOM_LINIA")?split("9")>
77 <#assign suffix_10 = properties.getString("NOM_LINIA")?split("10")>
78 <#if (suffix?size>1) && properties.getString("ORDRE_FAMILIA") == "1">
79 <span class="line line--suffixed line--l9">
80 <span class="line__name">
81 L9</span>
82 <span class="line__suffix">
83 ${suffix[1]}</span>
84 </span>
85 <#elseif (suffix_10?size>1) && properties.getString("ORDRE_FAMILIA") == "1">
86 <span class="line line--suffixed line--l10">
87 <span class="line__name">
88 L10</span>
89 <span class="line__suffix">
90 ${suffix_10[1]}</span>
91 </span>
92 <#else>
93 <span class="line line--${properties.getString("NOM_LINIA")?lower_case}">
94 ${properties.getString("NOM_LINIA")}</span>
95 </#if>
96 <span class="line-access__item__text">
97 ${properties.getString("ORIGEN_LINIA")} / ${properties.getString("DESTI_LINIA")}</span>
98 </span>
99 <span class="line-status__item__alerts" id="acc-status-linia-${properties.getString("CODI_LINIA")}">
100 <!-- Eliminar nom?<img>
101 (mantenint <span>
102 ) quan no es vulgui mostrar icona -->
103 <span class="line-status__item__alerts__item">
104 </span>
105 <!-- Eliminar nom?<img>
106 (mantenint <span>
107 ) quan no es vulgui mostrar icona -->
108 <span class="line-status__item__alerts__item line-status__item__alerts__item--stations">
109 </span>
110 </span>
111 </span>
112 </h2>
113 <div class="js-accordion__content">
114 <div class="line-status__block" id="acc-block1--${properties.getString("CODI_LINIA")}">
115 <h3 class="line-status__title">
116 <@liferay.language key="network.traffic"/>
117 </h3>
118 </div>
119 <div class="line-status__block" id="acc-block2--${properties.getString("CODI_LINIA")}">
120 <h3 class="line-status__title">
121 <@liferay.language key="network.stations"/>
122 </h3>
123 </div>
124 <div class="line-status__block">
125 <ul class="list list--links u-content--right">
126 <li class="list__item">
127 <a class="list__label" href="/${locale.getLanguage()}${URLPlid1Friendly}/${metroURL}/${properties.getString("NOM_LINIA")}" >
128 <@liferay.language key="label.view.line"/>
129 </a>
130 </li>
131 </ul>
132 </div>
133 </div>
134 <!-- ${properties.getString("NOM_LINIA")} -->
135 <#assign block = block + 1>
136 </#foreach>
137 <#else>
138 <div class="notification notification--inline notification--warning service-bus-error" role="alert">
139 <div class="notification__container">
140 <div class="notification__text">
141 <img class="notification__icon" src="${request.theme-display.path-theme-images}/basic/24px/svg/alert_yellow_big.svg" alt="">
142 <p>
143 <@liferay.language key="error.metro.api-not-available"/>
144 </p>
145 </div>
146 </div>
147 </div>
148
149 </#if>
150 </div>
151 <#if metroFormLink?has_content && metroFormLink.data?has_content && metroFormLink.link.data?has_content>
152 <div class="primary__cta">
153 <a href="${metroFormLink.link.friendlyUrl}" class="button button--a">
154 ${metroFormLink.getData()}</a>
155 </div>
156 </#if>
157<script type="text/javascript">
158
159 var lineCode_AllLines = "ALL";
160 var type_NoData = "NO_DATA";
161 var type_Traffic = "TRAFFIC";
162 var type_Infrastructure= "INFRASTRUCTURE";
163 var anchor = window.location.hash.substring(1);
164
165 $(document).ready(function() {
166 try {
167 var anchorElement = $('#acc-line-' + anchor + '-title');
168 if (anchorElement.length == 1) {
169 anchorElement.addClass("is-expanded");
170 anchorElement.click();
171 $(document.body).scrollTop(anchorElement.offset().top);
172 }
173 } catch(e) {}
174
175 getStatusXarxa();
176
177 // Analytics
178 $(".status--metro .js-accordion__title").click(function() {
179 if ($(this).hasClass("is-expanded")) {
180 var line = $(this).attr("id").split("-");
181 if (line && line[2]) Analytics.Metro.eventStatus(line[2]);
182 }
183 });
184 })
185
186 function getStatusXarxa() {
187 //URI status xarxa
188 jQuery.ajax({
189 url: "${domain}/alerts/metro/channels/WEB?app_id=${api_id}&app_key=${api_key}",
190 type: "GET",
191 dataType: "json",
192 async: true,
193 success: function(data) {
194 setStatusXarxa(data);
195 },
196 error: function(){
197 var notificationTextLinia =
198 '<img src="${images_folder}/basic/12px/svg/circle_grey.svg" alt=""/> <@liferay.language key="network.service.no.info"/>';
199
200 $(".line-status__item__alerts").html(
201 '<span class="line-status__item__alerts__item">'+ notificationTextLinia +'</span>'
202 +'<span class="line-status__item__alerts__item line-status__item__alerts__item--stations"></span>');
203 }
204 });
205 }
206
207 function setStatusXarxa(dataStatus) {
208 var svc;
209 var html;
210 //Initialize l?es metro
211 $(".accordion.accordion--standard.accordion--metro.status--metro.js-accordion").children().each(function() {
212 $(this).find(".line-status__item__alerts__item").html(' ');
213 $(this).find(".line-status__item__alerts__item").first().html('<img src = "${images_folder}/basic/12px/svg/circle_green.svg" alt=""> <@liferay.language key="network.service.normal"/>');
214 });
215
216 var mesgCir = "<@liferay.language key="xarxa.altered.traffic"/>";
217 var mesgSta = "<@liferay.language key="xarxa.altered.stations"/>";
218
219 $(".js-accordion__content").each(function() {
220 $(this).children().first().find("p").remove();
221 html = $(this).children().first().html();
222 $(this).children().first().html(html + '<p class="line-status__status"><img src="${images_folder}/basic/12px/svg/circle_green.svg" alt=""> <@liferay.language key="network.service.normal"/></p><p class="status-normal">'+mesgCir+'</p>');
223
224 $(this).children().first().next().find("p").remove();
225 html = $(this).children().first().next().html();
226 $(this).children().first().next().html(html + '<p class="line-status__status"> <@liferay.language key="network.service.normal"/></p><p class="status-normal">'+mesgSta+'</p>');
227
228 });
229
230 //Update status
231 for(var j = 0; j < dataStatus.data.alerts.length; j++) {
232 var altCode = dataStatus.data.alerts[j].effect.code;
233 var entities = dataStatus.data.alerts[j].entities;
234 var publications = dataStatus.data.alerts[j].publications;
235 var title = getAlertTitle(altCode);
236 var circColor = getAlertCircColor(dataStatus.data.alerts[j].effect.status);
237 var statColor = getAlertStatColor(altCode);
238
239 for (var k = 0; k < entities.length; k++) {
240 var isFirst = true;
241 for (var i = 0; i < publications.length; i++) {
242 var text;
243 var url;
244 var begin = publications[i].begin_date;
245 var end = publications[i].end_date;
246 var line_code = entities[k].line_code;
247 var alert = dataStatus.data.alerts[j];
248 var stationName = '';
249 var availableCodes = ['NP4','NP5','NP6','NP7','NP8','PP8','PP9','NP10','NP11','NP13','MANUAL','CC','DM','ME','MC','PP2','PP3','PP4','PP6','PP7','NN'];
250 if( isActive(begin, end) ) {
251 if( isFirst ) {
252 //new changes
253 if ( alert.effect.type == type_NoData) {
254 if (line_code == lineCode_AllLines) {
255 $(".accordion.accordion--standard.accordion--metro.status--metro.js-accordion").children().each(function() {
256 $(this).find(".line-status__item__alerts__item").first().html('<img src = "${images_folder}/basic/12px/svg/circle_'+circColor+'.svg" alt=""> '+title);
257 });
258
259 $(".js-accordion__content").each(function() {
260 $(this).children().first().find("p").remove();
261 var html = $(this).children().first().html();
262 $(this).children().first().html(html + '<p class="line-status__status"><img src="${images_folder}/basic/12px/svg/circle_'+circColor+'.svg" alt=""> '+title+'</p>');
263 });
264 }
265 }
266 else if( alert.effect.type == type_Traffic) {
267 $("#acc-status-linia-"+line_code).children().first()
268 .html('<img src = "${images_folder}/basic/12px/svg/circle_'+circColor+'.svg" alt=""> '+title);
269 $("#acc-block1--"+line_code).find(".status-normal").remove();
270 $("#acc-block1--"+line_code+" .line-status__status").html('<img src="${images_folder}/basic/12px/svg/circle_'+circColor+'.svg" alt=""> '+title);
271 }
272 else if( alert.effect.type == type_Infrastructure) {
273 $("#acc-status-linia-"+line_code).children().first().next()
274 .html('<img src="${images_folder}/basic/12px/svg/alert_'+statColor+'.svg" alt="">');
275 $("#acc-block2--"+line_code).find(".status-normal").remove();
276 $("#acc-block2--"+line_code+" .line-status__status").html('<img src="${images_folder}/basic/12px/svg/alert_'+statColor+'.svg" alt=""> '+title+'</p>');
277 }
278 isFirst = false;
279 }
280 if ("${locale}" == "ca_ES") {
281 text = alert.publications[i].textCa;
282 url = alert.urlCa;
283 } else if ("${locale}" == "es_ES") {
284 text = alert.publications[i].textEs;
285 url = alert.urlEs;
286 } else {
287 text = alert.publications[i].textEn;
288 url = alert.urlEn;
289 }
290
291 text = text.replace(/\r\n?|\n/g, '<br />');
292
293 var a = new Date(alert.disruption_dates[i].begin_date);
294 var date = ('0' + a.getDate()).slice(-2) + "." + ('0' + (a.getMonth() + 1)).slice(-2) + "." + a.getFullYear();
295 if(alert.entities[i].station_name !== undefined && alert.entities[i].station_name !== null){
296 if(availableCodes.indexOf(alert.effect.code) > -1){
297 stationName = alert.entities[i].station_name + '. ';
298 }
299 }
300 if( alert.effect.type == "TRAFFIC" && $("#alert-"+line_code+"-"+alert.id).length == 0) {
301 $("#acc-block1--"+line_code).append('<div id="alert-'+line_code+'-'+alert.id+'"><h4 class="line-status__subtitle">' + stationName + '<@liferay.language key="label.alert.from.day"/> '+date+'</h4><p class="line-status__content">'+text+'</p></div>');
302 if(url !== undefined) $("#acc-block1--"+line_code).append('<div class="primary__block-extra"><ul class="list list--links-a u-content--right"><li class="list__item"><a href="'+url+'"><@liferay.language key="network.service.alteration.info"/></a></li></ul></div>');
303 } else if( alert.effect.type == "INFRASTRUCTURE" ) {
304 $("#acc-block2--"+line_code).append('<h4 class="line-status__subtitle">' + stationName + '<@liferay.language key="label.alert.from.day"/> '+date+'</h4><p class="line-status__content">'+text+'</p>');
305 if(url !== undefined) $("#acc-block2--"+line_code).append('<div class="primary__block-extra"><ul class="list list--links-a u-content--right"><li class="list__item"><a href="'+url+'"><@liferay.language key="network.service.alteration.info"/></a></li></ul></div>');
306 }
307 }
308 }
309 }
310 }
311 }
312
313 function getAlertTitle(code) {
314 if(code == "PP1" || code == "NP3") return "<@liferay.language key="network.service.partial"/>";
315 else if(code == "PP2" || code == "PP3" || code == "PP4" || code == "PP6" || code == "PP7" || code == "PP8" ||
316 code == "PP9" || code == "NP4" || code == "NP5" || code == "NP6" || code == "NP7" || code == "NP8") return "<@liferay.language key="network.service.alteration"/>";
317 else if(code == "PP5" || code == "PP10") return "<@liferay.language key="network.service.without.service"/>";
318 else if(code == "PP11" || code == "NP12") return "<@liferay.language key="network.service.service.altered"/>";
319 else if(code == "PP99") return "<@liferay.language key="network.service.no.info"/>";
320 else if(code == "NP1" || code == "NP2" || code == "NP9") return "<@liferay.language key="network.service.stoped"/>";
321 else return <@liferay.language key="xarxa.altered.station"/>;
322 }
323
324 function getAlertCircColor(status) {
325 if( status == "SEVERE" || status == "CRITICAL" ) return "red";
326 else if( status == "WARNING") return "yellow";
327 else if( status == "NO_DATA" ) return "grey";
328 else return "";
329 }
330
331 function getAlertStatColor(code) {
332 if(code == "NP5") return "red";
333 else if(code == "PP2" || code == "PP3" || code == "PP4" || code == "PP6" || code == "PP7"
334 || code == "PP8" || code == "PP9" || code == "NP4" || code == "NP6" || code == "NP7"
335 || code == "NP8" || code == "PP99") return "yellow";
336 else return "";
337 }
338
339 function isActive(start, end) {
340 var date = new Date().getTime();
341 if((start <= date && date <= end) || end==null) return true;
342 else return false;
343 }
344
345 var d = new Date();
346 var minutes = d.getMinutes()+"";
347 if(minutes.length == 1){
348 minutes = "0"+minutes;
349 }
350 $('#current_date').html(d.getHours() + ":" + minutes + " " + d.getDate() + "/" + (d.getMonth()+1) + "/" + d.getFullYear());
351
352</script>