/***
 *
 ******************************************************
 *				BRUNO A. HOFFMANN - 04/04/2010		  *
 ******************************************************
 *
 *	-> Agenda de uso liberado a comunidade de desenvolvedores, 
 *		aberta a atualizações e melhorias.
 *
 *
 *	@email = bruno_mc_dj@hotmail.com
 *
 * FUNÇÕES DE APOIO AO SISTEMA 
 */
 
	/**
	 * Retorna data do mes anterior em formato array
	 * 
	 * Exemplo: Entrada ( mes => 2, ano => 2011)
	 *			Saída	( mes => 1, ano => 2011)
	 */ 
	function mesAnterior( mes, ano ){
		
		var retorno = new Array();
		
		if (mes == 0 ){
			retorno['mes'] = 11;
			retorno['ano'] = ano -1;
			return  retorno;	
		}
		else {
			retorno['mes'] = mes - 1;
			retorno['ano'] = ano;
			return  retorno;	
		}
			
	}
	
	/**
	 * Retorna data do próximo nes em formato array
	 * 
	 * Exemplo: Entrada ( mes => 2, ano => 2011)
	 *			Saída	( mes => 3, ano => 2011)
	 */
	function mesProximo( mes, ano ){
		
		var retorno = new Array();
		
		if (mes == 11 ){
			retorno['mes'] = 0;
			retorno['ano'] = ano +1;
			return  retorno;	
		}
		else {
			retorno['mes'] = mes +1;
			retorno['ano'] = ano;
			return  retorno;	
		}
		
	}
	
	/**
	 * Retorna o nome do mes
	 */
	function mesNome( mes ) {
		
		var retorno = '';
		switch (mes){
			
			case 0:
				retorno = 'Janeiro';
				return retorno;
			break;
			
			case 1:
				retorno = 'Fevereiro';
				return retorno;
			break;
			
			case 2:
				retorno = 'Março';
				return retorno;
			break;
			
			case 3:
				retorno = 'Abril';
				return retorno;
			break;
			
			case 4:
				retorno = 'Maio';
				return retorno;
			break;
			
			case 5:
				retorno = 'Junho';
				return retorno;
			break;
			
			case 6:
				retorno = 'Julho';
				return retorno;
			break;
			
			case 7:
				retorno = 'Agosto';
				return retorno;
			break;
			
			case 8:
				retorno = 'Setembro';
				return retorno;
			break;
			
			case 9:
				retorno = 'Outubro';
				return retorno;
			break;
			
			case 10:
				retorno = 'Novembro';
				return retorno;
			break;
			
			case 11:
				retorno = 'Dezembro';
				return retorno;
			break;
			
		}	
	}
	
	/*
	 * @retorna ultimo dia do mes
	 */
	function mesUltimoDia(mes,ano){
		if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12) return 31;
		if(mes==4||mes==6||mes==9||mes==11) return 30;
		if(mes==2) if(ano%400==0) return 29;
		if(mes==2) if(ano%100==0) return 28;	
		if(mes==2) if(ano%4==0) return 29;	else return 28; 
	}
	
	/*
	 *	@retorna Id da Semana
	 */
	function stringSemana(numDiaSemana){
		var retorno = '';
		switch (numDiaSemana){
			
			case 0:
				retorno = '#dom';
				return retorno;
			break;
			
			case 1:
				retorno = '#seg';
				return retorno;
			break;
			
			case 2:
				retorno = '#ter';
				return retorno;
			break;
			
			case 3:
				retorno = '#qua';
				return retorno;
			break;
			
			case 4:
				retorno = '#qui';
				return retorno;
			break;
			
			case 5:
				retorno = '#sex';
				return retorno;
			break;
			
			case 6:
				retorno = '#sab';
				return retorno;
			break;
		}
	}
	
	/**
	 * Efetuar o preenchimento dos campos da agenda.
	 */
	function preencher(pDiaSemana, uDiames, url, ajax, mes, ano){
		
		var mesNacional = mes + 1; // acrescente mais 1 ao mes para ficar no padrão nacional
		
		if (mesNacional < 10) {
			mesNacional = '0'+ mesNacional;
		}
		
		var hoje = new Date(); // pega data atual
			
		var dia = 1; // ponto de inicio, dia 1
		
		// for nas Colunas diagonais, apartir da 2º coluna
		for(si = 2; si <= 7; si++){
			
			
			// Ação da primeiro coluna deve ser indicidual, devido ao preenchimento dos campos vazios
			if (si == 2){
				
				// For paras os dias da semana
				for(bi = 0; bi <= 6; bi++){
					
					var diaS = dia;
					if (diaS < 10) {
						diaS = '0'+ dia;
					}
					
					var strDiaSemana = stringSemana(bi); // Pega o id do dia  da semana
					
					// se dia da semana for maior ou igual ao primeiro dia da semana do mes 
					if (bi >= pDiaSemana){
						
						// preenche o campo da agenda com conteudo
						$('.c'+si+' '+strDiaSemana).html('<a href="'+url+'data/'+dia+'-'+mesNacional+'-'+ano+'" >'+dia+'</a>');
						
						// remove qualquer estilo do dia da semana
						$('.c'+si+' '+strDiaSemana).removeAttr('style');
						
						// Preenche com cores os dia ativos do calendario
						var data = diaS+'/'+mesNacional+'/'+ano;
						jQuery.each(ajax, function(index,value){
							
							if(data == value){
							
								/* Regex para validar expressão regular */
								var regexUrl = /^http:\/\//;
								if(regexUrl.test(index)){
									// preenche o campo da agenda com conteudo
									$('.c'+si+' '+strDiaSemana).html('<a  href="'+index+'" >'+dia+'</a>');
								}
								
								$('.c'+si+' '+strDiaSemana).attr('style','background:#b4a4a4');
								
							}
							
						});
											
						// se dia atual for igual ao dia de hoje, ganha um novo background
						if (dia == hoje.getDate() && mes == hoje.getMonth()){
							$('.c'+si+' '+strDiaSemana).attr('style','background:#666');	
						}
						
						
						// incrementa mais 1 ao dia
						dia++;
						
					}
					else{
						$('.c'+si+' '+strDiaSemana).html('&nbsp;');	
						$('.c'+si+' '+strDiaSemana).removeAttr('style');
					}
					
				}
				
			}
			else{
				
				for(bi = 0; bi <= 6; bi++){
					
					var diaS = dia;
					if (diaS < 10) {
						diaS = '0'+ dia;
					}
					
					var strDiaSemana = stringSemana(bi);
					
					// verifica se dia é menor ou igual ao ultimo dia do mes
					if (dia <= uDiames){						
						
						$('.c'+si+' '+strDiaSemana).html('<a  href="'+url+'data/'+dia+'-'+mesNacional+'-'+ano+'" >'+dia+'</a>');
						
						$('.c'+si+' '+strDiaSemana).removeAttr('style');
						
						// Preenche com cores os dia ativos do calendario
						var data = diaS+'/'+mesNacional+'/'+ano;
						jQuery.each(ajax, function(index,value){
							
							if(data == value){
								
								/* Regex para validar expressão regular */
								var regexUrl = /^http:\/\//;
								if(regexUrl.test(index)){
									// preenche o campo da agenda com conteudo
									$('.c'+si+' '+strDiaSemana).html('<a href="'+index+'" >'+dia+'</a>');
								}
								
								$('.c'+si+' '+strDiaSemana).attr('style','background:#b4a4a4');
								
							}
							
						});
						
						
						if (dia == hoje.getDate() && mes == hoje.getMonth()){
							$('.c'+si+' '+strDiaSemana).attr('style','background:#666');	
						}
						
						dia++;
						
					}else{
						$('.c'+si+' '+strDiaSemana).html('&nbsp;');	
						$('.c'+si+' '+strDiaSemana).removeAttr('style');
					}
					
				}
				
			}
			
		}
		
		// efeito visual
		$('.bodyCorpo').fadeIn();
		
	}

/**
 *
 * OBJETO CALENDARIO
 *
 */
jQuery.fn.brCalendario = function (options) {
	
	// Declara os atributos do objeto
	var settings = {
			target		: '',
			url			: '',
			arrDatas	: '',
			symbol_join : '',
			mes			: 0,
			ano			: 0
		};
	
	// aplica valores aos atributos
	options = jQuery.extend(settings,options);

	// Declaração de variveis utilizadas no sistema
	var nomeMes = '';
	var oData = new Date(); // Objeto que tabralha somente com a data atual
	var diaSemana = 0;
	
	// Coloca Simbolo Join ao final da Url
	options.url = options.url+options.symbol_join;
	
	/**
	 * INICIO DAS AÇÕES PARA CRIAÇÃO DO CALENDARIO
	 */
	
	 // verifica se mes foi preenchido
	 var controlMes = false; // se o atributo mes for setado via html valor é true 
	 if (options.mes == 0){
		 options.mes = oData.getMonth();
	 }else{
		controlMes = true; 
		options.mes = options.mes - 1;
	 }
	 
	 // verifica se o ano foi preenchido
	 if(options.ano == 0 ){
		 options.ano = oData.getFullYear(); 
	 }
	 
	 
	// Escreve texto com Mes e Ano na div topCorpo Center
	 nomeMes = mesNome(options.mes);	
	 $('.topCorpo #center').html(nomeMes + ' - ' + options.ano);
	 
	// Preenchar os dias
	// Pega dia da semana do primeiro dia do mes
	 var oDiaSemana = new Date()
	 	 oDiaSemana.setFullYear(options.ano,options.mes,1);
	 diaSemana = oDiaSemana.getDay(); // recebe primeiro dia da semana do mes
	 // Pega o ultimo dia do mes
	 ultDia = mesUltimoDia(options.mes+1, options.ano);

	 preencher(diaSemana, ultDia, options.url, options.arrDatas, options.mes, options.ano);
	 
	 
	 // Avançar e Voltar meses
	 var dataCorrente = new Array(); // controle de datas
		 dataCorrente['mes'] = options.mes;
		 dataCorrente['ano'] = options.ano;
			 
	 $('#laquo').click(function(){
		
		$('.bodyCorpo').fadeOut(100);
		
		dataCorrente = mesAnterior(	dataCorrente['mes'], dataCorrente['ano'] );

		 // Escreve texto com Mes e Ano na div topCorpo Center
		 nomeMes = mesNome(dataCorrente['mes']);	
		 $('.topCorpo #center').html(nomeMes + ' - ' + dataCorrente['ano']);
		
		 // Preenchar os dias
		 // Pega dia da semana do primeiro dia
		 var oDiaSemana = new Date()
			 oDiaSemana.setFullYear(dataCorrente['ano'],dataCorrente['mes'],1);
		 diaSemana = oDiaSemana.getDay();
		 // Pega o ultimo dia do mes
		 ultDia = mesUltimoDia(dataCorrente['mes']+1, dataCorrente['ano']);
		 		 
		 preencher(diaSemana, ultDia, options.url, options.arrDatas, dataCorrente['mes'], dataCorrente['ano']);
				 
	 });
	 
	 $('#raquo').click(function(){
		
		$('.bodyCorpo').fadeOut(100);
		
		dataCorrente = mesProximo( dataCorrente['mes'], dataCorrente['ano'] );

		 // Escreve texto com Mes e Ano na div topCorpo Center
		 nomeMes = mesNome(dataCorrente['mes']);	
		 $('.topCorpo #center').html(nomeMes + ' - ' + dataCorrente['ano']);
		
		 // Preenchar os dias
		 // Pega dia da semana do primeiro dia
		 var oDiaSemana = new Date()
			 oDiaSemana.setFullYear(dataCorrente['ano'],dataCorrente['mes'],1);
		 diaSemana = oDiaSemana.getDay();
		 // Pega o ultimo dia do mes
		 ultDia = mesUltimoDia(dataCorrente['mes']+1, dataCorrente['ano']);
		 
		 preencher(diaSemana, ultDia, options.url, options.arrDatas, dataCorrente['mes'], dataCorrente['ano']);				 
				 
	 });
}
