﻿// Global Variables
var calendarDestination = null;

function showCalendar( source, destination )
{
   // Local Variables
   var calendar = document.getElementById( "CalendarWindow" );
   var x, y, h;

   if ( calendar != null )
   {
      if ( source != null )
      {
         var element = document.getElementById( source );
         
         x = element.offsetLeft;
         y = element.offsetTop;
         h = element.offsetHeight;

         if ( element.offsetParent )
         {
            while ( element.offsetParent != null )
            {
               element = element.offsetParent;
               x += element.offsetLeft;
               y += element.offsetTop;            
            }
         }
            
         // Adjust the calendar location
         calendar.style.top = y + h + 5 + "px";
         calendar.style.left = x + "px";
      }

      if ( destination != null )
      {
         calendarDestination = document.getElementById( destination );
      }
  
      calendar.style.visibility = "visible";
   }
}

function closeCalendar( )
{
   // Local Variables
   var calendar = document.getElementById( "CalendarWindow" );

   if ( calendar != null )
   {
      calendar.style.visibility = "hidden";
   }
}


function calendarDateFocus( event )
{
   // Get a reference to the date element
   var today = new Date( );
   var date;
   
   if ( browser.engine != "MSIE" )
   {
      date = event.target;
   }
   else
   {
      date = window.event.srcElement;
   }
   
   var row = date.parentNode;
   if ( date.innerText == today.getDate( ) )
      date.className = "CalendarTodayFocus";
   else
      date.className = "CalendarDateFocus";
  
   // Manually set the style of the child nodes (for IE)
   for ( var index = 0; index < row.childNodes.length; index++ )
   {
      var cell = row.childNodes[ index ];
   
      if ( cell != date )
      {
         if ( cell.innerText == today.getDate( ) )
            cell.className = "CalendarRowTodayFocus";
         else
            cell.className = "CalendarRowFocus";
      }
   }   
}


function calendarDateBlur( event )
{
   // Get a reference to the date element
   var today = new Date( );
   var date;
   
   if ( browser.engine != "MSIE" )
   {
      date = event.target;
   }
   else
   {
      date = window.event.srcElement;
   }

   var row = date.parentNode;
   date.className = "CalendarDateBlur";

   if ( date.innerText == today.getDate( ) )
      date.className = "CalendarTodayBlur";
   else
      date.className = "CalendarDateBlur";
   
   // Manually set the style of the child nodes (for IE)
   for ( var index = 0; index < row.childNodes.length; index++ )
   {
      var cell = row.childNodes[ index ];
   
      if ( cell != date )
      {
         if ( cell.innerText == today.getDate( ) )
            cell.className = "CalendarTodayBlur";
         else
            cell.className = "CalendarRowBlur";
      }
   }   

}


function formatDate( date )
{
   // Local Variables
   var retVal;
   
   // Append the formatted day
   if ( date.getDate( ) <= 9 )
      retVal = "0" + date.getDate( ) + "/";
   else
      retVal = date.getDate( )+ "/";

   // Append the formatted month
   if ( ( date.getMonth( ) + 1 ) <= 9 )
      retVal += "0" + ( date.getMonth( ) + 1 )+ "/";
   else
      retVal += ( date.getMonth( ) + 1 ) + "/";   

   // Append the year
   retVal += date.getFullYear( );
   
   return retVal;
}


function calendarSelectDate( event )
{
   // Get a reference to the date element
   var date;
   
   if ( browser.engine != "MSIE" )
   {
      date = event.target;
   }
   else
   {
      date = window.event.srcElement;
   }

   // Calculate the date
   var calMonth = document.getElementById( "CurrentMonthYear" );
   var textDate = parseInt( date.innerText ) + " " + calMonth.innerText;
   var currentDate = new Date( textDate );
   var day = currentDate.getDate( );
   var month = currentDate.getMonth( );
   var year = currentDate.getFullYear( );

   // Create a new data object and assign it to the input box
   var theDate = new Date( year, month, day );
   calendarDestination.value = formatDate( theDate );

   // Close the calendar
   closeCalendar( );
}


function initCalendar( )
{
   // Local Variables
   var today = new Date( );
   var month = today.getMonth( );
   var year = today.getFullYear( );   
   
   buildCalendar( year, month );
}


function buildCalendar( currentYear, currentMonth )
{
   // Local Variables
   var months = [ 'January', 'February', 'March', 'April', 'May', 'June', 
                  'July', 'August', 'Sept', 'October', 'November', 'December' ];
   var days = [ 'S', 'M', 'T', 'W', 'T', 'F', 'S' ];
   var daysInMonth = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
   var today = new Date( );
   var startOfMonth = new Date( currentYear, currentMonth, 1 );
   var firstDayOfMonth = startOfMonth.getDay( );
   var offset = 0;
   var date = 1;

   // Get a reference to the target container and remove all the content
   var calendar = document.getElementById( "Calendar" );
   removeAllChildNodes( calendar );

   // Create the table and table body elements
   var table = document.createElement( "TABLE" );
   table.className = "Calendar";
   calendar.appendChild( table );
   var tb = document.createElement( "TBODY" ); // Required for IE support
   table.appendChild( tb );

   // Append the table header
   var tableHeader = document.createElement( "TR" ); 
   var prevMonth = document.createElement( "TD" );
   prevMonth.className = "CalendarHeader ShowPointer";
   prevMonth.innerText = "<";
   prevMonth.onclick = previousCalendarMonth;
   var currMonth = document.createElement( "TD" );
   currMonth.id = "CurrentMonthYear";
   currMonth.className = "CalendarHeader";   
   currMonth.innerText = months[ currentMonth ] + " " + currentYear;
   currMonth.colSpan = "5";
   var nextMonth = document.createElement( "TD" );
   nextMonth.className = "CalendarHeader ShowPointer";
   nextMonth.innerText = ">";
   nextMonth.onclick = nextCalendarMonth;
   tableHeader.appendChild( prevMonth );
   tableHeader.appendChild( currMonth );
   tableHeader.appendChild( nextMonth );   
   tb.appendChild( tableHeader );

   // Write days of the week header
   var weekdayHeader = document.createElement( "TR" ); 
   for ( var i = 0; i < 7; i++ )
   {
      var weekDay = document.createElement( "TD" ); 
      weekDay.className = "CalendarHeader";
      weekDay.innerText = days[ i ];
      weekdayHeader.appendChild( weekDay );
   }
   tb.appendChild( weekdayHeader );

   // Build the calendar rows
   var calRow = document.createElement( "TR" ); 
   calRow.className = "CalendarRowBlur";

   // Setup the calendar offset
   while ( offset < firstDayOfMonth )
   {
      var emptyDate = document.createElement( "TD" ); 
      emptyDate.onmouseover = calendarDateFocus; 
      emptyDate.onmouseout = calendarDateBlur;
      calRow.appendChild( emptyDate );
      offset++;
   }

   // Build the calendar data
   while ( date <= daysInMonth[ currentMonth ] )
   {
      // Create the calendar date object
      var calDate = document.createElement( "TD" ); 
      calDate.id = "calendarDate_" + date;
      calDate.className = "CalendarDateBlur";
      calDate.onmouseover = calendarDateFocus; 
      calDate.onmouseout = calendarDateBlur;
      calDate.onclick = calendarSelectDate; 
      calDate.innerText = date;
      
      if ( date == today.getDate( ) )
         calDate.className = "CalendarTodayBlur";
      else
         calDate.className = "CalendarDateBlur";
      
      // Append it to the table row and increment the counter
      calRow.appendChild( calDate );      
      date++;
      
      if ( ( date + ( offset - 1 ) ) % 7 == 0 )
      {
         tb.appendChild( calRow );
         calRow = document.createElement( "TR" ); 
      }
   }

   offset = (( ( date - 1 ) + ( offset - 1 ) ) % 7);

   while ( offset < 6 )
   {
      var emptyDate = document.createElement( "TD" ); 
      emptyDate.onmouseover = calendarDateFocus; 
      emptyDate.onmouseout = calendarDateBlur;
      calRow.appendChild( emptyDate );
      offset++;
   }
   
   // Append the final row to the table
   tb.appendChild( calRow );
}


function previousCalendarMonth( )
{
   var calMonth = document.getElementById( "CurrentMonthYear" );
   var textDate = "1 " + calMonth.innerText;
   var currentDate = new Date( textDate );
   var month = currentDate.getMonth( ) - 1;
   var year = currentDate.getFullYear( );
   
   if ( month == -1 )
   {
      month = 11;
      year--;
   }
   
   buildCalendar( year, month );
}


function nextCalendarMonth( )
{
   var calMonth = document.getElementById( "CurrentMonthYear" );
   var textDate = "1 " + calMonth.innerText;
   var currentDate = new Date( textDate );
   var month = currentDate.getMonth( ) + 1;
   var year = currentDate.getFullYear( );
   
   if ( month == 12 )
   {
      month = 0;
      year++;
   }
   
   buildCalendar( year, month );
}
