// JavaScript Document
/**************************************************************************************
* Calendário em javascript
* Felipe Mendes Bruno Ginja / Nitro71
* seishilipe@gmail.com
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* uso:
* <script type="text/javascript">calendario("div de destino");</script>
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* pode-se criar um calendário em uma data especifica passando-se seu
* valor ao chamar a função
* ex:
* <script type="text/javascript">calendario("div de destino",dia,mes,ano);</script>
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* há uma função chamada isClickFunc, esta função é usada para definir
* a ação a ser realizada pelo script ao ser selecionado alguma data no
* calendário
**************************************************************************************/

function calendario(div,dia,mes,ano,isClick){

	/***************************
		Variáveis
	****************************/

	//div onde ficará o calendario
	var displayDiv = div;

	//define os dias da semana
	var days = new Array('D',
						 'S',
						 'T',
						 'Q',
						 'Q',
						 'S',
						 'S'
						);
	
	//define os messes do ano
	var months = new Array('Janeiro',
						   'Fevereiro',
						   'Março',
						   'Abril',
						   'Maio',
						   'Junho',
						   'Julho',
						   'Agosto',
						   'Setembro',
						   'Outubro',
						   'Novembro',
						   'Dezembro'
						  );
	
	//crio uma instância do obejto data
	var date = new Date();

	// defino a data de hoje
	var diaAtual,mesAtual,anoAtual;
	diaAtual = date.getDate();
	mesAtual = date.getMonth();
	anoAtual = date.getFullYear();
	
	/***************************
		Métodos
	****************************/

	//função chamada toda vez que o usuário clica em algum número
	function isClickFunc(){
		window.location="http://www.vnoticias.com.br/eventos/agenda.asp?data="+addZero(dia)+"/"+addZero((mes+1))+"/"+ano;
	}

	//função que adiciona zero as datas com apenas 1 casa decimal
	//a data será transformada em string
	function addZero(date){
		if(date < 10){
			return "0"+date;
		}else{
			return date;
		}
	}
	
	//função que gera o calendario marcando a data passada.
	//caso não seja passada alguma data, retorna a data atual
	function generateCalendar(d,m,y){
		//checa se alguma data foi passada
		var day,month,year;
		day = (d != null ? d : diaAtual);
		month = (m != null ? m : mesAtual);
		year = (y != null ? y : anoAtual);

		//checa se o mes esta entre 0 e 11 (1 e 12)
		if(month>11){
			month = 0;
			year ++;
		}else if(month<0){
			month = 11;
			year --;
		}
		
		//array que armazenará os dias do mes
		var dias = new Array();
		
		//pego o dia da semana do dia 1 do mes atual
		var dayOfWeek = new Date(year,month,1);
		
		//adiciono espaços no array dias para que o a posição dos dias
		//corresponda a posição dos nomes
		for(i=0;i<dayOfWeek.getDay();i++){
			dias.push("");
		}
		
		//guardo os dias do mes
		for(i=1;i<=31;i++){
			dias.push(checkDate(i,month,year));
		}

		//eventos

		var eventos = updateEventos("agenda_feed.asp?mes="+(month+1)+"&ano="+year).split(",");

		//mostro o calendario
		displayCalendar(dias,eventos,day,month,year);
	}

	//função responsavel pela requisição SJAX e atualização dos eventos
	function updateEventos(url) {
	  if (window.XMLHttpRequest) {              
    	AJAX=new XMLHttpRequest();              
	  } else {                                  
    	AJAX=new ActiveXObject("Microsoft.XMLHTTP");
	  }
	  if (AJAX) {
    	 AJAX.open("GET", url, false);                             
	     AJAX.send(null);
    	 return AJAX.responseText;                                         
	  } else {
    	 return false;
	  }                                             
	}
	
	//função que mostra/atualiza o calendário
	function displayCalendar(dias,eventos,dia,mes,ano){
		//defino o topo do calendario
		var top = "<table class='table' name='calendario' border='0' cols='7'>";
		
		//onclick dos botões
		var btnClickN = "onclick='calendario(\""+displayDiv+"\",0,"+(mes+1)+","+ano+")'"
		var btnClickP = "onclick='calendario(\""+displayDiv+"\",0,"+(mes-1)+","+ano+")'"

		//botão que retorna ao dia de hoje
		var btnToday = "<input class='todayBtn' type='button' name='button' id='today' value='data atual' onclick='calendario(\""+displayDiv+"\","+diaAtual+","+mesAtual+","+anoAtual+")' />";

		//botões de proximo/anterior mes
		var nextBtn = "<td><input class='nextBtn' type='button' name='button' id='next' value='&gt;&gt;' "+btnClickN+"/></td>";
		var prevBtn = "<td><input class='prevBtn' type='button' name='button' id='previus' value='&lt;&lt;' "+btnClickP+"/></td>";

		//tr onde ficará o dia ,mes e ano selecionado
		var tr_display_info = "<tr>"+prevBtn+"<td colspan='5' align='center' class='tdTitle'>"/*+addZero(dia)+" de "*/+months[mes]+" de "+ano+"</td>"+nextBtn+"</tr>";

		//defino a função onclick dos dias onde há eventos
		var onClick_s = " onclick='calendario(\""+displayDiv+"\",";
		var onClick_e = ","+mes+","+ano+",1)' ";

		//tr que contem os dias da semana
		var tr_display_days_names =  "<tr>";
		for(i=0;i<7;i++){
			tr_display_days_names += "<td>"+days[i]+"</td>";
		}
		
		tr_display_days_names += "</tr>";
			
		//define o fim da tabela
		var bottom = "</table>";
		
		//define os dias do mes
		var tr_display_days = new Array("<tr>");
		var daysNum = 0;
		for(i=0;i<dias.length;i++){
			//checo se o dia especificado é o selecionado
			if(dias[i]==dia&&dias[i]!=0){
				var classe = "td_selected";
			//checo se o dia selecionado é o dia atual
			}else if(dias[i]==diaAtual&&mes==mesAtual&&ano==anoAtual){
				var classe = "td_today";
			//demais dias
			}else{
				var classe = "td_normal";
			}
			
			//checo se há eventos no dia especificado
			if(eventos[(dias[i]-1)]==1&&dias[i]!=dia){
				var td = "<td class='td_event'"+onClick_s+dias[i]+onClick_e+">"+checkDate(dias[i])+"</td>";
			}else{
				var td = "<td class='"+classe+"'>"+checkDate(dias[i])+"</td>";
			}
			

			//quebra de linha a cada 7 dias
			if(daysNum>6){
				daysNum = 0;
				tr_display_days.push("</tr><tr>"+td);
			}else{
				tr_display_days.push(td);
			}
			daysNum ++;
		}
		tr_display_days.push("</tr>");
		
		//escreve a tabela na div especificada
		var output = "";
		var output = top+tr_display_info+tr_display_days_names;
		for(i=0;i<tr_display_days.length;i++){
			output += tr_display_days[i];
		}
		
		//adiciono o atalho para a data atual
		output += "<tr><td colspan='7' align='center'>"+btnToday+"</td></tr>";
		output += bottom;

		document.getElementById(displayDiv).innerHTML = output;
	}
	
	//função que checa se a data existe ou não
	function checkDate(day,month,year){
		if(year%4==0&&month==1&&(day==30||day==31)){
			return "";
		}else if(year%4!=0&&month==1&&(day==30||day==31||day==29)){
			return "";
		}else{
			return day;
		}
	}
	
	/***************************
		Inicia o calendario
	****************************/
	
	generateCalendar(dia,mes,ano);

	/***************************
		IsClick
	****************************/

	//isClick é usado para chamar alguma ação quando o usuário clicar em um número
	//deve ficar sempre no fim da função para que todo o calendario seja gerado antes
	if(isClick=="1"){
		isClickFunc();
	}
}
