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 exibirCalendario(elem) {
	var bd = document.body;
	var rect = retornarElementRect(elem);
	var frm = document.getElementById("frmcalendario");
	var frmrect = retornarElementRect(frm);
	var topo = rect.bottom;
	if((topo + frmrect.height) > (bd.clientHeight + bd.scrollTop))
		topo -= (topo + frmrect.height + 10) - (bd.clientHeight + bd.scrollTop);
	else if(topo < bd.scrollTop)
		topo = bd.scrollTop + 10;
	var esq = rect.right - frmrect.width + 4;
	if((esq + frmrect.width) > (bd.clientWidth + bd.scrollLeft))
		esq -= (esq + frmrect.width + 10) - (bd.clientWidth + bd.scrollLeft);
	else if(esq < bd.scrollLeft)
		esq = bd.scrollLeft+10;
	frm.style.left = esq;
	frm.style.top = topo;

	//setar datas limites
	var txt = document.getElementById(elem.getAttribute("idtext"));
	var li = datasLimitesDoCampo(txt);
	frm.contentWindow.setarDatasLimite(li.menor.dia, li.menor.mes, li.menor.ano, 
		li.maior.dia, li.maior.mes, li.maior.ano);

	//exibir mês e ano da valor que está no campo
	var dtcmp = dataDoCampo(txt);
	if(dtcmp.dia == 0) {
		dtcmp.mes = li.menor.mes;
		dtcmp.ano = li.menor.ano;
	}
	frm.contentWindow.exibirMesAno(dtcmp.mes, dtcmp.ano);
		
	//exibir iframe	
	frm.setAttribute("idtext", elem.getAttribute("idtext"));
	frm.style.visibility = "visible";
}

var eventExibirCalendario = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	exibirCalendario(src);
}

function escolheuUmaData(dia, mes, ano, txtdata) {
	var frm = document.getElementById("frmcalendario");
	var txt = document.getElementById(frm.getAttribute("idtext"));
	txt.value = txtdata;
	atualizarCamposFilhos(txt);
	esconderCalendario();
}

function esconderCalendario() {
	var frm = document.getElementById("frmcalendario");
	frm.style.visibility = "hidden";
}

function iniciarCalendario() {
	var frm = document.getElementById("frmcalendario");
	var imgsrc = "calendario/dd_btn.gif";
	var txts = document.body.getElementsByTagName("INPUT");
	for(var t = 0; t < txts.length; t++) {
		var txt = txts[t];
		if(txt.type == "text" && txt.getAttribute("setarcalendario") == "sim") {
			var img = document.createElement("IMG");
			img.src = imgsrc;
			img.width=26;
			img.height=15;
			img.border=0;
			img.setAttribute("idtext", txt.id);
			img.onclick = eventExibirCalendario;
			
			var rect = retornarElementRect(txt);
			img.style.position = "absolute";
			img.style.left = rect.right - 27;
			img.style.top = rect.top + parseInt(rect.height / 2 - 7.5);

			var pai = txt.parentNode;
			pai.appendChild(img);
			
			//registrar evento de validação
			txt.onchange = eventValidaDataEntrada;
			
			//iniciar valor
			if(!txt.value) {
				var li = datasLimitesDoCampo(txt);
				txt.value = frm.contentWindow.returnaDataFormatada(li.menor.dia, li.menor.mes, li.menor.ano);
			}
		}
	}
}

//eventos para a caixa de texto
var eventValidaDataEntrada = function(e) {
	var src = (window.event ? event.srcElement : e.target);
	validarDataEntrada(src);
}

//eventos para a caixa de texto
function validarDataEntrada(src) {
	var frm = document.getElementById("frmcalendario");
	
	//localiza posição dos valores
	var novoValor = "";
	var dia = 0, mes = 0, ano = 0
	var dtCmp = dataDoCampo(src);
	dia = dtCmp.dia;
	mes = dtCmp.mes;
	ano = dtCmp.ano;
	if(dia > 0 && ano > 0) {
		//valida valores
		if(ano > 0 && ano < 100)
			ano = ano + (ano > 50 ? 1900:2000);
		if(ano > 1900 && mes >= 0) {
			var data = criarData(dia, mes, ano);
			dia = data.getDate();
			mes = data.getMonth();
			ano = data.getFullYear();
			
			//validar com datas de limite
			var li = datasLimitesDoCampo(src);
			if(ano < li.menor.ano)
				ano = li.menor.ano;
			if(ano == li.menor.ano && mes < li.menor.mes)
				mes = li.menor.mes;
			if(ano == li.menor.ano && mes == li.menor.mes & dia < li.menor.dia)
				dia = li.menor.dia;
			if(ano > li.maior.ano)
				ano = li.maior.ano;
			if(ano == li.maior.ano && mes > li.maior.mes)
				mes = li.maior.mes;
			if(ano == li.maior.ano && mes == li.maior.mes & dia > li.maior.dia)
				dia = li.maior.dia;
							
			//novo valor
			novoValor = frm.contentWindow.returnaDataFormatada(dia, mes, ano);
			atualizarCamposFilhos(src);
		}
	}
	src.value = novoValor;
}

function atualizarCamposFilhos(pai) {
	var dmsrc = parseInt(pai.getAttribute("diasmenor"));
	if(!isNaN(dmsrc)) {
		var dtpai = dataDoCampo(pai);
		var frm = document.getElementById("frmcalendario");
		var txts = document.body.getElementsByTagName("INPUT");
		for(var t = 0; t < txts.length; t++) {
			var txt = txts[t];
			if(txt.type == "text" && txt.getAttribute("camporegra") == pai.id) {
				var dmecmp = parseInt(txt.getAttribute("diasmenor"));
				if(!isNaN(dmecmp)) {
					var diff = dmecmp - dmsrc;
					var data = criarData(dtpai.dia + diff, dtpai.mes, dtpai.ano);
					var dia = data.getDate();
					var mes = data.getMonth();
					var ano = data.getFullYear();
					var dtsrc = dataDoCampo(txt);
					if(dtsrc.ano < ano || (dtsrc.ano == ano && dtsrc.mes < mes) ||
			   		  (dtsrc.ano == ano && dtsrc.mes == mes && dtsrc.dia < dia) ) {
						var novoValor = frm.contentWindow.returnaDataFormatada(dia, mes, ano);
						txt.value = novoValor;
					}
				}
			}
		}
	}
}

//funções para o campo de texto
function datasLimitesDoCampo(txt) {
	var diasmenor = parseInt(txt.getAttribute("diasmenor"));
	var me_dia =1, me_mes=0, me_ano=1900;
	if(!isNaN(diasmenor)) {
		var camporegra = document.getElementById(txt.getAttribute("camporegra"));
		var diff = diasmenor;
		var hoje = new Date();
		if(camporegra) {
			var dtpai = dataDoCampo(camporegra);
			if(dtpai.dia > 0) {
				hoje = criarData(dtpai.dia, dtpai.mes, dtpai.ano);
				var dmpai = parseInt(camporegra.getAttribute("diasmenor"));
				if(!isNaN(dmpai))
					diff -= dmpai;
			}
		}
		hoje.setDate(hoje.getDate() + diff);
		me_dia = hoje.getDate();
		me_mes = hoje.getMonth();
		me_ano = hoje.getFullYear();
	}
	var diasmaior = parseInt(txt.getAttribute("diasmaior"));
	var ma_dia =31, ma_mes=11, ma_ano=3000;
	if(!isNaN(diasmaior)) {
		var hoje = new Date();
		hoje.setDate(hoje.getDate() + diasmaior);
		ma_dia = hoje.getDate();
		ma_mes = hoje.getMonth();
		ma_ano = hoje.getFullYear();
	}
	return {menor:{dia:me_dia,mes:me_mes,ano:me_ano},
			maior:{dia:ma_dia,mes:ma_mes,ano:ma_ano}};

}

function dataDoCampo(txt) {
	var frm = document.getElementById("frmcalendario");
	var formato_data = frm.contentWindow.formato_data;
	//localiza posição dos valores
	var dia = 0, mes = 0, ano = 0;
	var re = /(\w+)[\/\-\.\s](\w+)[\/\-\.\s](\w+)/;
	var mat = re.exec(formato_data);
	if(mat) {
		var txtdata = txt.value;	
		var re2 = /(\d+)[\/\-\.\s](\d+)[\/\-\.\s](\d+)/;
		var mat2 = re2.exec(txtdata);
		if(mat2) {
			for(var i = 1;i < mat.length;i++) {
				if(mat[i] == "dd") {
					dia = parseFloat(mat2[i]);
				} else if(mat[i] == "mm") {
					mes = parseFloat(mat2[i]) - 1;
				} else if(mat[i] == "aa" || mat[i] == "aaaa") {
					ano = parseFloat(mat2[i]);
				}
			}
		}
	}
	return {dia:dia,mes:mes,ano:ano};
}

function criarData(dia, mes, ano) {
	var data = new Date(ano, mes, dia);
	return data;
}
