var calDay;

var thisDate = YAHOO.widget.DateMath.findMonthEnd(currDate);
var maxDaysInMonth = new Array();
var count = 0;
while (count < 12) {
  var currMonth = "" + (thisDate.getMonth() + 1);
  maxDaysInMonth[currMonth] = thisDate.getDate();
  thisDate = YAHOO.widget.DateMath.add(thisDate, YAHOO.widget.DateMath.DAY, 1);
  thisDate = YAHOO.widget.DateMath.findMonthEnd(thisDate);
  count++;
}

function init() {
  this.today = currDate;

  var thisMonth = this.today.getMonth();
  var thisDay = this.today.getDate();
  var thisYear = this.today.getFullYear();

  var monthNameWith0Index = new Array();
  for ( var count = 0; count < monthNames.length + 1; count++)
    monthNameWith0Index[count] = monthNames[count + 1];

  var mindate = YAHOO.widget.DateMath.add(this.today, YAHOO.widget.DateMath.DAY, 0);
  var maxdate = YAHOO.widget.DateMath.add(this.today, YAHOO.widget.DateMath.DAY, 330);

  if (this.cal1 == null)
    this.cal1 = new YAHOO.widget.CalendarGroup("YAHOO.webqtrip.cal1", "box1", {
      close:true,
      mindate :mindate,
      maxdate :maxdate,
      iframe :true,
      pages:CALENDAR_MAX_DISPLAY
    });
  this.cal1.title = cal1Title;
  
  this.cal1.cfg.setProperty("LOCALE_MONTHS", "long");
  this.cal1.cfg.setProperty("MONTHS_LONG", monthNameWith0Index);
  this.cal1.cfg.setProperty("LOCALE_WEEKDAYS", "short");
  this.cal1.cfg.setProperty("WEEKDAYS_SHORT", dayNames);
  this.cal1.selectEvent.subscribe(handleSelectDeparture, this.cal1, true);
  this.cal1.render();

  if (this.cal2 == null)
    this.cal2 = new YAHOO.widget.CalendarGroup("YAHOO.webqtrip.cal2", "box2", {
      close:true,
      mindate :mindate,
      maxdate :maxdate,
      iframe :true,
      pages:CALENDAR_MAX_DISPLAY
    });
  this.cal2.title = cal2Title;
  
  this.cal2.cfg.setProperty("LOCALE_MONTHS", "long");
  this.cal2.cfg.setProperty("MONTHS_LONG", monthNameWith0Index);
  this.cal2.cfg.setProperty("LOCALE_WEEKDAYS", "short");
  this.cal2.cfg.setProperty("WEEKDAYS_SHORT", dayNames);
  this.cal2.selectEvent.subscribe(handleSelectReturn, this.cal2, true);
  this.cal2.render();
}

function handleSelectDeparture(type, args, obj) {
  handleSelect('outbound', args);
}

function handleSelectReturn(type, args, obj) {
  handleSelect('inbound', args);
}

function handleSelect(direction, args) {
  var dateFieldStr;
  var dayFieldStr;
  var dateField;
  var thisCal;
  var journeySpanOW = document.getElementById("journeySpanOW");
  if (direction == 'inbound') {
    dayFieldStr = document.getElementById("returnDateDay");
    dateFieldStr = document.getElementById("returnDateStr");
    dateField = document.getElementById("returnDate");
    thisCal = this.cal2;
    thisCal.hide();
  } else {
    dayFieldStr = document.getElementById("departureDateDay");
    dateFieldStr = document.getElementById("departureDateStr");
    dateField = document.getElementById("departureDate");
    thisCal = this.cal1;
    thisCal.hide();
  }
  var dates = args[0];
  var date = dates[0];
  var year = date[0], month = date[1], day = date[2];
  if (!day || !month || !year)
  {
	  var dateSplit = dateFieldStr.value.split(" ");
	  day = dateSplit[0];
	  month = getMonth(dateSplit[1]);
	  year = dateSplit[2];
  }	  
  else if (dateFieldStr) dateFieldStr.value = formatDateField(day, month, year);
  if (dateField) dateField.value = year + "-" + padLeft("" + month, '0', 2) + "-" + padLeft("" + day, '0', 2);
  if (dayFieldStr) dayFieldStr.innerHTML = dayNames[thisCal.getSelectedDates()[0].getDay()];

  // ensure inbound calendar dates are within range
  var departureDate = this.cal1.getSelectedDates()[0];
  var returnDate = this.cal2.getSelectedDates()[0];
  this.cal2.cfg.setProperty("mindate", departureDate);
  if (returnDate != null && Date.parse(returnDate) > Date.parse(departureDate)) {
  } else {
    this.cal2.cfg.setProperty("pagedate", (departureDate.getMonth() + 1) + "/" + departureDate.getFullYear());
  }
  if (Date.parse(returnDate) < Date.parse(departureDate)) {
	if (!journeySpanOW.checked){
		  this.cal2.select(departureDate);
	}
  }
  this.cal2.render();
}

/*
 * update calendar with date of format yyyy-mm-dd
 */
function updateCal(direction, dateStr) {
  var thisCal;
  if (direction == 'inbound') {
    thisCal = this.cal2;
  } else {
    thisCal = this.cal1;
  }
  if (dateStr != "") {
    var str = dateStr.split("-");
    var date = "" + getNumber(str[1]) + "/" + (getNumber(str[2])) + "/" + str[0];
    if (str.length < 3){
    	str = dateStr.split("/");
    	date = "" + getNumber(str[1]) + "/" + (getNumber(str[0])) + "/" + str[2];
    }
 if (thisCal != null) {
      thisCal.select(date);
      var firstDate = thisCal.getSelectedDates()[0];
      thisCal.cfg.setProperty("pagedate", (firstDate.getMonth() + 1) + "/" + firstDate.getFullYear());
      thisCal.render();
    }
  }

}

/*
 * initialise date fields
 */
function setDates() {
  var updateDates = document.getElementById("refreshDates");
  var departureDate = document.getElementById("departureDate");
  var returnDate = document.getElementById("returnDate");
  var journeySpanOW = document.getElementById("journeySpanOW");
  // use dates from the search form
  if (updateDates && updateDates.value == "true") {
    if (departureDate.value != "" && returnDate.value != "") {
      updateCal("outbound", departureDate.value);
      if (!journeySpanOW.checked){
    	  updateCal("inbound", returnDate.value);
      }
    }
  } else { // use current date
    var dd = this.today.getDate();
    var mm = this.today.getMonth() + 1;
    var yyyy = this.today.getFullYear();
    var dateStr = yyyy + "-" + padLeft("" + mm, '0', 2) + "-" + padLeft("" + dd, '0', 2);
    updateCal("outbound", dateStr);
    if (!journeySpanOW.checked){
    	updateCal("inbound", dateStr);
    }

  }
  this.cal2.render();
}

function initJourneySpan() {
  var journeySpanRT = document.getElementById("journeySpanRT");
  var journeySpanOW = document.getElementById("journeySpanOW");
  if (selectedJourneySpan == 'OW') {
    journeySpanOW.click();
  } else {
    journeySpanRT.click();
  }
}

function updateJourneySpan() {
  var journeySpanRT = document.getElementById("journeySpanRT");
  var journeySpanOW = document.getElementById("journeySpanOW");
  if (journeySpanOW.checked) {
    disableReturnCalendar();
  } else {
    enableReturnCalendar();
  }
}

function disableReturnCalendar() {
  var returnCalendar = document.getElementById("returnCalendar");
  hideDiv(returnCalendar);
}

function enableReturnCalendar() {
  var returnCalendar = document.getElementById("returnCalendar");
  showDiv(returnCalendar);
}

function calendarHandlers() {
  YAHOO.util.Event.onDOMReady( function initCalendars() {
    /**
     * DOM Event Handlers - used to hide/show the Calendar on mouse click
     */
      function depClickHandler(e, oCal) {
        // Position the Calendar
        var txtBox = YAHOO.util.Dom.getRegion("departureDateStr");
        var dateSplit = (document.getElementById("departureDateStr")).value.split(" ");
        var departureCalendar = dateSplit[0] + "/" + getMonth(dateSplit[1]) + "/" + dateSplit[2];
    	updateCal("outbound",departureCalendar);
        oCal.show();
        cal2.hide();
        //YAHOO.util.Dom.setXY(oCal.oDomContainer, [ txtBox.left, txtBox.bottom ]);
        // Stop the event from bubbling up to the document
        // YAHOO.util.Event.stopPropagation(e);
      }
      // ...except the Text box.
      function retClickHandler(e, oCal) {
        // Position the Calendar
    	var dateSplit = (document.getElementById("returnDateStr")).value.split(" ");
        var returnCalendar = dateSplit[0] + "/" + getMonth(dateSplit[1]) + "/" + dateSplit[2];
    	updateCal("inbound",returnCalendar);
    	var txtBox = YAHOO.util.Dom.getRegion("returnDateStr");
        oCal.show();
        //YAHOO.util.Dom.setXY(oCal.oDomContainer, [ txtBox.left, txtBox.bottom ]);
        // Stop the event from bubbling up to the document
        // YAHOO.util.Event.stopPropagation(e);
      }

      YAHOO.util.Event.addListener("departureDateStr", "click", depClickHandler, this.cal1);
      YAHOO.util.Event.addListener("returnDateStr", "click", retClickHandler, this.cal2);
    });
}

//override this to use a different separator
var DATE_SEPARATOR = " ";
var monthArray=new Array(12);
monthArray[1]="Jan";
monthArray[2]="Feb";
monthArray[3]="Mar";
monthArray[4]="Apr";
monthArray[5]="May";
monthArray[6]="Jun";
monthArray[7]="Jul";
monthArray[8]="Aug";
monthArray[9]="Sep";
monthArray[10]="Oct";
monthArray[11]="Nov";
monthArray[12]="Dec";
//date field formatted to dd/mm/yyyy
function formatDateField(day, month, year) {
var format = padLeft("" + day, '0', 2) + DATE_SEPARATOR + padLeft("" + monthArray[month], '0', 2) + DATE_SEPARATOR + year;
return format;
}
