$(document).ready(function() {  
  $('#hood').change(neighborhood_change);
  $('#reservation_apartment_id').change(apartment_change);
  $('#booking_range_start_date, #booking_range_end_date').
    calendar('reserve').bind('dateSelect', reserve_date_select).bind('clearedDates', check_completion);
  if ($.browser.msie && $.browser.version <= 6.0)
    $('#booking_range_start_date, #booking_range_end_date').bind('open_calendar', hide_select).
      bind('close_calendar', hide_select);
  $('#guest_country').change(country_change);
  $('input[name="booking_range[booking_type]"]').change(booking_type_change);
  $('#reservation_apartment_id, #reservation_guests').
    change(check_completion);
  $('#reservation_accepted_policy').click(check_completion);
  $('#vacation_services').click(vacation_services);
});

function hide_select() {
  if ( $('#booking_range_start_date').prev('.calendar').size() > 0 )
    $('#reservation_guests').css('visibility', 'hidden');
  else
    $('#reservation_guests').css('visibility', 'visible');
}

function vacation_services() {
  if (this.checked)
    $('#vacation_services_section').show();
  else
    $('#vacation_services_section').hide();  
}

function check_completion() {
  if ( $('#reservation_apartment_id').val() != '' &&
      valid_dates( $('#booking_range_start_date'), $('#booking_range_end_date') ) &&
      min_stay( $('#booking_range_start_date'), $('#booking_range_end_date') ) ) {
    update_total_price();
    if ( $('input[name="booking_range[booking_type]"]:checked').val() == 'blackout_booking' ||
        $('#reservation_guests').val() ) {
      $('#completed_notice .apartment').text( [ 'To reserve ',
        $('#reservation_apartment_id option:selected').text() ].join('') );
      var nights = date_nights( $('#booking_range_start_date'), $('#booking_range_end_date') );
      var nights_txt = nights == 1 ? 'one night,' : nights + ' nights,';
      $('#completed_notice .dates').text( [ 'For ', nights_txt, ' from ',
        $('#booking_range_start_date').val(), ' until ', $('#booking_range_end_date').val(),
        '.' ].join('') );
      $('p.disabled').hide();
      $('#completed_notice').show();
      $('input.next_step').removeClass('next_step_disabled').attr('disabled', false);
      if ($('#reservation_accepted_policy:checked').val())
        $('p.accept_terms').hide();
      else if (!is_manager)
        $('p.accept_terms').show();
    } else {
      $('p.accept_terms').hide();
      $('#completed_notice').hide();
      $('p.disabled').show();
      $('input.next_step').addClass('next_step_disabled').attr('disabled', true);
    }
  }
}

function update_total_price() {
  $.get('/reserve/total_price', $('.main_content form').serializeArray(), updated_total_price, 'json');
}

function updated_total_price(price) {
  $('#total_price .price').html(price.long);
  $('#completed_notice .total').html(price.short);
}

function booking_type_change() {
  if (this.value == 'blackout_booking') {
    $('#reservation_guests').attr('disabled', true);
    $('#reservation_total_price').attr('disabled', true);
  } else {
    $('#reservation_guests').attr('disabled', false);
    $('#reservation_total_price').attr('disabled', false);
  }
}

function country_change() {
  if (this.value == 'United States' || this.value == 'Canada')
    $('#province').show();
  else 
    $('#province').hide();
  return true;
}

function min_stay(check_in_el, check_out_el) {
  if (is_manager) return true;  
  var nights = date_nights(check_in_el, check_out_el);
  return isNaN(nights) ? true : nights >= 3;
}

function reserve_date_select() {
  if ( past_date( $('#booking_range_start_date'), $('#booking_range_end_date') ) ) {
    $('#reserve_date_error').show();
    $('#reserve_date_min_error').hide();  
  } else if ( !min_stay( $('#booking_range_start_date'), $('#booking_range_end_date') ) ) {
    $('#reserve_date_min_error').show();
    $('#reserve_date_error').hide();  
  } else {
    $('#reserve_date_error').hide();  
    $('#reserve_date_min_error').hide();  
  }
  check_completion();
  return true;
}

function neighborhood_change() {
  var selection = $('#reservation_apartment_id');
  var apts = neighborhood_map[this.value];
  if (apts) {
    var options = $.map(apts, 
      function(apt) { return [ '<option value="', apt.id, '">', apt.name, '</option>' ].join(''); });
    options.unshift( '<option value="">Choose an apartment</option>' );
    $('#reservation_apartment_id').html(options.join("\n"));
  } else {
    $('#reservation_apartment_id').html('<option value="">First, choose a neighborhood</option>');
  }
  check_completion();
  return true;      
}

function apartment_change() {
  // switch apartments for calendars
  apartment_lookup['reserve'] = this.value; 

  // group stuff
  var apt_rec = apartment_map[this.value];
  if (!apt_rec) {
    blocked_dates = {};
    return;
  }
  
  var max_guests = apt_rec.max_guests;
  var guests = $('#reservation_guests').val();
  var options = [];
  if (!guests || guests > max_guests)
    options.push( '<option value="">Choose number of guests</option>' ); 
  for (var i = 1; i <= max_guests; i++) {
    var selected = (guests == i) ? ' selected="selected"' : '';
    options.push( [ '<option value="', i, '"', selected, '>', i, '</option>' ].join('') ); 
  }
  $('#reservation_guests').html( options.join("\n") );
  
  // ajax date stuff
  var check_in  = $('#booking_range_start_date').val();
  var check_out = $('#booking_range_end_date'  ).val();
  update_dates( { 
    months: [ check_in, check_out ], static: false, apartment_id: this.value, 
    check_in: check_in, check_out: check_out, date_key: 'reserve', reservation_id: reservation_id} );
}
