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;
}

//]]>