function isBlank(s) {
	for(var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if((c != ' ') && (c != '\n') && (c != '\t')) return false;
	}
	return true;
}

function checkValidDate(dateStr) {
	var slash1 = dateStr.indexOf("/");
	if (slash1==-1) { slash1 = dateStr.indexOf("-") }

	if (slash1==-1) { return false }
	var dateMonth = dateStr.substring(0, slash1)
	var dateMonthAndYear = dateStr.substring(slash1+1, dateStr.length)
	var slash2 = dateMonthAndYear.indexOf("/")
	if (slash2==-1) { slash2 = dateMonthAndYear.indexOf("-") }

	if (slash2==-1) { return false }
	var dateDay = dateMonthAndYear.substring(0, slash2)
	var dateYear = dateMonthAndYear.substring(slash2+1, dateMonthAndYear.length)

	for (var x=0; x<dateMonth.length; x++) {
		var digit = dateMonth.substring(x, x+1)
		if ((digit < "0") || (digit > "9")) { return false }
	}

	var numMonth = 0;
	for (var x=0; x<dateMonth.length; x++) {
		digit = dateMonth.substring(x, x+1)
		numMonth *= 10;
		numMonth += parseInt(digit);
	}

	if ((numMonth <= 0) || (numMonth > 12)) { return false }

	for (var x=0; x<dateDay.length; x++) {
		digit = dateDay.substring(x, x+1)
		if ((digit < "0") || (digit > "9")) { return false }
	}

	var numDay = 0;
	for (var x=0; x<dateDay.length; x++) {
		digit = dateDay.substring(x, x+1)
		numDay *= 10;
		numDay += parseInt(digit);
	}
	
	if ((numDay <= 0) || (numDay > 31)) { return false }
	if ((numMonth==2) && (numDay>29)) { return false }	
	if ((numMonth==4) || (numMonth==6) || (numMonth==9) || (numMonth==11)) { if (numDay>30) { return false } }

	for (var x=0; x<dateYear.length; x++) {
		digit = dateYear.substring(x, x+1)
		if ((digit < "0") || (digit > "9")) { return false }
	}

	var numYear = 0;
	for (var x=0; x<dateYear.length; x++) {
		digit = dateYear.substring(x, x+1)
		numYear *= 10;
		numYear += parseInt(digit);
	}

	if (numYear < 50) { numYear = numYear + 2000 }
	if (numYear < 100) { numYear = numYear + 1900 }
	if ((numYear <= 0) || (numYear > 9999)) { return false }
	
	if ((numMonth==2) && (numDay==29)) {
		var div4 = numYear%4
		var div100 = numYear%100
		var div400 = numYear%400

		if (div4!=0) { return false }
		if ((div100==0) && (div400!=0)) { return false }
	}
	return true
}

function verify(f) {
	var msg;
	var empty_fields = "";
	var errors = "";

	for(var i = 0; i < f.length; i++) {
		var e = f.elements[i];
		if (((e.type == "text") || (e.type == "textarea")) && !e.optional) {
			if ((e.value == null) || (e.value == "") || isBlank(e.value)) {
				empty_fields += "\n     " + e.label;
				continue;
			}
			
			if (e.numeric || (e.min != null) || (e.max != null)) {
				var v = parseFloat(e.value);
				if (isNaN(v) || ((e.min != null) && (v < e.min)) || ((e.max != null) && (v > e.max))) {
					errors += "- " + e.label + " must be a number";
					if (e.min != null) errors += " that is greater than " + e.min;
					if (e.max != null && e.min != null) errors += " and less than " + e.max;
					else if (e.max != null) errors += " that is less than " + e.max;
					errors += ".\n";
				}
			}
			
			if (e.date) {
				if (!checkValidDate(e.value)) errors += "- " + e.label + " must be in date format: MM/DD/YYYY.\n";
			}
		}
	}
	
	if (!empty_fields && !errors) return true;
	
	msg  = "_______________________________________________________________\n\n";
	msg += "The form was not submitted because of the following error(s).\n";
	msg += "Please correct these error(s) and re-submit.\n";
	msg += "_______________________________________________________________\n\n";
	
	if (empty_fields) {
		msg += "- The following required field(s) are empty:" + empty_fields + "\n";
		if (errors) msg += "\n";
	}

	msg += errors;
	alert(msg);
	return false;
}
