$(document).ready(function() {
  // add handlers for events
  $("#search_from_date").change(dateHelpers.setFromDay);
  $("#search_to_date").change(dateHelpers.setToDay);
  $("#search_num_nights").blur(dateHelpers.setToDate);
  
  // calculate 'yesterday' to ensure datepickers can't select past dates
  yesterday = new Date();
  yesterday.setDate(yesterday.getDate() - 1);

  firstDay = new Date();
  firstDay.setMonth(0);
  firstDay.setDate(1);

  // set up datepickers
  $("#search_from_date").datepicker({
    dateFormat: 'dd/mm/yy', minDate: firstDay, mandatory: true
  });
  $("#search_from_date-br").datepicker({
    dateFormat: 'dd/mm/yy', minDate: firstDay, mandatory: true
  });
  $("#search_to_date").datepicker({
    dateFormat: 'dd/mm/yy', minDate: firstDay, mandatory: true,
    beforeShowDay: dateHelpers.isAfterFromDate
  });
  
  $("form#reservation").submit(formHelpers.validate);
  
  // set current days
  dateHelpers.setFromDay();
  dateHelpers.setToDay();
});

dateHelpers = {
  // set the from-day of the from-date, and set the to-date and to-day
  // values based on the number of nights
  setFromDay: function() {
    var from = dateHelpers.dateFromString($("#search_from_date").val());
    var days = parseInt($("#search_num_nights").val());
    
    if (from == null || days == null)         return;
    if (isNaN(from.getDay()) || isNaN(days))  return;
  
    $("#search_from_day").html(dateHelpers.dayName(from.getDay()));
    
    from.setTime(from.getTime() + (1000 * 60 * 60 * 24 * days));
    $("#search_to_date").val(dateHelpers.dateToString(from));
    $("#search_to_day").html(dateHelpers.dayName(from.getDay()));
  },

  // set the to-day from the to-date, and set the number of nights
  // based on the date difference
  setToDay: function() {
    var from = dateHelpers.dateFromString($("#search_from_date").val());
    var to = dateHelpers.dateFromString($("#search_to_date").val());
    
    if (from == null || to == null)                 return;
    if (isNaN(from.getDay()) || isNaN(to.getDay())) return;
  
    $("#search_to_day").html(dateHelpers.dayName(to.getDay()));
    $("#search_num_nights").val(
      parseInt((to - from)/(1000 * 60 * 60 * 24)).toString()
    );
  },

  // set the to-date based on the from-date and the number of nights
  setToDate: function() {
    var from = dateHelpers.dateFromString($("#search_from_date").val());
    var days = parseInt($("#search_num_nights").val());
    
    if (isNaN(from.getDay()) || isNaN(days)) return;
    
    from.setTime(from.getTime() + (1000 * 60 * 60 * 24 * days));
    $("#search_to_date").val(dateHelpers.dateToString(from));
    $("#search_to_day").html(dateHelpers.dayName(from.getDay()));
  },

  // parse dd/mm/yyyy value from a string into a date.
  dateFromString: function(str) {
    if (str == null) return null;
    
    var parts = str.split("/");
    var date  = new Date();
    
    for (var i = 0; i < parts.length; i++) {
      parts[i] = parts[i].replace(/^0+/, '');
    }
    
    date.setYear(parseInt(parts[2]));
    date.setMonth(parseInt(parts[1]-1),parseInt(parts[0]));
    return date;
  },

  // convert a date to a australian string representation - dd/mm/yyyy
  dateToString: function(date) {
    var day   = date.getDate().toString();
    var month = (date.getMonth() + 1).toString();
    var year  = date.getFullYear().toString();
  
    while (day.length < 2)
      day = "0" + day;
    while (month.length < 2)
      month = "0" + month;
    while (year.length < 4)
      year = "0" + year;
  
    return day + "/" + month + "/" + year;
  },
  
  // convert a day index to a string name
  dayName: function(index) {
    switch (index) {
      case 0:
        return "Sunday";
      case 1:
        return "Monday";
      case 2:
        return "Tuesday";
      case 3:
        return "Wednesday";
      case 4:
        return "Thursday";
      case 5:
        return "Friday";
      case 6:
        return "Saturday";
      default:
        return "Unknown";
    }
  },

  // helper function to ensure to-date isn't before the from-date.
  isAfterFromDate: function(date) {
    return [date > dateHelpers.dateFromString($("#search_from_date").val())];
  }
}

formHelpers = {
  validate: function() {
    var error       = "";
    var arrival     = dateHelpers.dateFromString($("#search_from_date").val());
    var departure   = dateHelpers.dateFromString($("#search_to_date").val());
    var num_adults  = $("#search_num_adults").val();
    var yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    
    if ($("#search_from_date").val().length == 0)
      error = "Please provide an arrival date";
    else if ($("#search_to_date").val().length == 0)
      error = "Please provide a departure date";
    else if ($("#search_num_nights").val().length == 0)
      error = "Please provide the number of nights";
    else if ($("#search_num_adults").val().length == 0)
      error = "Please provide the number of adults";
    else if (arrival == null || arrival <= yesterday)
      error = "Please enter a valid arrival date";
    else if (departure == null || departure < yesterday)
      error = "Please enter a valid departure date";
    else if (isNaN(parseInt(num_adults)) || parseInt(num_adults) <= 0)
      error = "Please enter a valid number of adults";
    
    if (error.length > 0) {
      // errorHelpers.display(error);
      alert(error);
      return false;
    }
    
    $("#search_from_date").val(dateHelpers.dateToString(arrival));
    $("#search_to_date").val(dateHelpers.dateToString(departure));
    setTimeout(function() { 
		  $("div.loading-booking img").attr("src", $("div.loading-booking img").attr("src"));
		}, 100);
		
    return true;
  }
}