function month(name,numdays,abbr){this.name=name;this.numdays=numdays;this.abbr=abbr}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");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 radToDeg(angleRad){return(180*angleRad/Math.PI)}function degToRad(angleDeg){return(Math.PI*angleDeg/180)}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;return((day<10?"0":"")+day+monthList[month-1].abbr)}function calcTimeJulianCent(jd){var T=(jd-2451545)/36525;return T}function calcJDFromJulianCent(t){var JD=t*36525+2451545;return JD}function calcGeomMeanLongSun(t){var L0=280.46646+t*(36000.76983+0.0003032*t);while(L0>360){L0-=360}while(L0<0){L0+=360}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+1.267e-7*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.815+t*(0.00059-t*(0.001813)));var e0=23+(26+(seconds/60))/60;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);y*=y;var sin2l0=Math.sin(2*degToRad(l0));var sinm=Math.sin(degToRad(m));var cos2l0=Math.cos(2*degToRad(l0));var sin4l0=Math.sin(4*degToRad(l0));var sin2m=Math.sin(2*degToRad(m));var Etime=y*sin2l0-2*e*sinm+4*e*y*sinm*cos2l0-0.5*y*y*sin4l0-1.25*e*e*sin2m;return radToDeg(Etime)*4}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 noonmin=calcSolNoonUTC(t,longitude);var tnoon=calcTimeJulianCent(JD+noonmin/1440);var eqTime=calcEquationOfTime(tnoon);var solarDec=calcSunDeclination(tnoon);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);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 tnoon=calcTimeJulianCent(calcJDFromJulianCent(t)+longitude/360);var eqTime=calcEquationOfTime(tnoon);var solNoonUTC=720+(longitude*4)-eqTime;var newt=calcTimeJulianCent(calcJDFromJulianCent(t)-0.5+solNoonUTC/1440);eqTime=calcEquationOfTime(newt);solNoonUTC=720+(longitude*4)-eqTime;return solNoonUTC}function calcSunsetUTC(JD,latitude,longitude){var t=calcTimeJulianCent(JD);var noonmin=calcSolNoonUTC(t,longitude);var tnoon=calcTimeJulianCent(JD+noonmin/1440);var eqTime=calcEquationOfTime(tnoon);var solarDec=calcSunDeclination(tnoon);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);eqTime=calcEquationOfTime(newt);solarDec=calcSunDeclination(newt);hourAngle=calcHourAngleSunset(latitude,solarDec);delta=longitude-radToDeg(hourAngle);timeDiff=4*delta;timeUTC=720+timeDiff-eqTime;return timeUTC}function findRecentSunrise(jd,latitude,longitude){var julianday=jd;var time=calcSunriseUTC(julianday,latitude,longitude);while(!isNumber(time)){julianday-=1;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;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;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;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+0.5);if(second>59){second=0;minute+=1}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+0.5);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}if(hour<0){hour+=24;daychange=true;julianday-=1}return{hour:hour,min:minute}}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+0.5);minute+=(second>=30)?1:0;if(minute>=60){minute-=60;hour++}if(hour>23){hour-=24;julianday+=1}if(hour<0){hour+=24;julianday-=1}var PM=false;if(hour>12){hour-=12;PM=true}if(hour==12){PM=true}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 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+0.5);minute+=(second>=30)?1:0;if(minute>=60){minute-=60;hour++}var daychange=false;if(hour>23){hour-=24;julianday+=1;daychange=true}if(hour<0){hour+=24;julianday-=1;daychange=true}var timeStr=hour+":";if(minute<10){timeStr+="0"+minute}else{timeStr+=minute}if(daychange){return timeStr+" "+calcDayFromJD(julianday)}return timeStr}function DSTdatesUS(yr){if(yr<1987){return}var don=(yr<2007)?38:14;var dof=(yr<2007)?31:38;var DSTon=new Date(yr,2,don,2);var DSToff=new Date(yr,9,dof,2);DSTon.setDate(DSTon.getDate()-DSTon.getDay());DSToff.setDate(DSToff.getDate()-DSToff.getDay());return[DSTon,DSToff]}function IsDST(theDate){if(theDate==null){return false}var year=theDate.getFullYear();var dst=this.DSTdatesUS(year);if(theDate>dst[0]&&theDate<dst[1]){return true}else{return false}}function calcSun(latitude,longitude){if((latitude>=-90)&&(latitude<-89)){latitude=-89}if((latitude<=90)&&(latitude>89)){latitude=89}longitude=-longitude;var riseSetForm=new Object();var today=new Date();var today_month=today.getMonth()+1;var today_year=today.getFullYear();var today_day=today.getDate();var offset=today.getTimezoneOffset();var JD=calcJD(parseFloat(today_year),today_month,parseFloat(today_day));var dow=calcDayOfWeek(JD);var doy=calcDayOfYear(today_month,parseFloat(today_day),isLeapYear(today_year));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 daySavings=0;var zone=offset/60;if(zone>12||zone<-12.5){zone=0}if(!nosunrise){var riseTimeLST=riseTimeGMT-(60*zone)+daySavings;var riseStr=timeStringShortAMPM(riseTimeLST,JD);var utcRiseStr=timeStringDate(riseTimeGMT,JD);riseSetForm.sunrise=riseStr;riseSetForm.utcsunrise=utcRiseStr}if(!nosunset){var setTimeLST=setTimeGMT-(60*zone)+daySavings;var setStr=timeStringShortAMPM(setTimeLST,JD);var utcSetStr=timeStringDate(setTimeGMT,JD);riseSetForm.sunset=setStr;riseSetForm.utcsunset=utcSetStr}var solNoonGMT=calcSolNoonUTC(T,longitude);var solNoonLST=solNoonGMT-(60*zone)+daySavings;var solnStr=timeString(solNoonLST);var utcSolnStr=timeString(solNoonGMT);riseSetForm.solnoon=solnStr;riseSetForm.utcsolnoon=utcSolnStr;var tsnoon=calcTimeJulianCent(calcJDFromJulianCent(T)-0.5+solNoonGMT/1440);eqTime=calcEquationOfTime(tsnoon);solarDec=calcSunDeclination(tsnoon);riseSetForm.eqTime=(Math.floor(100*eqTime))/100;riseSetForm.solarDec=(Math.floor(100*(solarDec)))/100;if(nosunrise){riseSetForm.utcsunrise="";if(((latitude>66.4)&&(doy>79)&&(doy<267))||((latitude<-66.4)&&((doy<83)||(doy>263)))){newjd=findRecentSunrise(JD,latitude,longitude);newtime=calcSunriseUTC(newjd,latitude,longitude)-(60*zone)+daySavings;if(newtime>1440){newtime-=1440;newjd+=1}if(newtime<0){newtime+=1440;newjd-=1}riseSetForm.sunrise=timeStringAMPMDate(newtime,newjd);riseSetForm.utcsunrise="prior sunrise"}else{if(((latitude>66.4)&&((doy<83)||(doy>263)))||((latitude<-66.4)&&(doy>79)&&(doy<267))){newjd=findNextSunrise(JD,latitude,longitude);newtime=calcSunriseUTC(newjd,latitude,longitude)-(60*zone)+daySavings;if(newtime>1440){newtime-=1440;newjd+=1}if(newtime<0){newtime+=1440;newjd-=1}riseSetForm.sunrise=timeStringAMPMDate(newtime,newjd);riseSetForm.utcsunrise="next sunrise"}else{}}}if(nosunset){riseSetForm.utcsunset="";if(((latitude>66.4)&&(doy>79)&&(doy<267))||((latitude<-66.4)&&((doy<83)||(doy>263)))){newjd=findNextSunset(JD,latitude,longitude);newtime=calcSunsetUTC(newjd,latitude,longitude)-(60*zone)+daySavings;if(newtime>1440){newtime-=1440;newjd+=1}if(newtime<0){newtime+=1440;newjd-=1}riseSetForm.sunset=timeStringAMPMDate(newtime,newjd);riseSetForm.utcsunset="next sunset";riseSetForm.utcsolnoon=""}else{if(((latitude>66.4)&&((doy<83)||(doy>263)))||((latitude<-66.4)&&(doy>79)&&(doy<267))){newjd=findRecentSunset(JD,latitude,longitude);newtime=calcSunsetUTC(newjd,latitude,longitude)-(60*zone)+daySavings;if(newtime>1440){newtime-=1440;newjd+=1}if(newtime<0){newtime+=1440;newjd-=1}riseSetForm.sunset=timeStringAMPMDate(newtime,newjd);riseSetForm.utcsunset="prior sunset";riseSetForm.solnoon="N/A";riseSetForm.utcsolnoon=""}else{}}}var sunrise=riseSetForm.sunrise;if(!sunrise){sunrise={hour:6,min:0}}var sunset=riseSetForm.sunset;if(!sunset){sunset={hour:18,min:0}}var sunsetd=new Date(today_year,today_month-1,today_day,sunset.hour,sunset.min);var sunrised=new Date(today_year,today_month-1,today_day,sunrise.hour,sunrise.min);moonhour=sunset.hour+3;if(moonhour>23){moonhour=23}var moonsetd=new Date(today_year,today_month-1,today_day,moonhour,0);return{sunrise:sunrised,sunset:sunsetd,moonset:moonsetd}};