function validate(f) {
	var errorstr = "";
	var missing = "";
	var bad = "";
	var re = new RegExp("");
	// Trim spaces
	for (var i=0; i<f.elements.length; i++) {
		if (f.elements[i].value) {
 			f.elements[i].value = f.elements[i].value.replace(/  +/g,' ').replace(/^ /,'').replace(/ $/,'')
		}
	}
	// Validate
	if (!f.firstname.value) {
		missing+="First name\n"
	}
	if (!f.lastname.value) {
		missing+="Last name\n"
	}
	if (!f.addr1.value) {
		missing+="Address\n"
	}
	if (!f.addr3.value) {
		missing+="City/Town\n"
	}
	if (!f.postcode.value) {
		missing+="Postcode\n"
	}
	re.compile("^([a-zA-Z][a-zA-Z]?[0-9][a-zA-Z0-9]? [0-9oO][a-zA-Z][a-zA-Z])$");
	if (f.postcode.value && !re.test(f.postcode.value)) {
		bad+="Postcode (hint: must contain exactly one space)\n"
	}
	if (!f.emailaddress.value) {
		missing+="E-mail address\n"
	}
	re.compile("^([-a-z0-9.]{5,20})$");
	if (f.emailaddress.value && !re.test(f.emailaddress.value)) {
		bad+="E-mail address (must be 5 to 20 characters, a-z 0-9 . -)\n"
	}
	if (!f.password.value) {
		missing+="Password\n"
	}
	if (f.password.value != f.password2.value) {
		errorstr+="The two passwords you have entered do not match\n\n"
	}
	re.compile("^([-_.A-Za-z0-9/]{5,16})$");
	if (f.password.value && !re.test(f.password.value)) {
		bad += "Password (must be between 5 and 16 characters, a-z A-Z 0-9 . - _ /)\n"
	}

	if (missing) { errorstr += "You must complete the following fields:\n" + missing + "\n" }
	if (bad) { errorstr += "The following fields are incorrect:\n" + bad + "\n" }
	if (errorstr) { alert(errorstr); return false }
	return true
}
