OC.router_base_url = OC.webroot + '/index.php';
OC.Router = {
	// register your ajax requests to load after the loading of the routes
	// has finished. otherwise you face problems with race conditions
	registerLoadedCallback: function(callback){
		this.routes_request.done(callback);
	},
	routes_request: $.ajax(OC.router_base_url + '/core/routes.json', {
		dataType: 'json',
		success: function(jsondata) {
			if (jsondata.status === 'success') {
				OC.Router.routes = jsondata.data;
			}
		}
	}),
	generate:function(name, opt_params) {
		if (!('routes' in this)) {
			if(this.routes_request.state() != 'resolved') {
				console.warn('To avoid race conditions, please register a callback');// wait
			}
		}
		if (!(name in this.routes)) {
			throw new Error('The route "' + name + '" does not exist.');
		}
		var route = this.routes[name];
		var params = opt_params || {};
		var unusedParams = $.extend(true, {}, params);
		var url = '';
		var optional = true;
		$(route.tokens).each(function(i, token) {
			if ('text' === token[0]) {
			    url = token[1] + url;
			    optional = false;

			    return;
			}

			if ('variable' === token[0]) {
			    if (false === optional || !(token[3] in route.defaults)
				    || ((token[3] in params) && params[token[3]] != route.defaults[token[3]])) {
				var value;
				if (token[3] in params) {
				    value = params[token[3]];
				    delete unusedParams[token[3]];
				} else if (token[3] in route.defaults) {
				    value = route.defaults[token[3]];
				} else if (optional) {
				    return;
				} else {
				    throw new Error('The route "' + name + '" requires the parameter "' + token[3] + '".');
				}

				var empty = true === value || false === value || '' === value;

				if (!empty || !optional) {
				    url = token[1] + encodeURIComponent(value).replace(/%2F/g, '/') + url;
				}

				optional = false;
			    }

			    return;
			}

			throw new Error('The token type "' + token[0] + '" is not supported.');
		});
		if (url === '') {
			url = '/';
		}

		unusedParams = $.param(unusedParams);
		if (unusedParams.length > 0) {
			url += '?'+unusedParams;
		}

		return OC.router_base_url + url;
	}
};
