// Date validation

// check the entered month for too high a value
function checkMonthLength(mm,dd) {
	var months = new Array("","January","February","March","April","May","June","July","August","September","October","November","December")
	if ((mm == 4 || mm == 6 || mm == 9 || mm == 11) && dd > 30) {
		alert(months[mm] + " has only 30 days.")
		return false
	} else if (dd > 31) {
		alert(months[mm] + " has only 31 days.")
		return false
	}
	return true
}

// check the entered February date for too high a value 
function checkLeapMonth(mm,dd,yyyy) {
	if (yyyy % 4 > 0 && dd > 28) {
		alert("February of " + yyyy + " has only 28 days.")
		return false
	} else if (dd > 29) {
		alert("February of " + yyyy + " has only 29 days.")
		return false
	}
	return true
}

// date field validation (called by other validation functions that specify minYear/maxYear)
function isDate(field,minYear,maxYear,minDays,maxDays) {
	var inputStr = field.value
	if (!minYear) minYear = 1900
	if (!maxYear) maxYear = 2079

	bitBlurCheckInProgress = 1

 	if (inputStr != ""){
		// convert hyphen delimiters to slashes
		while (inputStr.indexOf("-") != -1) {
			inputStr = inputStr.replace(/-/,"/")
		}
		var delim1 = inputStr.indexOf("/")
		var delim2 = inputStr.lastIndexOf("/")
		if (delim1 != -1 && delim1 == delim2) {
			// there is only one delimiter in the string
			alert("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.  (If the month or date data is not available, enter \'01\' in the appropriate location.)")
			field.focus()
			field.select()
			return false
		}
		if (delim1 != -1) {
			// there are delimiters; extract component values
			var mm = parseInt(inputStr.substring(0,delim1),10)
			var dd = parseInt(inputStr.substring(delim1 + 1,delim2),10)
			var yyyy = parseInt(inputStr.substring(delim2 + 1, inputStr.length),10)
		} else {
			// there are no delimiters; extract component values
			var mm = parseInt(inputStr.substring(0,2),10)
			var dd = parseInt(inputStr.substring(2,4),10)
			var yyyy = parseInt(inputStr.substring(4,inputStr.length),10)
		}
		if (isNaN(mm) || isNaN(dd) || isNaN(yyyy)) {
			// there is a non-numeric character in one of the component values
			alert("The date entry is not in an acceptable format.\n\nYou can enter dates in the following formats: mmddyyyy, mm/dd/yyyy, or mm-dd-yyyy.")
			field.focus()
			field.select()
			return false
		}
		if (mm < 1 || mm > 12) {
			// month value is not 1 thru 12
			alert("Months must be entered between the range of 01 (January) and 12 (December).")
			field.focus()
			field.select()
			return false
		}
		if (dd < 1 || dd > 31) {
			// date value is not 1 thru 31
			alert("Days must be entered between the range of 01 and a maximum of 31 (depending on the month and year).")
			field.focus()
			field.select()
			return false
		}
	
		// validate year, allowing for checks between year ranges
		// passed as parameters from other validation functions
		if (yyyy < 100) {
			// entered value is two digits, which we allow for 1930-2029
			if (yyyy >= 30) {
				yyyy += 1900
			} else {
				yyyy += 2000
			}
		}
	
		var today = new Date()
		if (!minYear) {
			// function called with specific day range parameters
			var dateStr = new String(mm + "/" + dd + "/" + yyyy)
			var testDate = new Date(dateStr)
			if (testDate.getTime() < (today.getTime() + (minDays * 24 * 60 * 60 * 1000))) {
				alert("The most likely range for this entry begins " + minDays + " days from today.")
			}
			if (testDate.getTime() > today.getTime() + (maxDays * 24 * 60 * 60 * 1000)) {
				alert("The most likely range for this entry ends " + maxDays + " days from today.")
			}
		} else if (minYear && maxYear) {
			// function called with specific year range parameters
			if (yyyy < minYear || yyyy > maxYear) {
				// entered year is outside of range passed from calling function
				alert("Please enter a date between the years of " + minYear + " and " + maxYear + ".")
				field.focus()
				field.select()
				return false
			}
		} else {
			// default year range (now set to (this year - 100) and (this year + 25)
			var thisYear = today.getYear()
			if (thisYear < 100) {
				thisYear += 1900
			}
			if (yyyy < minYear || yyyy > maxYear) {
				alert("It is unusual for a date entry to be before " + minYear + " or after " + maxYear + ". Please verify this entry.")
				field.focus()
				field.select()
				return false
			}
		}
		if (!checkMonthLength(mm,dd)) {
			field.focus()
			field.select()
			return false
		}
		if (mm == 2) {
			if (!checkLeapMonth(mm,dd,yyyy)) {
				field.focus()
				field.select()
				return false
			}
		}
		// put the Informix-friendly format back into the field
		field.value = mm + "/" + dd + "/" + yyyy
		bitBlurCheckInProgress = 0
		return true
	} 
	else {
		bitBlurCheckInProgress = 0
		return true
	}
}