<!--
////////////////////////////////////////////////////////
// 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.
////////////////////////////////////////////////////////

var CECIL_DEE = 0
var DEE_ONLY  = 1

var CD_FIRST_DAY              = 1721120; // 1 January 1 Dee-Cecil
var CD_YEARS_PER_CYCLE        = 33; 
var CD_LEAP_PERIODS_PER_CYCLE = 8;
var CD_YEARS_PER_LEAP_PERIOD  = 4;
var CD_DAYS_PER_YEAR          = 365;
var CD_DAYS_PER_LEAP_PERIOD   = (CD_DAYS_PER_YEAR * CD_YEARS_PER_LEAP_PERIOD) + 1; // 1461
var CD_DAYS_PER_CYCLE         = (CD_DAYS_PER_LEAP_PERIOD * CD_LEAP_PERIODS_PER_CYCLE) + CD_DAYS_PER_YEAR;  // 12053


function CDDate()
{
  this.dayStr   = "";
  this.day      = 0;
  this.month    = 0;
  this.monthStr = "";
  this.year     = 0;
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// A = JD - 1721120            # days after Year 0 (1 BC) March 1st.  Dee-Cecil (or Gregorian)
//                               For the Dee-only calendar use A = JD - 1721119.
// B = (A%12053)%1461          # dates between DATE(Y,M,D) and the prior 29 Feb (or 33-year block)
// 
// C = B%365 + 365*((B/365)/4) # dates between (Y,M,D) and end of prior February
// 
// D = ((10*C+5)%306+9)/10     Day of Month in DATE(Y,M,D) calculated from C
// 
// M = (10*C+5)/306            Month of Year in DATE(Y,M,D) calculated from C,
//   + 3                       by making 0 thru 11 into 3 thru 14 (Mar thru Feb)
//   - (C/306)*12              and turning 13 and 14 into 1 and 2 (Jan and Feb).
// 
// Y = 33 * (A/12053)          Thirty three years for each prior 12053-day cycle
//   + 4 * ((A%12053)/1461)    Add four years for each prior leftover 1461-day cycle
//   + B/365 - (B/365)/4       Add one year for each prior 365-day period
//   + C/306                   Finally add an extra calendar year if date is after Dec 31st.
////////////////////////////////////////////////////////////////////////////////////////////////////


function JDNToCD(jdn,calendar)
{
  var DAYS   = new Array("Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday");
  var MONTHS = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

  // create a new calendar date to return
  var date = new CDDate();

  if (calendar == DEE_ONLY)
  {
    jdn += 1;
  }

  if (jdn >= 1721426)
  {
    var A = jdn - CD_FIRST_DAY; 						// A

    var cycleCount = div(A,CD_DAYS_PER_CYCLE);				// A/12053
    var dayOfCycle = mod(A,CD_DAYS_PER_CYCLE); 			// A%12053
    
    var dayOfPeriod = mod(dayOfCycle,CD_DAYS_PER_LEAP_PERIOD);		// (A%12053)%1461 = B
    
    var temp2 = div(dayOfPeriod,CD_DAYS_PER_YEAR);			// B/365
    var temp3 = mod(dayOfPeriod,CD_DAYS_PER_YEAR); 			// B%365
    var temp4 = div(temp2,CD_YEARS_PER_LEAP_PERIOD);			// (B/365)/4
    var C = temp3 + (CD_DAYS_PER_YEAR * temp4);			// B%365 + (365 * ((B/365)/4)) = C
    
    var temp5 = ((10 * C) + 5);						// (10*C)+5
    var temp6 = div(temp5,306);						// ((10*C)+5)/306
    var temp7 = mod(temp5,306);  					// ((10*C)+5)%306
    var temp8 = (temp7 + 9);						// (((10*C)+5)%306) + 9
    var dayOfMonth = div(temp8,10); 					// ((((10*C)+5)%306) + 9) / 10 = D
    
    var temp9 = temp6 + 3;						// (((10*C)+5)/306) + 3
    var temp10 = div(C,306); 						// (C/306)
    var temp10a = temp10 * 12; 						// (C/306) * 12			
    var month = temp9 - temp10a;					// ((((10*C)+5)/306) + 3) - ((C/306) * 12) = M

    var temp11 = cycleCount * CD_YEARS_PER_CYCLE;			// (A/12053) * 33
    var temp12 = CD_YEARS_PER_LEAP_PERIOD * div(dayOfCycle,CD_DAYS_PER_LEAP_PERIOD);	// 4 * ((A%12053) / 1461)
    var temp13 = temp2 - div(temp2,CD_YEARS_PER_LEAP_PERIOD);		// (B/365) - ((B/365)/4)
    var year = temp11 + temp12 + temp13 + temp10;			// ((A/12053) * 33) + (4 * ((A%12053) / 1461)) + ((B/365) - ((B/365)/4)) + (C/306)

    if (calendar == DEE_ONLY)
    {
      A -= 1;
    }
     
    date.dayStr   = DAYS[A % 7];
    date.monthStr = MONTHS[month-1];
  
    date.day   = dayOfMonth;
    date.month = month;
    date.year  = year;
  }

  return date;
}


//////////////////////////////////////////////////////////////////////////////
// F   = (M+9) / 12       Whether (F=1) or not (F=0) Month (M) is after February.
// 
// JD  = 1721426          Universal Julian Day Number of A.D. 1 January 1st. (noon UT).
//     + (Y-1) * 365      Add all days in years prior to year Y (excluding leap days).
//     + (8*(Y+F)) / 33   Add all prior leap days - Greg. uses (Y+F-1)/4-(Y+F-1)/100+(Y+F-1)/400.
//     + (M-1) * 30       Add 30 days for each month prior to month M in year Y.
//     + (5*M)/9 - 2*F    Correct for prior months under or over 30 days.
//     + (D-1)            Finally add all days prior to day D in month M.
//////////////////////////////////////////////////////////////////////////////
function CDToJDN(year, month, day, calendar) // 1 based
{
  var F = div((month + 9),12);

  // add first day
  var jdn = 1721426;
  
  // add all common days in previous years
  jdn += ((year - 1) * CD_DAYS_PER_YEAR);
  
  jdn += div((CD_LEAP_PERIODS_PER_CYCLE * (year + F)),CD_YEARS_PER_CYCLE);
  
  jdn += (month - 1) * 30;
  
  jdn += div((5 * month),9) - (2 * F);
  
  jdn += day - 1;

  if (calendar == DEE_ONLY)
  {
    jdn -= 1;
  }
 
  return jdn;
}

-->

