
function CaptionE() {
  //     JAVASCRIPT INCLUDE FILE - (c) J R Stockton  >= 2009-04-19
  //             http://www.merlyn.demon.co.uk/estr-inc.js
  //                  Easter Routines, except Zeller
  //                See estrcalc.htm and estr-bcp.htm
  //       Routines may be copied, but URL must not be linked to.
  //                 Uses Div & Mod from include1.js
  }

var EincT=0


// Auxiliary functions for Easter work

function YMDobjToDoM(Obj) { // {Y,M,D} to DayOfMarch
  return (Obj.M-3)*31 + Obj.D }

function YMDobjToISO(Obj) { // {Y,M,D} to "Y*-MM-DD"
  with (Obj) return Y + "-" + LZ(M)  + "-" + LZ(D) }

function YDoMtoISO(Year, Day) { var Mth = 3
  if (Day>31) { Mth = 4 ; Day -= 31 }
  return Year + '-0' + Mth + '-' + LZ(Day) }

function DoMtoMonDD(DM) {
  return DM>31 ? "Apr "+LZ(DM-31) : "Mar "+DM }

function YDoMtoYMonDD(Y, DM) { return Y + " " + DoMtoMonDD(DM) }


// My Easter functions

function GoldenNumber(Yr) { return Mod(Yr, 19) + 1 }

function SunNumAny(Y) { // In lieu of Table I ; perpetual Greg.
  Y = 6 + Y + Div(Y, 4) - Div(Y, 100) + Div(Y, 400)
  return 6 - Mod(Y, 7) /* 0-6 matches Sunday Letter A-G */ }

function SunNumAll(Y) { // In lieu of Table I ; perpetual Greg.
  Y = Mod(Y, 400) 		// to 0..399
  Y += ((Y/4)|0) - ((Y/100)|0)
  return 6 - (Y+6)%7 /* 0-6 matches Sunday Letter A-G */ }

function SunNum400(Y) { // In lieu of Table I ; fast A.D. Greg.
  Y %= 400
  Y += ((Y/4)|0) - ((Y/100)|0)
  return 6 - (Y+6)%7 /* 0-6 matches Sunday Letter A-G */ }

SundayNumber = SunNumAll

function BCPcypher(Yr) { var CD = Div(Yr, 100)
  return Mod( Div(3*(CD+1), 4) - Div((13+CD*8), 25) + 23 , 30 ) }

function PFMfromTableIII(GN, CY) { var TR
  TR = (11*GN - 3) % 30			// top row entry for GN
  DM = 21 + (30 + CY - TR) % 30		// descend column to CY
  if (DM + +(GN>11) > 31+18) DM--	// adjust for split row
  return DM /* Day-of-March */ }

function SundayAfterPFM(DM, SN) { // plus 1..7 days to Sunday, J & G
  return DM + 1 + (60+SN-DM)%7 /* Day-of-March */ }

function BCPAllEaster(YR) { // cf DemoCalc, modular
  var GN, CY, SN, DM
  GN = GoldenNumber(YR)
  SN = SundayNumber(YR)
  CY = BCPcypher(YR)
  DM = PFMfromTableIII(GN, CY)
  return SundayAfterPFM(DM, SN) /* Day-of-March */ }

function JRSEaster(YR) { // cf BCPAllEaster, years in +-9E15
  var GN, CY, SN, DM, xx
  GN = Mod(YR, 19) + 1			// GN = GoldenNumber
  xx = Div(YR, 100)			// CY = BCPcypher
  CY = Mod( Div(3*(xx+1), 4) - Div((13+xx*8), 25) + 23, 30 )
  YR = Mod(YR, 400) 			// to 0..399
  xx = 6 + YR + ((YR/4)|0) - ((YR/100)|0)
  SN = 6 - xx%7		// Sunday Number 0-6 gives Sunday Letter A-G
  DM = 21 + (3 + CY + 19*GN)%30 ; DM -= ((GN>11) + DM > 49) // PFM
  return DM + 1 + (60+SN-DM)%7 /* Day-of-March */ }

function jrsEaster(YR) { // Fast JRSEaster, unsigned 32-bit year
  var gn, xx, cy, DM
  gn = YR % 19					// gn ~ GoldenNumber
  xx = (YR/100)|0
  cy = ((3*(xx+1)/4)|0) - (((13+xx*8)/25)|0)	// cy ~ BCPcypher
  xx = ( 6 + YR + ((YR/4)|0) - xx + ((YR/400)|0) ) % 7
  DM = 21 + (gn*19 + cy + 15)%30 ; DM -= ((gn>10) + DM > 49) // PFM
  return DM + 1 + (66-xx-DM)%7 /* Day-of-March */ }

function EasterJRS(YR) {
  // Faster jrsEaster, unsigned 32-bit year, after reading Knuth's.
  var gn, xx, cy, qq, DM
  gn = YR % 19					// gn ~ GoldenNumber
  xx = (YR/100)|0
  cy = (qq=((3*(xx+1)/4)|0)) - (((13+xx*8)/25)|0)  // cy ~ BCPcypher
//xx = ( 6 + ((5*YR/4)|0) - xx + ((YR/400)|0) ) % 7
  xx = ( 6 + ((5*YR/4)|0) - qq ) % 7		// cf. Knuth
  DM = 21 + (gn*19 + cy + 15)%30 ; DM -= ((gn>10) + DM > 49) // PFM
  return DM + 1 + (66-xx-DM)%7 /* Day-of-March */ }


// Independent Easter functions

function EGRJulnEstr(Y) { // Julian A.D. - E G Richards, Algorithm N
  var A = Y % 19
  var B = 22 + (225-11*A) % 30
  var DM = B + (56 + 6*Y - ((Y/4)|0) - B) % 7
  return DM /* Day-of-March */ }


function EGREaster(Yr) { // Gregorian - E G Richards, Algorithm P
  var AA = Math.floor(Yr / 100)
  var BB = AA - Math.floor(AA / 4)
  var CC = Yr % 19
  var DD = (15 + 19*CC + BB -
    Math.floor((AA + 1 - Math.floor((AA+8) / 25)) / 3)) % 30
  var EE = DD - Math.floor((CC+11*DD) / 319)
  var DM = 22 + EE +
    (140004 - (Yr + Math.floor(Yr / 4))%7 + BB - EE) % 7
  var EMo = 3 + Math.floor(DM / 32)
  var EDy = 1 + (DM-1) % 31
  return {Y:Yr, M:EMo, D:EDy} }

function CDWFEaster(year) {
    // http://www.davros.org/misc/easter.html  Clive Feather
  var a, b, c, d, e, f, g, h, j, k, m, month, date
  a = year%19
  b = Math.floor(year/100) ; c = year%100
  d = Math.floor(   b/4)   ; e =    b%4
  f = Math.floor(   c/4)   ; g =    c%4
  h = Math.floor((8*b+13)/25)
    j = (19*a+b-d-h+15)%30
  m = Math.floor((a+11*j)/319)
    k = (2*e+2*f-g-j+m+32)%7
  month = Math.floor((j-m+k+90)/25)
    date = (j-m+k+19+month)%32
  return {Y:year, M:month, D:date} }

function USNOEaster(y) {
  // http://aa.usno.navy.mil/faq/docs/easter.html
  var Mf = Math.floor, c, n, k, i, j, l, m, d
  c = Mf(y / 100)
  n = y - 19 * Mf( y / 19 )
  k = Mf(( c - 17 ) / 25)
  i = c - Mf(c / 4) - Mf(( c - k ) / 3) + 19 * n + 15
  i = i - 30 * Mf( i / 30 )
  i = i - Mf( i / 28 ) * ( 1 - Mf( i / 28 ) * Mf( 29 / ( i + 1 ) )
      * ( Mf( 21 - n ) / 11 ) )
  j = y + Mf(y / 4) + i + 2 - c + Mf(c / 4)
  j = j - 7 * Mf( j / 7 )
  l = Math.round(i - j)
  m = 3 + Mf(( l + 40 ) / 44)
  d = l + 28 - 31 * Mf( m / 4 )
  return {Y:y, M:m, D:d} }

function CFAQEaster(year) { // Calendar FAQ
  var G, C, H, I, J, L
  G = year % 19
  C = Div(year,100)
  H = (C - Div(C,4) - Div(8*C+13,25) + 19*G + 15) % 30
  I = H - Div(H,28)*(1 - Div(29,H+1)*Div(21-G,11))
  J = (year + Div(year,4) + I + 2 - C + Div(C,4)) % 7
  L = I - J
  EasterMonth = 3 + Div(L+40,44)
  EasterDay = L + 28 - 31*Div(EasterMonth,4)
  return {Y:year, M:EasterMonth, D:EasterDay} /* L + 28 */ }

function HenkEaster(year) { // Henk Reints
  var A, B, C, D, E, F, G
  A = year % 19 + 1 			// Golden Number (Meton)
  B = Div(year, 100) + 1		// Century
  C = Div((3 * B), 4) - 12		// Greg-Julian Leap Diff
  D = Div((8 * B + 5), 25) - 5		// to adjust Meton
  E = Div((year * 5), 4) - 10 - C	// day-of-week
  F = ( (11 * A + 20 + D - C) % 30 + 30) % 30
    // the double % protects against F < 0 for large years
  F += (F == 24 || (F == 25 && A > 11))	// Epact
  G = 44 - F				// a Full Moon
  if (G < 21) G += 30			// Paschal Full Moon
  return G + 7 - (E + G) % 7 /* return Day-of-March */ }


var EincB=0 // end.

