/* JavaScript
-------------------------------------------------------------------------------------------
	Copyright (c) 2008 The AgenciaWX Development Team

OBS:
- Obrigatório a variavel ID	na tag do campo do form
- Requerido Jquery
- Wx Mascara executa depois de 1ms, WxValidaCampoCLiente 100ms, WxValidaCampoServidor 200ms
- No WXvalidaform, usar  onsubmit="return WXvalidaForm(this, null);"
- Se setar a propriedade para nval='1', ele não valida mais (útil para fazer formulario com
  trechos q são ocultos e não devem mais ser validados, basta setar para nval='1')

Função Callback tem 2 argumentos:
error 		(se houve erro ou nao)
error_desc 	(descricao dos erros)

Propriedades da TAG form:
- class_valido
- class_invalido
- val
- msg
- alert

VER DEPOIS
- em erroDesc.push('Campo ' + WXvc_obj.attr('name') + ' não pode estar vazio.'),
ver oq por em WXvc_obj.attr('name') em todos os casos

classdiv = nome da div onde a classe será aplicada

-------------------------------------------------------------------------------------------
FUNCOES USADAS:

WXvalidaCampo(a_obj)  	 	=> Valida Campo unico
WXvalidaForm(f_obj, alerta) => Valida Formulário Inteiro
-------------------------------------------------------------------------------------------

*/

var WXvc_obj;		// Objeto (Jquery)

// ===========================================
//  Valida Campo unico (ATUAL)
// ===========================================
function WXvalidaCampo(a_obj){
	WXvc_obj = $(a_obj);
	setTimeout("WXVC_intvalidaCampo()",100);

}

// ===========================================
//  Valida Formulario Inteiro
// ===========================================
function WXvalidaForm(f_obj, alerta){

	var erro = false;
	var erroDescText = '';

	// Procura todos os elementos validaveis
	$('#' + f_obj.id + ' [val=1]').each(function(){

		// Valida Apenas elementos visiveis ou nval diferente de 1
		if ($(this).attr('nval') != '1'){
			WXvc_obj = $(this);
			WXvc_callback = null;
			r_erro = WXVC_intvalidaCampo();		

			if (r_erro[0])
				erro = true;				

			erroDescText = r_erro[1];
			for(var i = 0 ; i < erroDesc.length ; i++)
				erroDescText += erroDesc[i] + "\n";
		}
	});

	// -----------------------------------
	// Alert
	// -----------------------------------
	if (alerta && erro){
		alert(erroDescText);
	}	

	return !erro;
}

//-----------------------------------------------
function WXVC_intvalidaCampo(){

	// Verifica se o campo deve ser validado
	if (WXvc_obj.attr('val') == "1"){

		// -----------------------------------
		// Executa filtros de validação
		// -----------------------------------
		var r_erro = WXVC_filtroValidacao();
		// -----------------------------------
		// Respostas
		// -----------------------------------
		erro = r_erro[0];
		erroDesc = r_erro[1];
		// -----------------------------------
		// Imprimir MSGBOX
		// -----------------------------------
		if (WXvc_obj.attr('msgbox')){

			var msgBox = $('#'+WXvc_obj.attr('msgbox')).find("[dono=validacampocliente]");

			msgBox.each(function(){
				$(this).remove();
			});

			for(var i = 0 ; i < erroDesc.length ; i++)
				$('#'+WXvc_obj.attr('msgbox')).append('<p dono="validacampocliente">' + erroDesc[i] + '</p>');

		}
		// -----------------------------------
		// Alert
		// -----------------------------------
		if (WXvc_obj.attr('alert') && (erro)){
			var erroDescText = '';
			for(var i = 0 ; i < erroDesc.length ; i++)
				erroDescText += erroDesc[i] + "\n";

			alert(erroDescText);
		}
		// -----------------------------------
		// Aplica Classe (VERIFICA SE TEM ELEMENTO COMO FILHO)
		// -----------------------------------
		if (WXvc_obj.attr('classdiv') && WXvc_obj.attr('classinvalido') && WXvc_obj.attr('classvalido')){

			var classDiv = ('#'+WXvc_obj.attr('classdiv'));
			var classValido = WXvc_obj.attr('classvalido');
			var classInvalido = WXvc_obj.attr('classinvalido');

			// Verifica se tem alguma mensagem de erro e aplica a classe caso positivo
			numErro = $('#'+WXvc_obj.attr('msgbox')+' > *').size();

			if (numErro > 0){
				document.getElementById(WXvc_obj.attr('classdiv')).className = classInvalido;
			}else{
				document.getElementById(WXvc_obj.attr('classdiv')).className = classValido;
			}

		}
		// -----------------------------------
		// Retorna Função
		// -----------------------------------
		return Array(erro, erroDesc);

	}else{
		
		return Array(false, Array());
	}

}

// ===========================================
//  Executa Filtro de Validacao (usa variavel global WXvc_obj)
// ===========================================
function WXVC_filtroValidacao(){

	// Valor a ser validado
	var string = (WXvc_obj.attr('value'))? new String(WXvc_obj.attr('value')) : '';
	// Retorna erro
	var erro = false;
	var erroDesc = Array();

	// ---------------------------------------------
	// REQUERIDO
	// ---------------------------------------------
	if ((WXvc_obj.attr('requerido') == "1") && (string.length == 0)){
		erro = true;
		erroDesc.push('Campo ' + WXvc_obj.attr('name') + ' não pode estar vazio.');
	}
	// ---------------------------------------------
	// NÃO REQUERIDO
	// ---------------------------------------------
	if (string.length > 0){
		// ---------------------------------------------
		// EXPRESSÂO REGULAR
		// ---------------------------------------------
		if (WXvc_obj.attr('regexp')){
			r_erro = WXVC_checkRegExp(WXvc_obj.attr('regexp'), string);
			erro = !r_erro[0];
			if (!r_erro[0]){
				erroDesc.push(WXvc_obj.attr('name') + ': ' + r_erro[1]);
			}
		}

		// ---------------------------------------------
		// TAMANHO MAXIMO
		// ---------------------------------------------
		if (WXvc_obj.attr('tammax')){
			var tamMax = parseInt(WXVC_removeZero(WXvc_obj.attr('tammax')));
			if (string.length > tamMax){
				erro = true;
				erroDesc.push(WXmensagem("tammax", Array(WXvc_obj.attr('name'), tamMax)));
			}
		}
		// ---------------------------------------------
		// TAMANHO MINIMO
		// ---------------------------------------------
		if (WXvc_obj.attr('tammin')){
			var tamMin = parseInt(WXVC_removeZero(WXvc_obj.attr('tammin')));
			if (string.length < tamMin){
				erro = true;
				erroDesc.push(WXmensagem("tammin", Array(WXvc_obj.attr('name'), tamMin)));
			}
		}
		// ---------------------------------------------
		// VALOR MAXIMO
		// ---------------------------------------------
		if (WXvc_obj.attr('valmax')){
			var valMax = parseInt(WXVC_removeZero(WXvc_obj.attr('valmax')));
			if (parseInt(WXVC_removeZero(string)) > valMax){
				erro = true;
				erroDesc.push(WXmensagem("valmax", Array(WXvc_obj.attr('name'), valMax, parseInt(WXVC_removeZero(string)))));
			}
		}
		// ---------------------------------------------
		// TAMANHO MINIMO
		// ---------------------------------------------
		if (WXvc_obj.attr('valmin')){
			var valMin = parseInt(WXVC_removeZero(WXvc_obj.attr('valmin')));
			if (parseInt(WXVC_removeZero(string)) < valMin){
				erro = true;
				erroDesc.push(WXmensagem("valmin", Array(WXvc_obj.attr('name'), valMin, parseInt(WXVC_removeZero(string)))));
			}
		}
		// ---------------------------------------------
		// IDENTICO (para senha)
		// ---------------------------------------------
		if (WXvc_obj.attr('identico')){
			var stringElem = $('#'+WXvc_obj.attr('identico')).attr('value');
			if (string != stringElem){
				erro = true;
				erroDesc.push(WXmensagem("identico", Array(WXvc_obj.attr('name'), $('#'+WXvc_obj.attr('identico')).attr('name'))));

			}
		}
		// ---------------------------------------------
		// Diferente de VARIAVEL
		// ---------------------------------------------
		if (WXvc_obj.attr('diferente')){
			var stringElem = WXvc_obj.attr('diferente');
			if (string == stringElem){
				erro = true;
				erroDesc.push(WXmensagem("diferente", Array(WXvc_obj.attr('name'), stringElem)));
			}
		}


	}

	return Array(erro, erroDesc);
}

// ======================================================
// Expressões Regulares Pré Formatadas
// ======================================================
function WXVC_checkRegExp(regx, value){

	var retorno = new Array();

  switch (regx){
	  case "EMAIL":
	  	retorno[0] = (/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/).test(value);
		retorno[1] = "Email inválido";
		return (retorno);

	  case "TEL":
	  	retorno[0] = (/^1?[\- ]?\(?\d{2}\)?[\- ]?\d{4}[\- ]?\d{4}$/).test(value);
		retorno[1] = "Telefone Inválido, deve estar no seguinte formato: XX-XXXX-XXXX";
		return (retorno);

	  case "PC":
	  	retorno[0] = (/^[a-z]\d[a-z] ?\d[a-z]\d$/i).test(value);
		retorno[1] = "?erro?";
		return (retorno);

	  case "ZIP":
	  	retorno[0] = (/^\d{5}$/).test(value);
		retorno[1] = "Zip Code errado";
		return (retorno);

	  case "MONEY":
	  	retorno[0] = (/^\d+([\.]\d\d)?$/).test(value);
		retorno[1] = "Valor monetário inválido";
		return (retorno);

	  case "MONETARIOBR":
	  	retorno[0] = (/^\d+([\,]\d\d)?$/).test(value);
		retorno[1] = "Valor monetário inválido, use apenas vírgulas";
		return (retorno);


	  case "NUMERO":
	  	retorno[0] = !isNaN(value);
		retorno[1] = "Precisa ser um Número";
		return (retorno);

	  case "POSTALZIP":
		if(value.length == 6 || value.length == 7)
		  	retorno[0] = (/^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/).test(value);
		if(value.length == 5 || value.length == 10)
		  	retorno[0] = (/^\d{5}(\-\d{4})?$/).test(value);
		retorno[1] = "Postal ZIP inválido";
		return (retorno);
		break;

	  case "DATA":
	  	retorno[0] = (/^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/).test(value);
		retorno[1] = "Data Inválida";
		return (retorno);
		break;

	  default:
	  	retorno[0] = regx.test(value);
		retorno[1] = "Campo incorreto";
  		return (retorno);
  };
};


function WXVC_removeZero(sStr){
   var i;
   for(i=0;i<sStr.length;i++)
      if(sStr.charAt(i)!='0')
         return sStr.substring(i);
   return sStr;
};

// ======================================================
// Lista de Mensagens (PARA PERSONALIZAÇÃO)
// ======================================================
function WXmensagem(msg, dados){

	switch (msg){

			case "tammax":
				return (dados[0] + ': Máximo ' + dados[1] + ' caracteres');

			case "tammin":
				return (dados[0] + ': Mínimo ' + dados[1] + ' caracteres');

			case "valmax":
				return (dados[0] + ': Valor Máximo neste campo é de ' + dados[1] + '(' + dados[2] + ')');

			case "valmin":
				return (dados[0] + ': Valor Mínimo neste campo é de ' + dados[1] + '(' + dados[2] + ')');

			case "identico":
				return ('Campos ' + dados[0] + ' e ' + dados[1] + ' devem ser idênticos');

			case "diferente":
				return ('Campos ' + dados[0] + ' não pode ser igual a ' + dados[1]);

			default:
				return ('erro: foi chamada por uma mensagem que não existe');
		}

}