// ----------------------------------------------------------------------------


// NAME         : date.js


// VERSION      : 1.0


// DESCRIPTION  : Utility library of date based functions


// DEPENDENCIES : None


// ----------------------------------------------------------------------------


var minLeadTime 	= 1;
var confirmMessage 	= 	'Invalid Date. ' +
						'Check that the format is mm/dd/yyyy and that the numbers create a real, ' +
						'valid date (ie, 22/22/1004 is invalid).';
	

// ----------------------------- Function List --------------------------------


//


// string date_stringHowManyDays (string month, int year = currentYear)


// int    date_howManyDays (int month, int year = currentYear)


// bool   date_isItNextYear (int month)


// int    date_getCurrentYear ()


// bool   duration_validate (form, string ci (prefix), string co (prefix))


// string expiry_validate(object expiryDate)


// string dropdate_validate (object OutDay, object OutMon, object OutYear)


// bool   dropDate_AfterToday (object OutDay, object OutMon, object OutYear);


// bool   is_DOB(object ddob, object mdob, object ydob)


// string compare_date(object dayval, object monthval, object yearval);


// bool   comp_dropdates(object OutDay, object OutMon, object OutYear,


//                       object RetDay, object RetMon, object RetYear);


// bool   compMMYYDate(string date1, string date2);


// date   addToDate(date date1, int displacement);


// string longDate(date date1);


// string strLongDate(string date1);


// string formatFSSDate(date date1);


// object createDate(string date);


//


// ----------------------------------------------------------------------------


/* check the input values in the date fields on the search forms */
function dateInput(field) 
{
	if (field.value == "") { return; }
	
	var parsed = js_dateParser(field.value);
	
	if (parsed == -1) 
	{
		if (confirm(confirmMessage)) { field.focus(); } 
		else { field.value = ""; }
	} 
	else { field.value = dt2dtstr(parsed); }      
}


// -------------------------- date_stringHowManyDays --------------------------


// NAME       : date_stringHowManyDays


// PARAMETERS : string thisMonth   ("01" to "12")


//            : int thisYear = current year 


// RETURNS    : int monthDays


// BEHAVIOUR  : Returns the number of days in the month


// ----------------------------------------------------------------------------


function date_stringHowManyDays (thisMonth, thisYear)


{


	return date_howManyDays (thisMonth - 1, thisYear);


}





// -------------------------- date_howManyDays --------------------------------


// NAME       : date_howManyDays


// PARAMETERS : int thisMonth    (0 to 11)


//            : int thisYear = current year 


// RETURNS    : int monthDays


// BEHAVIOUR  : Returns the number of days in the month


// ----------------------------------------------------------------------------


function date_howManyDays (thisMonth, thisYear)


{


	// default the year if it hasn't been entered


	if (!thisYear)


	{


		thisYear = date_getCurrentYear ();


		if (date_isItNextYear (thisMonth))


		{


			thisYear++;


		}


	}





	var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);


	if (thisMonth != 1)


	{


		return monthDays[thisMonth];


	}


	else


	{


		// month is february


		if (   (   (thisYear%400)  == 0 ) 


				|| (   ((thisYear%100) != 0 ) 


						&& ((thisYear%4)   == 0 )


					 ) 


			 )


		{


			return 29;


		}


		else


		{


			return 28;


		}


	}


}





// -------------------------- date_isItNextYear -------------------------------


// NAME       : date_isItNextYear


// PARAMETERS : int  themonth


// RETURNS    : bool returnvalue


// BEHAVIOUR  : Check to see if a month is this year or next...


// ----------------------------------------------------------------------------


function date_isItNextYear (themonth)


{


	var returnvalue  = false;


	var currentDate  = new Date();


	var currentMonth = currentDate.getMonth();


	if (themonth <= currentMonth)


	{


		returnvalue = true;


	}





	return returnvalue;


}





// ------------------------- date_getCurrentYear ------------------------------


// NAME       : date_getCurrentYear


// PARAMETERS : none


// RETURNS    : int y


// BEHAVIOUR  : Returns the current year in four digit format


// ----------------------------------------------------------------------------


function date_getCurrentYear () {


	var currentDate = new Date();


	var y = currentDate.getFullYear();


	if (y < 1000) {


		y += 1900;


	}


	return y;


}





//-------------------------- duration_validate --------------------------------


// NAME       : duration_validate


// PARAMETERS : form, string ci (prefix), string co (prefix)


// RETURNS    : bool


// BEHAVIOUR  : function ensures out date is same or greater than in date


//              activated on form submit, submition continues if returns 'true'


//-----------------------------------------------------------------------------


function duration_validate(f, ci, co) {


	var msg;    //The error message


	var err=0;  //Default error flag to 0 (no error)





	//Now if any errors, display them and return false to prevent form


	//submition, otherwise return true


	msg  = "______________________________________________________\n\n";


	msg += "The form was not submitted because of the following error(s).\n";


	msg += "Please correct these error(s) and re-submit.\n";


	msg += "______________________________________________________\n\n";





	if (parseFloat(getDropDownValue(eval("f."+ci+"Mon"))) > 


			parseFloat(getDropDownValue(eval("f."+co+"Mon")))) {


		msg += "The check-out date must be after the check-in date";


		err = 1; //set the error flag, error has occured


	}





	if (parseFloat(getDropDownValue(eval("f."+ci+"Mon"))) == 


			parseFloat(getDropDownValue(eval("f."+co+"Mon")))) {


		if (parseFloat(getDropDownValue(eval("f."+ci+"Day"))) > 


				parseFloat(getDropDownValue(eval("f."+co+"Day")))) {


			msg += "The check-out date must be after the check-in date";


			err = 1;


		}


	}





	if (err == 0) return true;


	alert(msg);


	return false;  


}





function setDays(direction) {


	var currentYear = date_getCurrentYear();


	var yearField = eval("document.FSSform."+direction+"Year");


	if (typeof yearField == 'object') {


		if (yearField.type == "text") {


			currentYear = yearField.value;


		} else { // Must be a drop down


			currentYear = yearField.options[yearField.selectedIndex].value;


		}


	}





	var month = eval("document.FSSform." + direction + "Mon.selectedIndex");


	var selIn = 0;


	var currentDate = new Date();





	if (month != currentDate.getMonth()) {


		if ((date_isItNextYear(1, month+1)) && (typeof yearField == 'undefined')) {


			currentYear++;


		}


	}





	var monlen = date_howManyDays(month, currentYear);


	var datesel = eval("document.FSSform." + direction + "Day");


	selIn = datesel.selectedIndex;


	datesel.length = 28;





	for (var i=datesel.length;i<monlen;i++) {


		var optext = i+1;


		if (optext == 29 || optext == 30) {


			optext += "th";


		}


		else {


			optext += "st";


		}


		datesel.options[i] = new Option(optext,i+1,false,false);


	}





	if (datesel.length-1 < selIn) {


		selIn = datesel.length-1;


	}





	datesel.selectedIndex = selIn;


}





//--------------------------- expiry_validate ---------------------------------


// NAME       : expiry_validate


// PARAMETERS : object expiryDate


// RETURNS    : string status (3 chars long '123')


//              '1' indicates date structure error


//              '2' indicates 01-12 month range error


//              '3' indicates expiry date before today error


//              '4' indicates 01-31 day range error


//              '5' indicates invalid date (eg 31 Sep)


// BEHAVIOUR  : returns empty string if expiry date is correct structure & 


//              > today


//-----------------------------------------------------------------------------


function expiry_validate(expiryDate, datelen) {





	if (datelen == null) datelen = 4;





	var evstr = "";            //Date validation variable


	var today = new Date;      //Todays date


	var newmonth;        //Used to check expiry is after today


	var theyear;         //Holds expiry year


	var expdate;         //Proposed date of expiry


	var errstr = "";           //The error string returned initialised to


	//no errors





	//Now validate the expiry date format MM/YY is length correct?


	if (expiryDate.value.length != datelen) {


		errstr = "1"; //Set error string to '1' representing MM/YY type error


	}





	// Grab day from date


	var theDay = "01";


	if (datelen>5)


		theDay = expiryDate.value.substr(0,2);





	if (parseFloat(theDay) < 1 || parseFloat(theDay) > 31)


		errstr += "4";





	//Grab month from expiry date


	evstr = expiryDate.value.substr((datelen-4),2);





	//Is month in correct range?


	if (parseFloat(evstr) < 1 || (parseFloat(evstr) > 12)) {


		errstr += "2"; //Set str to str + 2 indicating month range type error


	}





	//Grab the year


	theyear = expiryDate.value.substr((datelen-2),2);





	if (datelen < 5) {


		//newmonth is the expiry month + 1


		if (parseFloat(evstr) == 12) {


			newmonth = 1;


			theyear = parseFloat(theyear) + 1;


		}





		if (parseFloat(evstr) != 12) {


			newmonth = parseFloat(evstr) + 1;


		}


	} else {


		newmonth = evstr;


	}





	//Format year correctly


	if (parseFloat(theyear) < 10) {


		theyear = "0" + parseFloat(theyear);


	}





	if (parseFloat(theyear) > 89) {


		theyear = "19" + theyear;


	}


	else theyear = "20" + theyear;





	if (theDay > date_howManyDays((parseFloat(evstr)-1), theyear))


		errstr += "5";





	//Create date for comparison with date object (today)


	if (parseFloat(theDay) <10) theDay = "0" + parseFloat(theDay);


	if (parseFloat(newmonth) <10) newmonth = "0" + parseFloat(newmonth);


	expdate = theDay + (newmonth + "") + theyear;





	//if (theDay < 10) expdate = "0" + expdate;





	//Now check expiry is after today


	//Check the year


	if (parseFloat(expdate.substr(4,4)) < parseFloat(today.getFullYear())) {


		errstr += "3";  //Set str to hold 3 indicating expires before or on today


	}





	//Check the month if year is same


	if (parseFloat(expdate.substr(4,4)) == parseFloat(today.getFullYear())) {


		if (parseFloat(expdate.substr(2,2)) < parseFloat(today.getMonth() + 1)) {


			if (errstr.indexOf("3") == -1)


				errstr += "3"; //If this error type is not already assigned do it


		}


	}





	//Check the day against today if same year and month


	if ((parseFloat(expdate.substr(4,4)) == parseFloat(today.getFullYear())) &&


			(parseFloat(expdate.substr(2,2)) == parseFloat(today.getMonth() + 1))) {


		if (parseFloat(expdate.substr(0,2)) <= parseFloat(today.getDate())) {


			if (errstr.indexOf("3") == -1)


				errstr += "3";


		}


	}





	return(errstr);


}








//--------------------------- dropdate_validate -------------------------------


// NAME       : dropdate_validate


// PARAMETERS : object OutDay, object OutMon, object OutYear


// RETURNS    : year drop down object 


//            


// BEHAVIOUR  : returns same year as passed in if whole date is after today


//              otherwise returns next year 


// DEPENDENCY : compare_date


//-----------------------------------------------------------------------------


function dropdate_validate(OutDay, OutMon, OutYear) {


	var today = new Date;      //Todays date


	var compareYear = "";


	var compareMonth = "";


	var compareDay = "";


	var compareDate = "";


	var inputDate = "";


	var inputYear = "";





	compareYear = today.getFullYear();


	compareMonth = today.getMonth() + 1;


	compareDay = today.getDate() + 1;


	compareDate += compareYear;


	compareDate += compareMonth;


	compareDate += compareDay;





	inputDate += getDropDownValue(OutYear);


	inputYear = inputDate;


	inputDate += getDropDownValue(OutMon);


	inputDate += getDropDownValue(OutDay); 





	if (parseFloat(inputDate) < parseFloat(compareDate)) {


		inputYear = (inputYear - 0) + 1;


	}





	return(inputYear);


}








//--------------------------- dropDate_AfterToday -----------------------------


// NAME       : dropDate_AfterToday


// PARAMETERS : object OutDay, object OutMon, object OutYear


// RETURNS    : bool, true if date set is after today 


//            


// BEHAVIOUR  : else false if date set is not after today 


// DEPENDENCY : compare_date            


//-----------------------------------------------------------------------------


function dropDate_AfterToday(OutDay, OutMon, OutYear) {


	var errString = ""; //The returned error string





	errString = compare_date(OutDay, OutMon, OutYear);





	if (errString == 1) return true;


	else return false;


}





//--------------------------- is_DOB ------------------------------------------


// NAME       : is_DOB


// PARAMETERS : object ddob, object mdob, object ydob


// RETURNS    : bool, true if date is a valid birthday 


//            


// BEHAVIOUR  : checks structure of birth date and if is before today


// DEPENDENCY : compare_date


//-----------------------------------------------------------------------------


function is_DOB(ddob, mdob, ydob) {


	var errString = ""; //The returned error string


 


	errString = compare_date(ddob, mdob, ydob);





	if (errString == "-1") return true;


	else return false;


}





//--------------------------- compare_date ------------------------------------


// NAME       : compare_date


// PARAMETERS : object dayval, object monthval, object yearval


// RETURNS    : string (-1 or 1 or 0 or 9)  -1= < today


//               1= > today


//               0= is today


//               9= input is not a date


// BEHAVIOUR  : checks structure of birth date and if is before today


//              function works with drop downs and text boxes


// CALLED FROM: can be called from; dropDate_validate,


//                                  dropDate_AfterToday


//            is_DOB 


//-----------------------------------------------------------------------------


function compare_date(ddob, mdob, ydob) {


	var today = new Date(); //Todays date





	var compareYear = "";


	var compareMonth = "";


	var compareDay = "";


	var compareDate = "";


	var inputDate = "";     //Users inputted date


	var maxDays = "";       //Maximum no. days for given month and year


	var inDay = "";   //Users Day


	var inMonth = "";   //Users month


	var inYear = "";    //Users year





	compareYear = today.getFullYear();   //Todays date


	compareMonth = today.getMonth() + 1;


	if (parseInt(compareMonth) < 10)


		compareMonth = "0" + compareMonth;


	compareDay = today.getDate();


	if (parseInt(compareDay) < 10)


		compareDay = "0" + compareDay;


	compareDate += compareYear;


	compareDate += compareMonth;


	compareDate += compareDay;





	//Deal with both text boxes and dropdowns


	if (ydob.type == "text") {


		inputDate = ydob.value;


		inYear = ydob.value;


	}


	else {


		inputDate = getDropDownValue(ydob);


		inYear = getDropDownValue(ydob);


	}


	if (mdob.type == "text") {


		inputDate += mdob.value;


		inMonth = mdob.value;


	}


	else {


		inputDate += getDropDownValue(mdob);


		inMonth = getDropDownValue(mdob);


	}


	if (ddob.type == "text") {


		inputDate += ddob.value;


		inDay = ddob.value;


	}


	else {


		inputDate += getDropDownValue(ddob);


		inDay = getDropDownValue(ddob);


	}


	





	//Check if users value is valid date day range/month range for given year


	//Is month in correct range?


	if (parseFloat(inMonth) < 1 || (parseFloat(inMonth) > 12)) {


		return "9"; //Is not valid date


	}





	//Is day value valid for the month and the year?


	//Grab max days for month value


	maxDays = date_stringHowManyDays (inMonth, inYear);


	if ((inDay < 1) || (inDay > maxDays)) return "9"; //Not a valid date





	if (inputDate < compareDate) return "-1"; //Date B4 today


	if (inputDate > compareDate) return "1";  //Date after today


	if (inputDate == compareDate) return "0"; //Date is today


}





//--------------------------- comp_dropdates ----------------------------------


// NAME       : comp_dropdates


// PARAMETERS : object OutDay, object OutMon, object OutYear,


//              object RetDay, object RetMon, object RetYear


// RETURNS    : bool, true if RetDate is >= OutDate


//            


// BEHAVIOUR  : checks if RetDate is >= OutDate


// DEPENDENCY : 


//-----------------------------------------------------------------------------


function comp_dropdates(OutDay, OutMon, OutYear, RetDay, RetMon, RetYear) {


// parseInt -- taken out of Month -- Ret and Out Mon





	if (parseInt(getDropDownValue(RetYear)) < parseInt(getDropDownValue(OutYear))) {


		return false;


	}





	if (parseInt(getDropDownValue(RetYear)) == parseInt(getDropDownValue(OutYear))) {


		if ((getDropDownValue(RetMon)) < (getDropDownValue(OutMon))) {


			return false;


		}


	}





	if (parseInt(getDropDownValue(RetYear)) == parseInt(getDropDownValue(OutYear))) {


		if ((getDropDownValue(RetMon)) == (getDropDownValue(OutMon))) {


			if (parseFloat(getDropDownValue(RetDay)) < parseFloat(getDropDownValue(OutDay))) {


				return false;


			}


		}


	}





	return true;


}





//--------------------------- comp_daterange ----------------------------------


// NAME       : comp_daterange


// PARAMETERS : object form, string OutDay ,string OutMon string OutYear


//    string default start date, string default end date  


// RETURNS    : bool 


//            


// BEHAVIOUR  : if true -= the date is correct, false= alert msg to user


// DEPENDENCY : NONE


//-----------------------------------------------------------------------------





function comp_daterange(OutDay, OutMon, OutYear, start_rng, end_rng) {


	// check that year is with in range


	// if it is 


	//check that month within the required year range


	// if the month is right check that the day is with in the range


	var test_day = getDropDownValue(OutDay);


	var test_month = getDropDownValue(OutMon);


	var test_yr = getDropDownValue(OutYear);





	test_yr = (parseInt(test_yr)) % 100;


	


	var test_date = ""+test_yr+test_month+test_day;





	if (test_yr < 10) test_date = "0" + test_date;





	if ((test_date <start_rng) || (test_date > end_rng)) {


		return false;


	} else {


		return true;


	}


}





//----------------------------- compMMYYDate ----------------------------------


// NAME       : compMMYYDate


// PARAMETERS : string date 1, string date 2


// 


// RETURNS    : bool


// BEHAVIOUR  : returns true if date2 is after date1


//


//-----------------------------------------------------------------------------


function compMMYYDate(date1, date2) {


	if (parseFloat(date1.substr(2,2)) > parseFloat(date2.substr(2,2))) 


		return false;





	if (parseFloat(date1.substr(2,2)) == parseFloat(date2.substr(2,2)))


		if (parseFloat(date1.substr(0,2)) > parseFloat(date2.substr(0,2)))


			return false; 





	return true;


}





// ---------------------------- prepare_date ----------------------------------


// NAME       : prepare_date


// PARAMATERS : object datedropdown, object datedropdown, object datedropdown


//     


// RETURNS    : string 6 char date ie 010101


// BEHAVIOUR  : builds a standard 6 char date from three drop downs 


// ----------------------------------------------------------------------------


function prepare_date(dateDay, dateMonth, dateYear) {


	var theYear; //Must grab a two character year


	var theMonth = getDropDownValue(dateMonth);


	var theDate;





	if (dateYear == null) {


		theYear = date_getCurrentYear();


		if (date_isItNextYear(theMonth)) theYear++;


		theYear += '';


	} else {


		theYear = getDropDownValue(dateYear);


	}


	if (theYear.length == 4)


		theYear = theYear.substr(2,2);


	theDate = theYear + theMonth + getDropDownValue(dateDay);


	return theDate;


	


}





// --------------------------------- addToDate --------------------------------


// NAME       : addToDate


// PARAMETERS : date date1, int displacement (number of days displacement)


//


// RETURNS    : date new date


// BEHAVIOUR  : Adds displacement to date, and returns new date


// ----------------------------------------------------------------------------


function addToDate(oldDate, numDays) {


	var odMilli = oldDate.getTime();


	var inMilli = numDays * (24 * 60 * 60 * 1000) + 7200000;


	var newDate = new Date(odMilli + inMilli);


	


	return newDate;


}





// ------------------------------- longDate -----------------------------------


// NAME       : longDate


// PARAMETERS : date date1


//


// RETURNS    : string


// BEHAVIOUR  : Takes date object and returns as string ie (3 March 2001)


// ----------------------------------------------------------------------------


function longDate(theDate) {


	var months = new Array("January","February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");





	var grabMonth = theDate.getMonth();


	grabMonth = months[grabMonth];





	var dString = theDate.getDate() + " " + grabMonth + " " + 


								theDate.getFullYear();





	return dString;


}





// ----------------------------- strLongDate ----------------------------------


// NAME       : strLongDate


// PARAMETERS : string date1


//


// RETURNS    : string


// BEHAVIOUR  : Takes date string YYMMDD format and returns 3 March 2001 etc


// ----------------------------------------------------------------------------


function strLongDate(theDate) {


	var yearOK = "20" + theDate.substr(0,2); //Always Y2K it


	var passDate = new Date(parseInt(yearOK),(parseFloat(theDate.substr(2,2)) - 1),parseFloat(theDate.substr(4,2)));


	var dString = longDate(passDate);  





	return dString;


}





// ------------------------------ formatFSSDate -------------------------------


// NAME       : formatFSSDate


// PARAMETERS : date date1


// 


// RETURNS    : string 


// BEHAVIOUR  : Takes date object and returns as string YYMMDD format


// ----------------------------------------------------------------------------


function formatFSSDate(theDate) {


	var grabYear = theDate.getFullYear();


	grabYear = (grabYear % 100)+"";


	if (grabYear < 10) grabYear = "0" + grabYear;


	var grabMonth = theDate.getMonth();


	grabMonth++;


	if (grabMonth < 10) grabMonth = "0" + grabMonth;


	var grabDate = theDate.getDate();


	if (grabDate < 10) grabDate = "0" + grabDate;


	var newDate = grabYear + grabMonth + grabDate;


	


	return newDate;


}





function formatDob(theDate) {  


	var grabYear = theDate.getFullYear()+"";


	var grabMonth = theDate.getMonth();


	grabMonth++;


	if (grabMonth < 10) grabMonth = "0" + grabMonth;


	var grabDate = theDate.getDate();


	if (grabDate < 10) grabDate = "0" + grabDate;


	var newDate = grabYear + grabMonth + grabDate;


	


	return newDate;  


}





// --------------------------------- createDate -------------------------------


// NAME       : createDate


// PARAMETERS : string date


// 


// RETURNS    : date object


// BEHAVIOUR  : converts string YYMMDD date into new date object


// ----------------------------------------------------------------------------


function createDate(theDate) {


  var theYear = parseFloat(theDate.substr(0,2));


  if (theYear < 46) theYear += 2000;


  else theYear += 1900;


	var theMonth = parseFloat(theDate.substr(2,2) - 1);


	var theDay = parseFloat(theDate.substr(4,2));


	var newDate = new Date(theYear, theMonth, theDay);

	return newDate;


}





function setDateDDB(strDate, dateName) {


	var theDate = createDate(strDate);


	var yrDDB  = eval("document.FSSform."+dateName+"Year");


	var monDDB = eval("document.FSSform."+dateName+"Mon");


	var dayDDB = eval("document.FSSform."+dateName+"Day");





	setDropDown(yrDDB,  theDate.getYear);


	setDropDown(monDDB, theDate.getMonth+1);


	setDays(dateName);


	setDropDown(dayDDB, theDate.getDay);


}





function calcDuration(startDate, endDate) {


	return Math.round((endDate.getTime() - startDate.getTime()) /(1000*24*60*60))


}

var months = new monthArray('01','02','03','04','05','06','07','08','09','10','11','12');

function monthArray() {
    for (i = 0; i<monthArray.arguments.length; i++)
        this[i + 1] = monthArray.arguments[i];
}

function y2k(number) { 
	return (number < 1000) ? number + 1900 : number; 
}

// Adds specified number of months to current date and returns result.
function datePadMonths(noMonths) {
    var today = new Date();
    var date = new Date(today.getYear(),today.getMonth() + parseInt(noMonths),today.getDate(),today.getHours(),today.getMinutes(),today.getSeconds());
    return months[date.getMonth() + 1] + '-' + date.getDate() + '-' + y2k(date.getYear());
}


