var titDia = ["D","S","T","Q","Q","S","S"];
var mesesNome = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"];
var data_limite_menor = {dia:1, mes:0, ano:1900};
var data_limite_maior = {dia:31, mes:11, ano:3000};

function criarSeta(tipo) {
	var img = document.createElement("IMG");
	if(tipo==-1)
		img.src = "seta_anterior.gif";
	else
		img.src = "seta_proximo.gif";
	img.border = 0;
	return img;
}

function criarCalendario(calId, paiId, btnControle) {
	var tab = document.createElement("TABLE");
	tab.className = "calendario";
	tab.cellSpacing = 0;
	tab.border = 0;
	tab.width = "100%";
	tab.id = calId;
	tab.setAttribute("btnControle", (btnControle ? "sim":"nao"));
	var tbody = document.createElement("TBODY");

	//adicionar cabeçalho
	var ttr = document.createElement("TR");

	if(btnControle) {
		//mês anteior
		var ttd = document.createElement("TD");
		ttd.className = "mes_seta";
		ttd.setAttribute("mover", -1);
		ttd.onclick = moverParaMes;
		ttd.appendChild(criarSeta(-1));
		ttd.title = rotulo_mes_anterior;
		ttr.appendChild(ttd);	
	}

	//mês
	ttd = document.createElement("TD");	
	ttd.className = "mes_titulo";
	ttd.colSpan = (btnControle ? 3:4);
	var span = document.createElement("SPAN");
	span.innerHTML = "mes";
	span.style.marginRight = "5px";
	ttd.appendChild(span);
	if(btnControle) {
		var imgseta = document.createElement("IMG");
		imgseta.src = "dd_seta_baixo.gif";
		imgseta.width = 7; imgseta.height = 4;
		imgseta.align = "baseline";
		imgseta.style.position = "relative"
		imgseta.style.top = "-2px";
		ttd.onclick = eventoExibirSelectMesAno;
		ttd.appendChild(imgseta);
	}
	ttr.appendChild(ttd);
	tbody.appendChild(ttr);
	
	//ano
	ttd = document.createElement("TD");	
	ttd.className = "mes_titulo";
	ttd.colSpan = (btnControle ? 2:3);
	span = document.createElement("SPAN");
	span.innerHTML = "ano";
	span.style.marginRight = "5px";
	ttd.appendChild(span);
	if(btnControle) {
		imgseta = document.createElement("IMG");
		imgseta.src = "dd_seta_baixo.gif";
		imgseta.width = 7; imgseta.height = 4;
		imgseta.align = "baseline";
		imgseta.style.position = "relative"
		imgseta.style.top = "-2px";
		ttd.appendChild(imgseta);
		ttd.onclick = eventExibirSelectAno;
	}
	ttr.appendChild(ttd);
	tbody.appendChild(ttr);	
	
	if(btnControle) {
		//próximo mês	
		ttd = document.createElement("TD");
		ttd.setAttribute("mover", 1);
		ttd.onclick = moverParaMes;
		ttd.className = "mes_seta";
		ttd.appendChild(criarSeta(1));
		ttd.title = rotulo_proximo_mes;
		ttr.appendChild(ttd);
		tbody.appendChild(ttr);
	}
	
	var larg = 99.75 / 7;
	for(var row = 0; row < 7; row++) {
		var tr = document.createElement("TR");
		for(var col = 0; col < 7; col++) {
			var td = document.createElement("TD");
			td.innerHTML = "&nbsp;";
			td.width = "" + larg + "%";
			if(row==0) {
				td.className = (col < 6 ? "dia_titulo": "dia_titulo_domingo");
				var nome_dia = titDia[(col+1) % 7]
				td.innerHTML = nome_dia.substring(0,1);
				td.title = nome_dia;
			} else {
				td.className = "dia_valor";
				td.onmouseover = function() {this.setAttribute("tdclass", this.className); this.className = "dia_valor_sel"};
				td.onmouseout = function() {this.className = this.getAttribute("tdclass");};
			}					
			tr.appendChild(td);
		}
		tbody.appendChild(tr);
	}
	tab.appendChild(tbody);

	var pai = document.getElementById(paiId);
	pai.appendChild(tab);
}

function setarMes(calId, hjmes, hjano) {

	//verifica data passada
	var comp = compararComDatasLimites(hjmes, hjano);
	if(comp < 0) {
		hjmes = data_limite_menor.mes;
		hjano = data_limite_menor.ano;
	
	} else if(comp > 0) {
		hjmes = data_limite_maior.mes;
		hjano = data_limite_maior.ano;
	}

	var dt_ini = new Date(hjano, hjmes, 1, 12, 0, 0);
	if(dt_ini.getDay() > 1)
		dt_ini.setDate(-(dt_ini.getDay() - 2));
	else if(dt_ini.getDay() == 0)
		dt_ini.setDate(-5);
	
	var tab = document.getElementById(calId);
	tab.setAttribute("dtano", hjano);
	tab.setAttribute("dtmes", hjmes);
	var tbody = tab.firstChild;	

	//Verifica se possui botões de controle
	var btnControle = (tab.getAttribute("btnControle")=="sim" ? true:false);
	
	var spanmes, spanano;
	if(btnControle) {
		spanmes = tbody.firstChild.childNodes[1].firstChild;
		spanano = tbody.firstChild.childNodes[2].firstChild;
	} else {
		spanmes = tbody.firstChild.childNodes[0].firstChild;
		spanano = tbody.firstChild.childNodes[1].firstChild;
	}

	//mostra mês
	spanmes.innerHTML = mesesNome[hjmes];

	//mostra mês
	spanano.innerHTML = hjano;
	
	var dtdia = dt_ini;
	for(var row = 2;row < 8;row++) {
		var tr = tbody.childNodes[row];
		for(var col = 0; col < 7; col++) {
			var td = tr.childNodes[col];
			var mes_data = dtdia.getMonth();
			var ano_data = dtdia.getFullYear();
			var dia_data = dtdia.getDate();
			td.innerHTML = dia_data;
			var diaValido = true;
			if((data_limite_menor.ano == ano_data && data_limite_menor.mes == (mes_data) &&
				dia_data < data_limite_menor.dia) || 
				(data_limite_maior.ano == ano_data && data_limite_maior.mes == (mes_data) &&
				dia_data > data_limite_maior.dia)) {
				diaValido = false;
			}

			var dia_semana = dtdia.getDay();
			if(diaValido && mes_data == hjmes) {
				var usarClass = classeParaDoDiaSemana(dia_semana, false);
				td.className = usarClass;
				td.onclick = eventOnClickDay;
			}
			else {
				td.className = classeParaDoDiaSemana(dia_semana, true);
				td.onclick = eventOnClickDayDes;
			}
			//Guarda className
			td.setAttribute("tdclass", td.className);

			var diatmp = dtdia.getDate();
			var mestmp = dtdia.getMonth();
			var anotmp = dtdia.getFullYear();
			td.setAttribute("dtdia", diatmp);
			td.setAttribute("dtmes", mestmp);
			td.setAttribute("dtano", anotmp);
			td.title = returnaDataLongaFormatada(diatmp, mestmp, anotmp);

			dtdia.setDate(dtdia.getDate()+1);
		}
	}	

}

function classeParaDoDiaSemana(dia, des) {
	if(dia == 0)
		return "dia_valor_domingo" + (des ? "_des":"");
	else if(dia == 6)
		return "dia_valor_sabado" + (des ? "_des":"");
	else
		return "dia_valor" + (des ? "_des":"");
}

var eventOnClickDay = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	while(src.tagName != "TD") src = src.parentNode;
	var dia = parseInt(src.getAttribute("dtdia"));
	var mes = parseInt(src.getAttribute("dtmes"));
	var ano = parseInt(src.getAttribute("dtano"));	
	try {
		escolheuUmaData(dia, mes, ano);
	}
	catch(er) {
		alert("Você deve fornecer uma função escolheuUmaData(dia, mes, ano)!");
	}
}

var eventOnClickDayDes = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	while(src.tagName != "TD") src = src.parentNode;
	var dia = parseInt(src.getAttribute("dtdia"));
	var mes = parseInt(src.getAttribute("dtmes"));
	var ano = parseInt(src.getAttribute("dtano"));	
	var pai = src.parentNode;
	while(pai.tagName != "TABLE") pai = pai.parentNode;
	setarMes(pai.id, mes, ano);
}

var moverParaMes = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	while(src.tagName != "TD") src = src.parentNode;
	var mover = parseInt(src.getAttribute("mover"));
	var pai = src.parentNode;
	while(pai.tagName != "TABLE") pai = pai.parentNode;
	moverMes(pai, mover);
}

function moverMes(tab, mover) {
	var mes = parseInt(tab.getAttribute("dtmes"));
	var ano = parseInt(tab.getAttribute("dtano"));
	var dttmp = new Date(ano, mes + mover, 1, 12, 0, 0);
	mes = dttmp.getMonth();
	ano = dttmp.getFullYear(); 
	var comp = compararComDatasLimites(mes, ano);
	if(compararComDatasLimites(mes, ano) == 0)
		setarMes(tab.id, mes, ano);
}

var eventoExibirSelectMesAno = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	var pai = src.parentNode;
	while(pai.tagName != "TABLE")
		pai = pai.parentNode;
	var mes = parseInt(pai.getAttribute("dtmes"));
	var ano = parseInt(pai.getAttribute("dtano"));
	exibirSelectMesAno(pai.id, mes, ano);
}

var eventEsconderSelectMesAno = function(e) {
	var evento = (window.event ? window.event : e);
	var src = (window.event ? event.srcElement : e.target);
	var pai = src.parentNode;
	while(pai && pai.tagName != "TABLE") pai = pai.parentNode;
	if(pai) {	
		var rect = retornarElementRect(pai);
		if(!(evento.clientX - 2 > rect.left && evento.clientX < rect.right &&
			evento.clientY - 2 > rect.top && evento.clientY < rect.bottom)) {
			pai.style.visibility = "hidden";
		}
	}
}

var eventSelecionarMesAno = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	while(src.tagName != "TD") src = src.parentNode;
	var mes = parseInt(src.getAttribute("dtmes"));
	var ano = parseInt(src.getAttribute("dtano"));
	var pai = src.parentNode;
	while(pai.tagName != "TABLE")
		pai = pai.parentNode;
	pai.style.visibility = "hidden";
	var calId = pai.getAttribute("calid");
	setarMes(calId, mes, ano);
}

var rolarSelectMesAno = {rolar:false, mes:0, ano:0, mover:1, calId:"", tipo:"mes"}
var eventRolarSelectMesAno = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	while(src.tagName != "TD") src = src.parentNode;
	var mover = parseInt(src.getAttribute("mover"));
	var pai = src.parentNode;
	while(pai.tagName != "TABLE") pai = pai.parentNode;
	var mes = parseInt(pai.getAttribute("dtmes"));
	var ano = parseInt(pai.getAttribute("dtano"));
	rolarSelectMesAno.rolar = true;
	rolarSelectMesAno.mes = mes;
	rolarSelectMesAno.ano = ano;
	rolarSelectMesAno.mover = mover;
	rolarSelectMesAno.calId = pai.getAttribute("calid");
	if(rolarSelectMesAno.tipo == "mes")
		setTimeout("rolarMesesAno()", 150);
	else
		setTimeout("rolarAnos()", 150);
}

var eventPararRolarSelectMesAno = function(e) {
	rolarSelectMesAno.rolar = false;
}

function rolarMesesAno() {
	if(rolarSelectMesAno.rolar) {
		var mes = rolarSelectMesAno.mes;
		var ano = rolarSelectMesAno.ano;
		var mover = rolarSelectMesAno.mover;
		var dttmp = new Date(ano, mes + mover, 1, 12, 0, 0);
		mes = dttmp.getMonth();
		ano = dttmp.getFullYear(); 
		var test_mes = (mover < 0 ? mes : mes + 6);
		if(compararComDatasLimites(test_mes, ano) == 0) {
			exibirSelectMesAno(rolarSelectMesAno.calId, mes, ano);
			rolarSelectMesAno.mes = mes;
			rolarSelectMesAno.ano = ano;
			setTimeout("rolarMesesAno();", 150);
		}
	}
}

function exibirSelectMesAno(calId, mes, ano) {
	var nummes = 7;
	var tab = document.getElementById("calendar_lista_mes_ano");
	if(!tab) {
		criarSelectMesAno();
		tab = document.getElementById("calendar_lista_mes_ano");
	}
	if(tab.style.visibility != "visible") {
		//posicionar tabela
		var tabCal = document.getElementById(calId);
		var rect = retornarElementRect(tabCal);
		tab.style.top = rect.top - 15;
		tab.style.left = rect.left + parseInt(rect.width / 2 - tab.clientWidth / 2);
	}

	//valida mes e ano
	var tsmes = (mes + nummes) % 12;
	var tsano = ano + parseInt((mes + nummes) / 12);
	var comp = compararComDatasLimites(tsmes, tsano);
	if(comp > 0) {
		mes -= (comp - 1);
		if(mes < 0) {
			mes = 12 + mes;
			ano--;
		}
	}
		
	tab.setAttribute("dtano", ano);
	tab.setAttribute("dtmes", mes);	
	tab.setAttribute("calid", calId);
	rolarSelectMesAno.tipo = "mes";
	
	var tbody = tab.firstChild;
	
	for(var row=1;row <= nummes;row++) {
		var tr = tbody.childNodes[row];
		tr.style.display = "";
		var td = tr.firstChild;
		td.innerHTML = mesesNome[mes] + " " + ano;
		td.setAttribute("dtmes", mes);
		td.setAttribute("dtano", ano);
		mes++;
		if(mes == 12) {
			mes = 0;
			ano++;
		}
	}

	//exibir tabela
	tab.style.visibility = "visible";
}

var eventExibirSelectAno = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	var pai = src.parentNode;
	while(pai.tagName != "TABLE")
		pai = pai.parentNode;
	var mes = parseInt(pai.getAttribute("dtmes"));
	var ano = parseInt(pai.getAttribute("dtano"));
	exibirSelectAno(pai.id, mes, ano);
}

function rolarAnos() {
	if(rolarSelectMesAno.rolar) {
		var mes = rolarSelectMesAno.mes;
		var ano = rolarSelectMesAno.ano;
		var mover = rolarSelectMesAno.mover;
		ano+=mover;
		var test_ano = (mover < 0 ? ano : ano + 6);
		if(compararComDatasLimites(0, test_ano) == 0) {
			exibirSelectAno(rolarSelectMesAno.calId, mes, ano);
			rolarSelectMesAno.mes = mes;
			rolarSelectMesAno.ano = ano;
			setTimeout("rolarAnos();", 150);
		}
	}
}

function exibirSelectAno(calId, mes, ano) {
	var numano = 7;
	var tab = document.getElementById("calendar_lista_mes_ano");
	if(!tab) {
		criarSelectMesAno();
		tab = document.getElementById("calendar_lista_mes_ano");
	}
	if(tab.style.visibility != "visible") {
		//posicionar tabela
		var tabCal = document.getElementById(calId);
		var rect = retornarElementRect(tabCal);
		tab.style.top = rect.top - 15;
		tab.style.left = rect.left + parseInt(rect.width / 2 - tab.clientWidth / 2);
	}

	//valida mes e ano
	var tsano = ano + (numano-1);
	var comp = compararComDatasLimites(1, tsano);
	if(comp > 0) {
		ano -= Math.round(comp / 12 + 0.49999);
	}
	if(ano < data_limite_menor.ano)
		ano = data_limite_menor.ano;
		
	tab.setAttribute("dtmes", mes);
	tab.setAttribute("dtano", ano);
	tab.setAttribute("calid", calId);
	rolarSelectMesAno.tipo = "ano";
	
	var tbody = tab.firstChild;
	
	for(var row=1;row <= numano;row++) {
		var tr = tbody.childNodes[row];
		var td = tr.firstChild;
		if(ano <= data_limite_maior.ano) {
			td.setAttribute("dtmes", mes);
			td.setAttribute("dtano", ano);
			td.innerHTML = ano;
			tr.style.display = "";
		}
		else {
			td.removeAttribute("dtmes");
			td.removeAttribute("dtano");
			tr.style.display = "none";
		}
		ano++;
	}

	//exibir tabela
	tab.style.visibility = "visible";
}


function criarSelectMesAno() {
	var tab = document.createElement("TABLE");
	tab.id = "calendar_lista_mes_ano";
	tab.cellSpacing = 0;
	tab.cellPadding = 2;
	tab.style.visibility = "hidden";
	tab.style.border = "1px solid #000000";
	tab.style.position = "absolute";
	tab.style.top = 0;
	tab.style.left = 20;
	tab.width = 110;
	tab.border=0;
	tab.onmouseout = eventEsconderSelectMesAno;
	var tbody = document.createElement("TBODY");
	for(var row=0;row<9;row++) {
		var tr = document.createElement("TR");
		var td = document.createElement("TD");
		td.className="par_mes_ano";
		td.align="center";
		if(row == 0) {
			var img = document.createElement("IMG");
			img.src = "seta_cima.gif";
			img.border = 0;
			td.appendChild(img);
			td.style.backgroundColor = "#F0F0F0";
			td.style.padding = "5px";
			td.setAttribute("mover", -1);
			td.onmouseover = eventRolarSelectMesAno;
			td.onmouseout = eventPararRolarSelectMesAno;
		} else if(row == 8) {
			var img = document.createElement("IMG");
			img.src = "seta_baixo.gif";
			img.border = 0;
			td.appendChild(img);
			td.style.padding = "5px";
			td.style.backgroundColor = "#F0F0F0";
			td.setAttribute("mover", 1);
			td.onmouseover = eventRolarSelectMesAno;
			td.onmouseout = eventPararRolarSelectMesAno;
		} else {
			td.onmouseover = function() {this.className="par_mes_ano_sel";}
			td.onmouseout = function() {this.className="par_mes_ano";}
			td.onclick = eventSelecionarMesAno;
		}
		tr.appendChild(td);
		tbody.appendChild(tr);
	}
	tab.appendChild(tbody);
	document.body.appendChild(tab);
}

function compararComDatasLimites(mes, ano) {
	if(ano < data_limite_menor.ano || 
	(ano == data_limite_menor.ano && mes < data_limite_menor.mes)) {
		var diff = (ano * 12 + mes + 1) - (data_limite_menor.ano * 12 + data_limite_menor.mes + 1);
		return diff;
	}
	else if(ano > data_limite_maior.ano || 
	(ano == data_limite_maior.ano && mes > data_limite_maior.mes)) {
		var diff = (ano * 12 + mes + 1) - (data_limite_maior.ano * 12 + data_limite_maior.mes + 1);
		return diff;
	}
	else {
		return 0;
	}
}

function retornarElementRect(elem) {
	var pai = elem.offsetParent;
	var px = elem.offsetLeft;
	var py = elem.offsetTop;
	while(pai) {
		px += pai.offsetLeft;
		py += pai.offsetTop;
		pai = pai.offsetParent;
	}
	return {left:px, top:py, width:elem.clientWidth, height:elem.offsetHeight,
		right:px+elem.clientWidth, bottom:py+elem.offsetHeight};
}

function returnaDataFormatada(dia, mes, ano) {
	var mask = formato_data;
	//substituir dia
	var dia1 = "" + dia;
	var dia2 = (dia < 10 ? "0" + dia: dia1);
	var re = /dd/g;
	var result = mask.replace(re, dia2);
	re = /d/g;
	result = result.replace(re, dia1);
	//substituir mes
	var norm_mes = mes + 1;
	var mes1 = "" + norm_mes;
	var mes2 = (norm_mes < 10 ? "0" + norm_mes: mes1);
	re = /mm/g;
	result = result.replace(re, mes2);
	re = /m/g;
	result = result.replace(re, mes1);
	//substituir ano
	var aa_ano = (ano % 100);
	var ano1 = (aa_ano < 10 ? "0" + aa_ano: "" + aa_ano);
	var ano2 = "" + ano;
	re = /aaaa/g;
	result = result.replace(re, ano2);
	re = /aa/g;
	result = result.replace(re, ano1);	
	return(result);
}

function returnaDataLongaFormatada(dia, mes, ano) {
	var dttmp = new Date(ano, mes, dia, 12, 0, 0);
	var mask = formato_data_longa;
	//substituir dia da semana
	var re = /dddd/g;
	var result = mask.replace(re, titDia[dttmp.getDay()]);
	//substituir nome do mês
	re = /mmmm/g;
	result = result.replace(re, mesesNome[dttmp.getMonth()]);
	//substituir dia
	var dia1 = "" + dia;
	var dia2 = (dia < 10 ? "0" + dia: dia1);
	re = /dd/g;
	result = result.replace(re, dia2);
	//substituir mes
	var norm_mes = mes + 1;
	var mes1 = "" + norm_mes;
	var mes2 = (norm_mes < 10 ? "0" + norm_mes: mes1);
	re = /mm/g;
	result = result.replace(re, mes2);
	//substituir ano
	var aa_ano = (ano % 100);
	var ano1 = (aa_ano < 10 ? "0" + aa_ano: "" + aa_ano);
	var ano2 = "" + ano;
	re = /aaaa/g;
	result = result.replace(re, ano2);
	re = /aa/g;
	result = result.replace(re, ano1);	
	return(result);
}

// para interação entre pai e filho
function setarDatasLimite(me_dia, me_mes, me_ano, ma_dia, ma_mes, ma_ano) {
	data_limite_menor.dia = me_dia;
	data_limite_menor.mes = me_mes;
	data_limite_menor.ano = me_ano;
	data_limite_maior.dia = ma_dia;
	data_limite_maior.mes = ma_mes;
	data_limite_maior.ano = ma_ano;
}

function escolheuUmaData(dia, mes, ano) {
	var txtdata = returnaDataFormatada(dia, mes, ano);
	parent.escolheuUmaData(dia, mes, ano, txtdata);
}
function esconderCalendario() {
	parent.esconderCalendario();
}
