|  |  | 
 |  |  |     return ((actual.getTime() - planned.getTime()) / 1000 / 60) + ' min'; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function parseVehicle(vehicleId) { | 
 |  |  |     if(!vehicleId) return; | 
 |  |  |     if(vehicleId.substr(0, 15) != '635218529567218') { | 
 |  |  |         console.log('Unknown vehicle, vehicleId=' + vehicleId); | 
 |  |  |         return; | 
 |  |  |     } | 
 |  |  | 	 | 
 |  |  |     var id = parseInt(vehicleId.substr(15)) - 736; | 
 |  |  |     var prefix; | 
 |  |  |     var type; | 
 |  |  |     var low; // low floor: 0 = no, 1 - semi, 2 - full | 
 |  |  | 	 | 
 |  |  |     if(101 <= id && id <= 173) { | 
 |  |  |         prefix = 'HW'; | 
 |  |  |         type = 'E1'; | 
 |  |  |         low = 0; | 
 |  |  | 		 | 
 |  |  |         if((108 <= id && id <= 113) || id == 127 || id == 131 || id == 132 || id == 134 || (137 <= id && id <= 139) || (148 <= id && id <= 150) || (153 <= id && id <= 166) || id == 161) { | 
 |  |  |             prefix = 'RW'; | 
 |  |  |         } | 
 |  |  |     } else if(201 <= id && id <= 293) { | 
 |  |  |         prefix = 'RZ'; | 
 |  |  |         type = '105Na'; | 
 |  |  |         low = 0; | 
 |  |  | 		 | 
 |  |  |         if(246 <= id) { | 
 |  |  |             prefix = 'HZ'; | 
 |  |  |         } | 
 |  |  |         if(id == 290) { | 
 |  |  |             type = '105Nb'; | 
 |  |  |         } | 
 |  |  |     } else if(301 <= id && id <= 328) { | 
 |  |  |         prefix = 'RF'; | 
 |  |  |         type = 'GT8S'; | 
 |  |  |         low = 0; | 
 |  |  | 		 | 
 |  |  |         if(id == 313) { | 
 |  |  |             type = 'GT8C' | 
 |  |  |             low = 1; | 
 |  |  |         } | 
 |  |  |     } else if(401 <= id && id <= 440) { | 
 |  |  |         prefix = 'HL'; | 
 |  |  |         type = 'EU8N'; | 
 |  |  |         low = 1; | 
 |  |  |     } else if(451 <= id && id <= 462) { | 
 |  |  |         prefix = 'HK'; | 
 |  |  |         type = 'N8S-NF'; | 
 |  |  |         low = 0; | 
 |  |  | 		 | 
 |  |  |         if((451 <= id && id <= 453) || id == 462) { | 
 |  |  |             type = 'N8C-NF'; | 
 |  |  |             low = 1; | 
 |  |  |         } | 
 |  |  |     } else if(601 <= id && id <= 650) { | 
 |  |  |         prefix = 'RP'; | 
 |  |  |         type = 'NGT6 (3)'; | 
 |  |  |         low = 2; | 
 |  |  | 		 | 
 |  |  |         if(id <= 613) { | 
 |  |  |             type = 'NGT6 (1)'; | 
 |  |  |         } else if (id <= 626) { | 
 |  |  |             type = 'NGT6 (2)'; | 
 |  |  |         } | 
 |  |  |     } else if (801 <= id && id <= 824) { | 
 |  |  |         prefix = 'RY'; | 
 |  |  |         type = 'NGT8'; | 
 |  |  |         low = 2; | 
 |  |  |     } else if (901 <= id && id <= 936) { | 
 |  |  |         prefix = 'RG'; | 
 |  |  |         type = '2014N'; | 
 |  |  |         low = 2; | 
 |  |  | 		 | 
 |  |  |         if(915 <= id) { | 
 |  |  |             prefix = 'HG'; | 
 |  |  |         } | 
 |  |  |     } else if(id === 999) { | 
 |  |  |         prefix = 'HX'; | 
 |  |  |         type = '405N-Kr'; | 
 |  |  |         low = 2; | 
 |  |  |     } else { | 
 |  |  |         console.log('Unknown vehicle, vehicleId=' + vehicleId + ', id=' + id); | 
 |  |  |         return; | 
 |  |  |     } | 
 |  |  | 	 | 
 |  |  |     return { | 
 |  |  |         vehicleId: vehicleId, | 
 |  |  |         prefix: prefix, | 
 |  |  |         id: id, | 
 |  |  |         num: prefix + id, | 
 |  |  |         type: type, | 
 |  |  |         low: low | 
 |  |  |     }; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function displayVehicle(vehicleInfo) { | 
 |  |  |     if(!vehicleInfo) return document.createTextNode(''); | 
 |  |  | 	 | 
 |  |  |     var span = document.createElement('span'); | 
 |  |  |     span.className = 'vehicleInfo'; | 
 |  |  |     span.title = vehicleInfo.num + ' ' + vehicleInfo.type; | 
 |  |  |     if(vehicleInfo.low == 0) { | 
 |  |  |         setText(span, '\u25CB'); | 
 |  |  |         span.title += ' (high floor)'; | 
 |  |  |     } else if(vehicleInfo.low == 1) { | 
 |  |  |         setText(span, '*\u267F'); | 
 |  |  |         span.title += ' (partially low floor)'; | 
 |  |  |     } else if(vehicleInfo.low == 2) { | 
 |  |  |         setText(span, '\u267F'); | 
 |  |  |         span.title += ' (low floor)'; | 
 |  |  |     } | 
 |  |  |     return span; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function deleteChildren(element) { | 
 |  |  |     while(element.lastChild) element.removeChild(element.lastChild); | 
 |  |  | } | 
 |  |  | 
 |  |  |         for(var i = 0, il = data.old.length; i < il; i++) { | 
 |  |  |             var tr = document.createElement('tr'); | 
 |  |  |             addCellWithText(tr, data.old[i].patternText); | 
 |  |  |             addCellWithText(tr, data.old[i].direction); | 
 |  |  |             var dir_cell = addCellWithText(tr, data.old[i].direction); | 
 |  |  |             dir_cell.appendChild(displayVehicle(parseVehicle(data.old[i].vehicleId))); | 
 |  |  |             var status = parseStatus(data.old[i]); | 
 |  |  |             addCellWithText(tr, status); | 
 |  |  |             addCellWithText(tr, ''); | 
 |  |  | 
 |  |  |         for(var i = 0, il = data.actual.length; i < il; i++) { | 
 |  |  |             var tr = document.createElement('tr'); | 
 |  |  |             addCellWithText(tr, data.actual[i].patternText); | 
 |  |  |             addCellWithText(tr, data.actual[i].direction); | 
 |  |  |             var dir_cell = addCellWithText(tr, data.actual[i].direction); | 
 |  |  |             dir_cell.appendChild(displayVehicle(parseVehicle(data.actual[i].vehicleId))); | 
 |  |  |             var status = parseStatus(data.actual[i]); | 
 |  |  |             var status_cell = addCellWithText(tr, status); | 
 |  |  |             var delay = parseDelay(data.actual[i]); |