
/*
 * Descricao: Exibe a mensagem AJAX
 */
function showAjaxMessage()
{
    // exibe a mensagem
    userMessage.show('Processando', '<p>Aguarde...</p>', 'loading');
}

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

/*
 * Executa uma funcao Ajax
 */
function execAjaxFunction(params)
{
    // exibe a mensagem de processamento
    showAjaxMessage();
	
	// parametros a serem enviados via url
    var url_params = '';
    
    // funcao callback
    var _callback = '';

    // adiciona os parametros
    for(i in params){

        // verifica se e a espeficicacao da Pagina
        if(i == '__page__'){
            var _page = params['__page__'];
        }

        // verifica se e a especificacao da Funcao
        else if(i == '__function__'){
            var _function = params['__function__'];
        }

        // verifica se e uma callback
        else if(i == '__callback__'){
            _callback = params['__callback__'];
        }

        // verifica se o parametro e um formulario
        else if(i == '__form__'){

            // alias para params['__form__']
            var form = params['__form__'];

            // percorre o formulario
            for(var i = 0; i < form.length; i++){
                if(
                   (form[i].type == 'submit') || 
                   (form[i].type == 'reset')  ||
                   ((form[i].id == 'password') && (form[i].value == ''))
                  ) 
                    continue;
                
                if(form[i].id != 'rep_pw'){
                    url_params += (url_params != '') ? '&' : '';
                    url_params += '_f_';
                    
                    // verifica se o campo tem algum tipo de valor especifico
                    var fvt_pos;
                    if((fvt_pos = form[i].className.search('_fvt_')) >= 0){
                    	url_params += form[i].className.substring(fvt_pos +1) + '_';
                    }

                    url_params += form[i].id + '=';
                    if(form[i].type == 'checkbox')
                        url_params += ((form[i].checked) ? 1 : 0);
                    else if((form[i].id == 'password'))
                    	url_params += md5(form[i].value);
                   else if((form[i].type == 'select-one') && (form[i].value == 'none'))
                    	url_params += ''
                   else
                    	url_params += escape(form[i].value);
                } // fim-if
            } // fim-for
        } // fim-if

        // para parametros genericos
        else {
            url_params += ((url_params != '') ? '&' : '') + i + '=' + escape(params[i]);
        }
    } // fim-for
    
    // verifica se algum parametro de url sera enviado
    if(url_params != '')
    	url_params = '?' + url_params;

    // verifica se a Pagina ou a Funcao nao foram definidas
    if((_page == undefined) || (_function == undefined)){

        // recebe as informacoes enviadas
        var _page     = (_page != undefined)     ? _page     : 'undefinedpage';
        var _function = (_function != undefined) ? _function : 'undefinedfunction';

        // notifica o erro
        $.post(pageRoot + '/execAjaxFunction.php?_page=' + _page + '&_function=' + _function, {_page: 'undefinedpage', _fun: '_Ajax_reportCallError'});

        // exibe a mensagem de erro
        userMessage.show("Failure Executing the Request", "An error occurs processing your request. Try again later.", "alert");

        // retorna
        return;
    }

    // envia a chamada ajax
    $.post(pageRoot + '/execAjaxFunction.php' + url_params, {_page: _page, _fun: _function},
        function(data)
        {
    	    // caso algum erro tenha ocorrido
    	    if(data && data.e_source && data.e_source == 'op_error'){

    	    	// notifica o erro
//    	        $.post(pageRoot + '/execAjaxFunction.php?_page=' + _page + '&_function=' + _function, {_page: 'undefinedpage', _fun: '_Ajax_reportCallError'});
    	    
    	        // exibe a mensagem de erro
    	        userMessage.show(data.title, data.text, data.className);

    	        // retorna a pagina
    	        return;
    	    }

    	    // caso alguma funcao callback tenha sido definida, executa-a
    	    if(_callback) _callback(data);
        }
    , "json");
}


/*
 * Faz logout
 */
function _Ajax_Logout()
{
    // verifica o formulario
    var params = new Array();
    params['__page__']     = 'Login';
    params['__function__'] = '_Ajax_Logoff';
    params['__callback__'] = function(d){
        switch(d.className){
            case 'success':
               location.href = pageRoot;
            break;
            default:
                userMessage.show(d.title, d.text, d.className);
        }
    };
    execAjaxFunction(params);

} // fim-_Ajax_Logout()


/*
 * Carrega um conjunto de dados para preencher um Select
 * Parametros:
 *  - select   : Select que devera ser preenchido
 *  - db_table : Tabela do banco de dados em que os dados serao capturados
 *  - f_name   : Nome do filtro
 *  - f_value  : Valor do filtro
 *  - opt_value: Parametro 'value' dos options
 *  - opt_text : Texto dos options
 *  - order_by : Parametro ORDER BY do SQL
 */
function _Ajax_selectFill(select_id, db_table, f_name, f_value, opt_value, opt_text, order_by)
{
    // limpa o select das localizacoes
    $('#' + select_id).empty();
    
    // adiciona a opcao inicial
    $('#' + select_id).append("<option value=\"none\" selected=\"selected\">- Selecione</option>");

    // opcao nula
    if(f_value == 'none')
        return; 

	// verifica o formulario
    var params = new Array();
    params['__page__']     = 'GeneralAjaxFunctions';
    params['__function__'] = '_Ajax_SelectFill';
    params['__callback__'] = function(d){
        switch(d.className){
            case 'success':

                // recebe as opcoes
                var options = d.options;

                // percorre as opcoes
                for(var i = 0; i < options.length; i++)

                    $('#' + select_id).append("<option value=\"" + options[i][ opt_value ] + "\">" + options[i][ opt_text ] + "</option>");
                
                // esconde a mensagem ajax
                hideAjaxMessage();

            break;
            default: // 'alert' e 'error'
                userMessage.show(d.title, d.text, d.className);
        }
    };
    params['db_table']  = db_table;
    params['f_name']    = f_name;
    params['f_value']   = f_value;
    params['opt_value'] = opt_value;
    params['opt_text']  = opt_text;
    params['order_by']  = order_by;
    execAjaxFunction(params);
}


/*
 * Salva um formulario.
 * Parametros:
 *  - form     : Formulario
 *  - db_table : Tabela do banco de dados em que os dados serao salvos
 *  - callback : Funcao a ser executada apos a operacao Ajax
 *  - action   : Acao a ser executada: 'insert' ou 'update'
 *  - k_name   : Nome da chave
 *  - k_value  : Valor da chave
 */
function _Ajax_Save_Form(form, db_table, callback, action, k_name, k_value)
{
    var params = new Array();
    params['__page__']     = 'GeneralAjaxFunctions';
    params['__function__'] = '_Ajax_Save_Form';
    params['__form__']     = form;
    params['__callback__'] = (callback) ? callback : function(d){ hideAjaxMessage(); };
    params['action']       = (action) ? action : 'insert';
    params['db_table']     = (db_table) ? db_table : '__none__';
    params['k_name']       = (k_name) ? k_name : '__none__';
    params['k_value']      = (k_value) ? k_value : '__none__';
    execAjaxFunction(params);
}


/*
 * Faz Upload de arquivos
 */
function _Ajax_Upload(params)
{
    // verifica se os parametros basicos estao definidos
    if(!params['__up_dir__']){
    	params['__up_dir__'] = '/';
    }
alert('ok');return;
	// Envia os parametros o upload
    for(param in params)
        swfu.addPostParam(param, params[ param ]);

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

} // fim-_Ajax_Upload()


/**
 * Update resource item status
 * 
 * @param strint   $rsc      the resource
 * @param int      $src_id   resource id
 * @param int      $status   status number
 * @param function $callback callback function
 */
function _Ajax_Update_Src_Status(src, src_id, status, callback)
{
	// define callback
    callback = (callback) ? callback : function(d){ hideAjaxMessage(); };
    
    // define the form
    var form = new Array();
    form[0] = {id: 'status', name: 'status', value: status, className: ''}

    // call Save Form function
    _Ajax_Save_Form(form, src, callback, 'update', 'id', src_id)
}


/**
 * Delete resource item
 * 
 * @param strint   $rsc      the resource
 * @param int      $src_id   resource id
 * @param function $callback callback function
 */
function _Ajax_Delete_Src(src, src_id, link_back, callback)
{
	// define o link para retorno
	var link_back = (link_back != undefined) ? link_back : 'javascript:history.go(-1);';
	
	// define callback
    var callback = (callback != undefined) ? callback : function(d){
		if(d.className == 'success'){
			userMessage.show('Exclu&iacute;do', '<p>O item foi exclu&iacute;do com succeso.', 'success', link_back, true);
		}
		else {
			userMessage.show('Erro ao Excluir', '<p>Ocorreu um erro ao tentar processar a opera&ccedil;&atilde;o. Tente novamente mais tarde.</p>', 'error');
		}
	};

    // call Update Src Status
    _Ajax_Update_Src_Status(src, src_id, '2', callback)
}


/**
 * Delete resource item in a list
 * 
 * @param strint   $rsc      the resource
 * @param int      $src_id   resource id
 * @param elem     $elem     list item element
 */
function _Ajax_Delete_List_Item(src, src_id, elem)
{
	// define callback
    var callback = function(d){
		if(d.className == 'success'){
			hideAjaxMessage();
			elem.css('background', '#f00');
			elem.fadeOut('slow');
		}
		else {
			userMessage.show('Delete Fail', '<p>An error occurs processing your request. Try again later.</p>', 'error');
		}
	};

    // call Update Src Status
    _Ajax_Update_Src_Status(src, src_id, '2', callback)
}

/*
 * Login
 */
function _Ajax_Login(email, pw, page_target)
{
    if(email == ''){
        userMessage.show('E-mail N&atilde;o Informado', '<p>Favor informe seu <strong>E-mail</strong>.</p>', 'alert');
        return;
    }
    if(pw == ''){
        userMessage.show('Senha N&atilde;o Informada', '<p>Favor informe sua <strong>Senha</strong>.</p>', 'alert');
        return;
    }
    
    form = {
    		 email: {value: email, type: 'text', id: 'email', name: 'email'},
    		 password: {value: pw, type: 'password', id: 'password', name: 'password'}
    	   };
    
    var params = new Array();
    params['_f_email']     = email;
    params['_f_password']  = md5(pw);
    params['__page__']     = 'Login';
    params['__function__'] = '_Ajax_Login';
    params['__callback__'] = function(d){
        switch(d.className){
            case 'success':
               location.href = page_target;
            break;
            default:
                userMessage.show(d.title, d.text, d.className);
        }
    };
    execAjaxFunction(params);
}


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

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

//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') == '') ) ? $('#titulo').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("page_dir", dir);
 swfu.addPostParam("label", swfu_label);

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

} // fim-upload_photos()

/*
* Apaga alguma foto
*/
function deletePhoto(photo, photo_li, swfu_type, type_url)
{
 // envia a chamada ajax
 $.post(pageRoot + '/generalAjaxFunctions.php', { fun: 'deletePhoto', foto: photo, tipo: swfu_type, tipo_url: type_url },
     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-deletePhoto()

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




/*
 * 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, redir_to)
{
    // 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: 'logins', 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 algum redirecionamento foi especificado
                (redir_to) ? document.location = redir_to : document.location = pageRoot + '/';
            }
        }
    , "json");

} // fim-login()

