// Tipo: JavaScript
// Nome: FormFacil
// Versao: v0.14
// URL: www.fechine.com/lab/formfacil
// Sobre: Formate seus formulários de uma forma fácil e eficiente!
// Testes com sucesso: Firefox 2.0 e 3.0, Internet Explorer 6 SP2 e 7, Opera 9.10, Safari 3.0.2 para Windows
// Autor: Fechine - fechine@gmail.com


/* 
-----------------------------------------------------------------------------------------------------
Melhorias:
1 - Select Disable não está influenciando na sua label
2 - Campos sequenciais variados (SELECTs com INPUTs) não são personalizados
2 - Botões fora dos FIELDSETs, receber formatação e algum alinhamento
----------------------------------------------------------------------------------------------------- 
*/


// Objetivo: Configuraçoes de comportamento. Edite-as de acordo com sua necessidade
// Dependencia: formFacil() que utiliza estas variáveis
var larguraMinimaDosLabels = 50;  				//default = 50
var ajustarBotoes = true; 						//default = true
var ajustarlabels = true; 						//default = true
var inserirIdEForAuto = true; 					//default = true
var personalizarLabel = true;  					//default = true
var personalizarCamposSequenciais = true;		//default = true
var criarBrAuto = true;  						//default = true
var criarSpanSelectAuto = true; 				//default = true
var criarSpanRadioCheckboxAuto = true; 			//default = true
var mostrarMensagemErro = true;					//default = true
var ignorarTabelasInternas = true;				//default = true
var ignorarFieldsetsInternos = true;			//default = false
var ajustarFormAoContainer = false;				//default = false [testes]
var mostrarLogAuto = false;		 				//default = false


// Objetivo: Configuraçoes de funcionamento. Nao edite estas variáveis
// Dependencia: formFacil(), inicializador() que utilizam estas variáveis
var logTxt;
var logErro;
var logErroCont = 0;
var idCont = 0;


// Objetivo: Executar formataçoes automáticas de formulários
// Dependencia: inicializador() que executa esta funçao
function formFacil(){
	var formFacil = getForms();					//captura FORM's no documento
	/* log */ logTxt = "<br />[INICIO LOG]<br />";
	/* log */ logTxt += "Quantidade de form com classe formFacil = " + formFacil.length + "<br />";


	// Progresso em FORM's
	for (var i=0; i < formFacil.length; i++){		
		idCont += 1;
		fieldsetsInternos(formFacil[i]);
		tabelasInternas(formFacil[i]);
		var fieldsets = getFieldsetsByForm(formFacil[i]);					//captura FIELDSET's deste FORM
		var fieldsetsTratados = getfieldsetsTratadosByForm(formFacil[i]);	//captura FIELDSET's (exceto os de CLASSNAME = 'complemento') deste FORM
		var formularioClass = formFacil[i].className.toLowerCase();			//captura CLASSNAME do FORM
		var larguraContainer = formFacil[i].parentNode.clientWidth;			//captura a largura do container
		var larguraFieldset;
		var larguraFieldsetComplemento;
		/* log */ logTxt += " '---- Quantidade de fieldsets dentro do formFacil indice(" + i + ") = " + fieldsets.length + "<br />";


		// Gera largura dos FIELDSET's com base no CLASSNAME de FORM
		if (formularioClass.search('duascolunas') != -1){
			larguraFieldset = (larguraContainer - 30) / 2;					//cria a largura do FIELDSET
			larguraFieldsetComplemento = larguraContainer - 19;				//cria a largura do FIELDSET com CLASSNAME = 'complemento'
		}
		if (formularioClass.search('trescolunas') != -1){
			larguraFieldset = (larguraContainer - 43) / 3;					//cria a largura do FIELDSET
			larguraFieldsetComplemento = larguraContainer - 17;				//cria a largura do FIELDSET com CLASSNAME = 'complemento'
		}
		if (formularioClass.search('quatrocolunas') != -1){
			larguraFieldset = (larguraContainer - 57) / 4;					//cria a largura do FIELDSET
			larguraFieldsetComplemento = larguraContainer - 19;				//cria a largura do FIELDSET com CLASSNAME = 'complemento'
		}
		

		// Progresso em FIELDSET's dentro do FORM[i]
		for (var j=0; j < fieldsets.length; j++){
			idCont += 1;
			var larguraLabel = larguraMinimaDosLabels;
			var lbs = getLabelsByFieldset(fieldsets[j]);
			var bts = getBotoesByFieldset(fieldsets[j]);
			var ipt = getInputsByFieldset(fieldsets[j]);
			var slt = getSelectsByFieldset(fieldsets[j]);
			/* log */ logTxt += " '---- ---- Quantidade de labels dentro do fieldset(" + j + ") = " + lbs.length + "<br />";
			/* log */ logTxt += " '---- ---- Quantidade de botoes dentro do fieldset(" + j + ") = " + bts.length + "<br />";	
			

			// Modifica a largura dos FIELDSET's, ajustando-os ao container
			if(ajustarFormAoContainer){	
				formFacil[i].style.width = (larguraContainer - 5) + 'px';
				var fieldsetClass =	fieldsets[j].className.toLowerCase();
				if (fieldsetClass.search('complemento') == -1) { fieldsets[j].style.width = larguraFieldset + 'px'; }
				else {
					if(fieldsetClass.search('fieldsetinterno') == -1){ fieldsets[j].style.width = larguraFieldsetComplemento + 'px'; }
				}
			}
			
			
			// Inseri quebras-de-linha (BR'S) antes dos LABEL's (nas que nao possuem o CLASSNAME = 'complemento')
			if(criarBrAuto){
				for(var n=1; n < lbs.length; n++){
					var lbsClass = lbs[n].className.toLowerCase();
					var br = document.createElement("br");
					var elemento = lbs[n];

					try{
						if(elemento.previousSibling.nodeName != null){
							if ((lbsClass.search('complemento') == -1) && (verificarIgnore(elemento) == false) && (capturarNoValido(elemento,'previous').nodeName) != 'BR' && (capturarNoValido(elemento,'previous').nodeName) != 'LEGEND'){
								(elemento.parentNode).insertBefore(br, elemento);
							}
						}
					}
					catch(erro1){
						/* log */ logTxt += "ERRO 1: na criaçao automática do BR. <br />";
						logErro += erro1;
						logErroCont += 1;
						continue;
					}
				}
			}
			
			
			// Captura e edita as larguras dos LABEL's para cada FIELDSET
			if(ajustarlabels){
				// Calcula maior largura por conteúdo do LABEL
				for(var k=0; k < lbs.length; k++){
					var elemento = lbs[k];
					var classe = elemento.className.toLowerCase();
					var larguraThisLabel = elemento.clientWidth;
					
					/* log */ logTxt += " '---- ---- ---- Label indice (" + k + ") possui a classe = '" + classe + "', e a largura = " + larguraThisLabel + "<br />";
					if ((larguraThisLabel > larguraLabel) && (classe.search('complemento') == -1) && (verificarIgnore(elemento) == false)){
						larguraLabel = (larguraThisLabel + 10);
					}
				}
				// Altera as larguras dos LABEL's com base na maior
				for(var l=0; l < lbs.length; l++){
					var elemento = lbs[l];
					var classe = lbs[l].className.toLowerCase();
					var classePai = lbs[l].parentNode.className.toLowerCase();
					
					if((classe.search('complemento') == -1) && (verificarIgnore(elemento) == false)){
						lbs[l].style.width = (larguraLabel - 8)+"px";
					}
				}
			}
			
			
			// Modifica as margens dos botoes e colocando o CLASSNAME = 'formfacilbotao'/'formfacilbotaoLateral' (para corrigir problemas no IE6)
			if(ajustarBotoes){
				for(var m=0; m < bts.length; m++){
					var btClass = '';
					var elemento = bts[m];
					btClass = bts[m].className.toLowerCase();
					if (btClass.search('complemento') == -1){
						if(verificarIgnore(elemento) == false){ bts[m].style.marginLeft = (larguraLabel + 5) + 'px'; }
						bts[m].className = btClass + ' formfacilbotao';
					} else {bts[m].className = btClass + ' formfacilbotaoLateral'};
				}
			}
						
			
			// Insere o atributo FOR nas LABEL's
			if(inserirIdEForAuto){
				for(var q=0; q < lbs.length; q++){
					var elemento = lbs[q];
					try{
						if(elemento.nextSibling != null){
							var proximoElemento = capturarNoValido(elemento,'next');
							var tagProximoElemento = proximoElemento.nodeName;
							if((tagProximoElemento == 'INPUT') || (tagProximoElemento == 'SELECT') || (tagProximoElemento == 'TEXTAREA')){
								var idProximoElemento = proximoElemento.id;
								var forDesteElemento = elemento.getAttribute('for',elemento);
								if(idProximoElemento == ''){proximoElemento.id = 'idipt'+idCont+i+j+q;}
								idProximoElemento = proximoElemento.id;
								if(forDesteElemento == null){elemento.setAttribute('for',idProximoElemento);}
							}
						}
					}
					catch(erro7){
						/* log */ logTxt += "ERRO 7:  na inserçao do atributo FOR. <br />";
						logErro += erro7;
						logErroCont += 1;
						continue;
					}
				}
			}
			
			
			// Insere tag SPAN com CLASSNAME='FORMFACILSELECTBOX' antes dos SELECT's (fechamento em seguida)
			if(criarSpanSelectAuto){
				for(var o=0; o < slt.length; o++){
					var elemento = slt[o];
					var span = document.createElement("span");
					span.setAttribute('id','idslct'+idCont+i+j+o);
					
					try {
						if(elemento.parentNode.tagName != 'SPAN'){
							elemento.parentNode.insertBefore(span, elemento);
							var spanId = document.getElementById('idslct'+idCont+i+j+o);
							spanId.appendChild(elemento);
							spanId.className = 'formfacilselectbox';
						}
						// Coloca o CLASSNAME = 'formfacilcampoenvolvido' em elementos SELECT's que estiverem entre SELECT's e/ou INPUT's
						if((spanId.nextSibling.nextSibling != null) && (personalizarCamposSequenciais)){
							if(spanId.nextSibling.nextSibling.tagName == 'SELECT'){ spanId.className = spanId.className + ' formfacilcampoenvolvido'; }
						}
					}
					catch(erro2){
						/* log */ logTxt += "ERRO 2:  na criaçao do SPAN CLASSNAME = 'SELECT'. <br />";
						logErro += erro2;
						logErroCont += 1;
						continue;
					}
					
				}
			}
			
			
			//Insere tag SPAN com CLASSNAME='FORMFACILRADIO' ou CLASSNAME='FORMFACILCHECKBOX' antes dos INPUT's TYPE = 'radio' ou TYPE = 'checkbox' (fechamento em seguida)
			if(criarSpanRadioCheckboxAuto){
				for(var o=0; o < ipt.length; o++){
					var elemento = ipt[o];
					var attType = '';
					attType = elemento.getAttribute('type');
					
					try{
						if(elemento.parentNode.tagName != 'SPAN' && (verificarIgnore(elemento) == false) && ((attType == 'radio')||(attType == 'checkbox'))){
							if (attType == 'radio'){
								var idName = 'idradio';
								var spanIdClass = ' formfacilradio';
							}
							if (attType == 'checkbox'){
								var idName = 'idcheckbox';
								var spanIdClass = ' formfacilcheckbox';
							}
							
							if(elemento.previousSibling != null){	
								var elementoAnterior = elemento.previousSibling;
								// Personalizaçao de label para um único RADIO ou CHECKBOX
								if (elementoAnterior.tagName == 'LABEL'){
									if(elementoAnterior.className.search('formfacilopcional') != -1){elementoAnterior.className = elementoAnterior.className + spanIdClass + 'opcional';}
									else {elementoAnterior.className = elementoAnterior.className + spanIdClass;}
								}
								// Personalizaçao de label para mais de um RADIO ou CHACKBOX
								if(elementoAnterior.previousSibling != null){
									if (elementoAnterior.previousSibling.tagName == 'LABEL'){
										if(elementoAnterior.previousSibling.className.search('formfacilopcional') != -1){elementoAnterior.previousSibling.className = elementoAnterior.previousSibling.className + spanIdClass + 'opcional';}
										else {elementoAnterior.previousSibling.className = elementoAnterior.previousSibling.className + spanIdClass;}
									} 
								}
							}
							var span = document.createElement("span");
							span.setAttribute('id',idName+idCont+i+j+o);
							var txtSpan = document.createTextNode(elemento.nextSibling.nodeValue);
							if (elemento.nextSibling != null){ elemento.nextSibling.nodeValue = ''; }
			
							elemento.parentNode.insertBefore(span, elemento);
							var spanId = document.getElementById(idName+idCont+i+j+o);
							// Inserindo conteúdo na tag
							spanId.appendChild(elemento);
							spanId.appendChild(txtSpan);
							spanId.className = spanIdClass;
							// Alinhando os radios
							spanId.style.marginLeft = larguraLabel + 'px';	
						}
					}
					catch(erro3){
						/* log */ logTxt += "ERRO 3: na formataçao dos RADIOS e/ou CHECKBOXes. <br />";
						logErro += erro3;
						logErroCont += 1;
						continue;
					}
				}
			}
						
			
			// Insere CLASSNAME = 'formfacilcampoenvolvido' para os campos (sejam INPUT's ou SELECT's) que estejam a ESQUERDA de outro campo similar
			// Obs.: A formataçao de campos sequenciais para SELECT's ficou integrada com a criaçao dos SPAN's em criarSpanSelectAuto
			if(personalizarCamposSequenciais){	
				for (p = 0; p < ipt.length; p++){
					var elemento = ipt[p];
					var elementoPosterior = capturarNoValido(elemento,'next');
					if(elementoPosterior != false){
						var tagElementoPosterior = elementoPosterior.tagName;
						var attTypeElementoPosterior = elementoPosterior.getAttribute('type');
						var classeElementoPosterior = elementoPosterior.className.toLowerCase();
						try{
							if((tagElementoPosterior == 'INPUT') && (attTypeElementoPosterior != 'submit')){
								elemento.className = elemento.className + ' formfacilcampoenvolvido';
							}
						}
						catch(erro4){
							/* log */ logTxt += "ERRO 4: na personalizaçao dos campos sequenciais. <br />";
							logErro += erro4;
							logErroCont += 1;
							continue;
						}
					}
				}
			}

			
			// Verifica atributos dos INPUT's visando inserir CLASSNAME's representativos nas LABEL's
			if(personalizarLabel){
				for (q = 0; q < ipt.length; q++){
					try{
						var elemento = ipt[q];
						var attReadOnly = elemento.getAttribute('readonly');
						var attDisabled = elemento.getAttribute('disabled');
						var attType = elemento.getAttribute('type');
						var elementoAnterior = capturarNoValido(elemento,'previous');
						
						if(elementoAnterior.nodeName == 'LABEL'){
							if ((attReadOnly == 'readonly') || (attReadOnly == true)){  elementoAnterior.className = elementoAnterior.className + ' formfacilreadonly'; }
							if ((attDisabled == 'disabled') || (attDisabled == true)){ elementoAnterior.className = elementoAnterior.className + ' formfacildisabled'; }
							if (attType == 'password'){ elementoAnterior.className = elementoAnterior.className + ' formfacilpassword'; }
						}
					}
					catch(erro5){
						/* log */ logTxt += "ERRO 5: na personalizaçao das labels. <br />";
						logErro += erro5;
						logErroCont += 1;
						continue;
					}
				}				
			}
			
		}
		
		// Trata as alturas dos FIELDSET's pelo CLASSNAME do FORM
		if (formularioClass.search('duascolunas') != -1){redimensionarFieldsets(fieldsetsTratados,2);}
		if (formularioClass.search('trescolunas') != -1){redimensionarFieldsets(fieldsetsTratados,3);}
		if (formularioClass.search('quatrocolunas') != -1){redimensionarFieldsets(fieldsetsTratados,4);}
	}
	
	/* log */ logTxt += " [FIM LOG]<br />";
	
	// Insere e ativa o log do formFacil no final da página
	if(mostrarLogAuto){ mostrarLog(); }
}


// Objetivo: Retornar formulários com CLASSNAME = 'formFacil'
// Dependencia: formFacil() que executa esta funçao
function getForms() {
	var formularios = document.getElementsByTagName('form');	
	var formularios2 = new Array();
	var j = 0;
	/* log */ logTxt += "Quantidade de formularios encontrados = " + formularios.length + "<br />";
	
	for(var i=0; i < formularios.length; i++){
		var classe = (formularios[i].className).toLowerCase();
		if(classe.search('formfacil') != -1){
			/* log */ logTxt += "Índice(" + i + "), possui ClassName = formFacil <br />";
			formularios2[j] = formularios[i];
			j++;
		}
	}
	return formularios2;
}


// Objetivo: Retornar FIELDSET's com CLASSNAME != 'complemento'
// Dependencia: formFacil() que executa esta funçao
function getfieldsetsTratadosByForm(formulario) {
	var fieldsets = formulario.getElementsByTagName('fieldset');	
	var fieldsets2 = new Array();
	var f = 0;
	
	for(var i=0; i < fieldsets.length; i++){
		var classe = (fieldsets[i].className).toLowerCase();
		if((classe.search('complemento') == -1)&&(classe.search('ignore') == -1)){
			fieldsets2[f] = fieldsets[i];
			f++;
		}
	}
	return fieldsets2;
}


// Objetivo: Retornar FIELDSET's que estao dentro do FORM passado em parâmetro
// Dependencia: formFacil() que executa esta funçao
function getFieldsetsByForm(formulario){
	var fieldsets = formulario.getElementsByTagName('fieldset');	
	var fieldsets2 = new Array();
	var f = 0;
	
	for(var i=0; i < fieldsets.length; i++){
		var classe = (fieldsets[i].className).toLowerCase();
		if(classe.search('ignore') == -1){
			fieldsets2[f] = fieldsets[i];
			f++;
		}
	}
	return fieldsets2;
}


// Objetivo: Retornar LABEL's que estao dentro do FIELDSET passado em parâmetro
// Dependencia: formFacil() que executa esta funçao
function getLabelsByFieldset(fieldset){
	var labels = fieldset.getElementsByTagName('label');	
	var labels2 = new Array();
	var l = 0;
	for(var i=0; i < labels.length; i++){
		var classe = (labels[i].className).toLowerCase();
		if(classe.search('ignore') == -1){
			labels2[l] = labels[l];
			l++;
		}
	}
	return labels2;
}


// Objetivo: Retornar botoes (INPUT TYPE = 'submit') que estao dentro do FIELDSET passado em parâmetro
// Dependencia: formFacil() que executa esta funçao
function getBotoesByFieldset(fieldset){
	var inputs = fieldset.getElementsByTagName('input');
	var botoes = new Array();
	var j = 0;
	
	for(var i=0; i < inputs.length; i++){
		var valorType = '';
		valorType = inputs[i].type.toLowerCase();
		if((valorType == 'submit')||(valorType == 'button')){
			botoes[j] = inputs[i];
			j++;
		}
	}
	return botoes;
}


// Objetivo: Retornar INPUT's
// Dependencia: formFacil() que executa esta funçao
function getInputsByFieldset(fieldset){
	return inputs = fieldset.getElementsByTagName('input');
}


// Objetivo: Retornar SELECT's
// Dependencia: formFacil() que executa esta funçao
function getSelectsByFieldset(fieldset){
	return selects = fieldset.getElementsByTagName('select');
}


// Objetivo: Retorna o BODY
// Dependencia: inicializador() que executa esta funçao
function getBody(){
	return document.getElementsByTagName('body');
}


// Objetivo: Mostrar log da página
// Dependencia: executado por formFacil() e finalizador()
function mostrarLog(){
	try{
		if(logErroCont == 0){/* log */ logTxt += " FormFácil executado com <strong>sucesso</strong>! <br />";}
		else {
			/* log */ logTxt += " FormFácil foi executado, porém, encontrou <strong> " + logErroCont + " </strong> erro(s) nao crítico(s) proveniente(s) de codificaçao HTML nao suportada pelo FrameWork nesta versao! <br />";
			/* log */ logTxt += " Este(s) erro(s) nao afetara(o) o carregamento da página, porém, nao será possível formatar adequadamente a(s) TAG(s). <br /><br /> Erros:" + logErro ;
		}
		
		var logTag = document.getElementById('formfacillog');
		logTag.style.display = 'block';
		logTag.innerHTML += logTxt;
	}
	catch(erro6){
		finalizador('(ERRO formFacil) Desabilite o log e tente novamente!');
		logErro += erro6;
		logErroCont += 1;
	}
}


// Objetivo: Ajustar altura dos FIELDSET's por linhas [2,3,...,n]
// Dependencia: formFacil() que executa esta funçao
// Autor: Victor Hugo - victorhugo21@gmail.com
function redimensionarFieldsets(arrayFildSets,quebraColunas){

	var cont = 0;
	var linha = 0;
	var colunas = quebraColunas;
	var coluna = 0;
	var coluna2 = 0;
	var colunasBreak = quebraColunas - 1;
	var qtdeLinhas = 0;
	var proximaLinha = 0;
	var qtdColunas = 0;
	var arrayFildSetsFinal = null;	
	var maior = 0;	
	var inc = 0;

	// Captura número de linhas para o FORM
	for (var i = 0; i < arrayFildSets.length; i++) {
		if (cont == colunas) {
			cont = 0;
			linha += 1;
		}
	cont += 1;
	}      
	
	qtdeLinhas = linha + 1; 
	arrayFildSetsFinal = new Array();
		 
	// Cria o array multi-dimensional linhas/colunas
	for(var i = 0; i < qtdeLinhas; i++){
		arrayFildSetsFinal[i] = new Array();		 
	}
		 
	// Preenche os array com os FIELDSET já tratados
	for (var i = 0; i < arrayFildSets.length; i++) {
		arrayFildSetsFinal[proximaLinha][qtdColunas] = arrayFildSets[i];
		
		if (qtdColunas == colunasBreak) {
			proximaLinha += 1;
			qtdColunas = 0;
			continue;
		}			
		qtdColunas += 1;
	}
	
	// Testa alturas dos FIELDSET's por linha e seta a maior para os demais
	for (i = 0; i < arrayFildSetsFinal.length; i++) {
		maior = 0;
		for (j = 0; j < arrayFildSetsFinal[i].length; j++) {
			inc = j;
			if (arrayFildSetsFinal[i][j] != null) {
				if (arrayFildSetsFinal[i][j].clientHeight > maior) {
					maior = arrayFildSetsFinal[i][j].clientHeight;
					arrayFildSetsFinal[i][j].style.height = maior + 'px';
					
					while (inc != 0) {
						arrayFildSetsFinal[i][inc - 1].style.height = maior + 'px';
						inc -= 1;
					}
				} 
				else {
					arrayFildSetsFinal[i][j].style.height = maior + 'px';
					
					while (inc != 0) {
						arrayFildSetsFinal[i][inc - 1].style.height = maior + 'px';
						inc -= 1;
					}
				}
			} 
			else continue;
		}
	}	 		
}


// Objetivo: Testar presença de CLASSNAME='ignore' recursivamente para tags pai (limite FIELDSET) de um determinado elemento, retornando TRUE ou FALSE
// Dependencia: formFacil() que executa esta funçao
function verificarIgnore(elemento){
	var elementoPai = elemento.parentNode;
	var classPai = elementoPai.className.toLowerCase();
	var marca = true;
	
	while(marca){
		if (elementoPai.tagName == 'FIELDSET'){ marca = false }
		if(classPai.search('ignore') != -1){ return true; }
		elementoPai = elementoPai.parentNode;
		classPai = elementoPai.className.toLowerCase();
	}
	return false;
}


// Objetivo: Preparar FIELDSET's internos
// Dependencia: formFacil() que executa esta funçao
function fieldsetsInternos(formulario){
	var fieldsetsPai = formulario.getElementsByTagName('fieldset');
	for(var i=0; i < fieldsetsPai.length; i++){
		
		var fieldsetsFilhos = fieldsetsPai[i].getElementsByTagName('fieldset');
		var classeFilho = '';
		
		for(var j=0; j < fieldsetsFilhos.length; j++){
						
			classeFilho = (fieldsetsFilhos[j].className).toLowerCase();
			
			if(classeFilho.search('fieldsetinterno') == -1){fieldsetsFilhos[j].className = classeFilho + ' fieldsetinterno';}
			if(classeFilho.search('complemento') == -1){fieldsetsFilhos[j].className = fieldsetsFilhos[j].className + ' complemento';}
			if(ignorarFieldsetsInternos){
				if(classeFilho.search('ignore') == -1){fieldsetsFilhos[j].className = fieldsetsFilhos[j].className + ' ignore';}
			}
		}
	}
}


// Objetivo: Preparar TABELAS's internas
// Dependencia: formFacil() que executa esta funçao
function tabelasInternas(formulario){
	if(ignorarTabelasInternas){
		var tabelas = formulario.getElementsByTagName('table');
		for(var j=0; j < tabelas.length; j++){
			var classeTabela = tabelas[j].className;
			tabelas[j].className = classeTabela + ' ignore';
		}
	}
}


// Objetivo: Captura e retorna o próximo nó válido (next ou sibling). Caso não exista, retorna false.
// Dependencia: formFacil() que executa esta funçao
function capturarNoValido(elemento,posicao){
	var elementoProcurado = null;
	var elementoFinal = elemento.parentNode.lastChild;
	
	while(elementoFinal.nodeType != 1){ elementoFinal = elementoFinal.previousSibling; }
	
	if(elemento != elementoFinal){
		if(posicao == 'previous'){
			elementoProcurado = elemento.previousSibling;
			while(elementoProcurado.nodeType != 1){
				elementoProcurado = elementoProcurado.previousSibling;
			}
		}
		else {
			elementoProcurado = elemento.nextSibling;
			while(elementoProcurado.nodeType != 1){
				elementoProcurado = elementoProcurado.nextSibling;
			}
		}
		return elementoProcurado;
	}
	return false;	
}


// Objetivo: Criar tag para log e inicializar o sistema
// Dependencia: addEvent() que executa esta funçao
function inicializador(){
	try{
		var body2 = getBody();
		for(var b=0; b < body2.length; b++){
			var elemento = body2[b].lastChild;
			if((document.getElementById('formfacillog') == null) || (document.getElementById('formfacillog') == 'undefined')){
				var a = document.createElement("a"); 
					a.setAttribute('href','http://www.fechine.com/lab/formfacil');
					a.setAttribute('title','Formate formulários de uma forma fácil e eficiente.');
					a.appendChild(document.createTextNode('[Este site utiliza o formFacil]'));
				var p = document.createElement("p");
					p.setAttribute('id','formfacillog');
					p.appendChild(a);
				elemento.parentNode.insertBefore(p,elemento.nextSibling);
			}
		}
		if(document.getElementById('formfacillog')){ formFacil(); }
	}
	catch(erro7){
		logErroCont += 1;
		return false;
	}
}


// Objetivo: Finalizar o processo em caso de erro
// Dependencia: executado por mostraLog()
function finalizador(erro){	alert(erro); return false; }


// Objetivo: Testar carregamento da página e executar inicializador do sistema
// Dependencia: nenhuma 
// Obs.: Script encontrado em http://my.opera.com/Balala/blog/show.dml/461364 (20/05/2008)
// Autor: "Balala"
function addEvent(object, evType, func, useCapture){
	if(object.addEventListener){ object.addEventListener(evType, func, useCapture); } 
	else if(object.attachEvent){ object.attachEvent("on" + evType, func); }
}

addEvent(window, "load", function() {inicializador(); }, false);