/*
	Validate
	04/09/2007 por Rafael Gomes Alcantara
	Email: rafalcan@gmail.com
	iThink Professional Services
	www.ithink.com.br
	Version 1.0
*/
/*
    Options
    - required
    - minLength
    - maxLength
    - number
    - email
    - cpf    
    
    Types
    - text
    - radio
    - checkbox
    - select
    - textarea
*/

function fieldTip(pField, pMsg, pCaminho){
	var _field = pField;
	var _msg = pMsg;
	var _caminho = pCaminho;
	var id = "tip"+_field.attr("id");
	var verify = $j("#"+id);
	//
	if(verify.length == 0){
		$j("body").append("<div id='"+id+"' class='tooltipErr'><img src='"+_caminho+"setaTooltip.gif' class='setaTip' width='14' height='14'>"+_msg+"</div>");
		var tip = $j("#"+id);
		//			
		tip.css("left", (_field.offset().left+_field.width()+10)+"px");
		tip.css("top", (_field.offset().top-5)+"px");
		tip.hide();
		  
		_field.hover(function(){
		    var tmpTip = $("body").find("#tip"+$(this).attr("id"));
		    //
		    tmpTip.show();
		 },function(){
		   	var tmpTip = $("body").find("#tip"+$(this).attr("id"));
		   	//
		   	tmpTip.hide();
		 });
	}else{
		verify.html("<img src='"+_caminho+"setaTooltip.gif' class='setaTip' width='14' height='14'>"+_msg);
	}	
}

function removeFieldTip(pField){
	var _field = pField;
	var id = "tip"+_field.attr("id");
	//
	$j("#"+id).remove();
}

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 data(pElement){
    var _element = $j(pElement);
    //
    return _element.data();
}

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 + '"]');
}

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] ){
					var tmpErr = retFunc[1];
					//
					tmpField.stop();
					tmpField.animate({
						className: 'campoErr'
					}, 300);
					
					fieldTip(tmpField, tmpErr, caminho);
																
					err++;
					//
					stop = true;					
					break;							
				}else{
					if(retFunc[1] != ""){
						tmpField.stop();
						tmpField.animate({
							className: 'campoCorrect'
						}, 300);
					}else{
						tmpField.stop();
						tmpField.animate({
							className: options.style
						}, 300);
					}
					removeFieldTip(tmpField);						
				}										
			}				
		}
		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++){
        if(_group[i].nodeName.toLowerCase() == "span"){
            var element = _group[i].childNodes[0]; 
            var options = data(_group[i]);
        }else{
            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];
	},
	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];
	}
}

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.",
	email: "Digite um email válido.",
	cpf: "Digite um CPF válido."	
}
