
var a_giul=new Array(12);
var cv=4*Math.atan(1)/180;

/* inizializzazione anno lunare */

    a_giul[1]=0;   a_giul[2]=31;  a_giul[3]=59;  a_giul[4]=90;   a_giul[5]=120;  a_giul[6]=151;
    a_giul[7]=181; a_giul[8]=212; a_giul[9]=243; a_giul[10]=273; a_giul[11]=304; a_giul[12]=334;

/* dichiarazione oggetto */

function lunario(m,a) {

   this.mese=m;
   this.anno=a;
   this.LunaNuova   =LunaNuova(1,m,a);
   this.PrimoQuarto =PrimoQuarto(2,m,a);
   this.LunaPiena   =LunaPiena(3,m,a);
   this.UltimoQuarto=UltimoQuarto(4,m,a);
   this.LunaNuova2  =LunaNuova2(5,m,a);
}

/* calcolo anno bisestile: 0 se anno normale, 1, se bisestile */

function bisestile(a)
{
   if ((a % 4 == 0) && (a % 100 != 0) || (a % 400 == 0))
   return 1;
   else
   return 0;
}

/* calcolo il valore dello scostamento iniziale k */

function calcola_k(g,m,a)
{

  g_giul=0; // giorno giuliano;

  if (m>2) { g_giul=g+a_giul[m]+bisestile(a) } else { g_giul=g+a_giul[m] }

  return Math.floor((a+g_giul/(365+bisestile(a))-1900)*12.3685);

}

/* calcolo anomalia media sole */

function AnomaliaMedia_sole(t,k)
{

   m = 359.2242+29.10535608*k-0.0000333*Math.pow(t,2)-3.47*Math.pow(10,-6)*Math.pow(t,3);
   mm= Math.floor(m/360);
   m = m-mm*360;

   return m*cv;

}

/* calcolo anomalia media luna */

function AnomaliaMedia_luna(t,k)
{
   m1= 306.0253+385.81691806*k+0.0107306*Math.pow(t,2)+1.236*Math.pow(10,-5)*Math.pow(t,3);
   mm= Math.floor(m1/360);
   m1= m1-mm*360;

   return m1*cv;
}

/* calcolo argomento latitudine luna */

function ArgomentoLatitudine_luna(t,k)
{
   f = 21.2964+390.67050646*k-1.16528*Math.pow(10,-3)*Math.pow(t,2)-2.39*Math.pow(10,-6)*Math.pow(t,3);
   mm= Math.floor(f/360);
   f = f-mm*360;

   return f*cv;

}

/* calcolo correzione comune primo e secondo quarto */

function CorrezzioneComune_quarti(t,k)
{
   var m = AnomaliaMedia_sole(t,k);
   var m1= AnomaliaMedia_luna(t,k);
   var f = ArgomentoLatitudine_luna(t,k);

   c=(0.1721-0.0004*t)*Math.sin(m)+0.0021*Math.sin(2*m)-0.628*Math.sin(m1);
   c=c+0.0089*Math.sin(2*m1)-0.0004*Math.sin(3*m1)+0.0079*Math.sin(2*f);
   c=c-0.0119*Math.sin(m+m1)-0.0047*Math.sin(m-m1)+0.0003*Math.sin(2*f+m);
   c=c-0.0004*Math.sin(2*f-m)-6.000001*Math.pow(10,-4)*Math.sin(2*f+m1)+0.0021*Math.sin(2*f-m1);
   c=c+0.0003*Math.sin(m+2*m1)+0.0004*Math.sin(m-2*m1)-0.0003*Math.sin(2*m+m1);

   return c;
}

/* calcolo correzione addizionale primo quarto */

function CorrezioneAddizionale_pquarto(t,k)
{
   var m = AnomaliaMedia_sole(t,k);
   var m1= AnomaliaMedia_luna(t,k);

   return CorrezzioneComune_quarti(t,k)+0.0028-0.0004*Math.cos(m)+0.0003*Math.cos(m1);

}

/* calcolo correzione addizionale ultimo quarto */

function CorrezioneAddizionale_uquarto(t,k)
{
   var m = AnomaliaMedia_sole(t,k);
   var m1= AnomaliaMedia_luna(t,k);

   return CorrezzioneComune_quarti(t,k)-0.0028+0.0004*Math.cos(m)-0.0003*Math.cos(m1);

}

/* calcolo correzione luna */

function Correzione_luna(t,k)
{
   var m = AnomaliaMedia_sole(t,k);
   var m1= AnomaliaMedia_luna(t,k);
   var f = ArgomentoLatitudine_luna(t,k);

   c=(0.1734-0.000393*t)*Math.sin(m)+0.0021*Math.sin(2*m)-0.4068*Math.sin(m1);
   c=c+0.0161*Math.sin(2*m1)-0.0004*Math.sin(3*m1)+0.0104*Math.sin(2*f);
   c=c-0.0051*Math.sin(m+m1)-0.0074*Math.sin(m-m1)+0.0004*Math.sin(2*f+m);
   c=c-0.0004*Math.sin(2*f-m)-6.000001*Math.pow(10,-4)*Math.sin(2*f+m1)+0.001*Math.sin(2*f-m1);
   c=c+0.0005*Math.sin(m+2*m1);

   return c;

}

/* conversione da giuliano a data civile nel formato g/m alle ore h:m:s */

function data_fase(t,k,d,c,g_fase,m_fase,o_fase)
{
  jj=15020.75933+29.53058868*k+0.0001178*Math.pow(t,2);
  jj=jj-1.55*Math.pow(10,-7)*Math.pow(t,3)+0.00033*Math.sin(d);
  jj=jj+c;

  /* conversione da giorno giuliano a data civile */

  dj=jj-Math.floor(jj)+0.5;
  jj=Math.floor(jj);

  if (dj>=1)
  {
     dj--; jj++;
  }

  jj +=2400000;

  b=jj;

  if (b>2299160) { a=Math.floor((jj-1867216.25)/36524.25); b=jj+1+a-Math.floor(a/4); }

  c=b+1524; d=Math.floor((c-122.1)/365.25); e=Math.floor(365.25*d); h=Math.floor((c-e)/30.6001);

  g=c-e+dj-Math.floor(30.6001*h);


  m=h-1;

  if (h>=13.5) { m=h-13 }

  y=d-4716;

  if (m<=2.5)
  {
     y=d-4715
  }

  fg=g-Math.floor(g); fg=fg*24; h=Math.floor(fg); a=fg-h; a=a*60;  mi=Math.floor(a); s=a-mi; s=s*60; s=Math.floor(s);

  g=Math.floor(g); // giorno

  if (mi>=10) 
    mi2 = mi
  else
    mi2 = "0"+mi;

  if (s>=10)
    s2 = s
  else
    s2 = "0"+s;

  g_fase.value=g; m_fase.value=m; o_fase.value=(" ore: "+h+":"+mi2+":"+s2);

}

function calcola_data(f,m,a){

   var k1   = calcola_k(1,m,a);
   var jk   = f;
   var fine = false;
   var d_tmp="";
   g_fase = new String();
   m_fase = new String();
   o_fase = new String();

   while (fine==false){

      k=(jk-1)*0.25+k1;
      t=k/1236.85;
      d=166.56+132.87*t-0.009173*Math.pow(t,2);
      d=d*cv;


      switch (f){
          case 1: { data_fase(t,k,d,Correzione_luna(t,k),g_fase,m_fase,o_fase); break; }
          case 2: { data_fase(t,k,d,CorrezioneAddizionale_pquarto(t,k),g_fase,m_fase,o_fase); break; }
          case 3: { data_fase(t,k,d,Correzione_luna(t,k),g_fase,m_fase,o_fase); break; }
          case 4: { data_fase(t,k,d,CorrezioneAddizionale_uquarto(t,k),g_fase,m_fase,o_fase); break; }
          case 5: { data_fase(t,k,d,Correzione_luna(t,k),g_fase,m_fase,o_fase); break; }
          default:"";
      } // switch

      if ((f==5) && (m_fase.value>m)){
        fine=true;
        d_tmp="";
      }

      if (m_fase.value==m){
        fine=true
        d_tmp=(g_fase.value+"/"+m_fase.value+o_fase.value);
      }
      else
        jk +=4

  }

  return d_tmp;

}

function LunaNuova(f,m,a){
   return calcola_data(f,m,a);
}

function PrimoQuarto(f,m,a){
   return calcola_data(f,m,a);
}

function LunaPiena(f,m,a){
   return calcola_data(f,m,a);
}

function UltimoQuarto(f,m,a){
   return calcola_data(f,m,a);
}

function LunaNuova2(f,m,a){

   lunaN1=calcola_data(1,m,a);
   lunaN2=calcola_data(5,m,a);

   if ((lunaN2 != "") && (lunaN1 != lunaN2))
     return lunaN2
   else
     return "";

}

// fine javascript
