UTIL = 
{
	registerOnLoad: function(namespace, callback)
	{
		var nsParts = namespace.split('.');
		var curNs = Espire;
		for (var i = 0; i < nsParts.length; i++) {
			if (i == nsParts.length - 1) {
				curNs[nsParts[i]] = callback;
			} else {
				if (curNs[nsParts[i]] === undefined) {
					curNs[nsParts[i]] = {};
				}
				curNs = curNs[nsParts[i]];
			}
		}
	},
	
	fire: function(namespace, func, funcname, args) 
	{
		funcname = (funcname === undefined) ? 'init' : funcname;
		if (func !== '' && namespace[func] && typeof namespace[func][funcname] == 'function') {
			namespace[func][funcname].apply(namespace[func][funcname], args || []);
	    }
	},

	loadEvents: function(loadStack)
	{
		UTIL.fire(Espire, 'common');
		
		for (var namespace in loadStack) {
			if (Espire[namespace] !== undefined) {
				
				UTIL.fire(Espire[namespace], 'common');
				
				for (var i = 0; i < loadStack[namespace].length; i++) {
					UTIL.fire(Espire[namespace], loadStack[namespace][i].container);
					UTIL.fire(Espire[namespace], loadStack[namespace][i].container, loadStack[namespace][i].action,
						loadStack[namespace][i].params);
				}
				
				UTIL.fire(Espire[namespace], 'common', 'finalize');
			}
		}
 
		UTIL.fire(Espire, 'common', 'finalize');
		
		$(document).trigger('finalized');
	} 
};

UTIL.Url = {
	
	urlData: null,
	
	parseUrl: function(url)
	{
		var urlData = {};
		var urlMatch = /(?:\/?(website\/\w{40}))?\/?(.+)?/.exec(url);

		if (!urlMatch) {
			return false;
		}
		
		urlData.baseUrl 			= typeof urlMatch[1] != undefined ? urlMatch[1] : '';
		
		urlData.urlParts 			= (urlMatch[2]) ? urlMatch[2].split('/') : [];
		urlData.request			= {
			module		: urlData.urlParts.length >= 1 ? urlData.urlParts[0] : 'index',
			controller	: urlData.urlParts.length >= 2 ? urlData.urlParts[1] : 'index',
			action		: urlData.urlParts.length >= 3 ? urlData.urlParts[2] : 'index',
			params		: {}
		};
		
		for (var i = 3; i < urlData.urlParts.length; i += 2) {
			urlData.request.params[urlData.urlParts[i]] = 
				urlData.urlParts.length - 1 >= i + 1 ? urlData.urlParts[i + 1] : null;
		}
		
		return urlData;
	},
	
	getUrlData: function()
	{
		if (this.urlData === null) {
			this.urlData = this.parseUrl(window.location.pathname);
		}
		return this.urlData;
	},
	
	createFromData: function(urlData)
	{
		var url = [];
		
		if (urlData.baseUrl) {
			url.push(urlData.baseUrl);
		}
		
		url.push(urlData.request.module || 'index');
		url.push(urlData.request.controller || 'index');
		url.push(urlData.request.action || 'index');
		
		if (urlData.request.params) {
			for (var param in urlData.request.params) {
				url.push(param);
				url.push(urlData.request.params[param]);
			}
		}
		
		return '/' + url.join('/');
	},
	
	create: function(request, reset, urlData)
	{
		// parameter 2 optioneel maken
		if (typeof reset != 'undefined' && typeof reset != 'boolean' && !urlData) {
			urlData = reset;
			reset = false;
		}
		
		if (!urlData) {
			urlData = this.getUrlData();
		} else if (typeof urlData == 'string') {
			urlData = this.parseUrl(urlData);
		}
		if (typeof urlData != 'object') {
			return false;
		}
		var data = $.extend(true, {}, urlData);
		if (reset) {
			data.request = {params: {}};
		}
		for (var requestParam in request) {
			if (requestParam == 'module' || requestParam == 'controller' || requestParam == 'action') {
				data.request[requestParam] = request[requestParam];
			} else {
				data.request.params[requestParam] = request[requestParam];
			}
		}
		
		return this.createFromData(data);
	}
};

if (typeof(Espire) === 'undefined') {
	Espire = {};
}
