//<script language="Javascript">
/*	Purpose: Date-related functions (Requires GlobalJavascriptVars.asp) 
*/

/*	Purpose: Checks if the year, month, and day make up a valid date
	Inputs: y - year, m - month, d - date
	Returns: true if it is valid date; false otherwise
*/
function isDate(y, m, d) {
	// assume m starts at 0
	with(new Date(y, m, d)) {
		return(getDate() == d && getMonth() == m);
	}
}

/*	Purpose: Gets month index
	Inputs: strMonth - month name
	Returns: month index; -1 if value is invalid
*/
function getMonthIndex(strMonth) {
	for(i = 0; i < aryMonths.length; i++) {
		strMonth = strMonth.toLowerCase();
		strTemp = aryMonths[i].toLowerCase();
		if (strMonth == strTemp)
			return i;
	}
	return -1;
}

/*	Purpose: Checks if month name is valid
	Inputs: strMonth - month name
	Returns: month name; -1 if value is invalid
*/
function validateMonth(strMonth) {
	for(i = 0; i < aryMonths.length; i++) {
		strMonth = strMonth.toLowerCase();
		strTemp = aryMonths[i].toLowerCase();
		if (strMonth == strTemp)
			return aryMonths[i];
	}
	return -1;
}

/*	Purpose: Calculates the intervals between two dates
	Inputs: dtDate1 - date1, dtDate2 - date2
	Returns: intervals between the two dates
*/
function dayDiff(dtDate1, dtDate2) {
	var intMS1 = dtDate1.valueOf();
	var intMS2 = dtDate2.valueOf();
	var intDiff = (intMS1 - intMS2) / 1000 / 60 / 60 / 24;
	return Math.round(intDiff);
}

/*	Purpose: Adds number of days to a date
	Inputs: dtDate - date, intDays - number of days to be added
	Returns: date with specified days added
*/
function DateAdd(dtDate,intDays) {
    return new Date(dtDate.getFullYear(), dtDate.getMonth(), dtDate.getDate() + intDays);
}

/*	Purpose: Converts date object into string: dd-mmm-yyyy
	Inputs: dtDate - date
	Returns: string in dd-mmm-yyyy format
*/
function formatDateOBJ(dtDate) {
	return dtDate.getDate() + strDefaultDelim + aryMonths[dtDate.getMonth()] + strDefaultDelim + dtDate.getFullYear();
}

/*	Purpose: Converts integer values for year, month, day into string: dd-mmm-yyyy
	Inputs: y - year, m - month, d - day
	Returns: string in dd-mmm-yyyy format
*/
function formatDateTXT(y, m, d) {
	return d + strDefaultDelim + aryMonths[m] + strDefaultDelim + y;
}

/*	Purpose: Converts text date to date object
	Inputs: txtDate - date string
	Returns: date object; -1 if parsing fails
*/
function parseDate(txtDate) {
	var strDate = txtDate;
	var aryDate, objDate;
	
	if (strDate.indexOf(strDefaultDelim) > -1) {
		aryDate = strDate.split(strDefaultDelim);
		objDate = new Date(aryDate[2], getMonthIndex(aryDate[1]), aryDate[0]); //Assuming dd-mmm-yyyy
		return objDate;
	} else { 
		return -1;
	}
}

/*	Purpose: Validates the start date
	Inputs: objStartDate - start date object, objEndDate - end date object,
			objNights - # nights object, intOffSet - offset
	Returns: true if start date is valid; false otherwise
*/
function checkStartDate(objStartDate, objEndDate, objNights, intOffSet) {
	var startdate, startplandate, enddate, days, strDiff, strError = '';
	
	if (objNights) {
		if(objNights.type == 'hidden') {
			days = parseInt(objNights.value) - 1;
		} else {
			days = parseInt(objNights.options[objNights.selectedIndex].value) - 1;
		}
	}
	//added to display day of week and start date of plan plus the intDaysOut.
	var daysOfWeek = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"];
	var now = new Date();
	
	startdate = parseDate(objStartDate.value);
	startplandate = DateAdd(now, intDaysOut);
	
	//show proper name of day of week
	var dayOfWeek = startplandate.getDay();
	dayOfWeek = daysOfWeek[dayOfWeek];
	
	startplandate = formatDateOBJ(startplandate);
	enddate = DateAdd(startdate, days + intOffSet);
	strDiff = dayDiff(startdate, dtToday);
	
		return true;
	
}

/*	Purpose: Reset end date based on the start date and # of nights
	Inputs: objStartDate - start date object, objEndDate - end date object,
			objNights - # nights object, intOffSet - offset
	Returns: true if end date is reset successfully; false otherwise
*/
function resetEndDate(objStartDate, objEndDate, objNights, intOffSet) {
	var startdate, enddate, days, strDiff, strError = '';
	if(objNights.type == 'hidden') {
		days = parseInt(objNights.value) - 1;
	} else {
		days = parseInt(objNights.options[objNights.selectedIndex].value) - 1;
	}
	startdate = parseDate(objStartDate.value);
	enddate = DateAdd(startdate, days + intOffSet);
	strDiff = dayDiff(startdate, dtToday);
	
	if(checkStartDate(objStartDate, objEndDate, objNights)) {
		objEndDate.value = formatDateTXT(enddate.getFullYear(), enddate.getMonth(), enddate.getDate());
		return true;
	} else {
		return false;
	}
}

/*	Purpose: Validates the end date
	Inputs: objStartDate - start date object, objEndDate - end date object,
			intOffSet - offset
	Returns: true if end date is valid; false otherwise
*/
function checkEndDate(objStartDate, objEndDate, intOffSet) {
	var startdate, enddate, strDiff, strError = '';
	
	startdate = parseDate(objStartDate.value);
	enddate = parseDate(objEndDate.value)
	strDiff = dayDiff(enddate, startdate);
	
	return true;

}

/*	Purpose: Adjusts # of nights based on start date, end date and offset
	Inputs: objStartDate - start date object, objEndDate - end date object,
			objNights - # nights object, intOffSet - offset
	Returns: true if # of nights is reset successfully; false otherwise
*/
function resetNights(objStartDate, objEndDate, objNights, intOffSet) {
	var startdate, enddate, days, strDiff;
	startdate = parseDate(objStartDate.value);
	enddate = parseDate(objEndDate.value)
	strDiff = dayDiff(enddate,startdate) - intOffSet;
	if (parseInt(strDiff) < 0)
		strDiff = 0;
	
	if (checkEndDate(objStartDate, objEndDate, intOffSet)) {
		if(objNights.type == 'hidden'){
			objNights.value = strDiff + intOffSet;
		} else {
			objNights.selectedIndex = strDiff;
		}
		if (strDiff > 31)
			objNights.selectedIndex = 31;
		return true;
	} else {
		return false;
	}
}

/*	Purpose: Checks dates and adjusts end date and # of nights if needed
	Inputs: objStartDate - start date object, objEndDate - end date object,
			objNights - # nights object, srcElement - source element,
			bReset - reset flag, intOffSet - offset
	Returns: true if dates are valid and reset properly; false otherwise
*/
function checkDate(objStartDate, objEndDate, objNights, srcElement, bReset, intOffSet) {

	var strDate = srcElement.value;
	var strError = '';
	var strDay, strMonth, strYear, intMonth;
	var thisyear = dtToday.getFullYear();
	var strDelim;
	
	strError += valStringDate(strDate,srcElement);
	
	if (strError == '') {
		if (objNights) {
			var strElementName = srcElement.name;
			if (strElementName.indexOf('dateS') > -1) {	// Case that start date or nights was changed
				if (bReset)
					return resetEndDate(objStartDate, objEndDate, objNights, intOffSet);
				else
					return checkStartDate(objStartDate, objEndDate, objNights, intOffSet);
			} else {										// Case that end date was changed
				if (bReset)
					return resetNights(objStartDate, objEndDate, objNights, intOffSet);
				else
					return checkEndDate(objStartDate, objEndDate, intOffSet);
			}
		} else if(objStartDate) {
			return checkStartDate(objStartDate, objEndDate, objNights, intOffSet);
		} else {
			return true;
		}
	} else {

		showError(strError, srcElement);
	}
}

/*	Purpose: Date passed must not be in the past.
	Inputs: dtDate - date object, strDateName - date field name
	Returns: error message if date is in the past 
*/
function valDateInThePast(dtDate, strDateName) {

	var strError;
	strError = new String();
	
	if (dtDate < dtToday) {
		strError = "Your " + strDateName + " should not be in the past. " +
					"Please select another " + strDateName + ".";
	}

	return strError;	
}

/*	Purpose: Date must be outside the passed number of days from today
	Inputs: dtDate - date object, intDays - # days to be passed,
			strDateName - date field name
	Returns: error message if date is within the # of days from today
*/
function valDateNotWithinXDaysPastToday(dtDate, intDays, strDateName) {
	var strError;
	strError = new String();

	var oneDay = 24 * 60 * 60 * 1000;
	var intdayDiff = (dtDate.valueOf() - dtToday.valueOf()) / oneDay;
	if (intDays > Math.round(intdayDiff)) {
		strError = "We have noticed that your departure is within " + intDays +
					" days and paper tickets may be required. " +
					" Delivery of paper tickets cannot be guaranteed. <BR>" + 
					" Please consider alternate travel dates <BR>" +
					"or <BR>Contact our call center where a travel consultant" +
					" will be able to assist you.";
	}

	return strError;	
}

/*	Purpose: Second date field cannot be before the first date field.
	Inputs: dtFirstDate - date1, strFirstDate - date1 field name,
			dtSecondDate - date2, strSecondDate - date2 field name
	Returns: error message if date2 is before date1
*/
function valCompareTwoDates(dtFirstDate, strFirstDate, dtSecondDate, strSecondDate) {

	var strError;
	strError = new String();
		
	if (dtFirstDate > dtSecondDate) {
		strError = "Your " + strSecondDate + " should not be before your " + 
					strFirstDate + ". Please select another " + strSecondDate + ".";
	}

	return strError;	
}

/*	Purpose: Date must be within specified date range
	Inputs: date to validate, start date, end date
	Returns: true or false
*/
function isDateWithinRange(objDate, dtStartDate, dtEndDate) {
	var date = parseDate(objDate.value);
	var strError;
	
	if ((dayDiff(date, dtStartDate) < 0) || (dayDiff(date, dtEndDate) > 0))
	{
		strError = "The dates you specified are out of the valid date range.";
		addError(strError, 'E', true);
		return false;
	}
	else
	{
		return true;
	}
}

/*	Purpose: Date must be within 1 year of the server date
	Inputs: date to validate (date data type)
	Returns: true or false
*/
function isDateWithinOneYear(date) {
	var datServerDatePlus1Year = DateAdd(dtToday, 365);
		
	if (datServerDatePlus1Year - date < 0) {
		return false;
	}
	return true;
}

/*	Purpose: Check if the string date is correctly formatted
	Inputs: Date value as a string, source element containing the date
	Returns: Error string
*/
function valStringDate(strDate, srcElement) {
	var strDelim;
	var strError = "";
	var aryDate;
	
	// Match the standard date format (dd-mmm-yyyy)
	if (strDate.match(/^\d{1,2}\-[a-zA-Z]{3}\-\d{4}$/)) {
		strDelim = "-";	
	} else {
		strError += 'Please enter a valid date: dd-mmm-yyyy (eg. 25-Feb-2003)';
	}
		
	if (strError == '') {
		aryDate = strDate.split(strDelim);
		if (aryDate.length == 3) {
			strDay = aryDate[0];
			strMonth = aryDate[1];
			strYear = aryDate[2];	
			
			if (!isNaN(strYear) && strYear < 100)
				strYear = parseInt(strYear) + 2000;
			if (isNaN(strMonth)) {
				strMonth = strMonth.substring(0, 3);
				strMonth = validateMonth(strMonth);
				if (strMonth == -1) 
					strError = 'Please enter the month with the first three letters of the month.';
				else 
					intMonth = getMonthIndex(strMonth);
			} else {
				intMonth = strMonth - 1;
			}
			if (strError == '' && !isDate(strYear, intMonth, strDay))
				strError = 'Please enter a valid date: dd-mmm-yyyy (eg. 25-Feb-2003)';
		} else {
			strError = 'Please enter a valid date: dd-mmm-yyyy (eg. 25-Feb-2003)';
		}
	}

	if (strError == '') {
		srcElement.value = formatDateTXT(strYear, intMonth, strDay);
	}

	return strError;
}

/*	Purpose: Output the error message
	Inputs: The error string and source page element
	Returns: Nothing
*/
function showError(strError, srcElement) {
	addError(strError, 'E', true);
	srcElement.focus();		//NS needs this here
	srcElement.select();
	return false;
	srcElement.focus();		//IE needs this here
}
