/**
 * @author pfigueiredo
 */
KCalendar.prototype = new KWidget;
KCalendar.prototype.constructor = KCalendar;
function KCalendar(parent, id) {
	KWidget.call(this);
	this.setParent(parent);
	this.panel = document.createElement('div');
	this.currentDate = new Date();
	this.setID(id);

	this.days = new Array();
	this.daysOfMonth = new Array();
}

KCalendar.prototype.draw = function() {
	this.initMatrix();
	this.showMonth(this.currentDate.getMonth(), this.currentDate.getFullYear());
}

KCalendar.prototype.initMatrix = function() {
	var table = this.panel.appendChild(document.createElement('table'));
	var tHead = table.appendChild(document.createElement('thead'));
	var tHeadNav = tHead.appendChild(document.createElement('tr'));
	var tHeadDays = tHead.appendChild(document.createElement('tr'));
	var tBody = table.appendChild(document.createElement('tbody'));
	var monthDate = new Date();
	monthDate.setMonth(this.currentDate.getMonth());
	monthDate.setDate(1);

	table.className = 'KCalendar';
	tHead.className = 'KCalendarHeader';
	tBody.className = 'KCalendarBody';

	this.titlePreviousMonth = tHeadNav.appendChild(document.createElement('th')).appendChild(document.createElement('a'));
	this.titlePreviousMonth.appendChild(document.createTextNode('<'));
	this.titlePreviousMonth.className = 'KCalendarPrevButton';
	this.titleText = tHeadNav.appendChild(document.createElement('th'));
	this.titleText.colSpan = '5';
	this.titleText.className = 'KCalendarTitle';
	this.titleText.appendChild(document.createTextNode(' '));
	this.titleNextMonth = tHeadNav.appendChild(document.createElement('th')).appendChild(document.createElement('a'));
	this.titleNextMonth.appendChild(document.createTextNode('>'));
	this.titleNextMonth.className = 'KCalendarNextButton';

	for (var i = 0, dayOfMonth = 1; i != 6; i++) {
		var tRow = tBody.appendChild(document.createElement('tr'));
		this.days[i] = new Array();
		for (var k = 0; k != 7; k++) {
			if (i  == 0) {
				var th = document.createElement('th');
				th.className = 'KCalendarDayName';
				var abbr = document.createElement('abbr');
				abbr.title = this.localization['weekDayName'][k];
				abbr.appendChild(document.createTextNode(this.localization['weekDayName'][k].charAt(0)));
				th.appendChild(abbr);
				tHeadDays.appendChild(th);
			}
			tRow.appendChild(this.days[i][k] = document.createElement('td'));
			tRow.style.textAlign = 'right';
			this.days[i][k].appendChild(document.createTextNode(' '));
			this.days[i][k].className = 'KCalendarDay';
			this.days[i][k].onclick = function(e) {
				if (e == null) {
					e = event;
				}
			}
		}
	}
}

KCalendar.prototype.onCalendarChanged = function(selectedMonth) {
}

KCalendar.prototype.onDaySelected = function(selectedDay) {
}

KCalendar.prototype.showMonth = function(monthToShow, monthYear) {
	if (monthToShow > 11) {
		monthToShow = 0;
		monthYear++;
	}
	if (monthToShow < 0) {
		monthToShow = 11;
		monthYear--;
	}
 	var monthDate = new Date();
	var nDayInMonth = this.getDaysInMonth(monthToShow, monthYear);
	monthDate.setMonth(monthToShow);
	monthDate.setFullYear(monthYear);
	monthDate.setDate(1);

	var thisID = this;
	this.titlePreviousMonth.onclick = function(e) {
		thisID.showMonth(monthToShow - 1, monthYear);
	}

	if (this.titleText.childNodes.length != 0) {
		this.titleText.removeChild(this.titleText.childNodes[0]);
	}

	this.titleText.appendChild(document.createTextNode(' ' + this.localization['monthName'][monthToShow] + ' ' + monthYear + ' '));
	this.titleNextMonth.onclick = function(e) {
		thisID.showMonth(monthToShow + 1, monthYear);
	}

	for (var i = 0, dayOfMonth = 0; i != 6; i++) {
		for (var k = 0; k != 7; k++) {
			if (dayOfMonth  == 0 && k == monthDate.getDay()) {
				dayOfMonth = 1;
			}
			if (dayOfMonth != 0 && dayOfMonth <= nDayInMonth) {
				this.daysOfMonth[dayOfMonth] = this.days[i][k];
			}
			if (this.days[i][k].childNodes.length != 0) {
				this.days[i][k].removeChild(this.days[i][k].childNodes[0]);
			}
			this.days[i][k].appendChild(document.createTextNode(dayOfMonth == 0 || dayOfMonth > nDayInMonth ?  ' ' : dayOfMonth++));
		}
	}

	this.onCalendarChanged(new Date(monthYear + '/' + (monthToShow + 1) + "/01"));
}

KCalendar.prototype.setDate = function(month, year) {
	this.currentDate.setMonth(month - 1);
	this.currentDate.setFullYear(year);
	this.showMonth(this.currentDate.getMonth(), this.currentDate.getFullYear());
}

KCalendar.prototype.getDaysInMonth = function (month,year) {
	var m = [31,28,31,30,31,30,31,31,30,31,30,31];
	if (month != 1) {
		return m[month];
	}
	if (year % 4 != 0) {
		return m[1];
	}
	if (year % 100 == 0 && year % 400 != 0) {
		return m[1];
	}
	return m[1] + 1;
}
