// -----------------------------------------------------------------------------------------
// Funcions de calendari.

// -----------------------------------------------------------------------------------------
// Crea el calendari d'un any. Format HTML.
//
function f_calendari(jany)
{
    var xcal = '';
	// xcal += '<table width="100%" border=1 cellpadding=0 class="fontTextePetit">';
	xcal += '<table width="100%" border=1 cellpadding=0 class="fontTaulaCalend">';
    for(jmes=1;jmes<=12;jmes++)
    {
        if((jmes%3)==1) xcal+='<tr>'; 
        xcal+='<td align="right" valign="top">';
        xcal+=calMesGregoria(1, jmes-1, jany);
        xcal+='</td>';
        if((jmes%3)==0) xcal+='</tr>';
    }
    xcal += '</table>';
    return xcal;
}

// -----------------------------------------------------------------------------------------
// Indica si un any és de traspas o no.
//
function leapyear(a) {
 if(((a%4==0)&&(a%100!=0))||(a%400==0))
    return true
 else 
    return false
}

// -----------------------------------------------------------------------------------------
// Crea el calendari del mes de la data indicada.
//
function calMesGregoria(D, M, A){
   fecha = new Date(A, M, D);
   diaMes=fecha.getDate();
   dia1  = new Date(fecha.getFullYear(),fecha.getMonth(),1).getDay();
   dias  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
   if (leapyear(fecha.getFullYear())==true)
       dias[1]=29;
   meses = new Array('Gener','Febrer','Març','Abril','Maig','Juny','Juliol','Agost','Setembre','Octubre','Novembre','Desembre');
   // var bf=meses[fecha.getMonth()]+' - '+fecha.getFullYear()+'</br><table border=0 cellpadding=0 class="fontTexteCalend"><tr>';
   var bf='<table border=0 cellpadding=0 class="fontTextePetit">';
	bf += '<tr><td colspan="7" align="right">'+meses[fecha.getMonth()]+' - '+fecha.getFullYear()+'</td></tr>';
    bf += '<tr>';
   var salt = '';
   for(i=1;!((i%7)==dia1);i++)
       bf+='<td align="right">&nbsp</td>';
   for(j=1;j<=dias[fecha.getMonth()];j++)
      {
       if((i%7)==1) bf+='<tr>';
       salt = '<a href="javascript:void(f_avui(';
       salt += (j<10?'0':'')+j+',';
       salt += (M<10?'0':'')+M+','+A;
       salt += '))">';
       bf+='<td id="mes'+fecha.getMonth()+'dia'+j+'" align="right">'
       bf+=salt+j+'</a></td>';
       if((i%7)==0) bf+='</tr>';
       i++;
      }
   for(;(i%7)!=1;i++)
      {
       bf+='<td align="right">&nbsp</td>';
       if((i%7)==0)bf+='</tr>';
      }
   bf+='</table>';
return(bf);
}

// -----------------------------------------------------------------------------------------
// Crea un calendari de la data actual.
//
function calend(){
   fecha  = new Date();
   diaMes = fecha.getDate();
   dia1   = new Date(fecha.getFullYear(),fecha.getMonth(),1).getDay();
   dias   = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
   if (leapyear(fecha.getFullYear())==true) dias[1]=29;
   meses  = new Array('Gener','Febrer','Març','Abril','Maig','Juny','Juliol','Agost','Setembre','Octubre','Novembre','Desembre');
   //var bf= meses[fecha.getMonth()]+' - '+fecha.getFullYear()+'</br><table border=0 cellspacing=0 cellpadding=0 class="fontTextePetit"><tr>';
   var bf='<table border=0 cellspacing=0 cellpadding=0 class="fontTextePetit">';
	bf += '<tr><td colspan="7">'+meses[fecha.getMonth()]+' - '+fecha.getFullYear()+'</td></tr>';
    bf += '<tr>';
    for(i=1;!((i%7)==dia1);i++) bf+='<td>.</td>';
    for(j=1;j<=dias[fecha.getMonth()];j++){
        if((i%7)==1) bf+='<tr>'; 
        bf+='<td align="right">'+j+'</td>';
        if((i%7)==0)bf+='</tr>';
        i++;
    }
    for(;(i%7)!=1;i++){
        bf+='<td>.</td>';
        if((i%7)==0)bf+='</tr>';
    }
    bf+='</table>';
//    document.write(bf);
return(bf);
}

// -----------------------------------------------------------------------------------------
// Retorna una cadena en format data del dia, mes i any indicats.
//
function Data(dd, mm, aa)
{
/*
var obj_data=new Date(aa, mm, dd);
    if (aa==0 && mm==0 && dd==0)
        obj_data=new Date();
*/
var obj_data=new Date();
    if (aa!=0 && mm!=0 && dd!=0)
        obj_data=new Date(aa, mm, dd);
var dia=((obj_data.getDate()<10) ? "0" : "")+obj_data.getDate();
var mes=(((1+obj_data.getMonth())<10) ? "0" : "")+(1+obj_data.getMonth());
var any=obj_data.getFullYear();
var text=dia+"." +mes +"." +any;
return text;
}

// -----------------------------------------------------------------------------------------
// Compara dues dates en format dd.mm.aaaa
//
function compara_dates(dia1, dia2)
{
 var cd1 = dia1.substr(6, 4) + dia1.substr(3, 2) + dia1.substr(0,2);
 var cd2 = dia2.substr(6, 4) + dia2.substr(3, 2) + dia2.substr(0,2);
 var dif = 0;
 if (cd1 > cd2) {dif = 1};
 if (cd1 == cd2) {dif = 0};
 if (cd1 < cd2) {dif = -1};
 return dif;
}

// -----------------------------------------------------------------------------------------
// Retorna l'hora oficial a partir d'una hora UTC.
//
function Hora_Local(dia, hora)
{
 var obj_data;
 var pd='0330';
 var ud='1031';
 var aa=dia.substr(6,4);
 var mm=dia.substr(3,2);
 var dd=dia.substr(0,2);
 var hores_mes=2;
 var nova_hora=hora;
 n_nova_hora=0;
 for (i=30; i>20; i--)
     {
      obj_data=new Date(parseFloat(aa), 2, i);
      if (obj_data.getDay()==0)
         {
          pd = '03' + ((i<10) ? "0" : "") + i;
          break;
         }
     }
 for (i=31; i>20; i--)
     {
      obj_data=new Date(parseFloat(aa), 9, i);
      if (obj_data.getDay()==0)
         {
          ud = '10' + ((i<10) ? "0" : "") + i;
          break;
         }
     }
  if (mm+''+dd<pd || mm+''+dd>=ud)
     hores_mes = 1;
  n_nova_hora=parseFloat(hora.substring(0,2))+hores_mes;
  nova_hora=((n_nova_hora<10) ? "0" : "") + ((n_nova_hora>=24) ? "" + (parseFloat(hora.substring(0,2))-22) : n_nova_hora+"") + hora.substr(2,3);
  return nova_hora;
}

// -----------------------------------------------------------------------------------------
// Retorna el dia de canvi d'hora endevant. Ultim diumenge de març.
//
function Hora_Endevant(aa)
{
 var obj_data;
 var pd='0330';
 var ud='1031';
 for (i=30; i>20; i--)
     {
      obj_data=new Date(parseFloat(aa), 2, i);
      if (obj_data.getDay()==0)
         {
          pd = ((i<10) ? "0" : "") + i + '.03.';
          break;
         }
     }
  nou_dia=pd + aa;
  return nou_dia;
}

// -----------------------------------------------------------------------------------------
// Retorna el dia de canvi d'hora endarrere. Ultim diumenge d'octubre.
//
function Hora_Endarrere(aa)
{
 var obj_data;
 var pd='0330';
 var ud='1031';
 for (i=31; i>20; i--)
     {
      obj_data=new Date(parseFloat(aa), 9, i);
      if (obj_data.getDay()==0)
         {
          ud = ((i<10) ? "0" : "") + i + '.10.';
          break;
         }
     }
  nou_dia=ud+aa;
  return nou_dia;
}

// -----------------------------------------------------------------------------------------
// Retorna l'hora actual.
//
function Hora()
{
var obj_data=new Date();
var hora=((obj_data.getHours()<10) ? "0" : "")+obj_data.getHours();
var minut=((obj_data.getMinutes()<10) ? "0" : "")+obj_data.getMinutes();
var segon=((obj_data.getSeconds()<10) ? "0" : "")+obj_data.getSeconds();
var text=hora+":" +minut +":" +segon;
return text;
}

// -----------------------------------------------------------------------------------------
// Retorna l'hora UTC actual.
//
function Hora_Utc()
{
var obj_data=new Date();
var completa=obj_data.toGMTString();
var text=completa.substring(completa.length-12,completa.length);
return text;
}

// -----------------------------------------------------------------------------------------
// Retorna el nom del dia de la setmana indicat.
//
function Dia_Setmana(dd, mm, aa)
{
var obj_data=new Date(aa, mm, dd);
dia=obj_data.getDay()+1;
if(dia==1) dds="Diumenge";
if(dia==2) dds="Dilluns";
if(dia==3) dds="Dimarts";
if(dia==4) dds="Dimecres";
if(dia==5) dds="Dijous";
if(dia==6) dds="Divendres";
if(dia==7) dds="Dissabte";
return dds;
}

// -----------------------------------------------------------------------------------------
// Retorna el número de dia dins de l'any, d'una data indicada.
//
function Dia_Any(dd, mm, aa)
{
var obj_data=new Date(aa, mm, dd);
var any=obj_data.getFullYear();
var obj_diau=new Date(aa, 0, 1);
var resta=obj_data.getTime() - obj_diau.getTime();
var dies = 1 + Math.floor(resta / (1000 * 60 * 60 * 24));
return dies;
}

// -----------------------------------------------------------------------------------------
// Retorna el dia julià d'una data.
//
function Dia_Julia(dd, mm, aa)
{
var obj_data=new Date(aa, mm, dd);
var dia=obj_data.getDate();
var mes=1+obj_data.getMonth();
var any=obj_data.getFullYear();
a = parseInt((14 - mes)/12)
ny = any + 4800 - a
m = mes + 12*a - 3
dj = dia + parseInt((153*m + 2)/5) + ny*365 + parseInt(ny/4) - parseInt(ny/100) + parseInt(ny/400) - 32045
return dj;
}

// -----------------------------------------------------------------------------------------
// Retorna el dia julià modificat una data indicada.
//
function Dia_Julia_Modificat(dd, mm, aa)
{
dj=Dia_Julia(dd, mm, aa)-2400000.5;
return dj;
}

// -----------------------------------------------------------------------------------------
// Retorna el número de setmana d'una data indicada.
//
function Setmana(dd, mm, aa)
{
var week = -100;
var jt = Dia_Julia(dd, mm, aa);
var jb = Dia_Julia(1, 0, aa);
var d = (jb + 3) % 7;
var w = parseInt((jt + d - jb + 4)/7);
    if (w>=1 && w<=52) week = w;
    if (w==53 && d==6) week = w;
    if (w==53 && d==5 && leapyear(aa)) week = w;
    if (w==53 && week==-100) week = 1;
    if (w==0)
       {
        jt = Dia_Julia(dd, mm, aa);
        jb = Dia_Julia(1, 0, aa-1);
        d = (jb + 3) % 7;
        week = parseInt((jt + d - jb + 4)/7);
       }
return week;
}

// -----------------------------------------------------------------------------------------
// Nombre solar d'un any.
//
function Nombre_Solar(aa)
{
var obj_data=new Date(aa, 0, 1);
var dia=obj_data.getDate();
var mes=obj_data.getMonth();
var any=obj_data.getFullYear();
ns = (any+8)%28+1;
return ns;
}

// -----------------------------------------------------------------------------------------
// Nombre auri d'un any.
//
function Nombre_Auri(aa)
{
var obj_data=new Date(aa, 0, 1);
var dia=obj_data.getDate();
var mes=obj_data.getMonth();
var any=obj_data.getFullYear();
na = any%19+1;
return na;
}

// -----------------------------------------------------------------------------------------
// Epacta d'un any.
//
function Epacta(aa)
{
var obj_data=new Date(aa, 0, 1);
var dia=obj_data.getDate();
var mes=obj_data.getMonth();
var any=obj_data.getFullYear();
var segle=Math.floor(any/100);
epacta=(11*(Nombre_Auri(aa)-1))%30;
epacta = epacta - Math.floor((3*segle)/4);
epacta = epacta + Math.floor((8*segle+5)/25);
epacta = epacta + 8;

// 5) Sumeu o resteu 30 fins que l'epacta resulti una xifra entre 1 i 30;
return epacta;
}

// -----------------------------------------------------------------------------------------
// Data de pàsqua d'un any.
//
function Pasqua(aa)
{
var obj_data=new Date(aa, 0, 1);
// alert(new Date(31*1000*60*60*24+obj_data.valueOf()));
var dia=obj_data.getDate();
var mes=obj_data.getMonth();
var any=obj_data.getFullYear();
G = any%19;
C = Math.floor(any/100);
H = (C - Math.floor(C/4) - Math.floor((8*C+13)/25) + 19*G + 15) % 30;
I = H - Math.floor((H/28))*(1 - Math.floor(H/28)*(Math.floor(29/(H + 1)))*(Math.floor((21 - G)/11)));
J = (any + Math.floor(any/4) + I + 2 - C + Math.floor(C/4)) % 7;
L = I - J;
MesPasqua = 3 + Math.floor((L + 40)/44);
DiaPasqua = L + 28 - 31*Math.floor(MesPasqua/4);
pasqua=((DiaPasqua<10) ? "0" : "")+DiaPasqua;
pasqua=pasqua+"."+((MesPasqua<10) ? "0" : "")+MesPasqua;
pasqua=pasqua+"."+any;
return pasqua;
}

// -----------------------------------------------------------------------------------------
// Còmputs eclesiastics d'un any.
//
function Computs(aa, quin)
{
  // - 63 dies, Septuagèsima.
  // - 46 dies, Dimecres de cendra.
  // - 42 dies, Primer Diumenge de pàsqua.
  // + 39 dies, Ascensió.
  // + 49 dies, Pentecost.
  // + 60 dies, Corpus Christi.
  var psq = Pasqua(aa);
  var ara = new Date(aa, parseFloat(psq.substr(3,2))-1, parseFloat(psq.substr(0,2)));
  var dies = 0;
  if (quin == 1) dies = -63;
  if (quin == 2) dies = -46;
  if (quin == 3) dies = -42;
  if (quin == 4) dies = +39;
  if (quin == 5) dies = +49;
  if (quin == 6) dies = +60;
  var diada = new Date(dies*1000*60*60*24+ara.valueOf());
  var cmpt = '';
  cmpt += (diada.getDate()<10 ? '0' : '') + diada.getDate() + '.';
  cmpt += ((1+diada.getMonth())<10 ? '0' : '') + (1+diada.getMonth()) + '.';
  cmpt += diada.getFullYear();
  return cmpt;
}

// -----------------------------------------------------------------------------------------
// Indicció romana d'un any.
//
function Indiccio(aa)
{ 
var nInd = ((aa - 3) % 15);
return nInd;
}

// -----------------------------------------------------------------------------------------
// Lletra dominical d'un any.
//
function LletraDom(aa)
{ 
var obj_data=new Date(aa, 0, 1);
var nP = obj_data.getDay()-1;
var nL = (leapyear(aa) ? 2 : 1)
var nLle = "GFEDCBA".substr(nP, nL);
return nLle;
}

// -----------------------------------------------------------------------------------------
// Lletra del martiriològi d'un any.
//
function Martiri(aa)
{ 
var nEp = Epacta(aa);
var nL = (leapyear(aa) ? 2 : 1)
var nLle = "abcdefghijklmnpqrstuABCDEFGHMNP".substr(nEp, 1);
return nLle;
}

// -----------------------------------------------------------------------------------------
// Convertim un número a números romasn.
//
function Romans(nn)
{ 
    var sim1, sim2, sim3;
    var sAux = '';
    var sn = nn.toString(10);
    for (i=sn.length; i>0; i--)
        {
         switch (i)
                {
                 case 1:
                    sim1="I"; sim2="V"; sim3="X";
                    break;
                 case 2:
                    sim1="X"; sim2="L"; sim3="C";
                    break;
                 case 3:
                    sim1="C"; sim2="D"; sim3="M";
                    break;
                 case 4:
                    sim1="M"; sim2="Q"; sim3="H";
                    break;
                }
         switch (parseInt(sn.substr(sn.length-i,1),10))
                {
                 case 1:
                    sAux += sim1;
                    break;
                 case 2:
                    sAux += sim1 + sim1;
                    break;
                 case 3:
                    sAux += sim1 + sim1;
                    break;
                 case 4:
                    sAux += sim1 + sim2;
                    break;
                 case 5:
                    sAux += sim2;
                    break;
                 case 6:
                    sAux += sim2 + sim1;
                    break;
                 case 7:
                    sAux += sim2 + sim1 + sim1;
                    break;
                 case 8:
                    sAux += sim2 + sim1 + sim1 + sim1;
                    break;
                 case 9:
                    sAux += sim1 + sim3;
                    break;
                }
        }
    return sAux;
}
