$(document).ready(function(){
	var dateFormat = 'dd M y';
  
  var today = new Date();
  var defaultCheckInDate = new Date();
  defaultCheckInDate.setDate(today.getDate()+7);
  var defaultCheckOutDate = new Date();
  defaultCheckOutDate.setDate(today.getDate()+9);

  $("#search_check_in").datepicker({defaultDate:+7});
  $("#search_check_out").datepicker({defaultDate:+9});
  
  $("#search_check_in").datepicker("setDate", defaultCheckInDate);
  $("#search_check_out").datepicker("setDate", defaultCheckOutDate);
 	$("#search_check_in").val($.datepicker.formatDate("dd M y", $('#search_check_in').datepicker('getDate')) );
 	$("#search_check_out").val($.datepicker.formatDate("dd M y", $('#search_check_out').datepicker('getDate')) );
	
  // CSS class for validation errors.
    var validation_error_css_class = 'validation_error';
  // Initialize auto-complete.
   $('#search_query').autocomplete('http://www.wego.com/p/hotelr/locations/search', {
     dataType: 'jsonp',
     delay: 50,
     minChars: 2,
     matchSubset: false,
     matchContains: true,
     extraParams: { format: 'jsonp', limit: 50 },
     parse: function(data) {
       if (data && data.r && data.r.length > 0) {
         var parsed = [];
         for (var i = 0, l = data.r.length; i < l; i++) {
           var result = data.r[i];
           parsed[i] = { data: result, value: result.id, result: result.fn };
         }
         return parsed;
       } else {
         // No results - show a message.
         $('#search_query').removeClass('ac_loading');
         $('#search_location_id').val('');
         return [{ data: { fn: 'No matching locations' }, value: '', result: '' }];
       }
     },
     formatItem: function(result) {
       return result.fn;
     }
   });
   $('#search_query').result(function(event, data, formatted) {
     if ('hidden' == $('#search_location_id').attr('type')) {
       $('#search_location_id').val(data.id);
     } else if ('select' == $('#search_location_id').get(0).tagName.toLowerCase()) {
       // If #search_location_id is a <select>, we need to add an additional <option> into it with the selected value
       // from the autocomplete.
       var option = document.createElement('option');
       option.value = data.id;
       option.text = data.fn;
       var options = $('#search_location_id').get(0).options;
       options[options.length-1] = option;
       option.selected = true;
     }
     $('#search_location_code').val(data.c);
     $(this).removeClass(validation_error_css_class);
   });

  // Select all text in search query textbox on focus.
  $('#search_query').click(function() { $(this).select(); });

  // Initializes tooltip for validation errors.
  var tooltip_validation_errors = function() {
    $('.' + validation_error_css_class).tooltip({ delay: 0, extraClass: 'error' });
  };
  tooltip_validation_errors();

	var string_to_date = function(date_string, date_format){
		if(date_format == undefined)
			date_format = 'dd M yy';
		
		return $.datepicker.parseDate(date_format, date_string);	
	}

  // Validates that the value of the element with the given ID is in the correct date format.
  var validate_date_format = function(id, errors) {
    var val = $.trim($(id).val());
    try {
      if ('' != val) {
        var parsed_date = string_to_date(val);
        if (!parsed_date) {
          if (errors) errors.add(id, 'is in an invalid format');
          return false;
        }
      }
    } catch(e) {
      if (errors) errors.add(id, "is in an invalid format");
      return false;
    }
    return true;
  };

	validation_error_css_class = 'validationerror';
  // Validation.
  $('form#wg_hotel_search').submit(function() {
    var errors = new Wego.Errors();
    var field_ids = ['#search_query', '#search_check_in', '#search_check_out'];

    // Validate non-blank fields.
    if ('' == $.trim($('#search_query').val())) {
      errors.add('#search_query', "Location can't be blank");
    }

		validate_date_period($.trim($('#search_check_in').val()), $.trim($('#search_check_out').val()), errors);
    // Validate formats of check-in and check-out dates.
    // validate_date_format('#search_check_in', errors);
    // validate_date_format('#search_check_out', errors);

    if (errors.count() > 0) {
      $('#wg_validation_error_msg:visible').hide().fadeIn('slow');
      $('#wg_validation_error_msg:hidden').fadeIn('fast');

      errors.each(function(id, msgs) {
        $(id).addClass(validation_error_css_class);
        $(id).attr('title', msgs.join(', and '));
      });

      for (var i = 0, l = field_ids.length; i < l; i++) {
        var id = field_ids[i];
        if (!errors.on(id)) {
          $(id).removeClass(validation_error_css_class);
        }
      }

      tooltip_validation_errors();
			display_validation_errors('#wg_validation_error_msg', errors);
      return false;
    }
		else{
	    $(field_ids.join(',')).removeClass(validation_error_css_class);
	    $('#wg_validation_error_msg').hide();
	    return true;
		}
  });

	var validate_date_period = function(checkin, checkout, errors){
		// If both are check-in and check-out are blank, this is a dateless search.
    if ('' == checkin && '' == checkout) {
    } 
		else if ('' == checkin) {
      errors.add('#search_check_in', "Check in date can't be blank");
    } 
		else if ('' == checkout) {
      errors.add('#search_check_out', "Check out date can't be blank");
    }
		else{
			var checkin_date = string_to_date(checkin);
			var checkout_date = string_to_date(checkout);
			if(checkin_date > checkout_date)
				errors.add('#search_check_in', "Check in date cannot be later than the check out date");
		}
	};

	var display_validation_errors = function(id, errors){
		var content = '';
		errors.each(function(elementId){
			content += '<p>' + this.join(' and ') + '</p>';
		})
		$(id).html(content);
	};

  // Remove validation error CSS class when field becomes valid.
  $('#search_query').change(function() {
    if ('' != $.trim($(this).val())) {
      $(this).removeClass(validation_error_css_class);
    }
  });
  $('#search_check_in, #search_check_out').change(function() {
    if ('' != $.trim($(this).val())) {
      if (validate_date_format(('#'+$(this).get(0).id))) {
        $(this).removeClass(validation_error_css_class);
      }
    }
  });
    
});