00ef24d6fb3f8d8ea6c2b5db6e73529e79a7efdf
[rails.git] / app / assets / javascripts / index / directions / osrm.js
1 // OSRM car engine
2 // Doesn't yet support hints
3
4 function OSRMEngine() {
5   var previousPoints, hintData;
6
7   return {
8     id: "osrm_car",
9     creditline: '<a href="http://project-osrm.org/" target="_blank">OSRM</a>',
10     draggable: true,
11
12     getRoute: function (points, callback) {
13       var TURN_INSTRUCTIONS = [
14         "",
15         I18n.t('javascripts.directions.instructions.continue_on'),      // 1
16         I18n.t('javascripts.directions.instructions.slight_right'),     // 2
17         I18n.t('javascripts.directions.instructions.turn_right'),       // 3
18         I18n.t('javascripts.directions.instructions.sharp_right'),      // 4
19         I18n.t('javascripts.directions.instructions.uturn'),            // 5
20         I18n.t('javascripts.directions.instructions.sharp_left'),       // 6
21         I18n.t('javascripts.directions.instructions.turn_left'),        // 7
22         I18n.t('javascripts.directions.instructions.slight_left'),      // 8
23         I18n.t('javascripts.directions.instructions.via_point'),        // 9
24         I18n.t('javascripts.directions.instructions.follow'),           // 10
25         I18n.t('javascripts.directions.instructions.roundabout'),       // 11
26         I18n.t('javascripts.directions.instructions.leave_roundabout'), // 12
27         I18n.t('javascripts.directions.instructions.stay_roundabout'),  // 13
28         I18n.t('javascripts.directions.instructions.start'),            // 14
29         I18n.t('javascripts.directions.instructions.destination'),      // 15
30         I18n.t('javascripts.directions.instructions.against_oneway'),   // 16
31         I18n.t('javascripts.directions.instructions.end_oneway')        // 17
32       ];
33
34       var url = "http://router.project-osrm.org/viaroute?z=14&output=json&instructions=true";
35
36       for (var i = 0; i < points.length; i++) {
37         url += "&loc=" + points[i].lat + ',' + points[i].lng;
38         if (hintData && previousPoints && previousPoints[i].equals(points[i])) {
39           url += "&hint=" + hintData.locations[i];
40         }
41       }
42
43       if (hintData && hintData.checksum) {
44         url += "&checksum=" + hintData.checksum;
45       }
46
47       $.ajax({
48         url: url,
49         dataType: 'json',
50         success: function (data) {
51           if (data.status == 207)
52             return callback(true);
53
54           previousPoints = points;
55           hintData = data.hint_data;
56
57           var line = L.PolylineUtil.decode(data.route_geometry, {
58             precision: 6
59           });
60
61           var steps = [];
62           for (i = 0; i < data.route_instructions.length; i++) {
63             var s = data.route_instructions[i];
64             var linesegend;
65             var instCodes = s[0].split('-');
66             var instText = "<b>" + (i + 1) + ".</b> ";
67             instText += TURN_INSTRUCTIONS[instCodes[0]];
68             if (instCodes[1]) {
69               instText += "exit " + instCodes[1] + " ";
70             }
71             if (instCodes[0] != 15) {
72               instText += s[1] ? "<b>" + s[1] + "</b>" : I18n.t('javascripts.directions.instructions.unnamed');
73             }
74             if ((i + 1) < data.route_instructions.length) {
75               linesegend = data.route_instructions[i + 1][3] + 1;
76             } else {
77               linesegend = s[3] + 1;
78             }
79             steps.push([line[s[3]], s[0].split('-')[0], instText, s[2], line.slice(s[3], linesegend)]);
80           }
81
82           callback(null, {
83             line: line,
84             steps: steps,
85             distance: data.route_summary.total_distance,
86             time: data.route_summary.total_time
87           });
88         }
89       });
90     }
91   };
92 }
93
94 OSM.Directions.addEngine(OSRMEngine(), false);