var oldDateValue;

var monthArray = new Array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC');

function onlyContainsDidgits(StringToTest) {
	var regExp  =  /^\d{1,}$/ ;
	return regExp.test(StringToTest);
}

// Accepts a two didgit number as a string
function isYearValid(Year) {
	return onlyContainsDidgits(Year);
}

// Accepts a string
// Loops through month array and checks value
function isMonthStringValid(Month) {
	for (var i = 0; i < monthArray.length; i++) {
		if (monthArray[i] == Month) {
			return true;
		}
	}
	return false;
}

// Accepts a and returns the corresponding month number as int
function getMonthValue(Month) {
	for (var i = 0; i < monthArray.length; i++) {
		if (monthArray[i] == Month) {
			return i + 1;
		}
	}
}

// Accepts a string, converts to int and checks range
function isMonthValid(Month) {
	if (!onlyContainsDidgits(Month)) {
		return false;
	}
	var monthAsInt = parseInt(Month, 10);
	if (monthAsInt < 1 || monthAsInt > 12) {
		return false;
	} 
	return true;
}

// Accepts three strings and validates
function isDayValid(Day, Month, Year) {
	if (!onlyContainsDidgits(Day) || !onlyContainsDidgits(Month) || !onlyContainsDidgits(Year)) {
		return false;
	}
	var dayAsInt = parseInt(Day, 10);
	var monthAsInt = parseInt(Month, 10);
	var yearAsInt = parseInt(Year, 10);
	// Its feb so deal with leap years etc
	if (monthAsInt == 2) {
		var fullYear = yearAsInt + 2000;
		var febDays = daysInFeb(fullYear);
		if (dayAsInt < 1 || dayAsInt > febDays) {
			return false;
		}
	}
	// We are on a 30 day month
	else if (monthAsInt == 9 || monthAsInt == 4 || monthAsInt == 6 || monthAsInt == 11) {
		if (dayAsInt < 1 || dayAsInt > 30) {
			return false;
		}
	}
	else {
		if (dayAsInt < 1 || dayAsInt > 31) {
			return false;
		}
	}

	return true;
}

function daysInFeb(Year) {
	if (Year % 4 != 0) {
		return 28;
	}
	else if (Year % 100 != 0) {
		return 29;
	}
	else if (Year % 400 != 0) {
		return 28;
	}
	else {
		return 29;
	}
}
		
function formatDate(FormField){
	// Get the value from the field passed
	var enteredValue = FormField.value.toUpperCase();
	// store the date
	oldDateValue = oldValue;
	// Deal with saving... also no need to continue if nothing changed... or if field is empty
	if (markForSave(enteredValue) && enteredValue != '') {
		switch(enteredValue.length) {
			// Date entered in shorthand
			case 6:
				if (checkShortDate(enteredValue, FormField)) {
					markForSave(enteredValue);
					FormField.value = formatShortDate(enteredValue);
				}
				break;
			// Date entered in full format
			case 9:
				if (checkFullDate(enteredValue, FormField)) {
					markForSave(enteredValue);
					FormField.value = enteredValue;
				}
				break;
			// Otherwise date is invalid
			default:
				return rejectDate(FormField);
		}
	}
}	

function checkShortDate(EnteredValue, FormField) {
	var dayAsString = EnteredValue.substring(0, 2);
	var monthAsString = EnteredValue.substring(2, 4);
	var yearAsString = EnteredValue.substring(4, 6);
	
	// Check the year
	if (!isYearValid(yearAsString)) {
		return rejectDate(FormField);
	}
	// Check the month
	if (!isMonthValid(monthAsString)) {
		return rejectDate(FormField);
	}
	// Check the day
	if (!isDayValid(dayAsString, monthAsString, yearAsString)) {
		return rejectDate(FormField);
	}
	
	return true;
}

function formatShortDate(EnteredValue) {
	var dayAsString = EnteredValue.substring(0, 2);
	var monthAsString = EnteredValue.substring(2, 4);
	var yearAsString = EnteredValue.substring(4, 6);
	
	var monthAsInt = parseInt(monthAsString, 10);
	
	return dayAsString + '-' + monthArray[monthAsInt - 1] + '-' + yearAsString;
}

function checkFullDate(EnteredValue, FormField) {
	// Split on -
	var dateArray = EnteredValue.split('-');
	// If there are not 3 parts then date is invalid
	if (dateArray.length != 3) {
		return rejectDate(FormField);
	}
	// Check the year
	if (!isYearValid(dateArray[2])) {
		return rejectDate(FormField);
	}
	
	// Check the month
	if (!isMonthStringValid(dateArray[1])) {
		return rejectDate(FormField);
	}
	
	var monthAsInt = getMonthValue(dateArray[1])
	// Check the day
	if (!isDayValid(dateArray[0], monthAsInt, dateArray[2])) {
		return rejectDate(FormField);
	}
	
	return true;
}

function rejectDate(FormField) {
	alert('The date entered is not in a valid format.\nUse ddmmyy or dd-mmm-yy.');
	// Set the value back to the value stored for this date field
	FormField.value = oldDateValue;
	FormField.focus();
	return false;
}

function getCurrentDate() {
	var now = new Date;
	var month = now.getMonth() +1;
	month = (month < 10) ? "0" + month : month;
	var day = now.getDate();
	day = (day < 10) ? "0" + day : day;
	var year = now.getYear();
	year = year + "";
	year = year.substring(2, 4);
	return formatShortDate(day + month + year);
}

// Not used this but developed it for date comparisson
function formatAndCheckDate(validatingField, compareID, validatingID, operator) {
	formatDate(validatingField);
	var validating = document.getElementById(validatingID).value;
	var compare = document.getElementById(compareID).value;
	// If there is a value then the date is valid
	if (validating != '' && compare != '') {
		var arrValidating = validating.split('-');
		var arrCompare = compare.split('-');
		
		var boolIsValid = false;
		var newOperator;
		
		if (operator == '<' || operator == '>') {
			newOperator = operator;
		}
		else if (operator == '<=') {
			newOperator = '<';
			if (validating == compare) {
				boolIsValid = true;
			}
		}
		else if (operator == '>=') {
			newOperator = '>';
			if (validating == compare) {
				boolIsValid = true;
			}
		}
		
		if (eval(parseInt(arrValidating[2], 10) + newOperator + parseInt(arrCompare[2], 10))) {
			boolIsValid = true;
		}
		else if (parseInt(arrValidating[2], 10) == parseInt(arrCompare[2], 10)) {
			if (eval(getMonthValue(arrValidating[1]) + newOperator + getMonthValue(arrCompare[1]))) {
				boolIsValid = true;
			}
			else if (getMonthValue(arrValidating[1]) == getMonthValue(arrCompare[1])) {
				if (eval(parseInt(arrValidating[0], 10) + newOperator + parseInt(arrCompare[0], 10))) {
					boolIsValid = true;
				}
			}			
		}
		
//		alert(boolIsValid);
		return boolIsValid;
	}
}