var Form = {

	_months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],

	

	$inputs: {

		arriveMo: null,

		arriveDy: null,

		departMo: null,

		departDy: null,

		roomType: null,

		numAdult: null,

		numChild: null

	},

	

	init: function() {

		Form.$inputs.arriveMo = $('#resForm select[name=am]').change(Form.events.changeArriveDate);

		Form.$inputs.arriveDy = $('#resForm select[name=ad]').change(Form.events.changeArriveDate);

		Form.$inputs.departMo = $('#resForm select[name=dm]').change(Form.events.changeDepartDate);

		Form.$inputs.departDy = $('#resForm select[name=dd]').change(Form.events.changeDepartDate);

		Form.$inputs.roomType = $('#resForm select[name=rt]').change(Form.events.changeRoomType);

		Form.$inputs.numAdult = $('#resForm select[name=ga]');

		Form.$inputs.numChild = $('#resForm select[name=gc]');

	},

	

	arrive: function(v) {

		var d = new Date();

		var today = new Date();

		var x;

		

		if (v) {

			// Get the min and max months

			var minMo = new Date();

			if (v < minMo) v = minMo;



			var maxMo = new Date();

			x = Form.$inputs.arriveMo[0].options[Form.$inputs.arriveMo[0].options.length-1].value.split('-');

			maxMo.setFullYear(x[1], x[0], -1);

			if (v > maxMo) v = maxMo;



			var mo = v.getMonth()+1;

			var dy = v.getDate();

			var yr = v.getFullYear();

			var minDay = (mo == today.getMonth()+1) ? today.getDate() : 1;



			// Get the number of days in this month

			d.setFullYear(yr, mo, (mo==maxMo.getMonth()+1) ? -1 : 0);

			var maxDay = d.getDate();

			

			// Reset "days" select

			Form.$inputs.arriveDy.empty();

			for (minDay; minDay <= maxDay; minDay++) {

				Form.$inputs.arriveDy.append('<option value="'+minDay+'">'+minDay+'</option>');

			}

			

			// Set selected month and day

			Form.$inputs.arriveMo.val(mo + '-' + yr);

			Form.$inputs.arriveDy.val(dy);

		}

		

		var x = Form.$inputs.arriveMo.val().split('-');

		d.setFullYear(x[1], x[0]-1, Form.$inputs.arriveDy.val());

		

		return d;

	},

	

	depart: function(v) {

		var d = new Date();

		var today = new Date();

		var x;

		

		if (v) {

			// Get the min and max months

			var minMo = new Date(today.getFullYear(), today.getMonth(), today.getDate()+1);

			if (v < minMo) v = minMo;



			var maxMo = new Date();

			x = Form.$inputs.arriveMo[0].options[Form.$inputs.arriveMo[0].options.length-1].value.split('-');

			maxMo.setFullYear(x[1], x[0], 0);

			if (v > maxMo) v = maxMo;



			var mo = v.getMonth()+1;

			var dy = v.getDate();

			var yr = v.getFullYear();

			var minDay = (mo == today.getMonth()+1) ? today.getDate()+1 : 1;

			

			// Get the number of days in this month

			d.setFullYear(yr, mo, 0);

			var maxDay = d.getDate();

			

			// Reset "days" select

			Form.$inputs.departDy.empty();

			for (minDay; minDay <= maxDay; minDay++) {

				Form.$inputs.departDy.append('<option value="'+minDay+'">'+minDay+'</option>');

			}

			

			// Set selected month and day

			Form.$inputs.departMo.val(mo + '-' + yr);

			Form.$inputs.departDy.val(dy);

		}

		

		var x = Form.$inputs.departMo.val().split('-');

		d.setFullYear(x[1], x[0]-1, Form.$inputs.departDy.val());

		

		return d;

	},

	

	roomType: function(v) {

		if (v) {

			v = v.toLowerCase();

			Form.$inputs.roomType.val(v);

			Calendars.filterRates(v);

		}

		return Form.$inputs.roomType.val();

	},

	

	adults: function(v) {

		if (v) {

			var n = Form.$inputs.numAdult[0].options;

			var min = n[0].value;

			var max = n[n.length-1].value;

			if (v < min) v = min;

			else if (v > max) v = max;

			Form.$inputs.numAdult.val(v);

		}

		

		return Form.$inputs.numAdult.val();

	},

	

	children: function(v) {

		if (v) {

			var n = Form.$inputs.numChild[0].options;

			var min = n[0].value;

			var max = n[n.length-1].value;

			if (v < min) v = min;

			else if (v > max) v = max;

			Form.$inputs.numChild.val(v);

		}

		

		return Form.$inputs.numChild.val();

	},

	

	

	events: {

		changeArriveDate: function() {

			var d = new Date();

			var v = Form.$inputs.arriveMo.val();

			var x = v.split('-');

			d.setFullYear(x[1], x[0]-1, Form.$inputs.arriveDy.val());

			if (d.getMonth() == x[0]) d.setDate(0);

			d = Form.arrive(d);

			

			// Double-check check-out time

			if (d >= Form.depart()) {

				d.setDate(d.getDate()+1);

				Form.depart(d);

			}

			

			Form.updateDurationSummary();

			Calendars.selectDates(Form.arrive(), Form.depart());

		},

		changeDepartDate: function() {

			var d = new Date();

			var v = Form.$inputs.departMo.val();

			var x = v.split('-');

			d.setFullYear(x[1], x[0]-1, Form.$inputs.departDy.val());

			if (d.getMonth() == x[0]) d.setDate(0);

			d = Form.depart(d);

			

			// Double-check check-out time

			if (d < Form.arrive()) {

				d.setDate(d.getDate()-1);

				Form.arrive(d);

			}



			Form.updateDurationSummary();

			Calendars.selectDates(Form.arrive(), Form.depart());

		},

		changeRoomType: function() {

			Form.roomType($(this).val());

		}

	},

	

	updateDurationSummary: function() {

		var da, dd, yr, mo, dy;

		

		da = Form.arrive();

		yr = da.getFullYear();

		mo = da.getMonth()+1;

		dy = da.getDate();

		$('#durationSummary .arrive').html(Form._months[mo-1] + ' ' + dy + ', ' + yr);

		

		

		dd = Form.depart();

		yr = dd.getFullYear();

		mo = dd.getMonth()+1;

		dy = dd.getDate();

		$('#durationSummary .depart').html(Form._months[mo-1] + ' ' + dy + ', ' + yr);

		

		var n = parseInt((dd-da)/86400000);

		$('#durationSummary .nights').html(n + (n > 1 ? ' nights' : ' night'));

	},

	

	datestamp: function(d) {

		if (!d) d = new Date();

		var m = d.getMonth()+1;

		if (m < 10) m = '0'+m;

		var y = d.getDate();

		if (y < 10) y = '0'+y;

		return d.getFullYear() + m + y;

	}

};



var Calendars = {

	$el: null,

	$arrow_back: null,

	$arrow_next: null,

	$arrIco: null,

	$depIco: null,

	$icoToMove: null,

	currentPos: 0,

	clickStep: 'in',

	$rangeStart: null,

	rangeStopDate: null,

	rangeStartDate: null,

	rangeMinOut:'',

	

	init: function() {

		Calendars.$el = $('#calendarBox');

		Calendars.$arrow_back = $('a.calendarNav.back').css('display', 'none');

		Calendars.$arrow_next = $('a.calendarNav.next').css('display','block');

		Calendars.$arrIco = $('<img id="arrIco" class="ico" src="/images/reservations/icon_arrive.gif" alt=""/>');

		Calendars.$depIco = $('<img id="depIco" class="ico" src="/images/reservations/icon_depart.gif" alt=""/>');

		Calendars.$icoToMove = Calendars.$arrIco;

		// Hook up month navigations

		$('a.calendarNav').click(function() {

			Calendars.scrollBy($(this).attr('rel') * 1);

			return false;

		});

		// Listen for hovering

		$(document).bind('selectstart', function() { return false; });

		Calendars.$el.find('tr.week > td:not(.past):not(.future)')

			.hover(Calendars.dayHoverOver, Calendars.dayHoverOut)

			.mousedown(Calendars.dayMouseDown)

			;

/*

			function(){ $(this).addClass('hover'); Calendars.$icoToMove.appendTo($(this).find('>div')); },

			function(){ $(this).removeClass('hover'); $(this).find('.ico').remove(); }

			);

*/

	},

	

	dayMouseDown: function(ev) {

		Calendars.clickStep = 'out';

		Calendars.$rangeStart = $(this);

		$('body').one('mouseup', Calendars.dayMouseUp);

		

		var ds = Calendars.$rangeStart.attr('name');

		var yr = parseInt(ds.substr(0, 4), 10);

		var mo = parseInt(ds.substr(4, 2), 10)-1;

		var dy = parseInt(ds.substr(6, 2), 10);

		var d = new Date();

		d.setFullYear(yr, mo, dy+1);

		Calendars.rangeStartDate = new Date();

		Calendars.rangeStartDate.setFullYear(yr, mo, dy);

		var $tomorrow = Calendars.$el.find('.calendar.mo-'+(d.getMonth()+1)+' td.d-'+d.getDate());

		$tomorrow.addClass('hover').find('>div').append(Calendars.$depIco);

		Calendars.rangeMinOut = $tomorrow.attr('name');

		Calendars.rangeStopDate = d;

		

		return false;

	},

	

	dayMouseUp: function() {

		if (Calendars.clickStep == 'out') {

			Calendars.clickStep = 'in';

			

			// Select the date ranges

			Calendars.selectDates(Calendars.rangeStartDate, Calendars.rangeStopDate);

			Form.arrive(Calendars.rangeStartDate);

			Form.depart(Calendars.rangeStopDate);

			Form.updateDurationSummary();

		}



		Calendars.$el.find('td.hover').removeClass('hover');

		Calendars.$arrIco.remove();

		Calendars.$depIco.remove();

	},

	

	dayHoverOver: function() {

		if (Calendars.clickStep=='in') {

			$(this).addClass('hover');

			Calendars.$arrIco.appendTo($(this).find('>div'));

		}

		else {

			var n = $(this).attr('name');

			if (n < Calendars.rangeMinOut) n = Calendars.rangeMinOut;



			// Remove all selected days after this one

			Calendars.$el.find('td.hover').each(function() {

				var x = parseInt($(this).attr('name'), 10);

				if (x > n) $(this).removeClass('hover');

			});

			

			// Don't continue if we're before the selected start day

			n = $(this).attr('name');

			var t = Calendars.$rangeStart.attr('name');

			if (n <= t) return false;

			

			// Find all dates between the two ranges

			var d = new Date();

			var yr = n.substr(0, 4) * 1;

			var mo = parseInt(n.substr(4, 2), 10) - 1;

			var dy = parseInt(n.substr(6, 2), 10);

			d.setFullYear(yr, mo, dy);

			var dates = Calendars.getDayElementsBetweenDates(Calendars.rangeStartDate, d);

			$.each(dates, function() {

				this.addClass('hover');

			});

			Calendars.$depIco.appendTo($(this).find('>div'));

			Calendars.rangeStopDate = d;

		}

	},

	

	dayHoverOut: function() {

		if (Calendars.clickStep == 'in') {

			$(this).removeClass('hover');

			$(this).find('.ico').remove();

		}

		else {

		}

	},

	

	filterRates: function(v) {

		v = v.toLowerCase();

		

		if (v == '*') {

			Calendars.$el.removeClass('oneRate').addClass('allRates');

			Calendars.$el.find('.rate').css('display','block');

		}

		else {

			Calendars.$el.addClass('oneRate').removeClass('allRates');

			Calendars.$el.find('.rate').each(function() {

				var $el = $(this);

				$el.css('display', $el.hasClass(v) ? 'block' : 'none');

			});

		}

	},

	

	scrollToPos: function(pos) {

		pos = parseInt(pos);

		

		var visB = true;

		var visN = true;

		

		if (pos <= 0) {

			visB = false;

			pos = 0;

		}

		if (pos >= Calendars.$el.find('.calendar').length-2) {

			visN = false;

			pos = Calendars.$el.find('.calendar').length-2;

		}

		

		Calendars.$arrow_back.css('display', visB?'block':'none');

		Calendars.$arrow_next.css('display', visN?'block':'none');

		if (pos != Calendars.currentPos) {

			var px = parseInt(Calendars.$el.find('.calendar:eq('+pos+')').css('left'));

			Calendars.$el.stop().animate({scrollLeft:px}, 300, function() {

			});

			Calendars.currentPos = pos;

		}

	},

	

	scrollBy: function(delta) {

		Calendars.scrollToPos(Calendars.currentPos + delta);

	},

	

	selectDates: function(d1, d2) {

		

		Calendars.$el.find('.calendar td.selected').removeClass('selected');

		

		if (!d1  ||  !d2) return;

		var arrive = new Date();

		arrive.setTime(d1.getTime());

		var depart = new Date();

		depart.setTime(d2.getTime());

		

		var pos = Calendars.$el.find('.calendar.mo-'+(arrive.getMonth()+1)).attr('rel');

		if (pos != Calendars.currentPos  &&  pos != Calendars.currentPos+1) Calendars.scrollToPos(pos);



		arrive.setHours(0, 0, 0);

		depart.setHours(23, 59, 59);

		var f = true;

		while (arrive <= depart) {

			var m = arrive.getMonth()+1;

			var d = arrive.getDate();

			var $e = Calendars.$el.find('.calendar.mo-'+m+' td.d-'+d);

			$e.addClass('selected');

			arrive.setDate(arrive.getDate()+1);

//			if (f) { Calendars.$arrIco.appendTo($e.find('>div')); f = false; }

//			else if (arrive > depart) Calendars.$depIco.appendTo($e.find('>div'));

		}

	},

	

	getDayElementsBetweenDates: function(arr, dep) {

		var d1 = new Date();

		d1.setTime(arr.getTime());

		var d2 = new Date();

		d2.setTime(dep.getTime());

		var result = [];

		

		while (d1 <= d2) {

			var m = d1.getMonth()+1;

			var d = d1.getDate();

			result.push(Calendars.$el.find('.calendar.mo-'+m+' td.d-'+d));

			d1.setDate(d1.getDate()+1);

		}

		

		return result;

	}

};



$(function() {

	Calendars.init();

	Form.init();

	

	// Check for preset values

	var match;

	

	var arrive = new Date();

	match = window.location.search.match(/am=([\d\-]+)/);

	if (match) { var x = match[1].split('-'); arrive.setFullYear(x[1], x[0]-1); }

	match = window.location.search.match(/ad=(\d+)/);

	if (match) arrive.setDate(match[1]);

	Form.arrive(arrive);



	var depart = new Date(); depart.setFullYear(arrive.getFullYear(), arrive.getMonth(), arrive.getDate()+1);

	match = window.location.search.match(/dm=([\d\-]+)/);

	if (match) { var x = match[1].split('-'); depart.setFullYear(x[1], x[0]-1); }

	match = window.location.search.match(/dd=(\d+)/);

	if (match) depart.setDate(match[1]);

	Form.depart(depart);

	

	var room = '*';

	match = window.location.search.match(/rt=([\w\*]+)/);

	if (match) room = match[1];

	Form.roomType(room);

	

	var adults = 1;

	match = window.location.search.match(/ga=(\d+)/);

	if (match) adults = match[1];

	Form.adults(adults);



	var children = 0;

	match = window.location.search.match(/gc=(\d+)/);

	if (match) children = match[1];

	Form.children(children);

	

	Form.updateDurationSummary();

	Calendars.selectDates(Form.arrive(), Form.depart());

});

