/*
	Validate
	11/11/2008
	Autor: Rafael Gomes Alcantara
	E-mail: rafael@agenciatpi.com
	Version 1.0
*/
/*
    Attributes
    - label
    
    Options
    - required
    - minLength
    - maxLength
    - number
    - text
    - email
    - cpf 
    - cnpj  
    
    Types
    - text
    - radio
    - checkbox
    - select
    - textarea
*/

function checkCPF(pCPF){
	var _cpf = pCPF;
	var numeros, digitos, soma, i, resultado, digitos_iguais;
	digitos_iguais = 1;
	if (_cpf.length < 11){
		return false;
	}	    
	for (i = 0; i < _cpf.length - 1; i++){
		if (_cpf.charAt(i) != _cpf.charAt(i + 1)){
          digitos_iguais = 0;
          break;
	    }
	}
	if (!digitos_iguais){
	    numeros = _cpf.substring(0,9);
	    digitos = _cpf.substring(9);
	    soma = 0;
	    for (i = 10; i > 1; i--){
			soma += numeros.charAt(10 - i) * i;
		}	          
	    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	    if (resultado != digitos.charAt(0)){
			 return false;
		}	         
	    numeros = _cpf.substring(0,10);
	    soma = 0;
	    for (i = 11; i > 1; i--){
			soma += numeros.charAt(11 - i) * i;
		}	         
	    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	    if (resultado != digitos.charAt(1)){
			return false;
		}
	    return true;
	}else{
		return false;	  	
	}
}

function checkCNPJ(pCNPJ){
	var _cnpj = pCNPJ;
	var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
	digitos_iguais = 1;
	//if (_cnpj.length < 14 && _cnpj.length < 15){
	    //return false;
	//}
	for (i = 0; i < _cnpj.length - 1; i++){
	    if (_cnpj.charAt(i) != _cnpj.charAt(i + 1)){
	          digitos_iguais = 0;
	          break;
	    }
	}
	if (!digitos_iguais){
	    tamanho = _cnpj.length - 2
	    numeros = _cnpj.substring(0,tamanho);
	    digitos = _cnpj.substring(tamanho);
	    soma = 0;
	    pos = tamanho - 7;
	    for (i = tamanho; i >= 1; i--){
		      soma += numeros.charAt(tamanho - i) * pos--;
		      if (pos < 2){
		      		pos = 9;
			  }
	    }
	    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	    if (resultado != digitos.charAt(0)){
	          return false;
		}
	    tamanho = tamanho + 1;
	    numeros = _cnpj.substring(0,tamanho);
	    soma = 0;
	    pos = tamanho - 7;
	    for (i = tamanho; i >= 1; i--){
	          soma += numeros.charAt(tamanho - i) * pos--;
	          if (pos < 2){
	          		pos = 9;
	          }
		}
	    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
	    if (resultado != digitos.charAt(1)){
	        return false;
		}
		return true;
	}else{
	    return false;
	} 
}

function data(pElement){
    var _element = $j(pElement);
    //
    return _element.metadata();
}

function checkable(pElement) {
    var _element = pElement;
    //
	return /radio|checkbox/i.test(_element.type);
}

function checkableGroup(pElement) {
    var _element = pElement;
    //
	//return $j(_element.form || document).find('[@name="' + _element.name + '"]');
	return $j(document.getElementsByName(_element.name));
}

function getLength(pElement) {
    var _element = pElement;
    var value = _element.value; 
    //
	switch( _element.nodeName.toLowerCase() ) {
	    case 'select':
		    return $j("option:selected", _element).length;
	    case 'input':
	        if(checkable(_element)){
		        return checkableGroup(_element).filter(':checked').length;
	        }
    }
	return value.length;
}

function setValidate(pElement){
    var _element = pElement;
    var options = _element.opts;
    var caminho = _element.caminho;
    var stop = false;
    var err = 0;
    //
    for(var option in options){
		for(var method in methods){
			if(option == method){
				var func = methods[method];
				var param = options[option];
				var error = errors[method];
				var retFunc = func(_element, param, error);
				var tmpField = $j(_element);
				//
				if( !retFunc[0] ){
					// ERROR
					var tmpErr = retFunc[1];
					//
					if(checkable(_element)){
						tmpField = checkableGroup(_element);
						tmpField.addClass('fieldErr');
					}else{
						tmpField.removeClass('fieldRight');
						tmpField.addClass('fieldErr');
					}
					err++;
					//
					stop = true;					
					break;							
				}else{
					// SUCCESS
					if(checkable(_element)){
						tmpField = checkableGroup(_element);
						tmpField.removeClass('fieldErr');
					}else{
						tmpField.removeClass('fieldErr');
						tmpField.addClass('fieldRight');
					}
				}	
			}
		}
		if(stop){
			break;
		}
	}
    //
    return err;
}

function validateGroup(pGroup, pCaminho){
    var _group = $j("."+pGroup);
	var _caminho = pCaminho;
    var totGroup = _group.length;
    var err = 0;
    //
    for(var i=0; i<totGroup; i++){
        var element = _group[i];
        var options = data(element);
		
		if(element.onblur == null){
            element.opts = options;
            element.caminho = _caminho;
			element.onblur = function(){
		        setValidate(this);
		    }
	    }

        err += setValidate(element);
    }
    //
	if(err > 0){
		return false;
	}else{
		return true;
	}
}

var methods = {
	required: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		switch( _element.nodeName.toLowerCase() ) {
			case 'select':
				var options = $j("option:selected", _element);
				ret = options.length > 0 && ( _element.type == "select-multiple" || ($j.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
				break;
			case 'input':
				if ( checkable(_element) ){
					ret = getLength(_element) > 0;
					break;
				}
			default:
				ret = value.length > 0;
				break;
		}
		//
		return [ret, _error];	
	},
	minLength: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
			ret = getLength(_element) >= _param;
			_error = _error.replace("{0}", _param);	
		}
		//
		return [ret, _error];
	},
	maxLength: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
			ret = getLength(_element) <= _param;
			_error = _error.replace("{0}", _param);
		}
		//
		return [ret, _error];
	},
	number: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
			ret = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);	
		}		
		//
		return [ret, _error];
	},
	text: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
			ret = /^[a-zA-zçÇãÃõÕáÁàÀéÉèÈíÍìÌóÓòÒôÔêÊúÚùÙüÜöÖ\s]+$/.test(value);	
		}		
		//
		return [ret, _error];
	},
	email: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
			ret = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/i.test(value);	
		}		
		//
		return [ret, _error];
	},
	cpf: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
	        ret = checkCPF(value);
		}		
		//
		return [ret, _error];
	},
	cnpj: function(pElement, pParam, pError){
		var _element = pElement;
		var _param = pParam;
		var _error = pError;
		var value = _element.value;
		var ret = 0;
		//
		if(getLength(_element) == 0){
			ret = true;
			_error = "";
		}else{
	        ret = checkCNPJ(value);
		}		
		//
		return [ret, _error];
	}
}

var errors = {
	required: "Este é um campo obrigatório.",
	minLength: "Digite um valor com no minímo {0} caracteres.",
	maxLength: "Digite um valor com no máximo {0} caracteres.",
	number: "Digite apenas números.",
	text: "Este campo não aceita valores númericos.",
	email: "Digite um email válido.",
	cpf: "Digite um CPF válido.",
	cnpj: "Digite um CNPJ válido."	
}