PI = Math.PI;
DR = PI/180;
K1 = 15*DR*1.0027379
var Sunrise = false;
var Sunset  = false;
var Sun_Rise_time = [0, 0];
var Sun_Set_time  = [0, 0];
var Sun_Rise_az = 0.0;
var Sun_Set_az  = 0.0;
var Sun_Sky = [0.0, 0.0];
var Sun_RAn = [0.0, 0.0, 0.0];
var Sun_Dec = [0.0, 0.0, 0.0];
var Sun_VHz = [0.0, 0.0, 0.0];
function calcSun(d,m,y,xcor,ycor,sunpr,print)
{
    var lat = xcor;
    var lon = ycor;
    var year  = parseInt(y, 10);
    var month = parseInt(m, 10) - 1;
    var day   = parseInt(d, 10);
    Now = new Date(year, month, day, 0, 0, 0);
    return sunriseset(lat, lon, sunpr, print);
}

function sunriseset( lat, lon, sunpr, print )
{
    var k;
    var zone = Math.round(Now.getTimezoneOffset()/60);
    var jd = julian_day() - 2451545;
    lon = lon/360;
    var tz  = zone/24;
    var ct  = jd/36525 + 1;
    var t0 = lst(lon, jd, tz);
    jd = jd + tz;
    sun(jd, ct);
    var ra0  = Sun_Sky[0];
    var dec0 = Sun_Sky[1];
    jd = jd + 1;
    sun(jd, ct);
    var ra1  = Sun_Sky[0];
    var dec1 = Sun_Sky[1];
    if (ra1 < ra0) {
        ra1 = ra1 + 2*PI;
    }
    Sunrise = false;
    Sunset  = false;
    Sun_RAn[0]   = ra0;
    Sun_Dec[0]  = dec0;
    for (k = 0; k < 24; k++)
    {
        ph = (k + 1)/24;
        Sun_RAn[2] = ra0  + (k + 1)*(ra1  - ra0)/24;
        Sun_Dec[2] = dec0 + (k + 1)*(dec1 - dec0)/24;
        Sun_VHz[2] = test_hour(k, zone, t0, lat);
        Sun_RAn[0] = Sun_RAn[2];
        Sun_Dec[0] = Sun_Dec[2];
        Sun_VHz[0] = Sun_VHz[2];
    }
    var srise1 = zintstr(Sun_Rise_time[0], 2); 
    var srise2 = zintstr(Sun_Rise_time[1], 2);
    var srise = srise1 + ":" + srise2;
    var sset1 = zintstr( Sun_Set_time[0], 2);
    var sset2 = zintstr( Sun_Set_time[1], 2);
    var sset  = sset1 + ":" + sset2;
    if (sunpr == "0") {
        fux('sl_w',srise);
	fux('sl_z',sset);
	sunspecial_message();
    } else {
        if (sunpr == "1") {
            if (print == "1") {
                document.write(Sun_Rise_time[0] + "."+ srise2);
            } else {
                return Sun_Rise_time[0] + "."+ srise2;
            }
	} else {
            if (print == "1") {
                document.write(Sun_Set_time[0] + "." + sset2);
            } else {
                return Sun_Set_time[0] + "." + sset2;
            }
	}	
    }
}

function test_hour( k, zone, t0, lat )
{
    var ha = new Array(3);
    var a, b, c, d, e, s, z;
    var hr, min, time;
    var az, dz, hz, nz;    
    ha[0] = t0 - Sun_RAn[0] + k*K1; 
    ha[2] = t0 - Sun_RAn[2] + k*K1 + K1; 
    ha[1]  = (ha[2]  + ha[0])/2;
    Sun_Dec[1] = (Sun_Dec[2] + Sun_Dec[0])/2 ;
    s = Math.sin(lat*DR);
    c = Math.cos(lat*DR);
    z = Math.cos(90.833*DR);
    if (k <= 0) {
        Sun_VHz[0] = s*Math.sin(Sun_Dec[0]) + c*Math.cos(Sun_Dec[0])*Math.cos(ha[0]) - z;
    }
    Sun_VHz[2] = s*Math.sin(Sun_Dec[2]) + c*Math.cos(Sun_Dec[2])*Math.cos(ha[2]) - z;
    if (sgn(Sun_VHz[0]) == sgn(Sun_VHz[2])) {
        return Sun_VHz[2];
    }
    Sun_VHz[1] = s*Math.sin(Sun_Dec[1]) + c*Math.cos(Sun_Dec[1])*Math.cos(ha[1]) - z;
    a =  2* Sun_VHz[0] - 4*Sun_VHz[1] + 2*Sun_VHz[2]; 
    b = -3* Sun_VHz[0] + 4*Sun_VHz[1] - Sun_VHz[2];   
    d = b*b - 4*a*Sun_VHz[0];
    if (d < 0) {
        return Sun_VHz[2];
    }
    d = Math.sqrt(d);    
    e = (-b + d)/(2 * a);
    if ((e > 1)||(e < 0)) {
        e = (-b - d)/(2*a);
    }
    time = k + e + 1/120;
    hr = Math.floor(time);
    min = Math.floor((time - hr)*60);
    hz = ha[0] + e*(ha[2] - ha[0]);
    nz = -Math.cos(Sun_Dec[1])*Math.sin(hz);
    dz = c*Math.sin(Sun_Dec[1]) - s*Math.cos(Sun_Dec[1])*Math.cos(hz);
    az = Math.atan2(nz, dz)/DR;
    if (az < 0) az = az + 360;
    if ((Sun_VHz[0] < 0)&&(Sun_VHz[2] > 0))
    {
        Sun_Rise_time[0] = hr;
        Sun_Rise_time[1] = min;
        Sun_Rise_az = az;
        Sunrise = true;
    }
    if ((Sun_VHz[0] > 0)&&(Sun_VHz[2] < 0))
    {
        Sun_Set_time[0] = hr;
        Sun_Set_time[1] = min;
        Sun_Set_az = az;
        Sunset = true;
    }
    return Sun_VHz[2];
}

function sunspecial_message()
{
    if ((!Sunrise)&&(!Sunset))
    {
        if (Sun_VHz[2] < 0) {
            fux('sl_w','--');
        } else {
            fux('sl_w','--');
            fux('sl_z','--');
        }
    } else {
        if (!Sunrise) {
            fux('sl_w','--');
        } else if (!Sunset) {
            fux('sl_z','--');
        }
    }
}

function sun( jd, ct )
{
    var g, lo, s, u, v, w;    
    lo = 0.779072 + 0.00273790931*jd;
    lo = lo - Math.floor(lo);
    lo = lo*2*PI;
    g = 0.993126 + 0.0027377785*jd;
    g = g - Math.floor(g);
    g = g*2*PI;
    v = 0.39785*Math.sin(lo);
    v = v - 0.01*Math.sin(lo - g);
    v = v + 0.00333*Math.sin(lo + g);
    v = v - 0.00021*ct * Math.sin(lo);    
    u = 1 - 0.03349*Math.cos(g);
    u = u - 0.00014*Math.cos(2*lo);
    u = u + 0.00008*Math.cos(lo);    
    w = -0.0001 - 0.04129*Math.sin(2*lo);
    w = w + 0.03211*Math.sin(g );
    w = w + 0.00104*Math.sin(2*lo - g);
    w = w - 0.00035*Math.sin(2*lo + g);
    w = w - 0.00008*ct*Math.sin(g);    
    s = w/Math.sqrt(u - v*v);
    Sun_Sky[0] = lo + Math.atan(s/Math.sqrt(1 - s*s));
    s = v/Math.sqrt(u);
    Sun_Sky[1] = Math.atan(s/Math.sqrt(1 - s*s));
}
