// JavaScript Document

var Eventos = {};

var eastermonth;
var easterday;

Eventos.onclick = false;

Eventos.Easter = function (thisYear) {
	var year;
	if (!thisYear) year = (new Date()).getFullYear();
	else year = thisYear;
	
	// feed in the year it returns the month and day of Easter using two GLOBAL variables: eastermonth and easterday
	var a = year % 19;
	var b = Math.floor(year/100);
	var c = year % 100;
	var d = Math.floor(b/4);
	var e = b % 4;
	var f = Math.floor((b+8) / 25);
	var g = Math.floor((b-f+1) / 3);
	var h = (19*a + b - d - g + 15) % 30;
	var i = Math.floor(c/4);
	var j = c % 4;
	var k = (32 + 2*e + 2*i - h - j) % 7;
	var m = Math.floor((a + 11*h + 22*k) / 451);
	var month = Math.floor((h + k - 7*m + 114) / 31);
	var day = ((h + k - 7*m +114) % 31) + 1;
	eastermonth = month;
	easterday = day;
}

/* Feriados est?ticos */
Eventos.StaticHolidays = {
	0 : [ 1 ],
	3 : [ 25 ],
	4 : [ 1 ],
	5 : [ 10 ],
	7 : [ 15 ],
	9 : [ 5 ],	
	10 : [ 1 ],	
	11 : [ 1, 8, 25 ]		
};

/* Feriados moveis */
Eventos.MoveableHolidays;


Eventos.isHolidayDay = function (year, month, day) {
	Eventos.constructMoveableHolidays(year);
	
	if(Eventos.isStaticHoliday(year, month, day))  {
		return true;
	} else if (Eventos.isMoveableHoliday(year, month, day)) {		
		return true;
	}
	return false;
};

Eventos.isStaticHoliday  = function (year, month, day) {		
	if(Eventos.StaticHolidays) {
		var m = Eventos.StaticHolidays[month-1];
		if (!m) return false;		
		for (var i in m) { 
			if (m[i] == day) return true;
		}
		return false;
	}
	return false;
};

Eventos.isMoveableHoliday  = function (year, month, day) {	
	var MONTH_INDEX = 0;
	var DAY_INDEX = 1;
	
	for (var i in Eventos.MoveableHolidays) { 
		if ((Eventos.MoveableHolidays[i][MONTH_INDEX] == month) &&
			(Eventos.MoveableHolidays[i][DAY_INDEX] == day)) 
		return true;
	}
	return false;
};


Eventos.constructMoveableHolidays  = function (year) {	
	Eventos.Easter(year);
	if (!eastermonth || !easterday) return;
	
	var carnivalMonth, carnivalDay;
	var fridayMonth, fridayDay;
	var godMonth, godDay;
	var diasFev = 28;
	if (year%4==0) diasFev = 29;
	
	var diasMes = {
		2 : [ diasFev ],	
		3 : [ 31 ],
		4 : [ 30 ],
		5 : [ 31 ],
		6 : [ 30 ]
	}
	
	// carnaval: 47 dias antes da pascoa
	carnivalMonth = eastermonth;
	carnivalDay = (easterday - 47);
	
	while (carnivalDay <= 0) {
		var tmp = carnivalDay;
		carnivalMonth--;		
		if (diasMes[carnivalMonth])
			carnivalDay = (diasMes[carnivalMonth] -(-tmp)); 	// tmp negativo
	}
	
	// sexta santa: 2 dias antes da pascoa
	fridayMonth = eastermonth;
	fridayDay = easterday - 2;
	
	while (carnivalDay <= 0) {
		var tmp = fridayDay;
		fridayMonth--;
		if (diasMes[fridayMonth])
			fridayDay = diasMes[fridayMonth] - (-tmp); 			// tmp negativo
	}
	
	// corpo deus: 60 dias dpx da pascoa
	godMonth = eastermonth;
	godDay = easterday + 60;
	
	while (godDay > diasMes[godMonth]) {
		var tmp = godDay;
		godMonth++;
		if (diasMes[godMonth])
			godDay = tmp - diasMes[godMonth]; 	
	}
		
	
	Eventos.MoveableHolidays = {
		0 : [ carnivalMonth, carnivalDay ],
		1 : [ fridayMonth, fridayDay ],
		2 : [ eastermonth, easterday ],
		3 : [ godMonth, godDay ]
	};
}

Eventos.Tooltips;
	
/// See if the date has a tooltip. 
/// If it has, returns the tooltip body. If not, returns false.
/// @param year [string] reference to the year.
/// @param mont [string] reference to the month.
/// @param day [string] reference to the day.
Eventos.hasTooltip  = function (year, month, day) {	
	var tooltipBody = "";
	var DATA_INDEX = 0;
	var data = year+"-"+month+"-"+day;
	for (var i in Eventos.Tooltips) { 
		if (Eventos.Tooltips[i][DATA_INDEX] == data) {
			return Eventos.Tooltips[i][1];
		}
	}	
	return tooltipBody;	
};


