(function($){
	$.fn.constructCalendar = function(options) {
		var defaults = {
			mode:"construct",
			requisitAjax:"",
			parametersAjax:"",
			funcBeforeRequisitAjax:"",
			classTitle:"",
			classArrowLeft:"",
			classArrowRight:"",
			classContentDays:"",
			classDay:""
		};

		var options = $.extend(defaults, options);

		var dateNow = new Date();

		if (options.mode=="construct") {
			var strHtml = "<div>";
			strHtml    += "<div ";
			if (options.classTitle!="") {
				strHtml += "class='"+options.classTitle+"'";
			}
			strHtml    += ">";
			strHtml    += "<span id='arrowLeft' ";
			if (options.classArrowLeft!="") {
				strHtml += "class='"+options.classArrowLeft+"'";
			}
			strHtml    += ">&nbsp;</span>";
			strHtml    += "&nbsp;";
			strHtml    += "<span id='monthTitle'>";
			strHtml    += "</span>";
			strHtml    += "&nbsp;";
			strHtml    += "<span id='arrowRight' ";
			if (options.classArrowRight!="") {
				strHtml += "class='"+options.classArrowRight+"'";
			}
			strHtml    += ">&nbsp;</span>";
			strHtml    += "</div>";
			strHtml    += "<div ";
			if (options.classContentDays!="") {
				strHtml += "class='"+options.classContentDays+"'";
			}
			strHtml    += ">";
			strHtml    += "<table id='calendarContent' align='center'>";
			strHtml    += "<tr>";
			strHtml    += "<th>Dom</th>";
			strHtml    += "<th>Seg</th>";
			strHtml    += "<th>Ter</th>";
			strHtml    += "<th>Qua</th>";
			strHtml    += "<th>Qui</th>";
			strHtml    += "<th>Sex</th>";
			strHtml    += "<th>Sab</th>";
			strHtml    += "</tr>";
			var w=0;
			for (i=0; i<42; i++) {
				if (w==7) w=0;
				if (i==0 || i==7 || i==14 || i==21 || i==28 || i==35) {
					strHtml += "<tr>";
				}
				strHtml += "<td id='"+String(i)+String(w)+"' ";
				if (options.classDay!="") {
					strHtml += "class='"+options.classDay+"'";
				}
				strHtml += ">";
				strHtml += "</td>";
				if (i==6 || i==13 || i==20 || i==27 || i==34 || i==41) {
					strHtml += "</tr>";
				}
				w++;
			}
			strHtml    += "</table>";
			strHtml    += "</div>";
			strHtml    += "</div>";

			this.append(strHtml);

			$.fn.constructCalendar.drawMonth({
				"requisitAjax":options.requisitAjax,
				"parametersAjax":options.parametersAjax,
				"funcBeforeRequisitAjax":options.funcBeforeRequisitAjax
			});

			$("#arrowLeft").click(function() {
				dateNow = new Date(dateNow.getFullYear(), (dateNow.getMonth()-1), dateNow.getDate())
				$.fn.constructCalendar.drawMonth({
					"dateNow":dateNow,
					"requisitAjax":options.requisitAjax,
					"parametersAjax":options.parametersAjax,
					"funcBeforeRequisitAjax":options.funcBeforeRequisitAjax
				});
			});

			$("#arrowRight").click(function() {
				dateNow = new Date(dateNow.getFullYear(), (dateNow.getMonth()+1), dateNow.getDate())
				$.fn.constructCalendar.drawMonth({
					"dateNow":dateNow,
					"requisitAjax":options.requisitAjax,
					"parametersAjax":options.parametersAjax,
					"funcBeforeRequisitAjax":options.funcBeforeRequisitAjax
				});
			});

		}
	}

	$.fn.constructCalendar.drawMonth = function(options) {
		var defaults = {
			dateNow:new Date(),
			requisitAjax:"",
			parametersAjax:"",
			funcBeforeRequisitAjax:""
		};
		var options = $.extend(defaults, options);
		var months = Array();
		months[0] = "Janeiro";
		months[1] = "Fevereiro";
		months[2] = "Março";
		months[3] = "Abril";
		months[4] = "Maio";
		months[5] = "Junho";
		months[6] = "Julho";
		months[7] = "Agosto";
		months[8] = "Setembro";
		months[9] = "Outubro";
		months[10] = "Novembro";
		months[11] = "Dezembro";
		var lastDay = (new Date(options.dateNow.getFullYear(), (options.dateNow.getMonth()+1), 0)).getDate();
		var weekDayFirst = (new Date(options.dateNow.getFullYear(), options.dateNow.getMonth(), 1)).getUTCDay();

		$("#calendarContent").find("td").html("").css({opacity:0, cursor:"default"});
		$("#calendarContent").find("td").unbind("click mouseenter mouseleave");

		$("#monthTitle").html(months[options.dateNow.getMonth()]+"&nbsp;de&nbsp;"+String(options.dateNow.getFullYear()));

		$.post(options.requisitAjax, {mod:options.parametersAjax.mod, diaInicial:1, diaFinal:lastDay, mes:(options.dateNow.getMonth()+1), ano:options.dateNow.getFullYear()}, function(xml) {
			var data = {id: Array(),
				dia: Array(),
				mes: Array(),
				ano: Array(),
				hora: Array(),
				min: Array(),
				evento: Array(),
				endereco: Array()
			};
			var n=0;

			$(xml).find("reg_event").each(function(i) {
				data.id[n] = $(this).find("id").text();
				data.dia[n] = $(this).find("dia").text();
				data.mes[n] = $(this).find("mes").text();
				data.ano[n] = $(this).find("ano").text();
				data.hora[n] = $(this).find("hora").text();
				data.min[n] = $(this).find("min").text();
				data.evento[n] = $(this).find("evento").text();
				data.endereco[n] = $(this).find("endereco").text();
				n++;
			});
			
			for (i=0; i<lastDay; i++) {
				var weekDay = (new Date(options.dateNow.getFullYear(), options.dateNow.getMonth(), i+1)).getUTCDay();
				var $cellDay = $("#"+String(i+weekDayFirst)+String(weekDay));
				if (options.dateNow.getDate()==(i+1)) {
					$cellDay.css({cursor:"pointer"});
					$cellDay.html("<b class='today'>"+String(i+1)+"</b>");
					$cellDay.bind("click", eventClick);
					$cellDay.bind("mouseenter", eventOver);
					$cellDay.bind("mouseleave", eventOut);
				} else {
					$evento = false;
					for (a=0; a<data.dia.length; a++) {
						if (data.dia[a]==(i+1)) {
							$evento = true;
						}
					}
					if ($evento) {
						$cellDay.css({cursor:"pointer"});
						$cellDay.html("<b>"+String(i+1)+"</b>");
						$cellDay.bind("click", eventClick);
						$cellDay.bind("mouseenter", eventOver);
						$cellDay.bind("mouseleave", eventOut);
					} else {
						$cellDay.html(String(i+1));
					}
				}
				$cellDay.animate({opacity:.5}, {queue:true, duration:1000});
			}
		});

		$.post(options.requisitAjax, { mod:options.parametersAjax.mod, diaInicial: options.dateNow.getDate(), diaFinal: lastDay, mes: (options.dateNow.getMonth()+1), ano: options.dateNow.getFullYear()}, function(xml) {
			var data = {id: Array(),
				dia: Array(),
				mes: Array(),
				ano: Array(),
				hora: Array(),
				min: Array(),
				evento: Array(),
				endereco: Array()
			};
			var n=0;

			$(xml).find("reg_event").each(function(i) {
				data.id[n] = $(this).find("id").text();
				data.dia[n] = $(this).find("dia").text();
				data.mes[n] = $(this).find("mes").text();
				data.ano[n] = $(this).find("ano").text();
				data.hora[n] = $(this).find("hora").text();
				data.min[n] = $(this).find("min").text();
				data.evento[n] = $(this).find("evento").text();
				data.endereco[n] = $(this).find("endereco").text();
				n++;
			});
			var dados = data;
			eval(options.funcBeforeRequisitAjax);
		});

		function eventOver() {
			$(this).animate({opacity:1}, {queue:false, duration:1000});
		}

		function eventOut() {
			$(this).animate({opacity:.5}, {queue:false, duration:1000});
		}

		function eventClick() {
			$.post(options.requisitAjax, { mod:options.parametersAjax.mod, diaInicial: Number($(this).html().replace(/<[^>]*>/g, "")), diaFinal: lastDay, mes: (options.dateNow.getMonth()+1), ano: options.dateNow.getFullYear()}, function(xml) {
				var data = {id: Array(),
					dia: Array(),
					mes: Array(),
					ano: Array(),
					hora: Array(),
					min: Array(),
					evento: Array(),
					endereco: Array()
				};
				var n=0;

				$(xml).find("reg_event").each(function(i) {
					data.id[n] = $(this).find("id").text();
					data.dia[n] = $(this).find("dia").text();
					data.mes[n] = $(this).find("mes").text();
					data.ano[n] = $(this).find("ano").text();
					data.hora[n] = $(this).find("hora").text();
					data.min[n] = $(this).find("min").text();
					data.evento[n] = $(this).find("evento").text();
					data.endereco[n] = $(this).find("endereco").text();
					n++;
				});

				var dados = data;
				eval(options.funcBeforeRequisitAjax);
			});
		}

		$("#calendarContent").find("td:empty").animate({opacity:0}, {queue:true, duration:200});
	}
})(jQuery);
