function createCalendar() {
	
	var table = createTable();
	table.id="calendar";
	table.cellPadding="8";
	table.cellSpacing="2";
	var tbody = createTBody();
	table.appendChild(tbody);
	var container = document.getElementById("table_box");
	var children = container.childNodes;
	if ( children.length != 0 ) 
		container.removeChild(container.lastChild);
		
	container.appendChild(table);
	var currentTime = new Date();
	var monthField = document.getElementById("monthField");
	currentTime.setDate(1);

	currentTime.setMonth(monthField.value);
	var currentMonth = monthField.value;
		
	var nextMonthTime = new Date(currentTime.getYear(), currentTime.getMonth() + 1, 0); // setting date to the last day of current month
	
	var lastDayOfMonth = nextMonthTime.getDate();
	var firstDayOfMonth = currentTime.getDay();

	if ( firstDayOfMonth == 0 ) 
		firstDayOfMonth = 7;
	firstDayOfMonth = firstDayOfMonth -1;
	var emptyCells = 0;
	while ( firstDayOfMonth != 0 ) 
	{
		emptyCells = emptyCells + 1;
		firstDayOfMonth = firstDayOfMonth - 1;
	}
	var dayCounter = 1;
	var thisMonthCells = new Array(lastDayOfMonth);
	var firstRow = createRow();
	for ( var i = 0; i < 7; i++ ) {
		var day = createCell();
		firstRow.appendChild(day);
		if ( i < emptyCells ) {
			day.innerHTML = "&nbsp"; 
			day.className = "glum"
		} else {
			day.innerHTML = dayCounter;
			thisMonthCells[dayCounter-1] = day;
				if ( i == 6 ) {
					day.className = "holiday";
				}
				if ( i == 5 ) {
					day.className = "saturday";
				}			
			dayCounter = dayCounter + 1;
		}
	}	
	tbody.appendChild(firstRow);
	for ( var j = 0; j < 5; j++ ) {
		var row = createRow();
		for ( var k = 0; k < 7; k++ ) {
			var day = createCell();
			row.appendChild(day);
			if ( dayCounter <= lastDayOfMonth ) {
				day.innerHTML = dayCounter;
				thisMonthCells[dayCounter-1] = day;
				if ( k == 6 ) {
					day.className = "holiday";
				}
				if ( k == 5 ) {
					day.className = "saturday";
				}
				dayCounter = dayCounter + 1;
			} else {
				day.innerHTML = "&nbsp"; 
				day.className = "glum";
			}
			
		}
		tbody.appendChild(row);
	}
	var currentMonthArray = datesArray[currentMonth];
	var courseDays = currentMonthArray.split(",");
	courseDays[courseDays.length-1] = courseDays[0];
	for ( var i =0; i < courseDays.length; i++ ) {
		thisMonthCells[courseDays[i] - 1].innerHTML = courseDays[i];
		thisMonthCells[courseDays[i] - 1].className = "special";
	}	
	var todayDate = new Date();
	if ( currentMonth == todayDate.getMonth() )	{
		var todayDay = todayDate.getDate();	
		var todayCell = thisMonthCells[todayDay - 1];
		todayCell.style.fontWeight="bold";
		todayCell.style.textDecoration="underline";

		for ( var i =0; i < todayDay - 1; i++ ) {
			thisMonthCells[i].className = "gone";
		}	
	}
	
}
function createRow() {
	return document.createElement("tr");
}
function createCell() {
	return document.createElement("td");
}

function createTable() {
	return document.createElement("table");
}
function createTBody() {
	return document.createElement("tbody");
}
function next() {
	var monthField = document.getElementById("monthField");
	var today = new Date();
	var value = parseInt(monthField.value);
	value = value + 1;
	var maxMonths = parseInt(document.getElementById("maxMonths").value) - 1;
	if ( value > maxMonths )
		value = maxMonths;
	monthField.value = value;
	today.setDate(1);
	today.setMonth(value);
	document.getElementById("month_header").innerHTML=dateFormat(today, "mmmm, yyyy");
	createCalendar();
}
function previous() {
	var monthField = document.getElementById("monthField");
	var today = new Date();
	var value = parseInt(monthField.value);
	value = value - 1;
	if ( value < today.getMonth() )
		value = today.getMonth();
	monthField.value = value;
	today.setDate(1);
	today.setMonth(value);
	document.getElementById("month_header").innerHTML=dateFormat(today, "mmmm, yyyy");
	createCalendar();
}
function init() {
	var today = new Date();
	var monthField = document.getElementById("monthField");
	monthField.value = today.getMonth();
	var value = parseInt(monthField.value);
	today.setMonth(value);
	document.getElementById("month_header").innerHTML=dateFormat(today, "mmmm, yyyy");
	createCalendar();
}
var dateFormat = function () {	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,		timezoneClip = /[^-+\dA-Z]/g,		pad = function (val, len) {			val = String(val);			len = len || 2;			while (val.length < len) val = "0" + val;			return val;		};	return function (date, mask, utc) {		var dF = dateFormat;		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {			mask = date;			date = undefined;		}		date = date ? new Date(date) : new Date;		if (isNaN(date)) throw SyntaxError("invalid date");		mask = String(dF.masks[mask] || mask || dF.masks["default"]);		if (mask.slice(0, 4) == "UTC:") {			mask = mask.slice(4);			utc = true;		}		var	_ = utc ? "getUTC" : "get",			d = date[_ + "Date"](),			D = date[_ + "Day"](),			m = date[_ + "Month"](),			y = date[_ + "FullYear"](),			H = date[_ + "Hours"](),			M = date[_ + "Minutes"](),			s = date[_ + "Seconds"](),			L = date[_ + "Milliseconds"](),			o = utc ? 0 : date.getTimezoneOffset(),			flags = {				d:    d,				dd:   pad(d),				ddd:  dF.i18n.dayNames[D],				dddd: dF.i18n.dayNames[D + 7],				m:    m + 1,				mm:   pad(m + 1),				mmm:  dF.i18n.monthNames[m],				mmmm: dF.i18n.monthNames[m + 12],				yy:   String(y).slice(2),				yyyy: y,				h:    H % 12 || 12,				hh:   pad(H % 12 || 12),				H:    H,				HH:   pad(H),				M:    M,				MM:   pad(M),				s:    s,				ss:   pad(s),				l:    pad(L, 3),				L:    pad(L > 99 ? Math.round(L / 10) : L),				t:    H < 12 ? "a"  : "p",				tt:   H < 12 ? "am" : "pm",				T:    H < 12 ? "A"  : "P",				TT:   H < 12 ? "AM" : "PM",				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]			};		return mask.replace(token, function ($0) {			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);		});	};}();dateFormat.masks = {	"default":      "ddd mmm dd yyyy HH:MM:ss",	shortDate:      "m/d/yy",	mediumDate:     "mmm d, yyyy",	longDate:       "mmmm d, yyyy",	fullDate:       "dddd, mmmm d, yyyy",	shortTime:      "h:MM TT",	mediumTime:     "h:MM:ss TT",	longTime:       "h:MM:ss TT Z",	isoDate:        "yyyy-mm-dd",	isoTime:        "HH:MM:ss",	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"};dateFormat.i18n = {	dayNames: [		"Nd", "Pn", "Wt", "Śr", "Czw", "Pt", "Sb",		"Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"	],	monthNames: [		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",		"Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"	]};Date.prototype.format = function (mask, utc) {	return dateFormat(this, mask, utc);};
