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=monthArrivaldt]').change(Form.events.changeArriveDate);
		Form.$inputs.arriveDy = $('#resForm select[name=ArrivalDate]').change(Form.events.changeArriveDate);
		Form.$inputs.departMo = $('#resForm select[name=monthDeparturedt]').change(Form.events.changeDepartDate);
		Form.$inputs.departDy = $('#resForm select[name=DepartureDate]').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, DepartureDate, 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);
		
		
		DepartureDate = Form.depart();
		yr = DepartureDate.getFullYear();
		mo = DepartureDate.getMonth()+1;
		dy = DepartureDate.getDate();
		$('#durationSummary .depart').html(Form._months[mo-1] + ' ' + dy + ', ' + yr);
		
		var n = parseInt((DepartureDate-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="css/icon_arrive.gif" alt=""/>');
		Calendars.$depIco = $('<img id="depIco" class="ico" src="css/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(/monthArrivaldt=([\d\-]+)/);

	if (match) { var x = match[1].split('-'); arrive.setFullYear(x[1], x[0]-1); }
	match = window.location.search.match(/ArrivalDate=(\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(/monthDeparturedt=([\d\-]+)/);
	
	if (match) { var x = match[1].split('-'); depart.setFullYear(x[1], x[0]-1); }
	match = window.location.search.match(/DepartureDate=(\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());
});
