//******************************************************************************************************
// To change event defaults and standard overrides, modify this section.
//
// Format for default events: defaultEvent([date code], [time], [abbrev], [details], 
//                                         [popup window parameter name])
// Format for override events: overrideEvent([year], [month], [offset])
// Format for offset events: offsetEvent([offset], [time], [abbrev], [details], 
//                                       [popup window parameter name], [postpone for closure])
//
// NOTES:
//  * Date codes are found in calendar.js.
//  * Abbreviations should be limited to one word or two short words.
//  * "Details" is the name of the popup HTML file.
//  * Months are relative to 0 (i.e. January = 0, December = 11).
//******************************************************************************************************
	  var preTest = "Pretest";
	  var childPreTest = "Junior Pretest";
	  var beltCeremony = "Belt Ceremony";
	  	  
	  // Default test scheduling
	  var defaultTest = new defaultEvent(lastFriOfMonth, "6:00pm", "Test", "test.htm", "smEventParams");
	  
	  // Standard test overrides
	  var stdOverrides = new Array();
	  var stdOverrideCount = 2;
	  
	  // Standard test overrides should set year to 0
	  stdOverrides[0] = new overrideEvent(0, 10, -7);
	  stdOverrides[1] = new overrideEvent(0, 11, -14);

	  // Test-related events and offsets
	  var offsets = new Array();
	  var offsetCount = 6;
	  	  
	  offsets[0] = new offsetEvent(-10, "", preTest, "pretest.htm", "smEventParams", 0);
	  offsets[1] = new offsetEvent(-8, "", childPreTest, "childpre.htm", "smEventParams", 0);
	  offsets[2] = new offsetEvent(2, "7:00pm", "Evaluation", "evaluate.htm", "smEventParams", 0);
	  offsets[3] = new offsetEvent(3, "7:00pm", "Evaluation", "evaluate.htm", "smEventParams", 0);
	  offsets[4] = new offsetEvent(4, "", "Test Results", "results.htm", "smEventParams", oneDay);
	  offsets[5] = new offsetEvent(6, "6:20pm", beltCeremony, "belt.htm", "smEventParams", oneWeek);

	  // Default black belt test scheduling
	  var bbTestMonths = new Array(1, 5, 9);
	  var bbTestCount = 3;
	  var bbTest = new defaultEvent(lastSatOfMonth, "3:00pm", "Black Belt Test", "blkbelt.htm", "smEventParams");
//******************************************************************************************************
//******************************************************************************************************

//******************************************************************************************************
// This section is used by the event maintenance program. DO NOT MODIFY.
//******************************************************************************************************
// Special events
      var events = new Array();
	  
	  // *event counter*
	  var eventCount = 6;

	  // *begin events*
	  events[0] = new event(0, 7, 25, "", "Master Han's Birthday", "", ""); 
	  events[1] = new event(2001, 7, 11, "12:00pm", "Open House Demo", "demo.htm", "lgEventParams");
	  events[2] = new event(2001, 8, 8, "10:00am", "Picnic", "picnic.htm", "lgEventParams");
	  events[3] = new event(2001, 11, 21, "<br>Last chance for", "Holiday Special<br>(up to 20% off<br>2001 membership<br>rates)<br>", "", "");
	  events[4] = new event(2001, 11, 22, "7:00pm", "Christmas Party", "xmas.htm", "lgEventParams");
	  events[5] = new event(2003, 7, 17, "10:00am", "Picnic", "picnic.htm", "lgEventParams");
	  // *end events*

// Special pretest overrides
      var pretestOverrides = new Array();
	  
	  // *pretest override counter*
	  var pretestOverrideCount = 1;

	  // *begin pretest overrides*
	  pretestOverrides[0] = new overrideEvent(2001, 5, 5);
	  // *end pretest overrides*

// Special belt ceremony overrides
// NOTE: Use the related test month, not the month in which the belt ceremony falls, which may be different.
      var beltOverrides = new Array();
	  
	  // *belt ceremony override counter*
	  var beltOverrideCount = 1;

	  // *begin belt ceremony overrides*
	  beltOverrides[0] = new overrideEvent(2001, 5, 3);
	  // *end belt ceremony overrides*

// Special test overrides
      var testOverrides = new Array();
	  
	  // *test override counter*
	  var testOverrideCount = 4;

	  // *begin test overrides*
	  testOverrides[0] = new overrideEvent(2001, 8, -7);
	  testOverrides[1] = new overrideEvent(2003, 5, -7);
	  testOverrides[2] = new overrideEvent(2003, 8, -7);
          testOverrides[3] = new overrideEvent(2004, 8, -7);
	  // *end test overrides*

// Special black belt test overrides
      var bbOverrides = new Array();
	  
	  // *bbtest override counter*
	  var bbOverrideCount = 1;

	  // *begin bbtest overrides*
	  bbOverrides[0] = new overrideEvent(2003, 5, -7);
	  // *end bbtest overrides*
//******************************************************************************************************
//******************************************************************************************************

      // Initialize this field, because Netscape blows away on initial cookie retrieval.
      var dispDate = new Date(convertYear(today.getYear()), today.getMonth(), 1, 0, 0, 0);      
	  
      // Determine the requested display month.
      var scookie = unescape(document.cookie);
	  var scookie1 = "";
	  var scookie2 = "";

      var arg = "eventsmonth=";
      var i = scookie.indexOf(arg);
	  var j = scookie.indexOf(";", i + 1);
	  if (j == 0) { j = scookie.length; }

      if (i == -1) {
		scookie1 = scookie;     
      }
      else {
        // Parse the cookie.
		var userDate = scookie.substring(i + arg.length, j);

		// Save other portions of the cookie.
		if (i > 1) { scookie1 = scookie.substring(0, i); }
		if (j != scookie.length) { scookie2 = scookie.substring(j + 1); }

        var yy;
        var mm;
        
        i = userDate.indexOf("/");
		if (i == -1) {
		  yy = convertYear(today.getYear());
		  mm = today.getMonth();
		}
		else {
          yy = userDate.substring(0, i);
		  mm = userDate.substring(i + 1);
		}
        dispDate = new Date(yy, mm, 1, 0, 0, 0);
      }
      
	  function defaultEvent(datecode, time, abbrev, details, winsize) {
	    this.datecode = datecode;
		this.time = time;
		this.abbrev = abbrev;
		this.details = details;
		this.winsize = winsize;
	  }

	  function offsetEvent(offset, time, abbrev, details, winsize, postpone) {
	    this.offset = offset;
		this.time = time;
		this.abbrev = abbrev;
		this.details = details;
		this.winsize = winsize;
		this.postpone = postpone;
	  }
	  
	  function overrideEvent(yy, mm, offset) {
	    this.yy = yy;
		this.mm = mm;
		this.offset = offset;
	  }
	     
      function event(yy, mm, dd, time, abbrev, details, winsize) {
        this.yy = yy;
        this.mm = mm;
        this.dd = dd;
		this.time = time;
		this.abbrev = abbrev;
		this.details = details;
		this.winsize = winsize;
      }
      
      function endOfMonth(yy, mm) {
        var ldate;
        if (mm == 11) {
          ldate = new Date(yy + 1, 0, 1, 0, 0, 0);
        }
        else {
          ldate = new Date(yy, mm + 1, 1, 0, 0 ,0);
        }
        ldate = new Date(ldate.getTime() - oneDay);
        return ldate.getDate();
      }
	  
	  function yearDropDown() {
        var thisYear = convertYear(today.getYear());
        var nextYear = convertYear(today.getYear()) + 1;
        document.write("<option value=\"" + thisYear + "\">" + thisYear + "</option>");
        document.writeln("<option value=\"" + nextYear + "\">" + nextYear + "</option>");
// mxd: temporary
        var mxd = convertYear(today.getYear()) + 2;
        var mxd2 = convertYear(today.getYear()) + 3;
        document.write("<option value=\"" + mxd + "\">" + mxd + "</option>");
        document.writeln("<option value=\"" + mxd2 + "\">" + mxd2 + "</option>");
	  }
      
      function setDropDowns(form) {
        form.mm.options[dispDate.getMonth()].selected = true;
        for (var i = 0; i < form.yy.length; i++) {
          if (form.yy.options[i].value == convertYear(dispDate.getYear())) {
            form.yy.options[i].selected = true;
            break;
          }
        }
      }      
	  
	  function printCalendar(ddate) {
		if (isIE) {
          window.open("eventprt.htm", "schedule", "scrollbars,width=730,height=560,top=0,left=20");
		}
		else if(isNav) {
		  // Netscape bug requires opening an intermediate page, then rerouting to teachprt.htm.
          window.open("eventnav.htm", "schedule", "scrollbars,width=730,height=560,top=0,left=20");
		}
	  }

      function writeCookie(form) {
        var selectedmm = selectedOption(form.mm);
        var selectedyy = selectedOption(form.yy);
        if (selectedmm != "" && selectedyy != "") {
          // Write date to cookie.
          document.cookie = escape(scookie1 + "eventsmonth=" + selectedyy + "/" + selectedmm + ";" + scookie2);
        }
        else {
          alert("Please select a date!");
        }
      }
      
      function writeCookie2(ddate) {
        // Write date to cookie.
        document.cookie = escape(scookie1 + "eventsmonth=" + 
		                         convertYear(ddate.getYear()) + "/" + ddate.getMonth() + ";" + scookie2);
      }
      
      function selectedOption(dropdown) {
        if (dropdown.selectedIndex == -1) {
          return "";
        }
        else {
          return dropdown.options[dropdown.selectedIndex].value;
        }
      }
 	  
	  function dateOverride(ddate, override) {
	    return (override.yy == 0 || convertYear(ddate.getYear()) == override.yy) &&
		        ddate.getMonth() == override.mm;
	  }

      function buildCalendar(ddate, prtversion) {
        // Don't use the <p> tag: substitute <br>&nbsp;<br> (Netscape bug)

        document.writeln("<div class=leftjustify>");
        printCalendarDate(prtversion);
		document.writeln("</div>");

        // Use the <div> tag to protect font and centering (Netscape bug)
		document.writeln("<div>");		
        document.writeln("<br>");
        
        // Begin table
        document.writeln("<table border=0 cellpadding=7 cellspacing=2 width=671 class=schedtable>");

        // Day-of-week row
        document.writeln("<tr>");
        document.writeln("<td class=schedmid>Sun</td>");
        document.writeln("<td class=schedmid>Mon</td>");
        document.writeln("<td class=schedmid>Tue</td>");
        document.writeln("<td class=schedmid>Wed</td>");
        document.writeln("<td class=schedmid>Thu</td>");
        document.writeln("<td class=schedmid>Fri</td>");
        document.writeln("<td class=schedmid>Sat</td>");
        document.writeln("</tr>");

	    // Determine test date and related events for this month
        var testDate = calculateDate(convertYear(ddate.getYear()), ddate.getMonth(), defaultTest.datecode);
		
		// Special test overrides take precedence over standard test overrides
		var matched = false;
		for (var i = 0; i < testOverrideCount; i++) {
		  if (dateOverride(testDate, testOverrides[i])) {
		    testDate = new Date(testDate.getTime() + (testOverrides[i].offset * oneDay));
			matched = true;
			break;
		  }
		}
		if (!matched) {
		  for (var i = 0; i < stdOverrideCount; i++) {
		    if (dateOverride(testDate, stdOverrides[i])) {
		      testDate = new Date(testDate.getTime() + (stdOverrides[i].offset * oneDay));
			  break;
		    }
		  }
		}

		// Calculate array of test-related event dates
		var relatedDates = new Array();
		for (var i = 0; i < offsetCount; i++) {
		  relatedDates[i] = new Date(testDate.getTime() + (offsets[i].offset * oneDay));
		  // If event is postponed due to closure, increment to following week
		  if (offsets[i].postpone > 0) {
		    while (closed(relatedDates[i])) {
			  relatedDates[i] = new Date(relatedDates[i].getTime() + offsets[i].postpone);
			}
		  }
		  // If pretest, check for override
		  if (offsets[i].abbrev == preTest) {
		    for (var j = 0; j < pretestOverrideCount; j++) {
		      if (dateOverride(testDate, pretestOverrides[j])) {
		        relatedDates[i] = new Date(relatedDates[i].getTime() + (pretestOverrides[j].offset * oneDay));
			    break;
		      }
		    }
		  }
		  // If belt ceremony, check for override
		  if (offsets[i].abbrev == beltCeremony) {
		    for (var j = 0; j < beltOverrideCount; j++) {
		      if (dateOverride(testDate, beltOverrides[j])) {
		        relatedDates[i] = new Date(relatedDates[i].getTime() + (beltOverrides[j].offset * oneDay));
			    break;
		      }
		    }
		  }
		}
		
	    // Determine test date and related events for previous month, as they may carry over into this month
		var pTestDate;
		if (ddate.getMonth() == 0) {
          pTestDate = calculateDate(convertYear(ddate.getYear() - 1), 11, defaultTest.datecode);
		}
		else {
          pTestDate = calculateDate(convertYear(ddate.getYear()), ddate.getMonth() - 1, defaultTest.datecode);
		}
		
		// Special test overrides take precedence over standard test overrides
		matched = false;
		for (var i = 0; i < testOverrideCount; i++) {
		  if (dateOverride(pTestDate, testOverrides[i])) {
		    pTestDate = new Date(pTestDate.getTime() + (testOverrides[i].offset * oneDay));
			matched = true;
			break;
		  }
		}
		if (!matched) {
		  for (var i = 0; i < stdOverrideCount; i++) {
		    if (dateOverride(pTestDate, stdOverrides[i])) {
		      pTestDate = new Date(pTestDate.getTime() + (stdOverrides[i].offset * oneDay));
			  break;
		    }
		  }
		}

		// Calculate array of test-related event dates for previous month
		var pRelatedDates = new Array();
		for (var i = 0; i < offsetCount; i++) {
		  pRelatedDates[i] = new Date(pTestDate.getTime() + (offsets[i].offset * oneDay));
		  // If event is postponed due to closure, increment to following week
		  if (offsets[i].postpone > 0) {
		    while (closed(pRelatedDates[i])) {
			  pRelatedDates[i] = new Date(pRelatedDates[i].getTime() + offsets[i].postpone);
			}
		  }
		  // If pretest, check for override
		  if (offsets[i].abbrev == preTest) {
		    for (var j = 0; j < pretestOverrideCount; j++) {
		      if (dateOverride(pTestDate, pretestOverrides[j])) {
		        pRelatedDates[i] = new Date(pRelatedDates[i].getTime() + (pretestOverrides[j].offset * oneDay));
			    break;
		      }
		    }
		  }
		  // If belt ceremony, check for override
		  if (offsets[i].abbrev == beltCeremony) {
		    for (var j = 0; j < beltOverrideCount; j++) {
		      if (dateOverride(pTestDate, beltOverrides[j])) {
		        pRelatedDates[i] = new Date(pRelatedDates[i].getTime() + (beltOverrides[j].offset * oneDay));
			    break;
		      }
		    }
		  }
		}
				
	    // Determine if this is a black belt test month
		var bbTestDate = null;
		for (var i = 0; i < bbTestCount; i++) {
		  if (bbTestMonths[i] == ddate.getMonth()) {
		    bbTestDate = calculateDate(convertYear(ddate.getYear()), ddate.getMonth(), bbTest.datecode);
			break;
		  }
		}
	    if (bbTestDate) {
		  // Check for special black belt test overrides
		  for (var i = 0; i < bbOverrideCount; i++) {
		    if (dateOverride(bbTestDate, bbOverrides[i])) {
		      bbTestDate = new Date(bbTestDate.getTime() + (bbOverrides[i].offset * oneDay));
			  matched = true;
			  break;
		    }
		  }
		}

        // Calendar rows
		var row = 0;
		var startDayOfWeek = ddate.getDay();
		var endDay = endOfMonth(convertYear(ddate.getYear()), ddate.getMonth());
		var day = 1;		
	    while (day <= endDay) {
          document.writeln("<tr>");
          for (var i = 0; i < 7; i++) {
		    if ((row == 0 && i < startDayOfWeek) || day > endDay) {
		      document.writeln("<td class=schedblackout>&nbsp;</td>");
		    }
		    else {
              document.writeln("<td class=schedleft><span class=tinytype>" + day + "</span><br>");
			  document.writeln("<img src=\"images/spacer.gif\" height=\"1\" width=\"65\" border=\"0\"><br>");

			  if (closed(new Date(convertYear(ddate.getYear()), ddate.getMonth(), day, 0, 0, 0))) {
                document.writeln("<br>Studio<br>Closed");
			  }
			  else {
			    // Build an array of events for this day, and sort them
				var daysEvents = new Array();
				var eventSort = new Array();
				var daysEventsCount = 0;
				var eventIdx;
				
				// Check test scheduling.
		        if (testDate.getDate() == day) {
				  daysEvents[daysEventsCount] = new event(0, 0, 0, defaultTest.time, defaultTest.abbrev, 
				                                          defaultTest.details, defaultTest.winsize);
				  daysEventsCount++;
			    }
				
				// Check test-related events.
				for (var j = 0; j < offsetCount; j++) {
				  if (relatedDates[j].getMonth() == ddate.getMonth() && relatedDates[j].getDate() == day) {
				    daysEvents[daysEventsCount] = new event(0, 0, 0, offsets[j].time, offsets[j].abbrev, 
					                                        offsets[j].details, offsets[j].winsize);
				    daysEventsCount++;
				  }
				}

			    // Check special events.
				for (var j = 0; j < eventCount; j++) {
			      if (events[j].mm == ddate.getMonth() && events[j].dd == day && 
				      (events[j].yy == convertYear(ddate.getYear()) || events[j].yy == 0)) {
				    daysEvents[daysEventsCount] = new event(0, 0, 0, events[j].time, events[j].abbrev, 
					                                        events[j].details, events[j].winsize);
				    daysEventsCount++;
				  }
			    }

				// Check previous month's test-related events.
				for (var j = 0; j < offsetCount; j++) {
				  if (pRelatedDates[j].getMonth() == ddate.getMonth() && pRelatedDates[j].getDate() == day) {
				    daysEvents[daysEventsCount] = new event(0, 0, 0, offsets[j].time, offsets[j].abbrev, 
					                                        offsets[j].details, offsets[j].winsize);
				    daysEventsCount++;
				  }
				}
				
				// Check black belt testing.
				if (bbTestDate) {
				  if (bbTestDate.getDate() == day) {
				    daysEvents[daysEventsCount] = new event(0, 0, 0, bbTest.time, bbTest.abbrev, 
					                                        bbTest.details, bbTest.winsize);
				    daysEventsCount++;
 				  }
				}
				
				if (daysEventsCount == 0) {
				  document.writeln("&nbsp;<br>&nbsp;<br>&nbsp;<br>");
				}
				else {
				  // Sort the day's events
				  for (var j = 0; j < daysEventsCount; j++) {
				    eventSort[j] = j;
				  }
				  // Insertion sort
				  for (var j = 1; j < daysEventsCount; j++) {
       				eventIdx = eventSort[j];
       				for (var k = j; k > 0; k--) {
			          if (convertTime(daysEvents[eventSort[k - 1]].time) > convertTime(daysEvents[eventIdx].time)) {
                        eventSort[k] = eventSort[k - 1];
			          }
					  else {
					    break;
					  }
					}        
			        eventSort[k] = eventIdx;
				  }
				  
				  // Loop through sorted array
				  for (var j = 0; j < daysEventsCount; j++) {
				    if (daysEvents[eventSort[j]].details == "") {
				      document.writeln("<br>" + daysEvents[eventSort[j]].time + 
				                       "<br><nobr>" + daysEvents[eventSort[j]].abbrev + "</nobr>");
					}
					else {
				      document.writeln("<br>" + daysEvents[eventSort[j]].time + 
				                       "<br><a href=\"javascript:;\" onClick=\"openWindow('events/" + 
								       daysEvents[eventSort[j]].details + "', " + daysEvents[eventSort[j]].winsize + 
									   ")\"><nobr>" + daysEvents[eventSort[j]].abbrev + "</nobr></a>");
				    }
				  }
				}
			  }
			  document.writeln("</td>");
		      day++;
		    }
		  }
          document.writeln("</tr>");
		  row++;
		}    

        // End table
        document.writeln("</table>");
        document.writeln("</div>");
      }
	  
	  function buildDaysEvents() {
//mxd
	  }
	  
	  function sortDaysEvents() {
//mxd
	  }

	  function printCalendarDate(prtversion) {
		document.write("<br>Events for the month of &nbsp;");
		document.write("<span id=\"bold\">" + months[dispDate.getMonth()] + ", &nbsp;" + 
		               convertYear(dispDate.getYear()) + "</span>");
		
		if (!prtversion && ((isIE && ver > 4) || isNav)) {
          document.writeln(" &nbsp; &nbsp; [ " + 
		                   "<a href=\"javascript:;\" class=link onclick=\"printCalendar(dispDate)\">" + 
                           "print events</a> ]");
        }
		else {
		  document.writeln("");
        }
	  }