var App = { };

App.init = function()
{
	var request = Jaxer.request
	
	this.Dispatcher.dispatch(request);
};


App.Dispatcher = {
	/**
	 * Dispatch request to a controller/action
	 */
	dispatch: function(request)
	{
		var get = request.current.queryParts;
		
		//controller defined by get variable c, defaults to index
		var controller = get.c || 'index';

		//action defined by get variable a, defaults to index
		var action = get.a || 'index';
		
		controller = controller.toLowerCase();
		controller = controller.charAt(0).toUpperCase() + controller.substr(1);
		
		action = action.toLowerCase();
		
		try
		{
			//Load controller class
			Jaxer.Includer.load('controllers/' + controller + 'Controller.js');
			
			//Controllers expected to be App.NameController
			var controllerObj = new App[controller + 'Controller']();
		
			//Try getting view script name from the controller, default to action's name
			var view = controllerObj.views[action] || action;
			var path = 'views/' + controller + '/' + view + '.html';

			//View is placed into the element with id 'content'
			document.getElementById('content').innerHTML = Jaxer.File.read(path);
			
			//call App.NameController.nameAction(request)
			controllerObj[action + 'Action'](request);
		}
		catch(ex)
		{
			throw new App.Dispatcher.Exception('Can\'t dispatch to controller: ' + ex.toString());
		}
	},
	
	Exception: function(message)
	{
		this.message = message;
		this.toString = function()
		{
			return this.message;
		}
	}
};

App.Exception = function(message)
{
	this.message = message;
	
	this.toString = function()
	{
		return this.message;
	}
}
