var calendars = new Array();

function Calendar(id)
{
 this.Id = id;
 this.Periods = new Array();
 this.UpdateAllowed = true;
}

function Period(id)
{
 this.Id = id;
 this.Days = new Array();
}

function Day(id, mouseOverClassName)
{
 this.Id = id;
 this.MouseOverClassName = mouseOverClassName;
 this.MouseOutClassName = null;
}

function GetCalendar(calendarId)
{
 for (var calendarIndex = 0; calendarIndex < calendars.length; calendarIndex++)
  if (calendars[calendarIndex].Id == calendarId)
   return calendars[calendarIndex];
 return null;
}

function GetPeriod(periods, periodId)
{
 for (var periodIndex = 0; periodIndex < periods.length; periodIndex++)
  if (periods[periodIndex].Id == periodId)
  return periods[periodIndex];
 return null;
}

function DayMouseOver(calendarId, periodId)
{
 var period = GetPeriod(GetCalendar(calendarId).Periods, periodId);
 if (period.Days.length > 0)
 {
  for (var dayIndex = 0; dayIndex < period.Days.length; dayIndex++)
  {
   period.Days[dayIndex].MouseOutClassName = document.getElementById('day_' + period.Days[dayIndex].Id).className;
   document.getElementById('day_' + period.Days[dayIndex].Id).className = period.Days[dayIndex].MouseOverClassName;
  }
  var arrivalDay = document.getElementById('day_' + period.Days[0].Id);
  for (var divIndex = 0; divIndex < arrivalDay.getElementsByTagName('div').length; divIndex++)
  {
   if (arrivalDay.getElementsByTagName('div')[divIndex].className == 'period')
    arrivalDay.getElementsByTagName('div')[divIndex].style.display = 'block';
   if (arrivalDay.getElementsByTagName('div')[divIndex].className == 'price')
    arrivalDay.getElementsByTagName('div')[divIndex].style.display = 'block';
  }
 }
}

function DayMouseOut(calendarId, periodId)
{
 var period = GetPeriod(GetCalendar(calendarId).Periods, periodId);
 if (period.Days.length > 0)
 {
  for (var dayIndex = 0; dayIndex < period.Days.length; dayIndex++)
   document.getElementById('day_' + period.Days[dayIndex].Id).className = period.Days[dayIndex].MouseOutClassName;
  var arrivalDay = document.getElementById('day_' + period.Days[0].Id);
  for (var divIndex = 0; divIndex < arrivalDay.getElementsByTagName('div').length; divIndex++)
  {
   if (arrivalDay.getElementsByTagName('div')[divIndex].className == 'period')
    arrivalDay.getElementsByTagName('div')[divIndex].style.display = 'none';
   if (arrivalDay.getElementsByTagName('div')[divIndex].className == 'price')
    arrivalDay.getElementsByTagName('div')[divIndex].style.display = 'none';
  }
 }
}

function UpdateCalendar(url, id)
{
 var calendar = GetCalendar(id);
 if (calendar == null)
 {
  calendar = new Calendar(id);
  calendars[calendars.length] = calendar;
 }
 if (!calendar.UpdateAllowed)
  return false;
 calendar.UpdateAllowed = false;
 var calendarElement = document.getElementById(id);
 calendarElement.style.cursor = 'wait';
 var response = GetXmlHttpRequestResponse(url);
 var xmlDocument = XmlStringToXmlObject(response);
 var childNodes = xmlDocument.documentElement.childNodes;
 for (childIndex = 0; childIndex < childNodes.length; childIndex++)
 {
  var childNode = childNodes[childIndex];
  switch (childNode.nodeName)
  {
   case 'SessionExpired':
    return false;
   case 'Periods':
    calendar.Periods = new Array();
    for (periodIndex = 0; periodIndex < childNode.childNodes.length; periodIndex++)
    {
     var periodNode = childNode.childNodes[periodIndex];
     if (periodNode.nodeName == 'Period')
     {
      var period = new Period(periodNode.attributes[0].value);
      calendar.Periods[calendar.Periods.length] = period;
      for (daysIndex = 0; daysIndex < periodNode.childNodes.length; daysIndex++)
      {
       var daysNode = periodNode.childNodes[daysIndex];
       if (daysNode.nodeName == 'Days')
       {
        for (dayIndex = 0; dayIndex < daysNode.childNodes.length; dayIndex++)
        {
         var dayNode = daysNode.childNodes[dayIndex];
         if (dayNode.nodeName == 'Day')
         {
          for (classNameIndex = 0; classNameIndex < dayNode.childNodes.length; classNameIndex++)
          {
           var classNameNode = dayNode.childNodes[classNameIndex];
           if (classNameNode.nodeName == 'ClassName')
           {
            var day = new Day(dayNode.attributes[0].value, XmlObjectToXmlString(classNameNode.childNodes[0]) + '-mouse-over');
            period.Days[period.Days.length] = day;
           }
          }
         }
        }
       }
      }
     }
    }
    break;
   case 'Html':
    calendarElement.style.cursor = 'default';
    calendarElement.style.display = 'block';
    calendarElement.innerHTML = XmlObjectToXmlString(childNode);
    break;
  }
 }
 calendar.UpdateAllowed = true;
 return true;
}
