/* auteur: COSMOS 2000 */
/* Date de création: 24/05/2004 */
/* © 2000 Institut de Mécanique Céleste SOURCE = http://www.bdl.fr/minitel/calendrier/cadre_paques.html*/
w = self;
function oar(OK,CODE1,CODE2) { /*objets a ranger*/
    this.OK
    this.CODE1
    this.CODE2
    this.CODE3
    this.CODE4
    this.CODE4J
    this.CODE5
    this.CODE6
    this.CYCLE
    this.ANC
    this.JSEM
     }
function date(JJD,AN,MOIS,JOUR,TYPEA,NBMOIS) {
    this.JJD
    this.AN
    this.MOIS
    this.JOUR
    this.TYPEA
    this.ESPEA
    this.NBMOIS
     }
function trunc(x) {
if (x>0.0) return(Math.floor(x));
else return Math.ceil(x);
}
function round(x) {
if (x>0.0) return(Math.floor(x+0.5));
else return Math.ceil(x-0.5);
}
 function JJDATEJ()
   {
     Z1=date.JJD+0.5;          
     Z=trunc(Z1);                                                               
     A=Z;                                                                       
     B=A+1524;                                                                  
     C=trunc((B-122.1)/365.25);                                                 
     D=trunc(365.25*C);                                                         
     E=trunc((B-D)/30.6001);                                                    
     date.JOUR=trunc(B-D-trunc(30.6001*E));     
     if(E<13.5)date.MOIS = trunc(E-1);      
      else date.MOIS = trunc(E-13);                
     if(date.MOIS>=3) date.AN = trunc(C-4716);       
      else   date.AN = trunc(C-4715);       
} 
function JJDATE ()
   {
     Z1=date.JJD+0.5;
     Z=trunc(Z1);                                                               
     if (Z<2299161) A=Z;                                                        
      else {ALPHA=trunc((Z-1867216.25)/36524.25);                               
           A=Z+1+ALPHA-trunc(ALPHA/4);}                                         
     B=A+1524;                                                                  
     C=trunc((B-122.1)/365.25);                                                 
     D=trunc(365.25*C);                                                         
     E=trunc((B-D)/30.6001);                                                    
     date.JOUR=trunc(B-D-trunc(30.6001*E));  
     if(E<13.5) date.MOIS = trunc(E-1);     
      else date.MOIS = trunc(E-13);           
     if(date.MOIS>=3) date.AN = trunc(C-4716);      
      else   date.AN = trunc(C-4715);         
    }
function BISG()
/* TYPEA = 0 annee commune. */
/* TYPEA = 1 annee bissextile. */
   { date.NBMOIS=12;
     date.TYPEA=0;
     if ((date.AN % 4)==0)  date.TYPEA=1;
     if ((date.AN % 100)==0 && (date.AN % 400)!=0) date.TYPEA=0;}
function BISJ()
/*  TYPEA = 0 annee commune.  */
/* TYPEA = 1 annee bissextile. */
   { date.NBMOIS=12;
     if ((date.AN % 4)==0) date.TYPEA=1; else date.TYPEA=0;  }
function BISI()
  {  oar.CYCLE=1+(date.AN-1)/19;
     oar.ANC=1+(date.AN-1)%19;
     aa=date.AN;
     aa=12*aa+5;
     a=aa%19;
     jjd=DEBANJ(date.AN);
     jjd1=DEBANJ(date.AN+1);
     dt=jjd1-jjd;
     if (a>6) {date.ESPEA=trunc(dt-352);
           date.TYPEA=0;
           date.NBMOIS=12;}
      else {date.ESPEA=trunc(dt-382);
           date.TYPEA=1;
           date.NBMOIS=13;}
      }
function DEBANJ(an)
   {   x1=392640; x2=121555; x3=272953;
       x4=492480; x5=347605; x6=365;
       aa=an;
       aa=12*aa+5;
       a=aa%19;
       t=(x1+x2*an+x3*a)/x4;
       t=t+x5+x6*an+a;
       jj=trunc(t);
       dt=t-jj;
       t=jj+1;
       t=t-trunc(t/7)*7;
       j=round(t);
       pjjd=jj+0.5;
       if (j==2 || j==4 || j==6) pjjd=jj+1.5;
       if (j==1 && a>6 && dt>=0.632870) pjjd=jj+2.5;
       if (j==0 && a>11 && dt>=0.897724) pjjd=jj+1.5;
       return(pjjd);
       }
function JULIEN()
   {  IJOUR=date.JOUR;
      Y=date.AN;
      M=date.MOIS;
      A = Y + M/100 + IJOUR/10000;
      if(date.MOIS<=2){Y=Y-1;M=M+12;};
      if(Y<0)     date.JJD = Math.ceil(365.25*Y-0.75);
      else date.JJD = Math.floor(365.25*Y);
      date.JJD = date.JJD+trunc(30.6001*(M+1))+IJOUR+1720994.5;
      if(A>1582.1014) date.JJD=date.JJD+2-trunc(Y/100)+trunc(trunc(Y/100)/4);
    }
function JULIENJ()
     { IJOUR=date.JOUR;
      Y=date.AN;
      M=date.MOIS;
      if(date.MOIS<=2) {Y=Y-1;M=M+12;};
      if(Y<0)     date.JJD = Math.ceil(365.25*Y-0.75);
      else date.JJD = Math.floor(365.25*Y);
      date.JJD = date.JJD+trunc(30.6001*(M+1))+IJOUR+1720994.5;
    }
function ISRJ()
 {  MOISC=new Array (
          1,31,60,89,118,148,177,207,236,266,295,325,
          1,31,60,90,119,149,178,208,237,267,296,326,
          1,31,61,91,120,150,179,209,238,268,297,327);
    MOISE=new Array (
          1,31,60,89,118,148,178,207,237,266,296,325,355,
          1,31,60,90,119,149,179,208,238,267,297,326,356,
          1,31,61,91,120,150,180,209,239,268,298,327,357);
      oar.CYCLE=(date.AN-1)/19 + 1;
      oar.ANC=1+(date.AN-1) % 19;
      AA=date.AN;
      AA=12*AA+5;
      A=AA%19;
      jjd1=DEBANJ(date.AN+1);
      jjd=DEBANJ(date.AN);
      DT=jjd1-jjd;
      if(A<=6)  { date.ESPEA=trunc(DT-382);
           date.JJD=jjd+MOISE[13*(date.ESPEA-1)+(date.MOIS-1)]-2+date.JOUR;
           date.NBMOIS=13;
           date.TYPEA=1; }
      else { date.ESPEA=trunc(DT-352);
           date.JJD=jjd+MOISC[12*(date.ESPEA-1)+(date.MOIS-1)]-2+date.JOUR;
           date.NBMOIS=12;
           date.TYPEA=0; };
     }
function JISR()
 {  MOISC=new Array (
          1,31,60,89,118,148,177,207,236,266,295,325,
          1,31,60,90,119,149,178,208,237,267,296,326,
          1,31,61,91,120,150,179,209,238,268,297,327);
    MOISE=new Array (
          1,31,60,89,118,148,178,207,237,266,296,325,355,
          1,31,60,90,119,149,179,208,238,267,297,326,356,
          1,31,61,91,120,150,180,209,239,268,298,327,357);
      Z1=date.JJD+0.5;
      Z=trunc(Z1);
      if(Z<2299161) AA=Z;
      else {ALPHA=trunc((Z-1867216.25)/36524.25);
           AA=Z+1+ALPHA-trunc(ALPHA/4);}
      B=AA+1524;
      C=trunc((B-122.1)/365.25);
      D=trunc(365.25*C);
      E=trunc((B-D)/30.6001);
      date.JOUR=trunc(B-D-trunc(30.6001*E));
      if(E<13.5)   date.MOIS=trunc(E-1);
      else  date.MOIS=trunc(E-13);
      if(date.MOIS>=3)    date.AN=trunc(C-4716);
      else    date.AN=trunc(C-4715);
      AAN=date.AN+3761;
      JJD1=DEBANJ(AAN);
      if(date.JJD<JJD1)  { date.AN=AAN-1; JJDEB=DEBANJ(date.AN);}
      else   { date.AN=AAN; JJDEB=JJD1; AAN=AAN+1;
           JJD1=DEBANJ(AAN);}
      oar.CYCLE=(date.AN-1)/19 + 1;
      oar.ANC=1+(date.AN-1) % 19;
      AA=date.AN;
      AA=12*AA+5;
      A=AA%19;
      if(A>6)   { TYPE1=0; date.TYPEA=0; }
      else { TYPE1=1; date.TYPEA=1; }
      DT=JJD1-JJDEB; ;
      if(TYPE1==1)     date.ESPEA=round(DT-382);
      else   date.ESPEA=round(DT-352);
      DT=date.JJD-JJDEB+1;
      ARGC=12*(date.ESPEA-1);  ARGE=13*(date.ESPEA-1);
      if(TYPE1==1) { if(DT>=MOISE[ARGE+12])
           { date.MOIS=13;
           date.JOUR=round(DT)-MOISE[ARGE+12]+1;}
           else for (I=0; I<12; I++)
           {
           if ((DT>=MOISE[ARGE+I]) &&
               (DT<MOISE[ARGE+I+1]))
               {date.JOUR=round(DT)-MOISE[ARGE+I]+1;
                date.MOIS=I+1;}
           }}
      else      { if(DT>=MOISC[ARGC+11])
           {date.MOIS=12;
           date.JOUR=round(DT)-MOISC[ARGC+11]+1;}
           else for (I=0; I<11; I++)
           {if ((DT>=MOISC[ARGC+I])
           && (DT<MOISC[ARGC+I+1]))
                {date.MOIS=I+1;
                date.JOUR=round(DT)-MOISC[ARGC+I]+1;}
}
    }}
function NOMJOUR()
  {  A=((eval(date.JJD)+2.5)/7)%1.0;
     oar.JSEM=round(A*7);       }
function PAQUESG()
   {
with (Math) {
     A=floor(date.AN%19); B=floor(date.AN/100); C=floor(date.AN%100);
     /*E remplacé par Z car E dans Math est la cste d'Euler */
     D=floor(B/4); Z=floor(B%4); F=floor((B+8)/25);
     G=floor((B-F+1)/3); H=floor((19*A+B-D-G+15)%30);
     I=floor(C/4); K=floor(C%4); L=floor((32+2*Z+2*I-H-K)%7);
     M=floor((A+11*H+22*L)/451); N=floor((H+L-7*M+114)/31);
     P=(H+L-7*M+114)%31; date.MOIS=floor(N); date.JOUR=floor(P+1);
}
   }
function  PAQUESJ()
   { 
with (Math) {
     A=floor(date.AN%4); B=floor(date.AN%7); C=floor(date.AN%19);
     /*E remplacé par Z car E dans Math est la cste d'Euler */
     D=floor((19*C+15)%30); Z=floor((2*A+4*B-D+34)%7);
     F=floor((D+Z+114)/31); G=floor((D+Z+114)%31);
     date.MOIS=Math.floor(F); date.JOUR=Math.floor(G+1);
}
   }
function COMPUTJ()
   { 
     S=(date.AN+8)%28;
     oar.CODE1=S+1;
     I=(date.AN+2)%15;
     oar.CODE2=I+1;
     C=Math.floor(date.AN/100);
     U=date.AN%100;
     N=date.AN%19;
     N=N+1;
     oar.CODE3=N;
     L=(C+2-U-Math.floor((U/4)))%7;/*document.form.trace.value=L;*/ 
     if (L<0) L=L+7;
     oar.CODE4=L;
     E=(11*(date.AN%19)+8)%30;
     oar.CODE5=E;
   }
function COMPUTG()
   { 
     S=(date.AN+8)%28;
     oar.CODE1=S+1;
     I=(date.AN+2)%15;
     oar.CODE2=I+1;
     C=Math.floor(date.AN/100);
     U=date.AN%100;
     N=date.AN%19;
     N=N+1;
     oar.CODE3=N;
     L=(2*C-Math.floor((C/4))-U-Math.floor((U/4)))%7;
     if (L<0) L=L+7;
     oar.CODE4=L;
     E=(11*(date.AN%19)+8-C+Math.floor((C/4))+Math.floor((8*C+13)/25))%30;
     oar.CODE6=E
    }
function PAQUES(form)
   {
lmoisg=new Array("null","janvier","février","mars","avril","mai","juin",
          "juillet","août","septembre","octobre","novembre","décembre");
ledom=new Array("A","B","C","D","E","F","G","A");
ljour=new Array("samedi","dimanche","lundi","mardi","mercredi", 
                "jeudi","vendredi");
Chaine=" "; Chauxi="";
if (date.AN>1582) PAQUESG(); else PAQUESJ();
document.form.DATPAQ.value="\r\n   dimanche "+ date.JOUR + " " + lmoisg[date.MOIS] + 
  " " + date.AN + "\r\n\r\n";
if (date.AN>1582) { /*affich paque orthodoxe et date en julien*/
 PAQUESJ();
document.form.DATPAQ.value=document.form.DATPAQ.value + "Pâque orthodoxe (" + 
 date.JOUR + " " + lmoisg[date.MOIS] + " " + date.AN;
JULIENJ(); JJDATE();
document.form.DATPAQ.value=document.form.DATPAQ.value + 
  " dans le calendrier julien) \r\n" + "dimanche " + date.JOUR + " " + 
  lmoisg[date.MOIS] + " " + date.AN + "\r\n\r\n";
}
/*affich paque juive*/
date.MOIS=1; date.JOUR=1;
if (date.AN>1582) JULIEN(); else JULIENJ();
JISR();
if (date.TYPEA==1) date.MOIS=8; else date.MOIS=7;
date.JOUR=15;
document.form.DATPAQ.value=document.form.DATPAQ.value + "Pâque israelite (" + 
 date.JOUR + " " + "nissan" + " " + date.AN;
/*concord cal jul ou gre*/
ISRJ(); NOMJOUR(); JJDATE();
document.form.DATPAQ.value=document.form.DATPAQ.value + 
  " dans le calendrier israelite) \r\n" + ljour[oar.JSEM] + " " +
  date.JOUR + " " + 
  lmoisg[date.MOIS] + " " + date.AN + "\r\n";
/*comput*/
COMPUTJ();
BISJ();
if (date.TYPEA==0) Chauxi=ledom[oar.CODE4];
else Chauxi=ledom[oar.CODE4+1] + ledom[oar.CODE4];
if (date.AN<=1582) Chaine="";
else { COMPUTG(); BISG();
  Chaine="\r\nCOMPUT GREGORIEN\r\nlettre(s) dominicale(s) : ";
  if (date.TYPEA==0) Chaine=Chaine + ledom[oar.CODE4] + "\r\n";
  else Chaine=Chaine + ledom[oar.CODE4+1] + ledom[oar.CODE4] + "\r\n";
  if (oar.CODE6==25 && oar.CODE3>11) 
       Chaine=Chaine + "Epacte : " + "XXV\r\n";
  else Chaine=Chaine + "Epacte : " + oar.CODE6;
     }
document.form.COMPUT.value="Cycle solaire : " + oar.CODE1 + "\r\n" +
    "Indiction romaine : " + oar.CODE2 + "\r\n" +
    "Nombre d'or : " + oar.CODE3 + "\r\n" +
    "\r\nCOMPUT JULIEN\r\n" +
    "Lettre(s) dominicale(s) : " + Chauxi + "\r\n" +
    "Epacte : " + oar.CODE5 + "\r\n" + Chaine; 
   }
function suivan(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
date.AN++;
 if (date.AN<325 || date.AN>2500) {alert('hors limites');
date.AN--; }
form.nyear.value=date.AN;
form.DATPAQ.value="";
PAQUES(form);
}
function preced(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
date.AN--;
 if (date.AN<325 || date.AN>2500) {alert('hors limites');
date.AN++; }
form.nyear.value=date.AN; 
form.DATPAQ.value="";
PAQUES(form);
}
function couran(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
form.DATPAQ.value="";
 if (date.AN<325 || date.AN>2500) { alert('hors limites');
 return; }
PAQUES(form);
}
function dateinit(form) {
Todays=new Date();
/*selon les navigateurs la fonction getyear de Javascript
  donne 100 ou 2000 (avant 2000 donnait toujours le millésime*/
if (Todays.getYear() < 1000)
 document.form.nyear.value=1900 + Todays.getYear();
else 
 document.form.nyear.value=Todays.getYear();  
}