faqts : Computers : Programming : Languages : JavaScript : Forms

+ Search
Add Entry AlertManage Folder Edit Entry Add page to http://del.icio.us/
Did You Find This Entry Useful?

33 of 42 people (79%) answered Yes
Recently 8 of 10 people (80%) answered Yes

Entry

How do I ensure only valid dates are input in a FORM?

May 11th, 2000 14:33
Martin Honnen,


Much validation work is necessary if you allow free form date input 
into a text field to cover all the various date formats. This entry 
alternatively suggests to write three select elements for 
day/month/year where the day element is changed when the month or year 
change to allow only valid days to be selected.

<HTML>
<HEAD>
<SCRIPT>
function __updateDays (dateField, month, year) {
  var days = month != 1 ?
    DateSelector.defaults.months[month].days :
    (__isLeapYear(year) ? 29 : 28);
  dateField.options.length = days;
  for (var d = 29; d < days + 1; d++)
    dateField.options[d - 1] = new Option(d, d);
}
function DateSelector (args) {
  this.id = DateSelector.cnt;
  DateSelector.elements[DateSelector.cnt++] = this;
  if (!args)
    args = new Object();
  for (var p in DateSelector.defaults)
    this[p] = typeof args[p] != 'undefined' ?
      args[p] : DateSelector.defaults[p];
  this.days = this.selectedMonth != 1 ?
    DateSelector.defaults.months[this.selectedMonth].days :
    (__isLeapYear(this.selectedYear) ? 29 : 28);
  this.monthOnChange =
    'var yearField = this.form[\'' + this.yearFieldName + '\'];'
    + 'var year = yearField.options[yearField.selectedIndex].value;'
    + '__updateDays(this.form[\'' + this.dateFieldName 
    + '\'], this.selectedIndex, ' 
    + 'year); '
    + this.monthOnChange;
  this.yearOnChange =
    'var monthField = this.form[\'' + this.monthFieldName + '\'];'
    + 'var month = monthField.options[monthField.selectedIndex].value;'
    + '__updateDays(this.form[\'' + this.dateFieldName 
    + '\'], month, ' 
    + 'this.options[this.selectedIndex].value); '
    + this.yearOnChange;
  this.writeHTML();
}
function DateSelector_writeHTML () {
  var html = '';
  html += '<FIELDSET ID="dsf' + this.id + '">';
  html += '<LEGEND ID="dsl"' + this.id + '">';
  html += this.legend;
  html += '<\/LEGEND>';
  html += '<SELECT NAME="' + this.dateFieldName + '"';
  html += this.dateOnChange ? ' ONCHANGE="' + this.dateOnChange 
+ '"' : '';
  html += '>';
  for (var d = 1; d <= this.days; d++) {
    html += '<OPTION VALUE="' + d + '"';
    html += d == this.selectedDate ? 
      ' SELECTED' : '';
    html += '>' + d;
  }
  html += '<\/SELECT>';
  html += '<SELECT NAME="' + this.monthFieldName + '"';
  html += this.monthOnChange ? ' ONCHANGE="' + this.monthOnChange 
+ '"' : '';
  html += '>';
  for (var m = 0; m < 12; m++) {
    html += '<OPTION VALUE="' + m + '"';
    html += m == this.selectedMonth ?
      ' SELECTED' : '';
    html += '>';
    html += this.format == 'short' ?
      DateSelector.defaults.months[m].shortName :
      DateSelector.defaults.months[m].longName;
  }
  html += '<\/SELECT>';
  html += '<SELECT NAME="' + this.yearFieldName + '"';
  html += this.yearOnChange ? ' ONCHANGE="' + this.yearOnChange 
+ '"' : '';
  html += '>';
  for (var year = this.startYear; year <= this.endYear; year++) {
    html += '<OPTION VALUE="' + year + '"';
    html += year == this.selectedYear ?
      ' SELECTED' : '';
    html += '>' + year;
  }
  html += '<\/SELECT>';
  html += '<\/FIELDSET>';
  document.write(html);
}
DateSelector.prototype.writeHTML = DateSelector_writeHTML;
function __isLeapYear (year) {
  return (year % 4 == 0) && 
         ((year % 100 != 0) || (year % 400 == 0));
}
DateSelector.cnt = 0;
DateSelector.elements = new Array();
DateSelector.defaults = new Object();
DateSelector.defaults.months = new Array(12);
DateSelector.defaults.months[0] = new Object();
DateSelector.defaults.months[0].shortName = 'Jan';
DateSelector.defaults.months[0].longName = 'January';
DateSelector.defaults.months[0].days = 31;
DateSelector.defaults.months[1] = new Object();
DateSelector.defaults.months[1].shortName = 'Feb';
DateSelector.defaults.months[1].longName = 'February';
DateSelector.defaults.months[1].days = 28
DateSelector.defaults.months[2] = new Object();
DateSelector.defaults.months[2].shortName = 'Mar';
DateSelector.defaults.months[2].longName = 'March';
DateSelector.defaults.months[2].days = 31;
DateSelector.defaults.months[3] = new Object();
DateSelector.defaults.months[3].shortName = 'Apr';
DateSelector.defaults.months[3].longName = 'April';
DateSelector.defaults.months[3].days = 30;
DateSelector.defaults.months[4] = new Object();
DateSelector.defaults.months[4].shortName = 'May';
DateSelector.defaults.months[4].longName = 'May';
DateSelector.defaults.months[4].days = 31;
DateSelector.defaults.months[5] = new Object();
DateSelector.defaults.months[5].shortName = 'Jun';
DateSelector.defaults.months[5].longName = 'June';
DateSelector.defaults.months[5].days = 30;
DateSelector.defaults.months[6] = new Object();
DateSelector.defaults.months[6].shortName = 'Jul';
DateSelector.defaults.months[6].longName = 'July';
DateSelector.defaults.months[6].days = 31;
DateSelector.defaults.months[7] = new Object();
DateSelector.defaults.months[7].shortName = 'Aug';
DateSelector.defaults.months[7].longName = 'August';
DateSelector.defaults.months[7].days = 31;
DateSelector.defaults.months[8] = new Object();
DateSelector.defaults.months[8].shortName = 'Sep';
DateSelector.defaults.months[8].longName = 'September';
DateSelector.defaults.months[8].days = 30;
DateSelector.defaults.months[9] = new Object();
DateSelector.defaults.months[9].shortName = 'Oct';
DateSelector.defaults.months[9].longName = 'October';
DateSelector.defaults.months[9].days = 31;
DateSelector.defaults.months[10] = new Object();
DateSelector.defaults.months[10].shortName = 'Nov';
DateSelector.defaults.months[10].longName = 'November';
DateSelector.defaults.months[10].days = 30;
DateSelector.defaults.months[11] = new Object();
DateSelector.defaults.months[11].shortName = 'Dec';
DateSelector.defaults.months[11].longName = 'December';
DateSelector.defaults.months[11].days = 31;
DateSelector.defaults.format = 'short';
var now = new Date();
var year = now.getFullYear ?
  now.getFullYear() : now.getYear();
if (year >= 0 && year <= 99)
  year += 1900;
DateSelector.defaults.startYear = year;
DateSelector.defaults.selectedYear = year;
DateSelector.defaults.endYear = DateSelector.defaults.startYear + 20;
DateSelector.defaults.selectedMonth = now.getMonth();
DateSelector.defaults.selectedDate = now.getDate();
DateSelector.defaults.legend = 'date';
DateSelector.defaults.dateFieldName = 'date';
DateSelector.defaults.monthFieldName = 'month';
DateSelector.defaults.yearFieldName = 'year';
DateSelector.defaults.dateOnChange = '';
DateSelector.defaults.monthOnChange = '';
DateSelector.defaults.yearOnChange = '';
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form1">
<SCRIPT>
new DateSelector();
</SCRIPT>
</FORM>
<FORM NAME="form2">
<SCRIPT>
var args = new Object();
args.legend = 'birthday';
var now = new Date();
var year = now.getFullYear ?
  now.getFullYear() : now.getYear();
if (year >= 0 && year <= 99)
  year += 1900;
args.startYear = year - 120;
args.endYear = year;
args.selectedYear = year;
new DateSelector(args);
</SCRIPT>
</FORM>
</BODY>
</HTML>