// Based on the formulas used in Peter Duffett-Smith's books
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=0;
var JD1900=2415020.0;
var modified=false;

var date;
var input;
var sunRise;
var sunSet;
var civilRise;
var civilSet;
var nautRise;
var nautSet;
//var astronRise;
//var astronSet;
var initRiseSet;
var dayNumber;
var sunPosition;
var riseSetAngle;
var riseSexa;
var setSexa;
var lengthSexa;
var sexa;
var civilAngle;
var nautAngle;
var astroAngle;
var paramSeps=new String("?&=,");
var arry;

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();
	if(year >= 100) year = year + 1900;
	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 < 12)  // per commented this out to use 24 hour clock.
		ampm = "AM";
	else
	{
		ampm="PM";
		if (hrs > 13) hrs -= 12;
	} */

	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 frm=document.SunriseSetUI;
	var year=date.getYear();
	// check for Netscape version 4 and below. If true correct the year
	var browser = ((navigator.appName == "Netscape") && (parseInt(navigator.appVersion) < 6))
		if (!browser) {
			//if(year >= 100) year += 1900;
		}
		else {if(year >= 100) year += 1900;}
	frm.year.value=year;
	frm.month.value=date.getMonth()+1;
	frm.day.value=date.getDate();
	//frm.zone.value=-(date.getTimezoneOffset()/60);
frm.zone.value=0;
}

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, elem)
{
	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("Year must be at least 1582");
	elem.focus();
	return false;
}

function validateTimeZone(zone, elem)
{
	if (zone >= -12 && zone < 12)
		return true;

	alert("Time Zone Offset must be greater or equal than -12 or less than 12");
	elem.focus();
	return false;
}

function clearResults()
{
	var n="";
	with (document.SunriseSetUI)
	{
		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 frm=document.SunriseSetUI;

	input.year=parseIntValue(frm.year.value, date.getFullYear());
	input.month=parseIntValue(frm.month.value, date.getMonth()+1);
	input.day=parseIntValue(frm.day.value, date.getDate()+1);
	input.zone=parseFloatValue(frm.zone.value, -(date.getTimezoneOffset()/60));

	if (!validateYear(input.year, frm.year))
		return;

	if (!validateTimeZone(input.zone, frm.zone))
		return;

	var hrs=0;
	var mins=0;
	var secs=0;
	var deg=0;

	if (frm.latmins.value.length==0 && frm.latsecs.value.length==0)
		deg=parseFloatValue(frm.lathours.value);
	else
	{
		hrs=parseIntValue(frm.lathours.value);
		mins=parseIntValue(frm.latmins.value);
		secs=parseFloatValue(frm.latsecs.value);
		deg=hrs+mins/60+secs/3600;
	}

	if (frm.latdirection[1].checked==true)
	{
		if (deg > 0)
			deg=-deg;
	}

	input.latitude.setDegrees(deg);

	if (frm.longmins.value.length==0 && frm.longsecs.value.length==0)
		deg=parseFloatValue(frm.longhours.value);
	else
	{
		hrs=parseIntValue(frm.longhours.value);
		mins=parseIntValue(frm.longmins.value);
		secs=parseFloatValue(frm.longsecs.value);
		deg=hrs+mins/60+secs/3600;
	}

	if (frm.longdirection[1].checked==true)
	{
		if (deg > 0) deg=-deg;
	}

	input.longitude.setDegrees(deg);
	dayNumber.setUsingDate(input.year, input.month, input.day);

	if (frm.suncalc.checked)
	{
		sunPosition.calcSunRiseSet(riseSetAngle, sunRise, sunSet);
//timeUTC=initRiseSet.riseUTC;
//sunRise="Boogyman";
		displayRSTime(sunRise, frm.sunrise);
		displayRSTime(sunSet, frm.sunset);
		displayRSLength(sunRise, sunSet, frm.sunlength);
	}

	if (frm.civilcalc.checked)
	{
		sunPosition.calcSunRiseSet(civilAngle, civilRise, civilSet);
		displayRSTime(civilRise, frm.civilrise);
		displayRSTime(civilSet, frm.civilset);
		displayRSLength(civilRise, civilSet, frm.civillength);
	}

	if (frm.nautcalc.checked)
	{
		sunPosition.calcSunRiseSet(nautAngle, nautRise, nautSet);
		displayRSTime(nautRise, frm.nautrise);
		displayRSTime(nautSet, frm.nautset);
		displayRSLength(nautRise, nautSet, frm.nautlength);
	}

	/*if (frm.astroncalc.checked)
	{
		sunPosition.calcSunRiseSet(astroAngle, astronRise, astronSet);
		displayRSTime(astronRise, frm.astronrise);
		displayRSTime(astronSet, frm.astronset);
		displayRSLength(astronRise, astronSet, frm.astronlength);
	}*/
}

function checkCmdLine()
{
	var params=parseURL(document.URL);
	var frm=document.SunriseSetUI;
	var lathours=frm.lathours;
	var latmins=frm.latmins;
	var latsecs=frm.latsecs;
	var longhours=frm.longhours;
	var longmins=frm.longmins;
	var longsecs=frm.longsecs;

	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();
}

