var autoResponse = true;

setAutoResponse = function(status) {
	autoResponse = status;
}

/**
* Classe responsável pelas requisições ao servidor
* 
* 
* @author Rafael Lucio <poste9 [at] gmail [dot] com[nospam]>
* @options instancia da classe JSGridDataOptions
* @serverResponse retorna o responseText (texto plano) da resposta do servidor
* @data retorna um objeto que é gerado ao receber a resposta do servidor
*/
JSGridDataProvider = new utm.Class({
	options:{},
	serverResponse:'',
	data:{},
	__construct:function(options) {
		this.options = (options) ? options : new JSGridDataOptions({});

		/* Se autoResponse estiver ligado, faz primeira requisição ao iniciar. */
		if (autoResponse) {
			this.getJSON();
		}
	},
	getJSON:function() {
		u('html *').css('cursor','progress');
		/* Envia requisição pro servidor e retorna em forma de JSON */
		this.serverResponse = utm.post(this.options.url, this.options.postvars,false).responseText;
		/* Tenta dar um eval() no retorno, caso contrário mostra o erro trazido pelo servidor */
		try {
			this.data = eval("("+this.serverResponse+")");
			if (typeof(this.data) != "object") throw ""; 
		} catch(ex) { 
			u(this.options.errorElement).html(this.serverResponse);
			throw 'erro encontrado';
		}
		u('html *').css('cursor','default');
	}
});
/**
* Classe responsável pelas opções do DataProvider
* 
* @author Rafael Lucio <poste9 [at] gmail [dot] com[nospam]>
* @errorElement indica a tag (pode usar seletores) no qual será mostrado algum erro se houver
* @url indica a url nonde será feita a requisição para busca dos dados
* @postvars é um objeto com os campos padrões de definição que o servidor está preparado pra receber
* no nosso caso essa os campos default são: 
* @@_search:Boolean indica se está sendo executado uma busca ou não
* @@page: indica a página solicitada
* @@rows: indica a quantidade limite de registros a serem retornados
* @@sidx: indica o nome do campo que será colocado no ORDER BY da query
* @@sord: indica o tipo de ordernação padrão. Use "asc" para ascendente e "desc" para descendente
*/
JSGridDataOptions = new utm.Class({__construct:function(params){ u(this).ext(params); this.simplePost = params.url; }});
/**
* Classe responsável pela formatação do layout
* 
* @author Rafael Lucio <poste9 [at] gmail [dot] com[nospam]>
* @width determina a largura da grid
* @rowColors um array que determina as cores de fundo que as <tr> terão alternadamente
* @rowHoverColor determina a cor que a <tr> terá no mouseover
* @borderColor determina a cor da borda de cada célula
*/
JSGridStylesOptions = new utm.Class({__construct:function(params){ u(this).ext(params); }});
/**
* Classe responsável pela criação das colunas
* 
* @author Rafael Lucio <poste9 [at] gmail [dot] com[nospam]>
* @label nome que vai ficar no <th>
* @field nome do campo que será enviado no order by
* @hidden determina se o campo é oculto
* @link informa se o campo possue link
* @url informa o link pra onde o cliente será redirecionado ao clicar na <tr>
*/
JSGridColumnModel = new utm.Class({__construct:function(params){ u(this).ext(params); }});

/**
* Classe responsável pela criação da Grid
* 
* @author Rafael Lucio <poste9 [at] gmail [dot] com[nospam]>
* @order:[],  responsável pelos nomes dos campos de ordenação (order by)
* @options:{},  definições de layout (cores, borda e largura)
* @dataProvider:null,  responsável pela requisição, é um objeto da classe JSGridDataProvider
* @columns:[],  Array com as colunas, cada item é um objeto da classe JSGridColumnModel
* @head:'',  responsável por ter o html do <thead> da tabela 
* @body:'',  responsável por ter o html do <tbody> da tabela
* @footer:'',  responsável por ter o html do <tfoot> da tabela
* @table:'',  html completo da grid
* @search:'', html da barra de buscaecho 
* @rows:[],  responsável por armazenar o id de cada <tr> da tabela juntamente com seu respectivo link
* @heads:[],  responsável por armazenar o id de cada <th> da tabela juntamente com seu respectivo link
* @lockHead:false,  flag que determina se deve alterar a ordenação de 'ASC' para 'DESC'
* @gridElement:{},  contém o id da tag onde a grid será gerada
* @headDirection:null,  contém o tipo de ordenação ao fazer a requisição. Valores possíveis: "asc" e "desc"*/
JSGrid = new utm.Class({
	__construct:function(gridElement,options,url) {
		JSGrid.__instances.push(this);
		this.columnsNotHiddenCount = 0;
		this.columns = [];
		this.searchItems = [];
		/* Define por padrão os nomes dos campos de ordenação*/
		this.order = ["sidx","sord"];
		/* Atribue o id da tag onde a grid será gerada*/
		this.gridElement = gridElement;
		/* armazena a configuração de layout */
		this.options = (options) ? options : new JSGridStylesOptions({});
		this.link = url;
		this.setCloseCallback(null);
		this.messageNoRecords = 'Nenhum registro encontrado';
		this.messageStartup   = "Pressione no botão 'pesquisar'";
	},
	addColumn:function(columnModel){
		/* armazena os dados da coluna */
		this.columns.push(columnModel);
	},
	execute:function() {
		this.table = u.create('table'+
		'[cellpadding=0][cellspacing=0]')
		.add(this.printHeaders())
		.add(this.printFooter())
		.add(this.printBody())		
		.css('width',this.options.width);
		
		this.table[0].cellPadding = 0;
		this.table[0].cellSpacing = 0;
		this.table[0].border      = 0;
		/* Monta o rodapé */
		
		this.makeFooter();
		
		/* Insere a tabela na tag do id determinado no constructor da classe */
		u(this.gridElement).empty();
		u(this.gridElement).add(this.table);

		/* Insere o rodapé */
		u("#"+this.footerID).add(this.objectFooter).add(this.teste);

		/* Função para atribuição dos eventos da grid */
		this.addEvents();
	},
	makeTH:function(head,column) {
		if (!this.countSearchBarsInitialized)
		this.columnsNotHiddenCount = this.columnsNotHiddenCount + 1;
		/* Caso exista o atributo scaleWidth, estabelece a largura pela porcentagem, senão por pixel. */
		var width = (column.scaleWidth) ? 
					 column.scaleWidth * 100 + "%" :
			         column.width,
		/* Gera um id randomico */
		className = "jsgrid-thead ",
		ramdomID  = "thead_"+Math.floor(Math.random() * 10000) * 2;

		if ((u(this.columns).index(column)+1) == this.columns.length) {
		className = className + "jsgrid-thead-last";
		}
		
		//para corrigir problemas no IE. caso valor da coluna naos eja passado redefine para 0
		width = !width ? 0 : width;
		/* Monta os <th> com o ID randômico e com o texto estabelecido no this.addItem()*/
		head.append('th#'+ramdomID+'[class='+className+']',column.label).css({'cursor':'pointer','width':width});

		/* Armazena o id randomico gerado e o nome do campo pra ser usado posteriormente */ 
		this.heads.push({'thead_id':ramdomID,'field':column.field});
		/* Caso a flag esteja desabilitada (false) seta o headDirection pra Ascendente */
		if (!this.lockHead) this.headDirection.push("asc");
	},
	printHeaders:function() {
		/* Caso for a primeira vez que a grid é gerada, inicializa o headDirection */
		if (!this.lockHead) this.headDirection = [];
		/* Zera o atributo que contém o id e os links dos TH */
		this.heads = [];
		this.headT = u.create('thead'); 
		this.head  = this.headT.append('tr');
		
		/* Percorre o array das colunas geradas com o this.addItem() */
		for(var i=-1;this.columns[++i];){
			/* Caso a coluna não tenha o atributo hidden : true Continua... */
			if (!this.columns[i].hidden) this.makeTH(this.head,this.columns[i]);
			if(this.columns[i].hidden == 'search'){ this.makeTH(this.head,this.columns[i]); }
		}
		this.countSearchBarsInitialized = true;

		return this.headT;
	},
	makeTD:function(body,column,row,i){
		if (!column.hidden || column.hidden == 'search') {
			var className = "jsgrid-td ";
			if ((i+1) == this.columns.length) className = className + "jsgrid-td-last";
			body.append("td[class="+className+"]").html(row.cell[i]);
		}
		
		return [column.field,row.cell[i]];
	},
	makeBody:function(row,j) {
		/* Gera um id randômico pra cada <tr> */
		var randomID = "row_"+Math.floor(Math.random() * 10000) * 2, link = [],
		/*var randomID = "row_"+row.cell[0],*/
		body = this.body.append("tr#"+randomID).addClass(this.options.rowClasses[j % 2]);
		
		/* Percorre o array das colunas geradas com o this.addItem(); */
		for(var i=-1;this.columns[++i];) {
			/* Monta o <td> */
			var columnData = this.makeTD(body, this.columns[i], row, i);
			link.push(columnData[0],columnData[1]);
		}

		/* Armazena o id randômico juntamente com o link gerado */
		this.rows.push({'row_id':randomID, 'link':link});
	},
	printWarning:function(message)
	{
		this.body.append("tr")
		.append('td[colspan=' + this.columns.length+']')
		.append('span', '.').html(message);
	},
	printBody:function()
	{
		var rows = this.dataProvider.data.rows ? this.dataProvider.data.rows.length : -1;

		/* Zera o corpo da tabela */
		this.body = u.create("tbody");
		/* Zera os ids e os links de cada <tr> */
		this.rows = new Array();

		/* Percorre um loop nos rows retornados pela requisição do dataProvider */
		for (var j = 0; j < rows; ++j) {
			this.makeBody(this.dataProvider.data.rows[j], j);
		}

		/* Nenhum registro, colocando um aviso na tela */
		if (j == 0) {
			if (!this.dataProvider.data.rows) {
				this.printWarning(this.messageStartup);
			} else {
				this.printWarning(this.messageNoRecords);
			}
			j++;
		}

		/*   Adiciona colunas pra manter a altura */
		/**/ for (var i = j; i < this.dataProvider.options.postvars.rows; i++)
		/**/	this.body.append("tr")
		/**/		.append('td[colspan=' + this.columns.length+']')
		/**/		.append('span', '.').css({'visibility': 'hidden'});
		/*****************************************************/
		return this.body;
	},
	printFooter:function() {
		/* Este método só gera o <tfoot> com o colspan de acordo com a quantidade de colunas e um id randomico*/
		this.footerID = "foot_"+Math.floor(Math.random() * 10000) * 2;
		this.footerT = u.create('tfoot');
		this.footer = this.footerT
					   .append('tr')
					   .append('td.footer#'+this.footerID+
							   '[colspan=3]');
		this.footer[0].colSpan = this.columns.length;
		
		return this.footerT;
	},
	makeFooter:function()
	{
		var records = (this.dataProvider.data.records ? this.dataProvider.data.records : 0);
		var total = (this.dataProvider.data.total ? this.dataProvider.data.total : 0);
		var page = (this.dataProvider.data.page ? this.dataProvider.data.page : 0);

		/* Cria a div principal do rodapé */
		this.objectFooter = u.create("tfoot").append("tr").append("td").append("div").css({"text-align":"center"});
		this.teste = u.create("tfoot").append("tr").append("td").append("div").css({'text':'rigth'});
		/* Cria o botão anterior */
		this.objectPrevious = u.create("label","< Anterior").css({"cursor":"pointer"});
		/* Cria o botão próximo */
		this.objectNext = u.create("label"," Próximo >").css({"cursor":"pointer"});
		/* Cria o label com a quantidade de páginas no total da grid */
		this.objectTotalPages = u.create("label", "/ " + total).attr("class", "total-rows");
		/* Cria o label com o total de registros */
		this.objectTotalRegistros = u.create("label", "Total de registros: " +	records);

		/* Cria o input que informa a página atual */
		this.objectCurrentPage = u.create("input")
		.attr({
			"type":  "text",
			"size":  total.toString().length + 10,
			"class": "page-input",
			"value": page
		});
		
		/* Junta todos os itens criados na div principal e inicializa os Eventos do rodapé */
		this.objectFooter
		.add(this.objectPrevious)
		.add(this.objectCurrentPage)
		.add(this.objectTotalPages)
		.add(this.objectNext);
		
		this.teste.add(this.objectTotalRegistros);		

		this.addFooterEvents();
	},
	paginationClickHandler:function(event){
		var owner = this.owner,
		    dataProvider = owner.dataProvider,
		    postvars = dataProvider.options.postvars;

		var total = (dataProvider.data.total ? dataProvider.data.total : 0);
		var page = (dataProvider.data.page ? dataProvider.data.page : 0);

		/* Altera valor da variavel da página e faz a requisição */
		postvars.page = eval(parseInt(dataProvider.data.page) + u(this).attr('rel'));

		if(postvars.page >= 1 && postvars.page <= dataProvider.data.total){
			dataProvider.getJSON();
			owner.execute();
		}
		//acrescentado para mostrar ou não os botões (anterior/proximo).andre maciel
		if (page == total - 1) {
			owner.objectNext.css({'visibility':'hidden'});
		}
	},
	addFooterEvents:function()
	{
		var size = (this.dataProvider.data.total ? this.dataProvider.data.total.toString().length : 1) * 10 + "px";
		var total = (this.dataProvider.data.total ? this.dataProvider.data.total : 0);

		/* Adiciona o owner no objeto pra ter referencia a sua instancia dentro do onclick */
		this.objectNext[0].owner = this;
		this.objectNext.attr('rel', ' + 1');
		this.objectNext.click(this.paginationClickHandler);
		
		this.objectPrevious[0].owner = this;
		this.objectPrevious.attr('rel', ' - 1');
		this.objectPrevious.click(this.paginationClickHandler);
		
		this.objectCurrentPage[0].owner = this;
		this.objectCurrentPage.css({'width': size});

		this.objectCurrentPage.blur(function(){
			this.style.width = (this.value.length + 1) * 6 + "px"; 
			if (/\D/.test(this.value)) this.value = this.value.substr(0,this.value.length-1);
			else {
				this.owner.dataProvider.options.postvars.page = this.value;
				this.owner.dataProvider.getJSON();
				this.owner.execute();
			}
		});
		//acrescentado para mostrar ou não os botões (anterior/proximo).andre maciel
		//if (this.dataProvider.data.total && (this.dataProvider.options.postvars.page == 1)) {
		if (this.dataProvider.options.postvars.page == 1) {
			this.objectPrevious.css({'visibility':'hidden'});
		}
		
		//acrescentado para mostrar ou não os botões (anterior/proximo).andre maciel
		if (total <= 1) {
			this.objectPrevious.css({'visibility':'hidden'});
			this.objectNext.css({'visibility':'hidden'});
		}
	},
	headClickHandler:function(event){
		/* Se a direção estiver em "asc" altera pra "desc" e vice-versa */
		var direction = "asc",owner = this.owner, headDirection = owner.headDirection, 
			dataProvider = owner.dataProvider, postvars = dataProvider.options.postvars;
		direction = (this.owner.headDirection[this.ownerIndex] != direction) ? "asc" : "desc";
		this.orderby = direction;
		headDirection[this.ownerIndex] = direction;
		postvars[this.owner.order[1]] = direction;
		/* Pega o nome do campo pra fazer o order by de acordo com o TH clicado */
		postvars[owner.order[0]] = owner.heads[this.ownerIndex].field;
		/* Envia a requisição */
		dataProvider.getJSON();
		/* Altera a flag lockHead */
		owner.lockHead = true;
		/* dah um refresh na grid */
		owner.execute();
	},
	addEvents:function() {
		/* Column Events */
		for(var i=-1;this.heads[++i];){
			var thead = u("#"+this.heads[i].thead_id);
			thead[0].owner = this;
			thead[0].ownerIndex = i;
			thead.click(this.headClickHandler);
		}
		/* Row Events */
		for(var i=-1;this.rows[++i];){
			var row = u("#"+this.rows[i].row_id);
			row[0].overClass 	= this.options.rowClasses[2];
			row[0].outClass  	= this.options.rowClasses[(i % 2)];
			row[0].owner 	 	= this;
			row[0].params		= this.rows[i].link;

			/* Click, Over e Out Events */
			row.mouseover(function(){ u(this).rmClass(this.outClass).addClass(this.overClass); });
			row.mouseout (function(){ u(this).rmClass(this.overClass).addClass(this.outClass); });

			if(this.dataProvider.options.event)
			{
				for(var j in this.dataProvider.options.event)
					eval('row.'+j+'(function(){this.owner.eventListener(this, \''+j+'\')});');
			}
			else
			{
				row.click(function(){this.owner.eventListener(this, 'click');});
			}
		}
	},
	eventListener:function(object, event) {

		var dcTime=1000;    // doubleclick time

		top.rowSel		= object;
		top.object		= this;

		if(event == 'click')
		{
			if(top.clickAction)
			{
				top.rowEvent	= 'dblclick';
				this.eventDisp();
			}
			else
			{
				top.rowEvent	= 'click';
				top.clickAction = setTimeout('top.object.eventDisp();', dcTime);
			}
		}
	},
	eventDisp:function() {
		clearTimeout(top.clickAction);
		top.clickAction = false;

		try {
			/* tratamento para evitar que registros que possuam / quebrem o parametro de funcionamento da grid */
			var tratamento = top.rowSel.params.toString();			
			top.rowSel.params = tratamento.replace(/\//g, '-').split(",");
			window[top.rowSel.owner.dataProvider.options.event[top.rowEvent]](top.rowSel.params);  
		}catch(ex0) {
			try {
				var link = top.rowSel.owner.dataProvider.options.event[top.rowEvent];
				
				/* qualquer mudanca nesse tratamento de link deve acontecer tbm na tratamento que vem logo a seguir */
				if(link != undefined)
					window.location.href = link + top.rowSel.params.join("/");
			}catch(ex1) {
				try {
					window[top.rowSel.owner.dataProvider.options.callBack]( top.rowSel.params );
				}catch(ex2) {
					var link = ((/\/$/).test(top.rowSel.owner.dataProvider.options.clickLink)) ? 
									top.rowSel.owner.dataProvider.options.clickLink   :
									top.rowSel.owner.dataProvider.options.clickLink;

					/* qualquer mudanca nesse tratamento de link deve acontecer tbm na tratamento que vem logo acima */
					if(link != undefined && link.replace('/', '') != 'undefined')
						window.location.href = link + top.rowSel.params.join("/");
				}

			}
		}
	},
	makeSearchBarButtons:function() {
		this.searchDIVButtons = u.create('div[class=jsgrid_search_buttons]')
			.add(this.printSearchButton())
			.add(this.printAddSearchBarButton());
		if (this.getCloseCallback()) {
			this.searchDIVButtons.add(this.printCloseButton());
		}
		this.searchDIVButtons[0].className = "jsgrid_search_buttons";
		this.searchForm.append(this.searchDIVButtons);

	},
	makeSearchBar:function(){
		
		if ((this.addSearchBarButton) && (this.countSearchBars+1) >= (this.columnsNotHiddenCount-1))
			this.addSearchBarButton.attr('disabled','disabled');
			this.countSearchBars = this.countSearchBars + 1;
			this.searchDIVElements = u.create('div[class=jsgrid_form_elements]')
				.add(this.printComboFields())
				.add(this.printInputPattern());
			this.searchDIVElements[0].className = "jsgrid_form_elements";
			this.searchDIV.append(this.searchDIVElements).fadeIn('fast');
	},
	enableSearch:function(searchElement,searchURL){ /* Habilita barra de pesquisa */
		/*this.dataProvider.searchPost = searchURL;*/	
		this.searchFormID = "form_search_"+Math.floor(Math.random() * 10000) * 2;
		this.searchForm	  = u.create('form#'+this.searchFormID+'[action=javascript:void(0);]');
		this.searchForm[0].action = "javascript:void(0);";
		
		this.searchElement = u(searchElement).append(this.searchForm);
		this.searchDIV    = u.create('div[class=jsgrid_search]');
		this.searchDIV[0].className = "jsgrid_search";
		this.searchForm.append(this.searchDIV);
		this.countSearchBars = -1;
		this.makeSearchBar();
		this.makeSearchBarButtons();
		this.addSearchEvents();
	},
	setComboOptions:function(options) {
		var searchItems = [];

		for(var j = 0; j < options.length; ++j) {
			for (var i = 0; this.columns[++i];) {
				if (options[j] == this.columns[i].field && (!this.columns[i].hidden || this.columns[i].hidden == 'grid')) {
					searchItems.push(this.columns[i]);
				}
			}
		}
		this.searchItems = searchItems;
	},
	printComboFields:function(){
		
		this.comboFields = u.create("select[class=jsgrid_field_name]").attr('name','field_name['+this.countSearchBars+']');
		this.comboFields[0].className = "jsgrid_field_name";

		if (!this.searchItems.length) {
			for(var i=-1;this.columns[++i];) {
				if (!this.columns[i].hidden || this.columns[i].hidden == 'grid')this.searchItems.push(this.columns[i]);
			}
		}
		
		for(var i=0,l=this.searchItems.length;i<l;i++) {

			var inputTemp = u.create("option",this.searchItems[i].label).val(this.searchItems[i].field);

			this.searchItems[i].atv ? inputTemp.attr('atv', this.searchItems[i].atv) : '';
			this.searchItems[i].fieldrules ? inputTemp.attr( 'fieldrules', this.searchItems[i].fieldrules ) : '';

			this.comboFields.add(inputTemp);
		}
		
	
		
		this.searchItems.shift();
		this.comboFields[0].owner = this;
		this.comboFields.change(this.comboSearchChangeHandler);
		return this.comboFields;
		
		
	},
	printSearchType:function(){
	   this.searchType = u.create("select[class=jsgrid_search_type]")
	  .attr("disabled","disabled") /*'search_type['+this.countSearchBars+']')*/
	  .add(u.create("option",'>').val('>'))
	  .add(u.create("option",'<').val('<'))
	  .add(u.create("option",'=').val('='))
	  .add(u.create("option",'>=').val('>='))
	  .add(u.create("option",'<=').val('<='))
	  .add(u.create("option",'!=').val('!='))
	  .add(u.create("option",'<>').val('<>'));
	  this.searchType[0].className = "jsgrid_search_type";
	  return this.searchType;
	},
	printInputPattern:function() {
		
		getIndice = new Object()
		getIndice.indice =  this.countSearchBars;
		
		
		for(var i=-1; this.columns[++i];){

			if(!this.columns[i].hidden)
				return this.criarCampoMascarado( this.columns[i].field );
		}
		
	},
	printSearchButton:function() {
		this.searchButton = u.create('input[type=submit][value=Pesquisar]');
		this.searchButton[0].type = "submit";
		this.searchButton[0].value = "Pesquisar";
		return this.searchButton;
	},
	printAddSearchBarButton:function() {
		this.addSearchBarButton = u.create('input[class=jsgrid-addsearchbar][type=button][value=Adicionar Filtro]');
		this.addSearchBarButton[0].className = "jsgrid-addsearchbar";
		this.addSearchBarButton[0].type = "button";
		this.addSearchBarButton[0].value = "Adicionar Filtro";
		return this.addSearchBarButton;
	},
	getCloseCallback:function() {
		return this.closeCallback;
	},
	setCloseCallback:function(callback) {
		this.closeCallback = callback;
	},
	printCloseButton:function() {
		this.closeButton = u.create('input[class=jsgrid-addclosesearch][type=button][value=Fechar]');
		this.closeButton[0].className = "jsgrid-addclosesearch";
		this.closeButton[0].type = "button";
		this.closeButton[0].value = "Fechar";
		return this.closeButton;
	},
	submitHandler:function(event){
		var owner = this.owner, dataProvider = owner.dataProvider;
		dataProvider.options.postvars =	u.ext(dataProvider.options.postvars, u(this).object('elements'));
		dataProvider.options.postvars._search = 'true';
		dataProvider.options.postvars.page = 1;
		dataProvider.getJSON();
		//owner.execute();
		
		
		/*faz a validação dos campos, de acordo com tipo escolhido no select
		faz a requisição dos arquivos que faz as validações*/
		jQuery(function($){
			
			var atv = $(this).find('option').filter(':selected').attr('atv');
			
			switch ( atv ){
			case 'date':
				
				$.getScript("/componentes/js/format/valida_data.js", function(){
					
					if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
						alert('O campo \''+ $('select[class*=jsgrid_field_name]').find('option').filter(':selected').text() +'\' é de preenchimento Obrigatório');
							return false;
					}else if( !valida_data( $("input[name*='pattern["+getIndice.indice+"]']").val() ) ){
								alert('O valor do campo'+$('select[class*=jsgrid_field_name]').find('option').filter(':selected').text()+' é Inválida');
								$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
									return false;
						}else{
							owner.execute();
						}
					});
				
			break;
			
			
			case 'cpf':
				
				$.getScript("/componentes/js/format/valida_cpf.js", function(){
					
					if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
						alert('O campo CPF é de preenchimento Obrigatório');
							$("input[name*='pattern["+getIndice.indice+"]']").focus();
								return false;
					}else if(! $("input[name*='pattern["+getIndice.indice+"]']").val().isCPF() ){
						alert('CPF Inválido');
						$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
								return false;
							}else{
								owner.execute();
							}
						
					});
				
			break;
			
			
			case 'cnpj':
				
				$.getScript("/componentes/js/format/valida_cnpj.js", function(){
					
					if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
						alert('O campo CNPJ é de preenchimento Obrigatório');
							$("input[name*='pattern["+getIndice.indice+"]']").focus();
								return false;
					}else if(! valida_cnpj($("input[name*='pattern["+getIndice.indice+"]']").val() ) ){
								alert('CNPJ Inválido');
									$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
										return false;
							}else{
								owner.execute();
							}
						
					});
				
			break;
			
			case 'ano':
				
				var data =  new Date();;
				
					if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
						alert('O campo \'Ano\' é de preenchimento Obrigatório');
							$("input[name*='pattern["+getIndice.indice+"]']").focus();
								return false;
					}else if( $("input[name*='pattern["+getIndice.indice+"]']").val().length < 4 ||  $("input[name*='pattern["+getIndice.indice+"]']").val().length > 4 ){
								alert('O campo \'Ano\' deve conter 4 digitos');
									$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
										return false;
							}else if( $("input[name*='pattern["+getIndice.indice+"]']").val() > data.getFullYear() ){
								alert('O campo \'Ano\' não pode ser maior que o Ano atual ( '+ data.getFullYear() +' )');
									$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
										return false;
							}else{
								owner.execute();
							}
						
					
				
			break;
			
			case 'mes':
				
				if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
					alert('O campo Mês é de preenchimento Obrigatório');
						$("input[name*='pattern["+getIndice.indice+"]']").focus();
							return false;
				}else if( $("input[name*='pattern["+getIndice.indice+"]']").val().length < 2  || $("input[name*='pattern["+getIndice.indice+"]']").val().length > 2  ){
							alert('O campo Mês deve conter 2 digitos');
								$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
									return false;
						}else if( $("input[name*='pattern["+getIndice.indice+"]']").val() > 12 || $("input[name*='pattern["+getIndice.indice+"]']").val() < 01 ){
							alert('O campo Mês deve estar entre 01 e 12');
							$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
								return false;
						}else{
							owner.execute();
						}
					
				
			
			break;
			
			
			case 'cpf_cnpj':
				
				if( $("input[name*='pattern["+getIndice.indice+"]']").val() ==''){
					alert('O campo CPF/CNPJ é de preenchimento Obrigatório');
						$("input[name*='pattern["+getIndice.indice+"]']").focus();
							return false;
				}else{
					
					var size =  $("input[name*='pattern["+getIndice.indice+"]']").val().replace(/[^0-9]/g, "");
					
					
					if( size.length == 11 ){
						
						$.getScript("/componentes/js/format/valida_cpf.js", function(){
							
							if(! size.isCPF() ){
								alert('CPF Inválido');
								$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
										return false;
									}else{
										owner.execute();
									}
								
							});
						
					}else{
						
						$.getScript("/componentes/js/format/valida_cnpj.js", function(){
							
							 if( !valida_cnpj( size ) ){
											alert('CNPJ Inválido');
												$("input[name*='pattern["+getIndice.indice+"]']").val('').focus();
													return false;
										}else{
											owner.execute();
										}
									
								});
						
						
					}
					
				}
			
			break;
			
			default:
				owner.execute();
			break;
			}
			
		});
		
		
		
	},
	comboSearchChangeHandler:function(event){
		/* cria o campo */
		var inputNew	= this.owner.criarCampoMascarado( $(this) );
		var inputOld	= u(u(".jsgrid_field_value")[u(".jsgrid_field_name").index(this)]);

		/* adiciona o campo ao documento */
		inputOld.before(inputNew);

		/* remove o campo antigo do documento */
		inputOld.remove();
	},
	addSearchEvents:function(form) {
		this.searchForm[0].owner = this;
		this.searchForm.submit(this.submitHandler);
		this.addSearchBarButton[0].owner = this;
		this.addSearchBarButton.click(function(){ this.owner.makeSearchBar(); });
		if (this.closeButton) {
			var closeCallback = this.getCloseCallback();
			this.closeButton[0].owner = this;
			this.closeButton.click(function() { eval(closeCallback + "();") });
		}
	},
	
	criarCampoMascarado:function( select ) {
		
		var indice = this.countSearchBars;
		var ObjSelected = this.getColumn(((select == '[object Object]') ? select.find('option').filter(':selected')[0].value : this.comboFields[0].value));
		//var ObjSelected = this.getColumn(((select == '[object Object]') ? select.find('option').filter(':selected')[0].value : select));

		if(ObjSelected.atv)
			var atv = ObjSelected.atv;
		else
			var atv = null;

		switch ( atv ){

			case 'date':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('##/##/####',$(this).val()) );
				});
			}
			break;
			case 'cpf':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('###.###.###-##',$(this).val()) );
				});	
			}
			break;
			
			case 'cnpj':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('##.###.###/####-##',$(this).val()) );
				});	
			}
			break;
			
			
			case 'ano':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('####',$(this).val()) );
				});	
			}
			break;
			
			case 'cod_subsecao':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('####-#/##',$(this).val()) );
				});	
			}
			break;
			
			case 'competencia':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('##/####',$(this).val()) );
				});
			}
			break;
			
			case 'situacao':
			{
				var objeto = u.create('span').addClass('jsgrid_field_value');

				var fieldrules = ObjSelected.fieldrules.split(';');
				var inputTemp = '';
	
				for(var z in fieldrules){

					var fieldruleInput = fieldrules[z].split(',');

					inputTemp += "<input type='"+fieldruleInput[0]+"' name='pattern["+indice+"]' id='idSituacao_"+z+"' rel='pattern["+indice+"]' value='"+fieldruleInput[1]+"'><label for='idSituacao_"+z+"'>"+fieldruleInput[2]+'</label>';
				}

				return objeto.html(inputTemp);
			}
			break;
			
			case 'combo_manutencao' :
			{
				
				//var objeto = u.create('input[class=jsgrid_field_value][type=select]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');
				//var objeto = u.create('span').addClass('jsgrid_field_value');
				var objeto = u.create("select[class=jsgrid_field_name]").attr('name','pattern['+indice+']').attr('id','cod_tipo_erro').addClass('jsgrid_field_value');
				
				var fieldrules = ObjSelected.fieldrules.split(';');
				
				var inputTemp = '';
				
				for(var z in fieldrules){

					var fieldruleInput = fieldrules[z].split(',');

					//inputTemp += "<option label='"+fieldruleInput[2]+"' value='"+fieldruleInput[1]+"'>"+fieldruleInput[2]+'</option>';
				    objeto.add(u.create("option",""+fieldruleInput[2]+"").val(""+fieldruleInput[1]+""));
				
				
				}
               
				//return objeto.html(inputTemp);
				objeto.change(function(){
					
					 carregar();
					
				});
				
				return objeto;
				
			}	
			break;
			
			case 'mes':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('##',$(this).val()) );
				});	
			}
			break;
			
			case 'ano-mes':
			{
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');

				objeto.keyup(function(){
					$(this).val( mascaraGlobal('####-##',$(this).val()) );
				});	
			}
			break;
			
			default:
				var objeto = u.create('input[class=jsgrid_field_value][type=text]').attr('name','pattern['+indice+']').attr('rel','pattern['+indice+']').addClass('jsgrid_field_value');
		}

		if(ObjSelected.width)
			objeto.css({'width':((ObjSelected.width.replace('%','') / 100 * 620)+5)});

		return objeto;
	},
	
	getColumn:function( selectedElementValue ){

		for(var i=-1;this.columns[++i];) {

			if( this.columns[i].field == selectedElementValue)
				return this.columns[i];
		}
	}
	
	
});doNothing=function(){};
