/**
* Esta classe tem como objetivo construir um calendario
* generico para ser usado para controlar eventos
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strNome - Nome do Calendario
* @param arrEventos - arrContendo os eventos no formato array[data][indice] = nome do evento
* @bolNavegMeses - Variavel que indica se será criando o metodo de navegacao dos meses
* @since 11/05/2007
*/

Calendario = function(strNome,strClasseCalendario,arrEventos)
{
	// nome do calendario
	this.strNome = strNome;	
	// classe de estilo do calendario
	this.strClasseCalendario = strClasseCalendario;
	// array de calendarios
	this.arrItemCalendario = new Array();
	// criando array de eventos geral
	if(arrEventos==undefined)
	{
		this.arrEventos = new Array();
	}
	else
	{
		this.arrEventos = arrEventos;
	}	
	this.idCalendarioDefault = 'default';
	this.arrItemCalendario[this.idCalendarioDefault] = new ItemCalendario(strNome,strClasseCalendario,arrEventos);
}

/**
* Metodo para disparar evento no click
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @since 11/05/2007
* @access public
*/
Calendario.prototype.setEventoClick = function(bolEventoClick,strNomEventoClick,strData,strIdElemento,strCalendario)
{
	if(this.arrItemCalendario[strCalendario])
	{
		this.arrItemCalendario[strCalendario].setEventoClick(bolEventoClick,strNomEventoClick,strData,strIdElemento);
	}
	else
	{								
		this.arrItemCalendario[this.idCalendarioDefault].setEventoClick(bolEventoClick,strNomEventoClick,strData,strIdElemento);
	}	
}

/**
* Metodo para retornar o nome do calendario
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @since 11/05/2007
*/
Calendario.prototype.getNome = function()
{
	return this.strNome;
}

/**
* Metodo para adicionar um evento
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strCalendario - Identificador do calendario
* @param strData - data do evento no formato dd/mm/yyyy
* @param strEvento = nome do evento
* @since 11/05/2007
*/
Calendario.prototype.adicionaEvento = function(strData,strEvento,strCalendario)
{
		if(this.arrItemCalendario[strCalendario])
		{
			this.arrItemCalendario[strCalendario].adicionaEvento(strData,strEvento);
		}
		else
		{
			this.arrItemCalendario[this.idCalendarioDefault].adicionaEvento(strData,strEvento);
		}
}

/**
* Metodo para remove um evento
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strCalendario - Identificador do calendario
* @param strData - data do evento no formato dd/mm/yyyy
* @param strEvento = nome do evento
* @since 11/05/2007
*/
Calendario.prototype.removeEvento = function(strData,strEvento,strCalendario)
{		
	if(this.arrItemCalendario[strCalendario])
	{
		this.arrItemCalendario[strCalendario].removeEvento(strData,strEvento);
	}
	else
	{
		this.arrItemCalendario[this.idCalendarioDefault].removeEvento(strData,strEvento);
	}
}

/**
* Metodo para remover todos os eventos
*
* @param strCalendario - Identificador do calendario
* @author Erix Henrique Morato <emorato@unibh.br>
* @since 11/05/2007
*/
Calendario.prototype.removeTodosEventos = function(strCalendario)
{		
	if(this.arrItemCalendario[strCalendario])
	{
		this.arrItemCalendario[strCalendario].removeTodosEventos();
	}
	else
	{
		this.arrItemCalendario[this.idCalendarioDefault].removeTodosEventos();
	}
}


/**
* Metodo para retornar as datas que possuem eventos
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strCalendario - Identificador do calendario
* @since 11/05/2007
*/
Calendario.prototype.getDatasEventos = function(strCalendario)
{
	if(this.arrItemCalendario[strCalendario])
	{
		return this.arrItemCalendario[strCalendario].getDatasEventos();
	}
	else
	{
		return this.arrItemCalendario[this.idCalendarioDefault].getDatasEventos();		
	}	
}

/**
* Metodo para retornar se existe evento na data 
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strCalendario - Identificador do calendario
* @param strData - data do evento no formato dd/mm/yyyy
* @since 11/05/2007
*/
Calendario.prototype.isEvento = function(strData,strCalendario)
{	
	if(this.arrItemCalendario[strCalendario])
	{
		return this.arrItemCalendario[strCalendario].isEvento(strData);
	}
	else
	{
		return this.arrItemCalendario[this.idCalendarioDefault].isEvento(strData);	
	}		
}

/**
* Metodo para retornar os eventos por data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strData - data do evento no formato dd/mm/yyyy
* @param strCalendario - Identificador do calendario
* @since 11/05/2007
*/
Calendario.prototype.getEventosData = function(strData,strCalendario)
{
	if(this.arrItemCalendario[strCalendario])
	{
		return this.arrItemCalendario[strCalendario].getEventosData(strData);
	}
	else
	{
		return this.arrItemCalendario[this.idCalendarioDefault].getEventosData(strData);	
	}		
}

/**
* Metodo para obter quantos dias tem um mes
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param intMes - Mes (de 1 a 12)
* @param intAno - ano
* @since 11/05/2007
*/
Calendario.prototype.obterNumDiasMes = function(intMes,intAno)
{
	 return this.arrItemCalendario[this.idCalendarioDefault].obterNumDiasMes(intMes,intAno);
}

/**
* Metodo para obter o dia de uma data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 11/05/2007
*/
Calendario.prototype.getDia = function(objDate,bolZeroEsqueda)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getDia(objDate,bolZeroEsqueda);
}

/**
* Metodo para obter o mes de uma data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 16/08/2006
*/
Calendario.prototype.getMes = function(objDate,bolZeroEsqueda)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getMes(objDate,bolZeroEsqueda);
}

/**
* Metodo para obter o mes de uma data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 16/08/2006
*/
Calendario.prototype.getMesExtenso = function(objDate)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getMesExtenso(objDate);
}


/**
* Metodo para obter o ano de uma data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 11/05/2007
*/
Calendario.prototype.getAno = function(objDate)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getAno(objDate);
}

/**
* Metodo para converter uma data para string
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 11/05/2007
*/
Calendario.prototype.dateToStr = function(objDate)
{
	return this.arrItemCalendario[this.idCalendarioDefault].dateToStr(objDate);
}

/**
* Metodo para converter um string para data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 11/05/2007
*/
Calendario.prototype.strToDate = function(strData)
{
	return this.arrItemCalendario[this.idCalendarioDefault].strToDate(strData);
}


/**
* Metodo para retornar o numero da semana no ano
*
* @author Daniel Hasan Dalip <hdalip@gmail.com>
* @param objDate - objeto contendo a data
* @since 14/03/2008
*/
Calendario.prototype.getNumSemana = function(objDate)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getNumSemana(objDate);
}
/**
* Metodo para adicionar dias a uma data 
*
* @author Daniel Hasan Dalip <hdalip@gmail.com>
* @param objDate - objeto contendo a data
* @since 24/03/2008
*/
Calendario.prototype.adicionaDiaData = function(objDate,intQtdDias)
{
	return this.arrItemCalendario[this.idCalendarioDefault].adicionaDiaData(objDate,intQtdDias);
}


/**
* Metodo para retornar o dia da semana de um objeto data
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param objDate - objeto contendo a data
* @since 11/05/2007
*/
Calendario.prototype.getDiaSemana = function(objDate)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getDiaSemana(objDate);
}
/**
* Metodo para retornar o primeiro dia do mes (a partir do dia passado como parametro) 
* que está no determinado dia da semana
* 
* @author Daniel Hasan Dalip <dhasan@unibh.br>
* @param Primeiro dia do mes que está no determinado dia da semana
* @since 18/02/2008
*/
Calendario.prototype.getPrimeiroDiaMes = function(objDate,intDiaSemana)
{
	return this.arrItemCalendario[this.idCalendarioDefault].getPrimeiroDiaMes(objDate,intDiaSemana);
}
/**
* Metodo para verificar se o dia é util
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param intDia - dia a ser verificado
* @since 11/05/2007
*/
Calendario.prototype.isDiaUtil = function(objDate)
{
	if (!objDate)
	{
		return this.arrItemCalendario[this.idCalendarioDefault].isDiaUtil();
	}
	else
	{
		return this.arrItemCalendario[this.idCalendarioDefault].isDiaUtil(objDate);
	}
}

/**
* Metodo para verificar se é o dia corrente
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param intDia - dia a ser verificado
* @since 11/05/2007
*/
Calendario.prototype.isDataCorrente = function()
{
	return this.arrItemCalendario[this.idCalendarioDefault].isDataCorrente();
}

/**
* Metodo para gerar o calendario do proximo mes
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @since 11/05/2007
*/
Calendario.prototype.proximoMes = function()
{
	return this.arrItemCalendario[this.idCalendarioDefault].proximoMes(); 
}

/**
* Metodo para gerar o calendario do mes anterior
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param intDia - dia a ser verificado
* @since 11/05/2007
*/
Calendario.prototype.mesAnterior = function(intDia)
{
	return this.arrItemCalendario[this.idCalendarioDefault].mesAnterior(); 	
}
/**
* Seleciona todos os dias do mes que caem em um determinado dia da semana a partir de objDataBase
* A selecao será feita chamando a função onclick() de cada div do dia
*
* se o atributo bolInverterSelecao for igual a true ele seleciona os dias não selecionados e desseleciona os selecionados, 
* se for igual a false e se houver alguns dias selecionados e outros nao, ele seleciona apenas os não selecionados. 
* é verificado se um dia está selecionado atraves da funcao strFuncaoVerficaSelecao que retorna true caso o dia esteja selecionado
* ou false caso contrario 
*
*
* @author Daniel Hasan Dalip <dhasan@unibh.br>
* @since 19/02/2008
*/
Calendario.prototype.selecionaDiaSemana = function (objDataBase,intDiaSemana,strFuncaoVerificaSelecao,bolInverterSelecao)
{
	//resgata o dia da semana da data base 
	var intPrimeiroDiaMes = this.getPrimeiroDiaMes(objDataBase,intDiaSemana);
	
	var intMes = this.getMes(objDataBase,true);
	var intAno = this.getAno(objDataBase);

	this.selecionarDiasMes(intPrimeiroDiaMes,intMes,intAno,7,strFuncaoVerificaSelecao,bolInverterSelecao);
}
/**
* Seleciona, a partir de intDiaInicial os dias do mes intMes/intAno
* Após selecionar um mes, é deslocado o valor passado em intDeslocamento para selecionar o proximo mes
* A selecao será feita chamando a função onclick() de cada div do dia
* (O metodo selecionaDiasSemana desta classe é um exemplo de utilização deste metodo)
* este metodo tb pode ser usado para selecionar todos os dias de um mes, colocando intDeslocamento = 1
* @author Daniel Hasan Dalip <dhasan@unibh.br>
* @since 19/02/2008
*/
Calendario.prototype.selecionarDiasMes = function (intDiaInicial,intMes,intAno,intDeslocamento,strFuncaoVerificaSelecao,bolInverterSelecao)
{
	var  bolSelecionarNaoMarcados = false;
	//percorre todos os dias que pertencem a este deslocamento
	//quantos dias estao selecionados e quantos nao estao
	if(!bolInverterSelecao)
	{
		var intQtdSelecionado = 0;
		var intQtdNSelecionado = 0;
		var bolIsDataMarcada = false;
		
		for(var intI = intDiaInicial ; intI<=31 ; intI+=intDeslocamento)
		{
			//coloca o zero a esquerda
			var strDia = intI;
			if(intI<10)
			{
				strDia = "0"+intI;
			}
			var objDiv = $(this.getNome()+'_diaConteudo'+strDia+"/"+intMes+"/"+intAno);
			if(objDiv)
			{
				if(strFuncaoVerificaSelecao)
				{
					eval("bolIsDataMarcada = "+strFuncaoVerificaSelecao);
				}
				if(bolIsDataMarcada)
				{
					intQtdSelecionado++;
				}else
				{
					intQtdNSelecionado++;
				}
			}
		}
		//se tiver alguns selecionados e alguns nao selecionados, selecionar apenas os nao marcados
		
		if(intQtdSelecionado>0 && intQtdNSelecionado>0)
		{
			bolSelecionarNaoMarcados = true;
		}
	}
	
	//percorre todos os dias que estao neste deslocamento
	for(var intI = intDiaInicial ; intI<=31 ; intI+=intDeslocamento)
	{
		//coloca o zero a esquerda
		var strDia = intI;
		if(intI<10)
		{
			strDia = "0"+intI;
		}
		//chama a acao ao clicar div para selecionar 
		var objDiv = $(this.getNome()+'_diaConteudo'+strDia+"/"+intMes+"/"+intAno);
		if(objDiv)
		{
			if(strFuncaoVerificaSelecao)
			{
				eval("bolIsDataMarcada = "+strFuncaoVerificaSelecao);
			}
			
			if( (bolSelecionarNaoMarcados && !bolIsDataMarcada) || !bolSelecionarNaoMarcados)
			{
				objDiv.onclick();
			}
		}
	}
}

/**
* Metodo gerar um calendario
*
* @author Erix Henrique Morato <emorato@unibh.br>
* @param strDivPrincipal - Div que esta sendo gerado o calendario
* @param strData - Data que será gerado o calendario
* @param bolNavegacao - Indica se o calendario tem navegacao
* @param strIdCalendario - Identificador do calendario
* @since 11/05/2007
*/
Calendario.prototype.geraCalendario = function(strDivCalendario,strData,bolNavegacao,strIdCalendario,strClasseItemCalendario,arrEventos)
{	
	if(strIdCalendario)
	{
		if(this.arrItemCalendario[strIdCalendario])
		{
			this.arrItemCalendario[strIdCalendario].geraCalendario(strDivCalendario,strData,bolNavegacao);
		}
		else
		{
			this.arrItemCalendario[strIdCalendario] = new ItemCalendario(this.strNome,(strClasseItemCalendario)?strClasseItemCalendario:this.strClasseCalendario,(arrEventos)?arrEventos:this.arrEventos);			
			this.arrItemCalendario[strIdCalendario].geraCalendario(strDivCalendario,strData,bolNavegacao);
		}		
	}
	else
	{
		this.arrItemCalendario[this.idCalendarioDefault].geraCalendario(strDivCalendario,strData,bolNavegacao);
	}
}
