//
// Enhanced JavaScript Event Calendar
//
// Author:  IntellaVia LLC
//'Version 1.0 - (24-Mar-2009)
//
//
// based on an earlier scripts by Rick Pike (http://calendar.pikesys.com) and
// Kevin Ilsen (http://calendar.ilsen.net or kevin@ilsen.net)

// Configurable values are set to defaults here; you can override them before calling Calendar( ) from your HTML page

var SpecialDay=1;	// 1=Sunday, 2=Monday, . . . 7=Saturday
var ColorBackground="#ffffff";
var ColorSpecialDay = "#99000";
var ColorToday = "green";
var ColorEvent = "#333333";
var showAltDate = false;  	// add display of alternate date using results from user supplied "getAltMonth(dy, mo, yr, last)" and "getAltDate(dy, mo, yr)" functions
var showHolidays = false; 	// add display of holidays using result from user supplied "holidays(dy, mo, yr)" function
var showAltHoly = false; 	// add display of alternate holidays using result from user supplied "getAltHoly(dy, mo, yr)" function
var showMsgBox = true; 	// span empty cells (before 1st day and after last) for messageBox use
var showMini = true; 		// add minimonth display of prior and next months if first and/or last boxes are available 
var showNav = false; 		// enable month navigation (might disable for print version)
var showImages = true; 	// enable event images (might disable for print version)
var showLinks = true; 		// enable event hyperlinks (might disable for print version)
var msgBoxColor = "#ffcc99";
var navColor = "#eeeeee";
var imageAlign = "left"; 	// default event image alignment
var imageScale = 100;		// percent scale factor for images
var altAlign = true; 		// alternate left/right alignment of event images on same date for readability
var DefaultFormat = "custom"; // for compatibility; set to "layer" to simplify formatting
var ExportPage = ""; 		// name of html page for displaying event text for export
var PrintPage = ""; 		// name of html page for printer-friendly format
var CalendarWidth = 700;
var MonthFontSize = 4;
var cellWidth="99";
var cellHeight="100";

// all format codes must have "|" to separate before and after tags
var DateFontSize=2;
var AltDateFormat = "<font color=#999999 size=2>|</font>";
var MonthFormat = "<font color=#990000 size=" + MonthFontSize + "><b>|</b></font>";
var AltMonthFormat = "<br><font color=#999999 size=" + DateFontSize/2 + ">|</font>";
var HolidayFormat = "<font color=#999999 size=2><b><center>|</center></b></font>";
var AltHolyFormat = "<font  size=2><b><center>|</center></b></font>";
var DefaultLayerFormat = "<font size=2>|</font>";

var defaultMsgBox = "Note: The information here may not be current; please confirm dates and times.<p>";

// Initialize the range of the calendar to Jan - Dec of the current year.
// Event definitions will change this as needed; or it can be explicitly
// overridden before calling Calendar( ) from the HTML page.

var today = new Date();
var FirstMonth=GetFullYear(today) * 100 + 1;
var LastMonth=FirstMonth + 11;

// Layers[] is an array of layer names and default formats. Call DefineLayer( ) to add the
// layer name and corresponding format. New layer names in event definitions will
// be added automatically (watch case and spelling).

var Layers = new Array;
var LayerString = "|";
var layerCount = 0;
var layerChange = false;

// MsgBoxes[] is a SPARSE array; Call AddMsgBox( ) to populate it

var MsgBoxes = new Array;

// Events[] is a SPARSE array; Call AddEvent( ) to populate it or DefineEvent( ) for
// compatibility with existing calendar definition scripts.

var Events = new Array;

// Each event is defined by calling the AddEvent( ) routine with the following parameters:
//
//   AddEvent(Date, Description, Layer, Format, Link, Image, Width, Height, Align, Alt)
//        Date is a numeric value in the format YYYYMMDD
//        Description is a string (may include embedded HTML tags such as <BR>, <strong>, etc.)
//        Layer is an event category whose display on the calendar can be toggled on/off by the user
//        Format specifies the source of the format info for Description. Note that any embedded
//        formats in Description will still be applied; this argument is primarily to provide
//        a more convenient way to specify formats. 
//            "layer" = use default format from layer definition (plus any embedded tags!)
//            "custom" = only use format tags embedded in Description string
//            "<...>|</...>" = series of before and after tags separated by a "|" to wrap around
//               Description (plus any embedded tags!)  
//        Link is the URL of the target page if a hyperlink is desired from this event entry
//        Image is the URL of the image if you want to display an image with this event
//        Width is the width of the image in pixels
//        Height is the height of the image in pixels
//        Align is the alignment of the image such as "left", or "right"
//        Alt is the alternate text of the image (for mouseover or non-graphic browser)

// The function DefineEvent(Date, Description, Link, Image, Width, Height) is used
// for compatibility with previous calendar definition scripts

String.prototype.startsWith = function(str)
{return (this.match("^"+str)==str)}

// Event constructor
function Event(description, layer, format, link, image, width, height, align, alt,
               itemId, name, startTime, endTime, recurrence, chapter, chapterId, 
               location, locationURL, multiDayEventDay, multiDayStartDate, multiDayEndDate, editPermission) {               

        this.itemId = itemId;
        this.name = name;
	this.description = description;
        this.startTime = startTime;
        this.endTime = endTime;
        this.recurrence = recurrence;
        this.chapter = chapter;
        this.editPermission = editPermission;
        this.chapterId = chapterId;
        this.location = location;
        this.locationURL = locationURL;
        this.multiDayEventDay = multiDayEventDay;
        this.multiDayStartDate = multiDayStartDate;
        this.multiDayEndDate = multiDayEndDate;
         
	if (link) this.link = link;
        
	if (image) {
	   this.image = image;
	   if (width) this.width = width;
	   if (height) this.height = height;
	   if (align) this.align = align;
	   if (alt) this.alt = alt;
	   //alert("Event: ("+this.width+","+this.height+")");
	}
	this.layer = (layer ? layer : "default"); // must have some associated layer
	
	if (format) {
	   if (CheckFormat(format)) this.format = format;
	}
}

// Compatibility function for existing calendar definition scripts
/*function DefineEvent(Date, Description, Link, Image, Width, Height) {
	AddEvent(Date, Description, "", "", Link, Image, Width, Height, "", "");
}*/

// convienience function for adding event from eola cms 
function AddNewCalendarEvent(Date, itemId, name, Description, startTime, endTime, 
                     recurrence, Link, chapter, chapterId, location, locationURL, 
                     multiDayEventDay, multiDayStartDate, multiDayEndDate, editPermission) {
                                            
  AddCalendarEvent(Date, Description, "", "", Link, "", "", "", "", "", 
           itemId, name, startTime, endTime, recurrence, chapter, chapterId, 
           location, locationURL, multiDayEventDay, multiDayStartDate, multiDayEndDate, editPermission);

}

function AddCalendarEvent(Date, Description, Layer, Format, Link, Image, Width, Height, Align, Alt, 
                  itemId, name, startTime, endTime, recurrence, chapter, chapterId, 
                  location, locationURL, multiDayEventDay, multiDayStartDate, multiDayEndDate, editPermission) {                                                                
	var i;
        
        //alert("Adding date: "+Date);
	if (!Events[Date]) Events[Date] = new Array;
	i = Events[Date].length;
        
	//Events[Date][i] = new Event(Description, Layer, Format, Link, Image, Width, Height, Align, Alt);        
        Events[Date][i] = new Event(Description, Layer, Format, Link, Image, Width, Height, Align, Alt,
                                    itemId, name, startTime, endTime, recurrence, chapter, chapterId, location, 
                                    locationURL, multiDayEventDay, multiDayStartDate, multiDayEndDate, editPermission);                                  

	// Adjust the minimum and maximum month & year to include this date
	tmp = Math.floor(Date / 100);
	if (tmp < FirstMonth) FirstMonth = tmp;
	if (tmp > LastMonth) LastMonth = tmp;

	// if EventLayer not in Layers, add it
	// NOTE: watch case in DefineLayer and DefineEvent to avoid undesired "duplicates"

	//alert("AddEvent("+Date+","+Description+","+Width+","+Height+"...)");
	if (Layer && !Layers[Layer]) DefineLayer(Layer);
}

// Layer constructor
function Layer(format, show) {
	if (format) {	
	   if (format.indexOf("|")>0) {
	      this.format = format;
	   } else {
	      alert("Invalid Calendar Format String: " + format);
	   }
	} else {
	   this.format = DefaultLayerFormat;
	}
	this.show = (show=="false" ? "false" : "true");	// watch boolean vs. string arg
}

function DefineLayer(LayerName, LayerFormat, LayerShow) {
	Layers[LayerName] = new Layer(LayerFormat, LayerShow);
	layerCount++;
}

// Utility function to populate an array with values
function arr() {
	for (var n=0;n<arr.arguments.length;n++) {
		this[n+1] = arr.arguments[n];
	}
}

// Create the array of month names (used in various places)
var months = new arr("JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER");

// Calendar( ) is the only routine that needs to be called to display the calendar
var cookieName = "layerCalendar";
var pre, post, tmp, gloMo, gloYr, gloYearmonth;
//var calendarElement = document.getElementById('eventCalendar');
var outputTest;
var firstLoad = true;

function Calendar(initYearMonth, hitDate) {
  var curdy, curmo, curyr, yr, mo, dy, firstday, yearmonth, bgn, lastdate, jump;
  var weekdays = new arr("SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY");
  var thispage = window.location.pathname;
  var myMsgBox = "Put this FREE calendar script on your own site; see <a href=http://calendar.pikesys.com>calendar.pikesys.com</a>.<p>";

  // define default MsgBox messages
  AddMsgBox(0, defaultMsgBox);
  AddMsgBox(0, myMsgBox);

  // Save current day and month for comparison
  curdy = today.getDate();
  curmo = today.getMonth()+1;
  curyr = today.getYear();
  
  // LoadCalendar now calls initCal
  /*
  curyr = GetFullYear(today);
  if (initYearMonth != undefined) {
    initCal(initYearMonth);
  } else {
    // default to this month
    initCal((curyr * 100) + curmo);  	
  }
  */ 

  mo = gloMo; 
  yr = gloYr; 
  yearmonth = gloYearmonth;      
  
  // write month year label in nav bar
  var monthyear_label = document.getElementById('monthyear_label');
  monthyear_label.innerHTML = months[mo] + " " + yr;
  
  
  // getLayersVisible(); 		// get layer visibility settings from cookie	 
        
  // Create a date object for the first day of the desired month
  bgn = new Date(months[mo] + " 1," + yr);
  
  // Get the day-of-week of the first day, and the # days in the month
  firstday = bgn.getDay();
  lastdate = NumDaysIn(mo,yr);
  lastday = 1+(firstday + lastdate - 1)%7;
  prev = next = "&nbsp;";
     
 
  //parseFormat(MonthFormat);
  tmp = "<TABLE align=center style='table-layout: fixed' BORDER=0 cellpadding=0 cellspacing=0 WIDTH="+CalendarWidth+">";	  
  /*/if (showAltDate) {
          parseFormat(AltMonthFormat);
          altMonth = getAltMonth(1, mo, yr, lastdate);
          tmp += pre + (altMonth ? altMonth : "") + post;
  }*/
 
  outputTest = tmp;
  outputTest += "<TR>";
	
  for (var i=1;i<=7;i++){
    var weekdayClass = "CalDay";
    if (i==7) {      
      weekdayClass = "CalDay2";
    }
    outputTest += "<TD CLASS="+weekdayClass+" height=28 width="+cellWidth+">"+weekdays[i]+"</TD>";
  }
  dy = 1;
  outputTest += "</TR><TR>";

  while (dy <= lastdate) {
    for (var i=1; i<=7; i++) {
      rightBorderStyle = "border-right: none";
      if (i==7) {
        rightBorderStyle = "border-right-style: solid;border-right-width: 1px;border-right-color: #CCCCCC;";
      }
      // If the day cell is before the first day of the month, print a miniMonth display of previous month in the first cell, 
      // otherwise print a space in this cell of the table.
      if (dy == 1 && i <= firstday) {
        if (i == 1) {
          if (showMini) {
                  outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+";cursor:pointer' HEIGHT="+cellHeight+" WIDTH="+cellWidth+" onclick=LoadCalendar(PrevYearMonth("+yearmonth+"))>";							
                  MiniMonth(PrevYearMonth(yearmonth));
          } else {
                  outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+">&nbsp;";
          }
        } else if (showMsgBox && i==2) { 	// span empty cells to allow messageBox
                msgSpan = firstday - 1;
                outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+" COLSPAN=" + msgSpan +">&nbsp;";
                DoMsgBox(yearmonth, msgSpan);
        } else if (!showMsgBox) {
                outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+">&nbsp;";
      }
      outputTest += "</TD>";

      // If the day cell is after the last day of the month, print a miniMonth display of following month in the last cell, 
      // otherwise print a space in this cell of the table.
      } else if (dy > lastdate) {
        if (i == 7) {
          if (showMini) {
                  outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+";padding:0px;cursor:pointer' HEIGHT="+cellHeight+" WIDTH="+cellWidth+" onclick=LoadCalendar(NextYearMonth("+yearmonth+"))>";			            		            				
                  MiniMonth(NextYearMonth(yearmonth));						
          } else {
                  outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+">&nbsp;";
          }
        } else if (showMsgBox && i==(lastday+1)) { 	// span empty cells to allow messageBox
                msgSpan = 6 - lastday;
                outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+" COLSPAN=" + msgSpan +">&nbsp;";
                DoMsgBox(yearmonth, msgSpan);
        } else if (!showMsgBox) {
                outputTest += "<TD CLASS=CalCellBG1 STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+">&nbsp;";
        }
        outputTest += "</TD>";

      // Otherwise, write date and the event, if any, in this cell of the table.
      } else {
        var yrmody = "" + yr + formatDateInt(mo) + formatDateInt(dy);	

        ind = (((gloYr * 100) + gloMo) * 100) + dy;
        var dayCellClass = "CalCellBG1";
        if (yrmody == hitDate || Events[ind] != undefined) {          
          var todayInd = (((curyr * 100) + curmo) * 100) + curdy;          
          if (ind < todayInd) {           
             dayCellClass = "CalCellBGPassed";  
          } else {
             dayCellClass = "CalCellBGActive";    
          }                
        }  
        outputTest += "<TD CLASS="+dayCellClass+" STYLE='"+rightBorderStyle+"' HEIGHT="+cellHeight+" WIDTH="+cellWidth+">";           
        
        ShowDate(yr,mo,dy,i,curmo,curdy);
        outputTest += "</TD>";				
        dy++;
      } 
    }
    outputTest += "</TR>";		
  }

  // build month jump
  UpdateMonthJumpNav();
  
  if (showNav) {	
          prev = next = "&nbsp;"; 
          if (yearmonth > FirstMonth)
                  prev = '<a class="navlink" href="' + thispage + '?'+PrevYearMonth(yearmonth)+'">&lt;-- View '+months[PrevMonth(mo)]+'</a>';
          if (yearmonth < LastMonth)
                  next += '<a class="navlink" href="' + thispage + '?'+NextYearMonth(yearmonth)+'">View '+months[NextMonth(mo)]+' --&gt;</a>';
          tmp = "<TR BGCOLOR="+navColor+">";
          tmp += "<TD colspan=7 align=center valign=middle><br><FORM>";
          if (ExportPage) tmp += '<a class="navlink" href="' + ExportPage + '?'+yearmonth+'">Export Events Displayed</a>&nbsp;&nbsp;|&nbsp;&nbsp;';
          tmp += 'Jump to month:&nbsp;&nbsp;';
          outputTest += tmp;
          BuildSelectionList(yearmonth, thispage);
          if (PrintPage) outputTest += '&nbsp;&nbsp;|&nbsp;&nbsp;<a class="navlink" href="' + PrintPage + '?'+yearmonth+'">Print-friendly</a>';
          tmp = "</FORM></TD>";		
          outputTest += tmp + "</TR>";
          if (layerCount>1) {
                  outputTest += "<TR BGCOLOR="+navColor+"><TD colspan=7 align=center>";
                  ChooseLayers(yearmonth, thispage);
                  outputTest += "</TD></TR>";
          } 
  }
  outputTest += "</TABLE>";
	
  //var testNode = document.createTextNode(outputTest);
  //calendarElement.appendChild(testNode);
  calendarElement.innerHTML = outputTest;
  
  /*/if (!firstLoad) {
    init_dw_Scroll();
  } else {
    firstLoad = false;
  } */	
}

// Display a date in the appropriate color, with events (if there are any)

function ShowDate(yr, mo, dy, dayofweek, currentmonth, currentday) {

	var ind, DayHighlighted, tmp, event;

	tmp = "<TABLE><TR VALIGN=TOP><TD ALIGN=LEFT WIDTH=10%>";
	tmp += "<FONT SIZE=" + DateFontSize;	// Note open tag!	
	DayHighlighted = false;

	if ((mo == currentmonth) && (dy == currentday)) {
		tmp += " COLOR=" + ColorToday;
		DayHighlighted = true;
	} else if (dayofweek == SpecialDay) {
		tmp += " COLOR=" + ColorSpecialDay;
		DayHighlighted = true;
	}

       
	ind = (((yr * 100) + mo) * 100) + dy;
	if (Events[ind]) {
		//event = Events[ind];
		if (!DayHighlighted) tmp += " COLOR=" + ColorEvent;
//	} else {
//		event = "&nbsp;<BR>&nbsp;";
	}
	
	tmp += "><B>" + dy + (dy<10 ? "&nbsp;" : "") + "&nbsp;</B></FONT></TD>";	 	// close tag
	outputTest += tmp;
	
	if (showAltDate) {
		altDate = getAltDate(dy, mo, yr);
		parseFormat(AltDateFormat);
		outputTest += "<TD ALIGN=RIGHT>" + pre + altDate + post + "</TD>";
	}
	outputTest += "</TR></TABLE>";

	if (showAltHoly) {
		tmp = getAltHoly(dy,mo,yr);
		if (tmp) {
			parseFormat(AltHolyFormat);
			outputTest += pre + tmp + post + "<BR>";
		}
	}
	
	if (showHolidays) {
		tmp = holidays(dy,mo,yr);
		if (tmp) {
			parseFormat(HolidayFormat);
			outputTest += pre + tmp + post + "<BR>";
		}
	}
//	document.write("<P><FONT SIZE=1>" + event + "</FONT>");

        // events
        //ind = (((gloYr * 100) + gloMo) * 100) + dy;
        if (Events[ind] != undefined) {            
          outputTest += "<table style='table-layout: fixed' width=99 border=0 cellpadding=0 cellspacing=0><tr><td width=100 class='CalDayTX'>";
          //outputTest += "<div id='wn"+dy+"' class='dayScrollWindow'><div id='lyr"+dy+"'>";
          outputTest += "<div id='dayCell"+dy+"' class='dayScrollWindow'>";     
          
          for (j in Events[ind]) {
            ev = Events[ind][j];
            altTitle = ev.startTime+"-"+ev.endTime+" "+ev.name;
            if (ev.chapter.length > 0) {
              altTitle += " ["+ev.chapter+" Chapter]";
            }
            outputTest += "<a style='color: #990000' href='javascript:showEventDetailsWindow("+dy+", "+ind+", "+j+")' title='"+altTitle+"'>"+ev.name+"</a><br><br>";   
          }       
          outputTest += "</div></td>";
          //outputTest += "<td><div id='scrollbar"+dy+"' class='dayScrollBar'>";        
          //outputTest += "<div id='up"+dy+"' class='dayScrollUp'><a class='mouseover_up' href=''><img src='scrollbar/images/btn-up.gif' width=11 height=11 alt='' border='0'/></a></div>";
          //outputTest += "<div id='track"+dy+"' class='dayScrollTrack'><div id='dragBar"+dy+"' class='dayDragBar'></div></div>"; 
          //outputTest += "<div id='down"+dy+"' class='dayScrollDown'><a class='mouseover_down' href=''><img src='scrollbar/images/btn-dn.gif' width=11 height=11 alt='' border='0'/></a></div>";         
          //outputTest += "</div></td></tr></table>"; 
          outputTest += "</tr></table>"; 
        } 
  
  /*/
	images=0;
	for (j in Events[ind]) {
		ev = Events[ind][j];
		// with(Events[ind][j]) { // greatly improves readability of following
		//for (k in ev) { alert("ev["+k+"]="+ev[k]) }
		//  document.write("Events[" + ind + "][" + j + "][" + k + "] = " + EscapeLtGt(Events[ind][j][k]), "<br>");
		//alert("-> Layers[Events["+ind+"]["+j+"]."+ev.layer+"].show="+Layers[ev.layer].show);
		tmp = "";		
		if (Layers[ev.layer].show == "true") {
			//alert("(+)showing event for "+ind+" in layer "+ev.layer);
			// Build the HTML string for this event
			tmp += (j>0 ? "<br>" : "");
			if (ev.image && showImages) {
				if (ev.align) {
					align = ev.align;
				} else if (altAlign && images>0) {
					align = (lastAlign=="left" ? "right" : "left");
				} else {
					align = imageAlign;
				}
				tmp += '<img src="' + ev.image + 
					   (ev.width ? '"  width="' + ev.width*imageScale/100 : '') +
					   (ev.height ? '" height="' + ev.height*imageScale/100 : '') +
					   (ev.alt ? '" alt="' + ev.alt : '') +					   
					   '" align="' + align + '" valign="top">';
				lastAlign = align;
				images++;
			}
			format = "";
			if (ev.format == "layer") { // use format from layer (and embedded tags)
				format = Layers[ev.layer].format;
			} else if (ev.format == "custom") { // use only embedded tags
				format = "";
			} else if (ev.format) { 	// format string?
				if (CheckFormat(ev.format)) format = ev.format;
			} else if (DefaultFormat == "layer") { // use format from layer if no custom format
				format = Layers[ev.layer].format;
			}
			parseFormat(format);
			//tmp += pre + (ev.link && showLinks ? ev.description.link(ev.link) : ev.description) + post + "<br>";
			tmp += pre + (ev.link && showLinks ? "<a class=\"eventlink\" href="+ev.link+">"+ev.description+"</a>" : ev.description) + post + "<br>";
			
		} else {
			//alert("(-)skipping event for "+ind+" in layer "+ev.layer);
		}
            outputTest += "<FONT SIZE=1>" + tmp + "</FONT>";
            }
        */
}

function exportCal( ) {
	var curdy, curmo, yr, mo, dy, firstday, yearmonth, lastdate;

	// Save current day and month for comparison
	curdy = today.getDate();
	curmo = today.getMonth()+1;
	curyr = GetFullYear(today);

  initCal((curyr * 100) + curmo);	
	mo = gloMo; yr = gloYr; yearmonth = gloYearmonth;
	getLayersVisible();	
	
	// Create a date object for the first day of the desired month
	lastdate = NumDaysIn(mo,yr);

	tmp = "<textarea NAME=\"txt\"  ROWS=20 COLS=75 WRAP=VIRTUAL>";
	tmp += '"Subject","Start Date","Start Time","End Date","End Time","All day event","Description","Show time as","Location"\n';
	outputTest += tmp;
	for (dy=1; dy<=lastdate; dy++) {
		ind = (((yr * 100) + mo) * 100) + dy;
		evdate = mo + "/" + dy + "/" + yr;
		for (j in Events[ind]) {
			ev = Events[ind][j];
			if (Layers[ev.layer].show == "true") {
				//alert("(+)showing event for "+ind+" in layer "+ev.layer);
				tmp = qw(ev.description) + "," + qw(evdate) + ",,,," + qw("true") + ",," + 
					 qw("3") + "," + qw("CalendarScript");
				if (ev.description) outputTest += tmp+"\n";
			} else {
				//alert("(-)skipping event for "+ind+" in layer "+ev.layer);
			}
		}
	}
	outputTest += "</textarea>";
}

function getLayersVisible() {
	// get layer visibility settings from cookie
	prefix = cookieName + "|";
	cookie = unescape(document.cookie);
	pos = cookie.indexOf(prefix);
	if (pos>=0) {
	    pos += prefix.length;
	    sep = cookie.indexOf(";");
	    if (sep == -1) sep = cookie.length;
	    var layerCookies = cookie.substring(pos, sep).split("|");
	    for (i=0; i<layerCookies.length; i++) {
	        sep = layerCookies[i].indexOf("=");
		name = layerCookies[i].substring(0, sep);
		value = layerCookies[i].substring(sep+1, layerCookies[i].length);
		if (Layers[name]) Layers[name].show = value;
		//alert("Read cookie: "+name+"="+value+" Layers["+name+"]="+Layers[name].show);
	    }
	}
}

function initCal(inityearmonth) {     
	// create default layer
	if (!Layers["default"]) DefineLayer("default", DefaultLayerFormat);

	// extract month and year from yearmonth
	mo = inityearmonth % 100;
        yr = (inityearmonth - mo) / 100;
	
	//mo = curmo;
	//yr = GetFullYear(today);
	//yearmonth = (yr * 100) + mo;

	// If querystring parameter is present, get the month/year ("calendar.htm?YYYYMM")
	/*if (location.search.length > 1) {
		yearmonth = parseInt(location.search.substring(1,location.search.length));
		if ((""+yearmonth).length == 6) {
			mo = yearmonth % 100;
			yr = (yearmonth - mo) / 100;
		}
	}*/

	// Constrain to the range of months with events
        /*
	if (inityearmonth < FirstMonth) {
		mo = FirstMonth % 100;
		yr = (FirstMonth - mo) / 100;
		inityearmonth = FirstMonth;
	}
	if (inityearmonth > LastMonth) {
		mo = LastMonth % 100;
		yr = (LastMonth - mo) / 100;
		inityearmonth = LastMonth;
	}*/
	gloMo = mo; 
        gloYr = yr; 
        gloYearmonth = inityearmonth;
}

function qw(string) {
	return "&quot;" + string + "&quot;";
}

// Create a mini display of the desired month

function MiniMonth(yearmonth) {  
	var bgn, firstday, lastdate, miniweek;
	var days = new arr("S","M","T","W","T","F","S");

	mo = yearmonth % 100;
	yr = (yearmonth - mo) / 100;
	bgn = new Date(months[mo] + " 1," + yr);
	// Get the day-of-week of the first day, and the # days in the month
	firstday = bgn.getDay();
	lastdate = NumDaysIn(mo,yr);
	outputTest += "<br><b><tt><div style='padding:0px;font-size:10px;text-align:center'>&nbsp;" + months[mo] + "</div>";	
        outputTest += "<div style='padding:0px;font-size:7px;text-align:left'>&nbsp;<u>";
	for (d in days) { outputTest += "&nbsp;" + days[d] + "&nbsp;"; }
	outputTest += "</u>";
	
        dy = 1;
	// Rest of the weeks . . .
	while (dy <= lastdate) {
		miniweek = "<br>";
		for (var i=1;i<=7;i++) {
			// If the day is less than the day of the week of the first day of the month, append spaces
			if (dy == 1 && i <= firstday){
				miniweek += "&nbsp;&nbsp;&nbsp;";
			// End minimonth if the day > last day of the month
			} else if (dy > lastdate) {
				break;
			// Otherwise, append date (w/ extra space for single digits)
			} else {
				miniweek += "&nbsp;" + ( dy<10 ? "&nbsp;" : "" ) +dy;
				dy++;
			}
		}
		outputTest += miniweek;
	}
	outputTest += "</div></tt></b>";
        
}


// Remaining routines are utilities used above

function NumDaysIn(mo,yr) {
	if (mo==4 || mo==6 || mo==9 || mo==11) return 30;
	else if ((mo==2) && LeapYear(yr)) return 29;
	else if (mo==2) return 28;
	else return 31;
}

function LeapYear(yr) {
	return ( (yr%4 == 0 && yr%100 != 0) || yr % 400 == 0 ? true : false );
}

// fixes a Netscape 2 and 3 bug
function GetFullYear(d) { // d is a date object
	var yr = d.getYear();
	return ( yr < 1000 ? yr + 1900 : yr );
}

function PrevMonth(mth) {
	return ( mth == 1 ? 12 : mth - 1 );
}

function NextMonth(mth) {
	return ( mth == 12 ? 1 : mth + 1 );
}

function PrevYearMonth(yrmth) {  
	return ( yrmth%100 == 1 ? yrmth-100+11 : yrmth-1 );
}

function NextYearMonth(yrmth) {  
  return ( yrmth%100 == 12 ? yrmth-11+100 : yrmth+1 );
}

function JumpTo(calendar, thispage) {
	var sel, yrmo;

	sel = calendar.selectedIndex;
	yrmo = calendar.form.jumpmonth[sel].value;	
	Calendar(parseInt(yrmo));
	//document.location = thispage + "?" + yrmo;
}

function BuildSelectionList(current, thispage) {
	var mo, yr, yearmonth;

	yearmonth = FirstMonth;
	tmp = "<select name=\"jumpmonth\" size=1 onchange=\"JumpTo(this,'" + thispage + "')\">";
	while (yearmonth <= LastMonth) {
		mo = yearmonth % 100;
		yr = (yearmonth - mo) / 100;
		selected = (yearmonth == current ? " selected" : "");
		tmp += "<option value=" + yearmonth + selected + ">" + months[mo]+" "+yr;
		yearmonth = NextYearMonth(yearmonth);
	}

	outputTest += tmp + "</select>";
}

// Create a message box

function DoMsgBox(yearmonth, msgSpan) {
	if (MsgBoxes[yearmonth]) {
		for (j in MsgBoxes[yearmonth]) { 	// find first unshown message for month that fits
			monthlyMsg =MsgBoxes[yearmonth][j];
			if (!monthlyMsg.shown) {
				//document.write("monthlyMsg.minspan = " + monthlyMsg.minspan + "<br>");
				if (!monthlyMsg.minspan || monthlyMsg.minspan <= msgSpan) {
					tmp = "<table border=1 bgcolor=" + msgBoxColor + " align=center>";
					tmp += "<TR><TD>"+ monthlyMsg.message + "</TD></TR></table>";
					outputTest += tmp;
					monthlyMsg.shown = true;
					return;
				}
			}
		}
	}
	if (MsgBoxes[0]) { 	// show default MsgBox messages if they exists
		for (j in MsgBoxes[0]) { 	// find first unshown message for month that fits
			monthlyMsg =MsgBoxes[0][j];
			if (!monthlyMsg.shown) {
				//document.write("monthlyMsg.minspan = " + monthlyMsg.minspan + "<br>");
				if (!monthlyMsg.minspan || monthlyMsg.minspan <= msgSpan) {
					tmp = "<table border=1 bgcolor=" + msgBoxColor + " align=center>";
					tmp += "<TR><TD>"+ monthlyMsg.message + "</TD></TR></table>";
					outputTest += tmp;
					monthlyMsg.shown = true;
					return;
				}
			}
		}
	}
}

// Utility routines

function escramVal(j,k){var a,b,c,d,e;a='<a href=\"mai';c='\">';a+='lto:';b=j+'@';e='</a>';b+=k;d=b;return(a+b+c+d+e);}

function parseFormat(format) {
	// pre and post are globals
	pre = post = "";
	if (format) {		
		var sep = format.indexOf("|");
		if (sep > 0) {  // split format into pre and post strings
			pre = format.substring(0, sep);
			post= format.substring(1+sep, format.length);
		}
	}
}

function CheckFormat(String) {
	var okay;
	okay =(String == "layer" || String == "custom" || String.indexOf("|")>0);
	if (!okay) alert("Invalid Calendar Format String: " + String);
	return okay;
}
	
// MsgBox constructor
function MsgBox(message,minspan,maxspan) {
	//alert("MsgBox("+message+","+minspan+","+maxspan+")");
	this.message = message;
	this.minspan = (minspan ? minspan : 1);
        if (maxspan) this.maxspan = maxspan;
	//this.shown = false;
}

function AddMsgBox(yearmonth,message,minspan,maxspan) {
	var i;

	if (!MsgBoxes[yearmonth]) MsgBoxes[yearmonth] = new Array;
	i = MsgBoxes[yearmonth].length;
	MsgBoxes[yearmonth][i] = new MsgBox(message,minspan,maxspan);
}

function ChooseLayers(yearmonth, thispage) {
	var i, checked;
	tmp = '<form name="layerform"><b>Filter Events:</b>&nbsp;';
	for (i in Layers) {
		if (i != "default") {
			checked = (Layers[i].show == "true" ? " checked" : "");
			parseFormat(Layers[i].format);
			tmp += pre + '<input type="checkbox" name="' + i + '" value="' + i + '"' +checked + 
				' onClick="ChangeLayer(\''+i+'\')">' + i + "&nbsp;" + post;
		}
 	}
	//if (layerChange) {
	tmp += '&nbsp;<input type="button" name="ApplyChanges" value="Apply Changes"' +
		'onClick="ApplyLayerChange(\'' + thispage + '\',\'' + yearmonth + '\')">';
	//}
	
	outputTest += tmp + "</form>";
}

function ChangeLayer(layer) {
	layerChange=true;
	Layers[layer].show = document.layerform[layer].checked;
}

function ApplyLayerChange(thispage, yearmonth) {
	layerChange=false;
	cookie = cookieName;
	for (layer in Layers) {
		if (layer != "default") {
			cookie += "|" + layer + "=" + Layers[layer].show;
		}
	}
	// persist cookie?
	document.cookie = escape(cookie);
	//alert("set cookie="+cookie);
	document.location = thispage + (yearmonth ? "?"+yearmonth : "");
}

function formatDateInt(mo) {
  if (mo < 10) {
    return "0" + mo;
  } else {
    return "" + mo;
  }
}

function extractMonth(date) {
  // extracts month from integer "YYYYMODD", i.e. 20080415
  dy = date % 100;  
  yrmo = (date - dy) / 100;    
  mo = yrmo % 100;
  return mo;    
}

function extractDay(date) {
  // extracts day from integer "YYYYMODD", i.e. 20080415
  return date % 100;          
}

function extractYear(date) {
  // extracts year from integer "YYYYMODD", i.e. 20080415
  mody = date % 10000;  
  year = (date - mody) / 10000;  
  return year;          
}

var currentCalendarPageTab = 'calendar_view';
function toggleCalendarTab(name) {        
    tab = document.getElementById(currentCalendarPageTab);  
    tab_button =  document.getElementById(currentCalendarPageTab+'_tab');
    tab.style.display = 'none';  
    //tab.style.visibility = 'collapse';  
    tab_button.onmouseover = function() { 
       BGNew(this,'TabOn','Tab');  
       this.style.cursor='pointer';
    }   
    tab_button.onmouseout = function() { 
       BGNew(this,'TabOff','')
       this.style.cursor='default'
    }     
    tab_button.className = "TabOff";
              
    tab_button =  document.getElementById(name+'_tab');    
        
    tab_button.onmouseover = "";
    tab_button.onmouseout = "";
    tab_button.className = "TabOn";  
    //alert(document.getElementById(name).style.display);
    document.getElementById(name).style.display = '';  
    //document.getElementById(name).style.visibility = 'visible';      
    
    currentCalendarPageTab = name;
    var accessPopUp = document.getElementById("dhtml_goodies_id1");
    accessPopUp.style.display = "none"; 
}

// override default settings and those from the sample_common.js file here
//showAltDate = true;  	// add display of alternate date using results from user supplied "getAltMonth(dy, mo, yr, last)" and "getAltDate(dy, mo, yr)" functions
//showHolidays = true; 	// add display of holidays using result from user supplied "holidays(dy, mo, yr)" function
//showAltHoly = true; 	// add display of alternate holidays using result from user supplied "getAltHoly(dy, mo, yr)" function
//DefaultFormat = "layer";
//ExportPage = "sample_export.html";
//PrintPage = "sample_print.html";
//defaultMsgBox = "Note: Alternate dates and holidays here are not events and will not be included in event exports.<p>";
//showMsgBox = false;
//CalendarWidth = 670;


function eventDetails(obj) {
  alert("Event Details Popup Window");
}

var currentHiEventId;

function selectEvent(obj) {
  highlightEvent(obj.id);
  flipCalendar(obj);
}

function highlightEvent(id) {
  // unhighlight current
  clearEventHighlight(); 
    
  var evEl = document.getElementById(id);
  if (evEl != undefined) {
    flipCalendar(evEl);
    evEl.className='eventItemOn';
  } 
  currentHiEventId = id;
}

function clearEventHighlight() {
  evEl = document.getElementById(currentHiEventId);
  if (evEl != undefined) {
    evEl.className='eventItemOff';
  }
}

/*
 function init_dw_Scroll() {    
  lastDate = NumDaysIn(gloMo,gloYr);
  dy = 1;
  while (dy <= lastDate) {
    ind = (((gloYr * 100) + gloMo) * 100) + dy;
    if (Events[ind] != undefined) {
      var wndo = new dw_scrollObj('wn'+dy, 'lyr'+dy);
      wndo.setUpScrollbar("dragBar"+dy, "track"+dy, "v", 1, 1);
      wndo.setUpScrollControls('scrollbar'+dy);
    }
    dy++;
  }  
}

function showEvent(id) {  
  myScrollToId(id);
  highlightEvent(id);
}

function myScrollToYrMo(yrmo) {  
 clearEventHighlight(); 
 // look for first element id that starts with id
 el = undefined;
 var count = 1;
 while (el == null && count <= 31) {
   countStr = formatDateInt(count);     
   elId = "" + yrmo + countStr;       
   el = document.getElementById(elId);
   count++;
 }
 myScrollTo(el);
}

function myScrollToId(id) {
  var el = document.getElementById(id);
  myScrollTo(el);
}

function myScrollTo(el) {

 var lyrId='lyr1'; 
 var dur;
 var wndo = dw_scrollObj.col['wn'];
 
    if (el) {
        if ( lyrId ) {
            if ( document.getElementById(lyrId) && wndo.lyrId != lyrId ) {
                wndo.load(lyrId);
            }
        }
        var lyr = document.getElementById(wndo.lyrId);
        var x = dw_getLayerOffset(el, lyr, 'left');
        var y = dw_getLayerOffset(el, lyr, 'top');        
        wndo.initScrollToVals(x, y, dur);
    } 
}*/

function flipCalendar(obj) { 
 var month = obj.id.substr(4,2);
 var year = obj.id.substr(0,4);
 var yrmo = year+month; 
 Calendar(parseInt(yrmo), parseInt(obj.id)); 
}

function UpdateMonthJumpNav() {  
  for (jumpMo in months) {
    var el = document.getElementById('jump'+jumpMo);
    if (jumpMo == gloMo) {      
      el.style.textDecoration = 'none';
      el.style.color = '#333333';
      //el.style.fontWeight =  'bold';
      //el.style.cursor = 'normal';
      el.href = "";
    } else {
      el.style.textDecoration = 'underline';
      el.style.color = '#990000';
      el.style.fontWeight =  'normal';     
      el.href = "javascript:LoadCalendar("+parseInt(gloYr+''+formatDateInt(jumpMo))+")";  
    }        
  }      
  // update next and prev year labels
  var nextYear = gloYr + 1;
  var prevYear = gloYr - 1;
  document.getElementById('jumpLastYear').innerHTML = "Prev ["+prevYear+"]";
  document.getElementById('jumpNextYear').innerHTML = "Next ["+nextYear+"]";
  document.getElementById('currentYearLabel').innerHTML = gloYr;
  //lastYrEl.innerHTML = "Prev ["+(--gloYr)+"]";
}

function jumpNextYear() {    
  var nextYear = gloYr + 1;
  LoadCalendar(parseInt(nextYear+''+formatDateInt(gloMo)));   
}

function jumpPrevYear() {    
  var prevYear = gloYr - 1;    
  LoadCalendar(parseInt(prevYear+''+formatDateInt(gloMo)));  
}

function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } 
    while (obj = obj.offsetParent);
    return [curleft,curtop];
  } else {
    return [0, 0];
  }
}

function showEventDetailsWindow(dayCellId, eventDate, index) {     
  var daycell = document.getElementById("dayCell"+dayCellId);
  dayCellPos = findPos(daycell);  
  dayCellPosX = dayCellPos[0];
  dayCellPosY = dayCellPos[1];
  // popup window    
  var accessPopUp = document.getElementById("dhtml_goodies_id1");
  var itemId = Events[eventDate][index].itemId;
  
  var accessPopUpContent = document.getElementById("windowContent1");  
  accessPopUpContent.innerHTML = "<B>"+Events[eventDate][index].name+"</b>";  
  if (Events[eventDate][index].editPermission == 'true') {
     accessPopUpContent.innerHTML += " [ <a style='color: #990000' href='ItemDispatcherEvent.do?method=edit&amp;itemId="+itemId+"&amp;nextAction=ViewItem-"+itemId+".do'><i>Edit Event</i></a> ]";
  }
  
  
  if (Events[eventDate][index].chapterId > 0) {
    accessPopUpContent.innerHTML += "<br>Chapter: <a style='color: #990000' href='ViewCategory-"+Events[eventDate][index].chapterId+".do'>"+
    Events[eventDate][index].chapter+"</a>";  
  }  
 
  accessPopUpContent.innerHTML += "<br><br><a style='color: #990000' href='ViewItem-"+itemId+".do'>View Event Page</a>";
  accessPopUpContent.innerHTML += " | <a style='color: #990000' href='ViewItem-"+itemId+".do?ical'>Add to My Calendar</a>";    
 
  accessPopUpContent.innerHTML += "<br><br>"+Events[eventDate][index].description;  
  
  if (Events[eventDate][index].multiDayEventDay > 0) {
     accessPopUpContent.innerHTML += "<br><br>Day "+ Events[eventDate][index].multiDayEventDay + " of a Multi-Day Event that starts ";
     var multiDayStartDate = Events[eventDate][index].multiDayStartDate;
     mo = months[extractMonth(multiDayStartDate)];  
     accessPopUpContent.innerHTML += mo.substring(0, 1) + mo.substring(1, 3).toLowerCase() + " ";
     accessPopUpContent.innerHTML += extractDay(multiDayStartDate) + ", " +  extractYear(multiDayStartDate);
     accessPopUpContent.innerHTML += " at " + Events[eventDate][index].startTime;  
     accessPopUpContent.innerHTML += " and ends ";
     var multiDayEndDate = Events[eventDate][index].multiDayEndDate;
     mo = months[extractMonth(multiDayEndDate)];  
     accessPopUpContent.innerHTML += mo.substring(0, 1) + mo.substring(1, 3).toLowerCase() + " ";
     accessPopUpContent.innerHTML += extractDay(multiDayEndDate) + ", " +  extractYear(multiDayEndDate);
     accessPopUpContent.innerHTML += " at " + Events[eventDate][index].endTime;  
     accessPopUpContent.innerHTML += "<br><br>";
  } else {
    accessPopUpContent.innerHTML += "<br><br><b>Date:</b> ";
    mo = months[extractMonth(eventDate)];  
    accessPopUpContent.innerHTML += mo.substring(0, 1) + mo.substring(1, 3).toLowerCase() + " ";
    accessPopUpContent.innerHTML += extractDay(eventDate) + ", " +  extractYear(eventDate);
    accessPopUpContent.innerHTML += "<br><b>Time:</b> ";  
    accessPopUpContent.innerHTML += Events[eventDate][index].startTime + " to ";
    accessPopUpContent.innerHTML += Events[eventDate][index].endTime;      
  }
 
  var locationTable = "<table border=0 cellspacing=0 cellpadding=0><tr><td style='vertical-align:top;font-family: Helvetica, sans-serif; font-size: 12px; color: #333333;'><b>Location:</b></td><td style='padding-left: 5px;font-family: Helvetica, sans-serif; font-size: 12px; color: #333333;'>"; 
  if (Events[eventDate][index].locationURL.length > 0) {
    var locationURL = Events[eventDate][index].locationURL;
    if (!locationURL.startsWith('http')) {
      locationURL = "http://" + locationURL;
    }    
    locationTable += "<a style='color: #990000' href='"+locationURL+"' target='_blank'>"+
      Events[eventDate][index].location+"</a>";  
  } else {
    locationTable += Events[eventDate][index].location;  
  }
  locationTable += "</td></tr></table>"
  accessPopUpContent.innerHTML += locationTable;
   
  if (Events[eventDate][index].recurrence.length > 0) {
    accessPopUpContent.innerHTML += "<br><i>" + Events[eventDate][index].recurrence + "</i>";
  }   
      
  if (accessPopUp.style.display != "block") {
    accessPopUp.style.display = "block"; 
    // popup is not up.. show it and position it accordingly with day cell

    // reset to default height/width
    accessPopUp.style.width = 290;
    accessPopUpContent.style.height = 370;
    
    // position to the right of the day cell (Sun-Wed), to the left (Thur-Sat)
    if (dayCellPosX < 600) {
      accessPopUp.style.left = dayCellPosX + 100; 
    } else {
      accessPopUp.style.left = dayCellPosX - 260; 
    }
    
     if (dayCellPosY < 800) {
       // for first 3 rows date cells, position top of window just below days of week header
      accessPopUp.style.top = 505;
     } else {
      accessPopUp.style.top = dayCellPosY - (accessPopUp.offsetHeight) + 65;  
     }
  }
}
 
var showAllEvents = false;
function LoadCalendar(initYearMonth, hitDate) {     
  if (initYearMonth != undefined) {
    initCal(initYearMonth);
  } else {
    // default to this month
    initCal((GetFullYear(today) * 100) + (today.getMonth()+1));  	
  }
  
  // ajax call to eola cms for events occuring during given year month
  
  // clear all events
  Events = new Array;
  
  mo = gloMo - 1;
  yr = gloYr;  
   
  var numEventsForMoYr = 0;
  
  var url = "ViewCategory-"+eolaCategoryId+".do?xml&month="+mo+"&year="+yr;
 
  if (showAllEvents) {
    url += "&allEvents";
  }  
  CDownloadUrl('get', url, null, function(data) {   
     var first_element = data.getElementsByTagName('events').item(0);   // Read the first element

     if (first_element != null) {
       var categoryId = first_element.getAttribute("categoryId");
       var addNewEvent = first_element.getAttribute("addPermission");
       eolaEvents = new Array;
       var eolaEvents = data.getElementsByTagName("event");

       for (var i = 0; i < eolaEvents.length; i++) {
          var itemId = eolaEvents[i].getAttribute("itemId");
          var name = URL.decode(eolaEvents[i].getAttribute("name"));
          var description = URL.decode(eolaEvents[i].getAttribute("description"));
          var eventDate = eolaEvents[i].getAttribute("eventDate");
          var startTime = eolaEvents[i].getAttribute("startTime");
          var endTime = eolaEvents[i].getAttribute("endTime");
          var recurrence = eolaEvents[i].getAttribute("recurrence");
          var chapterName = eolaEvents[i].getAttribute("chapterName");
          var chapterId = eolaEvents[i].getAttribute("chapterId");
          var location = URL.decode(eolaEvents[i].getAttribute("location"));
          var locationURL = URL.decode(eolaEvents[i].getAttribute("locationURL"));
          var multiDayEventDay = eolaEvents[i].getAttribute("multiDayEventDay");
          var multiDayStartDate = eolaEvents[i].getAttribute("multiDayStartDate");
          var multiDayEndDate = eolaEvents[i].getAttribute("multiDayEndDate");
          var editPermission = eolaEvents[i].getAttribute("editPermission");

          AddNewCalendarEvent(eventDate, itemId, name, description, startTime, endTime,
                              recurrence, "javascript:eventDetails()", chapterName,
                              chapterId, location, locationURL, multiDayEventDay,
                              multiDayStartDate, multiDayEndDate, editPermission);

          if (extractMonth(eventDate) == gloMo && extractYear(eventDate) == gloYr) {
            numEventsForMoYr++;
          }
       }
     }

     document.getElementById("numEvents").innerHTML = numEventsForMoYr;

     Calendar(initYearMonth, hitDate);
     LoadEventList();
     SetAddNewEvent(addNewEvent, categoryId);
     
  });  
}

var selectedChapter;
function LoadNewChapter() {
  // get selected chapter  
  obj = document.getElementById("chapterSelect")
  selectedValue = obj.options[obj.selectedIndex].value;
  selectedChapter = obj.options[obj.selectedIndex].text;
  selectedLabel = selectedChapter;
  if (selectedValue == "listAll") {
    showAllEvents = true;
  } else if (selectedValue != "undefined") {
    eolaCategoryId = selectedValue;
    showAllEvents = false;
    selectedLabel += " Events"
  } else {
    // default to first in list
    obj.options[0].selected = true;
    showAllEvents = true;
    selectedValue = obj.options[obj.selectedIndex].value;
    selectedChapter = obj.options[obj.selectedIndex].text;
    selectedLabel = selectedChapter;
  }
      
  if (gloYearmonth != undefined) {
     LoadCalendar(gloYearmonth);  
  } else {
     LoadCalendar();  
  }
 
  var nowViewing = document.getElementById("nowViewing");
  nowViewing.innerHTML = selectedLabel.toUpperCase();
}

function LoadEventList() {
  var eventList = "<table width='"+CalendarWidth+"' style='table-layout: fixed' border='0' align='center' cellpadding='0' cellspacing='0'>";   
  
  var numEvents = 0;
  for (eventDate in Events) {  
    for (j in Events[eventDate]) {         
      ev = Events[eventDate][j];   
      if (extractMonth(eventDate) == gloMo && extractYear(eventDate) == gloYr) {
        numEvents++;
        cellClass = "CalTX1";
        if (numEvents % 2 == 1) cellClass = "CalTX2";
        eventList += "<tr>";
        mo = months[extractMonth(eventDate)];  
        eventList += "<td width='98' class='"+cellClass+"'><b>" + mo.substring(0, 1) + 
          mo.substring(1, 3).toLowerCase() + " ";
        eventList += extractDay(eventDate) + ", " +  extractYear(eventDate) + "</b>";
        
        // display time only if not a multiday event
        if (ev.multiDayEventDay == 0) {
           eventList += "<br><br>";
           eventList += "<b>" + ev.startTime + "</b> to <b>";
           eventList += ev.endTime + "</b>";      
        }
        eventList += "</td>";
        
        eventList += "<td width='467' class='"+cellClass+"'><b>"+ev.name+"</b><br>";
        if (ev.description.length > 0) eventList += ev.description + "<br>";
        
        // multiday event description
        if (ev.multiDayEventDay > 0) {
          eventList += "<br>Day "+ ev.multiDayEventDay + " of a Multi-Day Event that starts ";          
          mo = months[extractMonth(ev.multiDayStartDate)];   
          eventList += mo.substring(0, 1) + mo.substring(1, 3).toLowerCase() + " ";
          eventList += extractDay(ev.multiDayStartDate) + ", " + extractYear(ev.multiDayStartDate);
          eventList += " at " + ev.startTime;  
          eventList += " and ends ";     
          mo = months[extractMonth(ev.multiDayEndDate)];  
          eventList += mo.substring(0, 1) + mo.substring(1, 3).toLowerCase() + " ";
          eventList += extractDay(ev.multiDayEndDate) + ", " + extractYear(ev.multiDayEndDate);
          eventList += " at " + ev.endTime;  
          eventList += "<br>";
        }
        
        if (ev.recurrence.length > 0) {
          eventList += "<br><i>" + ev.recurrence + "</i>";
        }  
        
        eventList += "<br><br><a style='color: #990000' href='ViewItem-"+ev.itemId+".do'>View Event Page</a>";
        eventList += " | <a style='color: #990000' href='ViewItem-"+ev.itemId+".do?ical'>Add to My Calendar</a>";  
        
        if (ev.editPermission == 'true') {
          eventList += " | <a style='color: #990000' href='ItemDispatcherEvent.do?method=edit&amp;itemId="+ev.itemId+"&amp;nextAction=ViewItem-"+ev.itemId+".do'>Edit Event</a>";
        }
        
        eventList += "</td>";
        
        eventList += "<td width='131' class='"+cellClass+"'>";
        if (ev.chapterId > 0) {
          eventList += "<a style='color: #990000' href='ViewCategory-"+ev.chapterId+".do'>"+
            ev.chapter+"</a>";  
        } else {
           eventList += ev.chapter;  
        }  

        eventList += "</td>";
        
        eventList += "</tr>";
      }
    }
  }
  
  if (numEvents == 0) {     
      eventList += "<tr><td width='100%' style='text-align:center' class='CalTX2'><br><br><br>";
      eventList += "<b>There are currently No Events scheduled for this month.</b></td></tr>";
  }
  eventList += "</table>";  
    
  document.getElementById('listOfEvents').innerHTML = eventList;  
}
 
gloAddNewEvent = false;
gloCategoryId = 0;

function SetAddNewEvent(addNewEvent, categoryId) {
  if (addNewEvent == 'true') {
    gloAddNewEvent = true;
    gloCategoryId = categoryId;
  } else {
     gloAddNewEvent = false;
     gloCategoryId = 0;
  } 
 
  var addNewEventTable;
  if (gloAddNewEvent) {
    addNewEventTable = "<br><table border='0' cellspacing='0' cellpadding='0' style='text-align: left;vertical-align:middle;padding:0px 0px 0px 0px'>";
    addNewEventTable += "<tr class='Text1' style='text-align: left;vertical-align:middle;padding:0px 0px 0px 0px'>";            
    var addURL = "eolaWindow('ItemDispatcherEvent.do?method=add&parent_category_id="+categoryId+"&nextAction=ViewCategory-"+categoryId+".do')";
    addNewEventTable += "<td style='padding-left: 15px'><img onclick="+addURL+" border='0' alt='Add New Event Button' src='images/eola/add.gif' width='48' height='18' style='cursor:pointer'></td>";
    addNewEventTable += "<td>&nbsp;- <i>New "+selectedChapter+" Event</i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>"     
    var editURL = "eolaWindow('CategoryDispatcher.do?method=edit&amp;categoryId="+categoryId+"&nextAction=ViewCategory-"+categoryId+".do')";
    addNewEventTable += "<td align='left'><img onclick="+editURL+" border='0' alt='Edit Category Button' src='images/eola/edit.gif' width='39' height='18' style='cursor:pointer'></td>";
    addNewEventTable += "<td align='left'>&nbsp;- <i>Edit this Events Category</i></td>";   
    addNewEventTable += "</tr></table>";           
  } else {
    addNewEventTable = "";
  }   
  document.getElementById('addNewEventTable').innerHTML = addNewEventTable;
}

