/*
Computational engine, setup and DHTML graphics:
Copyright Adrian R. Ashford 2004
Latest revision: 17 February 2004

DHTML date & time validation scripts:
Sandeep Tamhankar
stamhankar@hotmail.com
http://javascript.internet.com
*/

x_origin = 327;
y_origin = 106;
scale_factor = 12;
o_x = 1;
o_y = 1;
phenomena_output = "...";
old_date = "...";
new_date = "...";

function setup()
{
var nowdate = new Date();
var utc_day = nowdate.getUTCDate();
var utc_month = nowdate.getUTCMonth() + 1;
var utc_year = nowdate.getUTCFullYear();
zone = nowdate.getTimezoneOffset() / 1440;
document.jupiter.timezone.value = -(zone * 24);
var utc_hours = nowdate.getUTCHours();
var utc_mins = nowdate.getUTCMinutes();
var utc_secs = nowdate.getUTCSeconds();
utc_mins += utc_secs / 60.0;
utc_mins = Math.floor((utc_mins + 0.5));
if (utc_mins < 10) utc_mins = "0" + utc_mins;
if (utc_mins > 59) utc_mins = 59;
if (utc_hours < 10) utc_hours = "0" + utc_hours;
if (utc_month < 10) utc_month = "0" + utc_month;
if (utc_day < 10) utc_day = "0" + utc_day;
old_date = utc_month + "/" + utc_day + "/" + utc_year;
document.jupiter.date_txt.value = old_date;
document.jupiter.ut_h_m.value = utc_hours + ":" + utc_mins
jupiter();
}

function proper_ang(big)
{
with (Math)
{
var tmp = 0;
if (big > 0)
{
tmp = big / 360.0;
tmp = (tmp - floor(tmp)) * 360.0;
}
else
{
tmp = ceil(abs(big / 360.0));
tmp = big + tmp * 360.0;
}
}
return tmp;
}

function proper_ang_rad(big)
{
with (Math)
{
var tmp = 0;
if (big > 0)
{
tmp = big / 2 / PI;
tmp = (tmp - floor(tmp)) * 2 * PI;
}
else
{
tmp = ceil(abs(big / 2 / PI));
tmp = big + tmp * 2 * PI;
}
}
return tmp;
}

function round_10(num)
{
return Math.floor((num + 0.05) * 10) / 10;
}

function isValidDate(dateStr)
{ 
if (IsValidTime(document.jupiter.ut_h_m.value) == true)
{
var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
var matchArray = dateStr.match(datePat);
if (matchArray == null) { 
alert("La fecha no tiene un formato válido.") 
return false; 
} 
var month = matchArray[1];
var day = matchArray[3]; 
var year = matchArray[4]; 
if (month < 1 || month > 12) {
alert("El mes debe ser entre 1 y 12."); 
return false; 
} 
if (year < 1900 || year > 2100) {
alert("Los ańos deben ser entre 1900 y 2100."); 
return false; 
} 
if (day < 1 || day > 31) {
alert("Los días deben ser entre 1 y 31."); 
return false; 
} 
if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
alert("ˇEl mes de " + month + " no tiene 31 días!") 
return false 
} 
if (month == 2) {
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); 
if (day > 29 || (day == 29 && !isleap))
{ 
alert("ˇFebrero de " + year + " no tiene " + day + " días!"); 
return false; 
} 
} 
if (month < 10 && month.length == 1) month = "0" + month;
if (day < 10 && day.length == 1) day = "0" + day;
new_date = month + "/" + day + "/" + year;
document.jupiter.date_txt.value = new_date;
var dt_str = document.jupiter.date_txt.value;
if ((dt_str.substring(2,3) != "/") || (dt_str.substring(5,6) != "/"))
{
alert ("La fecha no tieen un formato válido.");
return false;
}
jupiter();
old_date = new_date;
return true;
}
else
{
return false;
}
}

function IsValidTime(timeStr)
{
var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
var matchArray = timeStr.match(timePat);
if (matchArray == null)
{
alert("la hora no tiene un formato válidos.");
return false;
}
var hour = matchArray[1];
var minute = matchArray[2];
if (hour < 0 || hour > 23)
{
alert("Las horas deben ser entre 0 y 23.");
return false;
}
if (minute < 0 || minute > 59)
{
alert ("Los minutos deben ser entre 0 y 59.");
return false;
}
if (hour < 10 && hour.length == 1) hour = "0" + hour;
if (minute < 10 && minute.length == 1) minute = "0" + minute;
document.jupiter.ut_h_m.value = hour + ":" + minute;
var tm_str = document.jupiter.ut_h_m.value;
if ((tm_str.substring(2,3) != ":") && (dt_str.length != 5))
{
alert ("La hora no tienen un formato válido.");
return false;
}
return true;
}

function isBinocular()
{

o_x = 1;
o_y = 1;
jupiter();

if (document.all)
{
document.all.direct.style.zIndex = 4;
document.all.inverted.style.zIndex = 1;
document.all.mirror.style.zIndex = 1;
}
else
{
if (document.layers)
{
document.layers["direct"].zIndex = 4;
document.layers["inverted"].zIndex = 1;
document.layers["mirror"].zIndex = 1;
}
else
{
if (document.getElementById)
{
document.getElementById("direct").style.zIndex = 4;
document.getElementById("inverted").style.zIndex = 1;
document.getElementById("mirror").style.zIndex = 1;
}
}
}

}

function isReflector()
{

o_x = -1;
o_y = -1;
jupiter();

if (document.all)
{
document.all.direct.style.zIndex = 1;
document.all.inverted.style.zIndex = 4;
document.all.mirror.style.zIndex = 1;
}
else
{
if (document.layers)
{
document.layers["direct"].zIndex = 1;
document.layers["inverted"].zIndex = 4;
document.layers["mirror"].zIndex = 1;
}
else
{
if (document.getElementById)
{
document.getElementById("direct").style.zIndex = 1;
document.getElementById("inverted").style.zIndex = 4;
document.getElementById("mirror").style.zIndex = 1;
}
}
}

}

function isRefractor()
{

o_x = -1;
o_y = 1;
jupiter();

if (document.all)
{
document.all.direct.style.zIndex = 1;
document.all.inverted.style.zIndex = 1;
document.all.mirror.style.zIndex = 4;
}
else
{
if (document.layers)
{
document.layers["direct"].zIndex = 1;
document.layers["inverted"].zIndex = 1;
document.layers["mirror"].zIndex = 4;
}
else
{
if (document.getElementById)
{
document.getElementById("direct").style.zIndex = 1;
document.getElementById("inverted").style.zIndex = 1;
document.getElementById("mirror").style.zIndex = 4;
}
}
}

}

function time_change(tmp)
{
var jd_temp, zz, ff, alpha, aa, bb, cc, dd, ee;
var calendar_day, calendar_month, calendar_year;
var int_day, hours, minutes;

var tm_as_str, ut_hrs, ut_mns, frac_day;

var jd = julian_date();

old_date = document.jupiter.date_txt.value;

tm_as_str = document.jupiter.ut_h_m.value;
ut_hrs = eval(tm_as_str.substring(0,2));
ut_mns = eval(tm_as_str.substring(3,5));
frac_day = ut_hrs / 24.0 + ut_mns / 1440.0;

with (Math) {

jd_temp = jd + frac_day + tmp / 24.0 + 0.5;

zz = floor(jd_temp);
ff = jd_temp - zz;
alpha = floor((zz - 1867216.25) / 36524.25);
aa = zz + 1 + alpha - floor(alpha / 4);
bb = aa + 1524;
cc = floor((bb - 122.1) / 365.25);
dd = floor(365.25 * cc);
ee = floor((bb - dd) / 30.6001);
calendar_day = bb - dd - floor(30.6001 * ee) + ff;
calendar_month = ee;
if (ee < 13.5) calendar_month = ee - 1;
if (ee > 13.5) calendar_month = ee - 13;
calendar_year = cc;
if (calendar_month > 2.5) calendar_year = cc - 4716;
if (calendar_month < 2.5) calendar_year = cc - 4715;
int_day = floor(calendar_day);
hours = (calendar_day - int_day) * 24;
minutes = floor((hours - floor(hours)) * 60 + 0.5);
hours = floor(hours);
if (minutes > 59)
{minutes = 0; hours = hours + 1;}
if (calendar_month < 10) calendar_month = "0" + calendar_month;
if (int_day < 10) int_day = "0" + int_day;
if (hours < 10) hours = "0" + floor(hours);
if (minutes < 10) minutes = "0" + minutes;

new_date = calendar_month + "/" + int_day + "/" + calendar_year;
document.jupiter.date_txt.value = new_date;
document.jupiter.ut_h_m.value = hours + ":" + minutes;

jupiter();

}
}

function julian_date()
{
var dt_as_str, mm, dd, yy;
var yyy, mmm, a, b;

dt_as_str = document.jupiter.date_txt.value;
mm = eval(dt_as_str.substring(0,2));
dd = eval(dt_as_str.substring(3,5));
yy = eval(dt_as_str.substring(6,10));

with (Math) {
var yyy=yy;
var mmm=mm;
if (mm < 3)
{
yyy = yy - 1;
mmm = mm + 12;
}
a = floor(yyy/100);
b = 2 - a + floor(a/4);

return floor(365.25*yyy) + floor(30.6001*(mmm+1)) + dd + 1720994.5 + b;
}
}

function jupiter()
{
var i,trans,io_layer,europa_layer,ganymede_layer,callisto_layer;
var io_shadow_layer,europa_shadow_layer,ganymede_shadow_layer,callisto_shadow_layer;
var tm_as_str, ut_hrs, ut_mns, frac_day;
var moon_separation, shadow_separation, moon_shadow_separation;
var factor = 1.071374;

var jd = julian_date();

tm_as_str = document.jupiter.ut_h_m.value;
ut_hrs = eval(tm_as_str.substring(0,2));
ut_mns = eval(tm_as_str.substring(3,5));
frac_day = ut_hrs / 24.0 + ut_mns / 1440.0;

with (Math) {

var RAD = 180.0/PI;

var day_start = jd + 1.1 / 1440 - 2451545.0;
var days = day_start + frac_day;

var t = (jd + frac_day + 1.1 / 1440 - 2415020.0) / 36525;

var u = t / 5 + 0.1;
var p = proper_ang_rad(4.14473024 + 52.96910393 * t);
var q = proper_ang_rad(4.64111846 + 21.32991139 * t);
var s = proper_ang_rad(4.2501771 + 7.478172103 * t);
var v = proper_ang_rad(5 * q - 2 * p);
var z = proper_ang_rad(q - p);

var V = proper_ang(172.74 + 0.00111588 * days);
V = 0.329 * sin(V / RAD);
var M = proper_ang(357.529 + 0.9856003 * days) / RAD;
var N = proper_ang(20.02 + 0.0830853 * days + V) / RAD;
var J = proper_ang(66.115 + 0.9025179 * days - V);
var A = 1.915 * sin(M) + 0.02 * sin(2 * M);
var B = 5.555 * sin(N) + 0.168 * sin(2 * N);
var K = (J + A - B) / RAD;
var R = 1.00014 - 0.01671 * cos(M) - 0.00014 * cos(2 * M);
var r = 5.20872 - 0.25208 * cos(N) - 0.00611 * cos(2 * N);
var e_to_j = sqrt(pow(r,2) + pow(R,2) - 2 * r * R * cos(K));
var ang_jove = 0.0009543 / e_to_j * RAD * 30.0;
var pha = asin(R / e_to_j * sin(K));
var lambda = proper_ang(34.35 + 0.083091 * days + V + B);
var D_s = 3.12 * sin ((lambda + 42.8) / RAD);
var D_e = D_s - 2.22 * sin(pha) * cos((lambda + 22) / RAD) - 1.3 * (r - e_to_j) / e_to_j * sin((lambda - 100.5) / RAD);
var diff = sin((D_e - D_s) / RAD);
D_s = sin(D_s / RAD);
D_e = sin(D_e / RAD);
pha = pha * RAD;

var System_II = proper_ang(187.23 + 870.1869088 * (days - e_to_j/173) + pha - B);

document.jupiter.sys_2_long.value = floor(System_II + 0.5);
document.jupiter.jupiter_dist.value = floor((e_to_j + 0.005) * 100.0) / 100.0;
document.jupiter.jupiter_size.value = round_10(196.94 / e_to_j);
var x = acos((pow(r,2) + pow(e_to_j,2) - pow(R,2))/(2 * r * e_to_j)) * RAD;
document.jupiter.jupiter_mag.value = round_10(-9.40 + 5 * log(r * e_to_j) / log(10) + 0.005 * x);

var moons_x = new Array (4);
var moons_y = new Array (4);
var shadow_x = new Array (4);
var shadow_y = new Array (4);
var moon_shadow_x = new Array (4);
var moon_shadow_y = new Array (4);
var u = new Array (4);
var u1_u = proper_ang(163.8069 + 203.4058646 * (days - e_to_j/173) + pha - B);
var u2_u = proper_ang(358.414 + 101.2916335 * (days - e_to_j/173) + pha - B);
var u3_u = proper_ang(5.7176 + 50.234518 * (days - e_to_j/173) + pha - B);
var u4_u = proper_ang(224.8092 + 21.48798 * (days - e_to_j/173) + pha - B);
var G = proper_ang(331.18 + 50.310482 * (days - e_to_j/173)) / RAD;
var H = proper_ang(87.45 + 21.569231 * (days - e_to_j/173)) / RAD;
var sh_factor_x = sin(pha / RAD);
var sh_factor_y = cos(pha / RAD);
u[0] = (u1_u + 0.473 * sin(2 * (u1_u - u2_u) / RAD)) / RAD;
u[1] = (u2_u + 1.065 * sin(2 * (u2_u - u3_u) / RAD)) / RAD;
u[2] = (u3_u + 0.165 * sin(G)) / RAD;
u[3] = (u4_u + 0.843 * sin(H)) / RAD;
var r1 = 5.9057 - 0.0244 * cos(2 * (u1_u - u2_u) / RAD);
var r2 = 9.3966 - 0.0882 * cos(2 * (u2_u - u3_u) / RAD);
var r3 = 14.9883 - 0.0216 * cos(G);
var r4 = 26.3627 - 0.1939 * cos(H);

moons_x[0] = r1 * sin(u[0]);
moons_x[1] = r2 * sin(u[1]);
moons_x[2] = r3 * sin(u[2]);
moons_x[3] = r4 * sin(u[3]);
moons_y[0] = -(r1 * cos(u[0]) * D_e) * factor;
moons_y[1] = -(r2 * cos(u[1]) * D_e) * factor;
moons_y[2] = -(r3 * cos(u[2]) * D_e) * factor;
moons_y[3] = -(r4 * cos(u[3]) * D_e) * factor;
shadow_x[0] = -(r1 * sh_factor_x);
shadow_x[1] = -(r2 * sh_factor_x);
shadow_x[2] = -(r3 * sh_factor_x);
shadow_x[3] = -(r4 * sh_factor_x);
shadow_y[0] = r1 * sh_factor_y * diff * factor;
shadow_y[1] = r2 * sh_factor_y * diff * factor;
shadow_y[2] = r3 * sh_factor_y * diff * factor;
shadow_y[3] = r4 * sh_factor_y * diff * factor;
moon_shadow_x[0] = moons_x[0] + shadow_x[0];
moon_shadow_y[0] = moons_y[0] + shadow_y[0];
moon_shadow_x[1] = moons_x[1] + shadow_x[1];
moon_shadow_y[1] = moons_y[1] + shadow_y[1];
moon_shadow_x[2] = moons_x[2] + shadow_x[2];
moon_shadow_y[2] = moons_y[2] + shadow_y[2];
moon_shadow_x[3] = moons_x[3] + shadow_x[3];
moon_shadow_y[3] = moons_y[3] + shadow_y[3];

var io_x = x_origin + moons_x[0] * scale_factor * o_x;
var io_y = y_origin - moons_y[0] * scale_factor * o_y;
var europa_x = x_origin + moons_x[1] * scale_factor * o_x;
var europa_y = y_origin - moons_y[1] * scale_factor * o_y;
var ganymede_x = x_origin + moons_x[2] * scale_factor * o_x;
var ganymede_y = y_origin - moons_y[2] * scale_factor * o_y;
var callisto_x = x_origin + moons_x[3] * scale_factor * o_x;
var callisto_y = y_origin - moons_y[3] * scale_factor * o_y;

var io_shadow_x = x_origin + moon_shadow_x[0] * scale_factor * o_x;
var io_shadow_y = y_origin - moon_shadow_y[0] * scale_factor * o_y;
var europa_shadow_x = x_origin + moon_shadow_x[1] * scale_factor * o_x;
var europa_shadow_y = y_origin - moon_shadow_y[1] * scale_factor * o_y;
var ganymede_shadow_x = x_origin + moon_shadow_x[2] * scale_factor * o_x;
var ganymede_shadow_y = y_origin - moon_shadow_y[2] * scale_factor * o_y;
var callisto_shadow_x = x_origin + moon_shadow_x[3] * scale_factor * o_x;
var callisto_shadow_y = y_origin - moon_shadow_y[3] * scale_factor * o_y;

io_layer = 12;
europa_layer = 13;
ganymede_layer = 14;
callisto_layer = 15;

io_shadow_layer = 1;
europa_shadow_layer = 1;
ganymede_shadow_layer = 1;
callisto_shadow_layer = 1;

if (1.571 < u[0] && u[0] < 4.712) io_layer = 9;
if (1.571 < u[1] && u[1] < 4.712) europa_layer = 7;
if (1.571 < u[2] && u[2] < 4.712) ganymede_layer = 5;
if (1.571 < u[3] && u[3] < 4.712) callisto_layer = 3;

for (i=0; i<4; i++)
{

shadow_separation = sqrt(pow((moons_x[i] - shadow_x[i]),2) + pow((moons_y[i] - shadow_y[i]),2));

if (shadow_separation < 1 && (u[i] > 1.58 && u[i] < 4.71))
{
if (i == 0) io_layer = 1;
if (i == 1) europa_layer = 1;
if (i == 2) ganymede_layer = 1;
if (i == 3) callisto_layer = 1;
}

moon_separation = sqrt(pow(moons_x[i],2) + pow(moons_y[i],2));

if (moon_separation < 1 && (u[i] > 2.79 && u[i] < 3.49))
{
if (i == 0) io_layer = 1;
if (i == 1) europa_layer = 1;
if (i == 2) ganymede_layer = 1;
if (i == 3) callisto_layer = 1;
}

moon_shadow_separation = sqrt(pow(moon_shadow_x[i],2) + pow(moon_shadow_y[i],2));

if (moon_shadow_separation < 1 && (u[i] > 5.23 || u[i] < 1.04))
{
if (i == 0) io_shadow_layer = 12;
if (i == 1) europa_shadow_layer = 13;
if (i == 2) ganymede_shadow_layer = 14;
if (i == 3) callisto_shadow_layer = 15;
}

}

if (document.all)
{
document.all.io.style.pixelLeft = io_x;
document.all.io.style.pixelTop = io_y;
document.all.io.style.zIndex = io_layer;
document.all.europa.style.pixelLeft = europa_x;
document.all.europa.style.pixelTop = europa_y;
document.all.europa.style.zIndex = europa_layer;
document.all.ganymede.style.pixelLeft = ganymede_x;
document.all.ganymede.style.pixelTop = ganymede_y;
document.all.ganymede.style.zIndex = ganymede_layer;
document.all.callisto.style.pixelLeft = callisto_x;
document.all.callisto.style.pixelTop = callisto_y;
document.all.callisto.style.zIndex = callisto_layer;

document.all.iodot.style.pixelLeft = io_shadow_x;
document.all.iodot.style.pixelTop = io_shadow_y;
document.all.iodot.style.zIndex = io_shadow_layer;
document.all.europadot.style.pixelLeft = europa_shadow_x;
document.all.europadot.style.pixelTop = europa_shadow_y;
document.all.europadot.style.zIndex = europa_shadow_layer;
document.all.ganymededot.style.pixelLeft = ganymede_shadow_x;
document.all.ganymededot.style.pixelTop = ganymede_shadow_y;
document.all.ganymededot.style.zIndex = ganymede_shadow_layer;
document.all.callistodot.style.pixelLeft = callisto_shadow_x;
document.all.callistodot.style.pixelTop = callisto_shadow_y;
document.all.callistodot.style.zIndex = callisto_shadow_layer;
}
else
{
if (document.layers)
{
document.layers["io"].left = io_x;
document.layers["io"].top = io_y;
document.layers["io"].zIndex = io_layer;
document.layers["europa"].left = europa_x;
document.layers["europa"].top = europa_y;
document.layers["europa"].zIndex = europa_layer;
document.layers["ganymede"].left = ganymede_x;
document.layers["ganymede"].top = ganymede_y;
document.layers["ganymede"].zIndex = ganymede_layer;
document.layers["callisto"].left = callisto_x;
document.layers["callisto"].top = callisto_y;
document.layers["callisto"].zIndex = callisto_layer;

document.layers["iodot"].left = io_shadow_x;
document.layers["iodot"].top = io_shadow_y;
document.layers["iodot"].zIndex = io_shadow_layer;
document.layers["europadot"].left = europa_shadow_x;
document.layers["europadot"].top = europa_shadow_y;
document.layers["europadot"].zIndex = europa_shadow_layer;
document.layers["ganymededot"].left = ganymede_shadow_x;
document.layers["ganymededot"].top = ganymede_shadow_y;
document.layers["ganymededot"].zIndex = ganymede_shadow_layer;
document.layers["callistodot"].left = callisto_shadow_x;
document.layers["callistodot"].top = callisto_shadow_y;
document.layers["callistodot"].zIndex = callisto_shadow_layer;
}
else
{
if (document.getElementById)
{
document.getElementById("io").style.left = io_x;
document.getElementById("io").style.top = io_y;
document.getElementById("io").style.zIndex = io_layer;
document.getElementById("europa").style.left = europa_x;
document.getElementById("europa").style.top = europa_y;
document.getElementById("europa").style.zIndex = europa_layer;
document.getElementById("ganymede").style.left = ganymede_x;
document.getElementById("ganymede").style.top = ganymede_y;
document.getElementById("ganymede").style.zIndex = ganymede_layer;
document.getElementById("callisto").style.left = callisto_x;
document.getElementById("callisto").style.top = callisto_y;
document.getElementById("callisto").style.zIndex = callisto_layer;

document.getElementById("iodot").style.left = io_shadow_x;
document.getElementById("iodot").style.top = io_shadow_y;
document.getElementById("iodot").style.zIndex = io_shadow_layer;
document.getElementById("europadot").style.left = europa_shadow_x;
document.getElementById("europadot").style.top = europa_shadow_y;
document.getElementById("europadot").style.zIndex = europa_shadow_layer;
document.getElementById("ganymededot").style.left = ganymede_shadow_x;
document.getElementById("ganymededot").style.top = ganymede_shadow_y;
document.getElementById("ganymededot").style.zIndex = ganymede_shadow_layer;
document.getElementById("callistodot").style.left = callisto_shadow_x;
document.getElementById("callistodot").style.top = callisto_shadow_y;
document.getElementById("callistodot").style.zIndex = callisto_shadow_layer;
}
}
}

}
}

function isValidPhenomena(dateStr)
{ 
if (IsValidTime(document.jupiter.ut_h_m.value) == true)
{
var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
var matchArray = dateStr.match(datePat);
if (matchArray == null) { 
alert("La fecha no tiene un formáto válido.") 
return false; 
} 
var month = matchArray[1];
var day = matchArray[3]; 
var year = matchArray[4]; 
if (month < 1 || month > 12) {
alert("El mes debe ser entre 1 y 12."); 
return false; 
} 
if (year < 1900 || year > 2100) {
alert("El ańo debe ser entre 1900 y 2100."); 
return false; 
} 
if (day < 1 || day > 31) {
alert("Los días deben ser entre 1 y 31."); 
return false; 
} 
if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
alert("ˇEl mes de " + month + " no tiene 31 días!") 
return false 
} 
if (month == 2) {
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); 
if (day > 29 || (day == 29 && !isleap))
{ 
alert("ˇFebrero de " + year + " no tiene " + day + " días!"); 
return false; 
} 
} 
if (month < 10 && month.length == 1) month = "0" + month;
if (day < 10 && day.length == 1) day = "0" + day;
new_date = month + "/" + day + "/" + year;
document.jupiter.date_txt.value = new_date;
var dt_str = document.jupiter.date_txt.value;
if ((dt_str.substring(2,3) != "/") || (dt_str.substring(5,6) != "/"))
{
alert ("La fecha no tiene un fromato válido.");
return false;
}
phenomena();
jupiter();
old_date = new_date;
return true;
}
else
{
return false;
}
}

function phenomena()
{

var i, hstep, mstep, h_event, m_event, loop_count, frac_day;
var moon_separation, shadow_separation, moon_shadow_separation;
var occultation, eclipse, multi_shadow, last_multi_shadow;
var factor = 1.071374;
var date_as_str, mmm, ddd, yyy, month_str, d_of_w, dow_str;
var jd, RAD, day_start, days;
var t, u, p, q, s, v, z;
var V, M, N, J, A, B, K, R, r;
var e_to_j, ang_jove, pha, lambda, D_s, D_e, diff;

var m_txt = new Array (4);
var moons_x = new Array (4);
var moons_y = new Array (4);
var shadow_x = new Array (4);
var shadow_y = new Array (4);
var moon_shadow_x = new Array (4);
var moon_shadow_y = new Array (4);
var uu = new Array (4);
var ecl = new Array (4);
var occ = new Array (4);
var tra = new Array (4);
var sha_tra = new Array (4);
var last_ecl = new Array (4);
var last_occ = new Array (4);
var last_tra = new Array (4);
var last_sha_tra = new Array (4);
var u1_u, u2_u, u3_u, u4_u, G, H, sh_factor_x, sh_factor_y;
var r1, r2, r3, r4;

m_txt[0] = " Io";
m_txt[1] = " Europa";
m_txt[2] = " Ganimedes";
m_txt[3] = " Calisto";

ecl[0] = 0;
ecl[1] = 0;
ecl[2] = 0;
ecl[3] = 0;
occ[0] = 0;
occ[1] = 0;
occ[2] = 0;
occ[3] = 0;
tra[0] = 0;
tra[1] = 0;
tra[2] = 0;
tra[3] = 0;
sha_tra[0] = 0;
sha_tra[1] = 0;
sha_tra[2] = 0;
sha_tra[3] = 0;
last_ecl[0] = 0;
last_ecl[1] = 0;
last_ecl[2] = 0;
last_ecl[3] = 0;
last_occ[0] = 0;
last_occ[1] = 0;
last_occ[2] = 0;
last_occ[3] = 0;
last_tra[0] = 0;
last_tra[1] = 0;
last_tra[2] = 0;
last_tra[3] = 0;
last_sha_tra[0] = 0;
last_sha_tra[1] = 0;
last_sha_tra[2] = 0;
last_sha_tra[3] = 0;

multi_shadow = 0;
last_multi_shadow = 0;

with (Math) {

RAD = 180.0/PI;

date_as_str = document.jupiter.date_txt.value;
mmm = eval(date_as_str.substring(0,2));
ddd = eval(date_as_str.substring(3,5));
yyy = eval(date_as_str.substring(6,10));

if (mmm == 01) month_str = "Enero ";
if (mmm == 02) month_str = "Febrero ";
if (mmm == 03) month_str = "Marzo ";
if (mmm == 04) month_str = "Abril ";
if (mmm == 05) month_str = "Mayo ";
if (mmm == 06) month_str = "Junio ";
if (mmm == 07) month_str = "Julio ";
if (mmm == 08) month_str = "Agosto ";
if (mmm == 09) month_str = "Septiembre ";
if (mmm == 10) month_str = "Octubre ";
if (mmm == 11) month_str = "Noviembre ";
if (mmm == 12) month_str = "Diciembre ";

jd = julian_date();

d_of_w = floor((jd + 1.5) % 7);

if (d_of_w == 0) dow_str = "Domingo";
if (d_of_w == 1) dow_str = "Lunes";
if (d_of_w == 2) dow_str = "Martes";
if (d_of_w == 3) dow_str = "Miercoles";
if (d_of_w == 4) dow_str = "Jueves";
if (d_of_w == 5) dow_str = "Viernes";
if (d_of_w == 6) dow_str = "Sábado";

phenomena_output = dow_str + ", " + ddd +" de " + month_str + "de " + yyy + "\n";

loop_count = 0;

for (hstep=0; hstep<24; hstep++)
{

for (mstep=0; mstep<60; mstep+=2)
{

h_event = hstep;
m_event = mstep;
if (h_event < 10) h_event = "0" + h_event;
if (m_event < 10) m_event = "0" + m_event;

frac_day = hstep / 24.0 + mstep / 1440.0;
day_start = jd + 1.1 / 1440 - 2451545.0;
days = day_start + frac_day;

t = (jd + frac_day + 1.1 / 1440 - 2415020.0) / 36525;

u = t / 5 + 0.1;
p = proper_ang_rad(4.14473024 + 52.96910393 * t);
q = proper_ang_rad(4.64111846 + 21.32991139 * t);
s = proper_ang_rad(4.2501771 + 7.478172103 * t);
v = proper_ang_rad(5 * q - 2 * p);
z = proper_ang_rad(q - p);

V = proper_ang(172.74 + 0.00111588 * days);
V = 0.329 * sin(V / RAD);
M = proper_ang(357.529 + 0.9856003 * days) / RAD;
N = proper_ang(20.02 + 0.0830853 * days + V) / RAD;
J = proper_ang(66.115 + 0.9025179 * days - V);
A = 1.915 * sin(M) + 0.02 * sin(2 * M);
B = 5.555 * sin(N) + 0.168 * sin(2 * N);
K = (J + A - B) / RAD;
R = 1.00014 - 0.01671 * cos(M) - 0.00014 * cos(2 * M);
r = 5.20872 - 0.25208 * cos(N) - 0.00611 * cos(2 * N);
e_to_j = sqrt(pow(r,2) + pow(R,2) - 2 * r * R * cos(K));
ang_jove = 0.0009543 / e_to_j * RAD * 30.0;
pha = asin(R / e_to_j * sin(K));
lambda = proper_ang(34.35 + 0.083091 * days + V + B);
D_s = 3.12 * sin ((lambda + 42.8) / RAD);
D_e = D_s - 2.22 * sin(pha) * cos((lambda + 22) / RAD) - 1.3 * (r - e_to_j) / e_to_j * sin((lambda - 100.5) / RAD);
diff = sin((D_e - D_s) / RAD);
D_e = sin(D_e / RAD);
D_s = sin(D_s / RAD);
pha = pha * RAD;

u1_u = proper_ang(163.8069 + 203.4058646 * (days - e_to_j/173) + pha - B);
u2_u = proper_ang(358.414 + 101.2916335 * (days - e_to_j/173) + pha - B);
u3_u = proper_ang(5.7176 + 50.234518 * (days - e_to_j/173) + pha - B);
u4_u = proper_ang(224.8092 + 21.48798 * (days - e_to_j/173) + pha - B);
G = proper_ang(331.18 + 50.310482 * (days - e_to_j/173)) / RAD;
H = proper_ang(87.45 + 21.569231 * (days - e_to_j/173)) / RAD;
sh_factor_x = sin(pha / RAD);
sh_factor_y = cos(pha / RAD);
uu[0] = (u1_u + 0.473 * sin(2 * (u1_u - u2_u) / RAD)) / RAD;
uu[1] = (u2_u + 1.065 * sin(2 * (u2_u - u3_u) / RAD)) / RAD;
uu[2] = (u3_u + 0.165 * sin(G)) / RAD;
uu[3] = (u4_u + 0.843 * sin(H)) / RAD;
r1 = 5.9057 - 0.0244 * cos(2 * (u1_u - u2_u) / RAD);
r2 = 9.3966 - 0.0882 * cos(2 * (u2_u - u3_u) / RAD);
r3 = 14.9883 - 0.0216 * cos(G);
r4 = 26.3627 - 0.1939 * cos(H);

moons_x[0] = r1 * sin(uu[0]);
moons_x[1] = r2 * sin(uu[1]);
moons_x[2] = r3 * sin(uu[2]);
moons_x[3] = r4 * sin(uu[3]);
moons_y[0] = -(r1 * cos(uu[0]) * D_e) * factor;
moons_y[1] = -(r2 * cos(uu[1]) * D_e) * factor;
moons_y[2] = -(r3 * cos(uu[2]) * D_e) * factor;
moons_y[3] = -(r4 * cos(uu[3]) * D_e) * factor;
shadow_x[0] = -(r1 * sh_factor_x);
shadow_x[1] = -(r2 * sh_factor_x);
shadow_x[2] = -(r3 * sh_factor_x);
shadow_x[3] = -(r4 * sh_factor_x);
shadow_y[0] = r1 * sh_factor_y * diff * factor;
shadow_y[1] = r2 * sh_factor_y * diff * factor;
shadow_y[2] = r3 * sh_factor_y * diff * factor;
shadow_y[3] = r4 * sh_factor_y * diff * factor;
moon_shadow_x[0] = moons_x[0] + shadow_x[0];
moon_shadow_y[0] = moons_y[0] + shadow_y[0];
moon_shadow_x[1] = moons_x[1] + shadow_x[1];
moon_shadow_y[1] = moons_y[1] + shadow_y[1];
moon_shadow_x[2] = moons_x[2] + shadow_x[2];
moon_shadow_y[2] = moons_y[2] + shadow_y[2];
moon_shadow_x[3] = moons_x[3] + shadow_x[3];
moon_shadow_y[3] = moons_y[3] + shadow_y[3];

for (i=0; i<4; i++)
{
shadow_separation = sqrt(pow((moons_x[i] - shadow_x[i]),2) + pow((moons_y[i] - shadow_y[i]),2));

moon_separation = sqrt(pow(moons_x[i],2) + pow(moons_y[i],2));

moon_shadow_separation = sqrt(pow(moon_shadow_x[i],2) + pow(moon_shadow_y[i],2));

if (moon_separation < 1 && (uu[i] > 2.79 && uu[i] < 3.49))
{occultation = 1;}
else
{occultation = 0;}

if (shadow_separation < 1 && (uu[i] > 1.58 && uu[i] < 4.71))
{eclipse = 1;}
else
{eclipse = 0;}

if (occultation == 1)
{
occ[i] = 1;
if (last_occ[i] == 0 && loop_count > 0 && eclipse == 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " entra en ocultación detrás de Júpiter.";
}
else
{
occ[i] = 0;
if (last_occ[i] == 1 && eclipse == 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " sale de la ocultación detrás de Júpiter.";
}

if (eclipse == 1)
{
ecl[i] = 1;
if (last_ecl[i] == 0 && loop_count > 0 && occultation == 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " entra en eclipse con la sombra de Júpiter.";
}
else
{
ecl[i] = 0;
if (last_ecl[i] == 1 && occultation == 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " sale del eclipse de la sombra de Júpiter.";
}

if (moon_separation < 1 && (uu[i] > 5.93 || uu[i] < 0.35))
{
tra[i] = 1;
if (last_tra[i] == 0 && loop_count > 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " comienza el tránsito de Júpiter.";
}
else
{
tra[i] = 0;
if (last_tra[i] == 1) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + m_txt[i] + " finaliza el tránsito de Júpiter.";
}

if (moon_shadow_separation < 1 && (uu[i] > 5.23 || uu[i] < 1.04))
{
sha_tra[i] = 1;
if (last_sha_tra[i] == 0 && loop_count > 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT, la sombra de " + m_txt[i] + " comienza a cruzar el disco de Júpiter.";
}
else
{
sha_tra[i] = 0;
if (last_sha_tra[i] == 1) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT, la sombra de " + m_txt[i] + " sale del disco de Júpiter.";
}

last_ecl[0] = ecl[0];
last_ecl[1] = ecl[1];
last_ecl[2] = ecl[2];
last_ecl[3] = ecl[3];
last_occ[0] = occ[0];
last_occ[1] = occ[1];
last_occ[2] = occ[2];
last_occ[3] = occ[3];
last_tra[0] = tra[0];
last_tra[1] = tra[1];
last_tra[2] = tra[2];
last_tra[3] = tra[3];
last_sha_tra[0] = sha_tra[0];
last_sha_tra[1] = sha_tra[1];
last_sha_tra[2] = sha_tra[2];
last_sha_tra[3] = sha_tra[3];
}

if ((sha_tra[0] == 1 && sha_tra[1] == 1) || (sha_tra[0] == 1 && sha_tra[2] == 1) || (sha_tra[0] == 1 && sha_tra[3] == 1))
{
multi_shadow = 1;
if (last_multi_shadow == 0 && loop_count > 0) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + " ** Comiemza un tránsito de varias sombras. **";
}
else
{
multi_shadow = 0;
if (last_multi_shadow == 1) phenomena_output = phenomena_output + "\n" + h_event + ":" + m_event + " UT," + " ** Finaliza el tránsito de varias sombras. **";
}

last_multi_shadow = multi_shadow;

loop_count += 1;

}
}

document.jupiter.moon_events.value = phenomena_output;

}
}

