var mainCalendar;
var settingSelectedDates = false;

var startCalendar;
var endCalendar;

function initCalendars()
{
  var selectDateHandler = function(type, args, obj)
  {
    $('day').checked = true;

    if (mainCalendar.isDirty)
    {
      mainCalendar.clear();
      mainCalendar.isDirty = false;
    }

    var dates = args[0];
    var selectedDate = dates[0];
    var dateToSelect = new Date(selectedDate[0], selectedDate[1] - 1, selectedDate[2]);
    this.hiddenDateField.value = formatHiddenDateNumber(dateToSelect);
    this.visibleDateField.value = formatVisibleDateNumber(dateToSelect);

    this.isDirty = true;

    this.hide();
  };

  var selectDateRangeHandler = function(type, args, obj)
  {
    var selectedDates = args[0];
    var selectedDate = args[0][0];

    if (selectedDates.length > 1)
      return;

    var startDate = new Date(selectedDate[0], selectedDate[1] - 1, selectedDate[2]);
    var endDate = startDate;
    var daysToSelect = new Array();
    var dayToSelect = startDate;

    if ($('week').checked)
    {
      for (var i = 0; i < 7; i++)
      {
        daysToSelect[i] = dayToSelect;
        dayToSelect = YAHOO.widget.DateMath.add(dayToSelect, 'D', 1);
      }

      if ($('main-calendar'))
        selectDays(daysToSelect);

      endDate = YAHOO.widget.DateMath.add(endDate, 'D', 6);
    }

    this.isDirty = true;

    $('start').value = formatHiddenDateNumber(startDate);
    $('end').value = formatHiddenDateNumber(endDate);

    $('start-date').value = formatVisibleDateNumber(startDate);
    $('end-date').value = formatVisibleDateNumber(endDate);

    clearRangeCalendars();

    if (!settingSelectedDates)
      doCalendarSearch();
  };

  if ($('main-calendar'))
  {
    mainCalendar = new YAHOO.widget.Calendar('mainCalendar','main-calendar', {mindate:minDate, maxdate:maxDate, WEEKDAYS_SHORT:['S','M','T','W','T','F','S']});

    mainCalendar.startDateField = document.getElementById('start');
    mainCalendar.endDateField = document.getElementById('end');

    mainCalendar.selectEvent.subscribe(selectDateRangeHandler, mainCalendar, true);

    mainCalendar.render();
  }

  startCalendar = new YAHOO.widget.Calendar('startCalendar','start-calendar', {mindate:minDate, maxdate:maxDate, close:true, SHOW_WEEKDAYS:true, WEEKDAYS_SHORT:['S','M','T','W','T','F','S']});
  endCalendar = new YAHOO.widget.Calendar('endCalendar','end-calendar', {mindate:minDate, maxdate:maxDate, close:true, SHOW_WEEKDAYS:true, WEEKDAYS_SHORT:['S','M','T','W','T','F','S']});

  startCalendar.hiddenDateField = document.getElementById('start');
  endCalendar.hiddenDateField = document.getElementById('end');
  startCalendar.visibleDateField = document.getElementById('start-date');
  endCalendar.visibleDateField = document.getElementById('end-date');

  startCalendar.selectEvent.subscribe(selectDateHandler, startCalendar, true);
  endCalendar.selectEvent.subscribe(selectDateHandler, endCalendar, true);

  startCalendar.render();
  endCalendar.render();

  YAHOO.util.Event.addListener('show-start', 'click', function()
  {
    if ($('end-calendar').style.display == 'block')
      endCalendar.hide();
    startCalendar.show();
  }, startCalendar, true);
  YAHOO.util.Event.addListener('show-end', 'click', endCalendar.show, endCalendar, true);

  YAHOO.util.Event.addListener('start-date', 'blur', validateVisibleDateField);
  YAHOO.util.Event.addListener('end-date', 'blur', validateVisibleDateField);
}

YAHOO.util.Event.onDOMReady(initCalendars);
YAHOO.util.Event.onDOMReady(setSelectedDates);
YAHOO.util.Event.addListener('start-date', 'keypress', function (e) { if (e.keyCode==13) doCalendarSearch();})
YAHOO.util.Event.addListener('end-date', 'keypress', function (e) { if (e.keyCode==13) doCalendarSearch();})

function selectDays(days)
{
  settingSelectedDates = true;
  mainCalendar.setMonth(days[0].getMonth());
  mainCalendar.setYear(days[0].getFullYear());
  mainCalendar.select(days);
  mainCalendar.render();
  settingSelectedDates = false;
}

function clearRangeCalendars()
{
  if (startCalendar.isDirty)
  {
    startCalendar.clear();
    startCalendar.isDirty = false;
  }

  if (endCalendar.isDirty)
  {
    endCalendar.clear();
    endCalendar.isDirty = false;
  }
}

function formatVisibleDateNumber(d)
{
  var month = d.getMonth() + 1;
  var date = d.getDate();
  var year = d.getFullYear();

  if ((month + '').length < 2)
    month = '0' + month;

  if ((date + '').length < 2)
    date = '0' + date;

  return month + '/' + date + '/' + year;
}

function formatHiddenDateNumber(d)
{
  var month = d.getMonth() + 1;
  var date = d.getDate();
  var year = d.getFullYear();

  if (month < 10)
    month = '0' + month;

  if (date < 10)
    date = '0' + date;

  return (year + '') + (month + '') + (date + '');
}

function parseDateNumber(number)
{
  if (! number)
    return;

  number = number + '';

  var year = number.substr(0, 4);
  var month = number.substr(4, 2);

  if (month.substr(0, 1) == '0')
    month = month.substr(1, 1);

  month = month - 1;

  var day = number.substr(6, 2);

  if (day.substr(0, 1) == '0')
    day = day.substr(1, 1);

  return new Date(year, month, day);
}

function setSelectedDates()
{
  var oneDay = 1000*60*60*24;
  var today = new Date();

  var startDate;
  if (getQueryStringParameter('start'))
    startDate = parseDateNumber(getQueryStringParameter('start'));
  else
    startDate = today;

  var endDate;
  if (getQueryStringParameter('end'))
    endDate = parseDateNumber(getQueryStringParameter('end'));
  else
    endDate = today;

  if (endDate.getTime() < startDate.getTime())
  {
    alert('The end date must be after the start date.');
    return;
  }

  var daysToSelect = new Array();

  daysToSelect[0] = startDate;

  var numberOfAdditionalDaysToSelect = Math.floor(endDate.getTime() / (oneDay) - startDate.getTime() / (oneDay));
  var agent = navigator.userAgent.toLowerCase();
  if (agent.indexOf('msie') != -1 && numberOfAdditionalDaysToSelect > 712)
    numberOfAdditionalDaysToSelect = 712;
  for (var i = 1; i <= numberOfAdditionalDaysToSelect; i++)
  {
    var nextDay = new Date();
    var timeToAdd = oneDay * i;
    var nextDayTime = startDate.getTime() + timeToAdd;
    nextDay.setTime(nextDayTime);
    daysToSelect[i] = nextDay;
  }

  if ($('main-calendar'))
    selectDays(daysToSelect);
}

function validateVisibleDateField()
{
  if (this.value != '')
  {
    var dateValues = this.value.split('/');
    if (dateValues.length != 3
        || dateValues[0].length != 2
        || dateValues[1].length != 2
        || dateValues[2].length != 4
        || parseInt(dateValues[0]) == 'NaN'
        || parseInt(dateValues[1]) == 'NaN'
        || parseInt(dateValues[2]) == 'NaN')
      alert('Dates must be in the form MM/DD/YYYY');
  }
}

function doCalendarSearch()
{
  var startStr = $('start-date').value;
  var endStr = $('end-date').value;

  // check for undefined
  if (startStr == '' || endStr == '')
  {
    alert('You must enter both a start and end date.')
    return;
  }

  // check for valid start date
  var startDate = parseDate(startStr);
  var endDate = parseDate(endStr);

  if (startDate == 'Invalid Date')
  {
      alert('The start date "' + startStr + '" doesn\'t appear to be valid. Dates must be in the form MM/DD/YYYY.');
      return;
  }

  // check for valid end date
  if (endDate == 'Invalid Date')
  {
      alert('The end date "' + endStr + '" doesn\'t appear to be valid. Dates must be in the form MM/DD/YYYY.');
      return;
  }

  // check that end comes after start date
  if (endDate.getTime() < startDate.getTime())
  {
    alert('The end date must be after the start date.');
    return;
  }

  // check for valid date range
  var minYear = $('change-year').options[0].value;
  var maxYear = $('change-year').options[$('change-year').options.length - 1].value;

  if (startDate.getFullYear() < minYear)
  {
    alert('The start date must be after the year ' + Number(minYear) + '.');
    return;
  }

  if (endDate.getFullYear() > maxYear)
  {
    alert('The end date must be before the year ' + (Number(maxYear) + 1) + '.');
    return;
  }
  $('start').value = formatHiddenDateNumber(startDate);
  $('end').value = formatHiddenDateNumber(endDate);

  $('calendar-search').submit();
}

function parseDate(dateStr)
{
  var dateValues = dateStr.split('/');
  if (dateValues.length != 3
      || !dateValues[0]
      || !dateValues[1]
      || !dateValues[2]
      || dateValues[0].length < 1
      || dateValues[1].length < 1
      || dateValues[2].length != 4
      || dateValues[0] > 12
      || dateValues[1] > 31)
  {
    return 'Invalid Date';
  }
  else {
    return new Date(dateValues[2], dateValues[0] - 1, dateValues[1]);
  }
}

function changeYear()
{
  var yearSelect = $('change-year');

  mainCalendar.setYear(yearSelect[yearSelect.selectedIndex].value);
  mainCalendar.render();
}

function doArchiveSearch()
{
  var startStr = $('start-date').value;
  var endStr = $('end-date').value;

  // check for undefined
  if (startStr == '' || endStr == '')
  {
    alert('You must enter both a start and end date.')
    return;
  }

  // check for valid start date
  var startDate = parseDate(startStr);
  var endDate = parseDate(endStr);

  if (startDate == 'Invalid Date')
  {
      alert('The start date "' + startStr + '" doesn\'t appear to be valid. Dates must be in the form MM/DD/YYYY.');
      return;
  }

  // check for valid end date
  if (endDate == 'Invalid Date')
  {
      alert('The end date "' + endStr + '" doesn\'t appear to be valid. Dates must be in the form MM/DD/YYYY.');
      return;
  }

  // check that end comes after start date
  if (endDate.getTime() < startDate.getTime())
  {
    alert('The end date must be after the start date.');
    return;
  }

  $('start').value = formatHiddenDateNumber(startDate);
  $('end').value = formatHiddenDateNumber(endDate);

  $('archive-search').submit();
}