 /*********************************
  * base.ajax.js                  *    
  *                               *
  * funções e ações que usam ajax *
  *********************************/


/**
 * Faz o submit assincrono
 * 
 * a função aguarda um array json no seguinte formato:
 * array{'error':boolean, 'errorType': int, 'arrMessages': array}
 *
 * @param string controllerAction
 * @param mixed data
 * @return mixed
 */
function submitAjax(controllerAction, data){
    var retorno = false;
    data = ( !data )?$(':input:visible').serialize():data;
    data = ( !isset(data.jquery) )? data : data.serialize();
    ajaxLoading(i18n.loading);
    $.ajax({
        type: "POST",
        url: baseUrl+'/'+controllerAction,
        data: data,
        dataType: 'json',
        async: false,
        cache:false,
        success: function(retornoSuccess,textStatus, XMLHttpRequest){
            retorno = retornoSuccess;
            //verificar tipo de resposta (erro ou sucesso)
            //erro e validação necessita encontrar um id e exibir um tooltip (verificar se o campo pertence a uma aba)
            //alert(retornoSuccess);
            if(retornoSuccess.error){
                switch(retornoSuccess.errorType){
                    case 1:
                        showPhpValidation(retornoSuccess);
                        break;
                    case 2:
                        showPhpDbError(retornoSuccess);
                        break;
                }
            }else{
                showPhpSuccess(retornoSuccess);
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrow){
            retorno = false;
//            if( XMLHttpRequest.status == 200 ){
//                eval( "var retornoSuccess = "+XMLHttpRequest.responseText);
//                retorno = retornoSuccess;
//                if(retornoSuccess.error){
//                    switch(retornoSuccess.errorType){
//                        case 1:
//                            showPhpValidation(retornoSuccess);
//                            break;
//                        case 2:
//                            showPhpDbError(retornoSuccess);
//                            break;
//                    }
//                }else{
//                    showPhpSuccess(retornoSuccess);
//                }
//            }
            showDialog(errorThrow,'alert');
        }
    });
    ajaxLoaded();
    return retorno;
}

/**
 * coloca na tela uma mensagem enquanto carrega o AJAX...
 *
 * @param string msg
 * @return void
 */
function ajaxLoading( msg ){
    removeToolTip();
    msg = (!isset(msg))?i18n.loading:msg;
    //Remove caixas de dialog do sistema
    $("#sispromDialogMsg").remove();
    $('#sispromCarregandoDialog').remove();
    
    var strHtml = '<div id="sispromCarregandoDialog" class="sisprom_carregando" title="'+msg+'" style=\"display: none;\"></div>';
    $('body').prepend(strHtml);
    
    $("#sispromCarregandoDialog").dialog({
        dragStart: function(event, ui) {removeToolTip();$(this).css('visibility','hidden');},
        dragStop: function(event, ui) {removeToolTip();$(this).css('visibility','visible');},
//        draggable: false,
        closeOnEscape: false,
        minHeight: 60,
        minWidth: 150,
        modal: true,
        resizable: false,
        shadow: true
    });
    $('#ui-dialog-title-sispromCarregandoDialog').next().remove();
}

/**
 * depois que o AJAX carregou...
 *
 * @return void
 */
function ajaxLoaded(){
    setTimeout(function(){$('#sispromCarregandoDialog').dialog('close');},100);;
}

/**
 * Função padrão para verificar a permissão em uma controller e uma action
 *
 * @param string controller
 * @param string action
 * @return boolean
 */
function checkPermFromAuth(controller,action){
    var controllerCheck = (controller)?controller:false;
    var actionCheck     = (action)?action:false;
    if( !controllerCheck || !actionCheck ){return false;}
    var retorno = false;
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/check-perm-from-auth',
        data: {'controller':controllerCheck,'action':actionCheck},
        dataType: 'json',
        async: false,
        success: function(retornoSuccess){
            retorno = retornoSuccess;
        },
        error: function(retornoError){
            retorno = retornoError;
        }
    });
    return retorno;
}

/**
 * Função padrão para verificar se o usuario continua logado no sistema
 *
 * @return boolean
 */
function checkLogged(){
    var retorno = false;
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/check-logged',
        dataType: 'json',
        async: false,
        success: function(retornoSuccess){
            retorno = retornoSuccess;
        },
        error: function(retornoError){
            retorno = retornoError;
        }
    });
    return retorno;
}

/**
 * Função padrão para pegar algum dado do usuario da sessão
 *
 * @param string indice
 * @return boolean
 */
function getDataUserFromAuth(indice){
    var retorno = false;
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/get-data-user-from-auth',
        data: {'indice':indice},
        dataType: 'json',
        async: false,
        success: function(retornoSuccess){
            retorno = retornoSuccess;
        },
        error: function(retornoError){
            retorno = retornoError;
        }
    });
    return retorno;
}

/**
 * Função que faz a requisição AJAX para montar os campos de cidade pela a uf
 * 
 * @param string municipio
 * @return void 
 */
$.fn.getMunicipioByUf = function(municipio){
    var objMunicipio = $(municipio);
    var txUf = $(this).find(':selected').text();
    var cdUf = $(this).val();

    if( !objMunicipio.length ) { 
        showDialog( 'Erro ao mostrar as cidades da UF <b>'+txUf+'</b><br />Combo de cidade não existe.' ,'alert' );
        return false; 
    }
    objMunicipio.empty();
    if( !cdUf ){
        objMunicipio.html('<option value="">Selecione</option>'); 
        return false; 
    }
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/get-municipio-by-uf',
        data: {'uf':cdUf},
        async: false,
        dataType: 'json',
        success: function(retornoSuccess){
            if( $.isArray(retornoSuccess) ){
                if( retornoSuccess.length > 0 ){
                    var opt = '<option value="">Selecione</option>';
                    for( var i in retornoSuccess ){
                        opt += '<option value="'+retornoSuccess[i].CD_MUNICIPIO+'">'+retornoSuccess[i].TX_MUNICIPIO+'</option>';
                    }
                    objMunicipio.html(opt);
                    setFocusTimeout(objMunicipio);
                    return;
                }
            } 
            showDialog( 'Erro ao mostrar as cidades da UF <b>'+txUf+'</b><br /> Uf sem cidades cadastradas.','alert' );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            showDialog( 'Erro ao mostrar as cidades da UF <b>'+txUf+'</b><br /> Ajax Failure.','alert' );
        }
    });
};

function accessReactivation(cdProcuracaoAcesso,cdEntidade,cdUsuario,cdModulo,stProprietario){
    var inputsHiddens = {
            'cdProcuracaoAcesso' : cdProcuracaoAcesso,
            'cdEntidade'         : cdEntidade,
            'cdUsuario'          : cdUsuario,
            'cdModulo'           : cdModulo
    };
    var strInputsHiddens = '';
    for( var i in inputsHiddens ){
        strInputsHiddens += '<input type="hidden" id="'+i+'" name="'+i+'" value="'+inputsHiddens[i]+'" />';
    }
    $('#gridProguracaoAcessoContainerInputsHiddens').html(strInputsHiddens);
    
    var idDialog = 'reativarAcessoDialog';
    loadDialog({ 
        id       : idDialog,
        title    : 'Reativação de Permissão de Acesso',
        url      : baseUrl + '/procuracao/solicitar-reativacao',
        width    : 850,
        buttons  : {
            'Reativar Acesso' : function(){
                var inputsDialog = $(':input').not(':disabled');
                if(formValidate(inputsDialog)){
                    submitAjax('procuracao/salvar-reativa-acesso',inputsDialog);
                    closeDialog( idDialog );
                }
            }
        }
    });
    
    $('.ui-dialog-buttonpane button').attr('disabled',!$('#termo_compromisso').isChecked());
    $('#termo_compromisso').click(function(){
        $('.ui-dialog-buttonpane button').attr('disabled',!$(this).isChecked());
    });
    setFocusTimeout($('#termo_compromisso'));
    groupVisibilityManager('.hasProcuracao',{},function(){
        if( $('#ST_PROPRIETARIO-N').isChecked() ){
            $('#DT_VALIDADE').removeAttr('disabled').prev().addClass('required');
        } else {
            $('#DT_VALIDADE').attr('disabled','disabled').prev().removeClass('required');
        }
    });
//    $('#ST_PROPRIETARIO-N').click(function(){
//        if( $(this).isChecked() ){
//            $('#DT_VALIDADE').removeAttr('disabled').prev().addClass('required');
//        } else {
//            $('#DT_VALIDADE').attr('disabled','disabled').prev().removeClass('required');
//        }
//    });
    if( stProprietario == 'S' ){
        $('#ST_PROPRIETARIO-N').removeAttr('checked');
        $('#ST_PROPRIETARIO-S').attr('checked','checked');
        $('#DT_VALIDADE').attr('disabled','disabled').prev().removeClass('required');
    }
    if( $('#ST_PROPRIETARIO-N').isChecked() ){
        $('#ST_PROPRIETARIO-N').attr('checked','checked');
        $('#DT_VALIDADE').removeAttr('disabled').prev().addClass('required');
    } else {
        $('#ST_PROPRIETARIO-N').removeAttr('checked');
        $('#DT_VALIDADE').attr('disabled','disabled').prev().removeClass('required');
    }
}
function procurationReactivation(cdProcuracao,cdEntidadeRepresentada,cdEntidadeRepresentante,cdModulo){

    var inputsHiddens = {
            'cdProcuracao'            : cdProcuracao,
            'cdEntidadeRepresentada'  : cdEntidadeRepresentada,
            'cdEntidadeRepresentante' : cdEntidadeRepresentante,
            'cdModulo'                : cdModulo
    };
    var strInputsHiddens = '';
    for( var i in inputsHiddens ){
        strInputsHiddens += '<input type="hidden" id="'+i+'" name="'+i+'" value="'+inputsHiddens[i]+'" />';
    }
    $('#gridProguracaoRepresentadaContainerInputsHiddens').html(strInputsHiddens);
    
    var idDialog = 'reativarProcuracaoDialog';
    loadDialog({ 
        id       : idDialog,
        title    : 'Reativação de Procuração de Fonte Pagadora Secundária',
        url      : baseUrl + '/procuracao/solicitar-reativacao',
        width    : 850,
        data     : {'procuracaoRepresentada':true},
        buttons  : {
            'Reativar Procuração' : function(){
                var inputsDialog = $(':input').not(':disabled');
                if(formValidate(inputsDialog)){
                    submitAjax('procuracao/salvar-reativa-procuracao',inputsDialog);
                    closeDialog( idDialog );
                }
            }
        }
    });
}

function showResumesRegistry(cdRegistro,cdSituacao,telaInicial,txPerfil,txNumeroRegistro){
    ajaxLoading();
    var idDialog = 'resumoRegistroDialog';
    // config dos Botões da Dialog...
    var SituacaoRegistro = {
        'CANCELADO'               : 1,
        'EFETIVADO'               : 2,
        'PENDENTE_ANALISE'        : 3,
        'ANALISADO_SEM_APROVACAO' : 4,
        'ANALISADO_COM_APROVACAO' : 27,
        'DEVOLVIDO'               : 5
    };
    var dataPost = {'cdRegistro':cdRegistro};
    var buttonsConfigDefault = {
        'Cancelar':function(){
            var idDialog = 'anularRegistroDialog';
            loadDialog({ 
                id       : idDialog,
                title    : 'Cancelar Registro?',
                url      : baseUrl + '/registro/solicitar-anulacao',
                width    : 510,
                buttons  : {
                    'Cancelar Registro' : function(){
                        var inputDialog = $('#'+idDialog+' #TX_JUSTIFICATIVA');
                        if(formValidate(inputDialog)){
                            dataPost = $.extend({'txJustificativa':inputDialog.val()},dataPost);
                            submitAjax('registro/anular',dataPost);
                            closeDialog( idDialog );
                        }
                    }
                }
            });
        },
        'Imprimir':function(){
            gerarRelatorio(mountHiddenForm('formRelatorio','',dataPost),baseUrl+'/relatorio/detalhamento');
        },
        'Editar':function(){
            redirect('registro/editar',dataPost,'post');
        },
        'Analisar':function(){
            redirect('registro/analisar',dataPost,'post');
        },
        'Efetivar':function(){
            redirect('registro/analisar',dataPost,'post');
        }
    };
    var buttonsConfigControl = {
        'Cancelar' : false,
        'Imprimir' : false,
        'Editar'   : false,
        'Analisar' : false,
        'Efetivar' : false
    };
    switch (txPerfil) {
        case 'Usuario Externo':
            if( cdSituacao == SituacaoRegistro.DEVOLVIDO ){
                buttonsConfigControl.Editar = true;
                buttonsConfigControl.Cancelar = true;
            }
            if( !telaInicial ){
                buttonsConfigControl.Imprimir = true;
                if( cdSituacao == SituacaoRegistro.EFETIVADO ){
                    buttonsConfigControl.Editar = true;
                    buttonsConfigControl.Cancelar = true;
                }
            }
            break;
        case 'Coordenador':
            if( cdSituacao == SituacaoRegistro.PENDENTE_ANALISE ){
                buttonsConfigControl.Analisar  = true;
            }
            if( cdSituacao == SituacaoRegistro.ANALISADO_SEM_APROVACAO || cdSituacao == SituacaoRegistro.ANALISADO_COM_APROVACAO){
                buttonsConfigControl.Efetivar = true;
            }
            if( !telaInicial ){
                buttonsConfigControl.Imprimir = true;
            }
            break;
        case 'Analista':
            if( cdSituacao == SituacaoRegistro.PENDENTE_ANALISE ){
                buttonsConfigControl.Analisar  = true;
            }
            if( !telaInicial ){
                buttonsConfigControl.Imprimir = true;
            }
            break;
        default:
            showDialog( 'Erro ao carregar o resumo do registro. Perfil não identificado' ,'alert' );
            return false;
            break;
    }
    var buttonsConfig = {};
    for( var i in buttonsConfigDefault ){
        if(buttonsConfigControl[i] !== false){
            buttonsConfig[i] = buttonsConfigDefault[i];
        }
    }
    // Dialog...
    loadDialog({ 
        id       : idDialog,
        title    : 'Resumo do Registro - ' + txNumeroRegistro,
        url      : baseUrl + '/registro/resumo',
        width    : 724,
        data     : {
            'cdRegistro' : cdRegistro,
            'cdSituacao' : cdSituacao
        },
        buttons  : buttonsConfig
    });
}

function findUserByCPF( objUser , indexFields , setFieldsReadonly , setFieldsDisabled){
    if( !isset(objUser.tx_cpf) && !isset(objUser.come_from_reactivate_access)  ) { 
        showDialog( 'Erro ao carregar os dados do usuário' ,'alert' );
        return false; 
    }
    var retorno = false;
    setFieldsReadonly = (!setFieldsReadonly)?false:true;
    setFieldsDisabled = (!setFieldsDisabled)?false:true;
    var tx_cpf = objUser.tx_cpf;
    var come_from_reactivate_access = objUser.come_from_reactivate_access;
    if( !isCPF(tx_cpf) ){return false;}
    ajaxLoading();
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/find-user-by-cpf',
        data: {'TX_CPF':tx_cpf,'COME_FROM_REACTIVATE_ACCESS':come_from_reactivate_access},
        async: false,
        dataType: 'json',
        success: function(ret){
            if(ret.error){
                showPhpDbError(ret);
                basePopulate(false,indexFields);
                retorno = false;
            }else{
                basePopulate(ret,indexFields,setFieldsReadonly,setFieldsDisabled);
                retorno = ret;
            }
        }
    });
    ajaxLoaded();
    return retorno;
}

/**
 * Função que verifica se um CPF/CNPJ estão cadastrados no banco de dados e se
 * tiver retorna os dados para serem populados nos campos do formulario.
 * @param objEntidade
 * @param indexFields
 * @param bool setFieldsReadonly
 * @param bool setFieldsDisabled
 * @param bool ignoreEntidadeImpedida
 * @param bool msgEntidadeCadastrada
 */
function findEntidade( objEntidade, indexFields, setFieldsReadonly, setFieldsDisabled){
    if( !objEntidade.length ) {
        showDialog( 'Erro ao carregar os dados da entidade:<br />Campo da entidade não existe.' ,'alert' );
        return false; 
    }
    var retorno = false;
    setFieldsReadonly = (!setFieldsReadonly)?false:true;
    setFieldsDisabled = (!setFieldsDisabled)?false:true;

    var cpf_cnpj = objEntidade.getValUnmasked();
    if( isCPF(cpf_cnpj) ){
        var dataPost = {'TX_CPF':cpf_cnpj};
    } else if( isCNPJ(cpf_cnpj) ){
        var dataPost = {'TX_CNPJ':cpf_cnpj};
    } else {
        return false;
    }
    
    ajaxLoading();
    $.ajax({
        type: "POST",
        url: baseUrl + '/generic/find-entidade',
        data: dataPost,
        async: false,
        dataType: 'json',
        success: function(ret){
            if(ret.error){
                showPhpDbError(ret);
                basePopulate(false,indexFields);
                retorno = false;
            }else{
                basePopulate(ret,indexFields,setFieldsReadonly,setFieldsDisabled);
                retorno = ret;
            }
        }
    });
    ajaxLoaded();
    return retorno;
}

/**
 * Cria um Dialog.
 * Quando TOP e LEFT não forem especificados o Dialog será centralizado.
 * 
 * @param string             params.id
 * @param string             params.containerId
 * @param string             params.url 
 * @param object             params.data 
 * @param object             params.xhtml
 * @param string             params.title
 * @param integer            params.width
 * @param integer            params.height
 * @param object             params.buttons
 * @param boolean            params.closeOnEscape
 * @param function | string  params.actionButton 
 *  
 * @return void | boolean false;
 *
 * @exemplo loadDialog({ 
 *              id       : 'testeDialog', // obrigatorio
 *              title    : 'TESTE DE DIALOG', // opcional
 *              
 *              buttons  : {
 *                  label1 : function(){alert('vc clicou e não vai fechar')},
 *                  label2 : function() {alert('vc clicou e vai fechar');closeDialog('id'));}
 *              } // opcional
 *              
 *              xhtml : '<div>qualquer xhtml</div>',// SEM AJAX
 *              // ou esses //
 *              url      : systemName + '/gerenciamento-teste-caso-uso-analise/upload-file/pGet/vGet', // retorno da requisição AJAX
 *              data     : {'pPost1':'vPost1','pPost2':'vPost2'}, // opcional
 *          });
 *
 */
function loadDialog( params ){
    ajaxLoaded();
    var html = false;
    if( typeof(params)=='object' ){
        // ID é obrigatório
        if( !isset(params.id) ){return false;}
        // se vier um XHTML 
        if( isset(params.xhtml) ){
            var html = params.xhtml;
        // se vier uma URL com ou sem DATA 
        } else if( isset(params.url) ){
        
            ajaxLoading();
            var html = $.ajax({ 
                                url      : params.url,
                                data     : params.data,
                                type     : 'POST',
                                dataType : 'html',
                                async    : false
                             }).responseText;
            ajaxLoaded();
            
            var charIni = '{';
            var charEnd = '}';
            if( html.indexOf(charIni) == 0 && html.indexOf(charEnd) == html.length-1 ){
                eval( "html = "+html+";" );
                if( typeof(html)=='object' ){
                    if(html.error){
                        switch(html.errorType){
                            case 1:
                                showPhpValidation(html);
                                break;
                            case 2:
                                showPhpDbError(html);
                        }
                    }else{
                        showPhpSuccess(html);
                    }
                    return false;
                }
            }
        }
    
    } else {
        return false;
    }

    // definindo o id com ID
    var id            =  params.id;
    // definindo o contentor com o CONTAINERID
    var containerId   = (params.containerId   != undefined) ? params.containerId   : false;
    // definindo o titulo com o TITLE
    var title         = (params.title         != undefined) ? params.title         : '';
    // definindo a largura com o WIDTH
    var width         = (params.width         != undefined) ? params.width         : 600;
    // definindo a altura com o LENGHT
    var height        = (params.height        != undefined) ? params.height        : 'auto';
    // definindo a se fecha ao precionar o ESC com o CLOSEONESCAPE
    var closeOnEscape = (params.closeOnEscape != undefined) ? params.closeOnEscape : true;
    // definindo os botões com o BUTTONS
    if(params.buttons != undefined){
        var buttons = params.buttons;
    } else {
        var buttons = {
            Ok : function() {
                closeDialog(id);
                //$("#"+id).remove();
                if(params.actionButton != undefined){
                    if($.isFunction(params.actionButton)){
                        setTimeout(params.actionButton, 100);
                    }else{
                        setTimeout('eval('+ params.actionButton +');', 100);
                    }
                } 
            }
        };
    }

    $("#"+id).remove();
    
    if( !html ){return false;}
    
    var strHtml  = '<div id="'+ id +'" title="'+ title +'" style="display:none;">';
        strHtml += html;
        strHtml += '</div>';
    
    var container = (containerId) ? 'body #'+ containerId : 'body';

    $(container).append(strHtml);
    
    $("#"+id).dialog({
        dragStart: function(event, ui) {removeToolTip();$(this).css('visibility','hidden');},
        dragStop: function(event, ui) {removeToolTip();$(this).css('visibility','visible');},
        bgiframe      : true,
        shadow        : true,
        modal         : true,
        width         : width,
        height        : height,
        closeOnEscape : closeOnEscape,
        buttons       : buttons

    });
    
    setupInputs($("#"+id));
    setButtonsHovers($("#"+id));
    $(".ui-icon-closethick").bind('click',function(){closeDialog( id );});
}
function closeDialog( idDialog ){
    removeToolTip();
    //  ação de fechar padrao do Dialog  //
    beforeCloseDialog();                 //            
    $('#'+idDialog).dialog('close');     //
    while( $('#'+idDialog).length == 1){ //
        $('#'+idDialog).remove();        //
    }                                    //
    afterCloseDialog();                  //
    ///////////////////////////////////////
}
function beforeCloseDialog(){return true;}
function  afterCloseDialog(){return true;}