$(function() {
  
  // if (!_.isUndefined(google.loader.ClientLocation.address.city)) {
  //   if ($('#from_code').val() == '') $('#from_code').val(google.loader.ClientLocation.address.city);
  // }

  var from, to, searchResults;

  $('#search_form').submit(function()
  {
  	if ($('#from_code').val() == '') {
  		alert('To continue, please enter departure city or airport code.');
  		$('#from_code').focus();
  		return false;
  	}
  	if ($('#to_code').val() == '') {
  		alert('To continue, please enter destination city or airport code.');
  		$('#to_code').focus();
  		return false;
  	}
  	if ($('#from_code').val() == $('#to_code').val() || extractIATACode($('#from_code').val()) == extractIATACode($('#to_code').val())) {
  		alert('To continue, your destination city or airport code must be different than the departure city or airport code.');
  		$('#to_code').select();
  		return false;
    }
    if (!validateDates()) return false;

    if ($('#from_code').val() == from && $('#to_code').val() == to) {
      return false;
    } else {
      from = $('#from_code').val();
      to = $('#to_code').val();
    }

    if ($('#searchResults').is(':visible')) {
      $('div#sponsorBadges').show();
      if ($('div#sponsorBadges').height() == 0) $('div#sponsorBadges').height(100);
      $('div#sponsorBadges').block({
        message: '<img src="http://i.qs.stcdn.net/ajax-loader.gif" align="absmiddle" /> Updating. Please wait...',
        css: {
          border: '1px solid #aaa',
          padding: '8px'
        },
        overlayCSS: {
          backgroundColor: '#E3F0F6',
          opacity: 0.6
        }
      });
      $('#Continue').attr('disabled', true);
    }

    $('.fieldError').empty().hide();

    $.ajax({
      url: $(this).attr('action'),
      type: 'POST',
      data: $(this).serialize(),
      success: function(data, state, xhr){
        $('#oops').empty().hide();
        if (xhr.getResponseHeader('content-type') == 'application/json') {
          if (data.error) {
            if (_(data.error.field).isUndefined()) {
              $('#flashMessage').text(data.error.message).show();
            } else {
              $('#'+data.error.field).next().text(data.error.message).show();
            }
            $('#badges, #Continue, #searchResultsCallToAction').hide();
            $('#sponsorBadges').hide().unblock();
          } else {
            searchResults = data;
            updateResults();
            $('#searchResultsCallToAction span').text(travel_guide_safe(data.destinationForContent));
            getDeals(searchResults.product, data.places.destination, data.destinationForContent);
            getTravelGuide(searchResults.product, data.destinationForContent);
            getTopHotels(data.destinationForContent);
          }
        } else {
          $('#oops').show().html(data);
          $('#badges, #Continue, #searchResultsCallToAction').hide();
          $('#sponsorBadges').unblock();
        }
      }
    });

    return false;
  });

  function updateResults() {
    var results = searchResults;
    $('#sponsorBadges #badges').empty();
    $('#oops').empty().hide();

    if ($('#from_code').val().length == 3) $('#from_code').val(results.places.origin.display_name);
    if ($('#to_code').val().length == 3) $('#to_code').val(results.places.destination.display_name);

    var departDate = Date.parse($('#depart_date').val()),
        returnDate = Date.parse($('#return_date').val()),
        ii = 1,
        partnerIds = [];

    for (var i=0; i < results.display.length; i++) {
      if (ii > 12) break;

      if (departDate.equals(returnDate) && !parseFloat(results.display[i].accepts_same_day_return)) {
        continue;
      }

      // depart_date at least min_days_in_advance
      var min = parseFloat(results.display[i].min_days_in_advance);
      if (!_(min).isNaN() && min > 0) {
        if (departDate.compareTo(Date.today().add(min).days()) < 0) continue;
      }

      // depart_date at no more than max_days_in_advance
      var max = parseFloat(results.display[i].max_days_in_advance);
      if (!_(max).isNaN() && max > 0) {
        if (departDate.compareTo(Date.today().add(max).days()) > 0) continue;
      }

      // difference between depart_date and return_date no more than max_duration
      var max = parseFloat(results.display[i].max_duration);
      if (!_(max).isNaN() && max > 0) {
	      if (returnDate.compareTo(Date.parse($('#depart_date').val()).add(max).days()) > -1) continue;
      }

      var div = $('<div>', { 'class': 'badge' })
      div.append($('<input>', {
        type: 'checkbox',
        value: product_path + "/rd/?" + buildUrl('display', i)
      }));
      div.append($('<img>', {
        src: 'http://i.qs.stcdn.net/logos/' + results.display[i].image.replace(/(\.jpg|\.gif|\.jpeg)$/, '_sm$1'),
        width: 90,
        height: 22
      }));
      if(ii%3 == 0 ) { div.addClass("last"); }
      div.appendTo('#sponsorBadges #badges');

      partnerIds.push({ category: 'packages', partner_id: results.display[i].id });

      ii++;
    };

    if ($('#badges .badge').size() < 1) {
      $('#flashMessage').text("Sorry, but there are no partners who match your search criteria. Please amend your search and try again.").show();
      $('#badges, #Continue, #searchResultsCallToAction, #searchResults').hide();
      $('#sponsorBadges').unblock();
    } else {
      Omniture.trackQuickSearch(results, partnerIds);

      $('#flashMessage').hide();
      if ($('#searchResults').is(':visible')) $('div#sponsorBadges').unblock();        
      $('#Continue, #badges, #searchResultsCallToAction, #searchResults').show().attr('disabled', false);
    }
  }

  function buildUrl(type, i){
    return $.param($.extend({
      button_rank: i+1,
      button_max: searchResults[type].length,
      button_type: (type == 'display') ? 'badge' : type,
      name: searchResults[type][i].name,
      id: searchResults[type][i].id,
      route_id: searchResults[type][i].route
    }, searchResults.params));
  }

  function checkAndUpdate(event) {
    if (!_(searchResults).isEmpty() && !_(searchResults.display).isEmpty()) {
      var field = $(this).attr('id');
      if (field != 'to_code' || field != 'from_code') {
        searchResults.params[field] = $(this).val();
      }

      if ($('#from_code').val() != '' && $('#to_code').val() != '') {
        updateResults();
      }
    }
  }

  $('#from_code, #to_code').focusout(checkAndSubmit);
  $('#travelers, #depart_date, #return_date').change(checkAndUpdate);

});

function validateDates () {
  if (!departureDateValid('depart_date')) {
    alert("We cannot accept a departure date in the past or\nmore than 330 days in the future. Dates must be in the form of mm/dd/yy. To continue, please correct the departure date.");
    $('#depart_date').focus();
    return false;
  }
  if (!returnDateValid('depart_date', 'return_date')) {
    alert('Your chosen return date is invalid. To continue, please correct this.');
    $('#return_date').focus();
    return false;
  }
	if (!dateDayDifference('depart_date', 'return_date')) {
		alert("Packages cannot be booked for longer than 26 days. Please select an earlier return date.");
		$('#return_date').focus();
		return false;
	}
	return true;
}

function checkAndSubmit() {
  if (!validateDates()) return false;
  setTimeout(function(){
    if ($('#from_code').val() != '' && $('#to_code').val() != '') $('#search_form').submit();
  }, 200);	
}