(function($) {
	var updateRoomList = function(animate) {
		var numRooms = $('#numRooms').val();
		for (var i = 1; i <= 5; i++) {
			if (i <= numRooms) {
				var elements = $('#room' + i + ':not(:visible)');
				if (animate) {
					elements.slideDown();
				} else {
					elements.show();
				}
			} else {
				var elements = $('#room' + i + ':visible');
				if (animate) {
					elements.slideUp();
				} else {
					elements.hide();
				}
			}
		}
	}

	function leadingZero(input) {
		if (parseInt(input, 10) < 10) {
			return '0' + input;
		}
		return input;
	}

	function getCheckInDate(ret) {
		var string = $('#BookingCheckInYear').val() + '/' + $('#BookingCheckInMonth').val() + '/' + $('#BookingCheckInDay').val();
		if (!ret || ret == 'obj') {
			return new Date(string);
		}
		return string;
	}

	function setCheckInDate(year, month, day) {
		if (typeof year == 'object') {
			day = year.getDate();
			month = year.getMonth() + 1;
			year = year.getFullYear();
		}
		$('#BookingCheckInYear').val(leadingZero(year));
		$('#BookingCheckInMonth').val(leadingZero(month));
		$('#BookingCheckInDay').val(leadingZero(day));
	}

	function getCheckOutDate(ret) {
		var string = $('#BookingCheckOutYear').val() + '/' + $('#BookingCheckOutMonth').val() + '/' + $('#BookingCheckOutDay').val();
		if (!ret || ret == 'obj') {
			return new Date(string);
		}
		return string;
	}

	function setCheckOutDate(year, month, day) {
		if (typeof year == 'object') {
			day = year.getDate();
			month = year.getMonth() + 1;
			year = year.getFullYear();
		}
		$('#BookingCheckOutYear').val(leadingZero(year));
		$('#BookingCheckOutMonth').val(leadingZero(month));
		$('#BookingCheckOutDay').val(leadingZero(day));
	}

	var validateDay = function(date) {
		var split = date.split('/');

		var year = parseInt(split[0], 10);
		var month = parseInt(split[1], 10) - 1;
		var day = parseInt(split[2], 10);

		try {
			Date.validateDay(day, year, month);
		} catch(e) {
			return new Date(year, month, 1).moveToLastDayOfMonth();
		}
		return new Date(date);
	}

	var validateCheckIn = function() {
		setCheckInDate(validateDay(getCheckInDate('string')));

		var checkOutDate = getCheckOutDate();
		var checkInDate = getCheckInDate();

		/*var today = new Date().add(-1).day();
		if (checkInDate.isBefore(today)) {
			setCheckInDate(new Date());
		}*/

		if (checkInDate.isAfter(checkOutDate) || checkInDate.equals(checkOutDate)) {
			var newCheckOutDate = checkInDate.clone().addDays(1);
			setCheckOutDate(newCheckOutDate);
			validateCheckOut();
		}
	}

	var validateCheckOut = function() {
		setCheckOutDate(validateDay(getCheckOutDate('string')));

		var checkOutDate = getCheckOutDate();
		var checkInDate = getCheckInDate();

		/*var today = new Date().add(1).day();
		if (checkOutDate.isBefore(today)) {
			setCheckOutDate(new Date().add(1).day());
		}*/

		if (checkOutDate.isBefore(checkInDate) || checkOutDate.equals(checkInDate)) {
			var newCheckInDate = checkOutDate.clone().addDays(-1);
			setCheckInDate(newCheckInDate);
			validateCheckIn();
		}
	}

	$(function() {
		updateRoomList(false);
		validateCheckIn();
		$('#numRooms').change(updateRoomList);
		$('#BookingCheckInMonth, #BookingCheckInDay, #BookingCheckInYear').change(validateCheckIn);
		$('#BookingCheckOutMonth, #BookingCheckOutDay, #BookingCheckOutYear').change(validateCheckOut);
	});
})(jQuery);