Lightbox.Calendar = function(calendarVariableName,userid/*=0*/) {

	var calendarVariableName;
	var selectedMonth;
	var selectedYear;
	var container;
	var months;
	var events;
	var userid;

	this.build = function() {
		if(!userid) userid = 0;
		
		this.variableName = calendarVariableName;
		this.userid = userid;
		
		this.selectedMonth = new Date().getMonth() + 1;
		this.selectedYear = new Date().getFullYear();
		this.container = document.getElementById("calendar");
		this.events = new Array();
		this.buildMonthArray();
		this.buildShortDaysArray();
		this.buildTable();
	}
	
	this.buildTable = function() {
		var table = document.createElement('table');
		var tbody = document.createElement('tbody');
		
		var trBrowse = this.buildBrowseTableRow();
		var trHeader = this.buildHeaderTableRow();
		
		table.appendChild(tbody);
		tbody.appendChild(trBrowse);
		tbody.appendChild(trHeader);
		this.buildDayTableRows(tbody);
		
		this.container.innerHTML = '';
		this.container.appendChild(table);
	}
	
	this.buildBrowseTableRow = function() {
		var tr = document.createElement('tr');
	
		var tdBrowsePrevious = document.createElement('td');
		tdBrowsePrevious.className = 'calendar_previous';
		tdBrowsePrevious.innerHTML = '<a href="#" onclick="'+this.variableName+'.previous(); return false">&nbsp;</a>';
		tr.appendChild(tdBrowsePrevious);
		
		var tdBrowseLabel = document.createElement('td');
		tdBrowseLabel.className = 'calendar_label';
		tdBrowseLabel.colSpan = 5;
		tdBrowseLabel.title = 'Click to display this month calendar';
		var staticCallToday = this.variableName + '.today()' ;
		tdBrowseLabel.onclick = function() { eval(staticCallToday); }
		tdBrowseLabel.innerHTML = this.getDateLabel();
		tr.appendChild(tdBrowseLabel);
		
		var tdBrowseNext = document.createElement('td');
		tdBrowseNext.className = 'calendar_next';
		tdBrowseNext.innerHTML = '<a href="#" onclick="'+this.variableName+'.next(); return false">&nbsp;</a>';
		tr.appendChild(tdBrowseNext);
		
		return tr;
	}
	
	this.buildHeaderTableRow = function() {
		var tr = document.createElement('tr');
		tr.className = 'calendar_header';
		
		for(var i=0; i<7; ++i) {
			var td = document.createElement('th');
			td.innerHTML = this.shortDays[i];
			tr.appendChild(td);
		}
		
		return tr;
	}
	
	this.buildDayTableRows = function(tbody) {
	
		var DAY = 86400000; /* in ms */
	
		var firstDayOfMonth = new Date();
		firstDayOfMonth.setDate(1);
		firstDayOfMonth.setMonth(this.selectedMonth-1);
		firstDayOfMonth.setYear(this.selectedYear);
		firstDayOfMonth.setHours(0);
		firstDayOfMonth.setMinutes(0);
		firstDayOfMonth.setSeconds(0);
		firstDayOfMonth.setMilliseconds(0);
		
		var dayOfWeek = firstDayOfMonth.getDay();
		var daysBeforeMonthToDisplay = dayOfWeek;
		if(daysBeforeMonthToDisplay<=0) daysBeforeMonthToDisplay = 7;
		
		var firstDayOfCalendar = new Date();
		var time = firstDayOfMonth.getTime() - (DAY * daysBeforeMonthToDisplay);
		
		firstDayOfCalendar.setTime(time);
		
		var date = new Date();
		date.setTime(firstDayOfCalendar.getTime());
	
		for(var i=0; i<6; ++i) {
			var tr = document.createElement('tr');
			tr.className = 'calendar_week';
			for(var j=0; j<7; ++j) {
				var td = document.createElement('td');
				td.id = 'calendar_cell_' + this.selectedYear + addZero(this.selectedMonth) + addZero(date.getDate());
				
				var onclick = 'return false';
				
				if((date.getMonth()+1) != this.selectedMonth) {
					td.className = 'fade';
					td.id = '';
				}
				
				td.innerHTML = '<a href="#" onclick="'+onclick+'">' + date.getDate() + '</a>';
				tr.appendChild(td);
				date.setTime(date.getTime()+DAY);
			}
			tbody.appendChild(tr);
		}
		
		this.fetchCalendarEvents();
	}
	
	this.fetchCalendarEvents = function() {
	
		if(!this.events[this.selectedYear] || !this.events[this.selectedYear][this.selectedMonth]) {
			var ajax = new AjaxManager();
			ajax.setVar('page','calendar_getevents');
			ajax.setVar('month',addZero(this.selectedMonth));
			ajax.setVar('year',this.selectedYear);
			ajax.setVar('userid',this.userid);
			var self = this;
			ajax.onCompletion = function() {
				var data = ajax.response.split('\n');
				
				if(!self.events[self.selectedYear]) {
					self.events[self.selectedYear] = new Array();
				}
				self.events[self.selectedYear][self.selectedMonth] = new Array();
				
				for(var i in data) {
					var pos = data[i].indexOf('=');
					var day = data[i].substring(0,pos);
					var text = data[i].substring(pos+1);
					self.events[self.selectedYear][self.selectedMonth][day] = text;
				}
				
				self.addCalendarEvents();
			}
			ajax.run();
		} else {
			setTimeout(this.variableName+'.addCalendarEvents()',100);
		}
	}
		
	this.addCalendarEvents = function() {
	
		if(this.events[this.selectedYear] && this.events[this.selectedYear][this.selectedMonth]) {
			var data = this.events[this.selectedYear][this.selectedMonth];
			for(var i in data) {
				var td = $('#calendar_cell_' + this.selectedYear + addZero(this.selectedMonth) + addZero(i));
				if(td) {
					td.className = 'highlight';
					var pos = data[i].indexOf('#');
					var id = data[i].substring(0,pos);
					var text = data[i].substring(pos+1);
					eval('var '+td.id+'_id = '+ id);
					eval('var '+td.id+'_text = "'+ escape(text) +'"');
					td.title = 'Click to see the events for this date';
					var self = this;
					td.onclick = function() {
						location.href = 'events-'+this.id.replace(/[^0-9]+/g,'')+'.html';
					}
				}
			}
		}
		
	}
	
	this.previous = function() {
		this.selectedMonth--;
		if(this.selectedMonth<1) {
				this.selectedMonth = 12;
				this.selectedYear--;
		}
		this.buildTable();
	}
	
	this.next = function() {
		this.selectedMonth++;
		if(this.selectedMonth>12) {
				this.selectedMonth = 1;
				this.selectedYear++;
		}
		this.buildTable();

	}
	
	this.today = function() {
		this.selectedMonth = new Date().getMonth() + 1;
		this.selectedYear = new Date().getFullYear();
		this.buildTable();
	}
	
	this.buildMonthArray = function() {
		this.months = new Array();
		this.months[1] = 'January';
		this.months[2] = 'February';
		this.months[3] = 'March';
		this.months[4] = 'April';
		this.months[5] = 'May';
		this.months[6] = 'June';
		this.months[7] = 'July';
		this.months[8] = 'August';
		this.months[9] = 'September';
		this.months[10] = 'October';
		this.months[11] = 'November';
		this.months[12] = 'December';
	}
	
	this.buildShortDaysArray = function() {
		this.shortDays = new Array();
		this.shortDays[0] = 'Su';
		this.shortDays[1] = 'Mo';
		this.shortDays[2] = 'Tu';
		this.shortDays[3] = 'We';
		this.shortDays[4] = 'Th';
		this.shortDays[5] = 'Fr';
		this.shortDays[6] = 'Sa';
	}
	
	this.getDateLabel = function() {
		return this.months[this.selectedMonth] + ' ' + this.selectedYear;
	}
	
	this.build();

}