/**
 * File      : bsaCalendar.js
 * Author    : Drew Anderson
 * EMail     : Drew.L.Anderson@erdc.usace.army.mil
 * Language  : JavaScript Ver 1.2
 * Purpose   : Provides a Calendar control for static web pages
 *
 * History:
 *
 * 02/24/05 - 1.0 - Created
 */


var today = new Date();          // Today's date and time.
var iMonth = today.getMonth();   // 0-11, January = 0
var iYear = today.getFullYear(); // 4 digit year
var xmldoc;                      // Is the XML object containing the Calendar data.
var DaysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var MonthNames = new Array("January", "Feburary", "March", "April", 
                           "May", "June", "July", "August", 
                           "September", "October", "November", "December");
if(!document.layers && !document.all && !document.getElementById) event = "test";

/**
 * LeapYear(year)
 *
 * Is this a leap year?
 *
 * @param  year  The 4 digit year value. (integer)
 * @return       Boolean
 */
function LeapYear(year) 
{
 if((year/4)   != Math.floor(year/4))   return false;
 if((year/100) != Math.floor(year/100)) return true;
 if((year/400) != Math.floor(year/400)) return false;
 return true;
}

/**
 * DayOfYear(d)
 *
 * Compute the day of the year.
 *
 * @param  d     The 4 digit year value. (integer)
 * @return       Boolean
 */
function DayOfYear(d)
{
 var i;
 var day = 0;
 for( i = 0; i < d.getMonth(); i++ )
  day += DaysInMonth[i];
 return day + d.getDate();
}  

function ShowTip(current,e,text)
{
 if(document.all||document.getElementById)
 {
  thetitle=text.split('<br>');
  if (thetitle.length>1)
  {
   thetitles=thetitle[0];
   for (i=1;i<thetitle.length;i++)
    thetitles += "\n" + thetitle[i];
   current.title=thetitles;
  }
  else 
   current.title = text;
 }  
 else if(document.layers)
 {
  document.tooltip.document.write('<layer bgColor="white" style="border:1px solid black;font-size:12px;">'+text+'</layer>');
  document.tooltip.document.close();
  document.tooltip.left = e.pageX + 5;
  document.tooltip.top = e.pageY + 5;
  document.tooltip.visibility = "show";
 }
}

function HideTip()
{
 if(document.layers) document.tooltip.visibility="hidden";
}

function MoveMonth(direction)
{
 iMonth += direction;
 today = new Date( iYear, iMonth, 1, 1, 1, 1, 1 );
 iMonth = today.getMonth();
 iYear = today.getFullYear();
 drawMonth();
}

function drawMonth()
{                        
 var i;
 var j;
 var buf = new String('');
 var d1stDay = new Date( iYear, iMonth, 1, 1, 1, 1 );
 var i1stDOW = d1stDay.getDay();    // 0 = Sunday, 6 = Saturday
 var iRows = 5;
 DaysInMonth[1] = (LeapYear(iYear)) ? 29 : 28 // February

 // Start the table and draw the header row
 buf += "<input type=button value='List View' onClick=drawList()><table class=MonthCalendar><tr>"
     + "<td colspan=2 class=MonthMove onclick=MoveMonth(-1)>Prev Month</td>" 
     + "<td colspan=3 class=MonthHeading>" + MonthNames[iMonth] + " " + iYear + "</td>"
     + "<td colspan=2 class=MonthMove onclick=MoveMonth(1) align=right>Next Month</td></tr><tr>"
     + "<td class=WeekEndHeading>Sun</td>"
     + "<td class=WeekDayHeading>Mon</td>"
     + "<td class=WeekDayHeading>Tue</td>"
     + "<td class=WeekDayHeading>Wed</td>"
     + "<td class=WeekDayHeading>Thu</td>"
     + "<td class=WeekDayHeading>Fri</td>"
     + "<td class=WeekEndHeading>Sat</td></tr>";
 
 if( (DaysInMonth[iMonth] + i1stDOW) > 35) iRows = 6;
 
 for( i = 0; i < iRows; i++ )
 {
  buf += "<tr><td class=WeekEndDay><div id=Cell_" + (i*7) + "></div></td>"; 
  for( j = 1; j < 6; j++ )
   buf += "<td class=WeekDay><div id=Cell_" + ((i*7)+j) + "></div></td>"; 
  buf += "<td class=WeekEndDay><div id=Cell_" + ((i*7)+6) + "></div></td></tr>"; 
 } 

 document.getElementById("bsaCalendar").innerHTML = buf;

 // Write the day numbers
 i1stDOW    
 var dayArray = new Array();
 for( i = 0; i < DaysInMonth[iMonth]; i++)
 {
  dayArray[i] = document.getElementById("Cell_" + (i+i1stDOW));
  dayArray[i].innerHTML = "<font class=DayNumber>" + (i+1) + "</font>";
 } 

 var calendarEvents = xmldoc.getElementsByTagName("Event");

 for(i = 0; i < calendarEvents.length; i++) 
 {
  var e = calendarEvents[i];
  var start = new Date(e.getAttribute("StartDate"));
  var end = new Date(e.getAttribute("EndDate"));

  if( start.getMonth() <= iMonth && end.getMonth() >= iMonth )
  {
   k = DayOfYear(end) - DayOfYear(start) + 1 // Number of days for the event
   for( j = 0; j < k; j++ )
   {
    var d = new Date( start.getFullYear(), start.getMonth(), start.getDate() + j, 1, 1, 1, 1);
    if( d.getMonth() == iMonth && iYear == d.getFullYear())
    {
     s = "<br><span class=Event "
      + "onMouseover='ShowTip(this,event,\"" + e.getAttribute("StartTime") + "<br>"
      + e.getAttribute("Location") + "\")' onMouseout='HideTip()'>";
     if( e.getAttribute("URL") != null )
      s += "<a target='newwindow' href='" + e.getAttribute("URL") + "'>"
       + e.getAttribute("Name") + "</a></span>";
     else      
      s += e.getAttribute("Name") + "</span>";
     dayArray[d.getDate()-1].innerHTML += s; 
    }  
   }
  }
 }
}

function drawList()
{                        
 var i;
 var buf = new String('');
 // Need to sort events by start date and time.
 var sortedEvents = new Array();
 var calendarEvents = xmldoc.getElementsByTagName("Event");
 for(i = 0; i < calendarEvents.length; i++) 
 {
  d = new Date(calendarEvents[i].getAttribute("StartDate"));
  sortedEvents[i] = new Array( 
   d.getTime(), d, 
   calendarEvents[i].getAttribute("StartDate"),
   calendarEvents[i].getAttribute("StartTime"),
   calendarEvents[i].getAttribute("EndDate"),
   calendarEvents[i].getAttribute("EndTime"),
   calendarEvents[i].getAttribute("Name"),
   calendarEvents[i].getAttribute("Location"),
   calendarEvents[i].getAttribute("URL"));
 }
 sortedEvents.sort(sortByDate);
 buf = "<input type=button value='Month View' onClick=drawMonth()><table class=ListTable>";
 var thisMonth = 0;
 var thisYear = 0;
 for( i = 0; i < calendarEvents.length; i++)
 {
  if( thisMonth != sortedEvents[i][1].getMonth() || thisYear != sortedEvents[i][1].getFullYear() )
  {
   thisMonth = sortedEvents[i][1].getMonth();
   thisYear = sortedEvents[i][1].getFullYear();
   
   buf += "<tr class=ListMonth><td colspan=3>" + MonthNames[thisMonth] + " " + thisYear + "</td></tr>";
  } 
  
  if( (i % 2) == 0 ) ListEvent = "ListEventEven"; else ListEvent = "ListEventOdd";
  
  if( sortedEvents[i][2] != sortedEvents[i][4] )
  {
   buf += "<tr class=" + ListEvent + "><td>" +  sortedEvents[i][2] + "<br>" 
       + sortedEvents[i][4] + "</td><td>" + sortedEvents[i][3] + "<br>" + sortedEvents[i][5] 
       + "</td><td>";
   if( sortedEvents[i][8] != null )
    buf += "<a target='newwindow' href='" + sortedEvents[i][8] + "'>" + sortedEvents[i][6] + "</a>";
   else      
    buf += sortedEvents[i][6];
   
   buf += "</td><td>" + sortedEvents[i][7] + "</td></tr>";  
  } 
  else
  {
   buf += "<tr class=" + ListEvent + "><td>" +  sortedEvents[i][2] + "</td><td>" + sortedEvents[i][3] + " - " + sortedEvents[i][5] 
       + "</td><td>";
   if( sortedEvents[i][8] != null )
    buf += "<a targe='newwindow' href='" + sortedEvents[i][8] + "'>" + sortedEvents[i][6] + "</a>";
   else      
    buf += sortedEvents[i][6];
   
   buf += "</td><td>" + sortedEvents[i][7] + "</td></tr>";  
  }	
       
 }
 document.getElementById("bsaCalendar").innerHTML = buf + "</table>";
}

function sortByDate(arg1, arg2)
{
 if(arg1[0] == arg2[0]) return 0;
 if(arg1[0] < arg2[0]) return -1;
 if(arg1[0] > arg2[0]) return 1;
}

function LoadCalendar() 
{
 if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
   xmlhttp = new XMLHttpRequest();
 }
 else {// code for IE6, IE5
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 xmlhttp.onreadystatechange = function(){if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { xmldoc = xmlhttp.responseXML; drawMonth();}}
 xmlhttp.open("GET", "bsaCalendar.xml", true);
 xmlhttp.send();
 
}  

