});
}
+ params = params.concat(Array.prototype.slice.call(arguments, 2));
+
return (controller[action] || $.noop).apply(controller, params);
};
var routes = [];
for (var r in rts)
- routes.push(Route(r, rts[r]));
+ routes.push(new Route(r, rts[r]));
routes.recognize = function(path) {
for (var i = 0; i < this.length; i++) {
if (window.history && window.history.pushState) {
$(window).on('popstate', function(e) {
if (!e.originalEvent.state) return; // Is it a real popstate event or just a hash change?
- var path = window.location.pathname + window.location.search;
+ var path = window.location.pathname + window.location.search,
+ route = routes.recognize(path);
if (path === currentPath) return;
- currentRoute.run('unload');
+ currentRoute.run('unload', null, route === currentRoute);
currentPath = path;
- currentRoute = routes.recognize(currentPath);
+ currentRoute = route;
currentRoute.run('popstate', currentPath);
map.setState(e.originalEvent.state, {animate: false});
});
var path = url.replace(/#.*/, ''),
route = routes.recognize(path);
if (!route) return false;
- currentRoute.run('unload');
+ currentRoute.run('unload', null, route === currentRoute);
var state = OSM.parseHash(url);
map.setState(state);
window.history.pushState(state, document.title, url);
return true;
};
+ router.replace = function (url) {
+ window.history.replaceState(OSM.parseHash(url), document.title, url);
+ };
+
router.stateChange = function(state) {
if (state.center) {
window.history.replaceState(state, document.title, OSM.formatHash(state));
}
};
} else {
- router.route = function (url) {
+ router.route = router.replace = function (url) {
window.location.assign(url);
};