Move routing engines into their own files
authorRichard Fairhurst <richard@systemeD.net>
Wed, 22 Jan 2014 09:52:01 +0000 (09:52 +0000)
committerRichard Fairhurst <richard@systemeD.net>
Wed, 22 Jan 2014 09:52:01 +0000 (09:52 +0000)
app/assets/javascripts/index.js
app/assets/javascripts/routing.js.erb
app/assets/javascripts/routing_engines/cloudmade_foot.js [new file with mode: 0644]
app/assets/javascripts/routing_engines/osrm_car.js [new file with mode: 0644]

index a3531eb3060c710eeeb9b36fc40c2dc3cc7e1901..9ddac98a35d5245ddc6921149fc5dc146a37ae2f 100644 (file)
@@ -15,6 +15,7 @@
 //= require index/new_note
 //= require router
 //= require routing
+//= require_tree ./routing_engines
 
 (function() {
   var loaderTimeout;
@@ -348,6 +349,8 @@ $(document).ready(function () {
   });
 
   OSM.routing = OSM.Routing(map,'OSM.routing',$('.query_wrapper.routing'));
+  OSM.routing.addEngines(OSM.RoutingEngines.list);
+  OSM.routing.chooseEngine('Car (OSRM)');
 
   $(".get_directions").on("click",function(e) {
        e.preventDefault();
index 4eb91fc7aaeb826be74cc6df777d8c3a9ccbe2e2..afa15ba4fb36bd3f871b478c7aaea6f0681a34c3 100644 (file)
@@ -7,10 +7,13 @@
        https://github.com/apmon/openstreetmap-website/blob/9755c3ae0a8d0684d43760f91dc864ff42d8477a/app/views/routing/start.js.erb
 
        *** draggable start/end markers
-       *** click each part
        *** translation (including all alerts and presentation)
        *** export GPX
        *** URL history (or do we consciously not want to support that?)
+
+       *** add MapQuest engine
+       *** add YOURS engine
+       *** finish CloudMade engine
 */
 
 var TURN_INSTRUCTIONS=["",
@@ -39,6 +42,11 @@ var ROUTING_POLYLINE={
 };
 
 
+OSM.RoutingEngines={
+       list: []
+       // common functions and constants, e.g. OSRM parser, can go here
+};
+
 OSM.Routing=function(map,name,jqSearch) {
        var r={};
        r.map=map;                              // Leaflet map
@@ -77,9 +85,6 @@ OSM.Routing=function(map,name,jqSearch) {
        
        // Route-fetching UI
 
-       r.selectEngine=function(e) {
-               r.chosenEngine=r.engines[e.target.selectedIndex];
-       };
        r.requestRoute=function() {
                if (r.route_from && r.route_to) {
                        r.chosenEngine.getRoute(true,[r.route_from,r.route_to]);
@@ -147,90 +152,39 @@ OSM.Routing=function(map,name,jqSearch) {
                if (r.polyline) map.removeLayer(r.polyline);
        };
 
-       // Add engines
-       
-       r.engines=[];
-       r.addEngine=function(engine) {
-               // Save engine
-               var i=r.engines.length;
-               engine.subscript=i;
-               r['engine'+i]=engine;
-               r.engines.push(engine);
-
-               // Add generic JSONP function
-               engine.requestJSONP=function(url) {
-                       var script = document.createElement('script');
-                       script.src = url+r.name+".engine"+this.subscript+".gotRoute";
-                       // OSRM doesn't like non-alphanumeric, otherwise we could just do OSM.routing.engines["+engine.subscript+"].gotRoute
-                       document.body.appendChild(script); 
-               };
-
-               // Populate dropdown
-               var select=jqSearch.find('select.routing_engines');
-               select.append("<option value='"+i+"'>"+engine.name+"</option>");
+       // Routing engine handling
+
+       // Add all engines
+       r.addEngines=function(list) {
+               list.sort(function(a,b) { return a.name>b.name; });
+               r.engines=list;
+               var select=r.jqSearch.find('select.routing_engines');
+               for (var i=0; i<list.length; i++) {
+                       // Set up JSONP callback
+                       var engine=r.engines[i];
+                       engine.requestJSONP=function(url) {
+                               var script = document.createElement('script');
+                               script.src = url+r.name+".gotRoute"+this.subscript;
+                               document.body.appendChild(script); 
+                       };
+                       r['gotRoute'+i]=function(data) { engine.gotRoute(r,data); };
+                       select.append("<option value='"+i+"'>"+engine.name+"</option>");
+               }
+               r.chosenEngine=r.engines[0];
        };
-
-       // OSRM car engine
-       // *** this should all be shared from an OSRM library somewhere
-       // *** need to clear hints at some point
-
-       r.addEngine({
-               name: 'Car (OSRM)',
-               draggable: true,
-               _hints: {},
-               getRoute: function(final,points) {
-                       var url="http://router.project-osrm.org/viaroute?z=14&output=json";
-                       for (var i=0; i<points.length; i++) {
-                               var pair=points[i].join(',');
-                               url+="&loc="+pair;
-                               if (this._hints[pair]) url+= "&hint="+this._hints[pair];
-                       }
-                       if (final) url+="&instructions=true";
-                       this.requestJSONP(url+"&jsonp=");
-               },
-               gotRoute: function(data) {
-                       if (data.status==207) {
-                               alert("Couldn't find route between those two places");
-                               return false;
+       // Choose an engine on dropdown change
+       r.selectEngine=function(e) {
+               r.chosenEngine=r.engines[e.target.selectedIndex];
+       };
+       // Choose an engine by name
+       r.chooseEngine=function(name) {
+               for (var i=0; i<r.engines.length; i++) {
+                       if (r.engines[i].name==name) {
+                               r.chosenEngine[i]=r.engines[i];
+                               r.jqSearch.find('select.routing_engines').val(i);
                        }
-                       // *** store hints
-                       var line=L.PolylineUtil.decode(data.route_geometry);
-                       for (i=0; i<line.length; i++) { line[i].lat/=10; line[i].lng/=10; }
-                       r.setPolyline(line);
-                       r.setItinerary(data.route_instructions);
                }
-       });
+       };
 
-       // CloudMade foot engine
-       // *** again, this should be shared from a Cloudmade library somewhere
-       // *** this API key is taken from some example code, not for real live use!
-       
-       r.addEngine({
-               name: 'Foot (CloudMade)',
-               draggable: true,
-               getRoute: function(final,points) {
-                       var url="http://routes.cloudmade.com/8ee2a50541944fb9bcedded5165f09d9/api/0.3/";
-                       var p=[];
-                       for (var i=0; i<points.length; i++) {
-                               p.push(points[i][0]);
-                               p.push(points[i][1]);
-                       }
-                       url+=p.join(',');
-                       url+="/foot.js";
-                       this.requestJSONP(url+"?callback=");
-               },
-               gotRoute: function(data) {
-                       console.log(data);
-                       // *** todo
-                       // *** will require some degree of refactoring because instruction text is pre-assembled
-                       // *** otherwise largely like OSRM (funny that)
-               }
-       });
-       
-       // *** add MapQuest
-       // *** add YOURS
-       // *** move into separate files
-       
-       r.chosenEngine=r.engines[0];
        return r;
 };
diff --git a/app/assets/javascripts/routing_engines/cloudmade_foot.js b/app/assets/javascripts/routing_engines/cloudmade_foot.js
new file mode 100644 (file)
index 0000000..3d047f8
--- /dev/null
@@ -0,0 +1,26 @@
+// CloudMade foot engine
+// *** again, this should be shared from a Cloudmade library somewhere
+// *** this API key is taken from some example code, not for real live use!
+
+OSM.RoutingEngines.list.push({
+       name: 'Foot (CloudMade)',
+       draggable: true,
+       getRoute: function(final,points) {
+               var url="http://routes.cloudmade.com/8ee2a50541944fb9bcedded5165f09d9/api/0.3/";
+               var p=[];
+               for (var i=0; i<points.length; i++) {
+                       p.push(points[i][0]);
+                       p.push(points[i][1]);
+               }
+               url+=p.join(',');
+               url+="/foot.js";
+               this.requestJSONP(url+"?callback=");
+       },
+       gotRoute: function(data) {
+               console.log(data);
+               // *** todo
+               // *** will require some degree of refactoring because instruction text is pre-assembled
+               // *** otherwise largely like OSRM (funny that)
+       }
+});
+
diff --git a/app/assets/javascripts/routing_engines/osrm_car.js b/app/assets/javascripts/routing_engines/osrm_car.js
new file mode 100644 (file)
index 0000000..f0c05a8
--- /dev/null
@@ -0,0 +1,30 @@
+// OSRM car engine
+// *** this should all be shared from an OSRM library somewhere
+// *** need to clear hints at some point
+
+OSM.RoutingEngines.list.push({
+       name: 'Car (OSRM)',
+       draggable: true,
+       _hints: {},
+       getRoute: function(final,points) {
+               var url="http://router.project-osrm.org/viaroute?z=14&output=json";
+               for (var i=0; i<points.length; i++) {
+                       var pair=points[i].join(',');
+                       url+="&loc="+pair;
+                       if (this._hints[pair]) url+= "&hint="+this._hints[pair];
+               }
+               if (final) url+="&instructions=true";
+               this.requestJSONP(url+"&jsonp=");
+       },
+       gotRoute: function(router,data) {
+               if (data.status==207) {
+                       alert("Couldn't find route between those two places");
+                       return false;
+               }
+               // *** store hints
+               var line=L.PolylineUtil.decode(data.route_geometry);
+               for (i=0; i<line.length; i++) { line[i].lat/=10; line[i].lng/=10; }
+               router.setPolyline(line);
+               router.setItinerary(data.route_instructions);
+       }
+});