/**
 * Funções de auxílio ao grid
 *
 */

/**
 * callLink
 *
 * Envia o link via XMLHttp
 *
 * @author Henrique de Castro
 * @since  11/2008
 * @param  object   Link
 * @param  string   Div de retorno (opcional)
 * @param  string   Elemento a ser bloqueado (opcional)
 * @return boolean
 */
function callLink(obj, ret, elemBlock){

    //Executa o call
    return call({'type' : 'GET', 'url' : obj.href, 'ret' : ret, 'elemBlock' : elemBlock});

}

/**
 * callForm
 *
 * Envia o formulário via XMLHttp
 *
 * @author Henrique de Castro
 * @since  11/2008
 * @param  object   Formulário
 * @param  string   Div de retorno (opcional)
 * @param  string   Elemento a ser bloqueado (opcional)
 * @return boolean
 */
function callForm(obj, ret, elemBlock){

    //Busca os campos do formulário
    params  = $(obj).serialize();

    //Executa o call
    return call({'type' : obj.method, 'url' : obj.action, 'ret' : ret, 'elemBlock' : elemBlock, 'data' : params});

}

/**
 * call
 *
 * Faz a chamada via XMLHttp (usada para abstrair as funções do jquery)
 *
 * @author Henrique de Castro
 * @since  11/2008
 * @param  array   Parâmetros
 * @return boolean
 */
function call(params){

    //Seta o tipo padrão para POST
    params["type"] = params["type"] ? params["type"] : "POST";

    //O tipo de retorno será sempre JSON
    params["dataType"] = "json";

    //Busca o elemento de retorno
    params["ret"] = (params["ret"] ? params["ret"] : "#conteudo_principal");

    //Busca o elemento a ser bloqueado
    params["elemBlock"] = (params["elemBlock"] ? params["elemBlock"] : "#tudo");

    //Verifica se existe o parâmetro success
    if(!params["success"]) {

        //Exibe o HTML de retorno no local definido
        params["success"] =
            function(retorno){
                //Verifica se existe HTML de retorno
                if(retorno.html)
                    //Exibe o HTML de retorno
                    $(params["ret"]).empty().html(retorno.html);
            }

    }

    //Executa a chamada
    $.ajax(params);

    //Verifica a necessidade de exibir um preload
    if(!params["noPreload"]) {

        //Bloqueia o elemento passado
        $(params["elemBlock"]).block({

            message: "Carregando...",
            css: {
                border: '3px solid #000',
                width: '200px',
                height: '25px',
                color: '#000'
            }

        });

        //Em caso de sucesso, remove o bloqueio
        $(params["elemBlock"]).ajaxSuccess(
            function(){

                //Desbloqueia e remove as propriedades 'ajax' do elemento
                $(this).unblock();
                $(this).unbind();
            }
        );
    }

    //Não permite o envio, pois este é feito pelo XMLHttp
    return false;
}

/**
 * excluiRegistro
 *
 * Exclui um registro
 *
 * @author Luana Castilho
 * @since  12/2009
 * @param  object
 * @param  string
 * @param  string
 * @return boolean
 */
function excluiRegistro(obj, msg_confirm, class_grid){

    //Confirma a exclusão
    if(!confirm(msg_confirm))
        return false;
    else{

        //Função de retorno
        var success =  function(retorno) {

                        //Monta o html com a mensagem
                        var html = "<span class=\""+retorno.tipo+"\" id=\"mensagem_excluir\">"+retorno.mensagem+"</span>";

                        //Verifica se houve sucesso
                        if(retorno.tipo == 'acerto')
                            //Remove a linha do registro excluido
                            $(obj).parent().parent().remove();

                        //Remove a mensagem (caso essa exista)
                        $("#mensagem_excluir").remove();

                        //Exibe a mensagem
                        $("."+class_grid).before(html);

                    };

        //Executa o call
        call({'url' : $(obj).attr("href"), 'success' : success});
    }

    //Retorna false
    return false;

}

// ---------------- Fim das funções de auxílio ao grid -----------------------------

/**
* submitForm
*
* Envia um formulário
*
* @author Henrique de Castro
* @since 12/2008
* @param object
* @return boolean
*/
function submitForm(objForm){

    //Desabilita o botão salvar e o cancelar
    $('#salvar').val('Aguarde...');
    $('#salvar').attr('disabled', true);
    $('#cancelar').val('Aguarde...');
    $('#cancelar').attr('disabled', true);

    //Envia o formulário
    objForm.submit();
    return true;
}

/**
 * callDetail
 *
 * Chama a área de detalhe
 *
 * @author Henrique de Castro
 * @since  01/2010
 * @param  object     Link clicado
 * @return boolean
 */
function callDetail(obj){

    //Retira o destaque das outras linhas
    $('.destaque').removeClass('destaque');

    //Destaca o item atual
    $(obj).parent().parent().addClass('destaque');

    //Exibe a div
    $("#detail").show();

    //Executa o call
    return call({'type' : 'GET', 'url' : obj.href, 'ret' : '#detail'});
}

/**
 * closeDetail
 *
 * Limpa a div detail
 *
 * @author Henrique de Castro
 * @since  01/2010
 */
function closeDetail(){

    //Limpa a div
    $('#detail').empty();

    //Retira o destaque das linhas
    $('.destaque').removeClass('destaque');

}

/**
 * setCheckbox
 *
 * Ao selecionar um checkbox, executa a chamada na url passada
 *
 * @author Henrique de Castro
 * @since  01/2010
 * @param  string
 * @param  string
 * @return void
 */
function setCheckbox(url){

    //Executa o call
    call({'type' : 'GET', 'url' : url, 'noPreload' : true});

}

/**
 * bloqueiaTela
 *
 * Bloqueia a tela
 *
 * @author Henrique de Castro
 * @since  01/2009
 * @param  string
 * @return void
 */
function bloqueiaTela(url_logoff) {

    //Oculta a mensagem de erro
    $("#erro_senha").hide();

    //Bloqueia a tela
    $.blockUI({
        message : $("#dialog_bloqueio"),
        baseZ   : 99999
    });

    //Limpa a senha e desloga o usuário
    $("#senha").val("");
    call({'type': 'GET', 'url' : url_logoff, 'noPreload' : true});

}

/**
 * desbloqueiaTela
 *
 * Executa a função de desbloqueio da tela
 *
 * @author Henrique de Castro
 * @since  01/2009
 * @param  object
 * @return boolean
 */
function desbloqueiaTela(objForm){

    //Valida se existe a senha foi digitada
    if($.trim($("#senha").val()) == "")
        return false;

    //Monta os dados
    var params = { 'senha' : $("#senha").val(), 'login' : $("#login").val() };

    //Monta a função de retorno
    var success =  function(sucesso) {
                        if(sucesso.status)
                            $.unblockUI();
                        else
                            $("#erro_senha").show();
                    };

    //Executa o call
    call({'url' : objForm.action, 'elemBlock' : '#dialog_bloqueio', 'data' : params, 'success' : success });

    //Não permite o envio, pois este já foi feito pelo call
    return false;
}

/**
 * preencheSEO
 *
 * Preenche automáticamente o campo de SEO da página
 * de acordo com seu nome
 *
 * @author Rafael Silverio Matos
 * @since  02/2010
 * @param  object   objeto do input do nome
 * @param  string   elemento do input que representa o SEO
 * @param  string   caminho para a ação que traduz o texto do nome
 * @return void
 */
function preencheSEO(obj, elemento, url){

    //Variaveis da função
    var valorNome;
    var sucesso;
    var parametros;

    //Desabilita o campo e escreve carregando
    $(elemento).attr('disabled','disabled');
    $(elemento).val('Preenchendo...');

    //Recebe o valor do campo
    valorNome = $(obj).val();

    //Monta o parametro
    parametros = {'nome' : valorNome};

    //Define a função de retorno do ajax
    sucesso = function(retorno) {

                        //Insere o valor no campo
                        $(elemento).val(retorno.nomeLink);

                        //Remove o disabled
                        $(elemento).removeAttr('disabled');
                    };

    //Executa o call
    call({'url' : url, 'data' : parametros, 'success' : sucesso, 'noPreload' : true});

    //Inabilita links
    return false;
}

/**
 * inicializaEditor
 *
 * Cria uma instância do editor no elemento
 * enviado como parâmetro, com configurações
 * definifdas
 *
 * @author  Rafael Silvério Matos
 * @since   02/2010
 * @param   string||object  objeto ou seletor do elemento que recebe o editor
 * @param   string          url de base do sistema
 * @param   string          função a ser utilizado pelo handle_event_callback
 * @return  void
 **/
function inicializaEditor(elemento, site_url, callback){

    //Define os parametros para o editor
    var parametros = {

        //Seleciona o tema avançado
        theme : "advanced",

		//largura do editor
		width: '745px',

		//altura do editor
		height: '600px',

        //Adiciona plugins
        plugins : "table,advimageextendido,media",

		//inicia as funções externas em modal
   		//dialog_type : "modal",

        //Define a linguagem como português
        language : "pt",

		theme_advanced_disable : "styleselect,fontsizeselect,fontselect",

        //Determina a posição da barra de ferramentas
        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align    : "left",


        //Determina os botões da barra de ferramentas
    	theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,cut,copy,paste,pastetext,pasteword,|,undo,redo,|,styleselect,formatselect,fontsizeselect,fontselect,tablecontrols",
    	theme_advanced_buttons2 : "justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,outdent,indent,blockquote,|,link,unlink,anchor,|,forecolor,backcolor,|,charmap,|,cleanup,code,charmap,image,media,insertimage",
    	theme_advanced_buttons3 : "",


    	//Determina os formatos de html da ferramenta de blocos
    	theme_advanced_blockformats : "p,address,pre,h1,h2,h3,div,blockquote,cite",

    	//Determina as fontes utilizadas e os tamanhos possíveis
    	theme_advanced_fonts       : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",
    	theme_advanced_font_sizes  : "1,2,3,4,5,6,7",


        //Define que o editor pode ser chamado para todos tipos de elementos, pelo name
        mode : "exact",

        //Define que as urls retornadas pelo file manager deve ser absolutas
        relative_urls : false,

        //Define a url base para utilizar como url relativa
        document_base_url : site_url,

        //Define o elemento que recebe o editor
        elements : $(elemento).attr('id')
    };

    //Caso seja enviado função de callback, seta o parametro a mais
    if(callback)
        parametros.handle_event_callback = callback;

    //Adiciona o site_url (se necessário)
    if(site_url) {
        parametros["external_image_list_url"]  = site_url+"imagens_tinymce/listar/ajax_in_use:true";
        parametros["site_url"]                 = site_url;
    }

    //Inicia o editor tinyMCE no elemeto
    tinyMCE.init(parametros);
}

/**
 * envia_formulario
 *
 * Envia o formulário

 *
 * @param  object
 * @return boolean
 */
function envia_formulario(objForm){

    //Seta as propriedades ajax do "preload"
    $("*").ajaxStart(function(){
        $(this).css("cursor", "wait");
    });
    $("*").ajaxStop(function(){
        $(this).css("cursor", "auto");
    });

    //Envia o formulário via ajax
    $.post(objForm.action, $(objForm).serialize(),
        function(htmlReturn) {
            //Verifica se o retorno foi ok
            if (htmlReturn == "ok") {
                alert("Enviado com sucesso!\nAgradecemos o contato.");
                $(":input:not(:submit)", objForm).val("");
            }
            else
                alert("Ocorreu um erro ao enviar o formulário: "+htmlReturn);
        });

    return false;

}

/**
 * inicializaSWFUpload
 *
 * Retorna um objeto de configuração do SWFUpload
 *
 * Requisitos:
 *  - Uma imagem para ser exibida como botão, em  <url_base>img/bts/bt_inserir_foto.jpg
 *
 * @author  Rafael Silvério Matos
 * @since   03/2010
 * @param   string          url de base do sistema
 * @param   string          função a ser utilizado pelo handle_event_callback
 * @return  object          retorna a instancia SWFupload
 **/
function inicializaSWFUpload(site_url, acao_upload){

    //Declara e configura as opções do plugin
    var configuracao = {

        //Define url do flash
    	flash_url               : site_url+"js/swfupload/swfupload.swf",

    	//Define a url do upload de cada imagem
    	upload_url              : acao_upload,

    	//Define as limitações do upload
    	file_size_limit         : "10 MB",
    	file_types              : "*.jpg;*.gif;*.jpeg;*.png",
    	file_types_description  : "jpeg, jpg, gif, png",
    	file_upload_limit       : 100,
    	file_queue_limit        : 0,

    	//Define div que recebe o botão de inserir fotos
    	button_placeholder_id   : 'HolderBotaoInserirFotos',

    	//Define a aparecia do botão
    	button_width            : "130",
    	button_height           : "30",
    	button_image_url        : site_url+"img/bts/bt_inserir_foto.jpg",

    	//Define onde colocar barra de progresso e botão de cancelar
    	custom_settings         : {
    		progressTarget : "barrasDeProgresso",
    		cancelButtonId : "HolderBotaoCancelar"
    	},

    	//Define o debug
    	debug                   : false,

    	//Funções auxiliares default
    	file_queued_handler         : fileQueued,
    	file_queue_error_handler    : fileQueueError,
    	file_dialog_complete_handler: fileDialogComplete,
    	upload_start_handler        : uploadStart,
    	upload_progress_handler     : uploadProgress,
    	upload_error_handler        : uploadError,
    	upload_success_handler      : uploadSuccess,
    	upload_complete_handler     : uploadComplete,
    	queue_complete_handler      : queueComplete
    };

    //Retorna o objeto de configuração
    return configuracao;
}

