/* ******************************** DATES.JS *******************************

These are date-specific functions, constants, etc.

By John Conti at RCS
Revised June 9, 2005

Usage:
	(1) Include this .JS file at the top of your webpage
	(2) Call the functions & reference constants as needed
*/

var resources = new Object ();

resources.res_Sunday    = "Sunday"
resources.res_Monday    = "Monday"
resources.res_Tuesday   = "Tuesday"
resources.res_Wednesday = "Wednesday"
resources.res_Thursday  = "Thursday"
resources.res_Friday    = "Friday"
resources.res_Saturday  = "Saturday"

resources.res_Sun = "Sun"
resources.res_Mon = "Mon"
resources.res_Tue = "Tue"
resources.res_Wed = "Wed"
resources.res_Thu = "Thu"
resources.res_Fri = "Fri"
resources.res_Sat = "Sat"

resources.res_SunAbbrev = "S"
resources.res_MonAbbrev = "M"
resources.res_TueAbbrev = "T"
resources.res_WedAbbrev = "W"
resources.res_ThuAbbrev = "T"
resources.res_FriAbbrev = "F"
resources.res_SatAbbrev = "S"

resources.res_January   = "January"
resources.res_February  = "February"
resources.res_March     = "March"
resources.res_April     = "April"
resources.res_May       = "May"
resources.res_June      = "June"
resources.res_July      = "July"
resources.res_August    = "August"
resources.res_September = "September"
resources.res_October   = "October"
resources.res_November  = "November"
resources.res_December  = "December"

resources.weekdayNames = new Array (
	resources.res_Sunday   
	,resources.res_Monday   
	,resources.res_Tuesday  
	,resources.res_Wednesday
	,resources.res_Thursday 
	,resources.res_Friday   
	,resources.res_Saturday 
	);

resources.monthNames = new Array (
	resources.res_January  
	,resources.res_February 
	,resources.res_March    
	,resources.res_April    
	,resources.res_May      
	,resources.res_June     
	,resources.res_July     
	,resources.res_August   
	,resources.res_September
	,resources.res_October  
	,resources.res_November 
	,resources.res_December 
	);

var locale = new Object ();
try
	{
	locale.dateFormat = top.date1;
	locale.dateFormat = locale.dateFormat.replace("05","mm");
	locale.dateFormat = locale.dateFormat.replace("5","m");
	locale.dateFormat = locale.dateFormat.replace("May","mm");
	locale.dateFormat = locale.dateFormat.replace("03","dd");
	locale.dateFormat = locale.dateFormat.replace("3","d");
	locale.dateFormat = locale.dateFormat.replace("1860","yyyy");
	locale.dateFormat = locale.dateFormat.replace("60","yy");
	locale.use4digitYear = (locale.dateFormat.indexOf("yyyy") != -1);
	locale.dateDelimiter = locale.dateFormat.substr(Math.min(locale.dateFormat.lastIndexOf("m"),locale.dateFormat.lastIndexOf("d")) + 1,1);

	locale.timeFormat = top.time1;
	locale.is24hr = top.time2.indexOf("23") != -1;
	locale.is12hr = top.time2.indexOf(" ") != -1;
	locale.amIndicator = (locale.is12hr) ? top.time1.substr(top.time1.indexOf(" ") + 1, 2) : null;
	locale.pmIndicator = (locale.is12hr) ? top.time2.substr(top.time2.indexOf(" ") + 1, 2) : null;
	locale.timeFormat = top.time1.indexOf("01") ? (locale.is12hr ? "h:mm:ss aa" : "H:mm:ss") : (locale.is12hr ? "hh:mm:ss aa" : "HH:mm:ss");
	}
catch (_e)
	{
	locale.dateFormat = "m/d/yy";
	locale.use4digitYear = false;
	locale.dateDelimiter = "/";

	locale.timeFormat = "h:mm:ss aa";
	locale.is24hr = false;
	locale.is12hr = true;
	locale.amIndicator = "am";
	locale.pmIndicator = "pm";
	}

var START_DATE = 0;
var END_DATE = 1;
var MYLOG_DATE = 2;

var whichDate = 0;
var theDate = new Date ();
var now = new Date ();

var daysInEachMonth = new Array (31,28,31,30,31,30,31,31,30,31,30,31);

var monthField = new Array ();
var dayField = new Array ();
var yearField = new Array ();

function initDateConstants ()
    {
	Date.MS_PER_DAY = 86400000;

    // these are all the current time on the indicated date
    //now = NOW = new Date ();
    Date.ONE_DAY_AGO = new Date (now.getTime() - (1 * Date.MS_PER_DAY));
	Date.ONE_WEEK_AGO = new Date (now.getTime() - (7 * Date.MS_PER_DAY));

    // these are all midnight of the indicated date -- better for compairing!
	Date.TODAY = new Date (now.getYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);

    var temp = new Date (Date.TODAY.getTime() - (1 * Date.MS_PER_DAY));
	Date.YESTERDAY = new Date (temp.getYear(), temp.getMonth(), temp.getDate(), 0, 0, 0, 0);

    temp = new Date (Date.TODAY.getTime() - (7 * Date.MS_PER_DAY));
	Date.LAST_WEEK = new Date (temp.getYear(), temp.getMonth(), temp.getDate(), 0, 0, 0, 0);
    }
initDateConstants();

var localeIsInitialized = false;

// set up the input fields according to the locale settings
function initLocale ()
	{
	if (localeIsInitialized)
		return;

	locale.dateIsMDY = false;
	locale.dateIsDMY = false;
	locale.dateIsYMD = false;

	if (locale.dateFormat.indexOf("m") == -1 || locale.dateFormat.indexOf("d") == -1 || locale.dateFormat.indexOf("yy") == -1)
		{
		alert("Locale settings not supported.  Use m/d/y, d/m/y or y/m/d.  [derriving format from: '"+date1+"']  ");
		locale.dateFormat = "m/d/yyyy";		// default
		locale.dateIsMDY = true;
		}
	else if (locale.dateFormat.indexOf("m") < locale.dateFormat.indexOf("d") && locale.dateFormat.indexOf("d") < locale.dateFormat.indexOf("yy"))			// mm/dd/yyyy
		locale.dateIsMDY = true;
	else if (locale.dateFormat.indexOf("d") < locale.dateFormat.indexOf("m") && locale.dateFormat.indexOf("d") < locale.dateFormat.indexOf("yy"))			// dd/mm/yyyy
		locale.dateIsDMY = true;
	else if (locale.dateFormat.indexOf("yy") < locale.dateFormat.indexOf("m") && locale.dateFormat.indexOf("m") < locale.dateFormat.indexOf("d"))			// yyyy/mm/dd
		locale.dateIsYMD = true;
	else
		{
		alert("Locale settings not supported.  Use m/d/y, d/m/y or y/m/d.  ");
		locale.dateFormat = "m/d/yyyy";		// default
		locale.dateIsMDY = true;
		}

	localeIsInitialized = true;
	}

// takes:  a JavaScript date,
// 		   an input field's index:  _index is 0=START_DATE or 1=END_DATE
function setDate (_when, _index)
	{
	initLocale();
	yearField[_index].value  = _when.getFullYear();
	monthField[_index].value = _when.getMonth() + 1;
	dayField[_index].value   = _when.getDate();
	}

// relies on global var whichDate having been set to 0=START_DATE or 1=END_DATE
function calculateNewDate ()
	{
	initLocale();
	var year = parseInt(yearField[whichDate].value);
	var month = parseInt(monthField[whichDate].value) - 1;
	var day = parseInt(dayField[whichDate].value);
	theDate = new Date (year, month, day, 0, 0, 0);
	}

// Caller supplied callback function for calendar -- YOU MUST HAVE THIS FUNCTION! --
function clickedDate (_when)
	{
	setDate(_when, whichDate);
	setTimeout("hideCalendar();", 100);
	}

// takes:    an input field's index
// returns:  a --US format-- date string
function getDateForCookie (_index)
	{
		initLocale();
		return (monthField[_index].value + "/" + dayField[_index].value + "/" + yearField[_index].value);
	}

// takes:    an index to which date in cookie
// returns:  a JavaScript date
function getJSDateFromCookie (_index)
	{
	initLocale();
	var myCookie = new Cookie (document, "searchChoices", 0);
	if (myCookie.retrieve() && myCookie != null)
		{
		var myDate = null;
		switch (_index)
			{
			case MYLOG_DATE:
				myDate = myCookie.myLogDate;
				break;
			case START_DATE:
				myDate = myCookie.startDate;
				break;
			case END_DATE:
				myDate = myCookie.endDate;
				break;
			}
		// did the cookie have a value in it?
		if (!myDate || typeof(myDate) == "undefined" || myDate == "undefined")
			return new Date ();
		var datePieces = myDate.split("/");
		if (!datePieces.length || datePieces.length != 3)
			return new Date ();
		var m = datePieces[0];
		var d = datePieces[1];
		var y = datePieces[2];
		return new Date (y, m, d, 0, 0, 0, 0);
		}
	else 
		return new Date ();
	}

// takes:   a --US format-- date string
// returns: a JavaScript date
function getJSDateFromString (_usDateString)
	{
	initLocale();

	var datePieces = _usDateString.split("/");
	
	if (!datePieces.length || datePieces.length != 3)
		return new Date ();
	
	var m = datePieces[0];
	var d = datePieces[1];
	var y = datePieces[2];
	
	return new Date (y, m, d, 0, 0, 0, 0);
	}

// takes:    an index to which date in cookie
// returns:  a --LOCALE format-- date string
function getStringDateFromCookie (_which)
	{
	initLocale();
	var myDate = null;
	switch (_which)
		{
		case MYLOG_DATE:
			myDate = myCookie.myLogDate;
			break;
		case START_DATE:
			myDate = myCookie.startDate;
			break;
		case END_DATE:
			myDate = myCookie.endDate;
			break;
		}
	if (!myDate || typeof(myDate) == "undefined" || myDate == "undefined")
		return getDateAsString(new Date ());
	var datePieces = myDate.split("/");
	if (!datePieces.length || datePieces.length != 3)
		return getDateAsString(new Date ());
	var m = datePieces[0];
	var d = datePieces[1];
	var y = datePieces[2];
	return getDateAsString(new Date (y, m, d, 0, 0, 0, 0));
	}

// takes a JavaScript date 
//   -OR- the date from the indexed input field 
//      -OR- a --US FORMAT-- date string
//
// returns a --LOCALE format-- date string
//
// 	 _argument is (a) 0=START_DATE or 1=END_DATE, --or-- (b) a valid JavaScript date --or-- (c) a date in string format
var storedDates = new Array ();
function getDateAsString (_argument, _localeDateFormat)
	{
	initLocale();

//alert("_argument = "+_argument);
	if (storedDates[_argument])
		return storedDates[_argument];

	var dateString, mm, dd, yy;
    dateString = (_localeDateFormat) ? _localeDateFormat : locale.dateFormat;
	// like "mm/dd/yyyy"

	// get mm, dd and yy from whatever we pass in
	if (_argument == START_DATE || _argument == END_DATE || _argument == MYLOG_DATE)
		{
//	alert("in if (_argument)");
		mm = parseInt(monthField[_argument].value % 100);
		dd = parseInt(dayField[_argument].value % 100);
		yy = parseInt(yearField[_argument].value  % 10000);
		}
	else
		{
		if (!_argument.getTime)
			_argument = new Date (_argument);
//	alert("in else");
		mm = parseInt(_argument.getMonth() + 1);
		dd = parseInt(_argument.getDate());
		yy = parseInt(_argument.getFullYear());
		}
	// convert our "mm/dd/yyyy" into "11/29/2005"
	dateString = dateString.replace("mm", (mm < 10 ? "0" : "") + mm);
	dateString = dateString.replace("m", mm);
	dateString = dateString.replace("dd", (dd < 10 ? "0" : "") + dd);
	dateString = dateString.replace("d", dd);
	dateString = dateString.replace("yyyy", yy);
	var y2d = yy % 100;
	dateString = dateString.replace("yy", (y2d < 10 ? "0" : "") + y2d);

	storedDates[_argument] = dateString;
	return dateString;
	}

// takes:    a JavaScript Date
// returns:  that object's time portion as a --LOCALE format-- string
function getTimeAsString (_which, _localeTimeFormat)
	{
	initLocale();
	var timeString, hh12, hh24, mm, ss, ampm;
    timeString = (_localeTimeFormat) ? _localeTimeFormat : locale.timeFormat;

	if (!_which.getTime)
		{
		now = new Date ();
		_which = new Date (now.toDateString() + " " + _which);
		}
	hh12 = parseInt(_which.getHours());
	ampm = (hh12 == 0 ? "mid" : (hh12 == 12 ? "noon" : (hh12 < 12 ? locale.amIndicator : locale.pmIndicator)));
	hh12 = (hh12 == 0 || hh12 == 12) ? 12 : hh12 % 12;
	hh24 = parseInt(_which.getHours());
	mm = parseInt(_which.getMinutes());
	ss = parseInt(_which.getSeconds());

	timeString = timeString.replace("hh", (hh12 < 10 ? "0" : "") + hh12);
	timeString = timeString.replace("h", hh12);
	timeString = timeString.replace("HH", (hh24 < 10 ? "0" : "") + hh24);
	timeString = timeString.replace("H", hh24);
	timeString = timeString.replace("mm", (mm < 10 ? "0" : "") + mm);
	timeString = timeString.replace("m", mm);
	timeString = timeString.replace("ss", (ss < 10 ? "0" : "") + ss);
	timeString = timeString.replace("s", ss);

	timeString = timeString.replace("aa", ampm);

	return timeString;
	}

// takes:    an input field's index
// returns:  a JavaScript date from the field
function getDateAsJSDate (_index)
	{
	initLocale();
	return new Date (parseInt(yearField[_index].value), parseInt(monthField[_index].value) - 1, parseInt(dayField[_index].value), 0, 0, 0);
	}

// takes:    an input field's index
// returns:  a JavaScript date from the field
function getJSDateFromLocaleDateString (_dateString)
	{
	initLocale();
	var year = parseInt(_dateString.subStr(locale.dateFormat.indexOf("y")), (locale.is4digitYear) ? 4 : 2);
	var datePieces = _dateString.split(locale.dateDelimiter);
	if (locale.dateIsMDY)
        return new Date (datePieces[2],datePieces[0],datePieces[1],0,0,0,0);
	if (locale.dateIsDMY)
		return new Date (datePieces[2],datePieces[1],datePieces[0],0,0,0,0);
	if (locale.dateIsYMD)
		return new Date (datePieces[0],datePieces[1],datePieces[2],0,0,0,0);
	return new Date (_dateString);
	}

// takes:    an input field's index
//			 whether or not to post an alert if check fails
//
// returns:  true is date is valid, otherwise false
function checkDate (_index, _warn)
	{
	var dateString = getDateAsJSDate(_index);
	var date = new Date (dateString);
	/*
	var checkDate = 0;
	var checkDateString = getDateAsString(_index);

	if (!isNaN(date))
		{
		checkDate = new Date (date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
		checkDateString = getDateAsString(checkDate);
		}
	*/
	if (isNaN(date))// || (checkDateString != dateString))
		{
		if (_warn != "no")
			{
			alert("Your " + ((_index) ? "end" : "start") + " date is not a valid date!  Please re-enter it before continuing.");
			monthField[_index].focus();
			}
		return false;
		}

	return true;
	}


// function: reverse the order of dates in the input fields, if needed
// takes:    whether or not to post an alert if check fails
// returns:  true is dates were valid, otherwise false
function fixDateOrder (_warn)
	{
	var startDate = getDateAsJSDate(START_DATE);
	var endDate = getDateAsJSDate(END_DATE);
	if (!checkDate(START_DATE, _warn))
		return false;
	if (!checkDate(END_DATE, _warn))
		return false;
	if (endDate < startDate)
		{
		// swap
		setDate(endDate, START_DATE);
		setDate(startDate, END_DATE);
		}
	return true;
	}

// takes:   one-based month number
//			4-digit year
// returns: days in that month
function daysInMonth (_month, _year)
	{
	if (_month.getDate)
		{
		var date = _month;
		_month = date.getMonth() + 1;
		_year = date.getFullYear();
		}
	if (_month == 2)
		{
		var isLeapish = !(_year % 4) && ((_year % 100) || !(_year % 400));
		if (isLeapish)
			return 29;
		}
	return daysInEachMonth[_month - 1];
	}

function fixWeeks ()
	{
	}

// change input field values to show an entire month or months, e.g., 11/1/2005 - 12/31/2005
function fixMonths ()
	{
	initLocale();
	var month = parseInt(monthField[START_DATE].value);
	var year = parseInt(yearField[START_DATE].value);
	dayField[START_DATE].value = "1";
	var month = parseInt(monthField[END_DATE].value);
	var year = parseInt(yearField[END_DATE].value);
	dayField[END_DATE].value = daysInMonth(month, year);
	}

function dayOf (_date)
	{
	return new Date (_date.getFullYear(), _date.getMonth(), _date.getDate(), 0, 0, 0, 0);
	}


