forms = $A([]);

function processForm(formName)
{
	if (typeof(forms[formName]) == "undefined")
		return true;

	errorCount = 0;
	form = forms[formName];
	form.errors = $H([]);
	form.validators.each( function(validator) {
		validate(validator);
	});
	updateForm();

	if (errorCount > 0)
	{
		return false;
	}
	return true;
}

function updateForm()
{
	form.validators.each( function(validator) {
		if (typeof(form.errors[validator.name]) != 'undefined')
		{
			Element.addClassName($(validator.name + '_label'), 'error');
			if ($(validator.name + '_error'))
			{
				Element.update($(validator.name + '_error'),
					form.errors[validator.name]);
			}
		}
		else
		{
			Element.removeClassName($(validator.name + '_label'), 'error');
			if ($(validator.name + '_error'))
			{
				Element.update($(validator.name + '_error'), '');
			}
		}
	});
	if (errorCount > 0)
	{
		if ($('summary_' + form.name) &&
			typeof(form.summary) != 'undefined')
		{
			output = form.summary.opening;
			form.errors.values().each( function(value) {
				output += form.summary.before + value + form.summary.after;
			})
			output += form.summary.closing;
			Element.update($('summary_' + form.name), output);
			Element.addClassName($('summary_' + form.name),
				form.summary.errclass);
		}

		Field.focus(form.errors.keys().first());
	}
}

function validate(validator)
{
	validator.valid = true;
	if (typeof(form.errors[validator.name]) == 'undefined')
	{
		switch (validator.type)
		{
			case 'match':
				validator.valid = validateMatch(validator);
				break;
			case 'regexp':
				validator.valid = validateRegExp(validator);
				break;
		}
	}
	if (typeof(form.errors[validator.name]) == 'undefined'
		&& !validator.valid)
	{
		form.errors[validator.name] = validator.errmsg
		errorCount++;
	}
}

function validateMatch(validator)
{
	value = $F(validator.name);
	value2 = $F(validator.field);
	if (trim(value) == trim(value2))
		return true;
	else
		return false;
}

function validateRegExp(validator)
{
	value = $F(validator.name);
	try
	{
		matches = validator.regexp.exec(trim(value));
		result = (matches != null);
	}
	catch(e)
	{
		result = true;
	}
	return result;
}

function trim(str)
{
	var match = str.match(/^\s*(\S+(\s+\S+)*)\s*$/);
	return (match == null) ? "" : match[1];
}
