//*********************************
function lenguaje() {leng=(document.all?navigator.browserLanguage:navigator.language);if(leng.indexOf("es")!=-1) return "es"; else return "en";}

//inicialización
ahora=new Date();
desfasejuliano=ahora.getTimezoneOffset()/60/24;

ano=ahora.getUTCFullYear();
mes=ahora.getUTCMonth()+1;
//ano=2039;
//alert(dameFase(julianYMD(2010,7,26+1.5/24)));

//PI
PI=3.1415926535897932385; 
//ms en un día
mspd=86400000;
//mes sinodico
messinodico=29.530588853;
//número de gráficos
num=48;
//error de resolución de elección de gráfico
numerror=1/num;
//error de resolución de elección de fase
numerror30=1/messinodico;

if(lenguaje()=="es")
{
//meses
meses=new Array("ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic");
//dias de la semana
diassem=new Array("lun","mar","mié","jue","vie","sab","dom");
//signos del zodiaco
signos=new Array("aries","tauro","géminis","cáncer","leo","virgo","libra","escorpio","sagitario","capricornio","acuario","piscis");
//descripción decanatos de cada signo
decanatos=new Array("principio de ","","final de ");
_llena='LLENA';
_nueva='NUEVA';
_eclipse='ECLIPSE';
}
else
{
//meses
meses=new Array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
//dias de la semana
diassem=new Array("sun","mon","tue","wed","thu","fri","sat");
//signos del zodiaco
signos=new Array("aries","taurus","gemini","cancer","leo","virgo","libra","scorpio","sagittarius","capricorn","aquarius","pisces");
//descripción decanatos de cada signo
decanatos=new Array("start of ","","end of ");
_llena='FULL';
_nueva='NEW';
_eclipse='ECLIPSE';
}


//módulos de saros
saros=new Array(0.5,6.5,12.5,23.5,35.5,41.5,47.5,53.5,76.5,82.5,88.5,94.5,100.5,123.5,129.5,135.5,141.5,158.5,164.5,170.5,176.5,182.5,188.5,205.5,211.5,217.5);

//*********************************
function partedecimal(q){return q-Math.floor(q)}

//*********************************
function checkEclipse(dayj)
{
n=((dayj-2449128.59)/messinodico)%223;
for(var j=0;j<saros.length;j++)	{if(Math.abs(n-saros[j])<0.5) return true;}
return false;
}

//*********************************
function julianYMD(year,month,day) {
var A=0; var B=0;
if ((month==1)||(month==2)) //corrección año bisiesto
	{var cyear = year - 1;var cmonth = month + 12;}
else 
	{var cyear=year;var cmonth=month;}

var intDay = Math.floor(day);
var A=Math.floor(cyear/100);
var B=2-A+Math.floor(A/4);
var C=Math.floor(365.25*cyear);
var D=Math.floor(30.6001*(cmonth+1));
return B+C+D+day+1720994.5-desfasejuliano; //el 0.5 se puede añadir para redondear al mediodía del día señalado
//desfasejuliano es negativo si se está al ESTE de greenwich y positivo al OESTE: así el día juliano devuelto se correponde al del tiempo local aprox.
//esto es porque si al ESTE los eventos ocurren ANTES es como si el día juliano estuviera por delante.
}

//*********************************
function julianDate(date){return julianYMD(date.getUTCFullYear(),date.getUTCMonth()+1,date.getUTCDate());}

//*********************************
function dameFase(julianday)
{
return partedecimal((julianday-2451550.25972)/messinodico);
}

//*********************************
function dameEclipticaGra(julianday)
{
RP=partedecimal((julianday-2451555.8 )/27.321582241);
DPrad=partedecimal((julianday-2451562.2 )/27.55454988)*2*PI;
FArad=dameFase(julianday)*2*PI;
grados=360*RP+6.3*Math.sin(DPrad)+1.3*Math.sin(FArad*2-DPrad)+0.7*Math.sin(2*FArad);
if(grados>=360) grados-=360;
if(grados<0) grados+=360;
return grados;
}

//*********************************
function dameTextoSigno(grados)
{
nsig=Math.floor(grados/30);
ndec=Math.floor((grados-nsig*30)/10);
texto=decanatos[ndec]+signos[nsig];
return texto;
}

//*********************************
function dameTextoMes(mes) //1-12
{return meses[mes-1];}

//*********************************
function mueveDias(date,dias)
{
date.setUTCHours(0);date.setUTCMinutes(0);date.setUTCSeconds(0);
if(dias==0) return date;
multiplicador=1;
if(dias<0) multiplicador=-1;

mshoy=date.getTime();
datenuevo=new Date(mshoy);

for(var i=0;i<Math.abs(dias);i++)
	{
	while(datenuevo.getUTCDate()==date.getUTCDate())
		{
		mshoy+=mspd*0.8*multiplicador;
		datenuevo=new Date(mshoy);
		}
	datenuevo.setUTCHours(0);datenuevo.setUTCMinutes(0);datenuevo.setUTCSeconds(0);
	date=datenuevo;
	}
return date;
}

//*********************************
function dameGraficoLuna(fase) //[0,1]
{
valor=Math.floor(fase*num);
if(valor>=num) valor-=num;
if(valor>9) src='lunas/luna'+valor+'.jpg';
	else src='lunas/luna0'+valor+'.jpg';
return src;
}

//*********************************
function angDis(a,b)
{//se asumen siempre a,b [0,1)
var c=0;
if(a>b)
	{
	c=Math.abs(a-b);
	if(Math.abs(a-1-b)<c) c=Math.abs(a-1-b);
	}
	else
	{
	c=Math.abs(b-a);
	if(Math.abs(b-1-a)<c) c=Math.abs(b-1-a);
	}
return c;
}

//*********************************
function dameTextoFases(dia)
{
//la función dameFase devuelve 0 exacto para la luna nueva de 6 de enero de 2000 18:14
fase=dameFase(dia);
faseman=dameFase(dia+1);
faseaye=dameFase(dia-1);

//luna nueva
ang=angDis(fase,0);if(ang<numerror30) if(angDis(faseman,0)>ang&&angDis(faseaye,0)>ang) return _nueva;
//luna creci
//ang=angDis(fase,0.25);if(ang<numerror30) if(angDis(faseman,0.25)>ang&&angDis(faseaye,0.25)>ang) return 'CRECI';
//luna llena
ang=angDis(fase,0.5);if(ang<numerror30) if(angDis(faseman,0.5)>ang&&angDis(faseaye,0.5)>ang)
	{
	hayeclipse=checkEclipse(dia);
	if(hayeclipse) 
		{return _eclipse}
		else 
		{return _llena};
	}
//luna menguante
//ang=angDis(fase,0.75);if(ang<numerror30) if(angDis(faseman,0.75)>ang&&angDis(faseaye,0.75)>ang) return 'MENGU';
return "";
}

//*********************************
function generaMes(ano,mes)
{
dia1=new Date();


hoygetFullYear=dia1.getUTCFullYear(); //hoy
hoygetDate=dia1.getUTCDate(); //hoy
hoygetMonth=dia1.getUTCMonth(); //hoy
dia1.setUTCDate(1); //primer día del mes
dia1.setUTCMonth(mes-1);
dia1.setUTCFullYear(ano);



diasemana=dia1.getUTCDay(); //0 para el domingo, 1 lunes...
if(lenguaje()=='es') 
	diasemana=diasemana-1;if(diasemana<0)diasemana+=7; //para que 0 sea el lunes, paises latinos
diaactual=mueveDias(dia1,-diasemana); //empezamos el calendario por aquí;

//comenzamos a dibujar el calendario...
c='<table cellspacing=0 class=mestabla><tr>';
for(i=0;i<7;i++)
	{c+='<td class=semanas>'+diassem[i]+'</td>';}
c+='</tr>';
for(i=0;i<42;i++)
	{
	mismomes=(diaactual.getUTCMonth()+1==mes?true:false);

	//variables temporales
	jdact=julianDate(diaactual);
	faseact=dameFase(jdact);
	graeclipact=dameEclipticaGra(jdact);
	imagen=dameGraficoLuna(faseact);
	//CSS
	clasecelda=(mismomes?"mesactualcelda":"mesotrocelda");
	clasedia=(mismomes?"diaactualnumero":"diaotronumero");
	clasezod=(mismomes?"textoactualzodiac":"textootrozodiac");
	//día de hoy
	estilohoy="";
	if(diaactual.getUTCDate()==hoygetDate)
		if(diaactual.getUTCMonth()==hoygetMonth)
			if(diaactual.getUTCFullYear()==hoygetFullYear) estilohoy=' style="background-color:#004488" ';

	lafase=dameTextoFases(jdact);
		if(lafase==_eclipse){imagen="lunas/eclipse.jpg";}

	if(i%7==0) c+='<tr>';
	c+='<td class='+clasecelda+' background="'+imagen+'" id=dialuna '+estilohoy+'><table cellspacing=0 cellpadding=0 border=0 class=b100><tr><td class='+clasedia+'>'+diaactual.getUTCDate()+'</td><td class=celdafase>'+lafase+'</td></tr><tr><td colspan=2 class='+clasezod+' height=100%>'+dameTextoSigno(graeclipact)+'</td></tr></table></td>';
	diaactual=mueveDias(diaactual,1);
	if(i%7==6) 
		{
		c+='</tr>'; //y ahora comprobamos si el siguiente día también es del mes: sino, se corta
		mismomes=(diaactual.getUTCMonth()+1==mes?true:false);
		if(!mismomes) i=100;
		}
	}
c+='</table>';
return c;
}

//*********************************
function recreaMes()
{
document.getElementById("mescontainer").innerHTML=generaMes(ano,mes);
document.getElementById("idano").innerHTML=ano;
document.getElementById("idmes").innerHTML=dameTextoMes(mes);
}
//*********************************
function checkLimites()
{
if(ano>2100) {ano=2100;mes=12};
if(ano<1900) {ano=1900;mes=1};
}
//*********************************
function mueveMes(salto)
{
mes=mes+salto;
if(mes>12) {mes-=12;ano++;}
if(mes<1) {mes+=12;ano--;}
checkLimites();
recreaMes();
}
//*********************************
function mueveAno(salto)
{
ano=ano+salto;
checkLimites();
recreaMes();
}

//*********************************
function mailea()
{
location.href='mailto:voe'+'t@cra'+"nf.net";
}