//Declare Global Variables
var ie4=(document.all)? true:false;
var ns4=(document.layers)? true:false;
var ns6=(document.getElementById) ? true : false;
var ie5=(ie4 && ns6)?true:false;
if (ie5) { ns6 = false }

var calendarContainer;
var Calendar           = new Date();
var TodaysDate         = new Date();
var MaxDate            = new Date();
var SelectedDate       = new Date();
var FieldObjDay1       = new Object();
var FieldObjMonthYear1 = new Object();
var FieldObjYear1      = new Object();

var HomePage = true;
var hideHolidayType = false;

// Define Day Names and Month Names
var CALENDAR_DAYS_OF_WEEK = new Array('S','M','T','W','T','F','S');
var CALENDAR_MONTH_NAMES  = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

function constructCalendarTable( selectionFunction )
{
  if( !selectionFunction )
  {
    selectionFunction = 'setFieldDate';
  }

  // Create HTML
  var cal = '<table class="calendartable">'

  cal += '<tr>';

  // Create row for days of week
  for(var index=0; index < 7; index++)
  {
    cal += '<th>' + CALENDAR_DAYS_OF_WEEK[index] + '</th>';
  }

  cal += '</tr>';
  var day1 = Calendar.getDay();

  cal += padEmptyCalendarCells(0,day1);

  // Loop round all days in month
  for(var index=0; index < 31; index++)
  {
    var day  = Calendar.getDate();

    if( day > index )
    {
      //Get the Day No.
      var week_day = Calendar.getDay();
      //Start new table row if Sunday
      if(week_day == 0) { cal += '<tr>'; }

      if(week_day != 7)
      {
        if (((day <= TodaysDate.getDate()) && (Calendar.getMonth() == TodaysDate.getMonth()) && (Calendar.getYear() == TodaysDate.getYear())) || ((day > MaxDate.getDate()) && (Calendar.getMonth() == MaxDate.getMonth()) && (Calendar.getYear() == MaxDate.getYear())))
        {
          HTMLtd = '<td';
          // Use different style for weekend
          if ((week_day == 0) || (week_day == 6)) { HTMLtd += ' class="daycellweekend"'; }

          HTMLtd += '>';

          if ((Calendar.getDate()==TodaysDate.getDate() ) && (Calendar.getMonth() == TodaysDate.getMonth()) && (Calendar.getYear() == TodaysDate.getYear()))
          {
            // Highlight Todays Date
            cal += HTMLtd + '<span class="calendardayshighlight">' + day + '</span></td>';
          }
          else
          {
            // Disabled
            cal += HTMLtd + '<span class="calendardaysdisabled">' + day + '</span></td>';
          }
        }
        else
        {
          // Highlight Selected Date
          if ((day == SelectedDate.getDate()) && (Calendar.getMonth() == SelectedDate.getMonth()) && (Calendar.getYear() == SelectedDate.getYear()))
          {
            cal += '<td class="daycellhighlight"><a href="javascript:' + selectionFunction + '(' + day + ')">' + day + '</a></td>'
          }
          else
          {
            HTMLtd = '<td class="calendardaysTD';

            if ((week_day == 0) || (week_day == 6)) { HTMLtd += ' daycellweekend'; }

            HTMLtd += '">';

            cal += HTMLtd + '<a href="javascript:' + selectionFunction + '(' + day + ')">' + day + '</a></td>';
          }
        }
      }
      // End Row if Saturday
      if (week_day == 7) {  cal += '</tr>'; }

      // Move to next Day in month
      Calendar.setDate(day+1);
    }
  }

  // We don't want to pad because we have already reached Saturday.
  if( Calendar.getDay() != 0 )
  {
    cal += padEmptyCalendarCells(Calendar.getDay(), 7);
  }

  cal += '</table>';

  return cal;
}

function padEmptyCalendarCells(startIndex, numberOfDaysToPad)
{
  var emptyCells = '';

  // Use empty cells to add gaps until today
  for(var index = startIndex; index < numberOfDaysToPad; index++)
  {
    emptyCells += '<td';

    if( (index == 0) || (index == 6) )
    {
      emptyCells += ' class="daycellweekend"';
    }

    emptyCells += '>&nbsp;</td>';
  }

  return emptyCells;
}

// Set the value in the date field specified
function setFieldDate(DayNo)
{
  DisplayedMonth = Calendar.getMonth()
  DisplayedYear = Calendar.getYear();
  // Identify which month is selected
  if (DisplayedMonth == 0) {
    DisplayedMonth = 12
    DisplayedYear -= 1
  }
  if (DayNo < 10) { DayNo = '0' + DayNo }
  if (ns4 || ns6) { DisplayedYear += 1900 }; // Netscape Fix on Y2K
  // Set field value
  FieldObjDay1.options[DayNo-1].selected = true
  for (i=0;i<FieldObjMonthYear1.options.length;i++) {
    if (FieldObjMonthYear1.options[i].value == (DisplayedMonth + '/' + DisplayedYear)) {
      FieldObjMonthYear1.options[i].selected = true
    }
  }
  // Hide the Layer
  HideLayer();
  DynamicUpdate('date','change',1);
}

// Display new date when Month selector is used
function DispNewDate() {
  // Get value of select field
  IDRef = $('MonthSelection');
  NewDisplayDate = IDRef.value

  // Split Month and Year
  var NewDisplaySplit = NewDisplayDate.split(",")
  NewMonth = NewDisplaySplit[0]
  NewYear = NewDisplaySplit[1]
  // Set Calendar to show new month and year
  Calendar.setDate(1);
  Calendar.setMonth(NewMonth-1);
  Calendar.setYear(NewYear);
  // Update HTML
  UpdateDisplay()
}

// Generate Months as HTML options
function constructMonthsHtml()
{
  HTMLStr = ''
  TodaysDate = new Date();
  // Identify how many months are required
  MaxMonthsDisp = (MaxDate.getYear() - TodaysDate.getYear()) * 12
  MaxMonthsDisp += (MaxDate.getMonth() - TodaysDate.getMonth())  + 1

  for(index=0; index < MaxMonthsDisp; index++) {
    // Add months to current date and identify new month and year
    ShowMonth = TodaysDate.getMonth() + index
    ShowYear = TodaysDate.getYear()
    if (ns4 || ns6) { ShowYear += 1900 };
    ShowYear += Math.floor(ShowMonth / 12)
    ShowMonth = (ShowMonth % 12) + 1

    // Get the selected month and Year
    SelMonth = Calendar.getMonth() + 1
    SelYear = Calendar.getYear()
    if (ns4 || ns6) { SelYear += 1900 }; // Netscape Fix on Y2K
    SelectedOption = ''

    // Show current selection in select field
    if ((SelMonth == ShowMonth) && (SelYear == ShowYear)) { SelectedOption = ' selected ' }
    HTMLStr += '<option ' + SelectedOption + ' value="' + ShowMonth + ',' + ShowYear + '">' + CALENDAR_MONTH_NAMES[ShowMonth-1] + ' ' + ShowYear + '</option>';
  } // for
  return HTMLStr;
}

// Update the HTML and show on Layer
function UpdateDisplay()
{
  var prevMonthHTML = '&nbsp;';
  var nextMonthHTML = '&nbsp;';

  TodaysDate = new Date();
  // Generate HTML for Previous Month Link
  if ((Calendar.getMonth() != TodaysDate.getMonth()) || (Calendar.getYear() != TodaysDate.getYear())) {
      var calendar_prev="/fcao/images/buttons/form/btn-play-blue-left.gif";
    prevMonthHTML = '<a href="javascript:PrevMonth_Click()" title="Previous month"><img src="'+calendar_prev+'" alt="Previous month" /></a>'
  }
  // Generate HTML for Next Month Link
  if ((Calendar.getMonth() != MaxDate.getMonth()) || (Calendar.getYear() != MaxDate.getYear())) {
    // var calendar_next="$cms.getAssetUrl('searchpanel.article', 'calendar_next')";
    var calendar_next="/fcao/images/buttons/form/btn-play-blue.gif";
    nextMonthHTML = '<a href="javascript:NextMonth_Click()" title="Next month"><img src="'+calendar_next+'" alt="Next month" /></a>'
  }
  // Start to generate HTML for Page
  outHTML = '<div class="calendarmain">'

  // Add Month Navigation
  outHTML += '<div class="monthnav">' + prevMonthHTML + '</div>'
  outHTML += '<select id="MonthSelection" onkeyup="DispNewDate()" onchange="DispNewDate()" name="MonthSel">' + constructMonthsHtml() + '</select>'
  outHTML += '<div class="monthnav">' + nextMonthHTML + '</div>'
  // Add Calendar Table
  outHTML += constructCalendarTable();
  // Add Close link
  outHTML += '<a class="actionclose" href="javascript:HideLayer()" title="Close calendar">Close</a></div>'
  // Output HTML to Layer
  IDRef = $('divcalendar');
  IDRef.innerHTML = unescape(outHTML);
}

function getCoordinates(e) {
  var posx = 0;
  var posy = 0;
  if (!e) var e = window.event;
  if (e.pageX || e.pageY) {
    posx = e.pageX;
    posy = e.pageY;
  }
  else if (e.clientX || e.clientY)  {
    posx = e.clientX + document.body.scrollLeft
    + document.documentElement.scrollLeft;
    posy = e.clientY + document.body.scrollTop
    + document.documentElement.scrollTop;
  }
  var posarr = new Array();
  posarr[posarr.length] = posx;
  posarr[posarr.length] = posy;
  return posarr;
}

// Hide the Layer
function HideLayer()
{
  IDRef = $('divcalendar');
  IDRef.style.display = 'none';
  if (typeof(productType)!="undefined"){
    if (productType!="CRUISE"){
      ShowDropDown(1, "mainsearch");
    }
  }
  ShowDropDown(1, "mainsearch");
  ShowDropDown(1, "altsearch");
  ShowDropDown(1, "research");
  UpdateDayOfWeek();
  updateCheckoutDate();
}

function ShowDropDown(show,search)
{
  if (search == "altsearch")
  {
    select_array=new Array ("calendar_day", "calendar_month_year", "countryDestCode","resortAccomCode")
    for (var i=0; i<select_array.length; i++)
    {
      $(select_array[i]).style.visibility=(show==0)?"hidden":"visible";
    }
  }
  else if (search == "research")
  {
    select_array=new Array ("calendar_day", "calendar_month_year", "countryDestCode")
    for (var i=0; i<select_array.length; i++)
    {
      $(select_array[i]).style.visibility=(show==0)?"hidden":"visible";
    }
  }
  else if (search == "mainsearch")
  {
    select_array=new Array ("calendar_day", "calendar_month_year", "duration", "countryDestCode","resortAccomCode")
    for (var i=0; i<select_array.length; i++)
    {
      $(select_array[i]).style.visibility=(show==0)?"hidden":"visible";
    }
  }
}

/*
 * Gets a calendars HTML using the parameters as boundries and current selections.
 *
 * @container - is the container holding the calendar html
 * @param minmumDate - is a string date
 * @param maximumDate - is a string date
 * @calendarDay - Is the html element id of day field
 * @calendarMonthYear - Is the html element id of month and year field
 */
function getCalendarHTML(container, minimumDate, maximumDate, calendarDay, calendarMonthYear)
{
  setCalendarContainer( container );
  FieldObjDay1       = $( calendarDay );
  FieldObjMonthYear1 = $( calendarMonthYear );

  // Set Minimum Date
  var newMinDate = minimumDate.split("/");
  var minDate = newMinDate[1];
  var minMonth = newMinDate[0];
  if (minDate.substr(0, 1) == 0) { minDate = minDate.substr(1, 2) }
  if (minMonth.substr(0, 1) == 0) { minMonth = minMonth.substr(1, 2) }

  // Date passed in is day after today
  if (minDate > 1) { TodaysDate.setDate(minDate - 1); }

  TodaysDate.setMonth(minMonth - 1);
  TodaysDate.setYear(newMinDate[2]);

  // Set Maximum Date
  var newMaxDate = maximumDate.split("/");
  var maxDay     = newMaxDate[1];
  var maxMonth   = newMaxDate[0] - 1;
  var maxYear    = newMaxDate[2];

  MaxDate.setYear(maxYear);
  MaxDate.setMonth(maxMonth);
  MaxDate.setDate(maxDay);

  // Set current selected Date
  SelDay = FieldObjDay1.options[FieldObjDay1.selectedIndex].value;

  var arrDateSplit = FieldObjMonthYear1.value.split('/');

  SelMonth = arrDateSplit[0] - 1;
  SelYear  = arrDateSplit[1];

  // Check that Entered date is below Maximum allowable
  if (ns4 || ns6) { maxYear += 1900 };       // Netscape Fix on Y2K

  if(((SelMonth > maxMonth) && (SelYear == maxYear)) || (SelYear > maxYear))
  {
    SelDay   = 1;
    SelMonth = 1;
    SelYear  = 2000;
  }

  // Check that Entered date is after today
  var minMonth = TodaysDate.getMonth()
  var minYear  = TodaysDate.getYear()
  if (ns4 || ns6) { minYear += 1900 };       // Netscape Fix on Y2K
  if (((SelMonth < minMonth) && (SelYear == minYear)) || (SelYear < minYear)) {
    SelDay   = 1;
    SelMonth = 1;
    SelYear  = 2000;
  }
  // Set current selection
  SelectedDate.setDate(SelDay);
  SelectedDate.setMonth(SelMonth);
  SelectedDate.setYear(SelYear);

  // If no selection then start with this month and year
  if (SelYear == 2000) {
    SelMonth = TodaysDate.getMonth()
    SelYear = TodaysDate.getYear()
    if (ns4 || ns6) { SelYear += 1900 };       // Netscape Fix on Y2K
  }

  // Set to curent selection
  Calendar.setDate(1);
  Calendar.setMonth(SelMonth); // Start the calendar month at now
  Calendar.setYear(SelYear); // Start the calendar month at now

  return constructCalendarHTML();
}

function constructCalendarHTML()
{
  var prevMonthHTML = '&nbsp;';
  var nextMonthHTML = '&nbsp;';

  TodaysDate = new Date();
  // Generate HTML for Previous Month Link
  if((Calendar.getMonth() != TodaysDate.getMonth()) || (Calendar.getYear() != TodaysDate.getYear()))
  {
    var prevImg   = "/fcao/images/buttons/form/btn-play-blue-left.gif";
    prevMonthHTML = '<a href="javascript:doPrevMonthClick()" title="Previous month"><img src="'+prevImg+'" alt="Previous month" /></a>';
  }
  // Generate HTML for Next Month Link
  if ((Calendar.getMonth() != MaxDate.getMonth()) || (Calendar.getYear() != MaxDate.getYear()))
  {
    var nextImg   = "/fcao/images/buttons/form/btn-play-blue.gif";
    nextMonthHTML = '<a href="javascript:doNextMonthClick()" title="Next month"><img src="'+nextImg+'" alt="Next month" /></a>';
  }
  // Start to generate HTML for Page
  // Add Month Navigation
  var outHTML = '<div class="calendarNavPanel"><div class="monthnav">' + prevMonthHTML + '</div>';
  outHTML += '<select id="MonthSelection" onkeyup="refreshCalendar(this);" onchange="refreshCalendar(this);" name="MonthSel">' + constructMonthsHtml() + '</select>';
  outHTML += '<div class="monthnav">' + nextMonthHTML + '</div></div>';
  // Add Calendar Table
  outHTML += constructCalendarTable( 'setCalendarDateAndClose' );

  // Output HTML to Layer
  return unescape(outHTML);
}

function setCalendarDateAndClose( daySelected )
{
  var displayedMonth = Calendar.getMonth();
  var displayedYear  = Calendar.getYear();
  // Identify which month is selected
  if( displayedMonth == 0 )
  {
    displayedMonth = 12
    displayedYear -= 1
  }

  if( daySelected < 10 )
  {
    daySelected = '0' + daySelected;
  }

  if (ns4 || ns6)
  {
    displayedYear += 1900;
  } // Netscape Fix on Y2K

  // Set field value
  FieldObjDay1.options[daySelected - 1].selected = true;

  for( var i = 0, len = FieldObjMonthYear1.options.length; i < len; i++ )
  {
    if( FieldObjMonthYear1.options[i].value == (displayedMonth + '/' + displayedYear))
    {
      FieldObjMonthYear1.options[i].selected = true;
    }
  }

  globalOverlayClose();
  UpdateDayOfWeek();
  updateCheckoutDate();
  DynamicUpdate('date','change',1);
}

function getCalendarContainer()
{
  return calendarContainer;
}

function setCalendarContainer(newContainer)
{
  calendarContainer = newContainer;
}

// Move onto the next month
function doNextMonthClick()
 {
  Calendar.setDate(1);

  getCalendarContainer().update( constructCalendarHTML() );
}

// Move to the previous month
function doPrevMonthClick()
{
  NewMonth = Calendar.getMonth() - 1;
  NewYear  = Calendar.getYear();

  if (ns4 || ns6) { NewYear += 1900 }; // Netscape Fix on Y2K
  // If January then need to move to December and previous year
  if (NewMonth < 1) {
    NewMonth = 12 + NewMonth
    NewYear -= 1
  }
  // Set Calendar to new Month and Year
  Calendar.setMonth(NewMonth-1);
  Calendar.setYear(NewYear);
  Calendar.setDate(1);
  // Update HTML
  getCalendarContainer().update( constructCalendarHTML() );
}

function refreshCalendar(selection)
{
  // Split Month and Year
  var newSelectionSplit = selection.value.split(",");
  var newMonth          = newSelectionSplit[0];
  var newYear           = newSelectionSplit[1];
  // Set Calendar to show new month and year
  Calendar.setDate(1);
  Calendar.setMonth(newMonth - 1);
  Calendar.setYear(newYear);

  // Update HTML
  getCalendarContainer().update( constructCalendarHTML() );
}

function showCalendarOverlayWithConnector(whoId, daySelect, monthYearSelect)
{
  var whoId = $(whoId);
  functionsPanelOverlay( whoId, 'yes', false );

  var scuDateCalendarContainer = $( whoId.id + 'CalendarContainer' );

  scuDateCalendarContainer.update( getCalendarHTML(scuDateCalendarContainer, minSeasonDate, maxSeasonDate, daySelect, monthYearSelect) );

  clearPredictiveInputElements();

  return false;
}

function showCalendarOverlay(whoId, daySelect, monthYearSelect)
{
  var whoId = $(whoId);

  stickyShow( 'calendarLink', whoId.id + 'Overlay' );

  var scuDateCalendarContainer = $( whoId.id + 'CalendarContainer' );

  scuDateCalendarContainer.update( getCalendarHTML(scuDateCalendarContainer, minSeasonDate, maxSeasonDate, daySelect, monthYearSelect) );

  return false;
}
