var monthNumber = {
	january:1, february:2, march:3, april:4, may:5, june:6,
	july:7, august:8, september:9, october:10, november:11, december:12,
	jan:1, feb:2, mar:3, apr:4, jun:6, jul:7, aug:8, sep:9, sept:9, oct:10, nov:11, dec:12
}

var monthName = new Array(13);
monthName[1] = "Jan";
monthName[2] = "Feb";
monthName[3] = "Mar";
monthName[4] = "Apr";
monthName[5] = "May";
monthName[6] = "Jun";
monthName[7] = "Jul";
monthName[8] = "Aug";
monthName[9] = "Sep";
monthName[10] = "Oct";
monthName[11] = "Nov";
monthName[12] = "Dec";

/* find the most suitable 4-digit year from a 2-digit one */
function expandYear(shortYear) {
	shortYear %= 100;
	var thisYear = (new Date()).getFullYear();
	var thisCentury = thisYear - (thisYear % 100);
	var futureYear = thisCentury + shortYear;
	var pastYear = futureYear - 100;
	if (futureYear - thisYear < thisYear - pastYear) {
		return futureYear;
	} else {
		return pastYear;
	}
}

/* Check whether a date (specified as three fields) is valid */
function isValidDate(day, month, year) {
	if (month < 1 || month > 12 || day < 1 || day > 31) return false;
	if (day == 31 && (month==4 || month==6 || month==9 || month==11)) return false;
	if (month == 2) {
		if (day > 29) return false;
		if (day == 29 && !isLeapYear(year)) return false;
	}
	return true;
}

function isLeapYear(year) {
	return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}

/* pad a number to two digits with zeros. Makes lots of assumptions, won't work in the general case */
function zeroPad(i) {
	if (i < 10) {
		return '0' + i;
	} else {
		return i;
	}
}

function dateFocus(id) {
	var field = document.getElementById('dsp_' + id);
	field.style.color = 'black';
}

function dateBlur(id) {
	var field = document.getElementById('dsp_' + id);
	var hiddenField = document.getElementById(id);
	
	if (field.value == '') {
		hiddenField.value = '';
		return;
	}
	
	var fieldParts = field.value.split(/[^A-Za-z0-9]/);
	/* work out which scheme the entered date is using; dateScheme is a
		* string describing each of the date elements as a small number ('n'), a month name ('m')
		* or a year ('y').
		*/
	var dateScheme = "";
	var fixedParts = [];
	for (var i = 0; i < fieldParts.length; i++) {
		var fieldPart = fieldParts[i];
		if (monthNumber[fieldPart.toLowerCase()] != null) {
			dateScheme += 'm';
			fixedParts[fixedParts.length] = fieldPart;
		} else if (isNaN(parseInt(fieldPart,10))) {
			/* string is not a number; discard it */
		} else {
			/* make it into a number */
			fieldPart = parseInt(fieldPart,10);
			if (parseInt(fieldPart) < 1000) { 
				/* we could change the 1000 above to 1900, if we assume years before 1900 are a typo */
				dateScheme += 'n';
				fixedParts[fixedParts.length] = fieldPart;
			} else {
				dateScheme += 'y';
				fixedParts[fixedParts.length] = fieldPart;
			}
		}
	}
	switch (dateScheme) {
		case 'nny':
			var day = fixedParts[0];
			var month = fixedParts[1];
			var year = fixedParts[2];
			var dateParsed = true;
		break;
		case 'nnn':
			var day = fixedParts[0];
			var month = fixedParts[1];
			var year = expandYear(fixedParts[2]);
			var dateParsed = true;
		break;
		case 'ynn':
			var year = fixedParts[0];
			var month = fixedParts[1];
			var day = fixedParts[2];
			var dateParsed = true;
		break;
		case 'nmy':
			var day = fixedParts[0];
			var month = monthNumber[fixedParts[1].toLowerCase()];
			var year = fixedParts[2];
			var dateParsed = true;
		break;
		case 'nmn':
			var day = fixedParts[0];
			var month = monthNumber[fixedParts[1].toLowerCase()];
			var year = expandYear(fixedParts[2]);
			var dateParsed = true;
		break;
		case 'mny':
			var month = monthNumber[fixedParts[0].toLowerCase()];
			var day = fixedParts[1];
			var year = fixedParts[2];
			var dateParsed = true;
		break;
		case 'mnn':
			var month = monthNumber[fixedParts[0].toLowerCase()];
			var day = fixedParts[1];
			var year = expandYear(fixedParts[2]);
			var dateParsed = true;
		break;
		default:
			var dateParsed = false;
	}
	if (dateParsed && isValidDate(day, month, year)) {
		field.value = zeroPad(day) + ' ' + zeroPad(month) + ' ' + year;
		/* field.value = day + ' ' + monthName[month] + ' ' + year; */
		hiddenField.value = year + '-' + zeroPad(month) + '-' + zeroPad(day);
	} else {
		field.style.color = 'red';
		hiddenField.value = 'invalid';
	}
}
