function validateForm(whichform) {
	if (!document.getElementById) return false;
	for (var i=0; i<whichform.elements.length; i++) {
		var element = whichform.elements[i];
		if (element.className.indexOf("required") != -1) {
			if (!isFilled(element)) {
				if ((element.name == "dob-day") || (element.name == "dob-month") || (element.name == "dob-year")) {
					alert("Please complete the date of birth field.");
				} else {
					alert("Please fill in the "+element.name+" field.");
				}
				return false;
			}
		}
		if ((element.name == "dob-day") || (element.name == "dob-month") || (element.name == "dob-year")) {
			if (!isNumber(element)) {
				alert("The date of birth field must be a valid date.");
				return false;
			}
			if (element.name == "dob-year") {
				if (!checkLength(element, "4")) {
					alert("The date of birth year field is not the correct length.");
					return false;
				}
			}
			// check date
			var dayfield  = document.getElementById("dob-day");
			var monthfield  = document.getElementById("dob-month");
			var yearfield  = document.getElementById("dob-year");
			
			var day = dayfield.value;
			var month = monthfield.value - 1;
			var year = yearfield.value;
			
			source_date = new Date(year,month,day);
		
			  if(year != source_date.getFullYear())
			  {
				 alert('The date of birth is not valid.');
				 return false;
			  }
		
			  if(month != source_date.getMonth())
			  {
				 alert('The date of birth is not valid.');
				 return false;
			  }
		
			  if(day != source_date.getDate())
			  {
				 alert('The date of birth is not valid.');
				 return false;
			  }
		}
		if (element.className.indexOf("email") != -1) {
			if (isFilled(element)) {
				if (!isEmail(element)) {
					alert("The "+element.name+" field must be a valid email address.");
					return false;
				}
			}
		}
	}
	
	return true;
}

function isEmail(field) {
    if (field.value.indexOf("@") == -1 || field.value.indexOf(".") == -1) {
		return false;
	} else {
		return true;
	}
}

function isFilled(field) {
	if (field.value.length < 1 || field.value == field.defaultValue) {
		return false;
	} else {
		return true;
	}
}

function isDate(field) {
	// error
	// if month is less than 01 and more than 12
	// if day is less than 01
	// if february, if year is leap year and day is more than 29
	// if not leap year if day is more than 28
	// if april, june, september, november, if date is more than 30
	// if date is more than 31
	return true;
}

function isNumber(field) {
	// if any of the fields aren't numbers
	var numericExpression = /^[0-9]+$/;
	if (!field.value.match(numericExpression)) {
		return false;
	} else {
		return true;
	}
}

function checkLength(field, len) {
	// if year doesn't have enough digits
	if (field.value.length < len) {
		return false;
	} else {
		return true;
	}
}

function focusLabels() {
	if (!document.getElementsByTagName) return false;
	var labels = document.getElementsByTagName("label");
	for (var i=0; i<labels.length; i++) {
		if (!labels[i].getAttribute("for")) continue;
		labels[i].onclick = function() {
			var id = this.getAttribute("for");
			if (!document.getElementById(id)) return false;
			var element = document.getElementById(id);
			element.focus();
		}
	}
}

function resetFields(whichform) {
	for (var i=0; i<whichform.elements.length; i++) {
		var element = whichform.elements[i];
		if (element.type == "submit") continue;
		if (!element.defaultValue) continue;
		element.onfocus = function() {
			if (this.value = this.defaultValue) {
				this.value = "";
			}
		}
		element.onblur = function() {
			if (this.value == "") {
				this.value = this.defaultValue;
			}
		}
	}
}

function prepareForms() {
	for (var i=0; i<document.forms.length; i++) {
		var thisform = document.forms[i];
		resetFields(thisform);
		thisform.onsubmit = function() {
			return validateForm(this);
		}
	}
}

addLoadEvent(focusLabels);
addLoadEvent(prepareForms);
