var DAYNAMES = ['Su','Mo','Tu','We','Th','Fr','Sa'];
var MONTHNAMES = ['January','February','March','April','May','June','July','August','September','October','November','Dezember'];
var today = new Date();

function dbOCalendar(id_of_element_to_replace, reservations, months_per_row) {
	this.container = id_of_element_to_replace;
	reservations = reservations || {}
	this.reservations = {};
	for(var group in reservations) {
		this.reservations[group] = [];
		for(var i=0; i<reservations[group].length; i++) {
			var reservation = [];
			for(var j=0; j<reservations[group][i].length; j++) reservation.push(parseISODate(reservations[group][i][j]));
			this.reservations[group].push(reservation);
		}
	}
	this.months_per_row = months_per_row || 3
	this.draw();
}
dbOCalendar.prototype =
{
	draw: function(years_from_now){
		this.years_from_now = years_from_now || 0;
		var grid = document.createElement('table');
		grid.setAttribute('id', this.container);

		var a, sym, handler, self = this;
		var caption = grid.createCaption();
		var nav_elements = ['<','>'];
		while(sym = nav_elements.shift()) {
			a = document.createElement('a');
			a.appendChild(document.createTextNode(sym));
			var handler = (nav_elements.length==1) ? function(){self.prev12()} : function(){self.next12()};
			try {a.addEventListener('click', handler, false)}
			catch(e) {a.attachEvent('onclick', handler)}
			caption.appendChild(a);
		}
		
		var row, cell, table, tbody, tr, td, tn, date, last_status, class_attr;
		for(var month=0; month<12; month++) {
			if(month % this.months_per_row == 0) row = grid.insertRow(-1);
			cell = row.insertCell(-1);
			table = document.createElement('table');
			cell.appendChild(table);
			caption = table.createCaption();
			caption.appendChild(document.createTextNode(this.getCaption(this.years_from_now, month)));
			tbody = document.createElement('tbody');
			table.appendChild(tbody);
			tbody.appendChild(this.getHeaderRow());
			for(var week=0; week<4 || this.getCell(this.years_from_now, month, week, 0); week++) {
				tr = table.insertRow(-1);
				for(var day=0; day<7; day++) {
					td = tr.insertCell(-1);
					if(date = this.getCell(this.years_from_now, month, week, day)) {
					  class_attr = null;
						td.appendChild(document.createTextNode(date.day));
						if(date.status) {
							if(class_attr = date.status.name) {
							  if(date.status.name != last_status) {
							    if(last_status) class_attr = last_status+'-'+class_attr
							    else class_attr += ' first';
							  }
								if(date.status.expires) {
									td.setAttribute('title', 'expires: '+date.status.expires);
								}
							}
  						last_status = date.status.name;
						} else {
							if(last_status){
							  class_attr = last_status += ' last';
							}
						  last_status = null;
						}
						if(class_attr){
							td.setAttribute('class', class_attr);
							td.setAttribute('className', class_attr);
						}
					}
				}
			}
		}
		
		var container = document.getElementById(this.container);
		container.parentNode.replaceChild(grid, container);
	},
	
	next12: function() {
		this.draw(this.years_from_now + 1);
	},
	
	prev12: function() {
		this.draw(this.years_from_now - 1);
	},

	getCell: function(year, month, week, weekday) {
		var current_month = today.getMonth()+month;
		var current_year = today.getFullYear()+year;
		if(current_month > 11) {
			current_month -= 12;
			current_year += 1;
		}
		var first_day_of_month = new Date(current_year, current_month, 1).getDay();
		var date = new Date(current_year, current_month, 7*week + weekday - first_day_of_month + 1);
		if(date.getMonth() == current_month) {
			return {day: date.getDate(), status: this.getStatus(date)};
		}
	},

	getStatus: function(date) {
		for(var status in this.reservations) {
			var reservations = this.reservations[status];
			for(var i=0; i<reservations.length; i++) {
				if(date >= reservations[i][0] && date < reservations[i][1]) {
					return {name:status, expires:reservations[i].length==3 ? reservations[i][2].toLocaleDateString() : ''}
				}
			}
		}
	},

	getCaption: function(year, month) {
		var date = new Date(today.getFullYear()+year, today.getMonth()+month, 1);
		return MONTHNAMES[date.getMonth()] + ' ' + date.getFullYear();
	},

	getHeaderRow: function() {
		if(!this.headerRow) {
			this.headerRow = document.createElement('tr');
			var th;
			for(var i=0; i<7; i++) {
				th = document.createElement('th');
				th.appendChild(document.createTextNode(DAYNAMES[i]));
				this.headerRow.appendChild(th);
			}
		}
		return this.headerRow.cloneNode(true);
	}
}

function parseISODate(date_string) {
  var parts = date_string.split('-');
  return new Date(parts[0], parts[1]-1, parts[2])
  // var parts = date_string.match(/(\d{4})-(\d{1,2})-(\d{1,2})( (\d{1,2}):(\d{1,2}):(\d{1,2}))?/);
  // return parts.length == 3 ? new Date(parts[0], parts[1]-1, parts[2]) : new Date(parts[0], parts[1]-1, parts[2], parts[3], parts[4], parts[5])
}
