var Router = View.extend({ routeByHash: false, go: function (url) { this.parseRoute(url); }, pushState: function (url) { if (this.routeByHash) { window.location.hash = url; } else if (window.history) { window.history.pushState(null, null, url); } }, route: function () { var path = this.routeByHash ? window.location.hash.substr(0) : window.location.pathname; path = path || "/"; this.originalPath = path; this.parseRoute(path); }, parseRoute: function (pathname) { pathname = pathname.replace(/^#/, ""); if (pathname[0] !== "/") { pathname = "/" + pathname; } var routes = this.routes, path = pathname.split("/"); for (var i = 0; i < path.length; i++) { if (!path[i].length) { path[i] = null; } } if (pathname in routes) { this[this.routes[pathname]](); return; } if (path[path.length - 1] == null) { path.pop(); } for (var route in routes) { var routePath = route.split("/"); if (routePath[1] == path[1]) { if ( routePath[2] && routePath[2].indexOf(":") !== -1 && path[2] && path[3] === routePath[3] ) { this[this.routes[route]](path[2]); return; } else if (routePath[2] == path[2]) { if (routePath[3] && path[3]) { if (routePath[3].indexOf(":") !== -1) { this[this.routes[route]](path[3]); return; } else if (routePath[3] == path[3]) { this[this.routes[route]](); return; } } else if (!routePath[3] && !path[3]) { this[this.routes[route]](); return; } } else if (!routePath[2] && (!path[2].length || !path[2])) { this[this.routes[route]](); return; } } } // Redirect to root on 404 window.location = "/"; }, });