/**
 * Namespace para agregação das funcionalidades genéricas (de extensão do javascript)
 */
registarNameSpace("Mn.Base.Form");

/**
 * Efectua a submissão de um formulário para um determinado URL
 *
 * @author MNDeployer
 * @version 1.0
 * @since 0.01
 *
 * @param {String} formulario Objecto do tipo <form> a submeter
 * @param {String} url Url para submissão do formulário
 * @param {Function} callback_prepara_submissao
 * @param {Function} callback_resultado Função definida para processar o sucesso da submissão de formulário
 * @param {Function} callback_erro Função definida para processar o insucesso da submissão de formulário, com eventual exibição de erros ao utilizador.
 */
Mn.Base.Form.submeteFormulario = function (formulario, url, callback_prepara_submissao, callback_resultado, callback_erro) {
    //processa o pedido ajax
    $.ajax({
        url: Mn.Base.Nav.getBaseUrl() + Mn.Base.getIdioma() + '/' + url,
        type: 'POST',
        dataType: 'xml',
        data: formulario.serialize(),
        timeout: 15000,
        beforeSend: function(data){
            if($.isFunction(callback_prepara_submissao)){
                callback_prepara_submissao(formulario);
            }
            //coloca um overlay sobre o elemento a carregar
            $(formulario).mask('');
        },
        complete: function(){
            //elimina o overlay do elemento
            $(formulario).unmask();
        },
        success: function(data) {          
            //Analisa a resposta html para verificar como deve proceder
            $(data).find("RespostaWebsite").each(function(){
                $(this).find("RespostaFormulario").each(function(){
                    var sucesso = $(this).find("Sucesso").text();
                    var titulo = $(this).find("Titulo").text();
                    var mensagem = $(this).find("Mensagem").text();

                    //processamento do resultado da submissão do formulário
                    if($.isFunction(callback_resultado)){
                        //invoca função para processamento do resultado
                        callback_resultado(formulario, sucesso, titulo, mensagem);
                    }
                    else{
                        console.warn("Mn.Base.Form.submeteFormulario() - callback de resultado não definido");
                    }

                    //se o formulario possuir erros
                    if(sucesso == 0){
                        //invoca função para indicação de sucesso
                        if($.isFunction(callback_erro)){
                            //invoca função para processamento de erros
                            var erros = $(this).find("Erros");
                            Mn.Base.Form.processaErros(erros, formulario, callback_erro);
                        }
                        else{
                            console.warn("Mn.Base.Form.submeteFormulario() - callback insucesso não definido");
                        }
                    }
                    else{
                        //efectua reset ao formulário
                        $(formulario)[0].reset();
                    }

                });
            });

        },
        error: function(){
        }
    });
}

/**
 * Recebe um xml contendo os erros e invoca o respectivo callback com os parametros
 * Campo e Descrição extraidos.
 *
 * @author MNDeployer
 * @version 1.0
 * @since 0.01
 */
Mn.Base.Form.processaErros = function(xmlErros, formulario, callback_erro){
    $(xmlErros).find("Erro").each(function(){
        var tipo_erro = $(this).attr("Tipo");
        //para erros compostos o nome do campo tem os vários campos separados por vírgulas
        var nome_campo = $(this).find("Campos").text();
        var descricao = $(this).find("Descricao").text();
        if($.isFunction(callback_erro)){
            callback_erro(formulario, tipo_erro, nome_campo, descricao);
        }
    });
}
