(function($) {
	$(document).ready(function(){
		initCalendar();
		
		optionalFields();
	});

	function initCalendar() {
		var calendarId = '#calendar';
		if ($(calendarId).length == 0) {
			return false;
		}
		$(calendarId).addClass('calendar-loading');

		var inputStartId = '#arrival-date';
		var inputEndId = '#departure-date';
		
		var maxNights = 90;
		var minNights = 1;
		var minDate = (-1).days().fromNow();
		//var minDate = new Date();
		var maxDate = (18).months().fromNow();

		// Get initial dates for the calandar from the input fields
		var inputStartValue = $(inputStartId).val();
		if (inputStartValue) {
			dateStart = new Date.parse(inputStartValue);
		} else {
			dateStart = new Date.today().next().friday();
		}
		var inputEndValue = $(inputEndId).val();
		if (inputEndValue) {
			dateEnd = new Date.parse(inputEndValue);
		} else {
			dateEnd = new Date.today().next().friday().next().sunday();
		}

		// TODO:
		//var disabledDates = {'2011-02-27':1, '2011-02-28':1, '2009-07-12':1,'2009-07-13':1,'2009-08-22':1};
		
		/*
		if (window.jsonVars) {
			var dateStart = new Date.parse(window.jsonVars['date_start']); // selected dates
			var dateEnd = new Date.parse(window.jsonVars['date_end']);

			var disabledDates = window.jsonVars['disabled_dates'];
		} else {
			// Initially select a week ahead
			/*
			var dateStart = new Date.parse(minDate.toString());
			dateStart.add({days:7});
			var dateEnd = new Date.parse(dateStart.toString());
			dateEnd.add({days:minNights});

			var disabledDates = {'2009-12-25':1, '2009-07-04':1, '2009-07-12':1,'2009-07-13':1,'2009-08-22':1};
		}*/

		
		$(calendarId).DatePicker({
			flat: true,
			date: '2010-12-29',
			//date: [dateStart, dateEnd],
			calendars: 2,
			mode: 'range',
			starts: 7,
			view: 'days',
			format: 'B e, Y',
			onChange: function(formated, dates) {
				calendarOnChange(formated, dates);
			},
			onRender: function(date) {
				if (date.valueOf() < minDate.valueOf() || date.valueOf() > maxDate.valueOf()) {
					return {disabled: true}
				}
				
				if (isDisabled(date)) {
					return {disabled: true}
				}
				return {}
			}
		});
		
		
		function calendarOnChange(formated, dates) {
                    
                                //moveProgressArrow();
                    
                                var copyOfDates = [];
                                copyOfDates[0] = dates[0].clone();
                                copyOfDates[1] = dates[1].clone();
                                
				var numNights = countNights(dates);
                                
                                
				// When more than 14 nights are selected, limit to 14
				if (numNights > maxNights) {
                                    dates[1].add({days: (maxNights - numNights)});
				// Message: for stays longer than maxNights...
				}
                                numNights = countNights(dates);
				
                                
				// For each day of date range, if it's disabled move selection to before disabled date
				var iDay = dates[0].clone();
				for (var i=0; i < numNights; i++) {
					if (isDisabled(iDay)) {
						dates[1] = iDay.clone().add({days: -1});
						break;
					}
					iDay.add({days: 1});
				}
                                numNights = countNights(dates);
				
				
				// When a single date is selected, automatically select next day as well, making sure it's not disabled
				/*
				var selectedPlusMinNights = new Date.parse(dates[0].toString());
				selectedPlusMinNights.add({ days: minNights});
					dates[1].add(1).day();
				}
				*/
				if (dates[0].getDate() == dates[1].getDate()) {
					dates[1].add({days: minNights});
					for (var i=0; i < 30; i++) {
						if (!isDisabled(dates[0]) && !isDisabled(dates[1])) {
							break;
						}
						dates[0].add({days: -1});
						dates[1].add({days: -1});
					}
				}
                                numNights = countNights(dates);
                                
                                //console.log(dates);
                                //console.log(numNights);
                                // Enforce two-night minimum on weekends
                                if (numNights < 2 && ((dates[0].getDay()==5 || dates[0].getDay()==6) || (dates[1].getDay()==6 || dates[1].getDay()==0))) {
                                    dates[1].add(1).day()
                                }
                                numNights = countNights(dates);


                                // Update datepicker
                                if (copyOfDates[0].valueOf() != dates[0].valueOf() || copyOfDates[1].valueOf() != dates[1].valueOf()) {
                                    $(calendarId).DatePickerSetDate(dates.slice(), false);
                                }
                                
				
				$('.datepickerSelected:first').addClass('check-in-date');
				$('.datepickerSelected:last').addClass('check-out-date');
				
				
/*				$('.datepicker table td a').parent().click(function(e) {
					console.log($('a',this));
					$('a',this).click();
				});
*/					
				$('.datepicker table td a').parent().hover(
					function() { 
						if (!$(this).hasClass("datepickerNotInMonth") && !$(this).hasClass('datepickerDisabled')) {
							$(this).addClass("hover"); 
						}
					},
					function() {$(this).removeClass("hover");}
				);
                                    
				
				// Set date fields
				$(inputStartId).val(dates[0].toString('MMM d, yyyy'));
				$(inputEndId).val(dates[1].toString('MMM d, yyyy'));
				//submitAjaxUpdateCalendar();
				vrSubmitAjax();
				
		} // end calendarOnChange
		
		$('.datepickerMonth').each(function() {this.colSpan = "5";}); 
		//$(calendarId).DatePickerSetDate(nextWeekend, true);
		$(inputStartId).val(new Date(dateStart).toString('MMM d, yyyy'));
		$(inputEndId).val(new Date(dateEnd).toString('MMM d, yyyy'));
		updateCalendarFromInput();
		
		$(inputStartId).change( function() {
			updateCalendarFromInput();
		});
		$(inputEndId).change( function() {
			updateCalendarFromInput();
		});
		
		//$(calendarId).prepend('<strong>Click on your arrival date, then on your departure date.</strong>');
		$('.datepickerDoW th:first-child').addClass('datepickerWeek');

		$('.datepickerNotInMonth').html('');

		$('p#calendar').removeClass('calendar-loading');
		$('.datepicker a').click(function(e) {
			e.preventDefault();
			//return false;
		});
		function updateCalendarFromInput() {
			var dates = [new Date.parse($(inputStartId).val()) , new Date.parse($(inputEndId).val()) ];
			$(calendarId).DatePickerSetDate(dates.slice(), true);
			calendarOnChange('', dates);
		}
		
		function isDisabled(date) {
			if (disabledDates[date.toString('yyyy-MM-dd')]) {
				return true;
			} else
			{
				return false;
			}
		}
		
		function vrSubmitAjax() {
                        $('#lodging-container').fadeTo('fast',0.4);
			$.post("//"+window.location.hostname+"/wp-admin/admin-ajax.php", {
					action:"vr_calendar", data: $('#reservation-form').serialize()
				}, 
				function(data) {
					// strip the -1 result code
					data = data.replace(/\-1$|0$/,"");
					// parse JSON
					//data = eval('('+data+')');
					$('#lodging-container').html(data);
                      			$('#lodging-container').fadeTo('fast',1, function() {
                                            $(this).css('filter','')
                                        });
				}
			);
		}
	}

	
	function checkDate(date) {
		return [true, "", ""];
	}
        
        function countNights(dates) {
            return Math.floor((dates[1].valueOf() - dates[0].valueOf())/1000/60/60/24);
        }

	function optionalFields() {
		$('input.optional').each(function() {
			optionalFieldsSet(this);
		});
		$('input.optional').focus(function() {
			optionalFieldsClear(this);
		});
		$('input.optional').blur(function() {
			optionalFieldsSet(this);
		});
		$('form:has(input.optional)').submit( function() {
			$('input.optional').each(function() {
				optionalFieldsClear(this);
			});
			return true;
		});
	}
	function optionalFieldsSet(obj) {
		if (obj.value == '') {
			$(obj).addClass('optional-empty');
			obj.value = 'optional';
		}
	}
	function optionalFieldsClear(obj) {
		if (obj.value == 'optional') {
			$(obj).removeClass('optional-empty');
			obj.value = '';
		}
	}
        
        
        
 	
})(jQuery);


        var vrNoLodgings = false;
        var vrClickCounter = 0;
        function moveProgressArrow() {
                vrClickCounter++;
                var arrow = jQuery('#progress-arrow');
                var content = jQuery('#progress-content');
                if (vrClickCounter == 1) {
                        arrow.delay(1000).fadeIn('slow');
                        content.fadeOut('fast',function() {
                            content.html('Pick arrival date');
                            arrow.animate({top:'69px'},{complete:function() {
                                content.fadeIn('fast');
                            }});
                        });
                        return;
                }
                switch (vrClickCounter % 2) {
                    case 0:
                            arrow.stop(true);
                            arrow.fadeIn('slow');
                            content.fadeOut('fast',function() {
                                content.html('Pick departure date');
                                arrow.animate({top:'114px'},{complete:function() {
                                    content.fadeIn('fast');
                                }});
                            });
                        break;
                    case 1:
                        if (vrNoLodgings) {
                            content.fadeOut('fast',function() {
                                content.html('Pick another date');
                                arrow.animate({top:'69px'},{complete:function() {
                                    content.fadeIn('fast');
                                }});
                            });
                        } else {
                            content.fadeOut('fast',function() {
                                content.html('Pick people');
                                arrow.animate({top:'346px'},{complete:function() {
                                    content.fadeIn('fast');
                                    arrow.delay(3000).fadeOut(1000);
                                }});
                            });
                        }
                        break;
                }
                
            
        }

