var today = new Date();
	
// check for Leap Year
var yr = today.getYear();
if (yr < 1000)
{
	yr = yr + 1900;
}		
var leapYear=((yr % 4 == 0 && yr % 100 != 0) || yr % 400 == 0);
	
// load monthList and account for LeapYear
monthList = new Array();
i = 0;
monthList[i++] = new amonth("January", 31);
if (leapYear)
{
	monthList[i++] = new amonth("February", 29);
}
else
{
	monthList[i++] = new amonth("February", 28);
}
monthList[i++] = new amonth("March", 31);
monthList[i++] = new amonth("April", 30);
monthList[i++] = new amonth("May", 31);
monthList[i++] = new amonth("June", 30);
monthList[i++] = new amonth("July", 31);
monthList[i++] = new amonth("August", 31);
monthList[i++] = new amonth("September", 30);
monthList[i++] = new amonth("October", 31);
monthList[i++] = new amonth("November", 30);
monthList[i++] = new amonth("December", 31);

var nextFriday = getToday(0);

if('True'==strDST)
{
	strDST = true;
}
else
{
	strDST = false;
}

function getToday(type)
{
	var today = new Date();
	//waitDays = 0 for Friday
	var waitDays = 5 - today.getDay();
	
	//aFriday will be date of coming Friday
	var aFriday = today.getDate() + waitDays;
	
	var comingFriday = new Date();
	comingFriday.setDate(aFriday);
	//alert(comingFriday);
	//alert(type);
	if((type!=0)&&(type!=1))
	{
		//document.all['today'].innerHTML="Today:<br><br>" + doDay(today.getDay()) + ", " + doMonth(today.getMonth()) + " " + today.getDate() + ", " + today.getFullYear() +"<br>";
		return "Today:<br><br>" + doDay(today.getDay()) + ", " + doMonth(today.getMonth()) + " " + today.getDate() + ", " + today.getFullYear() +"<br>";
	}
	else if (type!=1)
	{
		return comingFriday
	}
	else
	{
		return doDay(comingFriday.getDay()) + ", " + doMonth(comingFriday.getMonth()) + " " + comingFriday.getDate() + ", " + comingFriday.getFullYear();
	}
}

function getThisFriday(candleDate)
{
	var canDate = new Date(candleDate);

	var aFriday;
	//var makeFriday = new Date();
	
	// adjust to coming Friday
	// waitDays = 0 for Friday
	var waitDays = 5 - today.getDay();
	
	//aFriday will be date of coming Friday
	var aFriday = today.getDate() + waitDays;
		
	// create this friday candle time
	var showFriday = candleTimes[1];

	return showFriday;
}

function getFriday(candleTimes,isSearch)
{
	var today = new Date();
	var aFriday;
	//var makeFriday = new Date();
	
	// adjust to coming Friday
	// waitDays = 0 for Friday
	var waitDays = 5 - today.getDay();
	
	//aFriday will be date of coming Friday
	var aFriday = today.getDate() + waitDays;
		
	if(isSearch != 'yes')
	{			
		// create this friday candle time
		var showFriday = candleTimes[0];
	}
	else
	{		
		// create this friday and the next three
		var fourFridays = new Array();
		
		for (var i=0;i<=3;i++)
		{
			fourFridays[i] = new Date();
			fourFridays[i].setDate(aFriday);
			aFriday = aFriday + 7;	
		}
		
		var showFriday= new Array();
		for (var i=0;i<4;i++)
		{
			var timeDate = new Array();
			timeDate[1] = doDay(fourFridays[i].getDay())+ ', ' + doMonth(fourFridays[i].getMonth(),1)+ ' ' + fourFridays[i].getDate() + ', ' + fourFridays[i].getFullYear();
			timeDate[2] = candleTimes[i];
			showFriday[showFriday.length] = timeDate;
		}
	}
	return showFriday;
}

function doDay(thisDay)
{
	var strDay;
	
	switch(thisDay)
	{
		case 0:
			strDay = "Sunday";
			break;
		case 1:
			strDay = "Monday";
			break;
		case 2:
			strDay = "Tuesday";
			break;
		case 3:
			strDay = "Wednesday";
			break;
		case 4:
			strDay = "Thursday";
			break;
		case 5:
			strDay = "Friday";
			break;
		case 6:
			strDay = "Saturday";
			break;
	}
	return strDay;
}

function doMonth(thisMonth)
{
	var strMonth;
	
	switch(thisMonth)
	{
		case 0:
			strMonth = "January";
			break;
		case 1:
			strMonth = "February";
			break;
		case 2:
			strMonth = "March";
			break;
		case 3:
			strMonth = "April";
			break;
		case 4:
			strMonth = "May";
			break;
		case 5:
			strMonth = "June";
			break;
		case 6:
			strMonth = "July";
			break;
		case 7:
			strMonth = "August";
			break;
		case 8:
			strMonth = "September";
			break;
		case 9:
			strMonth = "October";
			break;
		case 10:
			strMonth = "November";
			break;
		case 11:
			strMonth = "December";
			break;
	}
	return strMonth;
}

function amonth(name, numdays) 
{
	this.name = name;
	this.numdays = numdays;
}

function calcShabbosLST(comingFriday,latitude,longitude,zone,dst,isSearch)
{
	//alert(latitude);
	//alert(longitude);
	
	var julFriday = calcJulian(comingFriday);
	//alert("julFriday: " + julFriday);
	
	var startDST=findDST(2,8,0);
	//alert("startDST: " + startDST);
	startDST = calcJulian(startDST);
	//alert("startDST: " + startDST);
	var endDST=findDST(10,1,0);
	//alert("endDST: " + endDST);
	endDST = calcJulian(endDST);
	//alert("endDST: " + endDST);
	
	// make this dependent on date and DST status
	//alert(dst);
	if (dst)
	{
		var adjustDST=60;
	}
	else
	{
		var adjustDST=0;
	}
	
	var candleTimes = new Array();
	for (i=0;i<4;i++)
	{
		var candles = calcSunsetGMT(julFriday, latitude, longitude);
		//alert("candles: "+candles);
		//alert("startDST: "+startDST);
		//alert("julFriday: "+julFriday);
		//alert("endDST: "+endDST);
		//alert("zone: "+zone);
		if (julFriday>=startDST && julFriday<=endDST)
		{
			var candlesLST = candles - (60 * zone) + adjustDST - 18; // DST 
		}
			else
		{
			var candlesLST = candles - (60 * zone) - 18;
		}
		//alert(candlesLST);
		var setCan = timeString(candlesLST);
		//alert("setCan: " + setCan);
		candleTimes[candleTimes.length] = setCan;
		var gregFriday = jdayToDate(julFriday);
		//alert(setCan + " -- " + gregFriday);
		
		julFriday=julFriday + 7
		
		if (leapYear)
		{
			if (julFriday > 366)
			{
				julFriday = julFriday - 365;
			}
		}
		else
		{
			if (julFriday > 365)
			{
				julFriday = julFriday - 365;
			}
		}
	}
	//alert(candleTimes);
	var strCandles = getFriday(candleTimes,isSearch);
	//alert(strCandles);
	return strCandles;
}

// gives julian value for passed day
function calcJulian(aDay) 
{
	return calcJulianDay(aDay.getMonth(), aDay.getDate());
}
// does the real calculation for specific month and day
function calcJulianDay(mn, dy) 
{
	var i = 0;
	var julDay = 0;
	// tally up previous months
	for (i = 0; i < mn; i++)
	{
		julDay += monthList[i].numdays;
	}
	// add day for this month
	julDay += dy;
	return julDay;
}

// finds DST start and end dates for current year, returns value to be 
// converted to julian
function findDST(month,earliest,dayOfWeek)
{
	var changeDate = new Date(yr, month, earliest);
	while (changeDate.getDay() != dayOfWeek)
	{
		changeDate = new Date(yr, month, earliest++);
	}
	return changeDate;
}

function calcSunsetGMT(julDay, latitude, longitude)
{
	var gamma = calcGamma(julDay + 1);
	var eqTime = calcEqofTime(gamma);
	var solarDec = calcSolarDec(gamma);
	var hourAngle = calcHourAngle(latitude, solarDec, 0);
	var delta = longitude - radToDeg(hourAngle);
	var timeDiff = 4 * delta;
	var setTimeGMT = 720 + timeDiff - eqTime;
	var gamma_sunset = calcGamma2(julDay, setTimeGMT/60);
	eqTime = calcEqofTime(gamma_sunset);
	solarDec = calcSolarDec(gamma_sunset);
	hourAngle = calcHourAngle(latitude, solarDec, 0);
	delta = longitude - radToDeg(hourAngle);
	timeDiff = 4 * delta;
	setTimeGMT = 720 + timeDiff - eqTime;
	return setTimeGMT;
}

function calcGamma(julianDay)
{
	return (2 * Math.PI / 365) * (julianDay - 1);
}

function calcEqofTime(gamma)
{
	return (229.18 * (0.000075 + 0.001868 * Math.cos(gamma) - 0.032077 * Math.sin(gamma) - 0.014615 * Math.cos(2 * gamma) - 0.040849 * Math.sin(2 * gamma)));
}
	
function calcSolarDec(gamma)
{
	return (0.006918 - 0.399912 * Math.cos(gamma) + 0.070257 * Math.sin(gamma) - 0.006758 * Math.cos(2 * gamma) + 0.000907 * Math.sin(2 * gamma));
}

function calcHourAngle(lat, solarDec, atime)
{
	var latRad = degToRad(lat);
	if (atime)
	{
		return (Math.acos(Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(solarDec))-Math.tan(latRad) * Math.tan(solarDec)));
	}
	else
	{
		return -(Math.acos(Math.cos(degToRad(90.833))/(Math.cos(latRad)*Math.cos(solarDec))-Math.tan(latRad) * Math.tan(solarDec)));		
	}
}
	
function radToDeg(angleRad) 
{
	return (180 * angleRad / Math.PI);
}
	
function degToRad(angleDeg) 
{
	return (Math.PI * angleDeg / 180);
}
	
function calcGamma2(julianDay, hour)
{
	return (2 * Math.PI / 365) * (julianDay - 1 + (hour/24));
}

// converts to readable time of day
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);
	if (second >= 30)
	{
		minute = minute + 1;
		if (minute==60)
		{
			minute=0;
			hour = hour+1;
		}
	}
	if (hour > 12)
	{
		hour = hour -12;
		ap = "p";
	}
	else
	{
		ap = "a";
	}
	var timeStr = hour + ":";
	if (minute < 10)
	{
		timeStr += "0" + minute;
	}
	else
	{
		timeStr += minute;
	}
	timeStr = timeStr + ap;
	return timeStr;
}

// back to Gregorian
function jdayToDate(jday)
{
	var strDate = "";
	var twoday = jday;
	var mon = 0;
		for (j=0; j<12; j++) 
		{
			if (twoday > monthList[j].numdays)
			{
				mon ++;
				twoday -= monthList[j].numdays;
			}
			else 
			{
				j = 12;
			}
		}
	strDate = monthList[mon].name + " " + twoday;
	return strDate;
}

