var dateFormatStd = /^([01][0-9])[/]([0123][0-9])[/]([0-9][0-9]|[12][0-9][0-9][0-9])$/;
var dateFormatVShort = /^([0-9])[/]([0-9])[/]([0-9][0-9]|[0-9][0-9][0-9][0-9])$/;
var dateFormatNS = /^([01][0-9])([0123][0-9])([0-9][0-9]|[12][0-9][0-9][0-9])$/;
var preceedingZero = /^0([0-9])$/;

function verifydate(thefield, range, clearandalert)
{
	var today = new Date();
	var todayyear = today.getFullYear();
	var todayshortyear = todayyear % 100;
	var century = todayyear-(todayyear % 100);

	if(thefield.value == "mm/dd/yyyy") thefield.value = ""; // if it's an unentered field then blank it out.
	var value = thefield.value;
	var ldateIsClean = true;
	var theyear = 0;
	var entereddate; 
	var newvalue;
	okayToSubmit = true;
	if(value != "")
	{
		var validatestd = dateFormatStd.exec(value);
		var validatev = dateFormatVShort.exec(value);
		var validatens = dateFormatNS.exec(value);
		//alert(validatestd + "\n" + validatev + "\n" + validatens + "\nshort year=" + todayshortyear + "\nrange=" + range);
		if(validatestd != null)
		{
			theyear = getValueOfDateField(validatestd[3]);
			if(theyear < 100)
			{
				if(theyear > todayshortyear && range < 0) { theyear += century - 100; } else { theyear += century; }
			}
			if(!checkDayOfMonth(validatestd[1], validatestd[2], theyear))
			{
				ldateIsClean = false;
			}
			else
			{
				newvalue = validatestd[1] + "/" + validatestd[2] + "/" + theyear;
				entereddate = new Date(theyear, getValueOfDateField(validatestd[1]) - 1, getValueOfDateField(validatestd[2]));
			}
		}
		else if(validatens != null)
		{
			theyear = getValueOfDateField(validatens[3]);
			if(theyear < 100)
			{
				if(theyear > todayshortyear && range < 0) { theyear += century - 100; } else { theyear += century; }
			}
			if(!checkDayOfMonth(validatens[1], validatens[2], theyear))
			{
				ldateIsClean = false;
			}
			else
			{
				newvalue = validatens[1] + "/" + validatens[2] + "/" + theyear;
				entereddate = new Date(theyear, getValueOfDateField(validatens[1]) - 1, getValueOfDateField(validatens[2]));
			}
		}
		else if(validatev != null)
		{
			theyear = getValueOfDateField(validatev[3]);
			if(theyear < 100)
			{
				if(theyear > todayshortyear && range < 0) { theyear += century - 100; } else { theyear += century; }
			}
			if(!checkDayOfMonth(validatev[1], validatev[2], theyear))
			{
				ldateIsClean = false;
			}
			else
			{				
				newvalue = "0" + validatev[1] + "/" + "0" + validatev[2] + "/" + theyear;
				entereddate = new Date(theyear, getValueOfDateField(validatev[1]) - 1, getValueOfDateField(validatev[2]));
			}
		}
		else
		{
			ldateIsClean = false;
		}
		//alert("Entered date = " + entereddate + ", the field = " + thefield.value + ", today = " + today);
		if
		(	!ldateIsClean 
		||	(range < 0 && entereddate > today)
		||	(range > 0 && entereddate < today)
		)
		{
			if(clearandalert)
			{
				alert("Please enter a valid date in the format mm/dd/yyyy.");
				thefield.value = "";
				thefield.focus();
			}
			return false;
		}
		else
		{
			thefield.value = newvalue;
		}
	}
	return true;
}

function getValueOfDateField(num)
{
	var val = 0;
	var getPreceedingZero = preceedingZero.exec(num);
	if(null != getPreceedingZero)
	{
		val = parseInt(getPreceedingZero[1]);
	}
	else
	{
		val = parseInt(num);
	}
	//alert(val);
	return val;
}


function checkDayOfMonth(m, d, y)
{
	var leap = 0;
	var maxday = 0;
	var day = 0;
	var month = 0;
	var year = 0;

	month = getValueOfDateField(m);
	day = getValueOfDateField(d);
	year = getValueOfDateField(y);

	// the value passed is the month and year
	// Set leap year
	if((y%400==0) || ((y%100!=0) && (y%4==0)))
	{
		leap = 1;
	}

	switch(month)
	{
		case 2:
			maxday = 28 + leap;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			maxday = 30;
			break;
		default:
			maxday = 31;

	}

	//alert(month + ":" + day + ":" + year + ":" + maxday);

	if(!(day > 0 && day <= maxday) || !(month > 0 && month < 13))
	{
		return false;
	}
	return true;
}
