made parsing of get parameters more robust

This commit is contained in:
DennisSchiefer 2012-04-11 22:59:41 +02:00
parent 888a5d04c8
commit 252c234221

View File

@ -31,7 +31,7 @@ OSRM.init = function() {
OSRM.Routing.init(); OSRM.Routing.init();
// check if the URL contains some GET parameter, e.g. for showing a route // check if the URL contains some GET parameter, e.g. for showing a route
OSRM.checkURL(); OSRM.parseParameters();
}; };
@ -108,8 +108,8 @@ OSRM.prefetchIcons = function() {
}; };
// parse URL GET parameters if any exist //parse URL GET parameters
OSRM.checkURL = function(){ OSRM.parseParameters = function(){
var called_url = document.location.search.substr(1,document.location.search.length); var called_url = document.location.search.substr(1,document.location.search.length);
// reject messages that are clearly too long or too small // reject messages that are clearly too long or too small
@ -117,11 +117,7 @@ OSRM.checkURL = function(){
return; return;
// storage for parameter values // storage for parameter values
var positions = []; var params = {};
var zoom = null;
var center = null;
var destination = null;
var destination_name = null;
// parse input // parse input
var splitted_url = called_url.split('&'); var splitted_url = called_url.split('&');
@ -142,68 +138,71 @@ OSRM.checkURL = function(){
var coordinates = unescape(name_val[1]).split(','); var coordinates = unescape(name_val[1]).split(',');
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) ) if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
return; return;
positions.push ( new L.LatLng( coordinates[0], coordinates[1]) ); params.positions = params.positions || [];
params.positions.push ( new L.LatLng( coordinates[0], coordinates[1]) );
} }
else if(name_val[0] == 'dest') { else if(name_val[0] == 'dest') {
var coordinates = unescape(name_val[1]).split(','); var coordinates = unescape(name_val[1]).split(',');
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) ) if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
return; return;
destination = new L.LatLng( coordinates[0], coordinates[1]); params.destination = new L.LatLng( coordinates[0], coordinates[1]);
} }
else if(name_val[0] == 'destname') { else if(name_val[0] == 'destname') {
destination_name = decodeURI(name_val[1]).replace(/<\/?[^>]+(>|$)/g ,""); // discard tags params.destination_name = decodeURI(name_val[1]).replace(/<\/?[^>]+(>|$)/g ,""); // discard tags
} }
else if(name_val[0] == 'z') { else if(name_val[0] == 'z') {
zoom = name_val[1]; var zoom_level = Number(name_val[1]);
if( zoom<0 || zoom > 18) if( zoom_level<0 || zoom_level > 18)
return; return;
params.zoom = zoom;
} }
else if(name_val[0] == 'center') { else if(name_val[0] == 'center') {
var coordinates = unescape(name_val[1]).split(','); var coordinates = unescape(name_val[1]).split(',');
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) ) if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
return; return;
center = new L.LatLng( coordinates[0], coordinates[1]); params.center = new L.LatLng( coordinates[0], coordinates[1]);
} }
} }
// case 1: destination given // case 1: destination given
if( destination != undefined ) { if( params.destination ) {
var index = OSRM.G.markers.setTarget( destination.latlng ); var index = OSRM.G.markers.setTarget( params.destination.latlng );
if( destination_name == null ) if( params.destination_name )
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG ); document.getElementById("gui-input-target").value = params.destination_name;
else else
document.getElementById("gui-input-target").value = destination_name; OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
OSRM.G.markers.route[index].show(); OSRM.G.markers.route[index].show();
OSRM.G.markers.route[index].centerView(); OSRM.G.markers.route[index].centerView();
return; return;
} }
// case 2: locations given // case 2: locations given
if( positions.length > 0) { if( params.positions ) {
// draw via points // draw via points
if( positions.length > 0) { if( params.positions.length > 0 ) {
OSRM.G.markers.setSource( positions[0] ); OSRM.G.markers.setSource( params.positions[0] );
OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG ); OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
} }
if(positions.length > 1) { if( params.positions.length > 1 ) {
OSRM.G.markers.setTarget( positions[positions.length-1] ); OSRM.G.markers.setTarget( params.positions[params.positions.length-1] );
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG ); OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
} }
for(var i=1; i<positions.length-1;i++) for(var i=1; i<params.positions.length-1;i++)
OSRM.G.markers.setVia( i-1, positions[i] ); OSRM.G.markers.setVia( i-1, params.positions[i] );
for(var i=0; i<OSRM.G.markers.route.length;i++) for(var i=0; i<OSRM.G.markers.route.length;i++)
OSRM.G.markers.route[i].show(); OSRM.G.markers.route[i].show();
// center on route (support for old links) / move to given view (new behaviour) // center on route (support for old links) / move to given view (new behaviour)
if(zoom == null || center == null) { if( params.zoom == null || params.center == null ) {
var bounds = new L.LatLngBounds( positions ); var bounds = new L.LatLngBounds( params.positions );
OSRM.G.map.fitBoundsUI( bounds ); OSRM.G.map.fitBoundsUI( bounds );
} else { } else {
OSRM.G.map.setView(center, zoom); OSRM.G.map.setView(params.center, params.zoom);
} }
// compute route // compute route
OSRM.Routing.getRoute(); OSRM.Routing.getRoute();
return;
} }
// default case: do nothing // default case: do nothing