//Data da criacao 26/12/2006 versao 1.0
//Data da criacao 23/07/2007 versao 2.0
//Data da criacao 02/02/2008 versao 3.0 ## Traz as funcionalidades para funcionar com o MVC
/**
 * Autor: Pablo Filetti Moreira
 * Ultima Atualizacao: 22/04/08
**/
function Grid(idGrid, controller)
{
	this.idGrid		= idGrid;
	this.controller	= controller;
	this.root;

	this.page			= 1;
	this.orderField		= null;
	this.orderType		= null;
	this.filters		= new Array();

	this.atualizarPage  = 'grid';

	//Divs
	this.idPesquisa				= 'pesquisa';

	this.ordernar = function(orderField, orderType)
	{
		this.orderField	= orderField;
		this.orderType	= orderType;
		this.page = 1;
		this.atualizar();
	}
	/**
	 *	Esta funcao tem que ser executada quando a pagina for carregada
	 *	Para iniciar as variaveis necessarias, e carregar os dados do grid
	*/
	this.load = function()
	{
		this.root = $id(this.idGrid);
		this.atualizar();
	}
	this.irPagina = function(page)
	{
		this.page = page;
		this.atualizar();
	}
	this.atualizar = function()
	{
		//Objeto AJAX
		var Ajax = new AJAX();

		var post = '';

		//	Declaracao dos parametros que serao passados pelo POST
		if(this.page != null)
		{
			post += 'page=' + this.page;
		}

		//	Verifica se foi declarado alguma ordenacao
		if(this.orderField != null && this.orderType != null)
		{
			post += '&order[field]=' + this.orderField + '&order[type]=' + this.orderType;
		}
		else
		{
			post += '&order=0';
		}

		//	Verifica se foi declarado algum filtro
		if(this.filters.length != 0)
		{
			for(var i=0; i < this.filters.length; i++)
			{
				post += '&filters['+i+'][field]=' + this.filters[i].field + '&filters['+i+'][search]=' + encodeURIComponent(this.filters[i].search);
			}
		}
		else
		{
			post += '&filters=0';
		}

		// Pego o ponteiro do objeto Atual
		var obj = this;

		Ajax.onreadystatechange = function()
		{
			obj.atualizarResultado(Ajax);
		}
		Ajax.open('post', WEB_ROOT + this.controller + '/' + this.atualizarPage, true);
		Ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		Ajax.send(post);
	}
	//Durante as etapas da requisição do objeto XMLHttpRequest essa funcao realizarar procedimentos
	//como barra de loading e mostrar o resultado quando finalizado
	this.atualizarResultado = function(Ajax)
	{
		if(Ajax.readyState == 1)
		{
			//Carregando...
		}
		if(Ajax.readyState == 4)
		{
			if(Ajax.status == 200)
			{
				this.root.innerHTML = Ajax.responseText;
			}
			else
			{
				alert('Erro!');
			}
		}
	}
	this.atualizarFiltroAtivado = function(index)
	{
		var divPesq = $id(this.idPesquisa);

		if(this.filters.length == 0)
		{
			divPesq.removeChild(divPesq.childNodes[1]);
		}
		else
		{
			var idUlPesqFiltros = 'ulPesqFiltros';
			if(divPesq.childNodes.length == 1)
			{
				var divPesq = $id(this.idPesquisa);
					var div = $new('div');
					var divFiltro = $new('div');

						var h5 = $new('h5');
						h5.innerHTML = 'Filtro(s) Ativo(s)';

					divFiltro.appendChild(h5);

						var ul = $new('ul');
						ul.id = idUlPesqFiltros;

					divFiltro.appendChild(ul);
					div.appendChild(divFiltro);

				divPesq.appendChild(div);
			}
			else
			{
				var ul = $id(idUlPesqFiltros);
				ul.innerHTML = '';
			}
			var	GRID = this;

			for(i=0; i< this.filters.length; i++)
			{
				var li	= $new('li');
				li.aIndex = i;
				li.onclick = function()
				{
					GRID.removerFilter(this.aIndex);
				}
				li.innerHTML = '<img src="'+ WEB_ROOT + 'img/grid/deletar.png" />[' + this.filters[i].label + '] = "' + this.filters[i].search + '"';
				ul.appendChild(li);
			}
		}
	}
	this.pesquisar = function(label, field, search)
	{
		var newFilter = { 'label' : label, 'field': field, 'search': search };

		//Verifica se esta vazio
		if(this.filters.length == 0)
		{
			this.filters = new Array();
			this.filters[0] = newFilter;
		}
		else
		{
			this.filters[this.filters.length] = newFilter;
		}
		this.atualizarFiltroAtivado();

		this.page	= 1;
		this.atualizar();
	}
	this.removerFilter = function(index)
	{
		for(i=index; i < (this.filters.length - 1); i++)
		{
			this.filters[i] = this.filters[i+1];
		}
		//remove o ultimo elemento
		this.filters.length = this.filters.length - 1;

		this.atualizarFiltroAtivado();

		this.page	= 1;
		this.atualizar();
	}
}
