var CURRDATE = new Date();
var INPUTDATEFORMAT = "M/d/yyyy";
var OUTPUTDATEFORMAT = "MM/dd/yyyy";
var DEFAULT_NUMBER_OF_NIGHTS = 3;
var NUMBER_OF_MAX_STAY_DAYS = 14;
var MIN_SELECTABLE_DATE = CURRDATE.clone();
var MAX_SELECTABLE_DATE = CURRDATE.clone().addYears(2).addDays(NUMBER_OF_MAX_STAY_DAYS);

function timeDiff(startDate, endDate)
{
    var second = 1000, minute = second * 60, hour = minute * 60, day = hour * 24, week = day * 7;
    var timediff = endDate - startDate;
    if (isNaN(timediff))
	{
        return NaN;
    }
	else
	{
        return Math.round(timediff / day);
	}
}

function parseDate(dateString) {
	return Date.parseExact(dateString, INPUTDATEFORMAT);
}

$(document).ready
(
	function()
	{
	    var checkInDateTextBox = $("#CheckInDate");
	    var checkOutDateTextBox = $("#CheckOutDate");

		function handleCheckInDateChange()
		{
	        var checkInDate = parseDate(checkInDateTextBox.val());
	        if (null == checkInDate)
			{
	            // When the inputted check in date is invalid
	            // uses check out date substract nights to calculate the check out date.
	            checkInDate = new Date();
	            checkInDateTextBox.val(checkInDate.toString(OUTPUTDATEFORMAT));
	        }
			else
			{
				if (checkInDate < CURRDATE)
				{
		            // When check in date less than today, revert check date.
		            checkInDate = new Date();
		            checkInDateTextBox.val(checkInDate.toString(OUTPUTDATEFORMAT));
	        	}
				else
				{
					if (checkInDate > CURRDATE.clone().addYears(1))
					{
			            // When check in date later than 2 years, revert check date.
			            checkInDate = new Date();
	    		        checkInDateTextBox.val(checkInDate.toString(OUTPUTDATEFORMAT));
					}
				}
	        }
			
	        // Format the check date.
	        checkInDateTextBox.val(parseDate(checkInDateTextBox.val()).toString(OUTPUTDATEFORMAT));
	
	        var checkOutDate = checkInDate.addDays(3);
	        checkOutDateTextBox.val(checkOutDate.toString(OUTPUTDATEFORMAT));
	
	        // Set the date less than check in date is not be selectable.
	        var minCheckOutDate = timeDiff(Date.today(), parseDate(checkInDateTextBox.val()));
	        checkOutDateTextBox.datepicker('option', "minDate", minCheckOutDate + 1);
	    }
	
	    function handleCheckOutDateChange()
		{
	        var checkInDate = parseDate(checkInDateTextBox.val());
	        var checkOutDate = parseDate(checkOutDateTextBox.val());
	
	        if (null == checkOutDate)
			{
	            // When the inputted check out date is invalid
	            // uses check in date added up nights to calculate the check out date.
	            checkOutDate = checkInDate.addDays(1);
	            checkOutDateTextBox.val(checkOutDate.toString(OUTPUTDATEFORMAT));
	        }
			else
			{
				if (checkOutDate <= checkInDate)
				{
		            // When check out date less than check in date,
		            // revert check out date by check in date and number of nights.
		            checkOutDate = checkInDate.addDays(1);
		            checkOutDateTextBox.val(checkOutDate.toString(OUTPUTDATEFORMAT));
	    	    }
				else
				{
					if (checkOutDate > MAX_SELECTABLE_DATE)
					{
		            	// When check out date later than max selectable date,
		        	    // revert check out date by check in date and number of nights.
		    	        checkOutDate = checkInDate.addDays(1);
			            checkOutDateTextBox.val(checkOutDate.toString(OUTPUTDATEFORMAT));
					}
				}
	        }
	        // Format the check date.
	        checkOutDateTextBox.val(parseDate(checkOutDateTextBox.val()).toString(OUTPUTDATEFORMAT));
	    }
		
		checkInDateTextBox.change
		(
			function(event)
			{
				handleCheckInDateChange();
				return false;
			}
		);
		
		checkInDateTextBox.keydown
		(
			function(event)
			{
				// When press down tab key, focus the check out date text box.
				if (event.keyCode == 9)
				{
					handleCheckInDateChange();
					checkInDateTextBox.datepicker("hide");
					checkOutDateTextBox.focus();
					return false;
				}

				// When press down enter key, hide the calendar.
				if (13 == event.keyCode)
				{
					handleCheckInDateChange();
					checkInDateTextBox.datepicker("hide");
					return false;
				}
			}
		);

		checkInDateTextBox.datepicker
			(
				{
					numberOfMonths: 2,
		            showAnim: 'fadeIn',
					minDate: new Date(),
					maxDate: '12m',
		            onSelect: function(dateText, inst)
					{
		                handleCheckInDateChange();
						return false;
		            }
				}						
			);
			
		checkOutDateTextBox.change
		(
			function(event)
			{
				handleCheckOutDateChange();
				return false;
			}
		);
		
		checkOutDateTextBox.keydown
		(
			function(event)
			{
				// When press down enter key, hide the calendar.
				if (13 == event.keyCode)
				{
					handleCheckOutDateChange();
					checkOutDateTextBox.datepicker("hide");
					return false;
				}
			}
		);
			
	    checkOutDateTextBox.datepicker
			(
				{
					numberOfMonths: 2,
		            showAnim: 'fadeIn',
					minDate: new Date(),
					maxDate: '12m'
				}						
			);
	}
);