
function unloadCalendar () {
	$.jMonthCalendar.ReplaceEventCollection([]);
}

function loadCalendar (dateIn, doBlobs) {

	$("#CalendarHolder").data('currDate',dateIn);
	ajaxConnector = $('#CalendarHolder').data('calendarData');

	dayOne = dateIn.clone(); dayOne.setDate(1);
	dayOne.add({ days: (0-dayOne.getDay()) });

	$.getJSON(ajaxConnector,{set:'all', act:'data'},function(data){ 

		$("#CalendarHolder").data('schedules',data['schedules']); 
		$("#CalendarHolder").data('locations',data['locations']);
		$("#CalendarHolder").data('teachers',data['teachers']);
		$("#CalendarHolder").data('classes',data['classes']);

		skipDays = data['skippedDays']; $("#debugPane").html(JSON.stringify(skipDays));
		runDays = data['runDays'];

		if (doBlobs) {

			$('#classBlobs').empty();
			for (var t in data['classes']) {
				$('<span class="classBlob Class_'+data['classes'][t].id+'">'+data['classes'][t].shortName+'</span>')
				.data('class_id',data['classes'][t].id)
				.css('backgroundColor','#'+data['classes'][t].color)
				.hide()
				.appendTo('#classBlobs');
			}
		}

		events = [];
		for (var eachSchedule in data['schedules']) {
			
			try {

				theSchedule = data['schedules'][eachSchedule];
				theLocation = data['locations'][theSchedule.location_id];
				theTeacher = data['teachers'][theSchedule.teacher_id];
				theClass = data['classes'][theSchedule.class_id];

				classDate = dayOne.clone();
				classDate.add({ days: parseInt(theSchedule.day_ndx) });

				maxVisibleWeeks = 6;
				for (x=0 ; x<maxVisibleWeeks ; x++) {

					oneEvent = {};

					oneEvent['CssClass'] = "Class_" + theClass.id;
					oneEvent['Date'] = Date.parse( classDate.toString("M/d/yyyy") +" "+ theSchedule.classBegins );
					oneEvent['Description'] = classDate.toString("dddd");
					oneEvent['EventID'] = theSchedule.id;
					oneEvent['Title'] = theSchedule.classBegins+", "+theLocation.city;
					oneEvent['Adjustment'] = ""; //" [Use] ";
					oneEvent['URL'] = "#";	
					
					classStart = Date.parse(theSchedule.classStart);
					if ((classStart != null) && (classStart.toString('d') != "0/0/00")) {
						if (Date.compare(classDate,classStart) <0) { 
							classDate.add({ days: 7 });
							continue; 
						}
					}
					
					classEnd = Date.parse(theSchedule.classEnd);
					if ((classEnd != null) && (classEnd.toString('d') != "0/0/00")) {
						if (Date.compare(classDate,classEnd) >0) { 
							classDate.add({ days: 7 });
							continue; 
						}
					}

					try {
						if (skipDays[theSchedule.id][classDate.toString("yyyy-MM-dd")]) {
							oneEvent['CssClass'] = "Skipped"; 
							oneEvent['Title'] = "No Class";
						}
					}
					catch (ignored) {}

					try {
						if (theSchedule.runLength == 0) {
							throw new Error("no runs without a runLength");
						}

						runningDate = Date.parse(runDays[theSchedule.id]['runDate']);
						classDate.clearTime(); runningDate.clearTime();

						if (Date.compare(runningDate,classDate) > 0) {
							throw new Error("no runs before a known date");
						}

						runNum = parseInt(runDays[theSchedule.id]['adjustment']);
						while (Date.compare(runningDate,classDate) < 0) {

							oneEvent['Adjustment'] = ""; //" [Use] ";
							runningDate.add({ days: 7 }); 
							runNum += 1;

							try {
								if (skipDays[theSchedule.id][runningDate.toString("yyyy-MM-dd")]) {
									adjustment = parseInt(skipDays[theSchedule.id][runningDate.toString("yyyy-MM-dd")]);
									runNum += adjustment; 
									switch (adjustment) {
										case 0:
										oneEvent['Adjustment'] = " [Skip] ";
										break;
										case -1:
										oneEvent['Adjustment'] = " [Push] ";
										break;
									}
								}
							}
							catch (ignored) {} //{ $("#exception").html(JSON.stringify(ignored)); }

							if (runNum > theSchedule.runLength) { runNum = 1; }
						}

						oneEvent['runPos'] = "("+ runNum +" of "+ theSchedule.runLength +")";

						if ($("#showRuns").attr('checked') == 1) {
							oneEvent['Title'] = oneEvent['runPos'] + oneEvent['Adjustment'];
						}
					}
					catch (ignored) {} //{ $("#exception").html(JSON.stringify(ignored)); }
					
					if (oneEvent) { 
						$(".Class_"+theClass.id).show(); // only show classes that are on the calendar
						events.push(oneEvent); 
					}
					
					classDate.add({ days: 7 });
				}
			}

			catch (ignored) { $("#exception").html(JSON.stringify(ignored)); }
		}

		// $("#debugPane").html(JSON.stringify(events));
		$.jMonthCalendar.ReplaceEventCollection(events);

		$("#jMonthCalendar").height($(".MonthlyCalendar").height());
		$("#jMonthCalendar").width($(".MonthlyCalendar").width());

		for (var t in data['classes']) {
			$('.Class_'+data['classes'][t].id).css('backgroundColor','#'+data['classes'][t].color);
		}
	});

}

