<!--
/*
Author: Brenner Vasconcelos
Date: 11/08/2008
Objective: To validate date form elements before calling reservation sites
*/

// from: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0800602A52
// modified by Brenner Vasconcelos
function c_isValidDate(dateStr, format) {
	dateStr = c_trim(dateStr);
	
	if (dateStr.length < 6 || dateStr.length > 10) { return false; } 
	if (format == null) { format = "MDY"; }
	format = format.toUpperCase();
	if (format.length != 3) { format = "MDY"; }
	if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) ) { format = "MDY"; }
	if (format.substring(0, 1) == "Y") { // If the year is first
	  var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	  var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	} else if (format.substring(1, 2) == "Y") { // If the year is second
	  var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
	  var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
	} else { // The year must be third
	  var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
	  var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	}
	// If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
	if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }

	var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
	// Check to see if the 3 parts end up making a valid date
	if (format.substring(0, 1) == "M") { var mm = parts[0]; } else if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
	if (format.substring(0, 1) == "D") { var dd = parts[0]; } else if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
	if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
	if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
	if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
	var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
	if (parseFloat(dd) != dt.getDate()) { return false; }
	if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
	return true;
}

// from: http://www.rgagnon.com/jsdetails/js-0063.html
function c_trim(strValue) {
	var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }

   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

// author: Brenner Vasconcelos
function c_isDateInPast(dateStr, format, delimiter) {
	var rightNow = new Date();
	// to eliminate hours, minutes and second to make clean comparison
	var todayDate = new Date(rightNow.getFullYear(), rightNow.getMonth(), rightNow.getDate(), 0, 0, 0);

	dateStr = c_trim(dateStr);
	if ((!c_isDateFieldEmpty(dateStr)) && c_isValidDate(dateStr, format)) {
		var dateToUse = c_prepareDateObject(dateStr, format, delimiter);
		if  (Date.parse(todayDate) > Date.parse(dateToUse)) {
			return true;
		}
	} else {
		return false;
	}
}

// author: Brenner Vasconcelos
function c_isDateFieldEmpty(dateStr) {
	if (c_trim(dateStr) == "") {
		return true;
	} else {
		return false;
	}
}

// author: Brenner Vasconcelos
function c_compareDates(dateStrStart, dateStrEnd, format, delimiter) {
	var isRangeOk = false;
	
	dateStrStart = c_trim(dateStrStart);
	dateStrEnd = c_trim(dateStrEnd);
	
	if (c_isDateFieldEmpty(dateStrStart) || c_isDateFieldEmpty(dateStrEnd)) {
		alert("You must enter the check in and check out dates.");
	} else {
		if (!c_isValidDate(dateStrStart, format)) {
			alert("You must enter a valid check in date.");
		} else if (!c_isValidDate(dateStrEnd, format)) {
			alert("You must enter a valid check out date.");
		} else if (c_isDateInPast(dateStrStart, format, delimiter)) {
			alert("The check in date can't be in the past.");
		} else if (c_isDateInPast(dateStrEnd, format, delimiter)) {
			alert("The check out date can't be in the past.");			
		} else if (Date.parse(dateStrStart) == Date.parse(dateStrEnd)) {
			alert("The check-out date can't be the same day as the check-in date.");	
		} else if (Date.parse(dateStrStart) > Date.parse(dateStrEnd)) {
			alert("The check in date can't be after the check out date.");	
		} else {
			isRangeOk = true;
		}
	}
	return isRangeOk;
}

// author: Brenner Vasconcelos
function c_testSingleField(dateStr, format, delimiter, labelType, dateType) {
	var isDateOk = false;
	var labelField = "";
	
	dateStr = c_trim(dateStr);
	
	if (labelType == 1) {
		if (dateType == 1) {
			labelField = "check in";
		} else {
			labelField = "check out";
		}
	} else if (labelType == 2) {
		if (dateType == 1) {
			labelField = "arrival";
		} else {
			labelField = "departure";
		}
	}

	if (c_isDateFieldEmpty(dateStr)) {
		alert("You must enter the " + labelField + " date.");
	} else {
		if (!c_isValidDate(dateStr, format)) {
			alert("You must enter a valid " + labelField + " date.");
		} else if (c_isDateInPast(dateStr, format, delimiter)) {
			alert("The " + labelField + " date can't be in the past.");
		} else {
			isDateOk = true;
		}
	}
	return isDateOk;
}


// author: Brenner Vasconcelos
// This function can customize the label for dates
function c_compareDatesFlex(dateStrStart, dateStrEnd, format, delimiter, labelType) {
	var isRangeOk = false;
	var labelIn = "";
	var labelOut = "";
	
	if (labelType == 1) {
		labelIn = "check in";
		labelOut = "check out";
	} else if (labelType == 2) {
		labelIn = "arrival";
		labelOut = "departure";
	}
	
	dateStrStart = c_trim(dateStrStart);
	dateStrEnd = c_trim(dateStrEnd);
	
	if (c_isDateFieldEmpty(dateStrStart) || c_isDateFieldEmpty(dateStrEnd)) {
		alert("You must enter the " + labelIn + " and " + labelOut + " dates.");
	} else {
		if (!c_isValidDate(dateStrStart, format)) {
			alert("You must enter a valid " + labelIn + " date.");
		} else if (!c_isValidDate(dateStrEnd, format)) {
			alert("You must enter a valid " + labelOut + " date.");
		} else if (c_isDateInPast(dateStrStart, format, delimiter)) {
			alert("The " + labelIn + " date can't be in the past.");
		} else if (c_isDateInPast(dateStrEnd, format, delimiter)) {
			alert("The " + labelOut + " date can't be in the past.");			
		} else if (Date.parse(dateStrStart) == Date.parse(dateStrEnd)) {
			alert("The " + labelOut + " date can't be the same day as the " + labelIn + " date.");	
		} else if (Date.parse(dateStrStart) > Date.parse(dateStrEnd)) {
			alert("The " + labelIn + " date can't be after the " + labelOut + " date.");	
		} else {
			isRangeOk = true;
		}
	}
	return isRangeOk;
}

// author: Brenner Vasconcelos
function c_prepareDateObject(dateStr, format, delimiter) {
	var dateParts = dateStr.split(delimiter);
	
	if (format.substring(0, 1) == "M") { var monthDate = dateParts[0]; } else if (format.substring(1, 2) == "M") { var monthDate = dateParts[1]; } else { var monthDate = dateParts[2]; }
	if (format.substring(0, 1) == "D") { var dayDate = dateParts[0]; } else if (format.substring(1, 2) == "D") { var dayDate = dateParts[1]; } else { var dayDate = dateParts[2]; }
	if (format.substring(0, 1) == "Y") { var yearDate = dateParts[0]; } else if (format.substring(1, 2) == "Y") { var yearDate = dateParts[1]; } else { var yearDate = dateParts[2]; }
	if (parseFloat(yearDate) <= 50) { yearDate = (parseFloat(yearDate) + 2000).toString(); }
	if (parseFloat(yearDate) <= 99) { yearDate = (parseFloat(yearDate) + 1900).toString(); }
	var objDate = new Date(parseFloat(yearDate), parseFloat(monthDate)-1, parseFloat(dayDate), 0, 0, 0);
	
	return objDate;
}

// author: Brenner Vasconcelos
function c_dateDifferenceInDays (dateStrStart, dateStrEnd, format, delimiter) {
	var numDays = 1;
	var oneDay = 1000*60*60*24;
	
	if (c_isDateFieldEmpty(dateStrStart) || c_isDateFieldEmpty(dateStrEnd)) {
		alert("You must enter the check in and check out dates.");
	} else if (!c_isValidDate(dateStrStart, format)) {
		alert("You must enter a valid check in date.");
	} else if (!c_isValidDate(dateStrEnd, format)) {
		alert("You must enter a valid check out date.");
	} else {
		var objDateStart = c_prepareDateObject(dateStrStart, format, delimiter);
		var objDateEnd = c_prepareDateObject(dateStrEnd, format, delimiter);
		var numDays = Math.ceil((objDateEnd-objDateStart)/(oneDay))
		if (numDays < 0) { numDays = 1; }
	}
	return numDays;
}

// author: Brenner Vasconcelos
// receive a date string, validates and then returns a string formatted date
function c_dateAddFormatted(dateStr, numDays, format, delimiter, digitsYear, useLeadingZero) {
	var dateFormatted = dateStr;
	
	if (c_isDateFieldEmpty(dateStr)) {
		alert("You must enter a date.");
	} else if (!c_isValidDate(dateStr, format)) {
		alert("You must enter a valid date.");
	} else {
		if (numDays > 0) {
			var objDate = c_prepareDateObject(dateStr, format, delimiter);
			var objNewDate = new Date(objDate);
			objNewDate.setDate(parseInt(objDate.getDate()) + parseInt(numDays));
			dateFormatted = c_dateFormatToField(objNewDate, format, delimiter, digitsYear, useLeadingZero)
		}
	}
	return dateFormatted;
}

// author: Brenner Vasconcelos
// receive a date object and then returns a string formatted date
function c_dateFormatToField(objDate, format, delimiter, digitsYear, useLeadingZero) {
	monthDate = objDate.getMonth() + 1;
	if (useLeadingZero && monthDate < 10) { monthDate = "0" + monthDate; }
	dayDate =  objDate.getDate();
	if (useLeadingZero && dayDate < 10) { dayDate = "0" + dayDate; }
	yearDate =  objDate.getFullYear();
	
	dateFormatted = format.replace(format.substring(1, 2), delimiter + format.substring(1, 2) + delimiter);
	dateFormatted = dateFormatted.replace("M", monthDate);
	dateFormatted = dateFormatted.replace("D", dayDate);
	if (digitsYear == 4) {
		dateFormatted = dateFormatted.replace("Y", yearDate);
	} else {
		dateFormatted = dateFormatted.replace("Y", yearDate.toString().substring(2, 4));
	}
	return dateFormatted;
}
// author: Brenner Vasconcelos
// receive a date str and remove leading zero to comply with certain booking engines
function c_removeLeadingZero(datePartStr) {
	if (datePartStr.length == 2 && datePartStr.substr(0, 1) == "0") {
		datePartStr = datePartStr.substr(1, 1);
	}
	return datePartStr;
}
//-->