
function makeArray() { this[0] = makeArray.arguments.length; for (i = 0; i < makeArray.arguments.length; i = i + 1) this[i+1] = makeArray.arguments[i]; }

var hebMonth = new makeArray('Nissan', 'Iyar', 'Sivan', 'Tamuz', 'Menachem Av', 'Elul', 'Tishrei', 'Mar Cheshvan', 'Kislev', 'Tevet', 'Shevat', 'Adar', 'Adar I', 'Adar II');
var civMonth = new makeArray('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');
var weekDay = new makeArray('Sun', 'Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Shabbat');

function diaSemana(dia, mes, ano) { var ddia; ddia = DOW(dia, mes, ano); return ddia; }

function Gauss(year) {
	var a, b, c, m, Mar;	// "day in March" on which Pesach falls (return value)
	a = Math.floor((12 * year + 17) % 19);
	b = Math.floor(year % 4);
	m = 32.044093161144 + 1.5542417966212 * a +  b / 4.0 - 0.0031777940220923 * year;
	if (m < 0) m -= 1;
	Mar = Math.floor(m);
	if (m < 0) m++;
	m -= Mar; c = Math.floor((Mar + 3 * year + 5 * b + 5) % 7);
	if (c == 0 && a > 11 && m >= 0.89772376543210) Mar++;
	  else if (c == 1 && a > 6 && m >= 0.63287037037037) Mar += 2;
	    else if (c == 2 || c == 4 || c == 6) Mar++;
	Mar += Math.floor((year - 3760) / 100) - Math.floor((year - 3760) / 400) - 2;
	return Mar; }

function leap(y) { return ((y % 400 == 0) || (y % 100 != 0 && y % 4 == 0)); }

function civMonthLength(month, year) {
	if (month == 2) return 28 + leap(year);
	  else if (month == 4 || month == 6 || month == 9 || month == 11) return 30;
	   else return 31; }

function civ2heb(day, month, year) {
	var d = day; var m = month; var y = year; var hy; var pesach; var anchor; var adarType; 
	m -= 2; if (m <= 0) { m += 12; y -= 1; }   	// Jan or Feb
	d += Math.floor(7 * m / 12 + 30 * (m - 1)); 	// day in March
	hy = y + 3760;					// get Hebrew year
	pesach = Gauss(hy);
	if (d <= pesach - 15) { 			// before 1 Nisan
		anchor = pesach; d += 365; if (leap(y)) d++;
		y -= 1; hy -= 1; pesach = Gauss(hy); }
	else anchor = Gauss(hy + 1);
	d -= pesach - 15; anchor -= pesach - 12; y++; if (leap(y)) anchor++;
	for (m = 0; m < 11; m++) { var days;
		if (m == 7 && anchor % 30 == 2) days = 30; // Cheshvan
		 else if (m == 8 && anchor % 30 == 0) days = 29; // Kislev
		  else days = 30 - m % 2;
		if (d <= days) break;
		d -= days; }
	adarType = 0;					// plain old Adar
	if (m == 11 && anchor >= 30) {
		if (d > 30) { adarType = 2; d -= 30; }	// Adar 2
		 else adarType = 1; }			// Adar 1
	if (m >= 6) hy++;				// Tishrei or after? then bump up year
	if (m == 11) m += adarType;			// Adar? adjust for Adars
	return (d + ' ' + m + ' ' + hy); }


function Easter(Y) {
	// based on the algorithm of Oudin
    var C = Math.floor(Y / 100);
    var N = Y - 19 * Math.floor(Y / 19);
    var K = Math.floor((C - 17) / 25);
    var I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
    I = I - 30 * Math.floor((I / 30));
    I = I - Math.floor(I / 28) * (1 - Math.floor(I / 28) * Math.floor(29 / (I + 1)) * Math.floor((21 - N) / 11));
    var J = Y + Math.floor(Y / 4) + I + 2 - C + Math.floor(C / 4);
    J = J - 7 * Math.floor(J / 7);
    var L = I - J;
    var M = 3 + Math.floor((L + 40) / 44);
    var D = L + 28 - 31 * Math.floor(M / 4);
	var ret = new Object(); ret[1] = M; ret[2] = D; return ret; }

function DOW(day, month, year) { // day of week sun or mon or ...
	var a = Math.floor((14 - month)/12); var y = year - a; var m = month + 12*a - 2; 
	var d = (day + y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) + Math.floor((31*m)/12)) % 7; 
	return d + 1; }

function NthDOW(nth, weekday, month, year) { // each week this DOW happens?
	if (nth > 0) return (nth - 1) * 7 + 1 + (7 + weekday - DOW((nth - 1) * 7 + 1, month, year)) % 7;
	var days = civMonthLength(month, year); return days - (DOW(days, month, year) - weekday + 7) % 7; }

function holidays(cday, cmonth, cyear) { // Some civil holidays and major religious holiday Brazil 2010
	if (cmonth == 1 && cday == 1) return "Ano Novo";
	else if (cmonth == 3 || cmonth == 4) { var e = Easter(cyear); 
		  if (cmonth == e[1] && cday == e[2]) return "Páscoa"; }
	else if (cmonth == 4 && cday == 21) return "Tiradentes";
	else if (cmonth == 5 && cday == 1) return "Dia do Trabalho";
	else if (cmonth == 5 && cday == NthDOW(2, 1, 5, cyear)) return "Dia das Mães";
	else if (cmonth == 6 && cday == 3) return "Feriado";
	else if (cmonth == 8 && cday == NthDOW(2, 1, 8, cyear)) return "Dia dos Pais";
	else if (cmonth == 9 && cday == 7)   return "Dia da Independencia";
	else if (cmonth == 10 && cday == 12) return "Dia da Criança";
	else if (cmonth == 10 && cday == 15) return "Dia do Professor";
	else if (cmonth == 11 && cday == 2)  return "Finados";
	else if (cmonth == 11 && cday == 15)  return "Proclamação da República";
	else if (cmonth == 12 && cday == 25) return "Feriado Nacional";
	return ""; }

function moadim(cday, cmonth, cyear, hday, hmonth, dowm) { // chaguim haieudim
	if (hmonth == 6) { if(hday == 1 || hday == 2) return "Rosh HaShaná";
				else if (hday == 3 && dowm != 7) return "Jejum de Guedália";
				 else if (hday == 4 && dowm == 1) return "Jejum de Guedália";
				  else if (hday == 10) return "Yom Kipur";
				   else if (hday >= 15 && hday <= 22) return "Sucot";
				    else if (hday == 23) return "Sucot (d)"; }
	else if (hmonth == 8) { if (hday >= 25) return "Chanuká"; }
	else if (hmonth == 9) { 
		  if (hday <= 2)  return "Chanuká";
		   else if (hday == 3) {     // Kislev can be malei or chaser
			if (cday == 1) { cday = 29; cmonth = 11; }
			 else if (cday == 2) { cday = 30; cmonth = 11; }
			  else cday -= 3;
			var hdate = civ2heb(cday, cmonth, cyear);
			hd = eval(hdate.substring(0, hdate.indexOf(' ')));
			if (hd == 29) return "Chanucá"; }
		 else if (hday == 10) return "Jejum de 10 de Tevet"; }
	else if (hmonth == 10) { if (hday == 15) return "Tu biShevat"; }
	else if (hmonth == 11 || hmonth == 13) {
		  if (hday == 11 && dowm == 5) return "Jejum de Ester";
		   else if (hday == 13 && dowm != 7) return "Jejum de Ester";
		    else if (hday == 14) return "Purim";
		     else if (hday == 15) return "Shushan Purim"; }
	else if (hmonth == 0) {
		  if (hday == 12 && dowm == 5) return "Jejum dos Primogênitos";
		   else if (hday == 14 && dowm != 7) return "Jejum dos Primogênitos";
		    else if (hday >= 15 && hday <= 21) return "Pessach";
		     else if (hday == 22) return "Pessach (d)"; }
	else if (hmonth == 1) {
		  if (hday == 3 && dowm == 5) return "Yom Hatzmaut";
		   else if (hday == 4 && dowm == 5) return "Yom Hatzmaut";
		    else if (hday == 5 && dowm != 6 && dow != 7) return "Yom Hatzmaut";
		  if (hday == 14) return "Pessah Sheni";
		   else if (hday == 18) return "Lag BaOmer";
		  if (hday == 28) return "Yom Yerushalaim"; }
	else if (hmonth == 2) {
		  if (hday == 6) return "Shavuot";
		   else if (hday == 7) return "Shavuot (d)"; }
	else if (hmonth == 3) {
		  if (hday == 17 && dowm != 7) return "Jejum de 17 de Tamuz";
		  if (hday == 18 && dowm == 1) return "Jejum de 17 de Tamuz"; }
	else if (hmonth == 4) {
		  if (hday == 9 && dowm != 7) return "Tisha BeAv";
		  if (hday == 10 && dowm == 1) return "Tisha BeAv";
		  if (hday == 15) return "Tu BeAv"; }
	return ""; }

