define(function(require,exports,module){"use strict";module.exports=createRouter;function createRouter(trailing){function resolve(path){resolve.resolve(path)}resolve.trailing=Boolean(trailing);resolve.routeMap={};resolve.routeNames={};for(var key in createRouter.methods){if(createRouter.methods.hasOwnProperty(key)){resolve[key]=createRouter.methods[key]}}return resolve}createRouter.methods={parse:function parse(path){var trailing=this.trailing&&path.charAt(path.length-1)==="/";var tokens=path.split("/").filter(Boolean);if(trailing&&tokens.length)tokens.push("/");return tokens},reverse:function reverse(name,params,splat){var route=this.routeNames[name];if(!route)return null;if(route.params.length&&!params){throw new Error('Route "'+name+'" expects the following parameters: '+route.params.join(", "))}var times={};var tokens=this.parse(route.path);if(tokens[tokens.length-1]==="*"){if(!splat)throw new Error("Unmet wildcard.")}else if(splat)throw new Error("Route does not take a wildcard.");return"/"+tokens.map(function(token){if(token.charAt(0)===":"){token=token.slice(1);if(!params[token])throw new Error("Mising parameter: "+token);if(Array.isArray(params[token])){times[token]=(times[token]||0)+1;return params[token][times[token]-1]}return params[token]}if(token==="*")return splat;if(token==="/")return"";return token}).join("/")},add:function add(path,fn,name){var route={name:name,path:path,fn:fn,params:[]};if(name){if(!this.routeNames.hasOwnProperty(name))this.routeNames[name]=route;else throw new Error('Route "'+name+'" already exists.')}var tokens=this.parse(path);var map=this.routeMap;if(tokens[tokens.length-1]!=="*")tokens.push(null);for(var i=0;i