// offsetWidth, offsetHeight
// clientWidth, clientHeight
// scrollWidth, scrollHeight
// scrollLeft, scrollTop

var c_arrDayNames = new Array("dom","seg","ter","qua","qui","sex","sab"); // titulo de cada dia
var c_arrDayClass = new Array("sun","mon","tue","wed","thu","fri","sat"); // className do titulo de cada dia
var c_arrMonths = new Array("Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
var c_arrMonthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31); // adicionar 1 dia para janeiro em ano bisexto
var c_arrNums = new Array(42);

var c_labelToday = "hoje"; // texto para o link "today"
var c_labelClear = "limpar"; // texto para o link "clear"
var c_labelNextY = "&raquo;"; // texto para o link "next year"
var c_labelPrevY = "&laquo;"; // texto para o link "prev year"
var c_labelNextM = "&raquo;"; // texto para o link "next month"
var c_labelPrevM = "&laquo;"; // texto para o link "prev month"

var c_errTarget = "O campo que receberá a data não foi encontrado!"; // descricao do erro quando nao encontra o objTarget

var c_pastLinks // disponibilidade das datas para escolha; 0=livre; 1=apenas datas futuras; 2=apenas datas passadas;
var c_yearFirst // primeiro ano disponivel para navegacao
var c_yearLast // ultimo ano disponivel para navegacao

var c_actualDate // data em uso (muda durante o uso do calendario)
var c_actualD // dia da data em uso
var c_actualM // mes da data em uso
var c_actualY // ano da data em uso
var c_selDate // data ja selecionada ou digitada no campo
var c_selD // dia da data selecionada
var c_selM // mes da data selecionada
var c_selY // ano da data selecionada
var c_todayDate // data de hoje
var c_todayD // dia da data de hoje
var c_todayM // mes da data de hoje
var c_todayY // ano da data de hoje
var c_function // string com nome da funcao

var c_objBody,c_DivCalendar,c_DivHeader,c_DivGrid,c_DivPlus,c_objTarget,c_objReference
var c_Span_prevMonth,c_A_prevMonth,c_SelectMonth,c_Span_nextMonth,c_A_nextMonth
var c_Span_prevYear,c_A_prevYear,c_SelectYear,c_Span_nextYear,c_A_nextYear
var c_Span_linkToday,c_A_linkToday,c_Span_linkClear,c_A_linkClear




// ##################################################
// funcao calendario (configura o calendario preparando para inicializacao)
// cP_actualDate = data selecionada; valor preenchido no campo;
// cP_objTarget = input que recebera a data. Ex: inpuText.value = dataEscolhida;
// cP_objReference = objeto que será referência de posicao para o calendario (left, top);
// cP_pastLinks = tipo de datas aceitas. 0=livre; 1=apenas datas futuras; 2=apenas datas passadas;
// cP_yearFirst = primeiro ano disponivel para navegacao;
// cP_yearLast = ultimo ano disponivel para navegacao;
// cP_function = nome de uma funcao a ser executada apos selecionada uma data;
function c_Calendario(cP_actualDate,cP_today,cP_objTarget,cP_objReference,cP_pastLinks,cP_yearFirst,cP_yearLast,cP_function){
	// valida os objetos
	c_objTarget = c_getObj(cP_objTarget);
	if(!c_objTarget){ alert(c_errTarget); return false; }
	c_objTarget.select();
	
	c_objReference = c_getObj(cP_objReference);
	if(!c_objReference){ c_objReference=document.body; }
	
	c_function = String(cP_function);
	c_pastLinks = Number(cP_pastLinks);
	cP_actualDate = String(cP_actualDate);
	cP_today = String(cP_today);
	
	// **************************************************
	
	// valida a data de hoje
	c_cond=false;
	if(cP_today.length==10){ // minimo 10 caracteres
		if((cP_today.indexOf("/")==2)&&(cP_today.lastIndexOf("/")==5)){ // barras na posicao correta, formato dd/mm/aaaa
			cP_today=cP_today.split("/");
			c_todayD=Number(cP_today[0]);
			c_todayM=Number(cP_today[1]);
			c_todayY=Number(cP_today[2]);
			if(!isNaN(c_todayD) && !isNaN(c_todayM) && !isNaN(c_todayY)){ // verifica os numeros (se houver erro pega a data mais proxima)
				if(c_todayD<1){ c_todayD=1; }
				if(c_todayD>31){ c_todayD=31; }
				if(c_todayM<1){ c_todayM=1; }
				if(c_todayM>12){ c_todayM=12; }
				if(c_todayY<1500){ c_todayY=1500; }
				
				c_todayM--; // no javascript os meses vao de 0 a 11
				c_todayDate = new Date(c_todayY,c_todayM,c_todayD,0,0,0,0)
				c_todayD = Number(c_todayDate.getDate());
				c_todayM = Number(c_todayDate.getMonth());
				c_todayY = Number(c_todayDate.getFullYear());
				c_cond=true;
			}
		}
	}
	if(!c_cond){
		// se nao validar, pega a hora do computador do cliente (NAO RECOMENDAVEL)
		c_todayDate = new Date();
		c_todayDate.setHours(0,0,0,0);
		c_todayD=Number(c_todayDate.getDate());
		c_todayM=Number(c_todayDate.getMonth());
		c_todayY=Number(c_todayDate.getFullYear());
	}
	
	// **************************************************
	
	// valida a data selecionada
	c_cond=false; cP_selDate=cP_actualDate;
	if(cP_selDate.length==10){ // minimo 10 caracteres
		if((cP_selDate.indexOf("/")==2)&&(cP_selDate.lastIndexOf("/")==5)){ // barras na posicao correta, formato dd/mm/aaaa
			cP_selDate=cP_selDate.split("/");
			c_selD=Number(cP_selDate[0]);
			c_selM=Number(cP_selDate[1]);
			c_selY=Number(cP_selDate[2]);
			if(!isNaN(c_selD) && !isNaN(c_selM) && !isNaN(c_selY)){ // verifica os numeros (se houver erro pega a data mais proxima)
				if(c_selD<1){ c_selD=1; }
				if(c_selD>31){ c_selD=31; }
				if(c_selM<1){ c_selM=1; }
				if(c_selM>12){ c_selM=12; }
				if(c_selY<100){ c_selY=100; }
				
				c_selM--; // no javascript os meses vao de 0 a 11
				c_selDate = new Date(c_selY,c_selM,c_selD,0,0,0,0)
				c_selD = Number(c_selDate.getDate());
				c_selM = Number(c_selDate.getMonth());
				c_selY = Number(c_selDate.getFullYear());
				c_cond=true;
			}
		}
	}
	if(!c_cond){ c_selDate=""; c_selD=""; c_selM=""; c_selY=""; }
	
	// **************************************************
	
	// valida a data em uso
	c_cond=false;
	if(cP_actualDate.length==10){ // minimo 10 caracteres
		if((cP_actualDate.indexOf("/")==2)&&(cP_actualDate.lastIndexOf("/")==5)){ // barras na posicao correta, formato dd/mm/aaaa
			cP_actualDate=cP_actualDate.split("/");
			c_actualD=Number(cP_actualDate[0]);
			c_actualM=Number(cP_actualDate[1]);
			c_actualY=Number(cP_actualDate[2]);
			if(!isNaN(c_actualD) && !isNaN(c_actualM) && !isNaN(c_actualY)){ // verifica os numeros (se houver erro pega a data mais proxima)
				if(c_actualD<1){ c_actualD=1; }
				if(c_actualD>31){ c_actualD=31; }
				if(c_actualM<1){ c_actualM=1; }
				if(c_actualM>12){ c_actualM=12; }
				if(c_actualY<100){ c_actualY=100; }
				
				c_actualM--; // no javascript os meses vao de 0 a 11
				c_actualDate = new Date(c_actualY,c_actualM,c_actualD,0,0,0,0);
				c_actualD = Number(c_selDate.getDate());
				c_actualM = Number(c_selDate.getMonth());
				c_actualY = Number(c_selDate.getFullYear());
				c_cond=true;
			}
		}
	}
	if(!c_cond){ c_actualDate=c_todayDate; c_actualD=c_todayD; c_actualM=c_todayM; c_actualY=c_todayY; }
	
	// **************************************************
	
	// valida o intervalo de anos disponiveis
	c_yearFirst = Number(cP_yearFirst);
	c_yearLast = Number(cP_yearLast);
	
	if(isNaN(c_yearFirst)){ c_yearFirst=1900; } // valor padrao
	if(isNaN(c_yearLast)){ c_yearLast=2100; } // valor padrao
	
	if(c_yearFirst<100){ c_yearFirst=100; }
	if(c_yearLast>9999){ c_yearLast=9999; }
	
	// **************************************************
	
	// valida pastLinks
	if(isNaN(c_pastLinks)){ c_pastLinks=0; } // valor padrao
	
	// nao aceita anos passados
	if(c_pastLinks==1){
		if(c_yearFirst<c_todayY){ c_yearFirst=c_todayY; }
		if(c_yearLast<c_todayY){ c_yearLast=c_todayY; }
	}
	
	// nao aceita anos futuros
	if(c_pastLinks==2){
		if(c_yearFirst>c_todayY){ c_yearFirst=c_todayY; }
		if(c_yearLast>c_todayY){ c_yearLast=c_todayY; }
	}
	
	// **************************************************
	
	// monta o HTML do calendario
	c_fncInitialize();
}





// ##################################################
// inicializa o calendario (escreve o html e mostra o div)
function c_fncInitialize(){
	// theObject.setAttribute("attributeName","attributeValue")
	// theObject.getAttribute("attributeName")
	// theObject.removeAttribute("attributeName")
	// theObject.className = "className"
	// theObject.onclick = function() { yourCode; return false; }
	
	c_fncSHSelects("hidden");
	c_objBody = document.body;
	
	// **************************************************
	
	// cria o div principal c_calendar vazio
	if(c_getObj("c_calendar")){
		c_DivCalendar = c_getObj("c_calendar");
		c_DivCalendar.innerHTML = "";
	}else{
		c_DivCalendar = document.createElement("div");
		c_DivCalendar.setAttribute("id","c_calendar");
		c_objBody.appendChild(c_DivCalendar);
	}
	c_DivCalendar.style.display = "block";
	
	// **************************************************
	
	// cria div class c_header
	c_DivHeader = document.createElement("div");
	c_DivHeader.className = " c_header";
		// span prevMonth
		c_Span_prevMonth = document.createElement("span");
		c_Span_prevMonth.setAttribute("id","c_link_prevMonth");
		c_DivHeader.appendChild(c_Span_prevMonth);
			// link prevMonth
			c_A_prevMonth = document.createElement("a");
			c_A_prevMonth.setAttribute("href","javascript:;");
			c_A_prevMonth.innerHTML = c_labelPrevM;
			c_A_prevMonth.className = "c_off";
			c_Span_prevMonth.appendChild(c_A_prevMonth);
			c_Span_prevMonth.appendChild(document.createTextNode(" "));
		
		// select months
		c_SelectMonth = document.createElement("select");
		c_SelectMonth.onchange = function() { c_fncChangeMonth(this.value); }
		c_DivHeader.appendChild(c_SelectMonth);
			// options months
			for(c_Counter=0; c_Counter<c_arrMonths.length; c_Counter++){
				c_SelectMonth.options[c_SelectMonth.length++] = new Option(c_arrMonths[c_Counter],c_Counter);
			}
		
		// span nextMonth
		c_Span_nextMonth = document.createElement("span");
		c_Span_nextMonth.setAttribute("id","c_link_nextMonth");
		c_DivHeader.appendChild(c_Span_nextMonth);
			// link nextMonth
			c_A_nextMonth = document.createElement("a");
			c_A_nextMonth.setAttribute("href","javascript:;");
			c_A_nextMonth.innerHTML = c_labelNextM;
			c_A_nextMonth.className = "c_off";
			c_Span_nextMonth.appendChild(document.createTextNode(" "));
			c_Span_nextMonth.appendChild(c_A_nextMonth);
		
		// separador
		c_DivHeader.appendChild(document.createTextNode(" | "));
		
		// span prevYear
		c_Span_prevYear = document.createElement("span");
		c_Span_prevYear.setAttribute("id","c_link_prevYear");
		c_DivHeader.appendChild(c_Span_prevYear);
			// link prevYear
			c_A_prevYear = document.createElement("a");
			c_A_prevYear.setAttribute("href","javascript:;");
			c_A_prevYear.innerHTML = c_labelPrevY;
			c_A_prevYear.className = "c_off";
			c_Span_prevYear.appendChild(c_A_prevYear);
			c_Span_prevYear.appendChild(document.createTextNode(" "));
		
		// select years
		c_SelectYear = document.createElement("select");
		c_SelectYear.onchange = function() { c_fncChangeYear(this.value); }
		c_DivHeader.appendChild(c_SelectYear);
			// options years
			for(c_Counter=c_yearFirst; c_Counter<=c_yearLast; c_Counter++){
				c_SelectYear.options[c_SelectYear.length++] = new Option(c_Counter,c_Counter);
			}
		
		// span nextYear
		c_Span_nextYear = document.createElement("span");
		c_Span_nextYear.setAttribute("id","c_link_nextYear");
		c_DivHeader.appendChild(c_Span_nextYear);
			// link nextYear
			c_A_nextYear = document.createElement("a");
			c_A_nextYear.setAttribute("href","javascript:;");
			c_A_nextYear.innerHTML = c_labelNextY;
			c_A_nextYear.className = "c_off";
			c_Span_nextYear.appendChild(document.createTextNode(" "));
			c_Span_nextYear.appendChild(c_A_nextYear);
	
	// finaliza e adiciona div c_header
	c_DivCalendar.appendChild(c_DivHeader);
	
	// **************************************************
	
	// cria div class c_grid
	c_DivGrid = document.createElement("div");
	c_DivGrid.className = " c_grid";
	
		// table c_table
		var c_tempHTML
		c_tempHTML="<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"c_table\">";
		
		// linha titulos dias
		c_tempHTML+="<tr>";
		for(c_Counter=0; c_Counter<c_arrDayNames.length; c_Counter++){
			c_tempHTML+="<td><div id=\"c_day_title\" class=\""+ c_arrDayClass[c_Counter] +"\">"+ c_arrDayNames[c_Counter] +"</div></td>";
		}
		c_tempHTML+="</tr>";
		
		// linhas dias
		var c_numRow,c_numMod,c_strClass
		for(c_Counter=0; c_Counter<42; c_Counter++){
			c_numRow = Math.floor(c_Counter/7) + 1;
			c_numMod = c_Counter % 7;
			c_strClass = "";
			
			if(c_numMod==0){ c_tempHTML+="<tr>"; } // adiciona uma linha
			
			// adiciona uma celula
			if(c_numMod==0){ c_strClass = " class=\"begin\""; } // className begin se for o primeiro item da linha
			if(c_numMod==6){ c_strClass = " class=\"end\""; } // className end se for o ultimo item da linha
			c_tempHTML+="<td><div id=\"c_day_number\""+ c_strClass +"><a id=\"num_"+ c_Counter +"\" href=\"javascript:;\" class=\"c_out c_off\">"+ c_Counter +"</a></div></td>";
			
			if(c_numMod==6){ c_tempHTML+="</tr>"; } // finaliza a linha
		}
		
		// fecha table e adiciona
		c_tempHTML+="</table>";
		c_DivGrid.innerHTML=c_tempHTML;
		
	// finaliza e adiciona div c_grid
	c_DivCalendar.appendChild(c_DivGrid);
	
	// grava os numeros em arrNums
	for(c_Counter=0; c_Counter<42; c_Counter++){
		c_arrNums[c_Counter]=document.getElementById("num_"+ c_Counter);
	}
	
	// **************************************************
	
	// cria div class c_plus
	c_DivPlus = document.createElement("div");
	c_DivPlus.className = " c_plus";
		// span linkToday
		c_Span_linkToday = document.createElement("span");
		c_Span_linkToday.setAttribute("id","c_link_today");
		c_DivPlus.appendChild(c_Span_linkToday);
			// link linkToday
			c_A_linkToday = document.createElement("a");
			c_A_linkToday.setAttribute("href","javascript:;");
			c_A_linkToday.onclick = function(){ c_fncChose(c_todayY +"-"+ c_todayM +"-"+ c_todayD); };
			c_A_linkToday.innerHTML = c_labelToday;
			c_Span_linkToday.appendChild(c_A_linkToday);
			c_Span_linkToday.appendChild(document.createTextNode(" "));
				// espaços e separador
				var c_tempHTML = document.createElement("span");
				c_tempHTML.innerHTML = "&nbsp;|&nbsp;";
				c_Span_linkToday.appendChild(c_tempHTML);
		
		// espaço
		c_DivPlus.appendChild(document.createTextNode(" "));
		
		// span linkClear
		c_Span_linkClear = document.createElement("span");
		c_DivPlus.appendChild(c_Span_linkClear);
			// link linkToday
			c_A_linkClear = document.createElement("a");
			c_A_linkClear.setAttribute("href","javascript:;");
			c_A_linkClear.onclick = function(){ c_fncClear(); };
			c_A_linkClear.innerHTML = c_labelClear;
			c_Span_linkClear.appendChild(c_A_linkClear);
	
	// finaliza e adiciona div c_plus
	c_DivCalendar.appendChild(c_DivPlus);
	
	// **************************************************
	
	// posicionamento absoluto
	c_DivCalendar.style.left = c_getPos(c_objReference)[0] + "px";
	c_DivCalendar.style.top = (Number(c_getPos(c_objReference)[1]) + Number(c_objReference.offsetHeight)) + "px";
	c_DivCalendar.style.display = "";
	
	// adiciona o eventHandler
	setTimeout("c_addEventHandler(document,'click',c_checkClick)",300);
	
	c_fncRefresh();
}





// ##################################################
// atualiza a visualizacao do calendario
function c_fncRefresh(){
	// valida os anos
	if(c_actualY < c_yearFirst){ c_actualY=c_yearFirst; }
	if(c_actualY > c_yearLast){ c_actualY=c_yearLast; }
	
	// nao aceita datas passadas
	if(c_pastLinks==1){
		if(c_actualY<c_todayY){ c_actualY=c_todayY; }
		if((c_actualY==c_todayY)&&(c_actualM<c_todayM)){ c_actualM=c_todayM; }
	}
	
	// nao aceita datas futuras
	if(c_pastLinks==2){
		if(c_actualY>c_todayY){ c_actualY=c_todayY; }
		if((c_actualY==c_todayY)&&(c_actualM>c_todayM)){ c_actualM=c_todayM; }
	}
	
	c_actualDate = new Date(c_actualY,c_actualM,c_actualD,0,0,0,0);
	
	// **************************************************
	
	// pega o primeiro dia do mes da data em uso
	c_firstDay=new Date(c_actualY,c_actualM,1,0,0,0,0);
	c_firstDayNum = c_firstDay.getDay(); // dia da semana
	
	// data do primeiro dia que aparecera no calendario
	c_forDate=new Date(c_actualY,c_actualM,1-c_firstDayNum,0,0,0,0);
	
	// atualiza a listagem dos dias
	for(c_Counter=0; c_Counter<42; c_Counter++){
		c_forD=Number(c_forDate.getDate());
		c_forM=Number(c_forDate.getMonth());
		c_forY=Number(c_forDate.getFullYear());
		
		// atualiza o botao do dia
		c_arrNums[c_Counter].innerHTML=c_forD;
		c_arrNums[c_Counter].setAttribute("rel",c_forY +"-"+ c_forM +"-"+ c_forD);
		c_arrNums[c_Counter].className="";
		c_arrNums[c_Counter].onclick = null;
		
		// verifica se pode ser clicado/selecionado
		c_cond=true;
		if(c_pastLinks==1){ if(c_forDate < c_todayDate){ c_arrNums[c_Counter].className="c_off"; c_cond=false; }} // sem datas passadas
		if(c_pastLinks==2){ if(c_forDate > c_todayDate){ c_arrNums[c_Counter].className="c_off"; c_cond=false; }} // sem datas futuras
		if(c_forY < c_yearFirst){ c_arrNums[c_Counter].className="c_off"; c_cond=false; } // sem datas menores que o primeiro dia de yearFirst
		if(c_forY > c_yearLast){ c_arrNums[c_Counter].className="c_off"; c_cond=false; } // sem datas maiores que o ultimo dia de yearLast
		
		// define className para botoes de outros meses
		if(c_forM!=c_actualM){ c_arrNums[c_Counter].className+=" c_out"; }
		
		// define className para o botao de hoje
		if((c_forD==c_todayD)&&(c_forM==c_todayM)&&(c_forY==c_todayY)){ c_arrNums[c_Counter].className+=" c_today"; }
		// define className para o botao da data escolhida
		if((c_forD==c_selD)&&(c_forM==c_selM)&&(c_forY==c_selY)){ c_arrNums[c_Counter].className+=" c_sel"; }
		
		// link do botao
		if(c_cond){ c_arrNums[c_Counter].onclick = function(){ c_fncChose(this.getAttribute("rel")); }; }
		
		// incrementa a data em 1 dia
		c_forDate=new Date(c_forY,c_forM,c_forD+1,10,0,0,0);
	}
	
	// **************************************************
	
	// reseta o select de meses
	c_SelectMonth.options.length=0;
	for(c_Counter=0; c_Counter<c_arrMonths.length; c_Counter++){
		c_SelectMonth.options[c_SelectMonth.length++] = new Option(c_arrMonths[c_Counter],c_Counter);
	}
	
	// **************************************************
	
	// habilita/desabilita os links
	c_A_prevMonth.className="";
	c_A_prevMonth.onclick = function(){ c_fncPrevMonth(); };
	c_A_nextMonth.className="";
	c_A_nextMonth.onclick = function(){ c_fncNextMonth(); };
	
	c_A_prevYear.className="";
	c_A_prevYear.onclick = function(){ c_fncChangeYear(c_actualY-1); };
	c_A_nextYear.className="";
	c_A_nextYear.onclick = function(){ c_fncChangeYear(c_actualY+1); };
	
	// **************************************************
	
	// desabilita prevYear e prevMonth pela data em uso
	if(c_actualY==c_yearFirst){
		c_A_prevYear.className="c_off";
		c_A_prevYear.onclick = null;
		if(c_actualM==0){
			c_A_prevMonth.className="c_off";
			c_A_prevMonth.onclick = null;
		}
	}
	// desabilita nextYear e nextMonth pela data em uso
	if(c_actualY==c_yearLast){
		c_A_nextYear.className="c_off";
		c_A_nextYear.onclick = null;
		if(c_actualM==11){
			c_A_nextMonth.className="c_off";
			c_A_nextMonth.onclick = null;
		}
	}
	
	// **************************************************
	
	// desabilita prevLinks
	if(c_pastLinks==1){
		if(c_actualY==c_todayY){
			c_SelectMonth.options.length=0;
			for(c_Counter=c_todayM; c_Counter<c_arrMonths.length; c_Counter++){
				c_SelectMonth.options[c_SelectMonth.length++] = new Option(c_arrMonths[c_Counter],c_Counter);
			}
			if(c_actualM==c_todayM){
				c_A_prevMonth.className="c_off";
				c_A_prevMonth.onclick = null;
				c_A_prevYear.className="c_off";
				c_A_prevYear.onclick = null;
			}
		}
	}
	
	// desabilita nextLinks
	if(c_pastLinks==2){
		if(c_actualY==c_todayY){
			c_SelectMonth.options.length=0;
			for(c_Counter=0; c_Counter<=c_todayM; c_Counter++){
				c_SelectMonth.options[c_SelectMonth.length++] = new Option(c_arrMonths[c_Counter],c_Counter);
			}
			if(c_actualM==c_todayM){
				c_A_nextMonth.className="c_off";
				c_A_nextMonth.onclick = null;
				c_A_nextYear.className="c_off";
				c_A_nextYear.onclick = null;
			}
		}
	}
	
	// **************************************************
	
	// atualiza selects
	c_SelectMonth.value=c_actualM;
	c_SelectYear.value=c_actualY;
}





// ##################################################
// muda o ano atraves do select ou links
function c_fncChangeYear(c_numValue){
	c_numValue = Number(c_numValue);
	if(c_numValue < c_yearFirst){ c_numValue=c_yearFirst; } // menor ano
	if(c_numValue > c_yearLast){ c_numValue=c_yearLast; } // maior ano
	c_actualY = c_numValue;
	c_fncRefresh();
}





// ##################################################
// muda o mes apenas atraves do select
function c_fncChangeMonth(c_numValue){
	c_actualM = Number(c_numValue);
	c_fncRefresh();
}





// ##################################################
// link para proximo mes
function c_fncNextMonth(){
	c_actualM++;
	if(c_actualM > 11){ c_actualY++; c_actualM=0; }
	if(c_actualY > c_yearLast){ c_actualY=c_yearLast; c_actualM=11; }
	c_fncRefresh();
}





// ##################################################
// link para mes anterior
function c_fncPrevMonth(){
	c_actualM--;
	if(c_actualM < 0){ c_actualY--; c_actualM=11; }
	if(c_actualY < c_yearFirst){ c_actualY=c_yearFirst; c_actualM=0; }
	c_fncRefresh();
}





// ##################################################
// escolhe a data
function c_fncChose(c_date){
	c_date=c_date.split("-");
	
	c_choseY=Number(c_date[0]); c_choseY=String("000"+ c_choseY);
	c_choseM=Number(c_date[1])+1; c_choseM=String("0"+ c_choseM);
	c_choseD=Number(c_date[2]); c_choseD=String("0"+ c_choseD);
	
	c_choseY=c_choseY.substr(c_choseY.length-4,4);
	c_choseM=c_choseM.substr(c_choseM.length-2,2);
	c_choseD=c_choseD.substr(c_choseD.length-2,2);
	
	c_objTarget.value = c_choseD +"/"+ c_choseM +"/"+ c_choseY;
	c_fncTerminate();
}





// ##################################################
// limpa a data
function c_fncClear(){
	c_objTarget.value="";
	c_fncTerminate();
}





// ##################################################
// finaliza o calendario (deleta o html criado e esconde o div)
function c_fncTerminate(){
	if(c_DivCalendar){
		c_DivCalendar.innerHTML = "";
		c_DivCalendar.style.display = "none";
		c_DivCalendar = null;
		
		// remove o eventHandler
		c_removeEventHandler(document,"click",c_checkClick);
	}
	c_fncSHSelects("visible");
	
	if(c_function!=""){ eval(c_function); }
}





// ##################################################
// verifica onde foi o click
function c_checkClick(c_event){
	c_event ? c_event=c_event : c_event=event;
	c_eventTarget = c_event.target ? c_event.target : c_event.srcElement;
	//alert(c_DivCalendar);
	if(c_DivCalendar){
		if((c_eventTarget!=c_objTarget)&&(c_eventTarget!=c_objReference)){
			if(!c_isChild(c_eventTarget,c_DivCalendar)){ c_fncTerminate(); }
		}
	}
}









// ##################################################
// ##################################################
// OUTRAS FUNCOES UTEIS
// ##################################################
// ##################################################

function c_getObj(cP_objID){
	if(document.getElementById){ return document.getElementById(cP_objID); }
	else if(document.all){ return document.all[cP_objID]; }
	else if(document.layers){ return document.layers[cP_objID]; }
	return false;
}

// retorna a posição absoluta de um objeto (em pixels)
function c_getPos(cP_objID) {
	if(typeof(cP_objID.offsetParent)!="undefined"){
		for(var c_posX=0, c_posY=0; cP_objID; cP_objID=cP_objID.offsetParent ){
			c_posX += Number(cP_objID.offsetLeft);
			c_posY += Number(cP_objID.offsetTop);
		}
		return [parseInt(c_posX),parseInt(c_posY)];
	}else{
		return [parseInt(cP_objID.x),parseInt(cP_objID.y)];
	}
}

// verifica se c_obj1 é filho de c_obj2
function c_isChild(c_obj1,c_obj2){
	while(c_obj1){
		if(c_obj1==c_obj2){ return true; }
		c_obj1=c_obj1.parentNode;
	}
	return false;
}

// adiciona um eventHandler a um objeto
function c_addEventHandler(c_object,c_eventName,c_function){
	if(c_object.attachEvent){
		c_object.attachEvent("on" + c_eventName, c_function);
	}else if(c_object.addEventListener){
		c_object.addEventListener(c_eventName, c_function, true);
	}else{
		c_object["on" + c_eventName] = c_function;
	}
}

// remove um eventHandler de um objeto
function c_removeEventHandler(c_object,c_eventName,c_function){
	if(c_object.detachEvent){
		c_object.detachEvent("on" + c_eventName, c_function);
	}else if(c_object.removeEventListener){
		c_object.removeEventListener(c_eventName, c_function, true);
	}else{
		c_object["on" + c_eventName] = null;
	}
}

function c_fncSHSelects(strShowHide){
	if(navigator.appVersion.indexOf("MSIE")!=-1){
		selects = document.getElementsByTagName("select");
		for (i = 0; i != selects.length; i++) { selects[i].style.visibility = strShowHide; }
	}
}


















