var dateRE = /^(\d{2})[\/\- ](\d{2})[\/\- ](\d{4})/;
		function dmyOrdA(a, b){
			a = a.replace(dateRE,"$3$2$1");
			b = b.replace(dateRE,"$3$2$1");
			if (a>b) return 1;
			if (a <b) return -1;
			return 0;
		}
		
		function dmyOrdD(a, b){
			a = a.replace(dateRE,"$3$2$1");
			b = b.replace(dateRE,"$3$2$1");
			if (a>b) return -1;
			if (a <b) return 1;
			return 0;
		}
		function mdyOrdA(a, b){
			a = a.replace(dateRE,"$3$1$2");
			b = b.replace(dateRE,"$3$1$2");
			if (a>b) return 1;
			if (a <b) return -1;
			return 0; 
		}
		function mdyOrdD(a, b){
			a = a.replace(dateRE,"$3$1$2");
			b = b.replace(dateRE,"$3$1$2");
			if (a>b) return -1;
			if (a <b) return 1;
			return 0;
		} 

var keepDates = new Array();
var keepDays = new Array();
var keepAll = new Array();
var dadosArmazenados = new Array();
var forIndice = false;


function ListagemNoticia(objDados, objPaginacao, strArquivoJson, objCriarListaDadosItem, objCriarPaginacao, objCriarDados) {
	
	// -- INI --- Funções externas utilizadas -----------------------
	//Função responsável por gerar a paginação, é opcional e a a propriedade '<JSON>.configuracao.intItensPorPagina ' não pode ser definida, nesse caso.
	//noticias.criarPaginacao = function(oConfig) {}
	
	//Cria o conteúdo que será exibido quando a opção da lista for escolhida. É opcional. Se for opcional a propriedade '<JSON>.configuracao.strPaginaLink' tem que ser configurada
	//noticias.criarDados = function(oConfig, oDados) {}
	
	//Função responsável por gerar cada item da lista, é obrigatorio a sua definição
	//noticias.criarListaDadosItem = function(oConfig, oDados, intIndex) {}
	// -- FIM --- Funções externas utilizadas -----------------------
	
	var bolForcarAtualizacao = false; // utilizado para verificar se foi requisitado a atualização dos dados antes do request acabar de carregar o arquivo JSON
	var objJson = null; // objeto que contém os dados capturados do arquivo json
	// -- INI --- Configuração -----------------------
	this.configuracao = {
		//'strTextoFiltro': null,		  //opcional, define o texto para fazer o filtro
		'strEstado': null,				//opcional, define o estado para fazer o filtro
		'intMes': 0,				  //opcional, o valor do mes -> 1: janeiro, 2: fevereiro, ... 12 -> dezembro
		'intAno': 0,				  //opcional o valor do ano -> 2008, 2009
		'strLoja': null,			  //opcional, define a loja para fazer o filtro
		'intPaginaAtual' : 1,		  //opcional quando não for utilizado a paginação
		'intTotalDePaginas' : 0,	  //variavel interna, A classe define a quantidade de total de paginas que será mostrada
		'bolAtivarPaginacao' : false, //opcional, Se vai utilizar o sistema de paginação
		'intItensPorPagina' : 0,	  //opcional, quando não for utilizado a paginação é utilizada para exibir a quantidade de itens iniciais exibidos.
		'strPaginaLink' : null		  //Caso a função criarDados não for especificada, é obrigatório, ex. colocar como: imprensa_detalhes_[ID].aspx
	};
	// -- FIM --- Configuração -----------------------
	this.objDados = objDados; //Onde vai ser inserido o HTML referente aos dados ex.: a exibição do conteudo ou exibição da listagem
	this.objPaginacao = objPaginacao; // Onde vai ser inserido o HTML da paginação
	this.criarListaDadosItem = objCriarListaDadosItem; //externo, a função que contém a estrutura para criar o HTML de cada item na listagem dos dados
	this.criarPaginacao = objCriarPaginacao; //externo (opcional), a função que contém a estrutura para criar o HTML da paginação
	this.criarDados = objCriarDados; //externo (opcional), a função que contém a estrutura para criar o HTML para a exibição do item escolhido

	//---------------------------------------------------------------------------------------------------
	//Função que vai fazer o filtro e atualizar as informações que vão ser exibidas
	this.filtrar = function (strEstado, intMes, intAno, strLoja, intInicial) {
		/*if (strEstado != null)
			this.configuracao.strEstado = strEstado.toLowerCase();
		else
			this.configuracao.strEstado = null;*/
		this.configuracao.strEstado = strEstado;
		this.configuracao.intMes = intMes;
		this.configuracao.intAno = intAno;
		this.configuracao.strLoja = strLoja;
		this.configuracao.intInicial = intInicial;

		this.configuracao.intPaginaAtual = 1; //seta para um toda vez que o filtro for atualizado
		this.configuracao.intTotalDePaginas=0; // zera o total para que a quantidade de paginação seja atualizada de acordo com o filtro
		this.atualizar();
	};

	//---------------------------------------------------------------------------------------------------
	//Função que altera a pagina e atualiza as informações que vão ser exibidas, mantendo o filtro já escolhido
	this.irPagina = function(intPagina) {
		this.configuracao.intPaginaAtual = intPagina;
		this.atualizar();
	};

	//---------------------------------------------------------------------------------------------------
	//Função responsável por atulizar as informações que vão ser exibidas
	this.atualizar = function () {

		//Caso solicitado a atualização dos dados, verifica se o request está sendo executado ainda.
		//Se estiver a variavel bolForcarAtualizacao fica true e depois a atualização é executada quando o request pegar os dados
		if (request.running) {
			bolForcarAtualizacao = true;
			return;
		}
		this.objDados.addClass('ajaxCarregando');
		if (objJson != null)
			this.objDados.innerHTML = this.criarListaDados(this.configuracao, objJson.secao.noticia);
		if (this.objPaginacao !=null && this.criarPaginacao != null)
			this.objPaginacao.innerHTML = this.criarPaginacao(this.configuracao);

		this.objDados.removeClass('ajaxCarregando');
	};
	
	
	//---------------------------------------------------------------------------------------------------
	// Função para ordenar arrays
	this.compararDatas = function(a, b) {
		var A = a.data.split(' ')[0].split('/');
		var B = b.data.split(' ')[0].split('/');
		var dateA = new Date(A[2], A[1]-1, A[0]);
		var dateB = new Date(B[2], B[1]-1, B[0]);
		return dateA - dateB;
		
	} 
	
	//---------------------------------------------------------------------------------------------------
	//Função Interna, Que cria a listagem dos itens, essa função chama a função externa: criarListaDadosItem, que deve ser definida fora da classe
	this.criarListaDados = function(oConfig, oDados) {
		var strHtml = '';
		if (oDados == null)
			return strHtml;
		else
		{
			//oDados.sort(this.compararDatas);
		}
	
		var intInicio = oConfig.intPaginaAtual-1; //Qual o indice do primeiro item que vai ser exibido
		var intFim = oDados.length; //Qual o indice do ultimo item que vai ser exibido
		var Inicio = 0;
		var Fim = 0;
		var anteriorInicio = 0;
		var contadorPaginacao = 0;
		var contadorMin = 0;
		var contadorMax = 0;
		
		// defini o limite superior e inferior
		if(intInicio > 0)
		{		
			if(intInicio == 1)
			{
				contadorMin = intInicio * 4
				Inicio = (intFim - 4) - 5;
				Fim = intFim - 4;
			}
			else
			{
				contadorMin = intInicio + 3;
				contadorMax = intInicio * 4;
				Inicio = (intFim - contadorMin) - contadorMax;
				Fim = intFim - contadorMax;
			}
		}
		else
		{
			Inicio = (intFim - 5);
			Fim = intFim	
		}
		
		
		// Caso for definido a quantidade de itens por pagina, não leva em consideração o filtro
		if (oConfig.intItensPorPagina > 0) {
		
			intInicio = ((oConfig.intPaginaAtual-1 ) * oConfig.intItensPorPagina); 
			intInicio = intInicio / 4;

			if (intFim > oDados.length)
				intFim = oDados.length;	
		}

		var intQtdItem = 0; // Quantidade de itens selecionados, pelo filtro, necessario para ajustar a paginação
		var data1 = new Date();
		var data2 = data1.getDate() + '/'  + data1.getMonth() + '/' + data1.getFullYear() ;
		var data3 = data2.split('/');
		var data = new Date(data3[2], data3[1], data3[0]);
		
		var MesVigente = data1.getMonth();
		var AnoVigente = data1.getFullYear();
		
		// obter data atual 
		var dataAtual = data1.getDate() + '/'  + data1.getMonth() + '/' + data1.getFullYear() ;
		
		var countposicao = 0;
		var countInt = 0;
		var countFim = 0;
		
	
		for (i = oDados.length; i > 0; i--) {
			i--;
			var dataInteira = oDados[i].data.split(' ')[0].split('/');
			dtDAtaPublicacao = new Date(dataInteira[2], dataInteira[1]-1, dataInteira[0]);
						
				//Verificar se os dados batem com o solicitado

				//Verificar se os dados batem com o solicitado
				if  ((((oConfig.strEstado != null && oConfig.strEstado.length > 0 && oConfig.strEstado == oDados[i].estado) || (oConfig.strEstado == null || oConfig.strEstado.length == 0)) && (
					(oConfig.intAno != null && oConfig.intAno > 0 && dtDAtaPublicacao.getFullYear() == oConfig.intAno) || (oConfig.intAno == null || oConfig.intAno == 0)) && (
					(oConfig.intMes != null && oConfig.intMes > 0 && dtDAtaPublicacao.getMonth() == (oConfig.intMes-1)) || (oConfig.intMes == null || oConfig.intMes == 0)) && (
					(oConfig.strLoja != null && oConfig.strLoja.length > 0 && oConfig.strLoja == oDados[i].loja) || (oConfig.strLoja == null || oConfig.strLoja.length == 0)) && ( // Foi ADICIONADO ESTA LINHA EM 25/02/2011
					(oConfig.strEstado != null && oConfig.strEstado.length > 0 || oConfig.intAno != null && oConfig.intAno > 0 || oConfig.intMes != null && oConfig.intMes > 0 || oConfig.strLoja != null && oConfig.strLoja.length > 0) // Foi MODIFICADO ESTA LINHA EM 25/02/2011
				)) || (
				(oConfig.strEstado == null || oConfig.strEstado.length == 0) &&
				(oConfig.intAno == null || oConfig.intAno == 0) &&
				(oConfig.intMes == null || oConfig.intMes == 0) &&
				(oConfig.strLoja == null || oConfig.strLoja.length == 0) &&  // Foi ADICIONADO ESTA LINHA EM 25/02/2011
				
				(oDados[i].data.split(' ')[0].substring(4,5) >= (MesVigente+1) ) //&& // Foi ADICIONADO ESTA LINHA EM 25/02/2011
				
				//(oDados[i].data.split(' ')[0].substring(3,5) >= (MesVigente+1) ) // Foi ADICIONADO ESTA LINHA EM 25/02/2011
				//(dtDAtaPublicacao >= data)
				)){		

					if (this.criarListaDadosItem == null) {// Avisa que não foi possivel encontrar a função para gerar o item
						alert('Fun\347\343o this.criarListaDadosItem não definida.');
						return;
					}

					//intQtdItem++; // Quantidade de itens pego pelo filtro
					
					if (i > Inicio && i < Fim) { // Se o item estiver nessa faixa ele mostra o conteudo
						dadosArmazenados.push(i);
					}
					
					curDay = (data1.getDate() < 10) ? ("0"+data1.getDate()) : data1.getDate();
					curDate = ((data1.getMonth()+1) < 10) ? ("0"+(data1.getMonth()+1) ) + '/' + curDay + '/' + data1.getFullYear():(data1.getMonth()+1) + '/' + curDay + '/' + data1.getFullYear();
					
					if(oConfig.intInicial){
						if( (oDados[i].data.split(' ')[0].substring(3,5) + '/' +  oDados[i].data.split(' ')[0].substring(0,2) + '/' +  oDados[i].data.split(' ')[0].substring(6)) >= curDate  ){
							strHtml = ""; // ADICIONADO para limpar a variavel
							oDados[i].titulo = (oDados[i].titulo == null || oDados[i].titulo == 'null') ? '' : oDados[i].titulo;
							oDados[i].chamada = (oDados[i].chamada == null || oDados[i].chamada == 'null') ? '' : oDados[i].chamada;
							oDados[i].descricao = (oDados[i].descricao == null || oDados[i].descricao == 'null') ? '' : oDados[i].descricao;
							strHtml = strHtml + this.criarListaDadosItem(oConfig, oDados[i], i);
							//keepDays.push( oDados[i].data.split(' ')[0]); // Defino um Array com as DATAS
							keepDays.push( oDados[i].data+":"+i); // Defino um Array com as DATAS
							keepDates.push( strHtml ); // Defino um Array com as DATAS
							//keepAll.push( oDados[i].data.split(' ')[0] );}
							keepAll.push( oDados[i].data+":"+i);
						}
					}else{
							strHtml = ""; // ADICIONADO para limpar a variavel
							oDados[i].titulo = (oDados[i].titulo == null || oDados[i].titulo == 'null') ? '' : oDados[i].titulo;
							oDados[i].chamada = (oDados[i].chamada == null || oDados[i].chamada == 'null') ? '' : oDados[i].chamada;
							oDados[i].descricao = (oDados[i].descricao == null || oDados[i].descricao == 'null') ? '' : oDados[i].descricao;
							strHtml = strHtml + this.criarListaDadosItem(oConfig, oDados[i], i);
							//keepDays.push( oDados[i].data.split(' ')[0]); // Defino um Array com as DATAS
							keepDays.push( oDados[i].data+":"+i); // Defino um Array com as DATAS
							keepDates.push( strHtml ); // Defino um Array com as DATAS
							//keepAll.push( oDados[i].data.split(' ')[0] );}
							keepAll.push( oDados[i].data+":"+i);
					}
				}					
				else {
					// Caso  o item não pega pelo filtro, altera os seguintes valores, para mostrar os itens certo
					Inicio--;
					Fim--;
				}
				
				i++;
				
			}
			
			var calcMath = 1;

			//Calcular a quantidade de paginas para a paginacao, caso for solicitado a paginação
			if (oConfig.bolAtivarPaginacao == true && oConfig.intItensPorPagina != null && oConfig.intItensPorPagina > 0 && oConfig.intTotalDePaginas == 0){
				oConfig.intTotalDePaginas = Math.ceil( (keepDays.length * calcMath) / oConfig.intItensPorPagina);
				//oConfig.intTotalDePaginas = Math.ceil((i*calcMath)/totalItensPage);
			}
			
			//alert('intQtdItem ' + intQtdItem + ' / ' + ' oConfig.intItensPorPagina ' +  oConfig.intItensPorPagina + ' oConfig.intTotalDePaginas = ' + oConfig.intTotalDePaginas);

			keepDays.sort( dmyOrdA ); // RE-Defino um Array com as DATA para ficar em ordem Crescente
			strHtml = "";
			
			if(intInicio>0){
				//forIndice = (dadosArmazenados.length > oConfig.intItensPorPagina)?(oConfig.intItensPorPagina)*intInicio:(dadosArmazenados.length)*intInicio;    //alert("Passa SIM 1");
				forIndice = (oConfig.intItensPorPagina)*intInicio;    //alert("Passa SIM 1");
			}else{
				forIndice = 0; //alert("Passa SIM 2");
			}
			
			for (g = forIndice; g < (forIndice+(oConfig.intItensPorPagina)); g++){
				//curDay = (keepDays[g].substring(3,5).indexOf("0") != -1)?keepDays[g].substring(4,5):keepDays[g].substring(3,5);
				//alert(keepDays[g]);
				indice = parseFloat(keepAll.indexOf(keepDays[g]));
				strHtml = (keepDates[indice]!=undefined)?strHtml + keepDates[indice]:strHtml + "";
			}

			keepDays.splice(0,keepDays.length);
			keepDates.splice(0,keepDates.length);
			keepAll.splice(0,keepAll.length);
			dadosArmazenados.splice(0,dadosArmazenados.length);
		
		if(strHtml == ""){
			strHtml = "<br /><br /><p align='center' style='color:#ff0000'>N&atilde;o h&aacute; pr&oacute;ximo(s) evento(s) cadastrado(s) para este m&ecirc;s!</p>"
		}
		return strHtml;
		
			
	};
	//---------------------------------------------------------------------------------------------------
	//Função responsável por mostrar as informações que são referentes ao item escolhido
	this.mostrarDados = function(intIndex) {
		if (this.criarDados != null) {
			objDados.innerHTML = this.criarDados(this.configuracao, objJson.secao.noticia[intIndex]);
			if (objPaginacao != null)
				objPaginacao.innerHTML = "";
		} else { //Abrir link para a noticia
			document.location.href = this.configuracao.strPaginaLink.replace('[ID]', objJson.secao.noticia[intIndex].OBJ_ID);
		}
	};

	//---------------------------------------------------------------------------------------------------
	//Codigo executado quando o objeto for criado
	var me = this; // utilizado para ter referencia sobre o objeto atual
	this.objDados.addClass('ajaxCarregando');
	//Requisita o arquivo no formato JSON
	var request = new Request({
		url: strArquivoJson,
		method: 'get',
		encoding: 'utf-8',
		autoCancel: true,
		onSuccess: function(jsonObj, txt) {
			objJson = JSON.decode(jsonObj);
			if (bolForcarAtualizacao) { //Se for feita uma tentativa de atualização, antes do arquivo ser carregado, atualiza agora
				me.atualizar();
			}
			me.objDados.removeClass('ajaxCarregando');
			CarregarEstados(objJson, $('selEstado'), 'estado');
			CarregarLojas(objJson, $('selLoja'), 'loja');
			
		},
		onFailure: function(instance) {
			if (instance.status == 406)
				alert('Erro de configura\347\343o no servidor para arquivos JSONs.\n' + 'Erro n\260: ' + instance.status + ".\nMensagem: " + instance.statusText + ".");
			else if (instance.status == 404)
				alert('N\343o foi poss\355vel localizar um dos arquivos.');
			else
				alert('Erro de comunica\347\343o com o servidor.\n' + 'Erro n\260: ' + instance.status + ".\nMensagem: " + instance.statusText + ".");
			me.objDados.removeClass('ajaxCarregando');
		}
	}).send();
}

function CarregarEstados(objDados, objSelect, campoTitulo){
	$(objSelect).selectedIndex = "";
	
	objSelect.disabled = true;

	//Excluir quase todos os itens, somente deixa o primeiro
	while (objSelect.length > 1) {
		objSelect.remove(1);
	}

	if (objDados == null) { // quando for nulo não encontrou os dados
		//objSelect.disabled = false; deixa desabilitado
		return false;
	}
	
	var objNoticia = objDados.secao.noticia;
	var estado = new Array();
	var arrHoje = new Date();
	varAno = arrHoje.getFullYear();
	
	//Joga os itens em uma array
	for(var i = 0; i < objNoticia.length; i++) {
		if( objNoticia[i].data.indexOf(varAno) != -1 ){
			estado[i] = objNoticia[i][campoTitulo];
		}
		//alert(objNoticia[i].data.indexOf(varAno));

	}
//	document.write(estado + "<br />" + estado.sort());
	estado.sort();
	
	//Verifica se existem itens repetidos na array
	for(i = 0; i < estado.length; i++){
		if(estado[i] != estado[i - 1]){
			
			try {
				if(estado[i]!=undefined){
				objSelect.add(new Option(estado[i], estado[i]));} // somente IE 
			} catch(ex) {
				objSelect.add(new Option(estado[i], estado[i]), null); // não funciona no IE
			}
		}
	}
	
	objSelect.disabled = false;
}
function CarregarLojas(objDados, objSelect, campoTitulo){
	$(objSelect).selectedIndex = "";
	
	objSelect.disabled = true;

	//Excluir quase todos os itens, somente deixa o primeiro
	while (objSelect.length > 1) {
		objSelect.remove(1);
	}

	if (objDados == null) { // quando for nulo não encontrou os dados
		//objSelect.disabled = false; deixa desabilitado
		return false;
	}
	
	var objNoticia = objDados.secao.noticia;
	var loja = new Array();
	var arrHoje = new Date();
	varAno = arrHoje.getFullYear();
	
	//Joga os itens em uma array
	for(var i = 0; i < objNoticia.length; i++) {
		if( objNoticia[i].data.indexOf(varAno) != -1 ){
			loja[i] = objNoticia[i][campoTitulo];
		}
		//alert(objNoticia[i].data.indexOf(varAno));

	}
//	document.write(estado + "<br />" + estado.sort());
	loja.sort();
	
	//Verifica se existem itens repetidos na array
	for(i = 0; i < loja.length; i++){
		if(loja[i] != loja[i - 1]){
			
			try {
				if(loja[i]!=undefined){
				objSelect.add(new Option(loja[i], loja[i]));} // somente IE 
			} catch(ex) {
				objSelect.add(new Option(loja[i], loja[i]), null); // não funciona no IE
			}
		}
	}
	
	objSelect.disabled = false;
}


