var today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);

var startdate = new Date('January 17, 2005 00:00:00');

if(today < startdate)
	today = startdate;
	
var eventtoday = today;
	
today = fixSummer(today);
today = fixWinter(today);

var enddate = new Date("August 10, 2008 00:00:00");

function getInitialDate(givenmonth, givenday, givenyear, timestampfield, datedisplaydiv, simpledatefield, caldisplaydiv)
{
	if(givenmonth == '' || givenday == '' || givenyear == '')
		givendate = today;
	else
		givendate = new Date(givenyear, givenmonth -1, givenday, 0, 0, 0);
		
	timestampfield.value = givendate.getDate() + '-' + (givendate.getMonth() + 1) + '-' + givendate.getFullYear() + ' ' + givendate.getHours() + ':' + givendate.getMinutes() + ':' + givendate.getSeconds();
	datedisplaydiv.innerHTML = getWeekDay(givendate) + ', ' + getMonthName(givendate) + ' ' + givendate.getDate() + ', ' + givendate.getFullYear(); //givendate.toLocaleString().substr(0, givendate.toLocaleString().length - 12);
	simpledatefield.value = (givendate.getMonth() + 1) + '/' + givendate.getDate() + '/' + givendate.getFullYear();
	caldisplaydiv.innerHTML = '<a href="javascript:show_calendar(\'document.form1.' + timestampfield.name + '\', document.form1.' + timestampfield.name + '.value, \'document.getElementById(\\\'' + datedisplaydiv.id + '\\\')\', \'document.form1.' + simpledatefield.name + '\');"><img src="/images/calendar/cal.gif" width="16" height="16" border="0" alt="Change date"></a>';
}


function getInitialDateEvents(givenmonth, givenday, givenyear, timestampfield, datedisplaydiv, simpledatefield, caldisplaydiv)
{
	if(givenmonth == '' || givenday == '' || givenyear == '')
		givendate = eventtoday;
	else
		givendate = new Date(givenyear, givenmonth -1, givenday, 0, 0, 0);
		
	timestampfield.value = givendate.getDate() + '-' + (givendate.getMonth() + 1) + '-' + givendate.getFullYear() + ' ' + givendate.getHours() + ':' + givendate.getMinutes() + ':' + givendate.getSeconds();
	datedisplaydiv.innerHTML = getWeekDay(givendate) + ', ' + getMonthName(givendate) + ' ' + givendate.getDate() + ', ' + givendate.getFullYear(); //givendate.toLocaleString().substr(0, givendate.toLocaleString().length - 12);
	simpledatefield.value = (givendate.getMonth() + 1) + '/' + givendate.getDate() + '/' + givendate.getFullYear();
	caldisplaydiv.innerHTML = '<a href="javascript:show_calendar(\'document.form1.' + timestampfield.name + '\', document.form1.' + timestampfield.name + '.value, \'document.getElementById(\\\'' + datedisplaydiv.id + '\\\')\', \'document.form1.' + simpledatefield.name + '\');"><img src="/images/calendar/cal.gif" width="16" height="16" border="0" alt="Change date"></a>';
}


function toggleStock(givenmonth, givenday, givenyear, timestampfield, stock, stockfield, datedisplaydiv, simpledatefield, caldisplaydiv)
{
	if(stock)
	{
		stockfield.checked = true;
		datedisplaydiv.innerHTML = '(no date)';
		simpledatefield.value = 'NULL';
		caldisplaydiv.innerHTML = '<img src="images/cal_disabled.gif" width="16" height="16" border="0">';
	}
	else
	{
		stockfield.checked = false;
		caldisplaydiv.innerHTML = '<a href="javascript:show_calendar(\'document.form1.' + timestampfield.name + '\', document.form1.' + timestampfield.name + '.value, \'document.getElementById(\\\'' + datedisplaydiv.name + '\\\')\', \'document.form1.' + simpledatefield.name + '\');"><img src="/images/calendar/cal.gif" width="16" height="16" border="0" alt="Change date"></a>';
		getInitialDate(givenmonth, givenday, givenyear, timestampfield, datedisplaydiv, simpledatefield, caldisplaydiv)
	}
}

function duringSummer(stamp)
{
	var summer_start, summer_end;
	var summer2005_start, summer2005_end;
	var summer2006_start, summer2006_end;
	var summer2007_start, summer2007_end;
	var summer2008_start, summer2008_end;
	
	summer2005_start = new Date("May 23, 2005 00:00:00");
	summer2005_end = new Date("August 14, 2005 00:00:00");
	summer2006_start = new Date("May 22, 2006 00:00:00");
	summer2006_end = new Date("August 13, 2006 00:00:00");
	summer2007_start = new Date("May 21, 2007 00:00:00");
	summer2007_end = new Date("August 12, 2007 00:00:00");
	summer2008_start = new Date("May 19, 2008 00:00:00");
	summer2008_end = new Date("August 10, 2008 00:00:00"); //UNVERIFIED

	switch(stamp.getFullYear())
	{
		case 2005: 	summer_start = summer2005_start; 
								summer_end = summer2005_end;
								break;
		case 2006: 	summer_start = summer2006_start; 
								summer_end = summer2006_end;
								break;
		case 2007: 	summer_start = summer2007_start; 
								summer_end = summer2007_end;
								break;
		case 2008: 	summer_start = summer2008_start; 
								summer_end = summer2008_end;
								break;
		default: 	 	summer_start = summer2006_start;
								summer_end = summer2005_end;
								break;
	}

	if(stamp >= summer_start && stamp < summer_end)
		return true;
	else
		return false;
}

function duringWinter(stamp)
{
	var inWinter;
	var winter2005_start, winter2005_end;
	var winter2006_start, winter2006_end;
	
	// Winter 2005
	winter2005_start = new Date("December 19, 2005 00:00:00");
	winter2005_end = new Date("January 8, 2006 00:00:00");
	
	// Winter 2006 -- GUESSED AT DATES FOR TESTING PURPOSES
	winter2006_start = new Date("December 18, 2006 00:00:00");
	winter2006_end = new Date("January 7, 2007 00:00:00");
	
	inWinter = false;
	
	if(stamp >= winter2005_start && stamp < winter2005_end)
		inWinter = true;
	if(stamp >= winter2006_start && stamp < winter2006_end)
		inWinter = true;
	
	return inWinter;
}

function dayAfterSummerHoliday(stamp)
{
	// never allow weekends
	if(stamp.getDay() == 0 || stamp.getDay == 6)
		return false;
	
	// if all days between Monday and this date were holidays, allow this date
	var dtTemp;
	
	// set temp date to monday previous
	if(stamp.getDay() < 1)
	{
		dtTemp = dataAdd(stamp, 'D', -6);
	}
	else
	{
		dtTemp = dateAdd(stamp, 'D', ((stamp.getDay() - 1) * -1));
	}

	while(dtTemp.getTime() != stamp.getTime())
	{
		if(!duringHoliday(dtTemp))
			return false;
		dtTemp = dateAdd(dtTemp, 'D', 1);
	}
	
	return true;
	
	/*
	//replaced with code above
	if(duringSummer(dateAdd(stamp, 'D', -1)) && duringHoliday(dateAdd(stamp, 'D', -1)))
		return true;
	else
		return false;
	*/
}


function dayAfterWinterHoliday(stamp)
{
	// never allow weekends
	if(stamp.getDay() == 0 || stamp.getDay == 6)
		return false;
	
	// if all days between Monday and this date were holidays, allow this date
	var dtTemp;
	
	// set temp date to monday previous
	if(stamp.getDay() < 1)
	{
		dtTemp = dataAdd(stamp, 'D', -6);
	}
	else
	{
		dtTemp = dateAdd(stamp, 'D', ((stamp.getDay() - 1) * -1));
	}

	while(dtTemp.getTime() != stamp.getTime())
	{
		if(!duringHoliday(dtTemp))
			return false;
		dtTemp = dateAdd(dtTemp, 'D', 1);
	}
	
	return true;
}


function duringHoliday(stamp)
{
	var i;
	var dtNewYearsDay, dtMLKDay, dtGoodFriday, dtMemorialDay, dtIndependenceDay, dtLaborDay, dtThanksgiving;
	var dtDayAfterThanksgiving, dtChristmasEve, dtChristmasDay;
	var arrStaffAppreciationDay = new Array(2);
	var intThisYear;
	var arrHolidays = new Array(10);
	var dtTemp;
	
	intThisYear = stamp.getFullYear();
	
	// Holidays that fall on the same date every year
	dtNewYearsDay = dtMoveWeekendHoliday(intThisYear, 0, 1);
	dtIndependenceDay = dtMoveWeekendHoliday(intThisYear, 6, 4);
	dtChristmasEve = dtMoveWeekendHoliday(intThisYear, 11, 24);
	dtChristmasDay = dtMoveWeekendHoliday(intThisYear, 11, 25);
	
	// Holidays that fall on the Nth Weekday of a Month
	dtMLKDay = dtNthWeekdayOfMonth(0, intThisYear, 2, 3);					// Third Monday in January
	dtMemorialDay = dtNthWeekdayOfMonth(4, intThisYear, 2, 0);		// Last Monday in May
	dtLaborDay = dtNthWeekdayOfMonth(8, intThisYear, 2, 1);				// First Monday in September
	dtThanksgiving = dtNthWeekdayOfMonth(10, intThisYear, 5, 4);	// Fourth Thursday in November
	dtDayAfterThanksgiving = dateAdd(dtThanksgiving, 'd', 1);			// Day immediately following Thanksgiving
	
	// Good Friday
	dtGoodFriday = dateAdd(dtEaster(intThisYear), 'd', -2);				// Two days before Easter

	
	// Staff Appreciation Day - Different every year
	arrStaffAppreciationDay[0] = new Date("December 30, 2005 00:00:00")
	arrStaffAppreciationDay[1] = new Date("December 29, 2006 00:00:00")
	
	// Now check & fix date given as needed
	arrHolidays[0] = dtNewYearsDay
	arrHolidays[1] = dtMLKDay
	arrHolidays[2] = dtGoodFriday
	arrHolidays[3] = dtMemorialDay
	arrHolidays[4] = dtIndependenceDay
	arrHolidays[5] = dtLaborDay
	arrHolidays[6] = dtThanksgiving
	arrHolidays[7] = dtDayAfterThanksgiving
	arrHolidays[8] = dtChristmasEve
	arrHolidays[9] = dtChristmasDay
	
	for(i=0; i<arrHolidays.length; i++)
	{
		dtTemp = new Date(arrHolidays[i]);
		// MLK Day not celebrated until 2006
		if((stamp.getTime() == dtTemp.getTime()) && !(stamp.getFullYear() == 2005 && i == 1))
		{
			return true;
		}
	}

	for(i=0; i<arrStaffAppreciationDay.length; i++)
	{
		dtTemp = new Date(arrStaffAppreciationDay[i]);
		if(stamp.getTime() == dtTemp.getTime())
		{
			return true;
		}
	}

	return false;
}

function dtNthWeekdayOfMonth(intMonth, intYear, intWeekday, intN)
{
	// This function receives integers representing a month (0-11 inclusive), year, a day of the week, and a number of which 
	// weekday one wishes to find (0 indicates last weekday)
	
	var intDay, dtFirstWeekday;
	
	// Check if N is 0, indicating last weekday of month
	if(intN == 0)
	{
		if(intMonth < 11)
		{
			// Add 1 month to month given
			intMonth = intMonth + 1;
		}
		else
		{
			// Add 1 month and 1 year 
			intMonth = 1;
			intYear = intYear + 1;
		}
	}
	
	// Find first day of month given
	intDay = 1;

	while(intDay < 8)
	{
		dtFirstWeekday = new Date(intYear, intMonth, intDay, 0, 0, 0);
		if(dtFirstWeekday.getDay() + 1 == intWeekday)
			break;
		intDay = intDay + 1;
	}
	
	// If not looking for last weekday of month, add a multiple of 7 to it
	if(intN > 0)
		return dateAdd(dtFirstWeekday, 'D', (intN - 1) * 7);
	else
		return dateAdd(dtFirstWeekday, 'D', -7);
}


function dtEaster(intYear)
{
	var c, n, k, i, j, l, intMonth, intDay;
	c = intDiv(intYear, 100);
	n = intYear - 19 * intDiv(intYear, 19);
	k = intDiv((c - 17), 25);
	i = c - intDiv(c, 4) - intDiv((c - k), 3) + 19 * n + 15;
	i = i - 30 * intDiv(i, 30);
	i = i - intDiv(i, 28) * (1 - intDiv(i, 28) * intDiv(29, (i + 1)) * intDiv((21-n), 11));
	j = intYear + intDiv(intYear, 4) + i + 2 - c + intDiv(c, 4);
	j = j - 7 * intDiv(j, 7);
	l = i - j;
	intMonth = 3 + intDiv((l + 40), 44);
	intDay = l + 28 - 31 * intDiv(intMonth, 4);
	return (new Date(intYear, intMonth - 1, intDay, 0, 0, 0, 0));
}

function intDiv(num, dem)
{
	return ((num - (num % dem)) / dem);
}


function dtMoveWeekendHoliday(intYear, intMonth, intDay)
{
	dtDate = new Date(intYear, intMonth, intDay);
	dtChristmasDay = new Date(intYear, 11, 25);
	if(dtDate.getDay() == 0)
		return dateAdd(dtDate, 'D', 1);
	else if (dtDate.getDay() == 6)
		return dateAdd(dtDate, 'D', -1);
	else if ((dtDate.getTime() == dtChristmasDay.getTime()) && (dtDate.getDay() == 1))
	{
		// If Christmas Day falls on a Monday, it doesn't follow our weekend rules--
		// it's moved to Tuesday because Christmas Eve was moved to Monday	
		return dateAdd(dtDate, 'D', 1);
	}
	else
		return dtDate;
}


function getWeekDay(stamp)
{
	var dtstring = ''; 
	
	switch(stamp.getDay())
	{
		case 0: dtstring = 'Sunday'; break;
		case 1: dtstring = 'Monday'; break;
		case 2: dtstring = 'Tuesday'; break;
		case 3: dtstring = 'Wednesday'; break;
		case 4: dtstring = 'Thursday'; break;
		case 5: dtstring = 'Friday'; break;
		case 6: dtstring = 'Saturday'; break;
	}
	
	return dtstring;
}

function getMonthName(stamp)
{
	var dtstring;
	
	switch(stamp.getMonth())
	{
		case 0:	dtstring = 'January'; break;
		case 1: dtstring = 'February'; break;
		case 2: dtstring = 'March'; break;
		case 3: dtstring = 'April'; break;
		case 4: dtstring = 'May'; break;
		case 5: dtstring = 'June'; break;
		case 6: dtstring = 'July'; break;
		case 7: dtstring = 'August'; break;
		case 8: dtstring = 'September'; break;
		case 9: dtstring = 'October'; break;
		case 10: dtstring = 'November'; break;
		case 11: dtstring = 'December'; break;
	}
	
	return dtstring;
}


function fixSummer(stamp)
{
	if(duringSummer(stamp))
	{
		if(stamp.getDay() != 1)
		{
			// Switch to  Monday
			if(stamp.getDay() < 1)
			{
					stamp = dataAdd(stamp, 'D', -6);
			}
			else
			{
				stamp = dateAdd(stamp, 'D', ((stamp.getDay() - 1) * -1));
			}
		}
	}
	else
	{
		if(stamp.getDay() == 0 || stamp.getDay() == 6)
		{
			// Switch to next Monday
			
			if(stamp.getDay() == 0)
				stamp = dateAdd(stamp, 'D', 1)
			else
				stamp = dateAdd(stamp, 'D', 2)
			
			/*
			if(duringSummer(stamp))
			{
				// Switch to  Sunday
				stamp = dateAdd(stamp, 'D', -1);
			}
			*/
		}
	}

	return stamp;
}


function fixWinter(stamp)
{
	if(duringWinter(stamp))
	{
		if(stamp.getDay() != 1)
		{
			// Switch to  Monday
			if(stamp.getDay() < 1)
			{
					stamp = dateAdd(stamp, 'D', -6);
			}
			else
			{
				stamp = dateAdd(stamp, 'D', ((stamp.getDay() - 1) * -1));
			}
		}
	}
	else
	{
		if(stamp.getDay() == 0 || stamp.getDay() == 6)
		{
			// Switch to next Monday
			
			if(stamp.getDay() == 0)
				stamp = dateAdd(stamp, 'D', 1)
			else
				stamp = dateAdd(stamp, 'D', 2)
			
			/*
			if(duringWinter(stamp))
			{
				// Switch to  Sunday
				stamp = dateAdd(stamp, 'D', -1);
			}
			*/
		}
	}

	return stamp;
}


function dateAdd( start, interval, number ) {
	
    // get the milliseconds for this Date object. 
    var buffer = Date.parse( start ) ;
	
    // check that the start parameter is a valid Date. 
    if ( isNaN (buffer) ) {
        return null ;
    }
	
    // check that an interval parameter was not numeric. 
    if ( interval.charAt == 'undefined' ) {
        // the user specified an incorrect interval, handle the error. 
        return null ;
    }

    // check that the number parameter is numeric. 
    if ( isNaN ( number ) )	{
        return null ;
    }

    // so far, so good...
    //
    // what kind of add to do? 
    switch (interval.charAt(0))
    {
        case 'd': case 'D': 
            number *= 24 ; // days to hours
            // fall through! 
        case 'h': case 'H':
            number *= 60 ; // hours to minutes
            // fall through! 
        case 'm': case 'M':
            number *= 60 ; // minutes to seconds
            // fall through! 
        case 's': case 'S':
            number *= 1000 ; // seconds to milliseconds
            break ;
        default:
        // If we get to here then the interval parameter
        // didn't meet the d,h,m,s criteria.  Handle
        // the error. 		
        return null ;
    }
    return new Date( buffer + number ) ;
}



