function Calendar (container, now, start, months, special, doall) {
	this.container = container;
	
	this.now     = now;
	this.start   = start;
	this.months  = months;
	this.special = special;
	
	this.doall = doall || false;
	
	this.init();
}

Calendar.prototype.init = function () {
	this.draw();
}

Calendar.prototype.draw = function () {
	var parent = this;
	
	var monthnames = {
		1  : "Январь",
		2  : "Февраль",
		3  : "Март",
		4  : "Апрель",
		5  : "Май",
		6  : "Июнь",
		7  : "Июль",
		8  : "Август",
		9  : "Сентябрь",
		10 : "Октябрь",
		11 : "Ноябрь",
		12 : "Декабрь" 
	}
	
	var weeknums  = { Mon : 1, Tue : 2, Wed : 3, Thu : 4, Fri : 5, Sat : 6, Sun : 7 }
	
	this.container.html('<table class="calendar"></table>');
	var etable = $(".calendar", this.container);
	
	var addHeader = function (label, first) {
		first = first | false;
		
		if (first) {
			etable.append('<tr class="header"><td colspan="2" class="prev">← <span class="js-link">Предыдущие</span></td>' +
				'<td colspan="3" class="label">' + label +'</td>' + 
				'<td colspan="2" class="next"><span class="js-link">Следующие</span> →</td></tr>');
		} else {
			etable.append('<tr class="header"><td colspan="7" class="label">' + label +'</td></tr>');
		}
		
		etable.append(
			'<tr class="wdays">' + 
				'<td>Пн</td>' +
				'<td>Вт</td>' +
				'<td>Ср</td>' +
				'<td>Чт</td>' +
				'<td>Пт</td>' +
				'<td class="holiday">Сб</td>' +
				'<td class="holiday">Вс</td>' +
			'</tr>'
		);
	}
	
	var today = Date.today();
	
	for (var i = 0; i < this.months; i++) {
		var d    = this.start.clone().addMonths(i).moveToFirstDayOfMonth();
		var wnum = weeknums[d.toString("ddd")];
		
		addHeader(monthnames[d.toString('M')] + d.toString(', yyyy'), i == 0);
		
		var contents = '<tr class="row">';
		for (var y = 1; y < wnum; y++) {
			contents += '<td class="empty"></td>';
		}
		
		while (true) {
			var dnum = d.toString("dd");
			var wnum = weeknums[d.toString("ddd")];
			var skey = d.toString("yyyy-MM-dd");
			
			var addclass = "day-" + skey;
			
			if (this.doall && typeof(this.special[skey]) == "undefined") {
				this.special[skey] = "";
			}
			
			if (wnum == 6 || wnum == 7) {
				addclass += " holiday";
			}
			
			if (today.toString("yyyy-MM-dd") == skey) {
				addclass += " today";
			}
			
			if (typeof(this.special[skey]) != "undefined") {
				addclass += " " + this.special[skey];
			}
			
			contents += '<td class="day ' + addclass + '"><div>' + dnum + '</div></td>';
			
			d.addDays(1);
			
			if (d.toString("dd") == 1) {
				for (var y = wnum; y < 7; y++) {
					contents += '<td class="empty"></td>';
				}
				contents += '</tr>';
				break;
			} else if (weeknums[d.toString("ddd")] == 1) {
				contents += '</tr><tr class="row">';
			}
		}
		
		etable.append(contents);
	}
	
	$(".prev", etable).click(
		function () { parent.prev() }
	);
	
	$(".next", etable).click(
		function () { parent.next() }
	);
	
	for (var skey in this.special) {
		var t = function (date) {
			$(".day-" + skey, etable).click(function () {
				parent.onclick(date);
			});
		};
		
		t(skey);
	}
}

Calendar.prototype.prev = function () {
	this.start.addMonths(this.months * -1)
	this.draw();
}

Calendar.prototype.next = function () {
	this.start.addMonths(this.months)
	this.draw();
}

Calendar.prototype.onclick = function (date) {}
