var datesArePreFilled = true; // boolean: are dates pre-filled with default values?
var today = new Today(false, false, false);
var tomorrow = new Today(today.currentYear, today.currentMonth, today.currentDay+1);
var dateFormat = "dmy";
var arrivalDateInput     = "arrival_date";
var departureDateInput   = "departure_date";
var arrivalDateSFInput   = "sf_arrival_date";
var departureDateSFInput = "sf_departure_date";

// le variabili sessionArrivalDate possono essere opzionalmente passate dalla pagina di layout
var standardArrivalDate = sessionArrivalDate && sessionArrivalDate.length > 0 ? sessionArrivalDate : today.dateString;

var arrivalDate;
var departureDate;
arrivalDate = standardArrivalDate.split("/"); 
departureDate = new Date(arrivalDate[2], arrivalDate[1]-1, arrivalDate[0]);
departureDate.setDate(departureDate.getDate() + 1);
var standardDepartureDate = sessionDepartureDate && sessionDepartureDate.length > 0 ? sessionDepartureDate : getDateString(departureDate);

var defaultArrivalDate   = datesArePreFilled ? standardArrivalDate : '';
var defaultDepartureDate = datesArePreFilled ? standardDepartureDate : '';

function Today(yyyy, mm, gg)
{
  var t1;
  var t2;
  t1 = new Date();

  var anno = yyyy ? yyyy : t1.getFullYear();
  var mese = mm ? mm : t1.getMonth();
  var giorno = gg ? gg : t1.getDate();

  t2 = new Date(anno, mese, giorno);

  this.currentMonth = t2.getMonth();
  this.currentYear  = t2.getFullYear();
  this.currentDay   = t2.getDate();
  this.dateString   = getDateString(t2);
}

function getDateString(dateVal)
{
  var dateSeparator = "/";
  var dayString = "00" + dateVal.getDate();
  var monthString = "00" + (dateVal.getMonth()+1);
  dayString = dayString.substring(dayString.length - 2);
  monthString = monthString.substring(monthString.length - 2);

  switch (dateFormat) 
  {
    case "dmy" :
      return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
    case "mdy" :
    default :
      return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
  }
}

function makeTwoChars(inp) {
        return String(inp).length < 2 ? "0" + inp : inp;
}

function initialiseBaseInputs() {
    document.getElementById(arrivalDateInput).value = defaultArrivalDate;
    document.getElementById(departureDateInput).value = defaultDepartureDate;

    try
    {
      if (datePickerController)
      {
        // Add the onchange event handler to the start date input
        datePickerController.addEvent(document.getElementById(arrivalDateInput), "change", setReservationDates);
        datePickerController.getDatePicker(departureDateInput).setRangeLow(getNextDay(document.getElementById(arrivalDateInput).value));
      }
    }
    catch (e) 
    {
      //alert("Errore in /js/booking_datepicker.js - Funzione initialiseBaseInputs(): " + e);
    }
}

function initialiseSFInputs() {
    document.getElementById(arrivalDateSFInput).value = defaultArrivalDate;
    document.getElementById(departureDateSFInput).value = defaultDepartureDate;

    try
    {
      if (datePickerController)
      {
        // Add the onchange event handler to the start date input
        datePickerController.addEvent(document.getElementById(arrivalDateSFInput), "change", setReservationDatesSF);
        datePickerController.getDatePicker(departureDateSFInput).setRangeLow(getNextDay(document.getElementById(arrivalDateSFInput).value));
      }
    }
    catch (e) 
    {
      //alert("Errore in /js/booking_datepicker.js - Funzione initialiseSFInputs(): " + e);
    }
}

function initialiseInputs() {
    if (document.getElementById(arrivalDateInput))
    	initialiseBaseInputs();    	
    if (document.getElementById(arrivalDateSFInput))
    	initialiseSFInputs();
}

var initAttempts = 0;

function setReservationDates(e) {
    // Internet Explorer will not have created the datePickers yet so we poll the datePickerController Object using a setTimeout
    // until they become available (a maximum of ten times in case something has gone horribly wrong)
    try {
            var sd = datePickerController.getDatePicker(arrivalDateInput);
            var ed = datePickerController.getDatePicker(departureDateInput);
    } catch (err) {
            if(initAttempts++ < 10) setTimeout("setReservationDates()", 50);
            return;
    }
    // Check the value of the input is a date of the correct format
    var dt = datePickerController.dateFormat(this.value, sd.format.charAt(0) == "m");
    // If the input's value cannot be parsed as a valid date then return
    if (dt == 0) return;
    // At this stage we have a valid YYYYMMDD date
    // Grab the value set within the endDate input and parse it using the dateFormat method
    // N.B: The second parameter to the dateFormat function, if TRUE, tells the function to favour the m-d-y date format
    var edv = datePickerController.dateFormat(document.getElementById(departureDateInput).value, ed.format.charAt(0) == "m");
    // Set the low range of the second datePicker to be the date parsed from the first
    ed.setRangeLow(getNextDay(document.getElementById(arrivalDateInput).value));
    // If theres a value already present within the end date input and it's smaller than the start date
    // then clear the end date value
    if (edv < dt) 
    {
      document.getElementById(departureDateInput).value = "";
    }
}

function setReservationDatesSF(e) {
    try {
            var sd = datePickerController.getDatePicker(arrivalDateSFInput);
            var ed = datePickerController.getDatePicker(departureDateSFInput);
    } catch (err) {
            if(initAttempts++ < 10) setTimeout("setReservationDatesSF()", 50);
            return;
    }
    var dt = datePickerController.dateFormat(this.value, sd.format.charAt(0) == "m");
    // If the input's value cannot be parsed as a valid date then return
    if(dt == 0) return;
    // At this stage we have a valid YYYYMMDD date
    // Grab the value set within the endDate input and parse it using the dateFormat method
    // N.B: The second parameter to the dateFormat function, if TRUE, tells the function to favour the m-d-y date format
    var edv = datePickerController.dateFormat(document.getElementById(departureDateSFInput).value, ed.format.charAt(0) == "m");
    // Set the low range of the second datePicker to be the date parsed from the first
    ed.setRangeLow(getNextDay(document.getElementById(arrivalDateSFInput).value));
    // If theres a value already present within the end date input and it's smaller than the start date
    // then clear the end date value
    if(edv < dt) 
    {
      document.getElementById(departureDateSFInput).value = "";
    }
}

function removeBaseInputEvents() {
    // Remove the onchange event handler set within the function initialiseInputs
	datePickerController.removeEvent(document.getElementById(arrivalDateInput), "change", setReservationDates);
}

function removeSFInputEvents() {
    // Remove the onchange event handler set within the function initialiseInputs
	datePickerController.removeEvent(document.getElementById(arrivalDateSFInput), "change", setReservationDatesSF);
}

function removeInputEvents() {
    if (document.getElementById(arrivalDateInput))
    	removeBaseInputEvents();    	
    if (document.getElementById(arrivalDateSFInput))
    	removeSFInputEvents();
}

function getNextDay(day)
{
  var date = new Date();
  var parts = day.split('/');
  date.setFullYear(parts[2], parts[1] - 1, parts[0]); // year, month (0-based), day
  date.setTime(date.getTime() + 86400000);
  var newdate = getDateString(date).split('/');
  var res = newdate[2] + newdate[1] + newdate[0];

  return res;
}

datePickerController.addEvent(window, 'load', initialiseInputs);
datePickerController.addEvent(window, 'unload', removeInputEvents);