function validateForm(formId) {
	var f = $(formId); 
	var requiredFields = f.getElementsByClassName('required');
	var emailFields = f.getElementsByClassName('validate-email');
	var eurodateFields = f.getElementsByClassName('validate-eurodate');
	var numberFields = f.getElementsByClassName('validate-number');
	
	for(i=0;i<requiredFields.length;i++) {
		switch(requiredFields[i].type) {
			case 'checkbox':
			case 'radio':
				opts = f[requiredFields[i].name];
				fieldValue = "";
				for(j=0;j<opts.length;j++) {
					if(opts[j].checked) {
						if(fieldValue != "") fieldValue += ",";
						fieldValue += opts[j].value;
					}
				}
				if(fieldValue == "") {
					alert("Form field must be selected");
					requiredFields[i].focus();
					return false;
				} else {
					break;
				}
			case 'select-multiple':
				opts = f[requiredFields[i].name].options;
				fieldValue = "";
				for(j=0;j<opts.length;j++) {
					if(opts[j].selected) {
						if(fieldValue != "") fieldValue += ",";
						fieldValue += opts[j].value;
					}
				}
				if(fieldValue == "") {
					alert("Form field must be selected");
					requiredFields[i].focus();
					return false;
				} else {
					break;
				}
			default:
				if($F(requiredFields[i]) == "") {
					alert("Form field cannot be left blank");
					requiredFields[i].focus();
					return false;
				}
		}
	}
	return true;
	for(i=0;i<emailFields.length;i++) {
		fieldValue = $F(emailFields[i]);
		if(fieldValue != "" && !vIsEmailAddress(fieldValue)) {
			alert("Form field must be a valid email address");
			emailFields[i].focus();
			return false;
		}
	}
	for(i=0;i<eurodateFields.length;i++) {
		fieldValue = $F(eurodateFields[i]);
		if(fieldValue != "" && !vIsEurodate(fieldValue)) {
			alert("Form field must be a valid date in dd/mm/yyyy format");
			eurodateFields[i].focus();
			return false;
		}
	}
	for(i=0;i<numberFields.length;i++) {
		fieldValue = $F(numberFields[i]);
		if(fieldValue != "" && !vIsNumber(fieldValue)) {
			alert("Form field must be a number");
			numberFields[i].focus();
			return false;
		}
	}
	return true;
}

function vInvalidDateCheck(string) {
	var year = string.substr(0,4);
	if (year == 0) { return true; }
	var month = string.substr(5,2);
    if (month < 1 || month > 12) { return true; }
	var day = string.substr(8,2);
	if (day < 1 || day > 31) { return true; }
	if (day > 30 && (month == "04" || month == "06" || month == "09" || month == "11")) { return true; }
	var leap = 0;
	if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) { leap = 1; }
    if (month == 2 && leap == 1 && day > 29) { return true; }
    if (month == 2 && leap != 1 && day > 28) { return true; }
	return false;
}

function vEurodateToODBC(eurodate) {
	var re = /^(\d{2})\/(\d{2})\/(\d{4})$/;
	return eurodate.replace(re, "$3-$2-$1");
}

function vIsEurodate(string) {
	var re = /^\d{2}\/\d{2}\/\d{4}$/;
	if(!re.test(string)) { return false; }
	else if(vInvalidDateCheck(vEurodateToODBC(string))) { return false; } else { return true; }
}

function vIsEmailAddress(string) {
	var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$/; // valid
	if(reg1.test(string) || !reg2.test(string)) { return false; } else { return true; }
}

function vIsNumber(string) {
	var re = /^\-?[\d]+(\.[\d]+)?$/;
	if(!re.test(string)) { return false; } else { return true; }
}