function Calendar(id) {
	//controle necessário para várias instâncias de calendários
	if(Calendar.calendarQueueControl === undefined) {
		Calendar.calendarQueueControl = new Array();
	}
	
	this.id = Calendar.calendarQueueControl.length;
	this.placeHolderId = id,
	
	Calendar.calendarQueueControl.push({
		'currentMonth':new Date(),
		'monthNames':new Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"),
		'weekdayNames':new Array("D","S","T","Q","Q","S","S"),
		'events' : new Array(),
		'selectedView' : 'inline'
	});
}

Calendar.prototype.setStartDate = function(yyyy,mm,dd) {
	Calendar.calendarQueueControl[this.id].currentMonth.setYear(yyyy);
	Calendar.calendarQueueControl[this.id].currentMonth.setMonth(mm-1);
	Calendar.calendarQueueControl[this.id].currentMonth.setDate(dd);
}

Calendar.prototype.addEvent = function(yyyy,mm,dd,url) {
	Calendar.calendarQueueControl[this.id].events.push({
		'year':yyyy,
		'month':mm,
		'day':dd,
		'url':url
	});
}

Calendar.prototype.setView = function(view) {
	Calendar.calendarQueueControl[this.id].selectedView = view;
}

Calendar.buildCalendar = function(id) {
	var currentMonth = Calendar.calendarQueueControl[id].currentMonth;
	var monthNames = Calendar.calendarQueueControl[id].monthNames;
	var weekdayNames = Calendar.calendarQueueControl[id].weekdayNames;
	
	currentMonth.setDate(1);
	var numDays = 32 - new Date(currentMonth.getYear(), currentMonth.getMonth(), 32).getDate();	
	
	var calendarHTML = "";
	if(Calendar.calendarQueueControl[id].selectedView == "table") {
		calendarHTML = Calendar.tableView(id,currentMonth,monthNames,weekdayNames,numDays);
	} else {
		calendarHTML = Calendar.inlineView(id,currentMonth,monthNames,weekdayNames,numDays);
	}
	
	return calendarHTML;
}

Calendar.inlineView = function(id,currentMonth,monthNames,weekdayNames,numDays) {
	var weekdayCols = new Array();
	var dayCols = new Array();
	
	var weekdayOffset = currentMonth.getDay() - 1;
	
	for(var day = 1; day <= numDays; day++) {
		var eventStyle = "";
		var eventStyle2 = "";
		var eventURL = "";
		for(var item in Calendar.calendarQueueControl[id].events) {
			var event = Calendar.calendarQueueControl[id].events[item];
			if ((day == event.day) && (currentMonth.getMonth() == (event.month - 1)) && (currentMonth.getFullYear() == event.year)) {
				eventStyle = "background:#e0bb91;color:#FFF;";
				eventStyle2 = "background:#c4a98b;color:#FFF;";
				eventURL = event.url;
			}
		}
		weekdayCols.push("<th style=\""+eventStyle+"\">"+weekdayNames[(day + weekdayOffset) % 7]+"</th>");
		if(eventURL != "" && eventURL != null) {
			dayCols.push("<td style=\""+eventStyle2+"\"><a href=\""+eventURL+"\">"+day+"</td>");
		} else {
			dayCols.push("<td style=\""+eventStyle2+"\">"+day+"</td>");
		}
		
	}
	 return "<table><caption>"+monthNames[currentMonth.getMonth()]+ " " + currentMonth.getFullYear() +"</caption><tr>"+weekdayCols.join("")+"</tr><tr>"+dayCols.join("")+"</tr></table>";
}

Calendar.tableView = function(id,currentMonth,monthNames,weekdayNames,numDays) {
	var html = new Array();
	

	
	html.push("<table>");

	html.push("<caption>"+monthNames[currentMonth.getMonth()]+ " " + currentMonth.getFullYear() +"</caption>");
	html.push("<tr>");
	
	for(var item in weekdayNames) {
		html.push("<th>"+weekdayNames[item]+"</th>");
	}
	html.push("</tr>");

	
	var weekdayOffset = currentMonth.getDay();
	var weekdayCount = 0;
	for(var day = (1 - weekdayOffset); day <= numDays; day++) {
		if(weekdayCount % 7 == 0) {
			html.push("<tr>");
		}
		
		var eventStyle = "";
		var eventURL = "";
		for(var item in Calendar.calendarQueueControl[id].events) {
			var event = Calendar.calendarQueueControl[id].events[item];
			if ((day == event.day) && (currentMonth.getMonth() == (event.month - 1)) && (currentMonth.getFullYear() == event.year)) {
				eventStyle = "background:#e0bb93;";
				eventURL = event.url;
			}
		}
		
		html.push("<td style=\""+eventStyle+"\">"+((day < 1)?"&nbsp;":day)+"</td>");

		if(weekdayCount % 7 == 6) {
			html.push("</tr>");
		}
		weekdayCount++;
	}

	html.push("</table>");

	return html.join("");
}

Calendar.move = function(id, direction) {
	var currentMonth = Calendar.calendarQueueControl[id].currentMonth;
	var gotoMonth = currentMonth.getMonth();
	
	gotoMonth = (direction == "previous") ? gotoMonth - 1 : gotoMonth + 1;
	
	if(gotoMonth == -1) {
		gotoMonth = 11;
		currentMonth.setFullYear(currentMonth.getFullYear() - 1);
	} else if(gotoMonth == 12) {
		gotoMonth = 0;
		currentMonth.setFullYear(currentMonth.getFullYear() + 1);
	}
	
	currentMonth.setMonth(gotoMonth);
	document.getElementById("calendar_container_"+id).innerHTML = Calendar.buildCalendar(id);
	return false;
}

Calendar.prototype.render = function() {
	var html = new Array();
	
	html.push("<table>");
	
	html.push("<tr>");
	
	html.push("<td style='background:none; border:none; padding:0 5px 0 0;'>");
	html.push("<a href=\"javascript:void(0);\" onclick=\"return Calendar.move("+this.id+",'previous');\"><img src='img/arrow-show-1.gif' /></a> ");
	html.push("</td>");	
	
	html.push("<td>");
	html.push("<div id=\"calendar_container_"+this.id+"\">");
	html.push(Calendar.buildCalendar(this.id));
	html.push("</div>");
	html.push("</td>");
	
	html.push("<td style='background:none; border:none; padding:0 0 0 5px;'>");
	html.push("<a href=\"javascript:void(0);\" onclick=\"return Calendar.move("+this.id+",'next');\"><img src='img/arrow-show-2.gif' /></a>");
	html.push("</td>");
	
	html.push("</tr>");
	
	html.push("</table>");
	
	document.getElementById(this.placeHolderId).innerHTML = html.join("");
}