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 } } else if (routePath[1].indexOf(":") !== -1 && path.length < 3) { this[this.routes[route]](path[1]) return } } // Redirect to root on 404 window.location = '/' } })