function str2date(str) {
	var pos = str.indexOf(' '); // Trim time
	if (pos > 0)
		str = str.substring(0, pos);
	var thisdate = new Date(Date.parse(str));
	if (str == '' || isNaN(thisdate)) {
		thisdate = new Date(); // today
	} else {
		// Dont use getFullYear - "4/1/08" returns 1908
		var year = thisdate.getYear();
		if (year < 70) {
			year += 2000;
			thisdate.setYear(year);
		} else if (year <= 99) {
			year += 1900;
			thisdate.setYear(year);
		}
	}
	return thisdate;
}

function DateKeyDown(event_, element_)
{
	var keyCode = event_.keyCode ? event_.keyCode :
                  event_.which ? event_.which :
                  event_.charCode;
    var key = String.fromCharCode(keyCode);	
	// Special date characters
//	alert(keyCode.toString());
	// Get the new month/day/year
	var month, day, year;
	var setdate = false;
	if (keyCode == 77) {// key == 'm' || key == 'M') {
		var thisdate = str2date(element_.value);
		month = thisdate.getMonth() + 1;
		day   = thisdate.getDate();
		year  = thisdate.getFullYear();
		// Goto first of month
		if (day == 1) {
			month -= 1;
			if (month == 0) {
				month = 12;
				year -= 1;
			}
		} else {
			day = 1;
		}
		if (element_.mylastkey != 65 && // 'a'
			element_.mylastkey != 80)	// 'p'
			setdate = true;
	} else if (keyCode == 72) { // key == 'h' || key == 'H') {
		var thisdate = str2date(element_.value);
		// Goto end of month
		var days = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		month    = thisdate.getMonth();
		day      = days[month];
		year     = thisdate.getFullYear();
		var date = new Date(year, month, day);
		if (date.getDate() == thisdate.getDate()) {
			month = month + 1;
			if (month >= 12) {
				month = 0;
				year += 1;
			}
			day   = days[month];
			date = new Date(year, month, day);
		}
		month = date.getMonth() + 1;
		day   = date.getDate();
		year  = date.getFullYear();
		setdate = true;
	} else if (keyCode == 89) {// key == 'y' || key == 'Y') {
		var thisdate = str2date(element_.value);
		month = thisdate.getMonth() + 1;
		day   = thisdate.getDate();
		year  = thisdate.getFullYear();
		// Goto first of year
		if (month == 1 && day == 1) {
			year -= 1;
		} else {
			month = 1;
			day = 1;
		}
		setdate = true;
	} else if (keyCode == 82) { // key == 'r' || key == 'R') {
		var thisdate = str2date(element_.value);
		month = thisdate.getMonth() + 1;
		day   = thisdate.getDate();
		year  = thisdate.getFullYear();
		// Goto end of year
		if (month == 12 && day == 31) {
			year += 1;
		} else {
			month = 12;
			day = 31;
		}
		setdate = true;
	} else if (keyCode == 84 || keyCode == 78) { // key == 't' || key == 'T' || key == 'n' || key == 'N') {
		// Use today
		var now = new Date();
		month = now.getMonth() + 1;
		day   = now.getDate();
		year  = now.getFullYear();
		setdate = true;
	} else if (keyCode == 107 || keyCode == 187 || keyCode == 61 ||	// key == '+', '='
	           keyCode == 109 || keyCode == 189 ||	// key == '-'
	           keyCode == 87  ||					// key == 'w'
	           keyCode == 75) {						// key == 'k'
		var thisdate = str2date(element_.value);
		// Get the offset
		var offset = 0;
		if (keyCode == 107 || keyCode == 187 || keyCode == 61)		// key == '+', '='
			offset = +1;
		else if (keyCode == 109 || keyCode == 189)	// key == '-'
			offset = -1;
		else if (keyCode == 87)						// key == 'w'
			offset = -7;
		else if (keyCode == 75)						// key == 'k'
			offset = +7;
		// Add a day
		var days = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		month = thisdate.getMonth();
		day   = thisdate.getDate() + offset;
		year  = thisdate.getFullYear();
		if (day > days[month]) {
			day   = day - days[month];
			month = month + 1;
			if (month >= 12) {
				month = 0;
				year += 1;
			}
		}
		if (day <= 0) {
			month = month - 1;
			if (month < 0) {
				month += 12;
				year  -= 1;
			}
			day   = days[month] + day;
		}
		month = month + 1;
		setdate = true;
	}
	element_.mylastkey = keyCode;	// Store it
	if (setdate == true) {
//alert(month.toString() + day.toString() + year.toString());
		var string = month + '/' + day + '/' + year;
		element_.value = string;
		element_.select(0, -1);
		// Supress the key
		return false;
	}
	// Only allow numeric
//	if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z')) {
//  Watch for am/pm if time
//	alert(key);
//		return false;
//	}
	return true;
}

//always return 7/01/2009 format
function getCurrentDate() {
	var myDate = new Date();
	var month = parseInt(myDate.getMonth()) + 1; //0-11 + 1 = 1-12
	var day = myDate.getDate(); //1-31
	var year = myDate.getFullYear(); //four-digit
	return month + "/" + day + "/" + year;

}

function getLastFullMonthStartDate() {
	var myDate = new Date();
	var month = parseInt(myDate.getMonth()) + 1; //0-11 + 1 = 1-12
	var day = parseInt(myDate.getDate()); //1-31
	var year = parseInt(myDate.getFullYear()); //four-digit

	var lastMonthMonth = parseInt(month) - 1;
	var lastMonthDay = 1;
	var lastMonthYear = year;
	switch (month) {
		case 1:
			lastMonthYear = parseInt(year) - 1;
			lastMonthMonth = 12;
			break;
		default:
			break;
	}
	return lastMonthMonth + "/" + lastMonthDay + "/" + lastMonthYear;
	
}
//always return 7/01/2009 format
function getLastFullMonthEndDate() {
	var myDate = new Date();
	var month = parseInt(myDate.getMonth()) + 1; //0-11 + 1 = 1-12
	var day = parseInt(myDate.getDate()); //1-31
	var year = parseInt(myDate.getFullYear()); //four-digit

	var lastMonthMonth = parseInt(month) - 1;
	var lastMonthDay = 31;
	var lastMonthYear = year;
	switch (month) {
		case 3:
			lastMonthDay = 28;
			break;
		case 1:
			lastMonthYear  = parseInt(year) - 1;
			lastMonthMonth = 12;
			lastMonthDay   = 31;
			break;
		case 5:
		case 7:
		case 10:
		case 12:
			lastMonthDay = 30;
			break;
		case 2:
		case 4:
		case 6:
		case 8:
		case 9:
		case 11:
		default:
			lastMonthDay = 31;
			break;
	}
	return lastMonthMonth + "/" + lastMonthDay + "/" + lastMonthYear;
}

function ConvertDate(sDate)
{
	var month = 0;
	var day   = 0;
	var year  = 0;
	// Allow time on end
	if (sDate.length == 0 || sDate.length > 10) {
		return;
	}

	// Figure out the date sep
	var sep = '/';
	if(sDate.indexOf(sep) == '-1')
		sep = '-';

	// Check for no sep
	if (sDate.indexOf(sep) == '-1' && (sDate.length == 6 || sDate.length == 7 || sDate.length == 8) && !isNaN(sDate)) {
		if (sDate.length == 8) {
			month = sDate.substr(0, 2);
			day = sDate.substr(2, 2);
			year = sDate.substr(4, 4);
		} else if (sDate.length == 6) {
			month = sDate.substr(0, 1);
			day = sDate.substr(1, 1);
			year = sDate.substr(2, 4);
		} else {
			month = sDate.substr(0, 1);
			day = sDate.substr(1, 2);
			year = sDate.substr(3, 4);
		}
	} else if (sDate.indexOf(sep) != '-1') {
		// Parse the date
		var dateArray = sDate.split(sep);
		if (dateArray.length == 0) {
			return;
		} else if (dateArray.length == 1) {
			return;
		} else if (dateArray.length == 2) {
			month = parseInt(dateArray[0], 10);
			day = parseInt(dateArray[1], 10);
			var d = new Date();
			year = parseInt(d.getFullYear());
		} else {
			month = parseInt(dateArray[0], 10);
			day = parseInt(dateArray[1], 10);
			year = parseInt(dateArray[2], 10); //add 10 to make sure '09' is convert to 9
		}
	} else {
		return;
	}
	
	// handle 2 digit year
	if (year < 70)
		year += 2000;
	else if (year < 100)
		year += 1900;
	// Check the ranges
	if (day < 1 || day > 31)
		return;
	if (month < 1 || month > 12)
		return;
	if (year < 1900)
		return;

	return month + "/" + day + "/" + year;
}