// shared helper routines for input validation in forms

function validate() {
	var tests = get_tests();
	for (var i in tests) {
		var test = tests[i];
		if (! functions[test.shift()].apply(null, test)) return false;
	}
	return true;
}

var functions = {
	not_empty : function(field, label, params) { 
		if (get_value(field) == '') {
			return display_error(field, params.message,
				'Das Feld "' + get_label(field, label) + '" darf nicht leer sein.'
			);
		}
		return true;
	},
	match : function(field, label, params) {
		if (get_value(field).search(params.pattern) == -1) {
			return display_error(field, params.message,
				'Die Eingabe im Feld "' + get_label(field, label) + '" ist ungültig.'
			);
		}
		return true;
	},
	length : function(field, label, params) {
		if ('min' in params && get_value(field).length < params.min) {
			return display_error(field, params.message,
				'Die Eingabe im Feld "' + get_label(field, label) + '" ist zu kurz.'
			);
		}
		if ('max' in params && get_value(field).length > params.max) {
			return display_error(field, params.message,
				'Die Eingabe im Feld "' + get_label(field, label) + '" ist zu lang.'
			);
		}
		return true;
	}
};

function display_error(field, message, defaultmessage) {
	alert(message || defaultmessage);
	if (field.type == 'text' || field.type == 'textarea') field.focus();
	return false;
}

function get_value(field) {
	if (field.type == 'text' || field.type == 'textarea') {
		return trim(field.value);
	}
	if (field[0].type == 'radio') {
		return trim(get_radio_value(field));
	}
	return;
}

function get_label(field, label) {
	return label || get_name(field);
}

function get_name(field) {
	if (field.type == 'text') {
		return field.name;
	}
	if (field[0].type == 'radio') {
		return field[0].name;
	}
	return '';
}

function get_radio_value(buttons) {
	for (i=0 ; i<buttons.length ; i++) {
		if (buttons[i].checked) return buttons[i].value;
	}
	return '';
}

function trim(inputstring) {
	return inputstring.replace(/^\s+|\s+$/g, '');
}

