
/*
 * Descricao: Exibe a mensagem AJAX
 */
function showAjaxMessage()
{
    // exibe a mensagem
    userMessage.show('Processando Opera&ccedil;&atilde;o...', '<h3>Favor aguarde...</h3>', 'loading', false);
}

/*
 * Descricao: Esconde a mensagem AJAX
 */
function hideAjaxMessage()
{
    userMessage.hide();
}

// Atualiza um formulario
function updateForm(form)
{
    // verifica se nenhuma funcao foi especificada
    if((!form['dbtable']) || (!form['dbidcol']) || (!form['dbidcolvalue'])){
        userMessage.show('Erro ao salvar os dados', '<p>O formul&aacute;rio est&aacute; inconsistente. Favor entrar em contato com o administrador do sistema.</p>', 'error');
        return;
    }

    // Parametros para a atualizacao
    var params = "";
    for(var i=0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit

        params += ((i > 0) ? "&" : "") + "i_fld" + i + "=" + form[i].id;
        params += "&t_fld" + i + "=" + form[i].type;

        if(form[i].type == "checkbox")
            params += "&v_fld" + i + "=" + form[i].checked;
        else
            params += "&v_fld" + i + "=" + escape(form[i].value);
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?' + params, {fun: 'updateForm'},
        function(data)
        {
            // caso a operacao tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a operacao tenha sido efetuado com sucesso
            else {
                userMessage.show("Dados salvos com sucesso", "<p>Seus dados foram salvos com sucesso.</p>", "success");
            }
        }
    , "json");

} // fim-updateForm()

/*
 * Salva os dados de um usuario
 */
function saveUserData(form, action)
{
    /* Inicio Verificacao dos dados ---------------------------------------- */

    // verifica se o Nome Completo foi informado
    if(trim(form.nome.value).length < 5){
        userMessage.show('Nome Completo N&atilde;o Informado', '<p>Favor informar seu <strong>Nome Completo</strong>.</p>', 'alert');
        return;
    }

    // verifica se o Sobre Mim foi preenchido
    if(trim(form.sobre_mim.value) == ''){
        userMessage.show('Sobre Mim N&atilde;o Informado', '<p>Favor preencher o campo <strong>Sobre Mim</strong>.</p><p>Coloque um breve resumo sobre voc&ecirc;. Exemplo:</p><p>\'<i>Fa&ccedil;o o terceiro ano de administra&ccedil;&atilde;o na UFG. Sou divertida e gosto de fazer novas amizades. Amo andar na moda e ficar sempre por dentro das &uacute;ltimas tend&ecirc;ncias.</i>\'.</p>', 'alert');
        return;
    }
    
    // verifica se a Data de Nascimento foi preenchida
    if(trim(form.data_nasc.value) == ''){
        userMessage.show('Data de Nascimento N&atilde;o Informada', '<p>Favor preencher o campo <strong>Data de Nascimento</strong>.</p>', 'alert');
        return;
    }
    // verifica se a Data de Nascimento e valida
    else if(!isDate(trim(form.data_nasc.value))){
        userMessage.show('Data de Nascimento Inv&aacute;lida', '<p>A <strong>Data de Nascimento</strong> informada n&atilde;o &eacute; v&aacute;lida.</p>', 'alert');
        return;
    }
    
    // verifica se o Sexo foi selecionado
    if((action == 'insert') && (!form.sexo[0].checked && !form.sexo[1].checked)){
        userMessage.show('Sexo N&atilde;o Informado', '<p>Favor selecionar seu <strong>Sexo</strong>.</p>', 'alert');
        return;
    }

    // verifica se o valor fornecido pra Altura e um inteiro
    if((form.altura.value != '') && (!is_int(form.altura.value))){
        userMessage.show('Altura Inv&aacute;lida', '<p>O campo <strong>Altura</strong> deve ser preenchido com um valor inteiro. Exemplo: 180.</p>', 'alert');
        return;
    }

    // verifica se o valor fornecido pra Peso e um inteiro
    if((form.peso.value != '') && (!is_int(form.peso.value))){
        userMessage.show('Peso Inv&aacute;lido', '<p>O campo <strong>Peso</strong> deve ser preenchido com um valor inteiro. Exemplo: 58.</p>', 'alert');
        return;
    }
    
    // verifica se o valor fornecido pra Torax e um inteiro
    if((form.torax.value != '') && (!is_int(form.torax.value))){
        userMessage.show('T&oacute;rax Inv&aacute;lido', '<p>O campo <strong>T&oacute;rax</strong> deve ser preenchido com um valor inteiro. Exemplo: 100.</p>', 'alert');
        return;
    }
    
    // verifica se o valor fornecido pra Busto e um inteiro
    if((form.busto.value != '') && (!is_int(form.busto.value))){
        userMessage.show('Busto Inv&aacute;lida', '<p>O campo <strong>Busto</strong> deve ser preenchido com um valor inteiro. Exemplo: 85.</p>', 'alert');
        return;
    }
    
    // verifica se o valor fornecido pra Cintura e um inteiro
    if((form.cintura.value != '') && (!is_int(form.cintura.value))){
        userMessage.show('Cintura Inv&aacute;lida', '<p>O campo <strong>Cintura</strong> deve ser preenchido com um valor inteiro. Exemplo: 60.</p>', 'alert');
        return;
    }
    
    // verifica se o valor fornecido pra Quadril e um inteiro
    if((form.quadril.value != '') && (!is_int(form.quadril.value))){
        userMessage.show('Quadril Inv&aacute;lida', '<p>O campo <strong>Quadril</strong> deve ser preenchido com um valor inteiro. Exemplo: 90.</p>', 'alert');
        return;
    }

    // verifica se o Pais foi informado
    if(trim(form.pais.value) == ''){
        userMessage.show('Pa&iacute;s N&atilde;o Informado', '<p>Favor informar seu <strong>Pa&iacute;s</strong>.</p>', 'alert');
        return;
    }

    // verifica se o Estado foi informado
    if(trim(form.estado.value) == ''){
        userMessage.show('Estado N&atilde;o Informado', '<p>Favor informar seu <strong>Estado</strong>.</p>', 'alert');
        return;
    }
    // verifica o valor informado em Estado
    else if(trim(form.estado.value).length != 2){
        userMessage.show('Estado Inv&aacute;lido', '<p>Favor informar seu <strong>Estado</strong> com duas letras. Exemplo: <strong>GO</strong>.</p>', 'alert');
        return;
    }
    
    // verifica se a Cidade foi informada
    if(trim(form.cidade.value) == ''){
        userMessage.show('Cidade N&atilde;o Informada', '<p>Favor informar sua <strong>Cidade</strong>.</p>', 'alert');
        return;
    }

    // verifica se o Email foi informado
    if(trim(form.email.value) == ''){
        userMessage.show('E-Mail N&atilde;o Informado', '<p>Favor informar seu <strong>E-Mail</strong>.</p>', 'alert');
        return;
    }
    // verifica se o Email e valido
    if(!isEmail(trim(form.email.value))){
        userMessage.show('E-Mail Inv&aacute;lida', '<p>O <strong>E-Mail</strong> informado n&atilde;o &eacute; v&aacute;lido.</p>', 'alert');
        return;
    }

    // verifica se a Senha foi informada
    if((action == 'insert') && (trim(form.senha.value) == '')){
        userMessage.show('Senha N&atilde;o Informada', '<p>Favor informar sua <strong>Senha</strong>.</p>', 'alert');
        return;
    }
    // verifica se a Senha e valida
    else if((trim(form.senha.value) != '') && (checkPassword(trim(form.senha.value)) <= 0)){
        userMessage.show('Senha Inv&aacute;lida', '<p>A <strong>Senha</strong> deve ter pelo menos 6 (seis) caracteres.</p>', 'alert');
        form.senha.value = '';
        form.rep_senha.value = '';
        $('.pw').css('display', 'none');
        $('.pw_0').css('display', 'inline');
        return;
    }
    // compatibilidade das Senhas
    else if(trim(form.senha.value) != trim(form.rep_senha.value)){
        userMessage.show('Senha Inv&aacute;lida', '<p>Os campos <strong>Senha</strong> e <strong>Repita a Senha</strong> devem ter o mesmo valor.</p>', 'alert');
        form.senha.value = '';
        form.rep_senha.value = '';
        $('.pw').css('display', 'none');
        $('.pw_0').css('display', 'inline');
        return;
    }

    /* Fim Verificacao dos dados ------------------------------------------- */

    // exibe a mensagem de processamento
    showAjaxMessage();

    var params = '?';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].id != 'rep_senha'){
            params += (i > 0) ? '&' : '';
            if(form[i].type == 'checkbox')
                params += form[i].id + "=" + form[i].checked;
            else if (form[i].type == 'radio')
                params += (form[i].checked) ? form[i].id + "=" + form[i].value : '';
            else {
                params += form[i].id + '=';
                params += (form[i].id == 'senha') ? md5(form[i].value) : escape(trim(form[i].value));
            }
        }
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'saveUserData', action: action },
        function(data)
        {
            // caso o cadastro tenha sido efetuado com sucesso
            if((data.className == 'success') && (action == 'insert')){
                form.reset();
            }

            // exibe a mensagem ao usuario
            userMessage.show(data.title, data.text, data.className);

            // limpa os campos Senha e Rep_Senha
            form.senha.value = '';
            form.rep_senha.value = '';

            // reinicia a forca da senha
            $('.pw').css('display', 'none');
            $('.pw_0').css('display', 'inline');

        }
    , "json");

} // fim-saveUserData()

/*
 * Salva os dados de uma loja
 */
function saveStoreData(form, action)
{
    /* Inicio Verificacao dos dados ---------------------------------------- */
    // verifica se o Nome foi informado
    if(trim(form.nome.value).length < 10){
        userMessage.show('Nome N&atilde;o Informado', '<p>Favor informar seu <strong>Nome</strong> da loja.</p>', 'alert');
        return;
    }

    // verifica se a Descricao foi preenchida
    if(trim(form.descricao.value) == ''){
        userMessage.show('Descri&ccedil;&atilde;o N&atilde;o Informada', '<p>Favor preencher o campo <strong>Descri&ccedil;&atilde;o</strong>.</p><p>Coloque um breve resumo sobre sua empresa. Exemplo:</p><p>\'<i>Trabalhamos com todo tipo de moda feminina. Cal&ccedil;as, blusas, &iacute;ntima, praia e etc.</i>\'.</p>', 'alert');
        return;
    }

    // verifica se o Estado foi informado
    if(trim(form.estado.value) == ''){
        userMessage.show('Estado N&atilde;o Informado', '<p>Favor informar seu <strong>Estado</strong>.</p>', 'alert');
        return;
    }
    // verifica o valor informado em Estado
    else if(trim(form.estado.value).length != 2){
        userMessage.show('Estado Inv&aacute;lido', '<p>Favor informar seu <strong>Estado</strong> com duas letras. Exemplo: <strong>GO</strong>.</p>', 'alert');
        return;
    }

    // verifica se a Cidade foi informada
    if(trim(form.cidade.value) == ''){
        userMessage.show('Cidade N&atilde;o Informada', '<p>Favor informar sua <strong>Cidade</strong>.</p>', 'alert');
        return;
    }

    // verifica se o Email foi informado
    if(trim(form.email.value) == ''){
        userMessage.show('E-Mail N&atilde;o Informado', '<p>Favor informar seu <strong>E-Mail</strong>.</p>', 'alert');
        return;
    }
    // verifica se o Email e valido
    if((trim(form.email.value) != '') && (!isEmail(trim(form.email.value)))){
        userMessage.show('E-Mail Inv&aacute;lida', '<p>O <strong>E-Mail</strong> informado n&atilde;o &eacute; v&aacute;lido.</p>', 'alert');
        return;
    }
    
    /* Fim Verificacao dos dados ------------------------------------------- */

    // exibe a mensagem de processamento
    showAjaxMessage();

    var params = '?';
    var cat = '';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].id != 'rep_senha'){
//            params += (i > 0) ? '&' : '';
            if(form[i].type == 'checkbox'){
                if(form[i].checked)
                    if((form[i].id).substr(0, 2) == 'c_')
                        cat += (cat != '' ? '-' : '') + (form[i].id).substr(2);
                    else
                        params += ((i > 0) ? '&' : '') + form[i].id + "=" + form[i].checked;
            }
            else if (form[i].type == 'radio')
                params += ((i > 0) ? '&' : '') + (form[i].checked) ? form[i].id + "=" + form[i].value : '';
            else {
                params += ((i > 0) ? '&' : '') + form[i].id + '=';
                params += (form[i].id == 'senha') ? md5(form[i].value) : escape(trim(form[i].value));
            }
        }
    }
    params += '&categorias=' + cat;

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'saveStoreData', action: action },
        function(data)
        {  //alert(data); return;
            // caso o cadastro tenha sido efetuado com sucesso
            if((data.className == 'success') && (action == 'insert')){
                form.reset();
            }

            // exibe a mensagem ao usuario
            userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-saveStoreData()

/*
 * Salva os dados de um produto
 * Parametros:
 *  - form    : formulario
 *  - action  : Acao (inserir/atualizar)
 *  - nome_url: Titulo URL do produto (usado para edicao)
 *  - callback: Funcao a ser executada apos o envio ser realizado
 */
function saveProductData(form, action, ed_nome_url, callback)
{
    // verifica se o nome foi digitado
    if(form.produto_tit.value == ''){
        userMessage.show('Nome N&atilde;o Informado', '<p>Favor informar o <strong>Nome</strong> do produto.</p>', 'alert');
        return;
    }

    // verifica se o link foi digitado
    if(form.produto_link.value == ''){
        userMessage.show('Link N&atilde;o Informado', '<p>Favor informar o <strong>Link</strong> do produto (ex. http://www.minha-loja-virtual.com.br/ver_produto/calca_jeans_escura/).</p>', 'alert');
        return;
    }
    
    // verifica se a descricao foi digitada
    if(form.produto_desc.value == ''){
        userMessage.show('Descri&ccedil;&atilde;o N&atilde;o Informada', '<p>Favor informar a <strong>Descri&ccedil;&atilde;o</strong> (mais detalhes) do produto.</p>', 'alert');
        return;
    }

    // verifica se o preco foi digitado
    if(form.produto_preco.value == ''){
        form.produto_preco.value = '0,00';
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    // salva o comentario das fotos ja adicionadas
    if(action == 'update'){

        // percorre as fotos
        $('#swfu_photos .o_photo textarea').each(function(i){
            savePhotoComment($(this).attr('id').substr('4'), $(this).attr('value'), 'produto');
        });
    }

    var params = '?';
    var cat = '';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].type == 'checkbox'){
            if(form[i].checked)
                if((form[i].id).substr(0, 2) == 'c_')
                    cat += (cat != '' ? '-' : '') + (form[i].id).substr(2);
                else
                    params += ((i > 0) ? '&' : '') + form[i].id + "=" + form[i].checked;
        }
        else if(form[i].value){
            params += ((i > 0) ? '&' : '') + form[i].id + '=' + escape(trim(form[i].value));
        }
    }
    params += '&categorias=' + cat;

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'saveProductData', action: action, nome_url: ed_nome_url },
        function(data)
        {
            // caso tenha ocorrido sucesso
            if(data.className == 'success'){

                // atualiza o src_url e o onSubmit do formulario
                src_url = data.nome_url;
                if(action == 'insert'){
                    $('#src_url').attr('value', src_url);
                    $('#save_form_data').html('Salvar Altera&ccedil;&otilde;es');
                    form.onsubmit = function(){

                        tinyMCE.triggerSave(true, true);
                        saveProductData(form, 'update', nome_url, function(src_name){ savePhotosData(src_name) });

                    } // fim-form
                } // fim-if

                // caso nao hajam fotos a adidionar, exibe a mensagem de sucesso
                if($('#swfu_photos .n_photo').size() <= 0){

                    // exibe a mensagem
                    userMessage.show(data.title, data.text, 'success');
                }

                // parametros para SWFU
                else {
                    swfu_type  = 'product';
                    swfu_label = 'produto';
                    src_name   = 'nome';
                }

                // chama 'savePhotosData'
                if(callback) callback(src_url);
            }

            // exibe a mensagem de aviso/erro
            else
                userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-saveProductData()

/*
 * Envia um email
 */
function sendEmail(form)
{
    /* Inicio Verificacao dos dados ---------------------------------------- */

    // verifica se o Nome Completo foi informado
    if(trim(form.nome.value).length < 15){
        userMessage.show('Nome Completo N&atilde;o Informado', '<p>Favor informar seu <strong>Nome Completo</strong>.</p>', 'alert');
        return;
    }

    // verifica se o Email foi informado
    if(trim(form.email.value) == ''){
        userMessage.show('E-Mail N&atilde;o Informado', '<p>Favor informar seu <strong>E-Mail</strong>.</p>', 'alert');
        return;
    }
    // verifica se o Email e valido
    if(!isEmail(trim(form.email.value))){
        userMessage.show('E-Mail Inv&aacute;lida', '<p>O <strong>E-Mail</strong> informado n&atilde;o &eacute; v&aacute;lido.</p>', 'alert');
        return;
    }

    // verifica se o Assunto foi informado
    if(trim(form.assunto.value) == ''){
        userMessage.show('Assunto N&atilde;o Informado', '<p>Favor informar o <strong>Assunto</strong> do e-mail.</p>', 'alert');
        return;
    }
    
    // verifica se a Mensagem foi escrita
    if(trim(form.mensagem.value) == ''){
        userMessage.show('Mensagem N&atilde;o Escrita', '<p>Favor escrever a <strong>Mensagem</strong>.</p>', 'alert');
        return;
    }

    /* Fim Verificacao dos dados ------------------------------------------- */

    // exibe a mensagem de processamento
    showAjaxMessage();

    var params = '?';
    for(var i = 0; i < form.length - 2; i++){ // -2 para nao enviar o botao submit e reset
        params += (i > 0) ? '&' : '';
        params += form[i].id + '=' + escape(trim(form[i].value));
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'sendEmail' },
        function(data)
        {
            // caso a operacao tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a operacao tenha sido efetuado com sucesso
            else {
                form.reset();
                userMessage.show('E-mail Enviado', '<p>Obrigado por entrar em contato conosco! Em breve lhe responderemos.</p>', 'success');
            }
        }
    , "json");

} // fim-sendEmail()

/*
 * Faz login
 * Parametros:
 *  - email   : E-mail do usuario
 *  - pw      : Senha do usuario
 *  - callback: Funcao a ser executada apos o login ser realizado
 */
function login(email, pw, callback)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // verifica se o email foi informado
    if(email == ''){
        userMessage.show('E-mail N&atilde;o Informado', '<p>Favor informar seu <strong>E-Mail</strong>.</p>', 'alert');
        return;
    }
    
    // verifica se a senha foi informada
    if(pw == ''){
        userMessage.show('Senha N&atilde;o Informada', '<p>Favor informar sua <strong>Senha</strong>.</p>', 'alert');
        return;
    }
    
    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'login', email: escape(trim(email)), senha: md5(trim(pw)) },
        function(data)
        {
            // caso o login tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }
            
            // caso o login tenha sido efetuado com sucesso
            else {

                // verifica se a funcao callback foi especificada
                (callback) ? callback() : document.location = pageRoot + '/pagina/perfil/usuario/' + data.nome_url + '/sessao/inicio/';
            }
        }
    , "json");

} // fim-login()

/*
 * Faz logout
 */
function logout()
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'logout' },
        function(data)
        {
            // caso o logout tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso o logout tenha sido efetuado com sucesso
            else {
                document.location = pageRoot;
            }
        }
    , "json");

} // fim-logout()

/*
 * Envia um comentario
 * Parametros:
 *  - rate    : Classificacao
 *  - comment : Comentario
 *  - resource: Recurso (materia, video e etc)
 *  - id_name : Nome do Identificador
 *  - id_value: Valor do Identificador
 *  - callback: Funcao a ser executada apos o envio ser realizado
 */
function sendComment(rate, comment, resource, id_name, id_value, callback)
{
    // cria um objeto date
    var date = new Date();

    // recebe o timestamp do ultimo comentario adicionado
    var ts_l_c = getCookie('ts_last_comment');
/*
    // verifica se o usuario nao enviou um comentario muito recentemente (menos de 1 minuto)
    if((ts_l_c) && (ts_l_c > (date.getTime() - 60 * 1000))){

        // tempo de espera
        var t_waiting = (ts_l_c - date.getTime()) / 1000 + 60;
            t_waiting = parseInt(t_waiting);

        // tempo de espera maior que um
        if(t_waiting > 1)
            t_waiting = t_waiting + ' segundos';

        // tempo de espera: 1 ou 0 segundos
        else
            t_waiting = '1 segundo';

        userMessage.show('Coment&aacute;rio n&atilde;o Adicionado', '<p>Voc&ecirc; n&atilde;o pode enviar coment&aacute;rios com tanta frequ&ecirc;ncia.  Favor aguarde <b>' + t_waiting + '</b>.</p>', 'alert');
        return;
    } // fim-if
*/
    // verifica se a classificacao foi definida
    if(rate == 'none'){
        userMessage.show('Classifica&ccedil;&atilde;o N&atilde;o Informada', '<p>Favor informar a <strong>Classifica&ccedil;&atilde;o</strong>.</p>', 'alert');
        return;
    }

    // verifica se o comentario foi digitado
    if(comment == ''){
        userMessage.show('Coment&aacute;rio N&atilde;o Digitado', '<p>Favor digitar seu <strong>Coment&aacute;rio</strong>.</p>', 'alert');
        return;
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?comentario=' + escape(trim(comment)), { fun: 'sendComment', classificacao: rate, resource: resource, id_name: id_name, id_value: id_value },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso o envio tenha sido efetuado com sucesso
            else {

                // esconde o elemento (nenhum comentario foi enviado ainda...), caso ele esteja presente
                hideElement($('#lista-comentarios li[class=none]'));

                // valor identificador do comentario
                var id_comment = 'comment_' + parseInt((Math.random() * 1000000));

                var newComment = '<li id=\"' + id_comment + '\" style=\"display: none\">';
                    newComment += '<p class="topo"><a class="' + data.usuario_tipo + '" href="' + pageRoot + '/pagina/perfil/usuario/' + data.usuario_url + '/" title="Ver Perfil de: ' + data.usuario + '">' + data.usuario + '</a> (' + datetime() + ')</p>';
//                    newComment += '<p class="topo"><a href="' + pageRoot + '/pagina/perfil/usuario/' + data.usuario_url + '/" title="Ver Perfil de: ' + data.usuario + '">' + data.usuario + '</a> (' + datetime() + ')</p>';
                    newComment += '<p class="comentario">' + comment + '</p>';
                    newComment += '</li>';

                // adiciona o comentario na pagina
                $('#lista-comentarios').append(newComment);
                
                // exibe o comentario
                showElement($('#' + id_comment));
                
                // atualiza o numero de comentarios do recurso
                $('#num_comentarios').text( parseInt($('#num_comentarios').text()) + 1 );
                
                // salva um cookie com a data do post (expira em 1 dia)
                setCookie('ts_last_comment', date.getTime(), new Date(date.getTime() + (60 * 60 * 24 * 1000)), '/');

                // esconde a mensagem ajax
                hideAjaxMessage();

                // verifica se a funcao callback foi especificada
                (callback) ? callback() : '';
            }
        }
    , "json");

} // fim-sendComment()

/*
 * Envia uma resposta a alguma pergunta
 * Parametros:
 *  - answer  : Resposta
 *  - question: Titulo_url da pergunta
 *  - callback: Funcao a ser executada apos o envio ser realizado
 */
function sendAnswer(answer, question, callback)
{
    // cria um objeto date
    var date = new Date();

    // recebe o timestamp da ultima resposta adicionada
    var ts_l_a = getCookie('ts_last_answer');

    // verifica se o usuario nao enviou uma resposta muito recentemente (menos de 1 minuto)
    if((ts_l_a) && (ts_l_a > (date.getTime() - 60 * 1000))){

        // tempo de espera
        var t_waiting = (ts_l_a - date.getTime()) / 1000 + 60;
            t_waiting = parseInt(t_waiting);

        // tempo de espera maior que um
        if(t_waiting > 1)
            t_waiting = t_waiting + ' segundos';

        // tempo de espera: 1 ou 0 segundos
        else
            t_waiting = '1 segundo';

        userMessage.show('Resposta n&atilde;o Adicionada', '<p>Voc&ecirc; n&atilde;o pode enviar respostas com tanta frequ&ecirc;ncia. Favor aguarde <b>' + t_waiting + ' </b>.</p>', 'alert');
        return;
    } // fim-if

    // verifica se a resposta foi digitada
    if(answer == ''){
        userMessage.show('Resposta N&atilde;o Digitada', '<p>Favor digitar sua <strong>Resposta</strong>.</p>', 'alert');
        return;
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?resposta=' + escape(trim(answer)), { fun: 'sendAnswer', pergunta: question },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso o envio tenha sido efetuado com sucesso
            else {

                // esconde o elemento (nenhuma resposta foi enviada ainda...), caso ele esteja presente
                hideElement($('#lista-comentarios li[class=none]'));

                // valor identificador da resposta
                var id_answer = 'answer_' + parseInt((Math.random() * 1000000));

                var newAnswer = '<li id=\"' + id_answer + '\" style=\"display: none\">';
                    newAnswer += '<p class="topo"><a href="' + pageRoot + '/pagina/perfil/usuario/' + data.usuario_url + '/" title="Ver Perfil de: ' + data.usuario + '">' + data.usuario + '</a> (' + datetime() + ')</p>';
                    newAnswer += '<p class="comentario">' + answer + '</p>';
                    newAnswer += '</li>';

                // adiciona a resposta na pagina
                $('#lista-comentarios').append(newAnswer);

                // exibe o comentario
                showElement($('#' + id_answer));

                // atualiza o numero de respostas para pergunta
                $('#num_comentarios').text( parseInt($('#num_comentarios').text()) + 1 );

                // salva um cookie com a data do post (expira em 1 dia)
                setCookie('ts_last_answer', date.getTime(), new Date(date.getTime() + (60 * 60 * 24 * 1000)), '/');

                // esconde a mensagem ajax
                hideAjaxMessage();

                // verifica se a funcao callback foi especificada
                (callback) ? callback() : '';
            }
        }
    , "json");

} // fim-sendAnswer()

/*
 * Envia uma mensagem
 * Parametros:
 *  - subject : Assunto
 *  - message : Mensagem
 *  - from    : Remetente
 *  - to      : Destinatario
 *  - callback: Funcao a ser executada apos o envio ser realizado
 */
function sendMessage(subject, message, to, callback)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // cria um objeto date
    var date = new Date();

    // recebe o timestamp da ultima mensagem adicionada
    var ts_l_m = getCookie('ts_last_message');

    // verifica se o usuario nao enviou uma mensagem muito recentemente (menos de 1 minuto)
    if((ts_l_m) && (ts_l_m > (date.getTime() - 60 * 1000))){

        // tempo de espera
        var t_waiting = (ts_l_m - date.getTime()) / 1000 + 60;
            t_waiting = parseInt(t_waiting);

        // tempo de espera maior que um
        if(t_waiting > 1)
            t_waiting = t_waiting + ' segundos';

        // tempo de espera: 1 ou 0 segundos
        else
            t_waiting = '1 segundo';

        userMessage.show('Mensagem n&atilde;o Enviada', '<p>Voc&ecirc; n&atilde;o pode enviar mensagens com tanta frequ&ecirc;ncia. Favor aguarde <b>' + t_waiting + '</b>.</p>', 'alert');
        return;
    } // fim-if

    // verifica se o destinatario da mensagem foi definido
    if(to == 'none'){
        userMessage.show('Destinat&aacute;rio N&atilde;o Informado', '<p>Favor informar o <strong>Destinat&aacute;rio</strong> da mensagem.</p>', 'alert');
        return;
    }

    // verifica se o assunto da mensagem foi definido
    if(subject == ''){
        userMessage.show('Assunto N&atilde;o Informado', '<p>Favor informar o <strong>Assunto</strong> da mensagem.</p>', 'alert');
        return;
    }

    // verifica se a mensagem foi digitada
    if(message == ''){
        userMessage.show('Mensagem N&atilde;o Digitada', '<p>Favor digitar sua <strong>Mensagem</strong>.</p>', 'alert');
        return;
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?assunto=' + escape(trim(subject)) + '&mensagem=' + escape(trim(message)), { fun: 'sendMessage', para: to },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a mensagem tenha sido efetuado com sucesso
            else {

                userMessage.show('Mensagem Enviada', '<p>Sua mensagem foi enviada com sucesso.</p>', 'success');

                // salva um cookie com a data do post (expira em 1 dia)
                setCookie('ts_last_message', date.getTime(), new Date(date.getTime() + (60 * 60 * 24 * 1000)), '/');

                // verifica se a funcao callback foi especificada
                (callback) ? callback() : '';
            }
        }
    , "json");

} // fim-sendMessage()

/*
 * Adiciona um usuario como amigo
 * Parametros:
 *  - friend : Amigo a ser adicionado
 */
function addFriend(friend)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' , { fun: 'addFriend', amigo: friend },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a acao tenha sido executada com sucesso
            else {
                userMessage.show('Amigo Adicionado', '<p>Seu convite de amizade foi enviado com sucesso. Aguarde a libera&ccedil;&atilde;o do mesmo.</p>', 'success');

                // altera o botao
                changeImage($('#add_remove_friend img'), pageRoot + '/image/menu_usuario_remover-amigo.png', 48, 48);

                // altera o texto
                changeText($('#a_r_f_label'), 'Remover<br />Convite');

                // altera os atributos title dos links
                $('#add_remove_friend a').attr('title', 'Seu Convite ao Usuário Está Pendente. Remover convite.');

                // altera os atributos do manipulador de eventos onClick
                var links = document.getElementById('add_remove_friend').getElementsByTagName('a');
                for(var i = 0; i < links.length; i++)
                    links[i].onclick = function(){ removeFriendship(friend) };

            } // fim-else
        }
    , "json");

} // fim-addFriend()

/*
 * Aceita uma amizade
 * Parametros:
 *  - friend : Amigo a ser aceito
 */
function acceptFriendship(friend, li)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' , { fun: 'acceptFriendship', amigo: friend },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a acao tenha sido executada com sucesso
            else {

                // retira o elemento
                hideElement(li);
                
                // esconde a mensagem ajax
                hideAjaxMessage();

            } // fim-else
        }
    , "json");

} // fim-acceptFriendship()

/*
 * Adiciona um usuario como amigo
 * Parametros:
 *  - friend : Amigo a ser removido
 */
function removeFriendship(friend, li)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' , { fun: 'removeFriendship', amigo: friend },
        function(data)
        {
            // caso o envio tenha falhado
            if(data.className != 'success'){
                userMessage.show(data.title, data.text, data.className);
            }

            // caso a acao tenha sido executada com sucesso
            else {

                // verifica se a remocao veio de uma lista de convites
                if(li){

                    // esconde o elemento
                    hideElement(li);
                    
                    // esconde a mensagem ajax
                    hideAjaxMessage();

                    return;
                }

                userMessage.show('Amizade Removida', '<p>Sua amizade com o usu&aacute;rio selecionado foi removida com sucesso.</p>', 'success');

                // altera o botao
                changeImage($('#add_remove_friend img'), pageRoot + '/image/menu_usuario_adicionar-amigo.png', 48, 48);
                
                // altera o texto
                changeText($('#a_r_f_label'), 'Adicionar<br />Amigo');
                
                // altera os atributos title dos links
                $('#add_remove_friend a').attr('title', 'Adicionar Usuário como Amigo');
                
                // altera os atributos do manipulador de eventos onClick
                var links = document.getElementById('add_remove_friend').getElementsByTagName('a');
                for(var i = 0; i < links.length; i++)
                    links[i].onclick = function(){ addFriend(friend) };

            } // fim-else
        } // fim-if
    , "json");

} // fim-removeFriendship()

/*
 * Usuario que esqueceu a senha
 * Parametros:
 *  - email: E-mail do usuario
 */
function lostPW(email)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // verifica se o email foi informado
    if(email == ''){
        userMessage.show('E-mail N&atilde;o Informado', '<p>Favor informar seu <strong>E-Mail</strong>.</p>', 'alert');
        return;
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'lostPW', email: escape(trim(email)) },
        function(data)
        {
            // Exibe a mensagem ao usuario
            userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-lostPW()

/*
 * Altera a senha de um usuario
 * Parametros:
 *  - name_url  : nome_url do usuario
 *  - old_pw    : senha antiga
 *  - new_pw    : nova senha
 *  - rep_new_pw: repeticao da nova senha
 */
function changePW(name_url, old_pw, new_pw, rep_new_pw)
{
    // exibe a mensagem de processamento
    showAjaxMessage();

    // verifica a validade do nome_url e senha antiga
    if((name_url == '') || (old_pw == '')){
        userMessage.show('Link Inv&aacute;lido', '<p>Este link &eacute; inv&aacute;lido. Favor, tente alterar sua senha novamente <a href="' + pageRoot + '/pagina/esqueci_senha/" title="Esqueci Minha Senha">clicando aqui</a>.</p>', 'error');
        return;
    }

    // verifica se a Senha foi informada
    if(trim(new_pw) == ''){
        userMessage.show('Nova Senha N&atilde;o Informada', '<p>Favor informar sua <strong>Nova Senha</strong>.</p>', 'alert');
        return;
    }
    // verifica se a Senha e valida
    else if((trim(new_pw) != '') && (checkPassword(trim(new_pw)) <= 0)){
        userMessage.show('Nova Senha Inv&aacute;lida', '<p>A <strong>Senha</strong> deve ter pelo menos 6 (seis) caracteres.</p>', 'alert');
        return;
    }
    // compatibilidade das Senhas
    else if(trim(new_pw) != trim(rep_new_pw)){
        userMessage.show('Incompatibilidade das Senhas', '<p>Os campos <strong>Nova Senha</strong> e <strong>Repita a Nova Senha</strong> devem ter o mesmo valor.</p>', 'alert');
        return;
    }

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'changePW', nome_url: name_url, old_pw: old_pw, new_pw: md5(new_pw), rep_new_pw: md5(rep_new_pw) },
        function(data)
        {
            // Exibe a mensagem ao usuario
            userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-changePW()

/*
 * Salva os dados de uma materia
 * Parametros:
 *  - form      : formulario
 *  - text      : texto
 *  - action    : Acao (inserir/atualizar)
 *  - titulo_url: Titulo URL da materia (usado para edicao)
 *  - callback  : Funcao a ser executada apos o envio ser realizado
 */
function savePostData(form, tinyMCE, action, ed_titulo_url, callback)
{
    // recebe a materia
    materia = tinyMCE.activeEditor.getContent();

    // verifica se o titulo foi digitado
    if(form.materia_tit.value == ''){
        userMessage.show('T&iacute;tulo N&atilde;o Informado', '<p>Favor informar o <strong>T&iacute;tulo</strong> da mat&eacute;ria.</p>', 'alert');
        return;
    }

    // verifica se a materia foi digitada
    if(materia == ''){
        userMessage.show('Mat&eacute;ria N&atilde;o Digitada', '<p>Favor digitar a <strong>Mat&eacute;ria</strong>.</p>', 'alert');
        return;
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    // salva o comentario das fotos ja adicionadas
    if(action == 'update'){

        // percorre as fotos
        $('#swfu_photos .o_photo textarea').each(function(i){
            savePhotoComment($(this).attr('id').substr('4'), $(this).attr('value'), 'materia');
        });
    }

    var params = '?';
    var cat = '';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].type == 'checkbox'){
            if(form[i].checked)
                if((form[i].id).substr(0, 2) == 'c_')
                    cat += (cat != '' ? '-' : '') + (form[i].id).substr(2);
                else
                    params += ((i > 0) ? '&' : '') + form[i].id + "=" + form[i].checked;
        }
        else if(form[i].type == 'text'){
            params += ((i > 0) ? '&' : '') + form[i].id + '=' + escape(trim(form[i].value));
        }
    }
    params += '&categorias=' + cat;

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'savePostData', materia: materia, action: action, titulo_url: ed_titulo_url },
        function(data)
        {
            // caso tenha ocorrido sucesso
            if(data.className == 'success'){

                // atualiza o src_url e o onSubmit do formulario
                src_url = data.titulo_url;
                if(action == 'insert'){
                    $('#src_url').attr('value', src_url);
                    $('#save_form_data').html('Salvar Altera&ccedil;&otilde;es');
                    form.onsubmit = function(){

                        tinyMCE.triggerSave(true, true);
                        savePostData(form, tinyMCE, 'update', titulo_url, function(src_name){ savePhotosData(src_name) });

                    } // fim-form
                } // fim-if

                // caso nao hajam fotos a adidionar, exibe a mensagem de sucesso
                if($('#swfu_photos .n_photo').size() <= 0){
                    
                    // exibe a mensagem
                    userMessage.show(data.title, data.text, 'success');
                }

                // parametros para SWFU
                else {
                    swfu_type  = 'post';
                    swfu_label = 'materia';
                    src_name   = 'titulo';
                }

                // chama 'savePhotosData'
                if(callback) callback(src_url);
            }
            
            // exibe a mensagem de aviso/erro
            else
                userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-savePostData()

/* Carregar Fotos ************************************************************/

// novo nome das fotos
// tambem sera acessada por 'swfu.uploadStart()'
var swfu_new_photo_name = [];
var swfu_type  = '';
var swfu_label = '';

// salva os dados das fotos no bd
function savePhotosData(src_url)
{
    var comment, // comentario de uma foto
        textareas = $('#swfu_photos .n_photo textarea'),
        ta_size = textareas.size(),
        callback,
        npn;

    // re-inicializa a variavel
    swfu_new_photo_name = [];

    // gera o nome das fotos
    textareas.each(function(i){

        // novo nome da foto
        comment = ( ($(this).attr('value') == 'Comentário...') || ($(this).attr('value') == '') ) ? $('#' + swfu_label + '_tit').attr('value') : $(this).attr('value');
        npn = name_from_comment(comment);
        swfu_new_photo_name[ parseInt(($(this).parent().get(0).id).substr(8)) ] = npn;

        // define o callback
        callback = (i == (ta_size -1)) ? function(){ upload_photos(src_url); } : function(){};

        // salva o comentario
        savePhotoData(npn + '.jpg', src_url, comment, callback);
    });

} // fim-function (savePhotosData())

/*
 * Salva o comentario de uma foto
 * Parametros:
 *  - photo   : Foto
 *  - src_url : Materia/Produto/...
 *  - comment : Comentario
 *  - callback: Funcao a ser executada os dados serem salvos
 */
function savePhotoData(photo, src_url, comment, callback)
{
    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?comentario=' + escape(comment), { fun: 'savePhotoData', foto: photo, src_url: src_url, label: swfu_label },
        function(data)
        {
            if(callback) callback(src_url);
        }
    , "json");
    
} // fim-savePhotoData()

/*
 * Salva o comentario de uma foto
 * Parametros:
 *  - photo   : Foto
 *  - comment : Comentario
 *  - src_url : Materia/Produto/...
 */
function savePhotoComment(photo, comment, label)
{
    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php?comentario=' + escape(comment), { fun: 'savePhotoComment', foto: photo, label: label },
        function(data)
        {}
    , "json");

} // fim-savePhotoData()

/*
 * Faz upload das fotos
 */
function upload_photos(src_url)
{
    // envia um parametro para o sistema de upload
    swfu.addPostParam("upload_dir", 'image/' + swfu_type + '/' + src_url);
    swfu.addPostParam("label", swfu_label);

    // faz upload das fotos
    swfu.startUpload();

} // fim-upload_photos()

/*
 * Apaga alguma foto
 */
function deletePhoto(photo, photo_li, swfu_type, swfu_label)
{
    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'deletePhoto', foto: photo, tipo: swfu_type, label: swfu_label },
        function(data)
        {
            // caso tenha ocorrido sucesso
            if(data.className == 'success'){
                hideElement(photo_li);
            }

            // exibe a mensagem de aviso/erro
            else
                userMessage.show(data.title, data.text, data.className);
        }
    , "json");

} // fim-deletePostPhoto()

/* Fim Carregar Fotos ********************************************************/

/*
 * Registry Next/Prev Post Click
 * Parametros:
 *  - np  : next/prev
 *  - from: Pagina atual
 *  - to  : Pagina de destino
 */
function rnppc(np, from, to)
{
    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'rnppc', np: np, from: from, to: to },
        function(data)
        {}
    , "json");

} // fim-rnppc()

/*
 * Salva os dados de um video
 * Parametros:
 *  - form  : formulario
 *  - action: Acao (inserir/atualizar)
 */
function saveVideoData(form, action)
{
    // verifica se o titulo foi digitado
    if(form.video_tit.value == ''){
        userMessage.show('T&iacute;tulo N&atilde;o Informado', '<p>Favor informar o <strong>T&iacute;tulo</strong> do v&iacute;deo.</p>', 'alert');
        return;
    }

    // verifica se a descricao foi digitada
    if(form.video_desc.value == ''){
        userMessage.show('Descri&ccedil;&atilde;o N&atilde;o Informada', '<p>Favor informar a <strong>Descri&ccedil;&atilde;o</strong> do v&iacute;deo.</p>', 'alert');
        return;
    }
    
    // verifica se a url foi informada
    if(form.video_url.value == ''){
        userMessage.show('URL N&atilde;o Informada', '<p>Favor informar a <strong>URL</strong> do v&iacute;deo.</p>', 'alert');
        return;
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    var params = '?';
    var cat = '';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].type == 'checkbox'){
            if(form[i].checked)
                if((form[i].id).substr(0, 2) == 'c_')
                    cat += (cat != '' ? '-' : '') + (form[i].id).substr(2);
                else
                    params += ((i > 0) ? '&' : '') + form[i].id + "=" + form[i].checked;
        }
        else /*if(form[i].type == 'text')*/{
            params += ((i > 0) ? '&' : '') + form[i].id + '=' + escape(trim(form[i].value));
        }
    }
    params += '&categorias=' + cat;

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'saveVideoData', action: action },
        function(data)
        {
            // exibe a mensagem do usuario
            userMessage.show(data.title, data.text, data.className);

            // caso tenha ocorrido sucesso
            if(data.className == 'success')
                form.reset();
        }
    , "json");

} // fim-saveVideoData()

/*
 * Salva os dados de uma pergunta
 * Parametros:
 *  - form  : formulario
 *  - action: Acao (inserir/atualizar)
 *  - titulo_url: Titulo URL da pergunta (usado para edicao)
 */
function saveQuestionData(form, action, ed_titulo_url)
{
    // verifica se o titulo foi digitado
    if(form.pergunta_tit.value == ''){
        userMessage.show('Pergunta N&atilde;o Informada', '<p>Favor informar a <strong>Pergunta</strong>.</p>', 'alert');
        return;
    }

    // verifica se a descricao foi digitada
    if(form.pergunta_desc.value == ''){
        userMessage.show('Descri&ccedil;&atilde;o N&atilde;o Informada', '<p>Favor informar a <strong>Descri&ccedil;&atilde;o</strong> (mais detalhes) da pergunta.</p>', 'alert');
        return;
    }

    // exibe a mensagem de processamento
    showAjaxMessage();

    var params = '?';
    var cat = '';
    for(var i = 0; i < form.length - 1; i++){ // -1 para nao enviar o botao submit
        if(form[i].type == 'checkbox'){
            if(form[i].checked)
                if((form[i].id).substr(0, 2) == 'c_')
                    cat += (cat != '' ? '-' : '') + (form[i].id).substr(2);
                else
                    params += ((i > 0) ? '&' : '') + form[i].id + "=" + form[i].checked;
        }
        else /*if(form[i].type == 'text')*/{
            params += ((i > 0) ? '&' : '') + form[i].id + '=' + escape(trim(form[i].value));
        }
    }
    params += '&categorias=' + cat;

    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php' + params, { fun: 'saveQuestionData', action: action, titulo_url: ed_titulo_url },
        function(data)
        {
                // atualiza o titulo_url
                titulo_url = data.titulo_url;
                if(action == 'insert')
                    $('#m_titulo_url').attr('value', titulo_url);

            // exibe a mensagem do usuario
            userMessage.show(data.title, data.text, data.className);

            // caso tenha ocorrido sucesso
            if(data.className == 'success')
                form.reset();
        }
    , "json");

} // fim-saveQuestionData()

/*
 * Registra um clique para link externo
 * Parametros:
 *  - link: link externo que sera aberto
 */
function registryExternalLink(link)
{
    // envia a chamada ajax
    $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'registryExternalLink', link: link, pagina: location.href });

} // fim-registryExternalLink()
