<!--

////////////////////////////////////////////////////////
// Copyright 2003, Timothy James Forsythe, all rights reserved.
// Permission granted to use, copy, modify, and distribute so long as
// the above copyright and this permission statement are retained in all
// copies.  THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
//
// based on the algorithms of ?
////////////////////////////////////////////////////////

var FR_DAYS_PER_WEEK         = 10;
var FR_WEEKS_PER_MONTH       = 3;
var FR_MONTHS_PER_YEAR       = 12;
var FR_DAYS_PER_INTERCALARIS = 5;
var FR_YEARS_PER_CYCLE       = 4;

var FR_INTERCALARIS_MONTH = FR_MONTHS_PER_YEAR + 1;
var FR_DAYS_PER_MONTH     = FR_DAYS_PER_WEEK * FR_WEEKS_PER_MONTH;
var FR_DAYS_PER_CYCLE     = (((FR_DAYS_PER_MONTH * FR_MONTHS_PER_YEAR) + FR_DAYS_PER_INTERCALARIS) * FR_YEARS_PER_CYCLE) + 1;

var FR_CORRELATION        = 2375474;
var FR_FIRST_VALID        = 2375840;
var FR_LAST_VALID         = 2380952;

function FrDate(dstr,mstr,d,m,y,ysgn)
{
  this.dstr  = dstr;
  this.mstr  = mstr;
  this.d     = d;
  this.m     = m;
  this.y     = y;
  this.ysgn  = ysgn;
}

function JDNToFrench(jdn)
{
  var DAYS     = new Array("Primidi", "Duodi", "Tridi", "Quartidi", "Quintidi", "Sextidi", "Septidi", "Octidi", "Nonidi", "Decadi", "Jour de la vertu", "Jour du genie", "Jour du travail", "Jour de l'opinion", "Jour des recompenses", "Jour de la revolution");
  var MONTHS   = new Array("Vendemiaire", "Brumaire", "Frimaire", "Nivose", "Pluviose", "Ventose", "Germinal", "Floreal", "Prairial", "Messidor", "Thermidor", "Fructidor", "Sans-culottides");

  var date = new FrDate(0,0,0,0,0,1);
  var temp;
  var doy;

  if (jdn >= FR_FIRST_VALID)
  {
    temp     = (jdn - FR_CORRELATION) * FR_YEARS_PER_CYCLE - 1;
    date.y   = trunc(temp / FR_DAYS_PER_CYCLE);
    doy      = trunc((temp % FR_DAYS_PER_CYCLE) / FR_YEARS_PER_CYCLE);
    date.m   = trunc(doy / FR_DAYS_PER_MONTH) + 1;
    date.d   = doy % FR_DAYS_PER_MONTH + 1;
    date.dstr = DAYS[((date.d-1) % FR_DAYS_PER_WEEK) + (FR_DAYS_PER_WEEK * Math.floor(date.m/FR_INTERCALARIS_MONTH))];
    date.mstr = MONTHS[date.m-1];
  }
  else
  {
    date.y = "";
    date.dstr = "";
  }

  return date;
}

function FrenchToJDN(d,m,y)
{
  var jdn;

  // check for invalid dates
  if ( m < 1 || m > FR_INTERCALARIS_MONTH ||
       d < 1 || d > FR_DAYS_PER_MONTH)
  {
    jdn = 0;
  }
  else
  {
    jdn = trunc((y * FR_DAYS_PER_CYCLE) / FR_YEARS_PER_CYCLE) + (m - 1) * FR_DAYS_PER_MONTH + d + FR_CORRELATION;
  }

  return jdn;
}

function trunc(val)
{
  if (val >= 0)
  {
    return Math.floor(val);
  }
  else
  {
    return Math.ceil(val);
  }
}

-->

