var Calendar = Class.create(EventClass, {
	'initialize': function(monthStartDate) {
		this.container = jQuery('.Calendar');
		this.monthStartDate = new Date(monthStartDate.getFullYear(), monthStartDate.getMonth(), 1);
	
		this.container.find('.MonthPrev').click(this.callback(function(e) {
			this.prevMonth();
		}));
		
		this.container.find('.MonthNext').click(this.callback(function(e) {
			this.nextMonth();
		}));
		
		this.container.find('.SaveButton').click(this.callback(function(e) {
			//alert(JSON.stringify(this.addedDates));
			this.trigger('save');
		}));
		
		this.dates = [];
		this.addedDates = [];
		this.removedDates = [];
		 
		this.render(true);
	},
	'setDates': function(dates) {
		this.dates = dates;
		this.addedDates = [];
		this.removedDates = [];
		
		this.render(true);
	},
	'setAllowedDays': function(days) {
		//alert(JSON.stringify(days));
		this.allowedDays = days;
	},
	'setEarliestDate': function(date) {
		this.earliestDate = date;
		// Update the starting month to the earliest day's month
		this.monthStartDate = new Date(this.earliestDate.getFullYear(), this.earliestDate.getMonth(), 1);
		//alert(date);
	},
	'getDates': function() {
		return this.dates;
	},
	'prevMonth': function() {
		this.monthStartDate.addMonths(-1);
		this.render(false);
	},
	'nextMonth': function() {
		this.monthStartDate.addMonths(1);
		this.render(false);
	},
	'render': function(autoMonth) {
		var headerH3 = this.container.find('.CalendarHeader h3');
		var weeksUl = this.container.find('ul.CalendarWeeks');
		var prototypeWeekLi = this.container.find('li.CalendarWeek.Prototype');				
		
		headerH3.text(Date.monthNames[this.monthStartDate.getMonth()] + ' ' + this.monthStartDate.getFullYear());
		
		var now = new Date();
		var calendarStartDate = new Date(this.monthStartDate);			
		calendarStartDate.setDate(this.monthStartDate.getDate() - this.monthStartDate.getDay());			
		var date = new Date(calendarStartDate);
		var firstAllowedDate = null;
		
		date.setHours(date.getHours() - date.getTimezoneOffset() / 60); // TIME ZONE HACK
		
		weeksUl.find('li.CalendarWeek').not('.CalendarWeekHeader').not('.Prototype').remove();
		
		for (var week = 0; week < 6; week++) {
			var weekLi = prototypeWeekLi.clone().removeClass('Prototype');
			
			if (week > 0 && date.getMonth() != this.monthStartDate.getMonth()) {
				//break;
			}
			
			for (var day = 0; day < 7; day++) {					
				var dayLi = weekLi.find('li.CalendarDay').eq(day);
				var dateSpan = dayLi.find('span.Date');
				
				dayLi.data('date', new Date(date));
				
				var isAllowed = true;
				
				if (isAllowed && this.allowedDays) {
					isAllowed = this.allowedDays.contains(date.getDay());
				}
				
				if (isAllowed && this.earliestDate) {
					isAllowed = this.earliestDate < date;
				}
				
				if (date.getMonth() != this.monthStartDate.getMonth() || date < now || !isAllowed) {
					if (date.getMonth() != this.monthStartDate.getMonth()) {
						dayLi.addClass('CalendarBlankDay');
					}
					else {
						dayLi.addClass('CalendarDayBlocked');
					}
					
					dateSpan.text('');
				}
				else {
					if (!firstAllowedDate) firstAllowedDate = date;
				
					if (!this.dates.hasDate(date)) {
						dayLi.addClass('CalendarDayAdd');
					}
					else {
						dayLi.addClass('CalendarDayTicked');
					}
					
					dateSpan.text(date.getDate().toString());						
				}
				
				date.setDate(date.getDate() + 1);
			}
			
			weeksUl.append(weekLi);
		}
		
		this.container.find('li.CalendarDay, li.CalendarDay span').disableSelection();
		
		this.container.find('li.CalendarDay').click(this.callback(function(e) {
			var dayLi = jQuery(e.sender);
			var date = dayLi.data('date'); //alert(date); alert(JSON.stringify(date));
			
			if (dayLi.hasClass('CalendarDayAdd')) {
				dayLi.addClass('CalendarDayTicked');
				dayLi.removeClass('CalendarDayAdd');
				
				this.dates.push(date);
				this.addedDates.push(date);
				this.removedDates.removeDate(date);
			}
			else if (dayLi.hasClass('CalendarDayTicked')) {
				dayLi.addClass('CalendarDayAdd');
				dayLi.removeClass('CalendarDayTicked');
				
				this.dates.removeDate(date);
				this.addedDates.removeDate(date);
				this.removedDates.push(date);
			}
			
			//alert(JSON.stringify(this.removedDates));
		}));
		
		// If no dates are available this month, then move to the next month (if autoMonth)
		if (autoMonth && !firstAllowedDate) this.nextMonth();
	},
	'toString': function() {
		return 'Calendar';
	}
});

Date.dayNames = [
	'Sunday',
	'Monday',
	'Tuesday',
	'Wednesday',
	'Thursday',
	'Friday',
	'Saturday'
];

Date.monthNames=new Array(12);
Date.monthNames[0]="January";
Date.monthNames[1]="February";
Date.monthNames[2]="March";
Date.monthNames[3]="April";
Date.monthNames[4]="May";
Date.monthNames[5]="June";
Date.monthNames[6]="July";
Date.monthNames[7]="August";
Date.monthNames[8]="September";
Date.monthNames[9]="October";
Date.monthNames[10]="November";
Date.monthNames[11]="December";

Date.prototype.addMonths = function(n) {
	this.setMonth(this.getMonth() + n);
	return this;
};

Date.prototype.getDayName = function() {
	return Date.dayNames[this.getDay()];
}
Date.prototype.toDateMonthString = function() {
	return this.getDate() + ' ' + Date.monthNames[this.getMonth()];	
};




