function save(thenRedirectTo) {
	var form = document.forms[0];
	
	if (!thenRedirectTo)
		thenRedirectTo = '';
		
	form.redirectTo.value = thenRedirectTo;
	
	if (validateForm(form))
		form.submit();
}

function validateForm(form) {
	var errors = '';
	var autoSelect;
	for (var id in validation) {
		var label = validation[id][1];
		var requirements = validation[id][2];
		if (requirements.length > 0) {
			for (var i in requirements) {
				// test requirement
				if (!valid (form.elements[id], requirements[i])) {
					errors += ('\n- ' + label + ': ' + requirements[i]);
					if (!autoSelect)
						autoSelect = form.elements[id];
				}
			}
		}
	}

	if (errors == '') {
		return true;

	} else {
		autoSelect.select();
		alert('The following requirements must be met\nbefore submitting this form:\n' + errors);
		return false;
	}
}

function valid (input, type) {
	switch (type) {
	case 'required':
		return (input.value != '');
		break;
		
	default:
		return true;
	}
}