function Paginador() {

	this.requisicao = 0;
	this.paginaAtual = 0;
	this.totalDeDados = 0;
	this.totalDadosPorPagina = 0;
	
	this.arrayResultados = null;
	
	
	this.setTotalDadosPorPagina = function(vTotalDadosPorPagina) {
		this.totalDadosPorPagina = vTotalDadosPorPagina;
	}
	
	this.setTotalDeDados = function(vTotalDeDados) {
		this.totalDeDados = vTotalDeDados;
	}
	
	//O LENGTH DO ARRAY DE RESULTADO DEVE SER IGUAL AO VALOR MAXIMO DE RESULTADOS POR REQUISICAO
	this.setArrayResultados = function(vArrayResultados) {
		this.arrayResultados = vArrayResultados;	
	}
	
	this.setRequisicao = function(vRequisicao) {
		this.requisicao = vRequisicao;
	}
	
	this.getRequisicao = function() {
		return this.requisicao;
	}
	
	this.getPaginaAtual = function() {
		return this.paginaAtual;
	}
	
	/*
	 * Retorna a proxima pagina
	 */
	this.proxima = function() {
		return this.getPagina(this.getPaginaAtual() + 1);
	}
	
	/*
	 * Retorna a pagina anterior
	 */
	this.anterior = function() {
		return this.getPagina(this.getPaginaAtual() - 1);
	}
	
	/*
	 * Retorna uma pagina especificada
	 */
	this.getPagina = function(vPagina) {
		this.paginaAtual = vPagina;
		
		var arrayRetorno = new Array(this.totalDadosPorPagina);
		
		var marcador = ((this.paginaAtual - ((this.requisicao - 1) * this.maximoDePaginasPorArray())) * this.totalDadosPorPagina) - this.totalDadosPorPagina;
		
		for (var i = 0; i < this.totalDadosPorPagina; i++) {
			arrayRetorno[i] = this.arrayResultados[marcador + i];
		}		
		
		return arrayRetorno.compact();
	}
	
	/*
	 * Retorna booleano informando se a pagina atual for a primeira.
	 */
	this.primeiraPagina = function() {
		return this.paginaAtual <= 1;
	}
	
	/*
	 * Retorna booleano informando se a pagina atual for a ultima
	 */
	this.ultimaPagina = function() {
		return this.paginaAtual == this.maximoDePaginas();
	}
	
	/*
	 * Retorna o numero maximo de paginas a serem mostrados.
	 * Esse numero pode ultrapassar os limites do array de dados.
	 */
	this.maximoDePaginas = function() {
		return Math.ceil(this.totalDeDados / this.totalDadosPorPagina);
		//return Math.ceil(this.arrayResultados.length / this.totalDadosPorPagina); 
	}
	
	/*
	 * Retorna o numero maximo de paginas para o array atual.
	 * Esse numero NUNCA ultrapassa o array de dados.
	 */
	this.maximoDePaginasPorArray = function() {
		return Math.ceil(this.arrayResultados.length / this.totalDadosPorPagina);
	}
	
	/*
	 * Informa se a requisicao de pagina estiver fora dos limites do array de resultados
	 */
	this.novaRequisicao = function(pagina) {
		var rv = -1;
		
		if ((Math.ceil(pagina / this.maximoDePaginasPorArray())) != this.getRequisicao()) {
			if (pagina > this.paginaAtual) {
				rv = (this.requisicao * this.arrayResultados.length);	
				this.setRequisicao(Math.ceil(pagina / this.maximoDePaginasPorArray()));
			}
			else {
				this.setRequisicao(Math.ceil(pagina / this.maximoDePaginasPorArray()));
				rv = ((this.requisicao - 1) * this.arrayResultados.length);
			}
		} 
		
		return rv;
	}
}