function ListagemBusca(objDados, objPaginacao, strArquivoJson, objCriarListaDadosItem, objCriarPaginacao, objCriarDados, onAtualizarListagemDeDados) {

	// -- 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
	var request = null; // request que acessa o WS para pegar o Json
	// -- INI --- Configuração -----------------------
	this.configuracao = {
		'strIdioma': null,		 	  //
		'strDescricao': null,	  	  //
		'strTagHightlight': null, 	  //
		'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
		'strMensagemNaoEncontrado' : null, //A mensagem que será exibida quando o Json não tem os dados para ser exibidos
		'intTamanho' : 2000 // Quantidade de caracteres que serão exibidos na descricao do item
	};
	
	// -- 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
	this.onAtualizarListagemDeDados = onAtualizarListagemDeDados;//externo (opcional), a função que é chamada contendo as informações da pagina (paginacao do objeto) atual

	//---------------------------------------------------------------------------------------------------
	//Função que vai fazer o filtro e atualizar as informações que vão ser exibidas
	this.filtrar = function (strIdioma, strDescricao, strTagHightlight, intTamanho) {
		if (strIdioma != null)
			this.configuracao.strIdioma = strIdioma.toLowerCase();
		else
			this.configuracao.strIdioma = null;

		if (strDescricao != null)
			this.configuracao.strDescricao = strDescricao.replace("'", "''");
		else
			this.configuracao.strDescricao = null;

		if (strTagHightlight != null)
			this.configuracao.strTagHightlight = strTagHightlight;
		else
			this.configuracao.strTagHightlight = null;
			
		if (strTagHightlight != null)
			this.configuracao.intTamanho = intTamanho;
		else
			this.configuracao.intTamanho = 2000;

			

		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
		
		atualizarJson(strIdioma, strDescricao, strTagHightlight, intTamanho);
		
		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.Busca.Item);
		else
			this.objDados.innerHTML =  this.configuracao.strMensagemNaoEncontrado;
		if (this.objPaginacao !=null && this.criarPaginacao != null)
			this.objPaginacao.innerHTML = this.criarPaginacao(this.configuracao);
		this.objDados.removeClass('ajaxCarregando');
	};
	
	//---------------------------------------------------------------------------------------------------
	//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;

		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
		// 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 );
			intFim = ((oConfig.intPaginaAtual) * oConfig.intItensPorPagina );
			if (intFim > oDados.length)
				intFim = oDados.length;
		}
		
		for (i = intInicio; i < intFim; i++) {
			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;
			}
				strHtml = strHtml + this.criarListaDadosItem(oConfig, oDados[i], i);
		}
			//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( oDados.length / oConfig.intItensPorPagina);

		//Caso for definido entrega as informações da exibicao atual
		if (this.onAtualizarListagemDeDados != null) {
			var oPaginaInformacao = {
				intPaginaAtual : oConfig.intPaginaAtual,
				intTotalDeItens: oDados.length,
				intItensPorPagina: oConfig.intItensPorPagina,
				intIndicePrimeiroItemExibido : intInicio +1,
				intIndiceUltimoItemExibido : intFim
			}			
			this.onAtualizarListagemDeDados(oPaginaInformacao);
		}
		
		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.Busca.Item[intIndex]);
			if (objPaginacao != null)
				objPaginacao.innerHTML = "";
		} else { //Abrir link para a noticia
			document.location.href = this.configuracao.strPaginaLink.replace('[ID]', objJson.Busca.Item[intIndex].OBJ_ID);
		}
	};

	//---------------------------------------------------------------------------------------------------
	//Requisita o arquivo no formato JSON
	function atualizarJson(strIdioma, strDescricao, strTagHightlight, intTamanho) {
		
		request = new Request({
			url: strArquivoJson,
			method: 'post',
			encoding: 'utf-8',
			autoCancel: true,
			onSuccess: function(responseText, responseXML) {
				try {
				
				//objJson = JSON.decode(responseXML.documentElement.firstChild.nodeValue);				
				objJson = JSON.decode(responseText.replace('<?xml version="1.0" encoding="utf-8"?>\r\n<string xmlns="http://tempuri.org/">', '').replace('</string>', '').replace(/&lt;/g,'<').replace(/&gt;/g, '>'));
				} catch (e) {
					objJson = null;
				}
				if (bolForcarAtualizacao) { //Se for feita uma tentativa de atualização, antes do arquivo ser carregado, atualiza agora
					me.atualizar();
				}
				me.objDados.removeClass('ajaxCarregando');
			},
			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('Idioma=' + strIdioma + '&Descricao=' + strDescricao + '&TagHightlight=' + strTagHightlight + '&Tamanho=' + intTamanho);
	}

	//---------------------------------------------------------------------------------------------------
	//Codigo executado quando o objeto for criado
	var me = this; // utilizado para ter referencia sobre o objeto atual
}