Lightbox.Calendar = function(calendarVariableName,section) {

	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 = $('cal');
		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">&lt;&lt;</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"> &gt;&gt;</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());
		var today = new Date();
		//alert(today.getDate());
		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(date.getMonth()+1) + addZero(date.getDate());
				var theaId = 'calendar_link_' + this.selectedYear + addZero(date.getMonth()+1) + addZero(date.getDate());
				//alert('calendar_cell_' + this.selectedYear + addZero(date.getMonth()+1) + addZero(date.getDate()));
				var onclick = 'return false';
				
				if((date.getMonth()+1) != this.selectedMonth) {
					td.className = 'fade';
					td.id = '';
				}
				
				
				
				if(section=="nightlife" && date >= today){
					td.className = 'highlight';
					td.innerHTML = '<a href="one-off-shows-listing.html?one_off_show_date='+this.selectedYear+'-'+ addZero(date.getMonth()+1) +'-'+ addZero(date.getDate())+'" id="'+theaId+'">' + date.getDate() + '</a>';
				}
				else{
					td.innerHTML = '<a href="#" id="'+theaId+'">' + date.getDate() + '</a>';
				}
				tr.appendChild(td);
				var dol = date.getDate();
				date.setTime(date.getTime()+DAY);
				if(dol==26 && date.getDate()==26){
					date.setTime(date.getTime()+DAY);
				}
				if(dol==5 && date.getDate()==5){
					date.setTime(date.getTime()+DAY);
				}
				//alert(date.getDate());
			}
			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.jsp');
			ajax.setVar('month',addZero(this.selectedMonth));
			ajax.setVar('year',this.selectedYear);
			ajax.setVar('section',section);
			//ajax.setVar('userid',this.userid);
			var self = this;
			ajax.onCompletion = function() {
				
				var tdata = ajax.response.split('\n');
				//alert(tdata);
				//alert(data[2].indexOf('='));
				if(!self.events[self.selectedYear]) {
					self.events[self.selectedYear] = new Array();
				}
				self.events[self.selectedYear][self.selectedMonth] = new Array();
				//alert(tdata);
				for(i=0;i<tdata.length;i++){			
					var pos = tdata[i].indexOf('=');
					var day = tdata[i].substring(0,pos);
					var text = tdata[i].substring(pos+1);
					//alert(day);
					self.events[self.selectedYear][self.selectedMonth][day] = text;						
				}
				//alert(self.events[self.selectedYear][self.selectedMonth][3]);
				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];
			//alert(data.length);
			for(var i in data) {
				var td = $('calendar_cell_' + this.selectedYear + addZero(this.selectedMonth) + addZero(i));
				var thea =  $('calendar_link_' + this.selectedYear + addZero(this.selectedMonth) + addZero(i));
				//alert(i);
				var thed = (this.selectedYear+"-"+ addZero(this.selectedMonth) +"-"+ addZero(i));
				//alert(thed);
				if(td) {
					//alert(td.id);
					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 = this.selectedYear+"-"+ addZero(this.selectedMonth) +"-"+ addZero(i);
					td.title = "Choose a date to see what's on";
					//td.onclick=function(){/*location.href = 'listings.html?day='+thed;*/alert('ici');};
					if(section=="home"){
						thea.href = 'listings.html?day='+thed;
					}
					else if(section=="film"){
						thea.href = 'cinema-listing.html?date='+thed;	
					}
					else if(section=="comedy"){
						thea.href = 'comedy-listing.html?day='+thed;	
					}
					else if(section=="gig"){
						thea.href = 'gigs-listing.html?gig_date='+thed;	
					}
					else if(section=="nightlife"){
						thea.href = 'one-off-shows-listing.html?one_off_show_date='+thed;	
					}
					else if(section=="theatre"){
						thea.href = 'theatre-listing.html?day='+thed;	
					}
					else if(section=="exhibition"){
						thea.href = 'exhibitions-listing.html?day='+thed;	
					}
					else if(section=="festival"){
						thea.href = 'festival-listing.html?day='+thed;	
					}
					else if(section=="culture"){
						thea.href = 'listing.html?day='+thed;	
					}
					//alert(thea.href);
					var self = this;
					td.onclick = function() {
						//alert('ici');
						//location.href = 'listings.html?day='+thed;
					}
				}else{
					
				}
			}
		}
		
	}
	
	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();

}
