//JavaScript modification T. Dacre 1999
//based on a BASIC program MOON EFFECTS by Bradley E. Schaefer

//   This program helps anyone who needs to know the Moon's
//   phase (age) on
//   any date within several thousand years in the past or future.
//   To illustrate its application, Bradley Schaefer applied it
//   to a number of famous events influenced by the Moon in
//   World War II.  His article appeared in Sky & Telescope for
//   April 1994, page 86.

function MP(day)
{
day2=new Date();
day2=day;
Date.UTC(day.getFullYear(),day.getMonth(), day.getDay());
var Y=day2.getFullYear();
var M=day2.getMonth()+1;
var D=day2.getDate();
var YY,MM,K1,K2,K3,J,V,IP,AG;

YY=Y-Math.floor((12-M)/10);
MM=M+9;
if (MM>=12) {MM=MM-12};
K1=Math.floor(365.25*(YY+4712));
K2=Math.floor(30.6*MM+.5);
K3=Math.floor(Math.floor((YY/100)+49)*.75)-38;
J=K1+K2+D+59;
if (J>2299160) {J=J-K3};
V=(J-2451550.1)/29.530588853;
V=V-Math.floor(V);
if (V<0) {V=V+1};
IP=V;
AG=IP*29.53;
IP=IP*Math.PI*2
return IP;
}

function calceclp(calcmonth,calcyear){
//Eclipse's
EC1=0;
EC2=0;
EM1="";
EM2="";
R1=3.14159265/180;
 U=0;
Y=calcyear;
calcmonth++;
G=1;
K0=Math.floor((Y-1900)*12.3685);
T=(Y-1899.5)/100;
T2=T*T;
 T3=T*T*T;
J0=2415020+29*K0;
F0=0.0001178*T2-0.000000155*T3;
F0=F0+0.75933+0.53058868*K0;
F0=F0-0.000837*T-0.000335*T2;
J0=J0+Math.floor(F0);
 F0=F0-Math.floor(F0);
M0=K0*0.08084821133;
M0=360*(M0-Math.floor(M0))+359.2242;
M0=M0-0.0000333*T2;
M0=M0-0.00000347*T3;
M1=K0*0.07171366128;
M1=360*(M1-Math.floor(M1))+306.0253;
M1=M1+0.0107306*T2;
M1=M1+0.00001236*T3;
B1=K0*0.08519585128;
B1=360*(B1-Math.floor(B1))+21.2964;
B1=B1-0.0016528*T2;
B1=B1-0.00000239*T3;
for (K9=1;K9<=27;K9=K9+2){
J=J0+14*K9;
 F=F0+0.765294*K9;
K=K9/2;
M5=(M0+K*29.10535608)*R1;
M6=(M1+K*385.81691806)*R1;
B6=(B1+K*390.67050646)*R1;
F=F-0.4068*Math.sin(M6);
F=F+(0.1734-0.000393*T)*Math.sin(M5);
F=F+0.0161*Math.sin(2*M6);
F=F-0.0104*Math.sin(2*B6);
F=F-0.0074*Math.sin(M5-M6);
F=F-0.0051*Math.sin(M5+M6);
F=F+0.0021*Math.sin(2*M5);
F=F+0.5/1440;
J=J+Math.floor(F);
 F=F-Math.floor(F);


//100 REM  LUNAR ECLIPSE SUBROUTINE
function eclipser(){
estr="";
 D7=0;
 if (Math.abs(Math.sin(B6))>0.36){return 0}
 S=5.19595-0.0048*Math.cos(M5);
 S=S+0.0020*Math.cos(2*M5);
 S=S-0.3283*Math.cos(M6);
 S=S-0.0060*Math.cos(M5+M6);
 S=S+0.0041*Math.cos(M5-M6);
 C1=0.2070*Math.sin(M5);
 C1=C1+0.0024*Math.sin(2*M5);
 C1=C1-0.0390*Math.sin(M6);
 C1=C1+0.0115*Math.sin(2*M6);
 C1=C1-0.0073*Math.sin(M5+M6);
 C1=C1-0.0067*Math.sin(M5-M6);
 C1=C1+0.0117*Math.sin(2*B6);
 D9=Math.abs(S*Math.sin(B6)+C1*Math.cos(B6));
 U=0.0059+0.0046*Math.cos(M5);
 U=U-0.0182*Math.cos(M6);
 U=U+0.0004*Math.cos(2*M6);
 U=U-0.0005*Math.cos(M5+M6);

 RP=1.2847+U;
 RU=0.7404-U;

 MPE=(1.5572+U-D9)/0.545;




 if (MPE<0){return 0}
 MU=(1.0129-U-D9)/0.545;
 D5=1.5572+U;
 D6=1.0129-U;
 D7=0.4679-U;
 N=(0.5458+0.04*Math.cos(M6))/60;
 D5=((D5*D5-D9*D9)*(D5*D5-D9*D9))/N;
 if (!(MU<=0)){ D6=((D6*D6-D9*D9)*(D6*D6-D9*D9))/N};
 if (!(MU<=1)){  D7=((D7*D7-D9*D9)*(D7*D7-D9*D9))/N};


Jq=J;
Fq=F;
G=1;
if ( Y<1583){G=0}

Fq=Fq+0.5;
if (!(Fq<1)){
Fq=Fq-1;
Jq=Jq+1;
}
if (G==1){ A1=Math.floor((Jq/36524.25)-51.12264);
A=Jq+1+A1-Math.floor(A1/4)
}
else {A=Jq};
B=A+1524;
C=Math.floor((B/365.25)-0.3343);
Dq=Math.floor(365.25*C);
E=Math.floor((B-Dq)/30.61);
Dq=B-Dq-Math.floor(30.61*E)+Fq;
Mq=E-1;
Yq=C-4716;
if (E>13.5){Mq=Mq-12};
if (Mq<2.5) {Yq=Yq+1};
D1=Math.floor(Dq);
H=24*(Dq-D1);
H1=Math.floor(H);
M9=Math.floor(60*(H-H1));
if (M9<10){M9="0"+M9};







if (MU<0 ){estr=estr+"Partial Eclipse, "}
else{
D6=Math.floor(D6+0.5);
estr=estr+"Total Eclipse - ";
   }

if (!(MU<0 )){
D6=Math.floor(D6+0.5);
 D7=Math.floor((D7+0.5)*10)/10;
estr=estr+D7+"min duration, ";
   }

estr=estr+"Maximum phase "+H1+":"+M9+"UT";
if ((Mq == calcmonth) && (Yq == calcyear)) {
	if (EC1==0)
		{EC1=D1;EM1=estr}
    else
		{EC2=D1;EM2=estr}
}
}
}
}

function moonCalc(calcday, calcmonth,calcyear)
{
  calceclp(calcmonth,calcyear);
//alert(calcday)
  //10 REM    NEW AND FULL MOONS
  //12 REM
  //14 REM

  var Y,JJ,K1,K2,K3,D,M,MM,FM1,FM2,NM1,NM2;
  FM1=0;
  FM2=0;
  NM1=0;
  NM2=0;
  Tt1="";
  Tt2="";
  Tt3="";
  Tt4="";

  Y=calcyear;  // year
  M=calcmonth;
  M++;
  D=-1;
  YY=Y-Math.floor((12-M)/10);
  MM=M+9;
  if(MM>=12){MM=MM-12}
  K1=Math.floor(365.25*(YY+4712));
  K2=Math.floor(30.6*MM+.5);
  K3=Math.floor(Math.floor((YY/100)+49)*.75)-38;
  JJ=K1+K2+D+59;
  if (JJ>2299160){JJ=JJ-K3}

  var A,B,C,Dq,E,G,D1,H1,M9,Mq,H,Yq,A1,Fq,Jq;
  var R1,U,K0,T,T2,T3,J0,F0,J,M0,M1,B1,M5,M6,K9,F;
  R1=3.14159265/180;
  U=0;
  K0=Math.floor((Y-1900)*12.3685);
  T=(Y-1899.5)/100;
  T2=T*T;
  T3=T*T*T;
  J0=2415020+29*K0;
  F0=0.0001178*T2-0.000000155*T3;
  F0=F0+0.75933+0.53058868*K0;
  F0=F0-0.000837*T-0.000335*T2;
  J=J+Math.floor(F);
  F=F-Math.floor(F);
  M0=K0*0.08084821133;
  M0=360*(M0-Math.floor(M0))+359.2242;
  M0=M0-0.0000333*T2;
  M0=M0-0.00000347*T3;
  M1=K0*0.07171366128;
  M1=360*(M1-Math.floor(M1))+306.0253;
  M1=M1+0.0107306*T2;
  M1=M1+0.00001236*T3;
  B1=K0*0.08519585128;
  B1=360*(B1-Math.floor(B1))+21.2964;
  B1=B1-0.0016528*T2;
  B1=B1-0.00000239*T3;

  for(K9=0;K9<29;K9++)
  {
    J=J0+14*K9;
    F=F0+0.765294*K9;
    K=K9/2;
    M5=(M0+K*29.10535608)*R1;
    M6=(M1+K*385.81691806)*R1;
    B6=(B1+K*390.67050646)*R1;
    F=F-0.4068*Math.sin(M6);
    F=F+(0.1734-0.000393*T)*Math.sin(M5);
    F=F+0.0161*Math.sin(2*M6);
    F=F+0.0104*Math.sin(2*B6);
    F=F-0.0074*Math.sin(M5-M6);
    F=F-0.0051*Math.sin(M5+M6);
    F=F+0.0021*Math.sin(2*M5);
    F=F+0.0010*Math.sin(2*B6-M6);
    J=J+Math.floor(F);
    F=F-Math.floor(F);


    Jq=J;
    Fq=F;
    G=1;
    if ( Y<1583)
    {
      G=0
    }

    Fq=Fq+0.5;
    if (!(Fq<1))
    {
      Fq=Fq-1;
      Jq=Jq+1;
    }
    if (G==1)
    {
      A1=Math.floor((Jq/36524.25)-51.12264);
      A=Jq+1+A1-Math.floor(A1/4)
    }
    else
    {
      A=Jq;
    }
    B=A+1524;
    C=Math.floor((B/365.25)-0.3343);
    Dq=Math.floor(365.25*C);
    E=Math.floor((B-Dq)/30.61);
    Dq=B-Dq-Math.floor(30.61*E)+Fq;
    Mq=E-1;
    Yq=C-4716;
    if (E>13.5)
    {
      Mq=Mq-12;
    }
    if (Mq<2.5)
    {
      Yq=Yq+1;
    }
    D1=Math.floor(Dq);
    H=24*(Dq-D1);
    H1=Math.floor(H);
    M9=Math.floor(60*(H-H1));
    if (M9<10)
    {
      M9="0"+M9;
    }

    if ((U==0) && (Mq==M) && (Yq==Y))
    {
      if (NM1==0)
      {
        NM1=D1;
        Tt1=H1+":"+M9
      }
      else
      {
        if(NM2==0)
        {
          NM2=D1;
          Tt2=H1+":"+M9;
        }
      }
    }
    if ((U==1) && (Mq==M) && (Yq==Y))
    {
      if (FM1==0)
      {
        FM1=D1;
        Tt3=H1+":"+M9;
      }
      else
      {
        if(FM2==0)
        {
          FM2=D1;
          Tt4=H1+":"+M9;
        }
      }
    }

    U=U+1;

    if (U==2)
    {
      U=0;
    }
  }


  var temp,dayoffset,days,i,j,monthnames,todayday;
  today=new Date(Date.UTC(calcyear,calcmonth,10,1,1));

  month=new Date(Date.UTC(calcyear,calcmonth,10,1,1));

  todayday=today.getDate();
  month.setDate(1);
  today.setDate(1);
  today.setMonth(today.getMonth()+1);
  days=(today-month)/1000/60/60/24;
  createMoonTable(month, days, calcday, NM1, NM2, FM1, FM2);
}


function createMoonTable(month, days, curDay, NM1, NM2, FM1, FM2)
{
  var d = document;
  var i, j;
  var f = d.createDocumentFragment();
  var t = d.createElement("table");
  var r = d.createElement("tr");
  var dayNames = new Array("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun");
  var head = d.createElement("thead");
  var dayoffset=month.getDay()-1;
  var monthnames=["January","February","March","April","May","June","July","August","September","October","November","December"];

  var cap=d.createElement("caption");
  cap.appendChild(d.createTextNode("Phases of the moon for " + monthnames[month.getMonth()] + " " + month.getFullYear()));
  t.appendChild(cap);
  
  if (dayoffset==-1){dayoffset=6;}

  // Create the table Header row
  for(i = 0; i < 7; i++)
  {
    var h = d.createTextNode(dayNames[i]);
    var c = d.createElement("th");
    c.appendChild(h);
    r.appendChild(c);
  }
  head.appendChild(r);
  t.appendChild(head);

  var b=d.createElement("tbody");
  // Now create the rows of images.
  i = 0;
  var more = 1;
  while(more == 1)
  {
    r = d.createElement("tr");
    var r2 = d.createElement("tr");

    for(j = 1; j < 8; j++)
    {
      var c = d.createElement("td");
      var c2 = d.createElement("td");
      var day = (i*7)+j-dayoffset;
      if ( day > 0 && day <= days)
      {
        var txt = d.createTextNode("" + day);
        c.appendChild(txt);
        var s = d.createElement("span");
        s.className="moonSpan"
        s.appendChild(d.createTextNode(" New"))
        if(NM1 == day || NM2 == day) c.appendChild(s);
        var s2 = d.createElement("span");
        s2.className="moonSpan"
        s2.appendChild(d.createTextNode(" Full"))
        if(FM1 == day || FM2 == day) c.appendChild(s2);
        month.setDate(day);
        var im = d.createElement("img");
        var src ="../graphics/moon/moon" + (Math.floor(MP(month)*29/2/Math.PI)+1) + ".gif";
        im.setAttribute("src", src)
        c2.appendChild(im);
        if(curDay == day)
        {
          c.id="curday";
          c2.id="curimg";
        }
      }
      if(day > days)more=0;
      c.className = "moonDay"
      c2.className ="moonImage";
      r.appendChild(c);
      r2.appendChild(c2);
    }
    b.appendChild(r);
    b.appendChild(r2);
    i++;
  }
  t.appendChild(b);
  t.className="moonTable";
  f.appendChild(t);
  var loc = d.getElementById("moonPhase");
  if(loc.firstChild)loc.removeChild(loc.firstChild);
  loc.appendChild(f);
}


function doCalc()
{
  var i,month,year;
  for (i=0;i<document.forms[0].a.options.length;i++)
  {
    if (document.forms[0].a.options[i].selected)
    {
      month=document.forms[0].a.options[i].value;
    }
  }
  for (i=0;i<document.forms[0].b.options.length;i++)
  {
    if (document.forms[0].b.options[i].selected)
    {
      year=document.forms[0].b.options[i].value;
    }
  }

  moonCalc(month,year);
}
