/*
	Validate
	16/07/2007 por Rafael Gomes Alcantara
	Email: rafael.gomes@ithink.com.br
	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 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 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);
		var stop = false;
        //
		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(element.onblur == null){
						element.onblur = function(){
							validateGroup(pGroup, pCaminho);
						}
					}
							
					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: data(element).style
							}, 300);
						}
						removeFieldTip(tmpField);						
					}										
				}				
			}
			if(stop){
				break;
			}
		}		
    }
    // 
	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);
			case 'input':
				if ( checkable(_element) ){
					ret = getLength(_element) > 0;
				}
			default:
				ret = value.length > 0;
		}
		//
		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;
		//
		ret = true;
		//
		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."	
}