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, encode)
	{
		var url = [];
		
		if (urlData.baseUrl) {
			url.push(urlData.baseUrl);
		}

		if (urlData.request.controller && urlData.request.controller.substring(0, 7) == 'Backend') {
			urlData.request.controller = urlData.request.controller.substring(7);
			urlData.request.params.backend = 1;
		}
		
		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) {
				if (encode) {
					url.push(encodeURIComponent(param));
					url.push(encodeURIComponent(urlData.request.params[param]));
				} else {
					url.push(param);
					url.push(urlData.request.params[param]);
				}
			}
		}
		
		return '/' + url.join('/');
	},
	
	create: function(request, reset, urlData, encode)
	{
		// 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 {
				if (typeof data.request.params == 'undefined') {
					data.request.params = {};
				}
				data.request.params[requestParam] = request[requestParam];
			}
		}
		
		return this.createFromData(data, encode);
	}
};

if (typeof(Espire) === 'undefined') {
	Espire = {};
}
(function($) {
	
	$.fn.dform = function(options)
	{
		options = $.extend({
		}, options || {});
		
		function observeValue(field, displayConditions)
		{
			field.change(function() {
				var currentVal = field.is(':visible') ? $(this).val() : false;
				
				if (field.attr('type') == 'checkbox') {
					currentVal = (field.is(':checked')) ? currentVal : false;
				}
				
				var toShow = new Array();
				var notToShow = new Array();
				
				for (var i = 0; i < displayConditions.length; i++) {
					var targetItem = displayConditions[i].target;
					if (targetItem) {
						if (displayConditions[i].value == currentVal) {
							targetItem.closest('.item').show().change();
						} else {
							targetItem.closest('.item').hide().end().change();
						}
					}
				}
				
			});
		}
		
		return this.each(function() {
			
			var form = $(this);
			var displayConditions = options.conditionalDisplay;
			
			if (displayConditions) {
				for (var fieldName in displayConditions) {
					
					var fieldConditions = displayConditions[fieldName];
					
					var field = form.find('[name="' + fieldName + '"]');
					var multifield = form.find('[name="' + fieldName + '[]"]');
					field = $.merge(field, multifield);
					
					field.each(function(){
						var monitoredField = $(this);
						var multiSource = (field.attr('name').indexOf('[]') != -1);
						var fieldConditions2 = $.extend(true, [], fieldConditions);

						for (var i = 0; i < fieldConditions.length; i++) {
							if (multiSource && monitoredField.val() != fieldConditions[i].value) {
								fieldConditions2[i]['target'] = null;
							} else {
								var multitargets = form.find('[name="' + fieldConditions[i]['target'] + '[]"]');
								var singletarget = form.find('[name="' + fieldConditions[i]['target'] + '"]');
								var merged = $.merge(multitargets, singletarget);
								
								fieldConditions2[i]['target'] = merged;
							}
						}
						
						observeValue(monitoredField, fieldConditions2);
						monitoredField.change();
					});
				}
			}
		});
	};
	
})(jQuery);
