

//*********************************************************************/

	function month(name, numdays, abbr) 
	{
		this.name = name;
		this.numdays = numdays;
		this.abbr = abbr;
	}

//*********************************************************************/

	function ans(daySave,value)
	{
		this.daySave = daySave;
		this.value = value;
	}

//*********************************************************************/

	function city(name, lat, lng, zoneHr) 
	{
		this.name = name;
		this.lat = lat;
		this.lng = lng;
		this.zoneHr = zoneHr;
	}

//***********************************************************************/

	function makeArray()    
	{
    	this[0] = makeArray.arguments.length;
    	for (i = 0; i<makeArray.arguments.length; i++)
        	this[i+1] = makeArray.arguments[i];
	}

//***********************************************************************/

	function LeapYear(year) 
	{
    	if ((year/4)   != Math.floor(year/4))   return false;
    	if ((year/100) != Math.floor(year/100)) return true;
    	if ((year/400) != Math.floor(year/400)) return false;
    	return true;
	}

//***********************************************************************/

	function NthDay(nth,weekday,month,year) 
	{
    	if (nth > 0) return (nth-1)*7 + 1 + (7 + weekday -
		DayOfWeek((nth-1)*7 + 1,month,year))%7;
    	if (LeapYear(year)) 
    		var days = daysofmonthLY[month];
    	else                
    		var days = daysofmonth[month];
    	return days - (DayOfWeek(days,month,year) - weekday + 7)%7;
	}

//***********************************************************************/

	function DayOfWeek(day,month,year) 
	{
    	var a = Math.floor((14 - month)/12);
    	var y = year - a;
    	var m = month + 12*a - 2;
    	var d = (day + y + Math.floor(y/4) - Math.floor(y/100) +
		Math.floor(y/400) + Math.floor((31*m)/12)) % 7;
    	return d+1;
	}

//***********************************************************************/

	function getMS(date) 
	{
    	return Date.UTC(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds())
    }

//***********************************************************************/
	
	var daysofmonth   = new makeArray( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var daysofmonthLY = new makeArray( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var monthList = new Array();
	var i = 0;
	monthList[i++] = new month("January", 31, "Jan");
	monthList[i++] = new month("February", 28, "Feb");
	monthList[i++] = new month("March", 31, "Mar");
	monthList[i++] = new month("April", 30, "Apr");
	monthList[i++] = new month("May", 31, "May");
	monthList[i++] = new month("June", 30, "Jun");
	monthList[i++] = new month("July", 31, "Jul");
	monthList[i++] = new month("August", 31, "Aug");
	monthList[i++] = new month("September", 30, "Sep");
	monthList[i++] = new month("October", 31, "Oct");
	monthList[i++] = new month("November", 30, "Nov");
	monthList[i++] = new month("December", 31, "Dec");

//*********************************************************************/

	var YesNo = new Array();
	i=0;
	YesNo[i++] = new ans("N",0);
	YesNo[i++] = new ans("Y",60);

//*********************************************************************/

	var City = new Array();
	j = 0;
	City[j++] = new city("Select a city",0,0,0);
	City[j++] = new city("",0,0,0);
	City[j++] = new city("US CITIES",0,0,0);
	City[j++] = new city("Albuquerque, NM", 35.0833,106.65,7);
	City[j++] = new city("Anchorage, AK", 61.217, 149.90,9);
	City[j++] = new city("Atlanta, GA", 33.733, 84.383, 5);
	City[j++] = new city("Austin, TX", 30.283, 97.733, 6);
	City[j++] = new city("Birmingham, AL", 33.521, 86.8025, 6);
	City[j++] = new city("Bismarck, ND", 46.817, 100.783, 6);
	City[j++] = new city("Boston, MA", 42.35, 71.05, 5);
	City[j++] = new city("Boulder, CO", 40.125, 105.237, 7);
	City[j++] = new city("Chicago, IL", 41.85,87.65,6);
	City[j++] = new city("Dallas, TX", 32.46, 96.47,6);
	City[j++] = new city("Denver, CO", 39.733, 104.983, 7);
	City[j++] = new city("Detroit, MI", 42.333, 83.05, 5);
	City[j++] = new city("Honolulu, HI", 21.30, 157.85, 10);
	City[j++] = new city("Houston, TX", 29.75, 95.35, 6);
	City[j++] = new city("Indianapolis, IN", 39.767, 86.15, 5);
	City[j++] = new city("Jackson, MS", 32.283, 90.183, 6);
	City[j++] = new city("Kansas City, MO", 39.083, 94.567,6);
	City[j++] = new city("Los Angeles, CA",34.05,118.233,8);
	City[j++] = new city("Menomonee Falls, WI",43.11,88.10,6);
	City[j++] = new city("Miami, FL", 25.767, 80.183,5);
	City[j++] = new city("Minneapolis, MN", 44.967, 93.25, 6);
	City[j++] = new city("New Orleans, LA", 29.95, 90.067, 6);
	City[j++] = new city("New York City, NY", 40.7167, 74.0167, 5);
	City[j++] = new city("Oklahoma City, OK", 35.483, 97.533,6);
	City[j++] = new city("Philadelphia, PA", 39.95, 75.15, 5);
	City[j++] = new city("Phoenix, AZ",33.433,112.067,7);
	City[j++] = new city("Pittsburgh, PA",40.433,79.9833,5);
	City[j++] = new city("Portland, ME", 43.666, 70.283, 5);
	City[j++] = new city("Portland, OR", 45.517, 122.65, 8);
	City[j++] = new city("Raleigh, NC", 35.783, 78.65, 5);
	City[j++] = new city("Richmond, VA", 37.5667, 77.450, 5);
	City[j++] = new city("Saint Louis, MO", 38.6167,90.1833,6);
	City[j++] = new city("San Diego, CA", 32.7667, 117.2167, 8);
	City[j++] = new city("San Francisco, CA",37.7667,122.4167,8);
	City[j++] = new city("Seattle, WA",47.60,122.3167,8);
	City[j++] = new city("Washington DC", 38.8833, 77.0333,5);
	City[j++] = new city("",0,0,0);
	City[j++] = new city("WORLD CITIES",0,0,0);
	City[j++] = new city("Beijing, China",39.9167, -116.4167,-8);
	City[j++] = new city("Berlin, Germany",52.33, -13.30, -1);
	City[j++] = new city("Bombay, India", 18.9333, -72.8333, -5.5);
	City[j++] = new city("Buenos Aires, Argentina", -34.60,58.45,3);
	City[j++] = new city("Cairo, Egypt", 30.10,-31.3667,-2);
	City[j++] = new city("Cape Town, South Africa",-33.9167,-18.3667,-2);
	City[j++] = new city("Caracas, Venezuela", 10.50,66.9333,4);
	City[j++] = new city("Helsinki, Finland", 60.1667, -24.9667,-2);
	City[j++] = new city("Hong Kong, China", 22.25,-114.1667, -8);
	City[j++] = new city("Jerusalem, Israel", 31.7833, -35.2333, -2);
	City[j++] = new city("London, England", 51.50, 0.1667,0);
	City[j++] = new city("Mexico City, Mexico", 19.4,99.15,6);
	City[j++] = new city("Moscow, Russia", 55.75, -37.5833, -3);
	City[j++] = new city("New Delhi, India",28.6, -77.2, -5.5);
	City[j++] = new city("Ottawa, Canada", 45.41667,75.7,5);
	City[j++] = new city("Paris, France", 48.8667, -2.667, -1);
	City[j++] = new city("Rio de Janeiro, Brazil",-22.90,43.2333,3);
	City[j++] = new city("Riyadh, Saudi Arabia", 24.633, -46.71667, -3);
	City[j++] = new city("Rome, Italy",41.90, -12.4833,-1);
	City[j++] = new city("Sydney, Australia",-33.8667,-151.2167,-10);
	City[j++] = new city("Tokyo, Japan", 35.70, -139.7667, -9); 
	City[j++] = new city("Zurich, Switzerland", 47.3833, -8.5333,-1);
	

//*********************************************************************/





//*********************************************************************/

	function setLatLong(f, index)
	{
		f["latDeg"].value = City[index].lat;
		f["lonDeg"].value = City[index].lng;
		f["latMin"].value = 0;
		f["latSec"].value = 0;
		f["lonMin"].value = 0;
		f["lonSec"].value = 0;
		convLatLong(f);
		f["hrsToGMT"].value =  City[index].zoneHr;
	}

//*********************************************************************/

	function isLeapYear(yr) 
	{
		return ((yr % 4 == 0 && yr % 100 != 0) || yr % 400 == 0);
	}

//*********************************************************************/

	function isPosInteger(inputVal) 
	{
		inputStr = ("" + inputVal);
		for (var i = 0; i < inputStr.length; i++) 
		{
			var oneChar = inputStr.charAt(i);
			if (oneChar < "0" || oneChar > "9")
				return false;
		}
		return true;
	}

//*********************************************************************/

	function isInteger(inputVal) 
	{
		inputStr = "" + inputVal;
		if(inputStr == "NaN") return false;
		if(inputStr == "-NaN") return false;
		for (var i = 0; i < inputStr.length; i++) 
		{
			var oneChar = inputStr.charAt(i);
			if (i == 0 && (oneChar == "-" || oneChar == "+"))
			{
				continue;
			}
			if (oneChar < "0" || oneChar > "9")
			{
				return false;
			}
		}
		return true;
	}

//*********************************************************************/

	function isNumber(inputVal) 
	{
		var oneDecimal = false;
		var inputStr = "" + inputVal;
		for (var i = 0; i < inputStr.length; i++) 
		{
			var oneChar = inputStr.charAt(i);
			if (i == 0 && (oneChar == "-" || oneChar == "+"))
			{
				continue;
			}
			if (oneChar == "." && !oneDecimal) 
			{
				oneDecimal = true;
				continue;
			}
			if (oneChar < "0" || oneChar > "9")
			{
				return false;
			}
		}
		return true;
	}

//*********************************************************************/

	function isValidInput(f, index, latLongForm) 
	{
		if (latLongForm["day"].value == "") 
		{	
			alert("You must enter a day before attempting the calculation.");
			return false;
		}
		else if (latLongForm["year"].value == "") 
		{	
			alert("You must enter a year before attempting the calculation.");
			return false;
		}
		else if (!isPosInteger(latLongForm["day"].value) || latLongForm["day"].value == 0)
		{
			alert("The day must be a positive integer.");
			return false;
		}
		else if (!isInteger(latLongForm["year"].value)) 
		{
			alert("The year must be an integer.");
			return false;
		}
		else if ( (latLongForm["year"].value < -1000) || (latLongForm["year"].value > 3000) )
		{
			alert("The algorithm used is not valid for years outside of/nthe range -1000 to 3000.");
			return false;
		}
		else if ((index != 1) && (latLongForm["day"].value > monthList[index].numdays)) 
		{
			alert("There are only " + monthList[index].numdays + " days in " 
				+ monthList[index].name + ".");
			return false;
		}
		else if (index == 1) 
		{	
			if (isLeapYear(latLongForm["year"].value)) 
			{	
				if (latLongForm["day"].value > (monthList[index].numdays + 1)) 
				{
					alert("There are only " + (monthList[index].numdays + 1) 
						+ " days in " + monthList[index].name + ".");
					return false;
				}
				else
					return true;
			}
			else 
			{	
				if (latLongForm["day"].value > monthList[index].numdays) 
				{
					alert("There are only " + monthList[index].numdays 
						+ " days in " + monthList[index].name + ".");
					return false;
				}
				else
					return true;
			}
		}
		else 
			return true;	
	}

//*********************************************************************/

	function convLatLong(f)
	{
		if(f["latDeg"].value == "")
		{
			f["latDeg"].value = 0;
		}
		if(f["latMin"].value == "")
		{
			f["latMin"].value = 0;
		}
		if(f["latSec"].value == "")
		{
			f["latSec"].value = 0;
		}
		if(f["lonDeg"].value == "")
		{
			f["lonDeg"].value = 0;
		}
		if(f["lonMin"].value == "")
		{
			f["lonMin"].value = 0;
		}
		if(f["lonSec"].value == "")
		{
			f["lonSec"].value = 0;
		}

		var neg = 0;
		if(f["latDeg"].value.charAt(0) == '-') 
		{
			neg = 1;
		}

		if(neg != 1)
		{
			var latSeconds = (parseFloat(f["latDeg"].value))*3600 
				+ parseFloat(f["latMin"].value)*60 
				+ parseFloat(f["latSec"].value)*1;

			f["latDeg"].value = Math.floor(latSeconds/3600);
			f["latMin"].value = Math.floor((latSeconds
				- (parseFloat(f["latDeg"].value)*3600))/60);
			f["latSec"].value = Math.floor((latSeconds
				- (parseFloat(f["latDeg"].value)*3600) 
				- (parseFloat(f["latMin"].value)*60)) + 0.5);
		}
		else if(parseFloat(f["latDeg"].value) > -1)
		{
			var latSeconds = parseFloat(f["latDeg"].value)*3600 
				- parseFloat(f["latMin"].value)*60 
				- parseFloat(f["latSec"].value)*1;

			f["latDeg"].value = "-0";
			f["latMin"].value = Math.floor((-latSeconds)/60);
			f["latSec"].value = Math.floor( (-latSeconds 
				- (parseFloat(f["latMin"].value)*60)) + 0.5);

		}
		else
		{
			var latSeconds = parseFloat(f["latDeg"].value)*3600 
				- parseFloat(f["latMin"].value)*60 
				- parseFloat(f["latSec"].value)*1;

			f["latDeg"].value = Math.ceil(latSeconds/3600);
			f["latMin"].value = Math.floor((-latSeconds
				+ (parseFloat(f["latDeg"].value)*3600))/60);
			f["latSec"].value = Math.floor((-latSeconds
				+ (parseFloat(f["latDeg"].value)*3600) 
				- (parseFloat(f["latMin"].value)*60)) + 0.5);
		}

		neg = 0;
		if(f["lonDeg"].value.charAt(0) == '-') 
		{
			neg = 1;
		}

		if(neg != 1)
		{
			var lonSeconds = parseFloat(f["lonDeg"].value)*3600 
				+ parseFloat(f["lonMin"].value)*60 
				+ parseFloat(f["lonSec"].value)*1;
			f["lonDeg"].value = Math.floor(lonSeconds/3600);
			f["lonMin"].value = Math.floor((lonSeconds
				- (parseFloat(f["lonDeg"].value)*3600))/60);
			f["lonSec"].value = Math.floor((lonSeconds
				- (parseFloat(f["lonDeg"].value)*3600)
				- (parseFloat(f["lonMin"].value))*60) + 0.5);
		}
		else if(parseFloat(f["lonDeg"].value) > -1)
		{
			var lonSeconds = parseFloat(f["lonDeg"].value)*3600 
				- parseFloat(f["lonMin"].value)*60 
				- parseFloat(f["lonSec"].value)*1;

			f["lonDeg"].value = "-0";
			f["lonMin"].value = Math.floor((-lonSeconds)/60);
			f["lonSec"].value = Math.floor((-lonSeconds
				- (parseFloat(f["lonMin"].value)*60)) + 0.5);
		}
		else
		{
			var lonSeconds = parseFloat(f["lonDeg"].value)*3600 
				- parseFloat(f["lonMin"].value)*60 
				- parseFloat(f["lonSec"].value)*1;
			f["lonDeg"].value = Math.ceil(lonSeconds/3600);
			f["lonMin"].value = Math.floor((-lonSeconds
				+ (parseFloat(f["lonDeg"].value)*3600))/60);
			f["lonSec"].value = Math.floor((-lonSeconds
				+ (parseFloat(f["lonDeg"].value)*3600)
				- (parseFloat(f["lonMin"].value)*60)) + 0.5);
		}

		if(latSeconds > 324000)
		{
			alert("You have entered an invalid latitude.\n  Setting lat = 89.8.");
			f["latDeg"].value = 89.8;
			f["latMin"].value = 0;
			f["latSec"].value = 0;
		}
		if(latSeconds < -324000)
		{
			alert("You have entered an invalid latitude.\n  Setting lat = -89.8.");
			f["latDeg"].value = -89.8;
			f["latMin"].value = 0;
			f["latSec"].value = 0;
		}
		if(lonSeconds > 648000)
		{
			alert("You have entered an invalid longitude.\n Setting lon = 180.");
			f["lonDeg"].value = 180;
			f["lonMin"].value = 0;
			f["lonSec"].value = 0;
		}
		if(lonSeconds < -648000)
		{
			alert("You have entered an invalid longitude.\n Setting lon = -180.");
			f["lonDeg"].value = -180;
			f["lonMin"].value = 0;
			f["lonSec"].value =0;
		}
	}

//***********************************************************************/

	function radToDeg(angleRad) 
	{
		return (180.0 * angleRad / Math.PI);
	}

//*********************************************************************/

	function degToRad(angleDeg) 
	{
		return (Math.PI * angleDeg / 180.0);
	}

//*********************************************************************/

	function calcDayOfYear(mn, dy, lpyr) 
	{
		var k = (lpyr ? 1 : 2);
		var doy = Math.floor((275 * mn)/9) - k * Math.floor((mn + 9)/12) + dy -30;
		return doy;
	}

//***********************************************************************/

	function calcDayOfWeek(juld)
	{
		var A = (juld + 1.5) % 7;
		var DOW = (A==0)?"Sunday":(A==1)?"Monday":(A==2)?"Tuesday":(A==3)?"Wednesday":(A==4)?"Thursday":(A==5)?"Friday":"Saturday";
		return DOW;
	}

//***********************************************************************/

	function calcJD(year, month, day)
	{
		if (month <= 2) 
		{
			year -= 1;
			month += 12;
		}
		var A = Math.floor(year/100);
		var B = 2 - A + Math.floor(A/4);
		var JD = Math.floor(365.25*(year + 4716)) + Math.floor(30.6001*(month+1)) + day + B - 1524.5;
		return JD;
	}

//***********************************************************************/

	function calcDateFromJD(jd)
	{
		var z = Math.floor(jd + 0.5);
		var f = (jd + 0.5) - z;
		if (z < 2299161) 
		{
			var A = z;
		} 
		else 
		{
			alpha = Math.floor((z - 1867216.25)/36524.25);
			var A = z + 1 + alpha - Math.floor(alpha/4);
		}

		var B = A + 1524;
		var C = Math.floor((B - 122.1)/365.25);
		var D = Math.floor(365.25 * C);
		var E = Math.floor((B - D)/30.6001);
		var day = B - D - Math.floor(30.6001 * E) + f;
		var month = (E < 14) ? E - 1 : E - 13;
		var year = (month > 2) ? C - 4716 : C - 4715;
		return (day + "-" + monthList[month-1].name + "-" + year);
	}

//***********************************************************************/

	function calcDayFromJD(jd)
	{
		var z = Math.floor(jd + 0.5);
		var f = (jd + 0.5) - z;
		if (z < 2299161) 
		{
			var A = z;
		} 
		else 
		{
			alpha = Math.floor((z - 1867216.25)/36524.25);
			var A = z + 1 + alpha - Math.floor(alpha/4);
		}
		var B = A + 1524;
		var C = Math.floor((B - 122.1)/365.25);
		var D = Math.floor(365.25 * C);
		var E = Math.floor((B - D)/30.6001);
		var day = B - D - Math.floor(30.6001 * E) + f;
		var month = (E < 14) ? E - 1 : E - 13;
		var year = (month > 2) ? C - 4716 : C - 4715;
		//alert(year);
		return ((day<10 ? "0" : "") + day + monthList[month-1].abbr);
		
	}
	
//***********************************************************************/

	function calcYearFromJD(jd)
	{
		var z = Math.floor(jd + 0.5);
		var f = (jd + 0.5) - z;
		if (z < 2299161) 
		{
			var A = z;
		} 
		else 
		{
			alpha = Math.floor((z - 1867216.25)/36524.25);
			var A = z + 1 + alpha - Math.floor(alpha/4);
		}
		var B = A + 1524;
		var C = Math.floor((B - 122.1)/365.25);
		var D = Math.floor(365.25 * C);
		var E = Math.floor((B - D)/30.6001);
		var day = B - D - Math.floor(30.6001 * E) + f;
		var month = (E < 14) ? E - 1 : E - 13;
		var year = (month > 2) ? C - 4716 : C - 4715;
		return year ;
		
	}

//***********************************************************************/

	function calcTimeJulianCent(jd)
	{
		var T = (jd - 2451545.0)/36525.0;
		return T;
	}

//***********************************************************************/

	function calcJDFromJulianCent(t)
	{
		var JD = t * 36525.0 + 2451545.0;
		return JD;
	}

//***********************************************************************/

	function calcGeomMeanLongSun(t)
	{
		var L0 = 280.46646 + t * (36000.76983 + 0.0003032 * t);
		while(L0 > 360.0)
		{
			L0 -= 360.0;
		}
		while(L0 < 0.0)
		{
			L0 += 360.0;
		}
		return L0;
	}

//***********************************************************************/

	function calcGeomMeanAnomalySun(t)
	{
		var M = 357.52911 + t * (35999.05029 - 0.0001537 * t);
		return M;
	}

//***********************************************************************/

	function calcEccentricityEarthOrbit(t)
	{
		var e = 0.016708634 - t * (0.000042037 + 0.0000001267 * t);
		return e;
	}

//***********************************************************************/

	function calcSunEqOfCenter(t)
	{
		var m = calcGeomMeanAnomalySun(t);
		var mrad = degToRad(m);
		var sinm = Math.sin(mrad);
		var sin2m = Math.sin(mrad+mrad);
		var sin3m = Math.sin(mrad+mrad+mrad);
		var C = sinm * (1.914602 - t * (0.004817 + 0.000014 * t)) + sin2m * (0.019993 - 0.000101 * t) + sin3m * 0.000289;
		return C;
	}

//***********************************************************************/

	function calcSunTrueLong(t)
	{
		var l0 = calcGeomMeanLongSun(t);
		var c = calcSunEqOfCenter(t);
		var O = l0 + c;
		return O;
	}

//***********************************************************************/

	function calcSunTrueAnomaly(t)
	{
		var m = calcGeomMeanAnomalySun(t);
		var c = calcSunEqOfCenter(t);
		var v = m + c;
		return v;
	}

//***********************************************************************/

	function calcSunRadVector(t)
	{
		var v = calcSunTrueAnomaly(t);
		var e = calcEccentricityEarthOrbit(t);
 		var R = (1.000001018 * (1 - e * e)) / (1 + e * Math.cos(degToRad(v)));
		return R;
	}

//***********************************************************************/

	function calcSunApparentLong(t)
	{
		var o = calcSunTrueLong(t);
		var omega = 125.04 - 1934.136 * t;
		var lambda = o - 0.00569 - 0.00478 * Math.sin(degToRad(omega));
		return lambda;
	}

//***********************************************************************/

	function calcMeanObliquityOfEcliptic(t)
	{
		var seconds = 21.448 - t*(46.8150 + t*(0.00059 - t*(0.001813)));
		var e0 = 23.0 + (26.0 + (seconds/60.0))/60.0;
		return e0;
	}

//***********************************************************************/

	function calcObliquityCorrection(t)
	{
		var e0 = calcMeanObliquityOfEcliptic(t);
		var omega = 125.04 - 1934.136 * t;
		var e = e0 + 0.00256 * Math.cos(degToRad(omega));
		return e;
	}

//***********************************************************************/

	function calcSunRtAscension(t)
	{
		var e = calcObliquityCorrection(t);
		var lambda = calcSunApparentLong(t);
 		var tananum = (Math.cos(degToRad(e)) * Math.sin(degToRad(lambda)));
		var tanadenom = (Math.cos(degToRad(lambda)));
		var alpha = radToDeg(Math.atan2(tananum, tanadenom));
		return alpha;
	}

//***********************************************************************/

	function calcSunDeclination(t)
	{
		var e = calcObliquityCorrection(t);
		var lambda = calcSunApparentLong(t);
		var sint = Math.sin(degToRad(e)) * Math.sin(degToRad(lambda));
		var theta = radToDeg(Math.asin(sint));
		return theta;
	}

//***********************************************************************/

	function calcEquationOfTime(t)
	{
		var epsilon = calcObliquityCorrection(t);
		var l0 = calcGeomMeanLongSun(t);
		var e = calcEccentricityEarthOrbit(t);
		var m = calcGeomMeanAnomalySun(t);
		var y = Math.tan(degToRad(epsilon)/2.0);
		y *= y;
		var sin2l0 = Math.sin(2.0 * degToRad(l0));
		var sinm   = Math.sin(degToRad(m));
		var cos2l0 = Math.cos(2.0 * degToRad(l0));
		var sin4l0 = Math.sin(4.0 * degToRad(l0));
		var sin2m  = Math.sin(2.0 * degToRad(m));
		var Etime = y * sin2l0 - 2.0 * e * sinm + 4.0 * e * y * sinm * cos2l0
				- 0.5 * y * y * sin4l0 - 1.25 * e * e * sin2m;
		return radToDeg(Etime)*4.0;
	}

//***********************************************************************/

	function calcHourAngleSunrise(lat, solarDec)
	{
		var latRad = degToRad(lat);
		var sdRad  = degToRad(solarDec);
		var HAarg = (Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(sdRad))-Math.tan(latRad) * Math.tan(sdRad));
		var HA = (Math.acos(Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(sdRad))-Math.tan(latRad) * Math.tan(sdRad)));
		return HA;
	}

//***********************************************************************/

	function calcHourAngleSunset(lat, solarDec)
	{
		var latRad = degToRad(lat);
		var sdRad  = degToRad(solarDec);
		var HAarg = (Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(sdRad))-Math.tan(latRad) * Math.tan(sdRad));
		var HA = (Math.acos(Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(sdRad))-Math.tan(latRad) * Math.tan(sdRad)));
		return -HA;
	}

//***********************************************************************/

	function calcSunriseUTC(JD, latitude, longitude)
	{
		var t = calcTimeJulianCent(JD);
		var eqTime = calcEquationOfTime(t);
		var solarDec = calcSunDeclination(t);
		var hourAngle = calcHourAngleSunrise(latitude, solarDec);
		var delta = longitude - radToDeg(hourAngle);
		var timeDiff = 4 * delta;
		var timeUTC = 720 + timeDiff - eqTime;
		var newt = calcTimeJulianCent(calcJDFromJulianCent(t) + timeUTC/1440.0); 
		eqTime = calcEquationOfTime(newt);
		solarDec = calcSunDeclination(newt);
		hourAngle = calcHourAngleSunrise(latitude, solarDec);
		delta = longitude - radToDeg(hourAngle);
		timeDiff = 4 * delta;
		timeUTC = 720 + timeDiff - eqTime;
		return timeUTC;
	}

//***********************************************************************/

	function calcSolNoonUTC(t, longitude)
	{
		var newt = calcTimeJulianCent(calcJDFromJulianCent(t) + 0.5 + longitude/360.0); 
		var eqTime = calcEquationOfTime(newt);
		var solarNoonDec = calcSunDeclination(newt);
		var solNoonUTC = 720 + (longitude * 4) - eqTime;
				return solNoonUTC;
	}

//***********************************************************************/

	function calcSunsetUTC(JD, latitude, longitude)
	{
		var t = calcTimeJulianCent(JD);
		var eqTime = calcEquationOfTime(t);
		var solarDec = calcSunDeclination(t);
		var hourAngle = calcHourAngleSunset(latitude, solarDec);
		var delta = longitude - radToDeg(hourAngle);
		var timeDiff = 4 * delta;
		var timeUTC = 720 + timeDiff - eqTime;
		var newt = calcTimeJulianCent(calcJDFromJulianCent(t) + timeUTC/1440.0); 
		eqTime = calcEquationOfTime(newt);
		solarDec = calcSunDeclination(newt);
		hourAngle = calcHourAngleSunset(latitude, solarDec);
		delta = longitude - radToDeg(hourAngle);
		timeDiff = 4 * delta;
		timeUTC = 720 + timeDiff - eqTime;
		return timeUTC;
	}

//*********************************************************************/

	function getLatitude(latLongForm)
	{
		var neg = 0;
		var degs = parseFloat(latLongForm["latDeg"].value);
		if (latLongForm["latDeg"].value.charAt(0) == '-') 
		{
			neg = 1;
		}
		if(latLongForm["latMin"].value == "")
		{
			latLongForm["latMin"].value = 0;
		}
		if(latLongForm["latSec"].value == "")
		{
			latLongForm["latSec"].value = 0;
		}
		var mins = parseFloat(latLongForm["latMin"].value);
		var secs = parseFloat(latLongForm["latSec"].value);
		if(neg != 1)
		{
			var decLat = degs + (mins / 60) + (secs / 3600);
		} else if(neg == 1)
		{
			var decLat = degs - (mins / 60) - (secs / 3600);
		} else 
		{
			return -9999;
		}
		return decLat;
	}	

//*********************************************************************/

	function getLongitude(latLongForm)
	{
		var neg = 0;
		var degs = parseFloat(latLongForm["lonDeg"].value);
		if (latLongForm["lonDeg"].value.charAt(0) == '-') 
		{
			neg = 1;
		}
		if(latLongForm["lonMin"].value == "")
		{
			latLongForm["lonMin"].value = 0;
		}
		if(latLongForm["lonSec"].value == "")
		{
			latLongForm["lonSec"].value = 0;
		}
		
		var mins = parseFloat(latLongForm["lonMin"].value);
		var secs = parseFloat(latLongForm["lonSec"].value);
		var decLon = degs + (mins / 60) + (secs / 3600);

		if(neg != 1)
		{
			var decLon = degs + (mins / 60) + (secs / 3600);
		} 
		else if(neg == 1)
		{
			var decLon = degs - (mins / 60) - (secs / 3600);
		} 
		else 
		{
			return -9999;
		}
		return decLon;
	}	

//***********************************************************************/

	function findRecentSunrise(jd, latitude, longitude)
	{
		var julianday = jd;
		var time = calcSunriseUTC(julianday, latitude, longitude);
		while(!isNumber(time))
		{
			julianday -= 1.0;
			time = calcSunriseUTC(julianday, latitude, longitude);
		}
		return julianday;
	}

//***********************************************************************/

	function findRecentSunset(jd, latitude, longitude)
	{
		var julianday = jd;
		var time = calcSunsetUTC(julianday, latitude, longitude);
		while(!isNumber(time))
		{
			julianday -= 1.0;
			time = calcSunsetUTC(julianday, latitude, longitude);
		}
		return julianday;
	}

//***********************************************************************/

	function findNextSunrise(jd, latitude, longitude)
	{
		var julianday = jd;
		var time = calcSunriseUTC(julianday, latitude, longitude);
		while(!isNumber(time))
		{
			julianday += 1.0;
			time = calcSunriseUTC(julianday, latitude, longitude);
		}
		return julianday;
	}

//***********************************************************************/

	function findNextSunset(jd, latitude, longitude)
	{
		var julianday = jd;
		var time = calcSunsetUTC(julianday, latitude, longitude);
		while(!isNumber(time))
		{
			julianday += 1.0;
			time = calcSunsetUTC(julianday, latitude, longitude);
		}
		return julianday;
	}

//***********************************************************************/

	function timeString(minutes)
	{
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		var timeStr = hour + ":";
		if (minute < 10)
			timeStr += "0" + minute + ":";
		else
			timeStr += minute + ":";
		if (second < 10)
			timeStr += "0" + second;
		else
			timeStr += second;
		return timeStr;
	}

//***********************************************************************/

	function timeStringShortAMPM(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		var PM = false;
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		var daychange = false;
		if (hour > 23) 
		{
			hour -= 24;
			daychange = true;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			daychange = true;
			julianday -= 1.0;
		}
		if (hour > 12)
		{
			hour -= 12;
			PM = true;
		}
		else if (hour == 12)
		{
			PM = true;
		}
		else if (hour == 0)
		{
			PM = false;
			hour = 12;
		}
		var timeStr = hour + ":";
		if (minute < 10)
			timeStr += "0" + minute + ((PM)?"PM":"AM");
		else
			timeStr += "" + minute + ((PM)?"PM":"AM");
		if (daychange) return timeStr + " " + calcDayFromJD(julianday);
		return timeStr;
	}

//***********************************************************************/

	function timeStringAMPMDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
		}
		var PM = false;
		if (hour > 12)
		{
			hour -= 12;
			PM = true;
		}
		else if (hour == 12)
		{
			PM = true;
		}
		else if (hour == 0)
		{
			PM = false;
			hour = 12;
		}
		var timeStr = hour + ":";
		if (minute < 10)
			timeStr += "0" + minute + ((PM)?"PM":"AM");
		else
			timeStr += minute + ((PM)?"PM":"AM");

		return timeStr + " " + calcDayFromJD(julianday);
	}
	
	//***********************************************************************/

	function UTCHourAMPMDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		if (hour > 23) 
		{
			hour -= 24;
		}
		if (hour < 0)
		{
			hour += 24;
		}
				
		return hour;
	}
	
//***********************************************************************/

	function UTCDayAMPMDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
		}

		return calcDayFromJD(julianday);
	}
	
//***********************************************************************/

	function YearDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
		}
		return calcYearFromJD(julianday);
	}
	
//***********************************************************************/

	function timeStringDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		var daychange = false;
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
			daychange = true;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
			daychange = true;
		}
		var timeStr = hour + ":";
		if (minute < 10)
			timeStr += "0" + minute;
		else
			timeStr += minute;

		if (daychange) return timeStr + " " + calcDayFromJD(julianday);
		return timeStr;
	}
	
//***********************************************************************/

	function UTCHourDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
		}
		
		return hour;
	}
	

//***********************************************************************/

	function UTCDayDate(minutes, JD)
	{
		var julianday = JD;
		var floatHour = minutes / 60;
		var hour = Math.floor(floatHour);
		var floatMinute = 60 * (floatHour - Math.floor(floatHour));
		var minute = Math.floor(floatMinute);
		var floatSec = 60 * (floatMinute - Math.floor(floatMinute));
		var second = Math.floor(floatSec);
		minute += (second >= 30)? 1 : 0;
		if (minute >= 60) 
		{
			minute -= 60;
			hour ++;
		}
		if (hour > 23) 
		{
			hour -= 24;
			julianday += 1.0;
		}
		if (hour < 0)
		{
			hour += 24;
			julianday -= 1.0;
		}

		return calcDayFromJD(julianday);
		
	}
	

//***********************************************************************/

	function CalSunTime(SunTime, UTCHr)
	{
		var timeStr = SunTime;
		var UTCHour = UTCHr;
		var xlen = timeStr.length;
		var cpos = timeStr.indexOf(":");
		var spos = timeStr.indexOf(" ");

		if (spos > 0)
		{
			var ampm = timeStr.substr(xlen - 8,2);
		}
		else
		{
			var ampm = timeStr.substr(xlen - 2,2);
		}

		if (cpos == 1)
		{
			var calhour = "0" + timeStr.substr(0,1);
			var calmin = timeStr.substr(2,2);
		}
		else if (cpos == 2)
		{
			var calhour = timeStr.substr(0,2);
			var calmin = timeStr.substr(3,2);
		}
		else
		{
			alert("This should not happen! ND1001");
		}
		
		if (ampm == "PM")
		{
			if (calhour == 1) 
				calhour = 13;
			else if (calhour == 2) 
				calhour = 14;
			else if (calhour == 3) 
				calhour = 15;
			else if (calhour == 4) 
				calhour = 16;
			else if (calhour == 5) 
				calhour = 17;
			else if (calhour == 6) 
				calhour = 18;
			else if (calhour == 7) 
				calhour = 19;
			else if (calhour == 8) 
				calhour = 20;
			else if (calhour == 9) 
				calhour = 21;
			else if (calhour == 10) 
				calhour = 22;
			else if (calhour == 11) 
				calhour = 23;
		}
		else if (ampm == "AM")
		{
			if (calhour == 12) 
				calhour = "00";
		}

		if (UTCHour > 9)
		{
			calhour = UTCHour;
		}
		else
		{
			calhour = "0" + UTCHour;
		}
		
		var caltime = calhour + calmin;
		
		return caltime;
	}

//***********************************************************************/

	function NewSunDay(SunTime)
	{
		var timeStr = SunTime;
		var xlen = timeStr.length;
		var cpos = timeStr.indexOf(":");
		var spos = timeStr.indexOf(" ");
		
		var calday = timeStr.substr(xlen - 5,2);
		
		//alert(calday);
		
		return calday;
	}

//***********************************************************************/

	function NewSunMon(SunTime)
	{
		var timeStr = SunTime;
		var xlen = timeStr.length;
		var cpos = timeStr.indexOf(":");
		var spos = timeStr.indexOf(" ");
		
		
		var calmon = timeStr.substr(xlen - 3,3);
		if (calmon == "Jan") 
				calmon = "01";
			else if (calmon == "Feb") 
				calmon = "02";
			else if (calmon == "Mar") 
				calmon = "03";
			else if (calmon == "Apr") 
				calmon = "04";
			else if (calmon == "May") 
				calmon = "05";
			else if (calmon == "Jun") 
				calmon = "06";
			else if (calmon == "Jul") 
				calmon = "07";
			else if (calmon == "Aug") 
				calmon = "08";
			else if (calmon == "Sep") 
				calmon = "09";
			else if (calmon == "Oct") 
				calmon = "10";
			else if (calmon == "Nov") 
				calmon = "11";
			else if (calmon == "Dec") 
				calmon = "12";

		//alert(calmon);
		
		return calmon;
	}


//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/
//***********************************************************************/

	function calcSun(riseSetForm, latLongForm, index, index2) 
	{
//		if(index2 != 0)
//		{
//			setLatLong(latLongForm, index2);
//		}
		
// Should not need getLatitude and getLongitude
		var latitude = getLatitude(latLongForm);
		var longitude = getLongitude(latLongForm);
		
		var indexRS = latLongForm.mos.selectedIndex;
		
		
		if (isValidInput(riseSetForm, indexRS, latLongForm)) 
		{
			if((latitude >= -90) && (latitude < -89.8))
			{
				alert("All latitudes between 89.8 and 90 S\n will be set to -89.8");
				latLongForm["latDeg"].value = -89.8;
				latitude = -89.8;
			}
			if ((latitude <= 90) && (latitude > 89.8))
			{
				alert("All latitudes between 89.8 and 90 N\n will be set to 89.8");
				latLongForm["latDeg"].value = 89.8;
				latitude = 89.8;
			}
			var today = new Date(parseFloat(cityLatLong["year"].value),(cityLatLong.mos.selectedIndex),parseFloat(cityLatLong["day"].value),3,0,0);
			var year = (today.getFullYear());

// Energy Policy Act of 2005 
			if (year > 2006)
				{
				var DSTstart = new Date(year,3-1,NthDay(2,1,3,year),2,0,0);
				var DSTend   = new Date(year,11-1,NthDay(1,1,11,year),2,0,0);
				}
			else
				{
				var DSTstart = new Date(year,4-1,NthDay(1,1,4,year),2,0,0);
				var DSTend   = new Date(year,10-1,NthDay(-1,1,10,year),2,0,0);
				}


			var todayMS = getMS(today);
			var DSTstartMS = getMS(DSTstart);
			var DSTendMS = getMS(DSTend);

//			if(cityLatLong["cities"].selectedIndex == 0)
//				{
				if(cityLatLong["ZIPDST"].value == "Y")
					{
					if (todayMS > DSTstartMS && todayMS < DSTendMS)
						{
			    		cityLatLong.dayAns.selectedIndex = 1;
			    		var daySavings = 60;
			    		}
					else
						{
						cityLatLong.dayAns.selectedIndex = 0;
						var daySavings = 0;
			    		}
			    	}
			    else
			    	{
			    	cityLatLong.dayAns.selectedIndex = 0;
					var daySavings = 0;
			    	}
//			    }
//			 else
//			    {
//			    var daySavings = YesNo[index].value;
//			    }
			
			var JD = (calcJD(parseFloat(latLongForm["year"].value), indexRS + 1, parseFloat(latLongForm["day"].value)));
			var dow = calcDayOfWeek(JD);
			var doy = calcDayOfYear(indexRS + 1, parseFloat(latLongForm["day"].value), isLeapYear(latLongForm["year"].value));
			var T = calcTimeJulianCent(JD);
			var alpha = calcSunRtAscension(T);
			var theta = calcSunDeclination(T);
			var Etime = calcEquationOfTime(T);
			var eqTime = Etime;
			var solarDec = theta;
			var nosunrise = false;
			var riseTimeGMT = calcSunriseUTC(JD, latitude, longitude);
			if (!isNumber(riseTimeGMT))
			{
				nosunrise = true;
			}
			var nosunset = false;
			var setTimeGMT = calcSunsetUTC(JD, latitude, longitude);
			if (!isNumber(setTimeGMT))
			{
				nosunset = true;
			}
			var zone = latLongForm["hrsToGMT"].value;
			


			if(zone > 12 || zone < -12.5)
			{
				alert("The offset must be between -12.5 and 12.  \n Setting \"Off-Set\"=0");
				zone = "0";
				latLongForm["hrsToGMT"].value = zone;
			}

			if (!nosunrise)
			{
				var riseTimeLST = riseTimeGMT - (60 * zone) + daySavings;	
				var riseStr = timeStringShortAMPM(riseTimeLST, JD);
				var utcRiseStr = timeStringDate(riseTimeGMT, JD);
				cityLatLong["sunrise"].value = riseStr;
				var utcRiseHour = UTCHourDate(riseTimeGMT, JD);
				var utcRiseDay = UTCDayDate(riseTimeGMT, JD);
				
			}
			if (!nosunset)
			{
				var setTimeLST = setTimeGMT - (60 * zone) + daySavings;
				var setStr = timeStringShortAMPM(setTimeLST, JD);
				var utcSetStr = timeStringDate(setTimeGMT, JD);
				cityLatLong["sunset"].value = setStr;
				var utcSetHour = UTCHourDate(setTimeGMT, JD);
				var utcSetDay = UTCDayDate(setTimeGMT, JD);

				
			}
			var solNoonGMT = calcSolNoonUTC(T, longitude);
			var solNoonLST = solNoonGMT - (60 * zone) + daySavings;
			var solnStr = timeString(solNoonLST);
			var utcSolnStr = timeString(solNoonGMT);
			convLatLong(latLongForm);
			if(nosunrise)
			{ 
				if ( ((latitude > 66.4) && (doy > 79) && (doy < 267)) ||
				   ((latitude < -66.4) && ((doy < 83) || (doy > 263))) )
				{
					newjd = findRecentSunrise(JD, latitude, longitude);
					var newjd2 = findRecentSunrise(JD, latitude, longitude);
					newtime = calcSunriseUTC(newjd, latitude, longitude)
						 - (60 * zone) + daySavings;
					var newtime2 = calcSunriseUTC(newjd, latitude, longitude);
					if (newtime > 1440)
					{
						newtime -= 1440;
						newjd += 1.0;
					}
					if (newtime < 0)
					{
						newtime += 1440;
						newjd -= 1.0;
					}
					cityLatLong["sunrise"].value = 
						timeStringAMPMDate(newtime, newjd);
					var riseStr = timeStringAMPMDate(newtime, newjd);
					var riseYear = YearDate(newtime, newjd);
					var utcRiseHour = UTCHourAMPMDate(newtime2, newjd2);
					var utcRiseDay = UTCDayAMPMDate(newtime2, newjd2);

				}
				else if ( ((latitude > 66.4) && ((doy < 83) || (doy > 263))) ||
					((latitude < -66.4) && (doy > 79) && (doy < 267)) )
				{
					newjd = findNextSunrise(JD, latitude, longitude);
					var newjd2 = findNextSunrise(JD, latitude, longitude);
					newtime = calcSunriseUTC(newjd, latitude, longitude)
						 - (60 * zone) + daySavings;
					var newtime2 = calcSunriseUTC(newjd, latitude, longitude);
					if (newtime > 1440)
					{
						newtime -= 1440;
						newjd += 1.0;
					}
					if (newtime < 0)
					{
						newtime += 1440;
						newjd -= 1.0;
					}
					cityLatLong["sunrise"].value = 
						timeStringAMPMDate(newtime, newjd);
					var riseStr = timeStringAMPMDate(newtime, newjd);
					var riseYear = YearDate(newtime, newjd);
					var utcRiseHour = UTCHourAMPMDate(newtime2, newjd2);
					var utcRiseDay = UTCDayAMPMDate(newtime2, newjd2);

					}
				else 
				{
					alert("Cannot Find Sunrise!");
				}
			}
			if(nosunset)
			{ 
				if ( ((latitude > 66.4) && (doy > 79) && (doy < 267)) ||
				   ((latitude < -66.4) && ((doy < 83) || (doy > 263))) )
				{
					newjd = findNextSunset(JD, latitude, longitude);
					var newjd2 = findNextSunset(JD, latitude, longitude);
					newtime = calcSunsetUTC(newjd, latitude, longitude)
						 - (60 * zone) + daySavings;
					var newtime2 = calcSunsetUTC(newjd, latitude, longitude);
					if (newtime > 1440)
					{
						newtime -= 1440;
						newjd += 1.0;
					}
					if (newtime < 0)
					{
						newtime += 1440;
						newjd -= 1.0;
					}
					cityLatLong["sunset"].value = 
						timeStringAMPMDate(newtime, newjd);
					var setStr = timeStringAMPMDate(newtime, newjd);
					var setYear = YearDate(newtime, newjd);
					var utcSetHour = UTCHourAMPMDate(newtime2, newjd2);
					var utcSetDay = UTCDayAMPMDate(newtime2, newjd2);
					
				}
				else if ( ((latitude > 66.4) && ((doy < 83) || (doy > 263))) ||
					((latitude < -66.4) && (doy > 79) && (doy < 267)) )
				{
					newjd = findRecentSunset(JD, latitude, longitude);
					var newjd2 = findRecentSunset(JD, latitude, longitude);
					newtime = calcSunsetUTC(newjd, latitude, longitude)
						 - (60 * zone) + daySavings;
					var newtime2 = calcSunsetUTC(newjd, latitude, longitude);
					if (newtime > 1440)
					{
						newtime -= 1440;
						newjd += 1.0;
					}
					if (newtime < 0)
					{
						newtime += 1440;
						newjd -= 1.0;
					}
					cityLatLong["sunset"].value = 
						timeStringAMPMDate(newtime, newjd);
					var setStr = timeStringAMPMDate(newtime, newjd);
					var setYear = YearDate(newtime, newjd);
					var utcSetHour = UTCHourAMPMDate(newtime2, newjd2);
					var utcSetDay = UTCDayAMPMDate(newtime2, newjd2);
					

				}
				else 
				{
					alert ("Cannot Find Sunset!");
					
				}
			}
		}
		
		
		// iCal Code Here -----------------------------------------------------------------
		
		var tbl = document.getElementById('SunTable').getElementsByTagName("TBODY")[0];
		var tble = document.getElementById('SunTable');
		var lastRow = tble.rows.length;
		var suncity = cityLatLong["City"].value;
		var sunprov = cityLatLong["Province"].value;
		
		//var sunrisetime = riseStr;
		//var suncat = "Sunrise";
		
		var sunyear = cityLatLong["year"].value;
		//var sunmonth = cityLatLong.mos.selectedIndex + 1;
		//if (sunmonth < 10)
		//{
		//	sunmonth = "0" + (cityLatLong.mos.selectedIndex + 1);
		//}
		//var sunday= cityLatLong["day"].value;
		//if (sunday< 10)
		//{
		//	sunday= "0" + (cityLatLong["day"].value);
		//}
		
		var UTCDateLen = utcRiseDay.length;
		var utcRiseDaydig = utcRiseDay.substr(0,2);
		var utcRiseMonthdig = utcRiseDay.substr(2,3);
		if (utcRiseMonthdig == "Jan") 
				utcRiseMonthdig = "01";
			else if (utcRiseMonthdig == "Feb") 
				utcRiseMonthdig = "02";
			else if (utcRiseMonthdig == "Mar") 
				utcRiseMonthdig = "03";
			else if (utcRiseMonthdig == "Apr") 
				utcRiseMonthdig = "04";
			else if (utcRiseMonthdig == "May") 
				utcRiseMonthdig = "05";
			else if (utcRiseMonthdig == "Jun") 
				utcRiseMonthdig = "06";
			else if (utcRiseMonthdig == "Jul") 
				utcRiseMonthdig = "07";
			else if (utcRiseMonthdig == "Aug") 
				utcRiseMonthdig = "08";
			else if (utcRiseMonthdig == "Sep") 
				utcRiseMonthdig = "09";
			else if (utcRiseMonthdig == "Oct") 
				utcRiseMonthdig = "10";
			else if (utcRiseMonthdig == "Nov") 
				utcRiseMonthdig = "11";
			else if (utcRiseMonthdig == "Dec") 
				utcRiseMonthdig = "12";
			
		var UTCDateLen = utcSetDay.length;
		var utcSetDaydig = utcSetDay.substr(0,2);
		var utcSetMonthdig = utcSetDay.substr(2,3);
		if (utcSetMonthdig == "Jan") 
				utcSetMonthdig = "01";
			else if (utcSetMonthdig == "Feb") 
				utcSetMonthdig = "02";
			else if (utcSetMonthdig == "Mar") 
				utcSetMonthdig = "03";
			else if (utcSetMonthdig == "Apr") 
				utcSetMonthdig = "04";
			else if (utcSetMonthdig == "May") 
				utcSetMonthdig = "05";
			else if (utcSetMonthdig == "Jun") 
				utcSetMonthdig = "06";
			else if (utcSetMonthdig == "Jul") 
				utcSetMonthdig = "07";
			else if (utcSetMonthdig == "Aug") 
				utcSetMonthdig = "08";
			else if (utcSetMonthdig == "Sep") 
				utcSetMonthdig = "09";
			else if (utcSetMonthdig == "Oct") 
				utcSetMonthdig = "10";
			else if (utcSetMonthdig == "Nov") 
				utcSetMonthdig = "11";
			else if (utcSetMonthdig == "Dec") 
				utcSetMonthdig = "12";

		
		
		if (!nosunrise)
		{
			var sunrisetime = CalSunTime(riseStr, utcRiseHour);
			sunmonth = utcRiseMonthdig;
			sunday = utcRiseDaydig;
			var sunriseURL = "<a href=\"icalgen.asp?";
			sunriseURL += "dt=" + sunyear + sunmonth + sunday;
			sunriseURL += "T" + sunrisetime + "00";
			sunriseURL += "&stloc=" + suncity + ", " + sunprov;
			sunriseURL += "&i=1";
			sunriseURL += "\"><img border=\"0\" src=\"images/Event01.jpg\" width=\"63\" height=\"42\"></a>";
		}
		else if(nosunrise)
		{
			sunmonth = utcRiseMonthdig;
			sunday = utcRiseDaydig;
			sunyear = riseYear;
			var sunrisetime = CalSunTime(riseStr, utcRiseHour);
			var sunriseURL = "<a href=\"icalgen.asp?";
			sunriseURL += "dt=" + sunyear + sunmonth + sunday;
			sunriseURL += "T" + sunrisetime + "00";
			sunriseURL += "&stloc=" + suncity + ", " + sunprov;
			sunriseURL += "&i=1";
			sunriseURL += "\"><img border=\"0\" src=\"images/Event01.jpg\" width=\"63\" height=\"42\"></a>";
		}
		
		if (!nosunset)
		{
			var sunsettime = CalSunTime(setStr, utcSetHour);
			sunmonth = utcSetMonthdig;
			sunday = utcSetDaydig;
			var sunsetURL = "<a href=\"icalgen.asp?";
			sunsetURL += "dt=" + sunyear + sunmonth + sunday;
			sunsetURL += "T" + sunsettime + "00";
			sunsetURL += "&stloc=" + suncity + ", " + sunprov;
			sunsetURL += "&i=2";
			sunsetURL += "\"><img border=\"0\" src=\"images/Event01.jpg\" width=\"63\" height=\"42\"></a>";
		}
		else if(nosunset)
		{
			sunmonth = utcSetMonthdig;
			sunday = utcSetDaydig;
			sunyear = setYear;
			var sunsettime = CalSunTime(setStr, utcSetHour);
			var sunsetURL = "<a href=\"icalgen.asp?";
			sunsetURL += "dt=" + sunyear + sunmonth + sunday;
			sunsetURL += "T" + sunsettime + "00";
			sunsetURL += "&stloc=" + suncity + ", " + sunprov;
			sunsetURL += "&i=2";
			sunsetURL += "\"><img border=\"0\" src=\"images/Event01.jpg\" width=\"63\" height=\"42\"></a>";
		}
		
		if (lastRow > 2)
		{
			document.getElementById('SunTable').deleteRow(2);
		}
		
    	var row = document.createElement("TR");
    	var sunriseinfo = document.createElement("TD");
    	sunriseinfo.setAttribute('align', 'center');
    	sunriseinfo.appendChild(document.createTextNode(""));
    	sunriseinfo.innerHTML=sunriseURL;
    	
    	var sunsetinfo = document.createElement("TD");
    	sunsetinfo.setAttribute('align', 'center');
    	sunsetinfo.appendChild(document.createTextNode(""));
    	sunsetinfo.innerHTML=sunsetURL;
    	
    	row.appendChild(sunriseinfo);
    	row.appendChild(sunsetinfo);
    	tbl.appendChild(row);
    	
	}

//*********************************************************************/



	

//  End -->

