| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 'use strict' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const parseDateTime = require('./date-time') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const clone = obj => Object.assign({}, obj) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createParseJourneyPart = (profile, stations, lines, remarks) => { | 
					
						
							|  |  |  | 	// todo: finish parse/remark.js first
 | 
					
						
							|  |  |  | 	const applyRemark = (j, rm) => {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// todo: pt.sDays
 | 
					
						
							|  |  |  | 	// todo: pt.dep.dProgType, pt.arr.dProgType
 | 
					
						
							|  |  |  | 	// todo: what is pt.jny.dirFlg?
 | 
					
						
							|  |  |  | 	// todo: how does pt.freq work?
 | 
					
						
							| 
									
										
										
										
											2017-12-12 03:28:54 +01:00
										 |  |  | 	// todo: what is pt.himL?
 | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 	const parseJourneyPart = (j, pt) => { // j = journey, pt = part
 | 
					
						
							| 
									
										
										
										
											2017-12-11 17:21:50 +01:00
										 |  |  | 		const dep = profile.parseDateTime(profile, j.date, pt.dep.dTimeR || pt.dep.dTimeS) | 
					
						
							|  |  |  | 		const arr = profile.parseDateTime(profile, j.date, pt.arr.aTimeR || pt.arr.aTimeS) | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 		const res = { | 
					
						
							|  |  |  | 			origin: clone(stations[parseInt(pt.dep.locX)]) || null, | 
					
						
							|  |  |  | 			destination: clone(stations[parseInt(pt.arr.locX)]), | 
					
						
							| 
									
										
										
										
											2017-12-11 17:21:50 +01:00
										 |  |  | 			departure: dep.toISO(), | 
					
						
							|  |  |  | 			arrival: arr.toISO() | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (pt.dep.dTimeR && pt.dep.dTimeS) { | 
					
						
							| 
									
										
										
										
											2017-12-11 17:21:50 +01:00
										 |  |  | 			const realtime = profile.parseDateTime(profile, j.date, pt.dep.dTimeR) | 
					
						
							|  |  |  | 			const planned = profile.parseDateTime(profile, j.date, pt.dep.dTimeS) | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 			res.delay = Math.round((realtime - planned) / 1000) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (pt.type === 'WALK') { | 
					
						
							|  |  |  | 			res.mode = 'walking' | 
					
						
							| 
									
										
										
										
											2017-12-12 03:28:54 +01:00
										 |  |  | 			res.public = true | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 		} else if (pt.type === 'JNY') { | 
					
						
							| 
									
										
										
										
											2017-12-12 03:28:54 +01:00
										 |  |  | 			// todo: pull `public` value from `profile.products`
 | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 			res.id = pt.jny.jid | 
					
						
							|  |  |  | 			res.line = lines[parseInt(pt.jny.prodX)] || null | 
					
						
							|  |  |  | 			res.direction = profile.parseStationName(pt.jny.dirTxt) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (pt.dep.dPlatfS) res.departurePlatform = pt.dep.dPlatfS | 
					
						
							|  |  |  | 			if (pt.arr.aPlatfS) res.arrivalPlatform = pt.arr.aPlatfS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (pt.jny.stopL) { | 
					
						
							| 
									
										
										
										
											2017-12-12 03:28:54 +01:00
										 |  |  | 				const parse = profile.parseStopover(profile, stations, lines, remarks, j) | 
					
						
							|  |  |  | 				res.passed = pt.jny.stopL.map(parse) | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			if (Array.isArray(pt.jny.remL)) { | 
					
						
							|  |  |  | 				for (let remark of pt.jny.remL) applyRemark(j, remark) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (pt.jny.freq && pt.jny.freq.jnyL) { | 
					
						
							|  |  |  | 				const parseAlternative = (a) => { | 
					
						
							| 
									
										
										
										
											2017-12-12 03:28:54 +01:00
										 |  |  | 					const t = a.stopL[0].dTimeS || a.stopL[0].dTimeR | 
					
						
							|  |  |  | 					const when = profile.parseDateTime(profile, j.date, t) | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 					return { | 
					
						
							|  |  |  | 						line: lines[parseInt(a.prodX)] || null, | 
					
						
							| 
									
										
										
										
											2017-12-11 17:21:50 +01:00
										 |  |  | 						when: when.toISO() | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				res.alternatives = pt.jny.freq.jnyL | 
					
						
							|  |  |  | 				.filter(a => a.stopL[0].locX === pt.dep.locX) | 
					
						
							|  |  |  | 				.map(parseAlternative) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-07 20:21:14 +01:00
										 |  |  | 		// todo: follow public-transport/friendly-public-transport-format#27 here
 | 
					
						
							|  |  |  | 		// see also derhuerst/vbb-rest#19
 | 
					
						
							|  |  |  | 		if (pt.arr.dCncl && pt.dep.dCncl) { | 
					
						
							|  |  |  | 			result.cancelled = true | 
					
						
							|  |  |  | 			result.departure = result.departurePlatform = null | 
					
						
							|  |  |  | 			result.arrival = result.arrivalPlatform = null | 
					
						
							|  |  |  | 			result.delay = null | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-20 15:43:13 +01:00
										 |  |  | 		return res | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return parseJourneyPart | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = createParseJourneyPart |