/**
 * Funções de auxílio ao grid
 *
 */


/**
 * atualizaCatalogo
 *
 * Atualiza a imagem ampliada do catálogo de acordoo com o estoque
 *
 * @param  string
 * @param  string
 * @return boolean
 */
function atualizaCatalogo(url, divImagem, divTitulo){

    //Monta a função de retorno
    success = function(sucesso) {

        //Verifica se houve retorno
        if(sucesso){

            //Atualiza imagem e título
            $(divImagem).attr("src", sucesso.imagem);
            $(divTitulo).html(sucesso.titulo);
        }
    };

    //Executa o call
    call({'url' : url, 'type' : 'GET', 'success' : success, 'elemBlock' : divImagem});

    //Invalida o link
    return false;

}

/**
 * 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();

    //Move barra de rolagem para baixo
    $('html, body').animate({
	    scrollTop: $("#detail").offset().top
	}, 2000);

    //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;
}

/**
 * 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",

        //Adiciona plugins
        plugins : "table,advimageextendido",

        //Define a linguagem como português
        language : "pt",

        //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",
    	theme_advanced_buttons2 : "justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,outdent,indent,blockquote,|,link,unlink,anchor,|,forecolor,backcolor,|,charmap,|,cleanup,code,charmap,image",
    	theme_advanced_buttons3 : "tablecontrols",

    	//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);
}

/**
 * preencheLink
 *
 * Preenche automáticamente o campo de link 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 link
 * @param  string   caminho para a ação que traduz o texto do nome
 * @return void
 */
function preencheLink(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;
}


/**
 * stripTags
 *
 * Remove tags HTML
 *
 * @author Luiz Tanure
 * @since  12/2008
 * @param string
 * @param  string tags permitidas
 * @return str string sem tags
 */
function stripTags(str, allowed_tags) {

    //Inicializa as variáveis, vazias
    var key = '', tag = '', allowed = false;
    var matches = allowed_array = [];

    //Cria função para substituição das tags achadas
    var replacer = function(search, replace, str) {
        return str.split(search).join(replace);
    };

    //Cria um array com as tags pertmitidas
    if (allowed_tags) {
        allowed_array = allowed_tags.match(/([a-zA-Z]+)/gi);
    }

    str += '';

    //Localiza as tags
    matches = str.match(/(<\/?[^>]+>)/gi);

    //Percorre as Tags JTML
    for (key in matches) {
        if (isNaN(key)) {
            // IE7 Hack
            continue;
        }

        //Armazena as tags HTML
        html = matches[key].toString();

        //Se a tag não está na lista de excessões remove de str
        allowed = false;

        //Percorre as TAGS permitidas
        for (k in allowed_array) {
            //Inicializa
            allowed_tag = allowed_array[k];
            i = -1;

            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+'>');}
            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+' ');}
            if (i != 0) { i = html.toLowerCase().indexOf('</'+allowed_tag)   ;}

            if (i == 0) {
                allowed = true;
                break;
            }
        }
        //Caso não exista, não executa
        if (!allowed) {
            str = replacer(html, "", str);
        }
    }

    return str;
}

/**
 * Gera o texto a partir de uma instancia do tinymce
 *
 * @author Luana Castilho
 * @since  04/2010
 * @param  string origem
 * @param  string destino
 * @return void
 **/
function gerarVersaoTexto(origem, destino) {

    //Recebe o conteúdo do body
    var bodyContent = tinyMCE.get(origem).getBody().innerHTML;
    var contentTXT;

    //Retira o HTML do conteúdo tratando os espaços
    contentTXT = bodyContent.replace("&nbsp;", " ");
    contentTXT = stripTags($.trim(contentTXT));

    //Insere o texto no local destinado
    $(destino).val(contentTXT);

}

/**
 * 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           : "33",
    	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;
}
/**
 * exibeListagem
 *
 * Exibe o grid e ou listagem de um elemento e o insere em um elemento
 * alvo.
 * IMPORTANTE: O texto value inicial do botão deve ser colocado em seu
 * atributo name.
 * Exemplo: <input onclick="exibeListagem(...);" name="Selecionar Opcionais" value="Selecionar Opcionais" type="button" />
 *
 * @author Rafael Silverio Matos
 * @since  11/2009
 * @param  obj      Objeto do botão que recebe a listagem
 * @param  string   url do método que exibe o html do grid e filtro
 * @param  string   seletor(com . e #) do elemento que recebe a listagem
 * @return void
 */
var exibe;
function exibeListagem(obj, url, elemento){

    //Define textos utilizados na função
    var carregando  = "Carregando...";
    var esconde     = "Fechar";

    //Caso seja para esconder a listagem
    if($(obj).val() == esconde){

        //Remove o html do elemento
        $(elemento).html('');

        //Troca o texto do botão
        $(obj).val(exibe);

        //Finaliza o método
        return false;
    }
    else
        //Recebe o texto de exibição do botão
        exibe = $(obj).attr('value');

    //Bloqueia o botão
    $(obj).attr("disabled", "disabled");

    //Coloca o texto de carregando no botão
    $(obj).val(carregando);

    //Monta a função de retorno
    var success =  function(sucesso) {

                        //Se houver retorno
                        if(sucesso){

                            //Insere o conteudo no elemento
                            $(elemento).append(sucesso.html);

                            //Altera o texto do botão
                            $(obj).val(esconde);

                            //Habilita o botão novamente
                            $(obj).attr("disabled", false);
                        }
                    };

    //Executa o call
    call({'url' : url, 'success' : success, 'noPreload' : true});
}
