
/*
 * Por: Alan Lucian M.T.
 * E-mail: alanlucian@gmail.com
 * 03 fev. 2009
 * Versao 1.4
 * Empresa: Dobra Digital
 * ********************************************************************************
 * Objetivo: Validar inputs do tipo TEXT|PASSWORD|RADIO, objetos DROPDOWN e TextArea 
 * 
 * Uso: deve ser passado como parametro um identificador do formulario, id ou name
 * os campos a serem validados pela funcao deve conter a seguinte estrutura basica dentro
 * do atributo class do objeto: {fn[]} onde dentro de fn[] sera passada as funcoes de validacao 
 * separadas por virgula  ex: {fn[validacao1,validacao1]}, estas funcoes serao externas a este arquivo, este
 * documento NAO possui nenhuma funcao de validacao complexa, verifica apenas se possui ou nao texto e se foi
 * selecionado algum item do comboBox. 
 * 
 * **********************************************************************************
 * Problemas comuns:
 * 	A validacao Nao acusa erro e nao ha erro no JS.
 * 		* Verificar se classe CSS usada para erro esta sendo carregada pelo documento.
 * 		* Verificar se o target (seja o ID ou target especificado no JSON) existe
 * 		* Para select (dropdown) é usado o id não o name
 */


/* CONFIG:  
 * classeErro: classe CSS que ser� adicionada ao objeto padr�o � 'error' quando houver erro
 * 		Ex:se classe padr�o for 'textoColorido') com o erro padr�o  ficaria 'textoColorido error'
 * 
 * classShow: classe CSS que ser� adicionada ao objeto para exibicao no html
 * 
 * classHidden: classe CSS que ser� adicionada ao objeto para oculta-lo no html
 * 
 * */


var classeErro = 'error';
var classShow = 'show';
var classHidden = 'hidden';


/* FIM CONFIG  
 *
 * #####################################################################
 * ####		Ap�s este bloco altere o c�digo por sua conta e risco	####
 * #####################################################################
 */

if (arrayMsg == undefined) {
	var arrayMsg = new Array();
	arrayMsg[7] = "Ocorreu um erro ao enviar seu formulário verifique os campos em vermelho.";
}

function validaForm(formIdent) 
{ 
  window.formularioValido = true;	
  var arrayForId = new Array();
  var form, elements, i, elm; 
  form = getForm(formIdent);
	
	if (document.getElementsByTagName)
	{
		
		elements = form.getElementsByTagName('input');
		
		for( i=0, elm; elm=elements.item(i++); )
		{
			
			if (elm.getAttribute('type') == "text" || elm.getAttribute('type') == "file" || elm.getAttribute('type') == "password")
			{
				
				rtValidacao = validaObj(elm,"input");
				
				//arrayForId[rtValidacao.target] = rtValidacao;
				
				arrayForId[rtValidacao.target] = rtValidacao;
									
			}else if(elm.getAttribute('type') == 'radio'){
				rtValidacao = validaObj(elm,"radio");
				//arrayForId[elm.name] = rtValidacao;
				arrayForId[rtValidacao.target] = rtValidacao;		
			}else if(elm.getAttribute('type') == 'checkbox'){
				
				rtValidacao = validaObj(elm,"checkbox");
				//arrayForId[elm.name] = rtValidacao;
				arrayForId[rtValidacao.target] = rtValidacao;
				//alert(elm.name + " TARGET -> " + rtValidacao.target + " VALIDO -> " + rtValidacao.valido);				
			} 
		}
		
		elements = form.getElementsByTagName('select');
		for( i=0, elm; elm=elements.item(i++); )
		{
			
			rtValidacao = validaObj(elm,"select");
			arrayForId[rtValidacao.target] = rtValidacao;				
	
		}
		
		elements = form.getElementsByTagName('textarea');
		for( i=0, elm; elm=elements.item(i++); )
		{
			
			rtValidacao = validaObj(elm,"textarea");
			arrayForId[rtValidacao.target] = rtValidacao;	
		}
		
		elements = form.getElementsByTagName('label');
		
		for( i=0, elm; elm=elements.item(i++); )
		{
			// se cair no catch � pq nenhum objeto de valida��o fez refer�ncia a um label.
			try{
				
				var JSONObject = {};
				if(navigator.appName.indexOf("Microsoft")>=0){
					
					// IE
					JSONObject = arrayForId[elm.getAttribute('htmlFor')];
				}else{
					// outros
					//alert('adtt FOR :'+elm.getAttribute('for')+'\n content :'+ arrayForId[elm.getAttribute('for')]);
					JSONObject = arrayForId[elm.getAttribute('for')];
				}	
				
				if(JSONObject.valido != undefined  ){
					valido = JSONObject.valido
				}else{
					valido = true;
					
				}
				
				//valido = ( JSONObject.valido != undefined  ? JSONObject.valido :true);
				//alert (elm.getAttribute('for') + "  JSONObject.valido -> " + JSONObject.valido );
				
				if(valido){
					removeClass(elm,classeErro);
					swapClass(JSONObject.msg,classShow,classHidden); 
				}else{
					 window.formularioValido = false;	
					
					addClass(elm,classeErro);
					swapClass(JSONObject.msg,classHidden,classShow);
				}				
			}catch(e){}
		}
			
	}
	
	if(!window.formularioValido){
		alert(arrayMsg[7]);		
	}
	
	
	return window.formularioValido;
}


function validaObj(elm,tipo){
	//var obrigatorio = predominateObrigatorio;
	var arrFunctions = new Array();
	var rtTarget = elm.id;
	var JSONObject = {};
	
	//verifico se o ob.className pode ser usado  
	if (elm.className) {
		var classe = new String(elm.className);
		
		
		
		var indexObr = classe.indexOf("[obr]");
		
		// verifico se h� a flag obrigat�rio ou a n�o obrigat�rio	
		var obrigatorio = (indexObr >= 0) ? true : false;
		
		//removo o [obr] da string
		classe = classe.replace("[obr]",'');
		//  pego o conte�do XXX dentro de fn[XXX] para gerar array de fun��es validadoras
		//  para formar um objeto Json
		var cropStart = new Number(classe.indexOf("{"));
		 tmpStrFn = new String(classe = classe.substr(cropStart, classe.length - cropStart));
		tmpStrFn = tmpStrFn.substr(0, tmpStrFn.indexOf("}") + 1);
		
		
		
		
		
		//alert(elm.id+"-   1  -"+tmpStrFn);
		if (tmpStrFn.length > 3) {
			try {
				JSONObject = eval("(" + tmpStrFn + ")");
				rtTarget = (JSONObject.target != undefined ? JSONObject.target : elm.id);
//				alert(elm.id+'  - JSONObject.target '+JSONObject.target);
			} 
			catch (e) {
			//alert(e + elm.name);'
			
			}
			arrFunctions = (JSONObject.validaFn) ? JSONObject.validaFn : '';
//			alert(elm.id+"-   functions  -"+JSONObject.validaFn);
		}
		
		
		//alert(rtTarget+' -- '+ elm.name );
		var valida = false;
		var rtValido = false;
		
		if (obrigatorio == true && tipo == 'radio') {
		
			var arrRad = document.getElementsByName(elm.name);
			for (i = 0; i < arrRad.length; i++) {
				if (arrRad[i].checked == true) {
					rtValido = true;
				}
			}
			JSONObject.valido = rtValido;
			JSONObject.target = rtTarget;
			return JSONObject;
		}
		
		//alert('..'+tipo+'..'+obrigatorio);
		if (obrigatorio == true && tipo == 'checkbox') {
			//alert("---");
			var sameChecks = getElemetsBySameTypeClass(elm);
			
			for(i=0; i<sameChecks.length; i++){
				if(sameChecks[i].checked == true){
					rtValido = true;
				}
			}
			
			JSONObject.valido = rtValido;
			JSONObject.target = rtTarget;
			return JSONObject;
		}
		
		var rtValido = true;
		if (obrigatorio == true || (tipo != 'select' && elm.value.length > 0)) {
			
			if (arrFunctions.length > 0) {
				for (var i = 0; i < arrFunctions.length; i++) {
					
					rtValido =  (rtValido==false)?false:eval(arrFunctions[i])(elm.value, elm);
				}
			}
			else {
				if (tipo != 'select') {
					rtValido = elm.value.length < 1 ? false : true;
				}
				else {
					
					rtValido = elm.selectedIndex == 0 ? false : true;
					
				}
			}
			
		}
		//alert(rtTarget);
		JSONObject.valido = rtValido;
		JSONObject.target = rtTarget;
		return JSONObject;
	}
	
		var rtJSONObject = {valid0:true,target:rtTarget}
		
		return rtJSONObject ;
}
function getForm(formIdent){
	
	return document.getElementById(formIdent) 
    ? document.getElementById(formIdent) 
    : document.forms[formIdent]; 
	
}
function swapClass(obj,strClassOld,strClassNew){
	
	if(typeof(obj) == 'object'){
		var obj = obj;
	}else{
		var obj = document.getElementById(obj);
	}
	if (obj != null && obj != undefined) {
		obj.className = obj.className.replace(strClassOld, strClassNew);
	}
	
}
function addClass(obj,strClass){
	if(typeof(obj) == 'object'){
		var obj = obj;
	}else{
		var obj = document.getElementById(obj);
	}
	
	var add = (obj.className.indexOf(strClass)>=0)?false:true;
	if(add){
		obj.className = obj.className+ " " + strClass; 
	}
	
}

function removeClass(obj,strClass){
	if(typeof(obj) == 'object'){
		var obj = obj;
	}else{
		var obj = document.getElementById(obj);
	}
	
	var rem = (obj.className.indexOf(strClass)>=0)?true:false;
	
	if(rem){
		var indexRmClass = obj.className.indexOf(strClass);
		
		var tmpClassStr = obj.className.substr(0,indexRmClass);
		tmpClassStr+= obj.className.substr(indexRmClass+strClass.length+1,obj.className.length);
		obj.className = tmpClassStr;
	}	
}

function getElemetsBySameTypeClass(obj){
	
	var sameTypes = document.getElementsByTagName(obj.tagName);
	var sameClass  = new Array();
	for(var i = 0; i<sameTypes.length; i++){
		var smObj =sameTypes[i]; 
		if(smObj.className == obj.className){
	 		sameClass.push(sameTypes[i]);
		}
	}
	
	return sameClass;
	
		
}

function DOMgetElementsByClassName($node,$className){
/* Description: retorna um array com todos os elementos dentro
                de $node que possuam a classe indicada em $className
   Versão: 1.0 - 30/08/2006
   Author: Micox - Náiron J.C.G - micoxjcg@yahoo.com.br
   Site:   http://elmicox.blogspot.com 
   Não retire estas informações pra não infringir direitos autorais!
*/
var $node, $atual, $className, $retorno = new Array(), $novos = new Array();
$retorno = new Array();
for (var $i=0;$i<$node.childNodes.length;$i++){
            $atual = $node.childNodes[$i];
            if($atual.nodeType==1){// 1 = XML_ELEMENT_NODE
                        $classeAtual = $atual.className;                               
                        if(new RegExp("\\b"+$className+"\\b").test($classeAtual)){
                                   //testando se tem a classe
                                   $retorno[$retorno.length] = $atual;
                        }
                        if($atual.childNodes.length>0){
                                   $novos = DOMgetElementsByClassName($atual,$className);
                                   if($novos.length>0){
                                               $retorno = $retorno.concat($novos);
                                   }
                        }
            }
}
return $retorno;
} 


/*
 * BLOCO P/ colocar * nos itens obrigatórios
 */
function marcaCamposObr(){
	var obr = DOMgetElementsByClassName(document,"obr");
	
	
	var labels = document.getElementsByTagName('label');
	
	var obrSignal = "<span title=\"preenchimento obrigatório\" class=\"sinal_obrigatorio\">*</span>";
	
try {
	
	var arrayForId = new Array();
	var elm;
	for (i = 0, elm; elm = labels.item(i++);) {
	
		if (navigator.appName.indexOf("Microsoft") >= 0) {
			arrayForId[elm.getAttribute('htmlFor')] = elm;
		}
		else {
			arrayForId[elm.getAttribute('for')] = elm;
		}
	}
	var input;
	for(i=0, input; input = obr[i++];){
		var classe = new String(input.className);
		
		var rtTarget = input.id;
		
		var indexObr = classe.indexOf("[obr]");
		
		// verifico se h� a flag obrigat�rio ou a n�o obrigat�rio	
		var obrigatorio = (indexObr >= 0) ? true : false;
		//removo o [obr] da string
		classe = classe.replace("[obr]",'');
		//  pego o conte�do XXX dentro de fn[XXX] para gerar array de fun��es validadoras
		//  para formar um objeto Json
		var cropStart = new Number(classe.indexOf("{"));
		tmpStrFn = new String(classe = classe.substr(cropStart, classe.length - cropStart));
		tmpStrFn = tmpStrFn.substr(0, tmpStrFn.indexOf("}") + 1);
		
		
		//alert(elm.id+"-   1  -"+tmpStrFn);
		if (tmpStrFn.length > 3) {
			try {
				JSONObject = eval("(" + tmpStrFn + ")");
				rtTarget = (JSONObject.target != undefined ? JSONObject.target : elm.id);
			} 
			catch (e) {
			}
			
		}
		
		
		
		if(arrayForId[rtTarget]!=undefined){
			//alert(arrayForId[rtTarget].innerHTML);
			if (arrayForId[rtTarget]) {
				
				var span = arrayForId[rtTarget].getElementsByTagName('strong');
				span = span[0];
				
				if(span.innerHTML.indexOf('*') ==-1)
					span.innerHTML =  obrSignal + span.innerHTML ;
				//delete  arrayForId[rtTarget];
				arrayForId[rtTarget] = 0;
			}
		}else{
			//alert("ta faltando label p/ item obrigatório -> "+rtTarget);
		}
	}
	
} catch (e) {
	
}


}
