

function checkDate (dateToCheck)
{    
	// returns true if dateToCheck is a valid date in the following formats:
	// 	yyyy/mm/dd
	// 	yyyy-mm-dd
	// 	mm/dd/yyyy
	// 	mm-dd-yyyy
	// Additionally, months and days can be entered with or without leading zeros.

	year = 0;
	month = 0;
	day = 0;

    if (dateToCheck.length < 8)
       return false;

	// find first substring and first delimiter's index
        for (var i = 0; i < dateToCheck.length; i++)
	{
		if ((dateToCheck.charAt(i) == '/') || (dateToCheck.charAt(i) == '-'))
		{
			firstSubstring = dateToCheck.substring (0, i);
			firstDelimiterIndex = i;
			if (firstSubstring.length > 2)
				year = firstSubstring;
			else
				month = firstSubstring;
			break;
		}
	}

	// find second substring and second delimiter's index
	for (var i = firstDelimiterIndex + 1; i < dateToCheck.length; i++)
	{
		if ((dateToCheck.charAt(i) == '/') || (dateToCheck.charAt(i) == '-'))
		{
			secondSubstring = dateToCheck.substring (firstDelimiterIndex + 1, i);
			secondDelimiterIndex = i;
			if (month > 0)
				day = secondSubstring;
			else
				month = secondSubstring;
			break;
		}
	}

	// find third substring
	if (year > 0)
		day = dateToCheck.substring (secondDelimiterIndex + 1, dateToCheck.length);
	else
		year = dateToCheck.substring (secondDelimiterIndex + 1, dateToCheck.length);
         
	// basic error checking         
	if ((month < 1) || (month > 12))
		return false;         

	if ((day < 1) || (day > 31))
		return false;

	if (year.length > 4)
		return false;

	// advanced error checking

	// months with 30 days
	if ((month == 4) || (month == 6) || (month == 9) || (month == 11))
		if (day == 31)
			return false;

	// february, leap year
	if (month == 2)
	{
		// feb
        	var leapYear = parseInt(year / 4)
        	
		if (isNaN (leapYear))
	        	return false;               

		if (day > 29)
			return false;

        	if ((day == 29) && ((year / 4) != parseInt (year / 4))) 
			return false;
	}

	return true;
} 

