var aDays = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var aPlanets = new Array('Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn');
//			     0      1       2       3          4          5        6
var aEnergyType = new Array('Male', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female');
var aPurpose = new Array('Health; Prosperity; Leadership; Joy, Male Fertility; Protection - Do spellcrafting that involves Fathers & Husbands, Peace, Harmony, Influence people in High Places - Court Work.',  'Emotions; Women\'s Mysteries; Dreams; Reconciliation; Receptivity; Voyages; Female Fertility - Do spells involving the subconscious, healing emotional wounds, children, small animals, mothers, sisters, female partners, wives, instincts', 'Conquest; Commanding: Controlling; Power over Enemies - Craft spells that involve Courage, Immediate Action, Victory or Break Negative Spells', 'Aid Spiritual and Psychic Awareness; Divination; Communication - Do spells for Mental Issues, Learning, Addictions, Perception, Artistry, Creativity.', 'Growth; Expansion; Generosity - Do spells for Prosperity, Money, Business, Ambition, Male Fertility', 'Love; Pleasure; Friendship; Beauty - Do spells for attracting sex, increasing romance.', 'Rid Obstacles; Overcomes Blockages; Clear One\'s Path - Do spells to remove bindings, Purification');
var aPlanetSundayRise    = new Array(0,5,3,1,6,4,2,0,5,3,1,6);
var aPlanetMondayRise    = new Array(1,6,4,2,0,5,3,1,6,4,2,0);
var aPlanetTuesdayRise   = new Array(2,0,5,3,1,6,4,2,0,5,3,1);
var aPlanetWednesdayRise = new Array(3,1,6,4,2,0,5,3,1,6,4,2);
var aPlanetThursdayRise  = new Array(4,2,0,5,3,1,6,4,2,0,5,3);
var aPlanetFridayRise    = new Array(5,3,1,6,4,2,0,5,3,1,6,4);
var aPlanetSaturdayRise  = new Array(6,4,2,0,5,3,1,6,4,2,0,5); 

var aPlanetSundaySet     = new Array(4,2,0,5,3,1,6,4,2,0,5,3);
var aPlanetMondaySet     = new Array(5,3,1,6,4,2,0,5,3,1,6,4);
var aPlanetTuesdaySet    = new Array(6,4,2,0,5,3,1,6,4,2,0,5);
var aPlanetWednesdaySet  = new Array(0,5,3,1,6,4,2,0,5,3,1,6);
var aPlanetThursdaySet   = new Array(1,6,4,2,0,5,3,1,6,4,2,0);
var aPlanetFridaySet     = new Array(2,0,5,3,1,6,4,2,0,5,3,1);
var aPlanetSaturdaySet   = new Array(3,1,6,4,2,0,5,3,1,6,4,2);

var twoPI=Math.PI*2;
var toSolarConst=0.9972695667;
var toSidConst=1.002737908;
var ambiguousSidreal=24/365.2422;
var ambiguousUTC=24/366.2422;
var timeUTC=12;
var JD1900=2415020.0;
var modified=false;
var arry, date, input, sunRise, sunSet, civilRise, civilSet, nautRise, nautSet, astronRise, astronSet, initRiseSet, dayNumber, sunPosition, riseSetAngle, riseSexa, setSexa, lengthSexa, sexa, civilAngle, nautAngle, astroAngle;
var paramSeps=new String("?&=,");

// Hide debug code
function trace_msg(msg)
{
	if (window.debugWindow==null)
		debugWindow=window.open("","JSPropBrowParent");
	if (window.debugWindow!=null) window.debugWindow.trace_msg(msg);
}
//
function parseURL(rawURL)
{
	var url=unescape(rawURL);
	var paramBegin=paramSeps.charAt(0);
	var index=url.indexOf(paramSeps.charAt(0));
	if (index < 0 || (index==url.length-1))
		return new Array(0);
	var data=url.substring(index+1, url.length);
	var params=data.split(paramSeps.charAt(1));
	var result=new Array(params.length);
	for (var index=0; index<params.length; index++)
		result[index]=parseParams(params[index]);
	return result;
}
function parseParams(param)
{
	var elems=param.split(paramSeps.charAt(2));
	var result=new Object();
	result.name=elems[0];
	result.values=elems[1].split(paramSeps.charAt(3));
	return result;
}
function getFullYear()
{
	var year=this.getYear();
	return (year < 100) ? year+1900 : year;
}
function toSexagesimal(hrs, mins, secs, result)
{
	mins /= 60;
	secs /= 3600;
	result.decimal=hrs+mins+secs;
}
function toDecimal(dec, result)
{
	with (Math)
	{
		var dec_pos=abs(dec);
		var hrs_int=floor(dec_pos);
		var minutes=(dec_pos-hrs_int)*60;
		var minutes_int=floor(minutes);
		var seconds=(minutes-minutes_int)*60;
		var seconds_int=floor(seconds);
		var remainder=(seconds-seconds_int);
		result.hours=((dec >= 0) ? 1 : -1) * hrs_int;
		result.minutes=minutes_int;
		result.seconds=seconds_int;
		result.remainder=remainder;
	}
}
function setDecimal(dec)
{
	this.toDecimal(dec, this);
}
function setSexagesimal( h, m, s)
{
	this.toSexagesimal(h,m,s, this);
}
function toTimeLength()
{
	var result="";
	var h="";
	var m="";
	var s="";
	var hrs=this.hours;
	if (hrs < 10)
		h="0"+hrs;
	else
		h=""+hrs;
	m=((this.minutes < 10) ? "0" : "")+this.minutes;
	var secs=this.seconds+((this.remainder >= .5) ? 1 : 0);
	s=((secs < 10) ? "0" : "")+secs;
	result=h+":"+m+"."+s;
	return result;
}
function toTimeString()
{
	var result="";
	var h="";
	var m="";
	var s="";
	var hrs=this.hours;
	var ampm="";
	if (hrs > 0)
		ampm = "";
	else
	{
		ampm="";
	}
	if (hrs < 10)
		h="0"+hrs;
	else
		h=""+hrs;
	m=((this.minutes < 10) ? "0" : "")+this.minutes;
	var secs=this.seconds+((this.remainder >= .5) ? 1 : 0);
	s=((secs < 10) ? "0" : "")+secs;
	result=h+":"+m+"."+s+" "+ampm;
	return result;
}
function sexagesimalNumber()
{
	var init=0;
	this.hours=init;
	this.minutes=init;
	this.seconds=init;
	this.remainder=init;
	this.decimal=init;
	this.setDecimal=setDecimal;
	this.setSexagesimal=setSexagesimal;
	this.toDecimal=toDecimal;
	this.toSexagesimal=toSexagesimal;
	this.toTimeString=toTimeString;
	this.toTimeLength=toTimeLength;
}
function scaleUp(val)
{
	var scale=360;
	if (arguments.length > 1) scale=arguments[1];
	return scale*(val-Math.floor(val));
}
function scale(val)
{
	max=(arguments.length>1)?arguments[1]:24;
	var div=val/max;
	var remainder=val/max-Math.floor(div);
	var result=remainder*max;
	return result;
}
function calcDayNumber(year, month, day)
{
	var result=0;
	with (Math)
	{
		if (month < 3)
		{
			year--;
			month += 12;
		}
		var cent=floor(year/100);
		var leap=2-cent+floor(cent/4);
		var ycorr=floor(365.25*year)-694025;
		var corr=floor(30.6001*(month+1));
		result=ycorr+leap+corr+day-0.5;
	}
	return result;
}
function toRadians ( deg )
{
	return deg * Math.PI / 180;
}
function toDegrees ( rad )
{
	return rad * 180 / Math.PI;
}
function setDegrees( deg )
{
	this.degrees=deg;
	this.radians=toRadians(deg);
}
function setRadians ( rad )
{
	this.radians = rad;
	this.degrees = toDegrees( rad );
}
function angle()
{
	var init=0;
	this.degrees=init;
	this.radians=init;
	this.setDegrees=setDegrees;
	this.setRadians=setRadians;
}
function riseSetData()
{
	var init=-1;
	this.rise=init;
	this.riseUTC=init;
	this.azimuthRise=new angle();
	this.set = init;
	this.setUTC=init;
	this.azimuthSet=new angle();
	this.noon = init;
	this.noonUTC=init;
	this.aboveAngleLength = init;
	this.aboveAngleHalfLength = init;
	this.error = 0;
}
function getRiseValue()
{
	return this.riseUTC;
}
function getSetValue()
{
return this.setUTC;
}
function addRiseData(obj)
{
	obj.getValue=getRiseValue;
}
function addSetData(obj)
{
	obj.getValue=getSetValue;
}
function isSidrealAmbiguous( sid )
{
	var diff=sid-this.time0h;
	diff=scale(diff, 24);
	return (diff <= ambiguousSidreal);
}
function gstToUTC( gst )
{
	gst -=this.time0h;
	return scale(gst)*toSolarConst;
}
function lstToUTC( lst )
{
	lst -= input.longitude.degrees/15;
	return this.gstToUTC(lst);
}
function gstToZone(gst)
{
	var utc=this.gstToUTC(gst);
	return this.utcToZone(gst);
}
function lstToZone(lst)
{
	var utc=this.lstToUTC(lst);
	return this.utcToZone(utc);
}
function zoneToUTC( time )
{
	var result=scale(time-input.zone);
	return result;
}
function utcToZone( time )
{
	var result=scale(time+input.zone);
	return result;
}
function setUsingDayNumber( num )
{
	this.number=num;
	this.setDefaultDayNumber();
	this.time0h=calcTime0h(this.number+JD1900);
}
function setUsingDate(year, month, day)
{
	this.number=calcDayNumber(year, month, day);
	this.setDefaultDayNumber();
	this.time0h=calcTime0h(this.number+JD1900);
}
function setDefaultDayNumber()
{
	var args=setDefaultDayNumber.arguments;
	if (args.length == 0)
		this.defaultNumber=this.number;
	else
	{
		var oldNumber=this.number;
		this.number = this.defaultNumber+args[0];
		if (oldNumber != this.number) this.time0h=calcTime0h(this.number+JD1900);
	}
}
function calcTime0h( jd )
{
	var s=jd-2451545.0;
	var t=s/36525.0
	var t0=6.697374558+(2400.051336*t)+(0.000025862*t*t);
	return scale(t0, 24);
}
function calcNumberWithUTC ( time )
{
	return this.number + time/24;
}
function dayNumberObject()
{
	var init=0;
	this.number=init;
	this.defaultNumber=init;
	this.time0h=init;
	this.setUsingDayNumber=setUsingDayNumber;
	this.setUsingDate=setUsingDate;
	this.isSidrealAmbiguous=isSidrealAmbiguous;
	this.calcNumberWithUTC=calcNumberWithUTC;
	this.gstToUTC=gstToUTC;
	this.lstToUTC=lstToUTC;
	this.gstToZone=gstToZone;
	this.lstToZone=lstToZone;
	this.setDefaultDayNumber=setDefaultDayNumber;
}
function inputData()
{
	var init=-1;
	this.latitude = new angle();
	this.longitude = new angle();
// amt to add to UTC to get local
// EDT = -4
	this.zone=init;
	this.year=init;
	this.month=init;
	this.day=init;
}
function toRaDecl(lat, lng)
{
	with (Math)
	{
		var ob_s=sin(this.obliquity.radians);
		var ob_c=cos(this.obliquity.radians);
		var lat_s=sin(lat.radians);
		var lat_c=cos(lat.radians);
		if (lat_c < 1e-20)
			lat_c=1e-20;
		var lat_t=lat_s / lat_c;
		var lng_s=sin(lng.radians);
		var lng_c=cos(lng.radians);
		var dec=asin(lat_s*ob_c+lat_c*ob_s*lng_s);
		this.declination.setRadians(dec);
		var ra=atan2(lng_s*ob_c-lat_t*ob_s, lng_c);
		this.ra.setRadians(ra);
	}
}
function toLatLong()
{
	with (Math)
	{
		var ob_s=sin(this.obliquity.radians);
		var ob_c=cos(this.obliquity.radians);
		var decl_s=sin(this.decl.radians);
		var decl_c=cos(this.decl.radians);
		var decl_t=decl_s / decl_c;
		var ra_s=sin(this.ra.radians);
		var ra_c=cos(this.ra.radians);
		var lat=asin(decl_s*ob_c+decl_c*ob_s*ra_s);
		this.latitude.setRadians=asin(dec);
		var lng=atan2(ra_s*ob_c+decl_t*ob_s, lng_c);
		this.longitude.setRadians(lng);
	}
}
function calcAnomaly()
{
	var meanAnom=this.meanAnomaly.radians;
	var ecc=this.eccentricity;
	
	with (Math)
	{
		var m=meanAnom-twoPI*floor(meanAnom / twoPI);
		var err;
		var eccAnom=m;
		while (true)
		{
			err=eccAnom-(ecc*sin(eccAnom))-m;
			if (abs(err)<1E-6)
				break;
			err /= 1.0-(ecc*cos(eccAnom));
			eccAnom -= err;
		}
		var ecc2=eccAnom/2;
		var ecc2_c=cos(ecc2);
		var ecc2_s=sin(ecc2);
		var ecc2_t=ecc2_s/ecc2_c;
		var anom=sqrt((1.0+ecc)/(1.0-ecc))*ecc2_t;
		this.anomaly.setRadians(2.0*atan(anom));
		this.eccAnomaly.setRadians(eccAnom);
	}
}
function calcObliquity()
{
	var cent=(dayNumber.number/36525.0)-1.0;
	var result=(46.815+(0.0006-0.00181*cent)*cent)*cent;
	result /= 3600.0;
	result=23.43929167-result+this.nutationObl.degrees;
	this.obliquity.setDegrees(result);
}
function calcNutation()
{
	var t=this.dayNumber.number/36525.0;
	var t2=t*t;
	with (Math)
	{
		var a=(1.000021358e2)*t;
		var b=scaleUp(a, 360);
		var l1=2.796967e2+(3.03e-4)*t2+b;
		var l2=2.0*toRadians(l1);
		a=(1.336855231e3)*t;
		b=scaleUp(a, 360);
		var d1=(2.704342e2)-(1.133e-3)*t2+b;
		var d2=2.0*toRadians(d1);
		var a=(9.999736056e1)*t;
		var b=scaleUp(a, 360);
		var m1=(3.584758e2)-(1.5e-4)*t2+b;
		m1=toRadians(m1);
		a=(1.325552359e3)*t;
		b=scaleUp(a, 360);
		var m2=(2.961046e2)+(9.192e-3)*t2+b;
		m2=toRadians(m2);
		a=(5.372616667)*t;
		b=scaleUp(a, 360);
		var n1=(2.591833e2)+(2.078e-3)*t2-b
		var n1=toRadians(n1);
		var n2=2*n1
		var lng=(-17.2327-(1.737e-2)*t)*sin(n1);
		lng += (-1.2729-(1.3e-4)*t)*sin(l2)+(2.088e-1)*sin(n2);
		lng += (-2.037e-1)*sin(d2)+((1.261e-1)-(3.1e-4)*t)*sin(m1);
		lng += (6.75e-2)*sin(m2)-((4.97e-2)-(1.2e-4)*t)*sin(l2+m1);
		lng += (-3.42e-2)*sin(d2-n1)-(2.61e-2)*sin(d2+m2);
		lng += (2.14e-2)*sin(l2-m1)-(1.49e-2)*sin(l2-d2+m2);
		lng += (1.24e-2)*sin(l2-n1)+(1.14e-2)*sin(d2-m2);
		var obl=(9.21+(9.1e-4)*t)*cos(n1);
		obl += ((5.522e-1)-(2.9e-4)*t)*cos(l2)-(9.04e-2)*cos(n2);
		obl +=(8.84e-2)*cos(d2)+(2.16e-2)*cos(l2+m1);
		obl +=(1.83e-2)*cos(d2-n1)+(1.13e-2)*cos(d2+m2);
		obl += (-9.3e-3)*cos(l2-m1)-(6.6e-3)*cos(l2-n1);
		lng /= 3600.0;
		obl /= 3600.0;
		this.nutationLong.setDegrees(lng);
		this.nutationObl.setDegrees(obl);
	}
}
function calcSunPosition()
{
	var t=(dayNumber.number/36525.0)+(timeUTC/8.766e5);
	var t2=t*t;
	var a=(1.000021359e2)*t;
	var b=scaleUp(a, 360);
	var l=(2.7969668e2)+(3.025e-4)*t2+b;
	this.meanLongitude.setDegrees(l);
	a=(9.999736042e1)*t;
	b=scaleUp(a, 360);
	var m1=(3.5847583e2)-((1.5e-4)+(3.3e-6)*t)*t2+b;
	this.meanAnomaly.setDegrees(m1);
	var ecc1=-0.0000418*t;
	var ecc2=-1.26e-7*t2
	var ecc=0.01675104-.0000418*t-1.26e-7*t2;
	this.eccentricity=ecc;
	this.calcAnomaly();
	var a=(6.255209472e1)*t;
	var b=scaleUp(a);
	var a1=toRadians(153.23+b);
	a=(1.251041894e2)*t;
	b=scaleUp(a);
	var b1=toRadians(216.57+b);
	a=(9.156766028e1)*t;
	b=scaleUp(a);
	var c1=toRadians(312.69+b);
	a=(1.236853095e3)*t;
	b=scaleUp(a);
	var d1=toRadians(350.74-(1.44e-3)*t2+b);
	var e1=toRadians(231.19+20.2*t);
	a=(1.831353208e2)*t;
	b=scaleUp(a);
	var h1=toRadians(353.4+b);
	var d2;
	var d3;
	with (Math)
	{
		d2=(1.34e-3)*cos(a1)+(1.54e-3)*cos(b1)+(2e-3)*cos(c1)+(1.79e-3)*sin(d1)+(1.78e-3)*sin(e1);
		d3=(5.43e-6)*sin(a1)+(1.575e-5)*sin(b1)+(1.627e-5)*sin(c1)+(3.076e-5)*cos(d1)+(9.27e-6)*sin(h1);
		gLong=this.anomaly.radians+toRadians(l-m1+d2);
		gLong=scale(gLong, twoPI);
		this.longitude.setRadians(gLong);
		var dist=1.0000002*(1.0-this.eccentricity*cos(this.eccAnomaly.radians))+d3;
		this.distance=dist;
	}
}
function calcSunCorrections()
{
	this.calcNutation();
	this.calcObliquity();
}

function calcRiseSet(result, ang)
{
	with (Math)
	{
		var pLat_c=cos(input.latitude.radians);
		var pLat_s=sin(input.latitude.radians);
		var ang_c=cos(ang.radians);
		var ang_s=sin(ang.radians);
		var oLat_c=cos(this.declination.radians);
		var oLat_s=sin(this.declination.radians);

		var ch=-(ang_s+(pLat_s*oLat_s))/(pLat_c*oLat_c);

		if (ch < -1.0)
		{
			result.error=-1.0;
			return;
		}

		if (ch > 1.0)
		{
			result.error=1.0;
			return;
		}

		var az_c=(oLat_s+(ang_s*pLat_s))/(ang_c*pLat_c);
		var h=acos(ch);
		var azup=acos(az_c);
		var b=toDegrees(h)/15.0;
		var a=this.ra.degrees / 15.0;

		var rawRise=24+a-b;
		var rawSet=a+b;
		result.rise=scale(rawRise,24);
		result.riseUTC=dayNumber.lstToUTC(result.rise);
		result.set=scale(rawSet, 24);
		result.setUTC=dayNumber.lstToUTC(result.set);
		result.noon=scale(12+a,24);
		result.noonUTC=dayNumber.lstToUTC(result.noon);

		var azdown=twoPI-azup;
		azup=scale(azup, twoPI);
		azdown=scale(azdown, twoPI);
		result.azimuthRise.setRadians(azup);
		result.azimuthSet.setRadians(azdown);
		result.error=0;
		result.aboveAngleHalfLength=b;
		result.aboveAngleLength=2*b;
	}
}

corrLong=new angle();
function setSunPosition()
{
	adjustDayNumber(timeUTC);
	this.calcSunCorrections();
	this.calcSunPosition();
	corrLong.setRadians(this.longitude.radians+this.nutationLong.radians-toRadians(5.69e-3));
	this.toRaDecl(this.latitude, corrLong);
}


function calcSunRiseSet(angle, rise, set)
{
	this.setSunPositionUTC(12-input.zone);
	this.calcRiseSet(initRiseSet, angle);

	timeUTC=initRiseSet.riseUTC;
	this.calcSunAtAngle(rise, angle);
	timeUTC=initRiseSet.setUTC;
	this.calcSunAtAngle(set, angle, false);
}

function setSunPositionUTC(utc)
{
	timeUTC=scale(utc);
	this.setSunPosition();
}

function calcSunAtAngle(result, angle)
{
	if (initRiseSet.error != 0)
	{
		this.setSunPositionUTC(zoneToUTC(0));
		this.calcRiseSet(result, angle);
		if (result.error != 0)
		{
			this.setSunPositionUTC(zoneToUTC(23+59/60));
			this.calcRiseSet(result, angle);
			if (result.error != 0)
				return;
		}
		timeUTC=result.getValue();

// Since here a small shift in time means a big set/rise shift, further refine estimate
		this.setSunPositionUTC(timeUTC);
		this.calcRiseSet(result, angle);
		timeUTC=result.getValue();
	}

	this.setSunPositionUTC(timeUTC);
	this.calcRiseSet(result, angle);
}

function sunPositionData()
{
	var init=-1;
	this.dayNumber=dayNumber;
	this.meanLongitude=new angle();
	this.longitude=new angle();
	this.latitude=new angle();
	this.nutationLong=new angle();
	this.nutationObl=new angle();
	this.meanAnomaly=new angle();
	this.anomaly=new angle();
	this.eccentricity=init;
	this.eccAnomaly=new angle();
	this.ra=new angle();
	this.declination=new angle();
	this.obliquity=new angle();
	this.distance=init;
	this.toRaDecl=toRaDecl;
	this.toLatLong=toLatLong;
	this.calcAnomaly=calcAnomaly;
	this.calcObliquity=calcObliquity;
	this.calcNutation=calcNutation;
	this.calcSunPosition=calcSunPosition;
	this.calcSunCorrections=calcSunCorrections;
	this.calcRiseSet=calcRiseSet;
	this.calcSunRiseSet=calcSunRiseSet;
	this.setSunPosition=setSunPosition;
	this.setSunPositionUTC=setSunPositionUTC;
	this.calcSunAtAngle=calcSunAtAngle;
}

function adjustDayNumber( utc )
{
	utc=scale(utc);

	var adj=utc+input.zone;

	if (adj < 0)
	{
		dayNumber.setDefaultDayNumber(1);
		return;
	}
	else	if (adj > 24)
		{
			dayNumber.setDefaultDayNumber(-1);
			return;
		}
		else
		{
			dayNumber.setDefaultDayNumber(0);
		}
}

function radioClick()
{
	return;
}

function parseIntValue( obj )
{
	var def=(arguments.length > 1) ? arguments[1] : 0;
	return (obj.length > 0) ? parseInt(obj) : def;
}

function parseFloatValue( obj )
{
	var def=(arguments.length > 1) ? arguments[1] : 0;
	return (obj.length > 0) ? parseFloat(obj) : def;
}

function resetToCurrentDate()
{
	var year=date.getYear();
	if (year < 100) year += 1900;
}

function displayRSTime(obj, elem)
{
// I know the Date object has a local time output function but it's not very usable, much like the Date object itself actually.
	if (obj.error==0)
	{
		sexa.setDecimal(scale(utcToZone(obj.getValue())));
		elem.value=sexa.toTimeString();
	}
	else
	{
		elem.value="";
	}
}

function displayRSLength(rise, set)
{
	if (rise.error==0 && set.error==0)
	{
		sexa.setDecimal(scale(set.setUTC-rise.riseUTC));
	}
	else
	{
		if (rise.error==-1)
			sexa.setDecimal(24);
		else if (set.error==1)
			sexa.setDecimal(0);
	}
//	elem.value=sexa.toTimeLength();
}

function validateYear(year, elem)
{
	if (year >= 1582)
		return true;

	alert("Jaar moet minstens 1582 zijn");
	elem.focus();
	return false;
}

function validateTimeZone(zone, elem)
{
	if (zone >= -12 && zone < 12)
		return true;

	alert("De tijdzone moet gelijk zijn aan of hoger zijn dan -12 of lager zijn dan 12");
	elem.focus();
	return false;
}

function clearResults()
{
	var n="";
	with (document.riseSetUI)
	{
		sunrise.value=n;
		sunset.value=n;
		sunlength.value=n;
		civilrise.value=n;
		civilset.value=n;
		civillength.value=n;
		nautrise.value=n;
		nautset.value=n;
		nautlength.value=n;
		astronrise.value=n;
		astronset.value=n;
		astronlength.value=n;
	}
}

function calculate()
{
	var d = new Date();
	var hrs=0;
	var mins=0;
	var secs=0;
	var deg=0;
	input.year = d.getFullYear();
	input.month = d.getMonth();
	input.day = d.getDate();
	input.zone =-(d.getTimezoneOffset()/60);
	
	// These values are to hardcode the latitude and longitude for Hamilton
	hrs=37;
	mins=47;
	secs=0;
	deg=hrs+mins/60+secs/3600;
	if (deg > 0) deg=-deg; // for south
	input.latitude.setDegrees(deg);
	hrs=175;
	mins=17;
	secs=0;
	deg=hrs+mins/60+secs/3600;
	
	input.longitude.setDegrees(deg);
	dayNumber.setUsingDate(input.year, input.month, input.day);
	sunPosition.calcSunRiseSet(riseSetAngle, sunRise, sunSet);
	var riseHours = Math.floor(sunRise.riseUTC);
	var riseMinutes = Math.floor((sunRise.riseUTC - riseHours) * 60);
	
	if ((d.getHours() < riseHours) || (d.getHours() == riseHours && d.getMinutes() < riseMinutes)) {

		input.day = d.getDate() - 1;
		if (input.day > d.getDate())
		{
			input.month = input.month - 1;
			if (input.month == 0) {
				input.month = 12;
				input.year = input.year - 1;
			}
		}
		dayNumber.setUsingDate(input.year, input.month, input.day);

		sunPosition.calcSunRiseSet(riseSetAngle, sunRise, sunSet);
		var riseHours = Math.floor(sunRise.riseUTC);
		var riseMinutes = Math.floor((sunRise.riseUTC - riseHours) * 60);
	}
	
	
	var setHours = Math.floor(sunSet.setUTC);
	var setMinutes = Math.floor((sunSet.setUTC - setHours) * 60);
	var doSunrise = false;
	if (d.getHours() > riseHours && d.getMinutes() > riseMinutes && d.getHours < (setHours+12) && d.getMinutes < setMinutes) {
		doSunrise = true;
	}
	var currentHour = d.getHours();
	var currentMinute = d.getMinutes();
	var currentT = (currentHour * 60) + currentMinute;

	if (riseHours > 12) riseHours -= 12;
	if (riseHours < 0) riseHours += 12;
	setHours += 12;
		
	var minutestotal = ( (setHours) * 60 + setMinutes) - (riseHours * 60 + riseMinutes);
	var numhoursday = minutestotal / 12;
	var daytimehours = minutestotal / 60;
	var dayhour = Math.floor(daytimehours);
	var dayminutes = Math.floor((daytimehours - dayhour) * 60);
	var numMinsCurrent = currentMinute + (currentHour * 60);
	var numNightMinutesTotal = (24 * 60) - (riseHours * 60 + riseMinutes);
	var numNightHours = numNightMinutesTotal / 12;
	var nightHour = Math.floor(numNightHours);
	var nightMinutes = Math.floor((numNightHours = nightHour) * 60);
	var setCurrentT = currentT;
	if (currentHour > 0 && currentHour < riseHours) {
		setCurrentT += 12;
	}
	var minutesSinceSunset = (currentT - setHours * 60) + setMinutes;
	var minutesPerNightHour = numNightMinutesTotal / 12;
	var nightArrayOffset = Math.floor(minutesSinceSunset / minutesPerNightHour);
	var numMinsSunset = setMinutes + (setHours * 60);
	var numMinsSunsetDifference = numMinsCurrent - numMinsSunset;
	var numMinsSunsetHour = numNightMinutesTotal / 12;
	var numHoursSunsetOffset = numMinsSunsetDifference / numMinsSunsetHour;

	var numNightArrayOffset = Math.floor(numHoursSunsetOffset) - 1;

	var minutesSinceSunrise = (currentT-riseHours*60)+riseMinutes;
	var minutesPerDaytimeHour = minutestotal/12;
	var arrayOffset = Math.floor(minutesSinceSunrise / minutesPerDaytimeHour);
	var numMinsSunrise = riseMinutes + (riseHours * 60);
	var numMinsDifference = numMinsCurrent - numMinsSunrise;
	var numMinsDaytimeHour = minutestotal / 12;
	var numHoursOffset = numMinsDifference / numMinsDaytimeHour;
	var numArrayOffset = Math.floor(numHoursOffset) - 1;
	var PlanetaryOffset;

	var theCurrentDay = d.getDay();
	if (currentHour < riseHours && currentMinute < riseMinutes) {
		theCurrentDay -= 1;
		if (theCurrentDay < 0) theCurrentDay += 7;
	}

var isDay = false;
var isNight = false;

if ((currentHour == riseHours && currentMinute >= riseMinutes) || currentHour > riseHours) {
	isDay = true;
}
if ((currentHour == setHours && currentMinute >= setMinutes) || currentHour > setHours) {
	isNight = true;
}
if (isNight) { isDay = false; }

if (isDay) {

	// How many minutes per daily hour
	var dayDifference = (setHours - riseHours) * 60;
	dayDifference = dayDifference - riseMinutes + setMinutes;
	dayDifference = dayDifference / 12;

	// How many minutes since sunrise as of now
	dayOffset = (currentHour - riseHours) * 60;
	dayOffset = dayOffset - riseMinutes + currentMinute;
	dayOffset = Math.floor(dayOffset / dayDifference);

	// Rising Hours
	switch (theCurrentDay) {
		case 0 : dayIndex = aPlanetSundayRise[dayOffset]; break;
		case 1 : dayIndex = aPlanetMondayRise[dayOffset]; break;
		case 2 : dayIndex = aPlanetTuesdayRise[dayOffset]; break;
		case 3 : dayIndex = aPlanetWednesdayRise[dayOffset]; break;
		case 4 : dayIndex = aPlanetThursdayRise[dayOffset]; break;
		case 5 : dayIndex = aPlanetFridayRise[dayOffset]; break;
		case 6 : dayIndex = aPlanetSaturdayRise[dayOffset]; break;
	}

	PlanetaryOffset = dayIndex;
};
	
	// --------------------[ NIGHT ]--------------------

if (isNight) {
	
	// How many minutes per daily hour
	var nightDifference = (riseHours + 24 - setHours) * 60;
	nightDifference = nightDifference - setMinutes + riseMinutes;
	nightDifference = nightDifference / 12;

	// How many minutes since sunrise as of now
	nightOffset = (currentHour - setHours) * 60;
	nightOffset = nightOffset - setMinutes + currentMinute;
	nightOffset = Math.floor(nightOffset / nightDifference);

	// Setting Hours
	switch (theCurrentDay) {
		case 0 : nightIndex = aPlanetSundaySet[nightOffset]; break;
		case 1 : nightIndex = aPlanetMondaySet[nightOffset]; break;
		case 2 : nightIndex = aPlanetTuesdaySet[nightOffset]; break;
		case 3 : nightIndex = aPlanetWednesdaySet[nightOffset]; break;
		case 4 : nightIndex = aPlanetThursdaySet[nightOffset]; break;
		case 5 : nightIndex = aPlanetFridaySet[nightOffset]; break;
		case 6 : nightIndex = aPlanetSaturdaySet[nightOffset]; break;
	}

	PlanetaryOffset = nightIndex;
};

	// Wrapper DIV
	document.write ('<div style="width: 212px; height: 114px; margin: 16px auto 16px auto; background:url(\'planetary/symbols/b'+theCurrentDay+'.png\') no-repeat #cccc99; padding-top: 24px;">');

	// Daily Symbol
	document.write ('<div style="width: 68px; float:left;">');
	document.write ('<img src="planetary/symbols/'+PlanetaryOffset+'.png" style="margin:10px 4px 0px 6px;" />');
	document.write ('</div>');

	document.write ('<div style="width:138px; height: 90px; font:9px/16px Verdana;margin:0px; float:left;" id="planetary">');
	document.write ('<p style="margin-top:10px;" id="planet">Sunrise : ' + (riseHours < 10 ? '0' + riseHours : riseHours) + ':' + (riseMinutes < 10 ? '0'+riseMinutes : riseMinutes) + '<br />');
	document.write ('Sunset : ' + setHours + ':' + (setMinutes < 10 ? '0' + setMinutes : setMinutes) + '<br />');
	document.write ('Daily : <a class="tool" href="/planets/' + aPlanets[theCurrentDay] + '.html"><span class="tip">' + aPurpose[theCurrentDay]+ '</span>' + aPlanets[theCurrentDay] + '</a><br />');
	document.write ('Hourly : <a class="tool" href="/planets/' + aPlanets[PlanetaryOffset] + '.html"><span class="tip">' + aPurpose[PlanetaryOffset]+ '</span>' + aPlanets[PlanetaryOffset] + '</a>');
	document.write ('</div></div></div>'); 

}
function checkCmdLine()
{
	var params=parseURL(document.URL);
	var lathours=37;
	var latmins=47;
	var latsecs=0;
	var longhours=175;
	var longmins=17;
	var longsecs=0;
	for (var index=0; index<params.length; index++)
	{
		var param=params[index];
		arry=param;
		var str=param.name;
		if (param.name=="lat")
		{
			lathours.value=(param.values.length>0)?param.values[0]:"0";
			latmins.value=(param.values.length>1)?param.values[1]:"0";
			latsecs.value=(param.values.length>2)?param.values[2]:"0";
		}
		if (param.name=="long")
		{
			longhours.value=(param.values.length>0)?param.values[0]:"0";
			longmins.value=(param.values.length>1)?param.values[1]:"0";
			longsecs.value=(param.values.length>2)?param.values[2]:"0";
		}
	}
}
function startup()
{
	date=new Date();
	date.getFullYear=getFullYear;
	input=new inputData();
	sunRise=new riseSetData();
	sunSet=new riseSetData();
	civilRise=new riseSetData();
	civilSet=new riseSetData();
	nautRise=new riseSetData();
	nautSet=new riseSetData();
	astronRise=new riseSetData();
	astronSet=new riseSetData();
	initRiseSet=new riseSetData();
	dayNumber=new dayNumberObject();
	sunPosition=new sunPositionData();
	riseSetAngle=new angle();
	riseSexa=new sexagesimalNumber();
	setSexa=new sexagesimalNumber();
	lengthSexa=new sexagesimalNumber();
	sexa=new sexagesimalNumber();
	civilAngle=new angle();
	nautAngle=new angle();
	astroAngle=new angle();
	addRiseData(sunRise);
	addSetData(sunSet);
	addRiseData(civilRise);
	addSetData(civilSet);
	addRiseData(nautRise);
	addSetData(nautSet);
	addRiseData(astronRise);
	addSetData(astronSet);
	riseSetAngle.setRadians(1.454441e-2);
	civilAngle.setDegrees(6);
	nautAngle.setDegrees(12);
	astroAngle.setDegrees(18);
	resetToCurrentDate();
	checkCmdLine();
}
// Coordinates: 37'47'S 175'17'E
startup();
calculate();
