var FormCriteria = function() {
	var fields = {};
	
	var getField = function(form, name) {
		return form.find(":input[name='" + name + "']");
	};
	
	var getRulesFor = function(name) {
		if (!(name in fields))
			fields[name] = []
		
		return fields[name];
	};
	
	var hideAllErrors = function(form) {
		form.find('.formError').each(function() {
			$(this).text(' ');
		});
	};
	
	var isMoney = function(name, error) {
		regex(name, '^\\d+\\.\\d\\d$', error);
	};
	
	var notEmpty = function(name, error) {
		var rules = getRulesFor(name);
		
		rules.push({
			error: error,
			test:  function(value) { return testNotEmpty(value); }
		});
	};
	
	var regex = function(name, pattern, error) {
		var rules = getRulesFor(name);
		
		rules.push({
			error: error,
			test:  function(value) { return testRegex(value, pattern); }
		});
	};
	
	var showError = function(name, error) {
		var errorSpan = $('#' + name + 'Error');
		errorSpan.text(error);
		errorSpan.show();
	};
	
	var testNotEmpty = function(value) {
		return value != '';
	};
	
	var testRegex = function(value, pattern) {
		if (value != '')
			return value.match(pattern);
		
		return true;
	};
	
	var validate = function(form, other) {
		form = $(form);
		hideAllErrors(form);
		
		var firstError = null;
		
		for (var name in fields)
		{
			var rules = fields[name];
			
			for (var i in rules)
			{
				var field = getField(form, name);
				var value = $.trim(field.val())
				
				if (!rules[i].test(value))
				{
					if (!firstError)
						firstError = field;
					
					showError(name, rules[i].error);
					break;
				}
			}
		}
		
		if (firstError)
		{
			firstError.focus();
			return false;
		}
		
		if (other)
		{
			if (!other(form, showError))
				return false;
		}
		
		return true;
	};
	
	return {
		isMoney:   isMoney,
		notEmpty:  notEmpty,
		regex:     regex,
		showError: showError,
		validate:  validate
	};
};


FormCriteria.showError = function(name, error) {
	var errorSpan = $('#' + name + 'Error');
	errorSpan.text(error);
	errorSpan.show();
};

