routing permalink

This commit is contained in:
Norbert Renner 2014-05-15 20:37:17 +02:00
parent 88e4c164c2
commit 136a182539
7 changed files with 234 additions and 12 deletions

View file

@ -58,6 +58,16 @@ BR.NogoAreas = L.Control.Draw.extend({
};
},
setOptions: function(options) {
var nogos = options.nogos;
if (nogos) {
this.drawnItems.clearLayers();
for (var i = 0; i < nogos.length; i++) {
this.drawnItems.addLayer(nogos[i]);
}
}
},
_fireUpdate: function () {
this.fire('update', {options: this.getOptions()});
}

View file

@ -0,0 +1,85 @@
//#include "Permalink.js
// patch to not encode URL (beside 'layer', better readable/hackable, Browser can handle)
L.Control.Permalink.include({
_update_href: function() {
//var params = L.Util.getParamString(this._params);
var params = this.getParamString(this._params);
var sep = '?';
if (this.options.useAnchor) sep = '#';
var url = this._url_base + sep + params.slice(1);
if (this._href) this._href.setAttribute('href', url);
if (this.options.useLocation)
location.replace('#' + params.slice(1));
return url;
},
getParamString: function (obj, existingUrl, uppercase) {
var params = [];
for (var i in obj) {
// do encode layer (e.g. spaces)
if (i === 'layer') {
params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
} else {
params.push(uppercase ? i.toUpperCase() : i + '=' + obj[i]);
}
}
return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
}
});
L.Control.Permalink.include({
initialize_routing: function() {
this.on('update', this._set_routing, this);
this.on('add', this._onadd_routing, this);
},
_onadd_routing: function(e) {
this.options.routingOptions.on('update', this._update_routing, this);
this.options.nogos.on('update', this._update_routing, this);
// waypoint add, move, delete (but last)
this.options.routing.on('routing:routeWaypointEnd', this._update_routing, this);
// delete last waypoint
this.options.routing.on('waypoint:click', function(evt) {
var r = evt.marker._routing;
if (!r.prevMarker && ! r.nextMarker) {
console.log('delete last');
this._update_routing(evt);
}
}, this);
},
_update_routing: function(evt) {
var router = this.options.router,
routing = this.options.routing,
latLngs;
if (evt && evt.options) {
router.setOptions(evt.options);
}
latLngs = routing.getWaypoints();
this._update(router.getUrlParams(latLngs));
},
_set_routing: function(e) {
var router = this.options.router,
routing = this.options.routing,
routingOptions = this.options.routingOptions,
nogos = this.options.nogos;
var opts = router.parseUrlParams(e.params);
router.setOptions(opts);
routingOptions.setOptions(opts);
nogos.setOptions(opts);
if (opts.lonlats) {
routing.draw(false);
routing.clear();
routing.setWaypoints(opts.lonlats);
}
}
});

View file

@ -26,4 +26,47 @@ BR.Routing = L.Routing.extend({
return container;
}
,_removeMarkerEvents: function(marker) {
marker.off('mouseover', this._fireWaypointEvent, this);
marker.off('mouseout' , this._fireWaypointEvent, this);
marker.off('dragstart', this._fireWaypointEvent, this);
marker.off('dragend' , this._fireWaypointEvent, this);
marker.off('drag' , this._fireWaypointEvent, this);
marker.off('click' , this._fireWaypointEvent, this);
}
,clear: function() {
var current = this._waypoints._first;
if (current === null) { return; }
this._removeMarkerEvents(current);
while (current._routing.nextMarker) {
var marker = current._routing.nextMarker;
this._removeMarkerEvents(marker);
current = marker;
};
this._waypoints._first = null;
this._waypoints._last = null;
this._waypoints.clearLayers();
this._segments.clearLayers();
}
,setWaypoints: function(latLngs) {
var $this = this;
var index = 0;
var add = function() {
if (!latLngs || index >= latLngs.length) { return; }
var prev = $this._waypoints._last;
$this.addWaypoint(latLngs[index], prev, null, function(err, m) {
add(++index);
});
};
add();
}
});