function formValidate(f) {
	pass = true;
	msgs = '';
	$(f).getElements().each(function(e){
		if(e.getAttribute('validate')) {
			tests = e.getAttribute('validate').split(',');
			tests.each(function(t){
				test = t.split('|');
				type = test[0];
				if(t.length > 1)
					msg = test[1];
				else
					msg = 'Unspecified error detected';
				switch(type) {
					case 'notempty':
						if(e.value == '') {
							msgs += '\n* ' + msg;
							pass = false;
						}
						break;
					case 'email':
						regex = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/;
						if(!regex.test(e.value)) {
							msgs += '\n* ' + msg;
							pass = false;
						}
						break;
				}
			});
		}
	});
	if(msgs!='')
		alert('Errors detected:\n'+msgs);
	return pass;
}