// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
// ===================================================================

// CONSTRUCTOR for the CalendarPopup Object
function CalendarPopup() {
  var c;
  if (arguments.length>0) {
    c = new PopupWindow(arguments[0]);
    c.setSize(150,130); // width,height
  }
  else {
    c = new PopupWindow();
    c.setSize(150,175);
  }

  c.offsetX = 25;
  c.offsetY = 0;
  // Calendar-specific properties
  c.monthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
  c.monthAbbreviations = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
  c.dayHeaders = new Array("S","M","T","W","T","F","S");
  c.returnFunction = "CalendarPopup_tmpReturnFunction";
  c.returnMonthFunction = "CalendarPopup_tmpReturnMonthFunction";
  c.returnQuarterFunction = "CalendarPopup_tmpReturnQuarterFunction";
  c.returnYearFunction = "CalendarPopup_tmpReturnYearFunction";
  c.weekStartDay = 0;
  c.isShowYearNavigation = false;
  c.displayType = "date";
  c.disabledWeekDays = new Object();
  c.yearSelectStartOffset = 2;
  c.currentDate = null;
  c.todayText="Today";
  window.CalendarPopup_targetInput = null;
  window.CalendarPopup_dateFormat = "mm/dd/yyyy";
  // Method mappings
  c.setReturnFunction = CalendarPopup_setReturnFunction;
  c.setReturnMonthFunction = CalendarPopup_setReturnMonthFunction;
  c.setReturnQuarterFunction = CalendarPopup_setReturnQuarterFunction;
  c.setReturnYearFunction = CalendarPopup_setReturnYearFunction;
  c.setMonthNames = CalendarPopup_setMonthNames;
  c.setMonthAbbreviations = CalendarPopup_setMonthAbbreviations;
  c.setDayHeaders = CalendarPopup_setDayHeaders;
  c.setWeekStartDay = CalendarPopup_setWeekStartDay;
  c.setDisplayType = CalendarPopup_setDisplayType;
  c.setDisabledWeekDays = CalendarPopup_setDisabledWeekDays;
  c.setYearSelectStartOffset = CalendarPopup_setYearSelectStartOffset;
  c.setTodayText = CalendarPopup_setTodayText;
  c.showYearNavigation = CalendarPopup_showYearNavigation;
  c.showCalendar = CalendarPopup_showCalendar;
  c.hideCalendar = CalendarPopup_hideCalendar;
  c.getStyles = CalendarPopup_getStyles;
  c.refreshCalendar = CalendarPopup_refreshCalendar;
  c.getCalendar = CalendarPopup_getCalendar;
  c.select = CalendarPopup_select;
  c.isVisible = false;
  // Return the object
  return c;
}

// Temporary default functions to be called when items clicked, so no error is thrown
function CalendarPopup_tmpReturnFunction(y,m,d) {
  if (window.CalendarPopup_targetInput!=null) {
    var dt = new Date(y,m-1,d,0,0,0);
    window.CalendarPopup_targetInput.value = formatDate(dt,window.CalendarPopup_dateFormat);
  }
  else {
    alert('Use setReturnFunction() to define which function will get the clicked results!');
  }
}
function CalendarPopup_tmpReturnMonthFunction(y,m) {
  alert('Use setReturnMonthFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , month='+m);
}
function CalendarPopup_tmpReturnQuarterFunction(y,q) {
  alert('Use setReturnQuarterFunction() to define which function will get the clicked results!\nYou clicked: year='+y+' , quarter='+q);
}
function CalendarPopup_tmpReturnYearFunction(y) {
  alert('Use setReturnYearFunction() to define which function will get the clicked results!\nYou clicked: year='+y);
}

// Set the name of the functions to call to get the clicked item
function CalendarPopup_setReturnFunction(name)        { this.returnFunction = name; }
function CalendarPopup_setReturnMonthFunction(name)   { this.returnMonthFunction = name; }
function CalendarPopup_setReturnQuarterFunction(name) { this.returnQuarterFunction = name; }
function CalendarPopup_setReturnYearFunction(name)    { this.returnYearFunction = name; }

// Over-ride the built-in month names
function CalendarPopup_setMonthNames() {
  for (var i=0; i<arguments.length; i++) { this.monthNames[i] = arguments[i]; }
}

// Over-ride the built-in month abbreviations
function CalendarPopup_setMonthAbbreviations() {
  for (var i=0; i<arguments.length; i++) { this.monthAbbreviations[i] = arguments[i]; }
}

// Over-ride the built-in column headers for each day
function CalendarPopup_setDayHeaders() {
  for (var i=0; i<arguments.length; i++) { this.dayHeaders[i] = arguments[i]; }
}

// Set the day of the week (0-7) that the calendar display starts on
// This is for countries other than the US whose calendar displays start on Monday(1), for example
function CalendarPopup_setWeekStartDay(day) { this.weekStartDay = day; }

// Show next/last year navigation links
function CalendarPopup_showYearNavigation() { this.isShowYearNavigation = true; }

// Which type of calendar to display
function CalendarPopup_setDisplayType(type) {
  if (type!="date" && type!="week-end" && type!="month" && type!="quarter" && type!="year") {
    alert("Invalid display type! Must be one of: date,week-end,month,quarter,year");
    return false;
  }
  this.displayType=type;
}

// How many years back to start by default for year display
function CalendarPopup_setYearSelectStartOffset(num) { this.yearSelectStartOffset=num; }

// Set which weekdays should not be clickable
function CalendarPopup_setDisabledWeekDays() {
  this.disabledWeekDays = new Object();
  for (var i=0; i<arguments.length; i++) {
    this.disabledWeekDays[arguments[i]] = true;
  }
}

// Set the text to use for the "Today" link
function CalendarPopup_setTodayText(text) {
  this.todayText = text;
}

// Hide a calendar object
function CalendarPopup_hideCalendar() {
  if (arguments.length > 0) {
    window.popupWindowObjects[arguments[0]].isVisible = false; window.popupWindowObjects[arguments[0]].hidePopup();
  }
  else {
    this.isVisible = false; this.hidePopup();
  }
}

// Refresh the contents of the calendar display
function CalendarPopup_refreshCalendar(index) {
  var calObject = window.popupWindowObjects[index];
  today = new Date();

  if (arguments[2] < today.getFullYear() || (arguments[2] == today.getFullYear() && arguments[1] < eval(today.getMonth()+1))) {
    alert('You cannot select a date before today.');
    return;
  }

  if (arguments[2] > eval(today.getFullYear()+1) || (arguments[2] == eval(today.getFullYear()+1)) && arguments[1] > eval(today.getMonth()+1)) {
    alert('You cannot select a date more than one year in advance.');
    return;
  }

  if (arguments.length>1) {
    calObject.populate(calObject.getCalendar(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]));
  }
  else {
    calObject.populate(calObject.getCalendar());
  }
  calObject.refresh();
}

// Populate the calendar and display it
function CalendarPopup_showCalendar(anchorname) {
  if (!this.isVisible) { this.isVisible = true; }
  this.populate(this.getCalendar());
  this.showPopup(anchorname);
}

// Simple method to interface popup calendar with a text-entry box
function CalendarPopup_select(inputobj, linkname, format) {
  if (!window.getDateFromFormat) {
    alert("calendar.select: To use this method you must also include 'date.js' for date formatting");
    return;
  }
  if (this.displayType!="date"&&this.displayType!="week-end") {
    alert("calendar.select: This function can only be used with displayType 'date' or 'week-end'");
    return;
  }
  if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") {
    alert("calendar.select: Input object passed is not a valid form input object");
    window.CalendarPopup_targetInput=null;
    return;
  }
  window.CalendarPopup_targetInput = inputobj;
  if (inputobj.value!="") {
    var time = getDateFromFormat(inputobj.value,format);
    if (time==0) { this.currentDate=null; }
    else { this.currentDate=new Date(time); }
  }
  else { this.currentDate=null; }
  window.CalendarPopup_dateFormat = format;
  this.showCalendar(linkname);
}

// Get style block needed to display the calendar correctly
function CalendarPopup_getStyles() {
  var result = "";
  result += "<STYLE>\n";
  result += "TD.cal { font-family:arial; font-size: 8pt; }\n";
  result += "TD.calmonth { font-family:arial; font-size: 8pt; text-align: right; line-height: 10px;}\n";
  result += "TD.caltoday { font-family:arial; font-size: 8pt; text-align: right; color: white; background-color:#C0C0C0; border-width:1; border-type:solid; border-color:#800000; }\n";
  result += "A.textlink { font-family:arial; font-size: 8pt; height: 20px; color: black; }\n";
  result += ".disabledtextlink { font-family:arial; font-size: 8pt; height: 20px; color: #808080; }\n";
  result += "A.cal { text-decoration:none; color:#000000; }\n";
  result += "A.calthismonth { text-decoration:none; color:#000000; }\n";
  result += "A.calothermonth { text-decoration:none; color:#808080; }\n";
  result += ".calnotclickable { color:#808080; }\n";
  result += "</STYLE>\n";
  return result;
}

// Return a string containing all the calendar code to be displayed
function CalendarPopup_getCalendar() {
  var now = new Date();
  // Reference to window
  if (this.type == "WINDOW") { var windowref = "window.opener."; }
  else { var windowref = ""; }
  var result = "";
  // If POPUP, write entire HTML document
  if (this.type == "WINDOW") {
    result += "<HTML><HEAD><TITLE>Calendar Discount Cruise Deals</TITLE>"+this.getStyles()+"</HEAD><BODY MARGINWIDTH=0 MARGINHEIGHT=0 TOPMARGIN=0 RIGHTMARGIN=0 LEFTMARGIN=0>\n";
    result += '<CENTER><TABLE WIDTH=100% BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
  }
  else {
    result += '<TABLE WIDTH=144 BORDER=1 BORDERWIDTH=1 BORDERCOLOR="#808080" CELLSPACING=0 CELLPADDING=1>\n';
    result += '<TR><TD ALIGN=CENTER>\n';
    result += '<CENTER>\n';
  }

  // Code for DATE display (default)
  // -------------------------------
  if (this.displayType=="date" || this.displayType=="week-end") {
    if (this.currentDate==null) { this.currentDate = now; }
    if (arguments.length > 0) { var month = arguments[0]; }
      else { var month = this.currentDate.getMonth()+1; }
    if (arguments.length > 1) { var year = arguments[1]; }
      else { var year = this.currentDate.getFullYear(); }
    var daysinmonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
    if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) {
      daysinmonth[2] = 29;
    }
    var current_month = new Date(year,month-1,1);
    var display_year = year;
    var display_month = month;
    var display_date = 1;
    var weekday= current_month.getDay();
    var offset = 0;
    if (weekday >= this.weekStartDay) {
      offset = weekday - this.weekStartDay;
    }
    else {
      offset = 7-this.weekStartDay+weekday;
    }
    if (offset > 0) {
      display_month--;
      if (display_month < 1) { display_month = 12; display_year--; }
      display_date = daysinmonth[display_month]-offset+1;
    }
    var next_month = month+1;
    var next_month_year = year;
    if (next_month > 12) { next_month=1; next_month_year++; }
    var last_month = month-1;
    var last_month_year = year;
    if (last_month < 1) { last_month=12; last_month_year--; }
    var date_class;
    if (this.type!="WINDOW") {
      result += '<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
    }
    result += '<TR BGCOLOR="#C0C0C0">\n';
    var refresh = 'javascript:'+windowref+'CalendarPopup_refreshCalendar';
    if (this.isShowYearNavigation) {
      var td = '<TD BGCOLOR="#C0C0C0" CLASS="cal" ALIGN=CENTER VALIGN=MIDDLE ';
      result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');">&lt;</A></B></TD>';
      result += td + ' WIDTH=58>'+this.monthNames[month-1]+'</TD>';
      result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');">&gt;</A></B></TD>';
      result += td + ' WIDTH=10>&nbsp;</TD>';
      result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+month+','+(year-1)+');">&lt;</A></B></TD>';
      result += td + ' WIDTH=36>'+year+'</TD>';
      result += td + ' WIDTH=10><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+month+','+(year+1)+');">&gt;</A></B></TD>';
    }
    else {
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+last_month+','+last_month_year+');">&lt;&lt;</A></B></TD>\n';
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=100 ALIGN=CENTER>'+this.monthNames[month-1]+' '+year+'</TD>\n';
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="'+refresh+'('+this.index+','+next_month+','+next_month_year+');">&gt;&gt;</A></B></TD>\n';
    }
    result += '</TR></TABLE>\n';
    result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
    result += '<TR>\n';
    var td = '  <TD CLASS="cal" ALIGN=RIGHT WIDTH=14%>';
    for (var j=0; j<7; j++) {
      result += td+this.dayHeaders[(this.weekStartDay+j)%7]+'</TD>\n';
    }
    result += '</TR>\n';
    result += '<TR><TD COLSPAN=7 ALIGN=CENTER><IMG src="images/graypixel.gif" WIDTH=120 HEIGHT=1></TD></TR>\n';
    for (var row=1; row<=6; row++) {
      result += '<TR>\n';
      for (var col=1; col<=7; col++) {
        if (display_month == month) {
          date_class = "calthismonth";
        }
        else {
          date_class = "calothermonth";
        }
        if ((display_month == this.currentDate.getMonth()+1) && (display_date==this.currentDate.getDate()) && (display_year==this.currentDate.getFullYear())) {
          td_class="caltoday";
        }
        else {
          td_class="calmonth";
        }
        if (this.disabledWeekDays[col-1]) {
          date_class="calnotclickable";
          result += '  <TD CLASS="'+td_class+'"><SPAN CLASS="'+date_class+'">'+display_date+'</SPAN></TD>\n';
        }
        else {
          var selected_date = display_date;
          var selected_month = display_month;
          var selected_year = display_year;
          if (this.displayType=="week-end") {
            var d = new Date(selected_year,selected_month-1,selected_date,0,0,0,0);
            d.setDate(d.getDate() + (7-col));
            selected_year = d.getYear();
            if (selected_year < 1000) { selected_year += 1900; }
            selected_month = d.getMonth()+1;
            selected_date = d.getDate();
          }
          result += '  <TD CLASS="'+td_class+'"><A HREF="javascript:'+windowref+this.returnFunction+'('+selected_year+','+selected_month+','+selected_date+');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+display_date+'</A></TD>\n';
        }
        display_date++;
        if (display_date > daysinmonth[display_month]) {
          display_date=1;
          display_month++;
        }
        if (display_month > 12) {
          display_month=1;
          display_year++;
        }
      }
      result += '</TR>';
    }
    var current_weekday = now.getDay();
    result += '<TR><TD COLSPAN=7 ALIGN=CENTER><IMG src="images/graypixel.gif" WIDTH=120 HEIGHT=1></TD></TR>\n';
    result += '<TR>\n';
    result += '  <TD COLSPAN=7 ALIGN=CENTER>\n';
    if (this.disabledWeekDays[current_weekday+1]) {
      result += '    <SPAN CLASS="disabledtextlink">'+this.todayText+'</SPAN>\n';
    }
    else {
      result += '    <A CLASS="textlink" HREF="javascript:'+windowref+this.returnFunction+'(\''+now.getFullYear()+'\',\''+(now.getMonth()+1)+'\',\''+now.getDate()+'\');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');">'+this.todayText+'</A>\n';
    }
    result += '<A CLASS="textlink" HREF="javascript:'+'CalendarPopup_hideCalendar(\''+this.index+'\');">Close</A>\n';
    result += '    <BR>\n';
    result += '  </TD></TR></TABLE></CENTER></TD></TR></TABLE>\n';
  }

  // Code common for MONTH, QUARTER, YEAR
  // ------------------------------------
  if (this.displayType=="month" || this.displayType=="quarter" || this.displayType=="year") {
    if (arguments.length > 0) { var year = arguments[0]; }
    else {
      if (this.displayType=="year") {  var year = now.getFullYear()-this.yearSelectStartOffset; }
      else { var year = now.getFullYear(); }
    }
    if (this.displayType!="year" && this.isShowYearNavigation) {
      result += '<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
      result += '<TR BGCOLOR="#C0C0C0">\n';
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+(year-1)+');">&lt;&lt;</A></B></TD>\n';
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=100 ALIGN=CENTER>'+year+'</TD>\n';
      result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=22 ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+(year+1)+');">&gt;&gt;</A></B></TD>\n';
      result += '</TR></TABLE>\n';
    }
  }

  // Code for MONTH display (default)
  // -------------------------------
  if (this.displayType=="month") {
    // If POPUP, write entire HTML document
    result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
    for (var i=0; i<4; i++) {
      result += '<TR>';
      for (var j=0; j<3; j++) {
        var monthindex = ((i*3)+j);
        result += '<TD WIDTH=33% ALIGN=CENTER><A CLASS="textlink" HREF="javascript:'+windowref+this.returnMonthFunction+'('+year+','+(monthindex+1)+');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+this.monthAbbreviations[monthindex]+'</A></TD>';
      }
      result += '</TR>';
    }
    result += '</TABLE></CENTER></TD></TR></TABLE>\n';
  }

  // Code for QUARTER display (default)
  // ----------------------------------
  if (this.displayType=="quarter") {
    result += '<BR><TABLE WIDTH=120 BORDER=1 CELLSPACING=0 CELLPADDING=0 ALIGN=CENTER>\n';
    for (var i=0; i<2; i++) {
      result += '<TR>';
      for (var j=0; j<2; j++) {
        var quarter = ((i*2)+j+1);
        result += '<TD WIDTH=50% ALIGN=CENTER><BR><A CLASS="textlink" HREF="javascript:'+windowref+this.returnQuarterFunction+'('+year+','+quarter+');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">Q'+quarter+'</A><BR><BR></TD>';
      }
      result += '</TR>';
    }
    result += '</TABLE></CENTER></TD></TR></TABLE>\n';
  }

  // Code for YEAR display (default)
  // -------------------------------
  if (this.displayType=="year") {
    var yearColumnSize = 4;
    result += '<TABLE WIDTH=144 BORDER=0 BORDERWIDTH=0 CELLSPACING=0 CELLPADDING=0>\n';
    result += '<TR BGCOLOR="#C0C0C0">\n';
    result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=50% ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+(year-(yearColumnSize*2))+');">&lt;&lt;</A></B></TD>\n';
    result += '  <TD BGCOLOR="#C0C0C0" CLASS="cal" WIDTH=50% ALIGN=CENTER VALIGN=MIDDLE><B><A CLASS="cal" HREF="javascript:'+windowref+'CalendarPopup_refreshCalendar('+this.index+','+(year+(yearColumnSize*2))+');">&gt;&gt;</A></B></TD>\n';
    result += '</TR></TABLE>\n';
    result += '<TABLE WIDTH=120 BORDER=0 CELLSPACING=1 CELLPADDING=0 ALIGN=CENTER>\n';
    for (var i=0; i<yearColumnSize; i++) {
      for (var j=0; j<2; j++) {
        var currentyear = year+(j*yearColumnSize)+i;
        result += '<TD WIDTH=50% ALIGN=CENTER><A CLASS="textlink" HREF="javascript:'+windowref+this.returnYearFunction+'('+currentyear+');'+windowref+'CalendarPopup_hideCalendar(\''+this.index+'\');" CLASS="'+date_class+'">'+currentyear+'</A></TD>';
      }
      result += '</TR>';
    }
    result += '</TABLE></CENTER></TD></TR></TABLE>\n';
  }
  // Common
  if (this.type == "WINDOW") {
    result += "<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-8518307-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script></body></HTML>\n";
  }
  return result;
}

// custom site functions

function resetDays(selObjM, selObjD, selObjY, calObj) {
  if(!selObjM || !selObjD) {
    return;
  }

  month = selObjM.selectedIndex + 1;
  dayInd = selObjD.selectedIndex;
  if(selObjY == null || selObjY == 'null') {
    year = get_valid_year(month);
  }
  else {
    year = selObjY.options[selObjY.selectedIndex].value;
  }
  // clear day select
  daylength = selObjD.options.length
  for (i = daylength; i > 0; i--) {
    selObjD.options[i] = null;
  }
  // recreate day options
  var lastDay = getDaysInMonth(month, year);
  // confirm(lastDay);
  for (i = 1; i <= lastDay; i++) {
    selObjD.options[i-1] = new Option(i,i);
  }
  // set selected index
  if(dayInd < lastDay) {
    selObjD.selectedIndex = dayInd;
  }
  else {
    selObjD.selectedIndex = (lastDay - 1);
  }

  if (calObj != null) {
    calObj.currentDate = new Date(year, month - 1, selObjD.options[selObjD.selectedIndex].value);
  }

}

function getDaysInMonth(month, year)  {
    var days;
    // var month = calDate.getMonth()+1;
    // var year  = calDate.getFullYear();

    // RETURN 31 DAYS
    if (month==1 || month==3 || month==5 || month==7 || month==8 ||
      month==10 || month==12)  {
      days=31;
    }
    // RETURN 30 DAYS
    else if (month==4 || month==6 || month==9 || month==11) {
      days=30;
    }
    // RETURN 29 DAYS
    else if (month==2)  {
      if (isLeapYear(year)) {
        days=29;
      }
      // RETURN 28 DAYS
      else {
        days=28;
      }
    }
    return (days);
}

// CHECK TO SEE IF YEAR IS A LEAP YEAR
function isLeapYear (Year) {
    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
        return (true);
    }
    else {
        return (false);
    }
}

function get_valid_year(valid_month, valid_day) {
  if (valid_day == null) {
    valid_day = 1;
  }

  var current_Date = new Date();
  current_month = current_Date.getMonth(); // + 1 -- Please don't increment this, see function updateTravelYear below for a fix to the 'All Months' year selection for cruises. Thanks, Everybody Else.
  current_day = current_Date.getDate();

  if(valid_month == 0 || valid_month == null) {
    valid_month = current_month;
  }

  if (current_month > valid_month || (current_month == valid_month && current_day > valid_day)) {
    valid_year = current_Date.getFullYear() + 1;
  } else {
    valid_year = current_Date.getFullYear();
  }

  return valid_year;
}

function update_travel_date (month1Obj, day1Obj, month2Obj, day2Obj, daysInBetween, year1Obj, year2Obj) {
  if (isNaN(daysInBetween)) {
    daysInBetween = 2;
  }
  
  // When is selected start date?
  day_value   = day1Obj.selectedIndex + 1;
  month_value = month1Obj.selectedIndex;
  if (!year1Obj) {
    year_value = get_valid_year (month_value, day_value);
  }
  else {
    year_value = year1Obj.options[year1Obj.selectedIndex].value;
  }
  
  // When is the selected end date?
  end_day_value   = day2Obj.selectedIndex + 1;
  end_month_value = month2Obj.selectedIndex;
  if (!year2Obj) {
    end_year_value = get_valid_year(end_month_value, end_day_value);
  }
  else {
    end_year_value = year2Obj.options[year2Obj.selectedIndex].value;
  }
  
  today      = new Date(year_value, month_value, day_value); // Not really today, just the start date.
  end_date   = new Date(end_year_value, end_month_value, end_day_value);
  // next_date represents the default end date based on TRAVEL_DAYS_APART
  next_date  = new Date(year_value, month_value, day_value + daysInBetween);
  
  // For cars, stop updating the end date if it is valid, just because the start date is chanaged.
  if (document.getElementById('pickup_city') && (end_date >= next_date) && (end_date > today)) {
    return true;
  }
  
  // Set new values, valid based on input.
  month2Obj.selectedIndex = next_date.getMonth();
  day2Obj.selectedIndex   = next_date.getDate() - 1;
  
  if (year2Obj) {
    for (i = 0; i < year2Obj.options.length; i++) {
      if (year2Obj.options[i].value == next_date.getFullYear()) {
        year2Obj.selectedIndex = i;
        break;
      }
    }
  }
}

function update_vacation_date (month1Obj, day1Obj, month2Obj, day2Obj) {
  day_value = day1Obj.selectedIndex + 1;
  month_value = month1Obj.selectedIndex;
  year_value = get_valid_year (month_value, day_value);

  today = new Date (year_value, month_value, day_value);

  next_date = new Date (year_value, month_value, day_value + 7);

  month2Obj.selectedIndex = next_date.getMonth();
  day2Obj.selectedIndex = next_date.getDate() - 1;
}


function updateTravelYear(monthObj,yearObj)
{
  month     = monthObj.selectedIndex;

  current_date = new Date();
  current_year = current_date.getFullYear();

  if (month > 0 ) {
    validYear = get_valid_year(month);
  }
  else {
    validYear = current_year;
  }

  for (i = 0; i < yearObj.options.length; i++) {
    if (yearObj.options[i].value == validYear) {
      yearObj.selectedIndex = i;
      break;
    }
  }
}

