JavaScript Source for Generalized Date Input Field
//<![CDATA[
// onKeyPress event calls this function
// keyboard key functions:
//
// "+" increment date by one day
// "-" decrement date by one day
// "t" display current date
//
// @author G. Gold
var ONE_DAY_MILLISECONDS = 3600 * 24 * 1000;
var date_obj = new Date();
var day_names = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"];
function ChangeDate(e, date_field_obj)
{
var date_field = date_field_obj;
if (window.Event)
{
var keycode = e.which;
}
else if (e.type == "keypress")
{
var keycode = e.keyCode;
}
var keypress = String.fromCharCode(keycode).toLowerCase();
var b_result = false;
if (keypress == "-")
{
// \d\d\d\d executes faster and is clearer to read than \d{4}
if (date_field.value.match(/^\d\d\d\d-\d\d-\d\d$/))
{
MoveDateOneDay(date_field, "previous");
b_result = true;
}
else
{
b_result = false;
}
}
else if (keypress == "=" || keypress == "+")
{
if (date_field.value.match(/^\d\d\d\d-\d\d-\d\d$/))
{
MoveDateOneDay(date_field, "next");
b_result = true;
}
else
{
b_result = false;
}
}
else if (keypress == 't')
{
date_field.value = FormatDate_ISO_8601(new Date());
b_result = true;
}
return b_result;
}
function MoveDateOneDay(date_field, direction)
{
var ymd = date_field.value.split("-");
date_obj.setFullYear(ymd[0]);
date_obj.setMonth(ymd[1] - 1);
date_obj.setDate(ymd[2]);
var mseconds = date_obj.getTime();
if (direction == "previous")
{
mseconds -= ONE_DAY_MILLISECONDS;
}
else if (direction == "next")
{
mseconds += ONE_DAY_MILLISECONDS;
}
date_obj.setTime(mseconds);
date_field.value = FormatDate_ISO_8601(date_obj);
return;
}
// return value is a string in yyyy-mm-dd format
function FormatDate_ISO_8601(d)
{
var year_str = IntegerToPaddedString(d.getFullYear(), 4, '0');
var month_str = IntegerToPaddedString(d.getMonth() + 1, 2, '0');
var day_str = IntegerToPaddedString(d.getDate(), 2, '0');
SetDayOfWeek(d);
return year_str + "-" + month_str + "-" + day_str;
}
function SetDayOfWeek(d)
{
document.getElementById("dow").innerHTML = day_names[d.getDay()];
}
// mini (but useful) subset of sprintf
function IntegerToPaddedString(num, len, padchar)
{
var str_num = num.toString();
while (str_num.length < len)
{
str_num = padchar + str_num;
}
return str_num;
}
//]]>