


function AddOnload(myfunc){
    if(window.addEventListener)
        window.addEventListener('load', myfunc, false);
    else if(window.attachEvent)
	window.attachEvent('onload', myfunc);
}

//variable for single instance
// var singleCalendar;
// path to main calendar
//var stringPathtoCal = "/about/calendar-of-events/index.html";
//var stringPathtoCal = "";
//the ajax xml object
var xmlhttp=null;

//the xml file that will be loaded into memory
//var toLoad = "/calendar/calendar.xml";
//var toLoad = "";
// var toLoad = "";

var xmlDoc;
//the string that gets printed to the dynamic div
var strOutput = "";

var lBound = 0;
var uBound = 9;

var epm = 10;
var pages = 0;
var activePage = 1;
var paginate = "";

var months = new Array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December");
var days = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31]

var now = new Date();
var curyear = now.getFullYear();
var curmonth = now.getMonth()+1;
var curday = now.getDate();


AddOnload(sendRequest);


//this method sets up the xml object to work with the javascript depending on the browser
function sendRequest()
{  
    
   //setting up the firefox 1.5 ,safari 1.3, and opera 8.5 way
   if (window.XMLHttpRequest)
   {
      xmlhttp=new XMLHttpRequest();
   }
   //if that fails try set up for IE
   else if (window.ActiveXObject)
   {
      try
      {
         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch(e)
      {
         try
         {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }
         catch(e)
         {
            xmlhttp = false;
         }
      }
   }
   //if the ajax object was set up properly then download and open the xml file in the 'toLoad' variable
   if (xmlhttp)
   {
      //setting up the eventhandler 
      xmlhttp.onreadystatechange=onReadyState;
      //opening the xml file
      xmlhttp.open("GET", toLoad, true);
      //no need to send anything back to the server
      xmlhttp.send(null);
   }
}

function onReadyState()
{

   if (xmlhttp.readyState==4)
   {
      if (xmlhttp.status==200)
      {
         //alert(xmlhttp.responseText); 
         xmlDoc = xmlhttp.responseXML;
         //alert(xmlDoc.getElementsByTagName("startDate").length);
         
         try
         {
            var query = window.location.search.substring(1);
            var pair = query.split("date=");
            //alert(pair[1]); 
            var rawDate = pair[1].split("/");
			if (rawDate.length == 3)
			{
				dayView(rawDate[0],rawDate[1],rawDate[2]);
            }
			else
			{
				monthView(rawDate[1],rawDate[0]);
			}
			drawCal(rawDate[1],rawDate[0]);
         }
         catch(e)
         {
            var today = new Date();
            var year = today.getFullYear();
            var month = today.getMonth()+1;
            var day = today.getDate();
            
            if (singleCalendar != true)
            {
              monthView(month,year)
             // dayView(year,month,day);
            }
            drawCal(month,year,0);
         }
      }
   }
}

function dayView(year,month,day)
{

   if (singleCalendar)  
      location.href = stringPathtoCal+"?date="+year+"/"+month+"/"+day ;

   var dateClicked = new Date();
   dateClicked.setFullYear(year,month-1,day);
   
   var eventTitles = xmlDoc.getElementsByTagName("title");
   var startDates  = xmlDoc.getElementsByTagName("startDate");
   var endDates    = xmlDoc.getElementsByTagName("endDate");
   var images  = xmlDoc.getElementsByTagName("image");
   var text_body = xmlDoc.getElementsByTagName("main_text_body");
  
   var strOutput  = "";

   var count = 0;
   //alert(eventTitles.length);
   for (var i=0; i < eventTitles.length; i++)
   {      
      var syear  = startDates[i].attributes.getNamedItem("year").value;
      var smonth = startDates[i].attributes.getNamedItem("month").value;
      var sday   = startDates[i].attributes.getNamedItem("day").value;

      var eyear  = endDates[i].attributes.getNamedItem("year").value;
      var emonth = endDates[i].attributes.getNamedItem("month").value;
      var eday   = endDates[i].attributes.getNamedItem("day").value; 
      var endDate = new Date();
      
      endDate.setFullYear(eyear,emonth-1,eday);
      var startDate = new Date();
      startDate.setFullYear(syear,smonth-1,sday);

      if(startDate < dateClicked && dateClicked < endDate || syear == year && smonth == month && sday == day || eyear == year && emonth == month && eday == day)
      {
         strOutput += generateCalData(eventTitles,startDates,endDates,i,text_body,images,year,month,day);
         count++;
      }
   }  
   var results = "";  
   results = generateResults(dateClicked,count,"day");
   strOutput = results + strOutput;
       if (singleCalendar != true){
			document.getElementById('cpt_calendar_event_list').innerHTML=strOutput;
			
			var listItems = $("#content div.event");
			$(listItems).bind("mouseenter mouseleave",  elementHover);
			$(listItems).bind("click",  listItemClick);
	   }
}

function monthView(month,year)
{
    var strOutput ="";
    var dateClicked = new Date();
    dateClicked.setFullYear(year,month-1,1);
    
    var eventTitles = xmlDoc.getElementsByTagName("title");
    var startDates  = xmlDoc.getElementsByTagName("startDate");
    var endDates    = xmlDoc.getElementsByTagName("endDate");
    var images  = xmlDoc.getElementsByTagName("image");
    var text_body = xmlDoc.getElementsByTagName("main_text_body");

    var count = 0;
    var write = 1;
        
    for (i =0; i < eventTitles.length; i++)
        {
            var syear  = startDates[i].attributes.getNamedItem("year").value;
            var smonth = startDates[i].attributes.getNamedItem("month").value;
            var sday   = startDates[i].attributes.getNamedItem("day").value;
            
            var eyear  = endDates[i].attributes.getNamedItem("year").value;
            var emonth = endDates[i].attributes.getNamedItem("month").value;
            var eday   = endDates[i].attributes.getNamedItem("day").value;
            
            var endDate = new Date();
       endDate.setFullYear(eyear,emonth-1,eday);
       var startDate = new Date();
       startDate.setFullYear(syear,smonth-1,sday);
       
       
       if(syear < eyear && eyear <= year)
         {
          
          if(emonth >= month)
          {
             if(lBound <= count && count <= uBound)
                {
                strOutput += generateCalData(eventTitles,startDates,endDates,i,text_body,images,year,month,1);
                }
             count++;
          }
          
       }
       else if((smonth < month) && (month < emonth)  || (smonth == month && syear == year) || emonth == month && eyear == year )
       {  
          if(lBound <= count && count <= uBound) 
          strOutput += generateCalData(eventTitles,startDates,endDates,i,text_body,images,year,month,1);
          count++; 
       }
       
    }
    
    pages = Math.ceil(count/epm);

    var results = "";
    results = generateResults(dateClicked,count,"month");
    strOutput = results + strOutput;
    if(pages > 1)
       strOutput += '<table class="resultsHeader bottom" cellpadding="0" cellspacing="0"><tr><td class="pagination" align="right"><ul>'+paginate+'</ul></td></tr></table>';
    if (singleCalendar != true)
    document.getElementById('cpt_calendar_event_list').innerHTML=strOutput;
	
	var listItems = $("#content div.event");
	$(listItems).bind("mouseenter mouseleave",  elementHover);
	$(listItems).bind("click",  listItemClick);
}

function generateCalData(eventTitles,startDates,endDates,i,text_body,images,year,month,day)
{

   var strOutput = "";
   var title = eventTitles[i].firstChild.nodeValue;
   var event = eventTitles[i].attributes.getNamedItem("event_type").value;
   var url = eventTitles[i].attributes.getNamedItem("href").value+"?date="+year+"/"+month //+"/"+day;
   var sDate = startDates[i].firstChild.nodeValue;
   var txtbody = text_body[i].firstChild.nodeValue;
   var img  = images[i].firstChild.nodeValue;
   
        strOutput = strOutput + '<div class="event">';
        strOutput = strOutput + '   <label>'+ event +'</label>';
        strOutput = strOutput + '   <table class="eventTitle">';
        strOutput = strOutput + '       <tr>';
        strOutput = strOutput + '           <td><h3><a href="'+ url +'">' + title +' </a></h3></td>';
        strOutput = strOutput + ' <td align="right" class="eventDate"><h3>'+ sDate +'</h3></td>';
        strOutput = strOutput + ' </tr>';
        strOutput = strOutput + ' </table>';
        strOutput = strOutput + ' <table class="eventListing">';
        strOutput = strOutput + ' <tr valign="top">';
        if (img != 'No Image')          
        {                                   
        strOutput = strOutput + ' <td class="thumb">'
        strOutput = strOutput + '  <div class="photo">';
        strOutput = strOutput + '    <table><!-- photo -->';
        strOutput = strOutput + '     <tr>';
        strOutput = strOutput + '     <td class="tl"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     <td class="t"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     <td class="tr"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     </tr>';
        strOutput = strOutput + '     <tr>';
        strOutput = strOutput + '     <td class="l"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     <td class="wrapper"><img src="' + img +'" /></td>';
        strOutput = strOutput + '     <td class="r"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     </tr>'
        strOutput = strOutput + '     <tr>'
        strOutput = strOutput + '     <td class="bl"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     <td class="b"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '     <td class="br"><img src="/assets/images/spacer.gif" /></td>';
        strOutput = strOutput + '       </tr>';
        strOutput = strOutput + '    </table><!-- End photo -->';
        strOutput = strOutput + '  </div>';
        strOutput = strOutput + ' </td>';
        }else{                              
        strOutput = strOutput + '           <td class="thumb off"><img src="/assets/images/spacer.gif" /></td>';
        }                                   
        strOutput = strOutput + ' <td class="abstract">' + txtbody.unescapeHtml(); +'</td>'
        strOutput = strOutput + ' </tr>';
        strOutput = strOutput + ' </table>';
        strOutput = strOutput + '</div>'
        strOutput = strOutput + '<div class="hr lt marginBot5"><img src="/assets/images/spacer.gif" /></div>';
  
   return strOutput;
   
}

function generateResults(dateClicked,count,type)
{
   var results = "";
   var event_word = "Event";
   paginate = "";
   
   if (count > 1)
    event_word = event_word +"s";
   
   results = results + '<table class="resultsHeader" cellpadding="0" cellspacing="0" border="0">';
   results = results + '<tr>';
   
   if(type == "day")
   {
      results = results + '<td valign="baseline"><h2>' + getDay(dateClicked.getDay()) +" "+getMonth(dateClicked.getMonth())+ " " +dateClicked.getDate() +', '+dateClicked.getFullYear() + ' ('+count+' '+ event_word +')</h2></td>';
   }
   else if (type == "month")
   {
      results = results + '<td valign="baseline"><h2>' +getMonth(dateClicked.getMonth())+ ' ('+ count +' '+ event_word +')</h2></td>';
   }
   //results = results + '<td valign="baseline" class="pageToolList" align="right">';
   if(type == "month")
   {
      if(pages > 1)
      {
         results = results + '<td valign="baseline" class="pagination" align="right"><ul>';
         
         if(activePage > 1)
            paginate += '<li class="next"><a href="javascript:turnPage('+(dateClicked.getMonth()+1)+','+dateClicked.getFullYear()+','+(activePage-1)+')">&#171; Previous</a></li>';
         
         for(var i = 1; i <= pages; i++)
         {
            if(i != activePage)
            paginate += '<li><a href="javascript:turnPage('+(dateClicked.getMonth()+1)+','+dateClicked.getFullYear()+','+i+')">'+i+'</a></li>';
            else
               paginate += '<li>'+i+'</li>';
         }
         if(activePage != pages)
         {
            var next = activePage + 1;
            paginate += '<li class="next"><a href="javascript:turnPage('+(dateClicked.getMonth()+1)+','+dateClicked.getFullYear()+','+next+')">Next &#187;</a></li>';
         }
         var temp = paginate + '</ul></td></tr></table>';
         results = results + temp;
      }
      else
         results = results + '</tr></table>';
   }
   else
      results = results + '</tr></table>';
    results = results + '<div class="hr marginBot5"><img src="/assets/images/spacer.gif" /></div>';
   return results;
}

function turnPage(month,year,pageNum)
{
   activePage = pageNum;
   uBound = (pageNum*epm)-1;
   lBound = uBound - 9;
   monthView(month,year);
}

function resetBounds(month,year)
{
   activePage = 1;
   lBound = 0;
   uBound = epm - 1;
  // count = 0;
   monthView(month,year);
}

function setBounds(lbound,ubound,month,year)
{
   lBound = lbound;
   uBound = ubound;
   pages = 0;
   monthView(month,year);
}


//This function draws the calender for the given month and year
function drawCal(month,year,drawMonth)
{
  
   //these 4 values hold the next and previous month and year with respect
   //to the provided month and year.
   var pMonth;
   var nMonth;
   var pYear = year;
   var nYear = year;
   
   //checking for calendar wrap around one year behind
   if(month != 1)
      pMonth = month-1;
   else
   {
      pMonth = 12;
      pYear--;
      
   }
      
   //checking for calendar wrap around one year before
   if(month != 12)
   {
      nMonth = month;
      nMonth++;
   }
   else
   {
      nMonth=1
      nYear++;
   } 
   
   
   //generating the calendar header
   var calCode = "";
   calCode = calCode + '<table class="calendar" cellpadding="4" cellspacing="0">';
   calCode = calCode + '<tr><td class="prev"><a href="javascript:drawCal('+pMonth+','+pYear+',1)"><</a></td>';
   if (singleCalendar != true) 
   {
      calCode = calCode + '<td colspan="5"><a href="javascript:resetBounds('+month+','+year+')">'+getMonth(month-1)+' '+year+'</a></td>';
   }
   else
   {
      
      calCode = calCode + '<td colspan="5"><a href="'+stringPathtoCal+"?date="+year+"/"+month+'"1">'+getMonth(month-1)+' '+year+'</a></td>';
      
   }
   calCode = calCode + '<td class="next"><a href="javascript:drawCal('+nMonth+','+nYear+',1)">></a></td></tr>';
   calCode = calCode + '<tr><td colspan="7" align="center"><a href="javascript:drawCal('+curmonth+','+curyear+','+curday+');dayView('+curyear+','+curmonth+','+curday+')">Today</a></td></tr>';
   calCode = calCode + '<tr><td class="days">Su</td><td class="days">M</td><td class="days">Tu</td><td class="days">W</td><td class="days">Th</td><td class="days">F</td><td class="days">Sa</td></tr><tr>';
   
   var daysThisMonth = getDaysInMonth(month,year);
   var weekDay = 0;
   var lastDay = getDaysInMonth(pMonth,pYear);
   
   //this loop is used to create the calendar
   for(var i = 1; i<=daysThisMonth; i++)
   {
      var currDate = new Date();
      currDate.setFullYear(year,month-1,i);
      day = currDate.getDay();

      //starting a new week
      if(weekDay == 7)
      {
         weekDay=0;
         calCode = calCode + '</tr><tr>';
      }
      
      //checking if the current weekDay in the loop matches with the current weekday of the month
      //if so print that day, else we print the previous month's date
      if(day==weekDay)
      {
         var strDayClass = ""; 
         
         if (year == curyear && month == curmonth && i == curday)
             strDayClass="at";

         if(checkForEvent(year,month,currDate.getDate()))
         {
            calCode = calCode +  '<td><a class="'+strDayClass+'" href="javascript:dayView('+currDate.getFullYear()+','+(currDate.getMonth()+1)+','+currDate.getDate()+')">'+i+'</a></td>';
         }
         else
         {
            calCode = calCode + '<td class="noevent '+strDayClass+'">'+i+'</td>';
         }
      }
      else
      {
         var dDay = weekDay;
         dDay++;
         var lastMonthDay = lastDay-(day-dDay);
         if(checkForEvent(pYear,pMonth,lastMonthDay))
         {
            calCode = calCode +  '<td class="nextMonth"><a href="javascript:dayView('+pYear+','+pMonth+','+lastMonthDay+')">'+lastMonthDay+'</a></td>';
         }
         else
         {
            calCode = calCode + '<td class="nextMonth noevent">'+lastMonthDay+'</td>';
         }
         i--;
      }
      
      //checking if it's the last day of the month, and if there is an incomplete
      //week that needs to be filled with the first j days of the next month
      if(i==daysThisMonth && weekDay!=6)
      {  
         var j = 1;
         while(weekDay!=6)
         {
            if(checkForEvent(nYear,nMonth,j))
            {
               calCode = calCode + '<td class="nextMonth"><a href="javascript:dayView('+nYear+','+nMonth+','+j+')">'+j+'</a></td>';
            }
            else
            {
               calCode = calCode + '<td class="nextMonth noevent">'+j+'</a></td>';
            }
            weekDay++;
            j++;
         }
      }
      weekDay++;
   }
   
   calCode = calCode + '</table>';
   //calCode = calCode + '<a href="javascript:drawCal('+curmonth+','+curyear+','+curday+');dayView('+curyear+','+curmonth+','+curday+')">There are Events Today</a>';
    
   	document.getElementById('cpt_calendar_month').innerHTML = calCode;
	document.getElementById("calendarEventsWrapper").className="box";
   
   if(drawMonth == 1)
   {
      resetBounds(month,year);
   }
}

function checkForEvent(year,month,day)
{
    var startDates  = xmlDoc.getElementsByTagName("startDate");
    var endDates    = xmlDoc.getElementsByTagName("endDate");
    
    for(var i = 0; i < startDates.length; i++)
    {
       var syear  = startDates[i].attributes.getNamedItem("year").value;
       
       var smonth = startDates[i].attributes.getNamedItem("month").value;
       var sday   = startDates[i].attributes.getNamedItem("day").value;
        
       var eyear  = endDates[i].attributes.getNamedItem("year").value;
       var emonth = endDates[i].attributes.getNamedItem("month").value;
       var eday   = endDates[i].attributes.getNamedItem("day").value;

       var startDate = new Date();
       var endDate = new Date();
       var checkDate = new Date();
       
       startDate.setFullYear(syear,smonth,sday);
       endDate.setFullYear(eyear,emonth,eday);
       checkDate.setFullYear(year,month,day);
       
       
       if(syear == year && smonth == month && sday == day)
          return true;
       else if(eyear == year && emonth == month && eday == day)
          return true;
       else if(startDate < checkDate && checkDate < endDate)
          return true;
    }
    return false;
}

//this function returns the name of the month given a number
function getMonth(month)
{   
   return months[month];
}

//this function returns the name of the weekday given a number
function getDay(day)
{
   return days[day];
}

//this function retrieves the number of days in a month given an month and a year
//it also takes into account a leap year.
function getDaysInMonth(month,year)
{
   if ((month-1==1)&&(year%4==0)&&((year%100!=0)||(year%400==0)))
{
      return 29;
   }
   else
   {
      return daysInMonth[month-1];
   }
}

//this function will unescape HTML
String.prototype.unescapeHtml = function () {
    var temp = document.createElement("div");
    temp.innerHTML = this;
    var result = temp.childNodes[0].nodeValue;
    temp.removeChild(temp.firstChild)
    return result;
}
