//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//**********                                                                             **********
//**********                                                                             **********
//**********                           M J E S E C                                       **********
//**********                                                                             **********
//**********                                                                             **********
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************

function mjesec_Orb_Elem(kada)
{	
	var d=izracunaj_d(kada);
	/*******************************
	* Orbitalni elementi Mjeseca   *
	********************************/
	var N = norm360(125.1228 - 0.0529538083 * d);
	var i = 5.1454;
	var w = norm360(318.0634 + 0.1643573223 * d);
	var a = 60.2666;  // zemljinih radiusa
	var e = 0.054900;
	var M = norm360(115.3654 + 13.0649929509 * d);

	//alert("M_mjesec="+M_mjesec);
	//alert("N_mjesec="+N_mjesec);
	//alert("w_mjesec="+w_mjesec);

	var vrati_parametre= new Array();
	vrati_parametre["N"]= N;
	vrati_parametre["i"]= i;
	vrati_parametre["w"]= w;
	vrati_parametre["a"]= a;
	vrati_parametre["e"]= e;
	vrati_parametre["M"]= M;
	return vrati_parametre;

} // end of mjesec()


function mjeseceve_pretumabacije_lon(Ms, Mm, Nm, wm, ws)
{
	var  Ls=0, Lm=0, D=0, F=0, lonecl=0;
	
	Ls = Ms + ws;         //  Mean Longitude of the Sun  (Ns=0)
	Lm = Mm + wm + Nm;    //  Mean longitude of the Moon
	D = Lm - Ls;          //  Mean elongation of the Moon
	F = Lm - Nm;        // Argument of latitude for the Moon

		
	// Perturbations of Moon: longitude - lonecl [degress]	
	lonecl += -1.274 * sinDeg(Mm - 2*D);      //    (the Evection)
	lonecl += 0.658 * sinDeg(2*D);           //    (the Variation)
	lonecl += -0.186 * sinDeg(Ms);            //    (the Yearly Equation)
	lonecl += -0.059 * sinDeg(2*Mm - 2*D);
	lonecl += -0.057 * sinDeg(Mm - 2*D + Ms);
	lonecl += 0.053 * sinDeg(Mm + 2*D);
	lonecl += 0.046 * sinDeg(2*D - Ms);
	lonecl += 0.041 * sinDeg(Mm - Ms);
	lonecl += -0.035 * sinDeg(D);             // (the Parallactic Equation)
	lonecl += -0.031 * sinDeg(Mm + Ms);
	lonecl += -0.015 * sinDeg(2*F - 2*D);
	lonecl += 0.011 * sinDeg(Mm - 4*D);
	
	return lonecl;
}


function mjeseceve_pretumabacije_lat(Ms, Mm, Nm, wm, ws)
{
	var  Ls=0, Lm=0, D=0, F=0, latecl=0;

	Ls = Ms + ws;         //  Mean Longitude of the Sun  (Ns=0)
	Lm = Mm + wm + Nm;    //  Mean longitude of the Moon
	D = Lm - Ls;          //  Mean elongation of the Moon
	F = Lm - Nm;        // Argument of latitude for the Moon

	// latitude - latecl [degress]
	latecl += -0.173 * sinDeg(F - 2*D);
	latecl += -0.055 * sinDeg(Mm - F - 2*D);
	latecl += -0.046 * sinDeg(Mm + F - 2*D);
	latecl += 0.033 * sinDeg(F + 2*D);
	latecl += 0.017 * sinDeg(2*Mm + F);
	
	return latecl;
}

function mjeseceve_pretumabacije_r(Ms, Mm, Nm, wm, ws)
{
	var  Ls=0, Lm=0, D=0, F=0, lat=0, r=0;
	
	Ls = Ms + ws;         //  Mean Longitude of the Sun  (Ns=0)
	Lm = Mm + wm + Nm;    //  Mean longitude of the Moon
	D = Lm - Ls;          //  Mean elongation of the Moon
	F = Lm - Nm;        // Argument of latitude for the Moon


	// Moon's distance (Earth radii):
	r += -0.58 * cosDeg(Mm - 2*D);
	r += -0.46 * cosDeg(2*D);		
	
	return r;
}

function mjesec_topocentric_RA (kada,r,RA, Dec, x_lat, w_sunce, M_sunce)
{	
	var Mjesec_paralax=0, gclat=0, rho=0, topRA=0, topDecl=0, g=0, HA=0, GMST0=0;

	/* Moon topocentric position:
	gclat - geocentric latitude  
	rho   - distance from the center of the Earth (rho) in Earth equatorial radii
	Mjesec_paralax - Moon's parallax, i.e. the apparent size of the (equatorial) radius of the Earth, as seen from the Moon
	HA = Moon's geocentric Hour Angle 
	g - auxiliary angle	*/
	
	//alert("ENTER: mjesec_topocentric_RA(kada="+kada+" r="+r+" RA="+RA+" Dec="+Dec+" x_lat="+x_lat+" w_sunce="+w_sunce+" M_sunce="+M_sunce);
	Mjesec_paralax = asinDeg(1/r);	
	gclat   = x_lat - 0.1924 * sinDeg(2*x_lat);
    rho     = 0.99833 + 0.00167 * cosDeg(2*x_lat);
	GMST0   = norm360(M_sunce+ w_sunce+180);
	HA      = GMST0+izracunaj_UT(kada)*15+ x_lon-RA;	
	g       = atanDeg( tanDeg(gclat) / cosDeg(HA) );
	topRA   = RA  - Mjesec_paralax * rho * cosDeg(gclat) * sinDeg(HA) / cosDeg(Dec);

	//alert("paralax="+Mjesec_paralax+" gclat= "+gclat+" rho="+rho+" HA="+HA+" g="+g+" topRA="+topRA);

	return topRA;
	
	
}

function mjesec_topocentric_Dec (kada,r,RA, Dec, x_lat, w_sunce, M_sunce)
{	
	var Mjesec_paralax=0, gclat=0, rho=0, topDecl=0, g=0, HA=0, GMST0=0;
	
	Mjesec_paralax = asinDeg(1/r);	
	gclat   = x_lat - 0.1924 * sinDeg(2*x_lat);
    rho     = 0.99833 + 0.00167 * cosDeg(2*x_lat);
	GMST0   = norm360(M_sunce+ w_sunce+180);
	HA      = GMST0+izracunaj_UT(kada)*15+ x_lon-RA;	
	g       = atanDeg( tanDeg(gclat) / cosDeg(HA) );
	topDecl = Dec - Mjesec_paralax * rho * sinDeg(gclat) * sinDeg(g - Dec) / sinDeg(g);
	//alert("paralax="+Mjesec_paralax+" gclat= "+gclat+" rho="+rho+" HA="+HA+" g="+g+" topDecl="+topDecl);

	return topDecl;
	
	
}


function mjesec_kalkulator (kada, h_konvencija, x_lon, x_lat, sunce_data)
{
	var planet_data1 = new Array();
	var planet_data2 = new Array();
	var planet_data3 = new Array();
	var planet_data4 = new Array();
	var planet_data1_podne = new Array();
	var planet_data2_podne = new Array();
	var sunce_data_podne = new Array();
	var vrati_parametre=new Array();
	var loc_podne = new Date(kada.getFullYear(), kada.getMonth()+1, kada.getDate(), 12,0,0,0);

	//alert("ENTER: mjesec_kalkulator");
	//window.status = "mjesec";

	sunce_data_podne = sunce_pozicija(loc_podne);
	planet_data1        = pozicija_planeta(kada, "mjesec");
	planet_data1_podne  = pozicija_planeta(loc_podne, "mjesec");

	planet_data1["lonecl"] += mjeseceve_pretumabacije_lon (sunce_data["M"],planet_data1["M"],planet_data1["N"],planet_data1["w"],sunce_data["w"]);
	planet_data1["latecl"] += mjeseceve_pretumabacije_lat (sunce_data["M"],planet_data1["M"],planet_data1["N"],planet_data1["w"],sunce_data["w"]);
	planet_data1["r"]      += mjeseceve_pretumabacije_r   (sunce_data["M"],planet_data1["M"],planet_data1["N"],planet_data1["w"],sunce_data["w"]);

	planet_data1_podne["lonecl"] += mjeseceve_pretumabacije_lon(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
	planet_data1_podne["latecl"] += mjeseceve_pretumabacije_lat(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
	planet_data1_podne["r"]      += mjeseceve_pretumabacije_r(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);	
	
	planet_data2        = planet_RA_Decl("mjesec", izracunaj_ecl(kada), planet_data1["r"], planet_data1["lonecl"], planet_data1["latecl"],sunce_data["r"], sunce_data["lon"] );	
	planet_data2["RA"]  = mjesec_topocentric_RA(kada, planet_data1["r"], planet_data2["RA"],planet_data2["Dec"],x_lat, sunce_data["w"],sunce_data["M"]);
	planet_data2["Dec"] = mjesec_topocentric_Dec(kada, planet_data1["r"], planet_data2["RA"],planet_data2["Dec"],x_lat, sunce_data["w"],sunce_data["M"]);

	planet_data2_podne        = planet_RA_Decl("mjesec", izracunaj_ecl(loc_podne), planet_data1_podne["r"], planet_data1_podne["lonecl"],planet_data1_podne["latecl"], sunce_data_podne["r"], sunce_data_podne["lon"] );	
	planet_data2_podne["RA"]  = mjesec_topocentric_RA (kada, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);
	planet_data2_podne["Dec"] = mjesec_topocentric_Dec(kada, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);	
	
	vrati_parametre["N"]     = planet_data1["N"]; // N
	vrati_parametre["i"]     = planet_data1["i"]; // i
	vrati_parametre["w"]     = planet_data1["w"]; // w
	vrati_parametre["a"]     = planet_data1["a"]; // a
	vrati_parametre["e"]     = planet_data1["e"]; // e
	vrati_parametre["M"]     = planet_data1["M"]; // M 
	vrati_parametre["v"]     = planet_data1["v"]; // v
	vrati_parametre["r"]     = planet_data1["r"]; // r
	vrati_parametre["lonecl"]= planet_data1["lonecl"]; // lonecl
	vrati_parametre["latecl"]= planet_data1["latecl"]; // latecl
	vrati_parametre["RA"]    = planet_data2["RA"]; // RA
	vrati_parametre["Dec"]   = planet_data2["Dec"]; // Dec
	vrati_parametre["rg"]    = planet_data2["rg"]; // rg

	//alert("1");
	planet_data3 = planet_izlazk_zalazak(kada, h_konvencija, x_lon, x_lat, sunce_data["M"], sunce_data["w"], 
					planet_data2["RA"], planet_data2["Dec"], planet_data1_podne["M"],planet_data1_podne["w"], 
					planet_data2_podne["RA"], planet_data2_podne["Dec"],	sunce_data_podne["M"], sunce_data_podne["w"]);	
	

	vrati_parametre["altitude above the horizon"] 	= planet_data3["altitude above the horizon"]; //planet altitude above the horizon

	var iterDate= new Date();
	var tmpZalazak=0, tmpIzlazak=0;
	var i=0;

	if (planet_data3["zalazak UT"] >0 && planet_data3["zalazak UT"]<24) 
	{
	do 	// iterate zalazak
	{
		iterDate=planet_data3["zalazak local time"];
		tmpZalazak=planet_data3["zalazak UT"];
		
		planet_data1_podne  = pozicija_planeta(iterDate, "mjesec");
		sunce_data_podne    = sunce_pozicija(iterDate);
	
		planet_data1_podne["lonecl"] += mjeseceve_pretumabacije_lon(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
		planet_data1_podne["latecl"] += mjeseceve_pretumabacije_lat(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
		planet_data1_podne["r"]      += mjeseceve_pretumabacije_r(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);	
		
		planet_data2_podne = planet_RA_Decl("mjesec", izracunaj_ecl(iterDate), planet_data1_podne["r"], planet_data1_podne["lonecl"],planet_data1_podne["latecl"], sunce_data_podne["r"], sunce_data_podne["lon"] );	
		
		planet_data2_podne["RA"]  = mjesec_topocentric_RA (iterDate, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);
		planet_data2_podne["Dec"] = mjesec_topocentric_Dec(iterDate, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);
	
		planet_data3 = planet_izlazk_zalazak(iterDate, h_konvencija, x_lon, x_lat, sunce_data["M"], sunce_data["w"], 
						planet_data2["RA"], planet_data2["Dec"], planet_data1_podne["M"],planet_data1_podne["w"], 
						planet_data2_podne["RA"], planet_data2_podne["Dec"],	sunce_data_podne["M"], sunce_data_podne["w"]);	
		i++;							
		//alert(" iter: tmpZalazak="+tmpZalazak+"noviZalazak="+planet_data3["zalazak UT"]+"i="+i);
		if (i>=10) break;
	} while (Math.abs(tmpZalazak-planet_data3["zalazak UT"])>1E-3);
	} //end if
	else
	{	
	
	}
	
	vrati_parametre["zalazak UT"]                 	= planet_data3["zalazak UT"]; // zalazak  u UT
	vrati_parametre["zalazak local time"]         	= planet_data3["zalazak local time"]; // zalazak u lokalnom vremenu
	i=0;
	if (planet_data3["izlazak UT"] >0 && planet_data3["izlazak UT"]<24) 
	{
	do 	// iterate izlazak
	{
		iterDate=planet_data3["izlazak local time"];
		tmpIzlazak=planet_data3["izlazak UT"];
		
		planet_data1_podne  = pozicija_planeta(iterDate, "mjesec");
		sunce_data_podne    = sunce_pozicija(iterDate);
	
		planet_data1_podne["lonecl"] += mjeseceve_pretumabacije_lon(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
		planet_data1_podne["latecl"] += mjeseceve_pretumabacije_lat(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);
		planet_data1_podne["r"]      += mjeseceve_pretumabacije_r(sunce_data_podne["M"], planet_data1_podne["M"], planet_data1_podne["N"],planet_data1_podne["w"], sunce_data_podne["w"]);	
		
		planet_data2_podne = planet_RA_Decl("mjesec", izracunaj_ecl(iterDate), planet_data1_podne["r"], planet_data1_podne["lonecl"],planet_data1_podne["latecl"], sunce_data_podne["r"], sunce_data_podne["lon"] );	
		
		planet_data2_podne["RA"]  = mjesec_topocentric_RA (iterDate, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);
		planet_data2_podne["Dec"] = mjesec_topocentric_Dec(iterDate, planet_data1_podne["r"], planet_data2_podne["RA"],planet_data2_podne["Dec"],x_lat, sunce_data_podne["w"],sunce_data_podne["M"]);
	
		planet_data3 = planet_izlazk_zalazak(iterDate, h_konvencija, x_lon, x_lat, sunce_data["M"], sunce_data["w"], 
		planet_data2["RA"], planet_data2["Dec"], planet_data1_podne["M"],planet_data1_podne["w"], 
		planet_data2_podne["RA"], planet_data2_podne["Dec"],	sunce_data_podne["M"], sunce_data_podne["w"]);	
	
		//alert(" iter: tmpIzlazak="+tmpIzlazak+"NoviIzlazak="+planet_data3["izlazak UT"]);
		i++;
		if (i>=10) break; 
	} while (Math.abs(tmpIzlazak-planet_data3["izlazak UT"])>1E-3) ;
	} //end if
	
	planet_data4 = planet_ostalo (planet_data1["r"],planet_data2["rg"],sunce_data["r"], "mjesec", planet_data1["lonecl"], planet_data1["latecl"], sunce_data["lon"], 0);

	vrati_parametre["UT_in_south"]        = planet_data3["UT_in_south"]; // vrijeme  (UT) kada je planet tocno na jugu
	vrati_parametre["cosLHA"]             = planet_data3["cosLHA"];
	vrati_parametre["izlazak UT"]         = planet_data3["izlazak UT"]; // izlazak  u UT
	vrati_parametre["izlazak local time"] = planet_data3["izlazak local time"]; // izlazak u lokalnom vremenu
	vrati_parametre["azimuth"]            = planet_data3["azimuth"];
  vrati_parametre["altitude"]           = planet_data3["altitude"];
	vrati_parametre["elong"]			= planet_data4["elong"]; // The elongation is the apparent angular distance of the planet from the Sun
	vrati_parametre["faza"]				= planet_data4["faza"];
	vrati_parametre["d"]				= planet_data4["d"]; // apparent diameter
	vrati_parametre["magnitude"]		= planet_data4["magnitude"];
	vrati_parametre["fazni kut"]        = planet_data4["fazni kut"];

	//alert("RETURN::mjesec_kalkulator()");
	return vrati_parametre;

} //end of _kalkulator()
