/* JavaScript
-------------------------------------------------------------------------------------------
	Copyright (c) 2008 AgenciaWX Development Team

- Obrigatório a variavel ID	na tag do campo do form
- Obrigatório a variavel name para enviar o campo ao formulario
- Obrigatório na tag do form a variavel pagsucesso (redireciona se tudo estiver ok)
- Requerido Jquery
- Requerido WXXML

OBS:
"nos select multiplo se tiver o atributo 'tudo' configurado, ele enviará todo os dados mesmo q nao esteja selecionado"

=== VALIDACAMPOUNICO ===
Obrigatório resposta em XML com o seguinte layout:

$xml = "<?xml version='1.0' encoding='iso-8859-1'?>\n";
$xml .= "<wxval>\n";
	$xml .= "\t<erro></erro>\n";
	$xml .= "\t<msg></msg>\n";
$xml .= "</wxval>\n";

=== SUBMITAJAX ===
No Lado do servidor é obrigatório a resposta em XML com o seguinte layout:


// ERRO GERAL (OBRIGATORIO SEMPRE)

$xml = "<?xml version='1.0' encoding='iso-8859-1'?>\n";
	$xml .= "<wxval>\n";
		$xml .= "\t<errogeral>\n";	
			$xml .= "\t\t<erro>1</erro>\n";
			$xml .= "\t\t<erro_numero>" . $conn->ErrorNo() . "</erro_numero>\n";
			$xml .= "\t\t<erro_desc>" . $conn->ErrorMsg() . "\n" . $sql_cadastro . "</erro_desc>\n";
		$xml .= "\t</errogeral>\n";				
	$xml .= "</wxval>\n";
exit($xml);


// ERRO ESPECIFICO DO CAMPO

* Obrigatório apenas para campos q se deseja fazer a validação no lado do servidor

$xml = "<?xml version='1.0' encoding='iso-8859-1'?>\n";
$xml .= "<wxval>\n";
	$xml .= "\t<campo>\n";
		$xml .= "\t\t<id>CampoTeste1</id>\n";
		$xml .= "\t\t<erro></erro>\n";
		$xml .= "\t\t<msg>Usuário " . $valor ." já cadastrado</msg>\n";
	$xml .= "\t</campo>\n";
	$xml .= "\t<campo>\n";
		$xml .= "\t\t<id>CampoTeste2</id>\n";
		$xml .= "\t\t<erro></erro>\n";
		$xml .= "\t\t<msg>Usuário " . $valor ." já cadastrado</msg>\n";
	$xml .= "\t</campo>\n";
	$xml .= "\t<errogeral>\n";	
		$xml .= "\t\t<erro>1</erro>\n";
		$xml .= "\t\t<erro_numero>" . $conn->ErrorNo() . "</erro_numero>\n";
		$xml .= "\t\t<erro_desc>" . $conn->ErrorMsg() . "\n" . $sql_cadastro . "</erro_desc>\n";
	$xml .= "\t</errogeral>\n";		
$xml .= "</wxval>\n";

para ser tratado corretamento no lado do cliente

=== CALLBACK ===
Para usar callback basta criar as seguintes funcoes:

WXfa_enviando(); (executado quando o formulario ajax eh enviado)
WXfa_recebido(STATUS(true(ok), false(erro)); (executado quando receber a resposta do formulario ajax


-------------------------------------------------------------------------------------------
FUNCOES USADAS:

WXvalidaServidor(a_obj, a_ajax)  	 	=> Valida Campo unico
WXajaxSubmit(f_obj, alerta)				=> Valida e faz o submit
-------------------------------------------------------------------------------------------
*/

var WXfa_obj;		// Objeto (Jquery)
var WXfa_ajax;		// Objeto (Jquery)
var WXfa_redir;		// Página que será redirecionado caso esteja tudo certo

var WXfa_enviando;			// Callback enviando
var WXfa_recebido;			// Callback recebido
var WXfa_sucessoCallback;	// Callback sucesso
// =================================================================================================================================
//  Valida Campo unico
// =================================================================================================================================
function WXvalidaServidor(a_obj, a_ajax){

	WXfa_obj = $(a_obj);
	WXfa_ajax = a_ajax;
	setTimeout("WXfa_intvalidaServidor()",100);

}

function WXfa_intvalidaServidor(){

	// Configura AJAX
	$.ajaxSetup({
	  cache: false
	});


	if (WXfa_obj.attr('valserv') == "1"){
 	//alert(WXfa_obj.attr('value'));
		// Envia via  POST o dado do campo para o servidor
			$.post(WXfa_ajax, {
					ajax: "validacao",
					name: WXfa_obj.attr('name'),
					value: WXfa_obj.attr('value')
				}, WXfa_retornoValidacao);
	}
}

// ===========================================
//  Função que pega o retorno do servidor
// ===========================================
function WXfa_retornoValidacao(dado,status){
//	alert(dado);
//	alert('aqui');

	if (status == 'success'){
		// -----------------------------------
		// Obtem dados do servidor
		// -----------------------------------

			var xml = new Parsing(dado);
			var erro = xml.GetAttr("erro");
			var erroDesc = xml.GetAttr("msg");

		// -----------------------------------
		// Imprimir MSGBOX
		// -----------------------------------
		if (WXfa_obj.attr('msgbox')){

			var msgBox = $('#'+WXfa_obj.attr('msgbox')).find("[dono=formajax]");

			msgBox.each(function(){
				$(this).remove();
			});

			if (erro)
				$('#'+WXfa_obj.attr('msgbox')).append('<p dono="formajax">' + erroDesc + '</p>');

		}
		// -----------------------------------
		// Aplica Classe (VERIFICA SE TEM ELEMENTO COMO FILHO)
		// -----------------------------------
		if (WXfa_obj.attr('classdiv') && WXfa_obj.attr('classinvalido') && WXfa_obj.attr('classvalido')){

			var classDiv = ('#'+WXfa_obj.attr('classdiv'));
			var classValido = WXfa_obj.attr('classvalido');
			var classInvalido = WXfa_obj.attr('classinvalido');

			// Verifica se tem alguma mensagem de erro e aplica a classe caso positivo
			numErro = $('#'+WXfa_obj.attr('msgbox')+' > *').size();

			if (numErro > 0){
				document.getElementById(WXfa_obj.attr('classdiv')).className = classInvalido;
			}else{
				document.getElementById(WXfa_obj.attr('classdiv')).className = classValido;
			}
		}


	}

}

// =================================================================================================================================
// SUBMIT AJAX
// =================================================================================================================================
function WXajaxSubmit(f_obj, alerta){

   	var Variaveis = "";
	var action = $(f_obj).attr('action');
	var method = new String($(f_obj).attr('method')).toUpperCase();
	var tag;
	var tipo;
	var nome;
	var valor;
	var redir = $(f_obj).attr('pagsucesso');


	if (!redir)
		WXfa_redir = null;
	else
		WXfa_redir = redir;

	// ===============================
	// Verificacao
	// ===============================

	// Padrão

	if (method == "UNDEFINED"){
		method = "GET";
		throw "Método não definido, assumindo GET";
	}

	if (method != "GET" && method != "POST")
		throw "Método deve ser GET ou POST";

	if (!f_obj.id)
		throw "Id não definido";



	// ===============================
	// Pega todos os elementos do Form
	// ===============================

	$('#' + f_obj.id + ' *').each(function(){
		tag = new String($(this).attr('tagName')).toUpperCase();
		tipo = new String($(this).attr('type')).toUpperCase();
		name = $(this).attr('name');
		valor = $(this).attr('value');		

		// ============================================================================
		// PEGA APENAS AS TAG INPUT, SELECT, TEXTAREA SE tiverem a tag name configurada
		// ============================================================================
        if ((tag == "INPUT" || tag == "SELECT" || tag == "TEXTAREA") && name)
        {
			//alert('name(' + name + ') tipo(' + tipo + ') tag(' + tag + ') valor(' + valor + ')');
			// ================================================================
			// TIPO FILE
			// ================================================================
            if(tipo == "FILE")
                throw "WXFORMAJAX.JS: Não é possível enviar arquivos por AJAX";

			// ================================================================
			// TIPO RADIO ou CHECKBOX
			// ================================================================
			if(tipo  == "RADIO" || tipo == "CHECKBOX" ){

					if($(this).attr('checked')) 
						Variaveis += $(this).attr('name') + "=" + escape(valor) + "&";

			// ================================================================
			// DEMAIS TIPOS
			// ================================================================
			}else{

				if (tag == "SELECT"){					
					// ====================================
					// SELECT MULTIPLE
					// ====================================
					if ($(this).is('[multiple]')){
						for(var i = 0; i < this.length ; i++){
							if ($(this).attr('tudo')){
								if ($(this[i]).attr('value'))
									Variaveis += $(this).attr('name') + "[]=" + escape($(this[i]).attr('value')) + "&";								
							}else{								
								if ($(this[i]).attr('selected'))
									if ($(this[i]).attr('value'))
										Variaveis += $(this).attr('name') + "[]=" + escape($(this[i]).attr('value')) + "&";
							}
						}
					// ====================================
					// SELECT NORMAL
					// ====================================
					}else{
						Variaveis += $(this).attr('name') + "=" + escape(valor) + "&";
					}
				}else{

					// ====================================
					// OUTROS TEXT AREA
					// ====================================
					if (tag == "TEXTAREA" || tipo != 'UNDEFINED') //(outros tipos, como TEXT, HIDDEN)					
						Variaveis += $(this).attr('name') + "=" + escape(valor) + "&";
				}
			}

        }
		
	});


	// ====================================
	// ENVIA DADOS POR AJAX
	// ====================================

	// Executa Callback
	if (WXfa_enviando)
		WXfa_enviando();	

	$.ajax({
		type: method,
		url: action,
		data: Variaveis,
		success: WXfa_sucesso,
		error: WXfa_erro
	});


	// Sempre deve retornar falso
	return false;

	// ====================================
	// CALLBACK -> ERRO
	// ====================================
	function WXfa_erro(XMLHttpRequest, textStatus, errorThrown){

		// Executa Callback
		if (WXfa_recebido)
			WXfa_recebido(false, null);

		// Gerenciador de ERRO

		if (XMLHttpRequest.status == 404)
			throw "ERRO DE CONEXÃO COM O SERVIDOR AJAX: Página \"" + action + "\" não encontrada";
		else
			throw "ERRO DE CONEXÃO COM O SERVIDOR AJAX: " + XMLHttpRequest.status;

	}
}

// ===================================================
// CALLBACK -> SUCESSO
// ===================================================
function WXfa_sucesso(dados, status){

	var x_erro = false;


	// Executa Callback
	if (WXfa_recebido)
		WXfa_recebido(true, dados);

	// -----------------------------------
	// Obtem dados do servidor
	// -----------------------------------
		var xml = new Parsing(dados);
		
		// ----------------------------------
		// ERRO GERAL
		// ----------------------------------				

		elemento = new XmlDoc(xml.GetNodo("errogeral")[0]);		
			
		if (elemento.GetAttr("erro")){
			alert(elemento.GetAttr("erro_desc"));		
			var x_erro = true;
		}			
		
		// ----------------------------------
		// ERRO DE CAMPO
		// ----------------------------------		
		elementos = xml.GetNodo("campo");

		for (var i = 0; i < elementos.length; i++){
			elemento = new XmlDoc(elementos[i]);

			// Obtém dados do campo
			campoName = elemento.GetAttr("id");
			erro = elemento.GetAttr("erro");
			erroDesc = elemento.GetAttr("msg");

			campo = $("[name='" + campoName + "']");

			if (erro)
				x_erro = true;

			// -----------------------------------
			// Imprimir MSGBOX
			// -----------------------------------
			if (campo.attr('msgbox')){

				var msgBox = $('#'+campo.attr('msgbox')).find("[dono=formajax]");

				msgBox.each(function(){
					$(this).remove();
				});

				if (erro)
					$('#'+campo.attr('msgbox')).append('<p dono="formajax">' + erroDesc + '</p>');

			}
			// -----------------------------------
			// Aplica Classe (VERIFICA SE TEM ELEMENTO COMO FILHO)
			// -----------------------------------
			if (campo.attr('classdiv') && campo.attr('classinvalido') && campo.attr('classvalido')){

				var classDiv = ('#'+campo.attr('classdiv'));
				var classValido = campo.attr('classvalido');
				var classInvalido = campo.attr('classinvalido');

				// Verifica se tem alguma mensagem de erro e aplica a classe caso positivo
				numErro = $('#'+campo.attr('msgbox')+' > *').size();

				try{
					if (numErro > 0){
						document.getElementById(campo.attr('classdiv')).className = classInvalido;
					}else{
						document.getElementById(campo.attr('classdiv')).className = classValido;
					}
				} catch(e){
					alert("classdiv '" + campo.attr('classdiv') + "' não encontrado \nDEBUG: " + e.message );
				}
			}
		}

		// Executa Callback
		if (WXfa_sucessoCallback){
			WXfa_sucessoCallback(!x_erro, dados);	// Sucesso de recebimento, mas erro do formulario
		}else{
			// Caso não encontre nenhum erro, Redireciona para uma determinada Página
			if (x_erro == false && WXfa_redir != null)
				window.location = WXfa_redir;
		}

}