var calendar_months = ['Jan.', 'Fév.', 'Mars', 'Avr.', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'];
var calendar_days = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'];

function checkDate(fld) {
  var date = fld.value.match(/\s*(\S*)\s*$/)[1];
  if (date == '')
    return false;
  var t = date.match(/^[A-Za-z ]*([0-9]{1,2}\/[0-9]{1,2}\/(20[0-9]{2}|[0-9]{1,2}))$/);
  if (t == null) {
    alert('Date invalide (JJ/MM/AA)');
    fld.focus();
    return false;
  }
  fld.value = formatDate(parseDate('Xxx ' + t[1]));
  return true;
}

function parseDate(date, defaultDate) {
  var t = date.match(/^[A-Z][a-z]{2} ([0-9]{1,2})\/([0-9]{1,2})\/(20[0-9]{2}|[0-9]{1,2})$/);
  if (t == null)
    return defaultDate == null ? null : clearTime(defaultDate);
  return new Date(2000 + parseInt(t[3], 10), t[2] - 1, t[1]);
}

function formatDate(date) {
  return date == null ? ''
    : calendar_days[date.getDay()] + ' '
      + (date.getDate() < 10 ? '0' : '') + date.getDate() + '/'
      + (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1) + '/'
      + ((date.getYear() % 100) < 10 ? '0' : '') + (date.getYear() % 100);
}

function clearTime(date) {
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);
  date.setMilliseconds(0);
  return date;
}

function openCalendar(fld, minDate, maxDate) {
  if (document.getElementById == null || document.getElementById('calendar') == null
      || frames.calendar == null) {
    alert('Votre navigateur ne supporte pas le calendrier.\nVous devez saisir la date manuellement au format JJ/MM/AA.');
    fld.focus();
    return;
  }

  calendar_scroll();
  document.getElementById('calendar').style.display = 'block';
  window.onscroll = calendar_scroll;

  if (minDate == null)
    minDate = clearTime(new Date());

  if (maxDate == null)
    maxDate = new Date(minDate.getFullYear() + 1, minDate.getMonth(), minDate.getDate() - 1);

  for (var form = 0; document.forms[form] != fld.form; form++) {}
  for (var field = 0; fld.form.elements[field] != fld; field++) {}
  calendar_writePage(form, field, 0, minDate.getTime(), maxDate.getTime());
}

function calendar_writePage(form, field, offset, minTime, maxTime) {
  var curDate = parseDate(document.forms[form].elements[field].value, new Date());
  var date = new Date(curDate.getFullYear(), curDate.getMonth() + offset, 1);
  var doc = frames.calendar.document;

  doc.open();
  doc.writeln('<html>');
  doc.writeln('<head>');
  doc.writeln('<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">');
  doc.writeln('<link href="/calendar.css" rel="stylesheet" type="text/css">');
  doc.writeln('</head>');

  doc.writeln('<body style="overflow: hidden" onLoad="focus()">');
  doc.writeln('<table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">');
  doc.writeln('  <tr class="title"><th colspan="6" align="left">Calendrier</th><th align="right"><a href="javascript:parent.calendar_close()">X</a></th></tr>');
  doc.writeln('  <tr>',
    date.getTime() <= minTime
      ? '<th align="right" class="disabled">&lt;&lt;</th>'
      : '<th align="right"><a href="javascript:parent.calendar_writePage(' + form + ', ' + field + ', '
	+ (offset - 1) + ', ' + minTime + ', ' + maxTime + ')">&lt;&lt;</a></th>',
    '<th colspan="5">', calendar_months[date.getMonth()], ' ', date.getFullYear(), '</th>',
    (new Date(date.getFullYear(), date.getMonth() + 1, 0)).getTime() >= maxTime
      ? '<th align="left" class="disabled">&gt;&gt</th></tr>'
      : '<th align="left"><a href="javascript:parent.calendar_writePage(' + form + ', ' + field + ', '
	+ (offset + 1) + ', ' + minTime + ', ' + maxTime + ')">&gt;&gt;</a></th></tr>');

  doc.write('  <tr>');
  for (var i = 0; i < 7; i++)
    doc.write('<td>' + calendar_days[i] + '</td>');
  doc.writeln('</tr>');

  doc.write('  <tr>');
  for (var i = 0; i < date.getDay(); i++)
    doc.write('<td><br></td>');
  for (var month = date.getMonth(); date.getMonth() == month; i++, date.setDate(date.getDate() + 1)) {
    if (i > 0 && (i % 7) == 0)
      doc.write('</tr>\n  <tr>');
    if (date.getTime() < minTime || date.getTime() > maxTime)
      doc.write('<td class="disabled">', date.getDate(), '</td>');
    else
      doc.write('<td', date.getTime() == curDate.getTime() ? ' class="selected"' : '',
	'><a href="javascript:parent.calendar_setTime(', form, ', ', field, ', ', date.getTime(), ')">',
	date.getDate(), '</a></td>');
  }
  for (; i < 42; i++) {
    if ((i % 7) == 0)
      doc.write('</tr>\n  <tr>');
    doc.write('<td><br></td>');
  }
  doc.writeln('</tr>');
  doc.writeln('</table>');
  doc.writeln('</body>');
  doc.writeln('</html>');
  doc.close();
}

function calendar_setTime(form, field, time) {
  document.forms[form].elements[field].value = formatDate(new Date(time));
  document.forms[form].elements[field].focus();
  document.forms[form].elements[field].select();
  calendar_close();
}

function calendar_close() {
  document.getElementById('calendar').style.display = 'none';
  window.oncroll = null;
}

function calendar_scroll() {
  var elm = document.getElementById('calendar');
  elm.style.left = document.body.scrollLeft + 10;
  elm.style.top = document.body.scrollTop + 10;
}
