var SA = {};



SA.cr = 350; // Chart radius
SA.cx = 370; // Chart center, x-coord
SA.cy = 370; // Chart center, y-coord

//For star chart rotation
SA.rotation = 0; /* Rotation of star chart */
SA.startPos = null;
SA.currPos = null;
SA.mousedown = false;

SA.ecl = null;
SA.d = null;

SA.sun_ra = null;
SA.sun_dec = null;
SA.sun_r = null;
SA.mer_ra = null;
SA.mer_dec = null;
SA.mer_r = null;
SA.mer_rg = null;
SA.ven_ra = null;
SA.ven_dec = null;
SA.ven_r = null;
SA.ven_rg = null;
SA.moon_ra = null;
SA.moon_dec = null;
SA.moon_r = null;
SA.mars_ra = null;
SA.mars_dec = null;
SA.mars_r = null;
SA.mars_rg = null;
SA.jup_ra = null;
SA.jup_dec = null;
SA.jup_r = null;
SA.jup_rg = null;
SA.sat_ra = null;
SA.sat_dec = null;
SA.sat_r = null;
SA.sat_rg = null;

SA.font = "Trebuchet MS, Verdana, Arial, sans-serif";



//Julian days
SA.julianDate = function(unix_time) {
	return (unix_time/86400000 + 2440587.5);
}

SA.normalize = function(value) {
	if (value < 0) return (Math.PI*2 + value%(Math.PI*2));
	else return value%(Math.PI*2);
}
	



//Degrees to radians
SA.deg2rad = function(degrees) {
	return ((degrees * Math.PI)/180);
}

//Radians to degrees
SA.rad2deg = function(rads) {
	return ((rads * 180)/Math.PI);
}

SA.polar2xy = function(alt, az) {
	// Add rotation of star chart (if any)
	az +=  SA.rotation;
	
	var z = (.5*Math.PI - alt)/2;
	z = Math.tan(z);
	

	

	var y = Math.cos(az) * z;
	var x = Math.sin(az) * z;

	// 

	// Transform x, y 
	x = SA.cx - x * SA.cr;		
	y = SA.cy - y * SA.cr;
	

	
	return [x, y];
}

SA.radec2altaz = function(ra, dec) {

	var ha = SA.normalize(SA.lmst - ra); //Hour angle
	var alt; //Altitude
	var az; //Azimuth
	
	var lat = SA.latitude;
	


	alt = Math.asin(Math.sin(dec)*Math.sin(lat) 
		+ Math.cos(dec)*Math.cos(lat)*Math.cos(ha));

	az = Math.acos((Math.sin(dec)-Math.sin(alt)*Math.sin(lat)) / (Math.cos(alt)*Math.cos(lat))); // Long equation
			

	if ((Math.sin(ha))>0) {
		az= 2*Math.PI - az;
	}

	return [alt, az];
}

SA.getMousePosition = function (evt) {
	var x;
    var y;
	x = evt.pageX - (canvas.offsetLeft + SA.cx);
	y = -(evt.pageY - canvas.offsetTop) + SA.cy

	console.log("x=", x);
	console.log("y=", y);


    return [x, y];
}

SA.rotate = function () {
	SA.rotation += Math.PI / 4;
}

//setcookie adapted from web.blazonry examples
SA.setcookie = function (name, value) {
	var exp = new Date();	    //set new date object	
	exp.setTime(exp.getTime() + (1000 * 60 * 60 * 24 * 30));     //set it 30 days ahead 
	document.cookie = name + "=" + escape(value) + "; path=/" + ((exp == null) ? "" : "; expires=" + exp.toGMTString()); 
}

//getcookie adapted from elated.com tutorial
SA.getcookie = function (name) {
	var results = document.cookie.match ( '(^|;) ?' + name + '=([^;]*)(;|$)' );

  	if ( results )
    	return ( unescape ( results[2] ) );
  	else
    	return null;
}

SA.deletecookie = function (name) {
  var date = new Date ( );  // current date & time
  date.setTime ( date.getTime() - 1 );
  document.cookie = name += "=; expires=" + date.toGMTString();
}

SA.plotchartcircle = function() {

			chart.beginPath();
			chart.fillStyle = "black";
			
			chart.arc(SA.cx,SA.cy,SA.cr,0,2*Math.PI,false);

			chart.fill();


}


SA.plotcompasspoints = function() {

		var north = SA.polar2xy(.05, 0);
		var east = SA.polar2xy(.05, Math.PI/2);
		var south = SA.polar2xy(.05, Math.PI);
		var west = SA.polar2xy(.05, Math.PI*1.5);
		
		var ex = SA
		chart.fillStyle = "#f7941d";
		chart.font = "12pt " + SA.font;
		chart.fillText("n", north[0], north[1]);
		chart.fillText("e", east[0], east[1]);
		chart.fillText("w", west[0], west[1]);
		chart.fillText("s", south[0], south[1]);
}

SA.locationPrompt = function () {
	var lat;
	var lng;
	geocoder = new GClientGeocoder();
	
	var addr = prompt("Enter a zip code or 'city, state' or 'city, country'.", "Huber Heights, OH");

	if ((addr) && (geocoder)) {
		geocoder.getLatLng(addr,
			function(point) {
				if (!point) {
					alert(addr + " not located.");
				} else {
					//Stop current animation
					clearInterval(SA.interval);

					lat = point.lat();
					lng = point.lng();
					
					//Set cookies for addr, lat and lng
					SA.setcookie("address", addr );
					SA.setcookie("lat",lat);
					SA.setcookie("lng",lng);
					
					SA.printlocationmap(lat, lng);
					
					SA.generateChart(lat, lng, SA.date);
					SA.interval = setInterval(function () {SA.animate(lat,lng);}, 1000);
				}
			}
		);
	}
}


SA.printlocation = function(lat, lng) {
		var text= "lat=" + lat.toFixed(3) + ", lng=" + lng.toFixed(3) + "  <br/>";
		document.getElementById("longlat").innerHTML = text;

}

SA.printlocationmap = function(lat, lng) {
	var text =  '<img border="0" src="http://maps.google.com/maps/api/staticmap?style=feature:all|element:all|invert_lightness:false&style=feature:administrative|element:labels|visibility:off&style=feature:landscape|element:all|visibility:off&style=feature:poi|element:all|visibility:off&style=feature:road|element:all|visibility:off&center=' + lat.toFixed(3) +',' + lng.toFixed(3) + '&zoom=4&size=250x170&markers=color:orange|size:tiny|' + lat.toFixed(3) + ',' + lng.toFixed(3) + '&sensor=false&alt="World Map" />'
	document.getElementById("locationmap").innerHTML = text;
}

SA.reset = function() {
	SA.deletecookie("lat");
	SA.deletecookie("lng");
	window.location.reload();
}

SA.printtime = function(date) {
		var hrs = date.getHours();
		var ampm;
		if (hrs < 12) {
			ampm = " am local";
		} else {
			ampm = " pm local";
			hrs = hrs - 12;
		}
		if (hrs == 0) { 
			hrs = 12;
		}
		var mins = date.getMinutes();
		if (mins < 10) { 
			mins = "0" + mins;
		};
		text = hrs +":" + mins + ampm + "<br/>" + date.toGMTString().toLowerCase();
		//var text=date.toGMTString().toLowerCase();
		document.getElementById("time").innerHTML = text;		
}
SA.plotstar = function(x, y, mag) {
	//Set size based on magnitude
	var r = null;
	if (mag < 0) { r = 4;}
	else { 
		r = (6 - mag)/2;
	}
	r = r*.75;
	if (r <= 0.5) { r = 0.5; }	

	chart.beginPath();
	chart.fillStyle = "white";
			
	chart.arc(x,y,r,0,2*Math.PI,false);

	chart.fill();
		
}

SA.plotstars = function() {
	//Plot all visible stars
	var a;
	var xy;
	for (var i = 0; i < stars.length; i++) {

		a = SA.radec2altaz(stars[i][0],stars[i][1]);

		if (a[0] > 0.01) {  //Above horizon?
			xy=SA.polar2xy(a[0],a[1]);
			SA.plotstar(xy[0], xy[1], stars[i][2]);

		}
	}
}

SA.plotline = function(x1,y1,x2,y2) {
	chart.strokeStyle="rgba(255,255,255,0.10)";
	chart.lineWidth=0.5;
	chart.beginPath();
	chart.moveTo(x1,y1);
	chart.lineTo(x2,y2);
	chart.closePath();
	chart.stroke();
}

SA.plotconstellations = function() {
	//Plot constellation lines
	var a;
	var b;

	var xy1;
	var xy2;
	for (var i = 0; i < constellations.length; i++) {
		a = SA.radec2altaz(constellations[i][0], constellations[i][1]);
		b = SA.radec2altaz(constellations[i][2], constellations[i][3]);
		
		if ((a[0] > 0.01) && (b[0] > 0)) {
			xy1 = SA.polar2xy(a[0], a[1]);
			xy2 = SA.polar2xy(b[0], b[1]);
			
			SA.plotline(xy1[0], xy1[1], xy2[0], xy2[1]);
		}

	}
}

SA.plotconstnames = function() {
	var a;
	var xy;
	
	chart.fillStyle = "rgb(51,51,51)";
	chart.font = "8pt " + SA.font;

	
	for (var i = 0; i < constnames.length; i++) {
		a = SA.radec2altaz(constnames[i][0], constnames[i][1]);
		
		if (a[0] > (.0555*Math.PI)) {  //Name is 10 degrees above horizon
			xy = SA.polar2xy(a[0], a[1]);
			chart.fillText(constnames[i][2],xy[0],xy[1]);
		
		}
	}
}

SA.xgygzg2radec = function(xg,yg,zg) {

	var xe = xg;
	var ye = yg * Math.cos(SA.ecl) - zg * Math.sin(SA.ecl);
	var ze = yg * Math.sin(SA.ecl) + zg * Math.cos(SA.ecl);
	var rg = Math.sqrt(xe*xe + ye*ye + ze*ze);
	var ra = Math.atan2(ye, xe);
	var dec = Math.atan2(ze, Math.sqrt(xe*xe + ye * ye));
	return [ra, dec, rg];
}


SA.hlonlat2hxyz = function (plon, plat, pr) {
	var xh = pr * Math.cos(plon) * Math.cos(plat);
	var yh = pr * Math.sin(plon) * Math.cos(plat);
	var zh = pr * Math.sin(plat);
	return [xh, yh, zh];
}

SA.plotbody = function (ra, dec, r, color, name) {
	var a = SA.radec2altaz(ra, dec);
	var alt = a[0];
	var az = a[1];
	
	var element = document.getElementById(name);
	element.style.visibility = "hidden";
	
	if (alt > 0) {
		var xy = SA.polar2xy(alt, az);
		var x = xy[0];
		var y = xy[1];
		
		chart.beginPath();
	  chart.fillStyle = color;
	  r = r * .75;
			
	  chart.arc( x, y, r, 0, 2.0 * Math.PI, false);

	  chart.fill();
	  
	  element.style.visibility = "visible";
	  
	  element.style.left = x + 5 + "px";
	  element.style.top = y + "px";

	
	}
		
	
}

SA.planetpos3d = function (r,N,v,w,i) {
	var xh = r * (Math.cos(N) * Math.cos(v + w) - (Math.sin(N) * Math.sin(v + w) * Math.cos(i)));
	var yh = r * (Math.sin(N) * Math.cos(v + w) + Math.cos(N) * Math.sin(v + w) * Math.cos(i));
	var zh = r * (Math.sin(v + w) * Math.sin(i));
	
	var lonecl = Math.atan2(yh, xh); //Ecliptic longitude
	var latecl = Math.atan2(zh, Math.sqrt(xh*xh + yh*yh)); //Ecliptic latitude
	return [ lonecl, latecl ];
}

SA.initplanets = function () {
  var sun_N = 0.0; //ascending node longitude
	var sun_i = 0.0; //inclination to the ecliptic
	var sun_w = 4.938241566909764 + (8.21936631e-9 * SA.d); //argument of perihelion
	var sun_a = 1.0; //semi-major axis
	var sun_e = 0.016709 - (1.151e-9 * SA.d); //eccentricity
	var sun_M = SA.normalize(6.214192441848251 + (1.720197e-2 * SA.d)); //mean anomaly
	var sun_E = SA.normalize(sun_M + sun_e * Math.sin(sun_M) * (1 + sun_e * Math.cos(sun_M))); //eccentric anomaly

	var sun_xv = Math.cos(sun_E) - sun_e;
	var sun_yv = Math.sqrt(1.0 - sun_e * sun_e) * Math.sin(sun_E);
	SA.sun_r = Math.sqrt((sun_xv * sun_xv) + (sun_yv * sun_yv));
	var sun_v = Math.atan2(sun_yv, sun_xv);
	var sun_truelong = sun_v + sun_w;

	//Find ecliptic rectangular geocentric coordinates
	var xs = SA.sun_r * Math.cos(sun_truelong);
	var ys = SA.sun_r * Math.sin(sun_truelong);
	
	//Find equatorial rectangular geocentric coordinates
	var xe = xs;
	var ye = ys * Math.cos(SA.ecl);
	var ze = ys * Math.sin(SA.ecl);
	
	SA.sun_ra = SA.normalize(Math.atan2(ye, xe));
	SA.sun_dec = SA.normalize(Math.atan2(ze, Math.sqrt(xe*xe + ye*ye)));
	var sun_L = sun_M + sun_w;
	
	var lon_corr = 6.674034339871e-7 * (-SA.d); //correct for precession, Epoch 2000.0
	
	//Find moon's position, ignoring geocentric to topocentric corrections
	var moon_N = SA.normalize(2.183804829314361 - 9.242183063049e-4 * SA.d);
	var moon_i = 8.980417133211623e-2;
	var moon_w = SA.normalize(5.551253560087732 + 2.868576423896499e-3 * SA.d);
	var moon_a = 60.2666;
	var moon_e = 0.054900;
	var moon_M = SA.normalize(2.013506072880266 + 0.228027143743055 * SA.d);

	var moon_E = SA.normalize(moon_M + moon_e * Math.sin(moon_M)*(1.0 + moon_e * Math.cos(moon_M)));
	var moon_xv = moon_a * (Math.cos(moon_E) - moon_e);
	var moon_yv = moon_a * (Math.sqrt(1.0 - moon_e*moon_e) * Math.sin(moon_E));
	SA.moon_r = Math.sqrt((moon_xv * moon_xv) + (moon_yv * moon_yv));
	var moon_v = Math.atan2(moon_yv, moon_xv);
	
	var moon_data = SA.planetpos3d(SA.moon_r,moon_N,moon_v,moon_w,moon_i);

	var moon_lon = moon_data[0];
	var moon_lat = moon_data[1];
	var moon_L = SA.normalize(moon_M + moon_w + moon_N);
	var moon_D = SA.normalize(moon_L - sun_L);
	var moon_F = SA.normalize(moon_L - moon_N);
	
	//Lunar perturbations, just the basics
	moon_lon += (-2.223549467e-2) * Math.sin(moon_M - 2*moon_D); //Evection
	moon_lon += 1.14843e-2 * Math.sin(2 * moon_D); //Variation
	moon_lon += (-3.246e-3) * Math.sin(sun_M); // Yearly Equation
	moon_lat += (-3.019e-3) * Math.sin(moon_F - 2*moon_D);
	
	var mb = SA.hlonlat2hxyz(moon_lon, moon_lat, SA.moon_r);
	
	var mc = SA.xgygzg2radec(mb[0], mb[1], mb[2]);
	SA.moon_ra = mc[0];
	SA.moon_dec = mc[1];
	
	//Correct for parallax
	var moon_ha = SA.normalize(SA.lmst - SA.moon_ra); //Hour angle
	var mpar = Math.asin(1.0 / SA.moon_r);
	var moon_g = Math.atan(Math.tan(moon_lat) / Math.cos(moon_ha));
	SA.moon_ra = SA.moon_ra - mpar * Math.cos(moon_lat) * Math.sin(moon_ha) / Math.cos(SA.moon_dec);
	SA.moon_dec = SA.moon_dec - mpar * Math.sin(moon_lat) * Math.sin(moon_g - SA.moon_dec) / Math.sin(moon_g);
	
	
	//Orbital elements for Mercury
	var mer_N = SA.normalize(0.843540316769135 + 5.665111859171e-7 * SA.d);
	var mer_i = SA.normalize(0.122255078114447  + 8.726646259972e-10 * SA.d);
	var mer_w = SA.normalize(0.508311436680081 + 1.770531806393e-7 * SA.d);
	var mer_a = 0.387098;
	var mer_e = 0.205635 + 5.59e-10 * SA.d;
	var mer_M = SA.normalize(2.94360599390206 + 7.142471001491e-2 * SA.d);
	var mer_E = SA.normalize(mer_M + mer_e * Math.sin(mer_M)*(1.0 + mer_e * Math.cos(mer_M)));
	var mer_xv = mer_a * (Math.cos(mer_E) - mer_e);
	var mer_yv = mer_a * (Math.sqrt(1.0 - mer_e * mer_e) * Math.sin(mer_E));
	SA.mer_r = Math.sqrt((mer_xv * mer_xv) + (mer_yv * mer_yv));
	var mer_v = Math.atan2(mer_yv, mer_xv);
	var mer_data = SA.planetpos3d(SA.mer_r, mer_N,mer_v, mer_w, mer_i);
	var mer_lon = mer_data[0] + lon_corr;
	var mer_lat = mer_data[1];
	var merb = SA.hlonlat2hxyz(mer_lon, mer_lat, SA.mer_r);
	var merc = SA.xgygzg2radec(merb[0] + xs, merb[1] + ys, merb[2]);
	SA.mer_ra = merc[0];
	SA.mer_dec = merc[1];
	SA.mer_rg = merc[2];
	
	//Orbital elements for Venus
	var ven_N = SA.normalize(1.3383167251 + 4.303807402493e-7 * SA.d);
	var ven_i = 5.924694678820e-2 + 4.799655442984e-10 * SA.d;
	var ven_w = SA.normalize(0.958028679712207 + 2.415081899155e-7 * SA.d);
	var ven_a = 0.723330;
	var ven_e = 0.006773 - 1.302e-9 * SA.d;
	var ven_M = SA.normalize(0.837848798078382 + 2.796244746150e-2 * SA.d);
	var ven_E = SA.normalize(ven_M + ven_e * Math.sin(ven_M)*(1.0 + ven_e * Math.cos(ven_M)));
	
	var ven_xv = ven_a * (Math.cos(ven_E) - ven_e);
	var ven_yv = ven_a * (Math.sqrt(1.0 - ven_e * ven_e) * Math.sin(ven_E));
	SA.ven_r = Math.sqrt((ven_xv * ven_xv) + (ven_yv * ven_yv));
	var ven_v = Math.atan2(ven_yv, ven_xv);
	var ven_data = SA.planetpos3d(SA.ven_r, ven_N,ven_v, ven_w, ven_i);
	var ven_lon = ven_data[0] + lon_corr;
	var ven_lat = ven_data[1];
	var vb = SA.hlonlat2hxyz(ven_lon, ven_lat, SA.ven_r);
	var vc = SA.xgygzg2radec(vb[0] + xs, vb[1] + ys, vb[2]);
	SA.ven_ra = vc[0];
	SA.ven_dec = vc[1];
	SA.ven_rg = vc[2];

    var mars_N = SA.normalize(0.864939798727838 + 3.684058438402e-7 * SA.d);
	var mars_i = SA.normalize(3.228335517414e-2 + 3.106686068550e-10 * SA.d);
	var mars_w = SA.normalize(5.000396232231786 + 5.113134029935e-7 * SA.d);
	var mars_a = 1.523688;
	var mars_e = 0.093405 + 2.516e-9 * SA.d;
	var mars_M = SA.normalize(0.324667892785237 + 9.145887900528e-3 * SA.d);
	var mars_E = SA.normalize(mars_M + mars_e * Math.sin(mars_M)*(1.0 + mars_e * Math.cos(mars_M)));
	
	var mars_xv = mars_a * (Math.cos(mars_E) - mars_e);
	var mars_yv = mars_a * (Math.sqrt(1.0 - mars_e * mars_e) * Math.sin(mars_E));
	SA.mars_r = Math.sqrt((mars_xv * mars_xv) + (mars_yv * mars_yv));
	var mars_v = Math.atan2(mars_yv, mars_xv);
	var mars_data = SA.planetpos3d(SA.mars_r, mars_N,mars_v, mars_w, mars_i);
	var mars_lon = mars_data[0] + lon_corr;
	var mars_lat = mars_data[1];
	var marsb = SA.hlonlat2hxyz(mars_lon, mars_lat, SA.mars_r);
	var marsc = SA.xgygzg2radec(marsb[0] + xs, marsb[1] + ys, marsb[2]);
	SA.mars_ra = marsc[0];
	SA.mars_dec = marsc[1];
	SA.mars_rg = marsc[2];
	
        //Jupiter's orbital elements
	var jup_N = 1.7532565 + 4.832014e-7 * SA.d;
	var jup_i = 2.274164e-2 - 2.7174777e-9 * SA.d;
	var jup_w =  SA.normalize(4.78006761 + 2.871153886e-7 * SA.d);
	var jup_a = 5.20256;
	var jup_e = 0.048498 + 4.469e-9 * SA.d;
	var jup_M = SA.normalize(0.34723325 + 1.45011205e-3 * SA.d);
	var jup_E = SA.normalize(jup_M + jup_e * Math.sin(jup_M)*(1.0 + jup_e * Math.cos(jup_M)));
	
	var jup_xv = jup_a * (Math.cos(jup_E) - jup_e);
	var jup_yv = jup_a * (Math.sqrt(1.0 - jup_e * jup_e) * Math.sin(jup_E));
	SA.jup_r = Math.sqrt((jup_xv * jup_xv) + (jup_yv * jup_yv));
	var jup_v = Math.atan2(jup_yv, jup_xv);
	var jup_data = SA.planetpos3d(SA.jup_r, jup_N,jup_v,jup_w,jup_i);
	var jup_lon = jup_data[0] + lon_corr;
	var jup_lat = jup_data[1];
	//Skipping jupiter perturbations as I don't need high precision here
	var jb = SA.hlonlat2hxyz(jup_lon, jup_lat, SA.jup_r);
	var jc = SA.xgygzg2radec(jb[0] + xs, jb[1] + ys, jb[2]);
	SA.jup_ra = jc[0];
	SA.jup_dec = jc[1];
	SA.jup_rg = jc[2];
	
        //Orbital elements for saturn
	var sat_N = SA.normalize(1.983800569011323 + 4.170987846416e-7 * SA.d);
	var sat_i = 4.343426376513e-2 - 1.886700921406e-9 * SA.d;
	var sat_w = SA.normalize(5.923525308221115 + 5.195164504779e-9 * SA.d);
	var sat_a = 9.55475;
	var sat_e = 0.055546 - 9.499e-9 * SA.d;
	var sat_M = SA.normalize(5.532117770168867 + 5.837118978783e-4 * SA.d);
	var sat_E = SA.normalize(sat_M + sat_e * Math.sin(sat_M)*(1.0 + sat_e * Math.cos(sat_M)));
	var sat_xv = sat_a * (Math.cos(sat_E) - sat_e);
	var sat_yv = sat_a * (Math.sqrt(1.0 - sat_e * sat_e) * Math.sin(sat_E));
	SA.sat_r = Math.sqrt((sat_xv * sat_xv) + (sat_yv * sat_yv));
	var sat_v = Math.atan2(sat_yv, sat_xv);
	var sat_data = SA.planetpos3d(SA.sat_r, sat_N,sat_v,sat_w,sat_i);
	var sat_lon = sat_data[0] + lon_corr;
	var sat_lat = sat_data[1];
	var sb = SA.hlonlat2hxyz(sat_lon, sat_lat, SA.sat_r);
	var sc = SA.xgygzg2radec(sb[0] + xs, sb[1] + ys, sb[2]);
	SA.sat_ra = sc[0];
	SA.sat_dec = sc[1];
	SA.sat_rg = sc[2];
}

SA.printdist = function () {
	var suntext = (SA.sun_r).toFixed(4) + " AU";
	document.getElementById("sundist").innerHTML = suntext;
	
	var moontext = (SA.moon_r*6378.1370).toFixed(4) + " km, (" + (SA.moon_r*3963.191).toFixed(4) + " miles)";
	document.getElementById("moondist").innerHTML = moontext;	
	
	var mertext = (SA.mer_rg).toFixed(4) + " AU";
	document.getElementById("merdist").innerHTML = mertext;
	
	var ventext = (SA.ven_rg).toFixed(4) + " AU";
	document.getElementById("vendist").innerHTML = ventext;
	
	var marstext = (SA.mars_rg).toFixed(4) + " AU";
	document.getElementById("marsdist").innerHTML = marstext;	
	
	var juptext = (SA.jup_rg).toFixed(4) + " AU";
	document.getElementById("jupdist").innerHTML = juptext;
	
	var sattext = (SA.sat_rg).toFixed(4) + " AU";
	document.getElementById("satdist").innerHTML = sattext;
}

SA.generateChart = function (lat, lng, date) {

	SA.longitude = SA.deg2rad(lng);
	SA.latitude = SA.deg2rad(lat);

	//Greenwich Mean Sidereal Time, low-precision formula
	SA.gmst = SA.normalize(SA.deg2rad(280.46061837 + 360.98564736629 * (SA.julianDate(date) - 2451545.0)));
	//Local Mean Sidereal Time
	SA.lmst = SA.normalize(SA.gmst + SA.longitude);
	SA.d = SA.julianDate(date) - 2451543.5;

	SA.ecl = 0.40909295936 - (6.21860812e-9)*SA.d
	
	chart.clearRect(0,0, 820, 820);
	
	
	SA.plotchartcircle();
	SA.plotcompasspoints();
	
	SA.printlocation(lat, lng);
	SA.printtime(date);
	SA.initplanets();
	SA.printdist();
	
	SA.plotbody(SA.sun_ra, SA.sun_dec, 7, 'lightsteelblue', "Sun");
	SA.plotbody(SA.moon_ra, SA.moon_dec, 7, 'lightsteelblue', "Moon");
	SA.plotbody(SA.jup_ra, SA.jup_dec, 5, 'lightsteelblue', "Jupiter");
	SA.plotbody(SA.ven_ra, SA.ven_dec, 5, 'lightsteelblue', "Venus");
	SA.plotbody(SA.sat_ra, SA.sat_dec, 4, 'lightsteelblue', "Saturn");
	SA.plotbody(SA.mer_ra, SA.mer_dec, 3, 'lightsteelblue', "Mercury");
	SA.plotbody(SA.mars_ra, SA.mars_dec, 4, 'lightsteelblue', "Mars");
	
	SA.plotstars();
	SA.plotconstellations();
	SA.plotconstnames();
				
}

SA.animate = function(lat,lng) {
	SA.date = new Date();
	SA.generateChart(lat,lng,SA.date);
}

