/** 
* Plugin para validação dos campos
* @author Gedson Marcelino<scoker.br@gmail.com>
* @version 0.5.3
* @last update 09/10/2007
* @copyright  GPL © 2007, scoker ltda. 
* @access public  
* @example 
*		$(document).ready(function($){
*			$('#form1').valida({
*				campos : ["assunto","responsavel","setor","data","texto"],
*				marcacao: "<img src='checked.gif' />",
*				mensagem: {id:"mensagem" , texto:"Os campos marcados s&atilde;o obrigat&oacute;rios!"}
*			});
*		});	
*/ 
(function($) {
	/**
	*Configurações padrões
	*@param campos - array de string/objeto dos campos obrigatórios
	*@param retorno - o retorno da verificação é encaminhado para uma função(utilizado no ajax)
	*@param marcacao - img/texto que identificará os campos obrigatórios
	*@param mensagem - objeto (id: div onde apresentará a mensagem) (texto: mensagem que será exibida)
	*/		  
	var settings = {
		campos: '', 
		retorno: '',
		marcacao: '*',
		mensagem: {id:'' , texto: ''}
	};
	
	/**
	*Objeto que manipula o editor wysiwyg TINYMCE
	*/
	var mce = {
		val:function(id){
			return tinyMCE.getInstanceById(id).getHTML();
		}
	};
	
	/**
	*Objeto que manipula a tag input
	*/
	var input = {
		//VERIFICA O TIPO DO INPUT(TEXT,RADIO,CHECK)
		valor:function(id){
			var idVal = "#" + id;
			
			//TEXT
			if ($(idVal).attr("type") == "text" || $(idVal).attr("type") == "file"){
				return $(idVal).val();
			}
			
			return "";
		}
	};
	
	/**
	*Objeto que manipula a tag label
	*/
	var label = {
		//CRIA MARCAÇÃO
		criaMarcacao:function(id){
			//VERIFICA SE É OBJETO
			id = (typeof id == "object") ? id.id : id;
			
			temp = $("label[@for="+id+"]").find("span").html();
			
			if (temp != null)
				$("label[@for="+id+"]").find("span").html(settings.marcacao);
			else
				$("label[@for="+id+"]").html($("label[@for="+id+"]").html() + "<span style='color:red;'>"+settings.marcacao+"</span>");
		},
		
		//RETIRA MARCACAO
		retiraMarcacao:function(id){
			//VERIFICA SE É OBJETO
			id = (typeof id == "object") ? id.id : id;
			
			temp = $("label[@for="+id+"]").find("span").html();
			
			if (temp != null)
				$("label[@for="+id+"]").find("span").html("");
		}
	};
	
	/**
	*Objeto que manipula a tag select
	*/
	var select = {
		//VERIFICA O TIPO DO INPUT(TEXT,RADIO,CHECK)
		valor:function(id){
			var idVal = "#" + id;

			return $(idVal).val();
		}		
	}
	
	/**
	*Função que verifica o tipo do objeto e pega o valor referente ao mesmo
	*@return String
	*/
	function verificaTipo(obj){	
		if (typeof obj == "object"){
			if (obj.tipo == "tinyMCE")
				return mce.val(obj.id);
		}
		
		if (typeof obj == "string"){
			idVal = "#" + obj;
			if ($(idVal).is("input"))
				return input.valor(obj);
			
			if ($(idVal).is("select"))
				return select.valor(obj);
		}
		
		return "";
	}
	
	/**
	*Função que varre todo o array de campos
	*/	
	function validacoesAUX(options){
		var cont = 0; //CONTADOR PARA OS CAMPOS VAZIOS
		
		for (i=0; i<options.campos.length;i++){
			valor = verificaTipo(options.campos[i]);			
			if (valor == ""){
				label.criaMarcacao(options.campos[i]);
				cont++;
			}
			else
				label.retiraMarcacao(options.campos[i])				
		}
		
		//VERIFICA SE EXISTE ALGUM CAMPO VAZIO
		if (cont == 0)
			eval(options.retorno);
	}	
	
	/**
	*Método Principal
	*/	
	$.fn.valida = function(options) {		
		if(options) {
			jQuery.extend(settings, options);
		}	
		
		//FUNÇÃO QUE VARRE TODO O ARRAY DE CAMPOS
		var validacoes = function(){
			var cont = 0; //CONTADOR PARA OS CAMPOS VAZIOS
			
			for (i=0; i<options.campos.length;i++){
				valor = verificaTipo(options.campos[i]);	
				
				//alert("valor: " + valor);
				if (valor == ""){
					label.criaMarcacao(options.campos[i]);
					cont++;
				}
				else
					label.retiraMarcacao(options.campos[i])				
			}
			
			//VERIFICA SE EXISTE ALGUM CAMPO VAZIO
			if (cont > 0){				
				if (settings.mensagem.id != "")
					$("#"+options.mensagem.id).html(options.mensagem.texto);
				return false;
			}
			
			return true;
		}
		
		//COLOCA NO SUBMIT DO FORM A VALIDAÇÃO
		if (this.is("form"))
			this.submit(validacoes);
		else{			
			//COLOCA A VALIDAÇÃO NO BOTÃO NO EVENTO CLICK
			if (this.is("input") || this.is("button"))
				validacoes;
			else
				validacoesAUX(options);
		}
			
	};
})(jQuery);