function SF(){

    this.loadingMsg = "Aguarde...";
    
    this.tinyMCEClass = "editor"; // classe dos editores tinyMCE para ser tratada de forma diferente 
    /**
     * Obtem o um arry associativo com todos os dados de um formulÃ¡rio, esta funÃ§Ã£o
     * Ã© destinada para
     * @param form HTMLFormElement
     * @param camposNomeArray Array
     * @return Array
     */
    this.arrayFromForm = function(form, camposNomeArray){
        var dataArray = {};
        
        
        formId = $(form).attr("id");
        
        for (var i = 0; i < camposNomeArray.length; i++) {
        
            try {
            
                if ($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').is("[type='radio']")) {
                    if ($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]:checked').val() != undefined) {
                        dataArray[camposNomeArray[i]] = $('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]:checked').val();
                    }
                }
                else {
                
                    nomeIsArray = camposNomeArray[i].substr(-2, 2);
                    var isArray = false;
                    if (nomeIsArray == "[]") {
                        isArray = true;
                    }
                    
                    if ($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').is("[type='checkbox']")) {
                    
                        var items = [];
                        
                        $('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]:checked').each(function(){
                            items.push($(this).val());
                        });
                        
                        dataArray[camposNomeArray[i]] = items;
                        //dataArray[camposNomeArray[i]].push($('#' + form.id + " " +  '[@name="'+camposNomeArray[i]+'[]"]:checked').val());
                    
                    }
                    else {
                    
                        if ($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').is("." + this.tinyMCEClass)) {
                            dataArray[camposNomeArray[i]] = tinyMCE.get(($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').attr("id"))).getContent();
                            ;
                        }
                        else {
                            if ($('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').val() != undefined) {
                            
                                if (isArray) {
                                    var items = [];
                                    $('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').each(function(){
                                        items.push($(this).val());
                                    });
                                    
                                    dataArray[camposNomeArray[i]] = items.reverse();
                                }
                                else {
                                    dataArray[camposNomeArray[i]] = $('#' + formId + " " + '[name="' + camposNomeArray[i] + '"]').val();
                                }
                                
                            }
                        }
                    }
                    
                }
                
            } 
            catch (ex) {
            
            }
            
        }
        
        
        
        
        return dataArray;
        
    }
    
    
    /**
     * Realiza uma aÃ§Ã£o de POST genÃ©rica a partir de um formulÃ¡rio
     * @param url string caminho para o arquivo que preocessarÃ¡ o formulÃ¡rio
     * @param form HTMLFormElement formulÃ¡rio
     * @param camposNomeArray Array array com o nome dos campos do formulÃ¡rio que serÃ£o processados
     * @param resultElementId id do elemento que receberÃ¡ a resposta
     * @return string
     */
    this.saveForm = function(url, form, camposNomeArray, resultElementId){
    
        dataArray = this.arrayFromForm(form, camposNomeArray);
        
        
        $("#" + resultElementId).html(this.loadingMsg);
        
        $.post(url, dataArray, function(msg){
            $("#" + resultElementId).html(msg);
        });
    }
    
    /**
     * Faz o carregamento de um controlador qualquer de forma assincrona, o
     * resultado do carregamento da URL fica armazenado no elemento ID indicado
     * @param url string url do controlador que serÃ¡ processado (pode ser igual Ã  qualquer outra pÃ¡gina_
     * @param resultElementId string o id de um elemento qualquer que receberÃ¡ os resultados do carregamento
     * @param dataArray Array um array associativo dos valroes que deverÃ£o ser enviados Ã  pÃ¡gina carregada
     * @return void
     *
     */
    this.ajaxLoad = function(url, resultElementId, dataArray){
        $("#" + resultElementId).html(this.loadingMsg);
        $.post(url, dataArray, function(result){
            $("#" + resultElementId).html(result);
        });
    }
    
    /**
     * Faz o carregamento de um controlador qualquer de forma assincrona, o
     * resultado do carregamento da URL fica armazenado no elemento ID indicado
     * @param url string url do controlador que serÃ¡ processado (pode ser igual Ã  qualquer outra pÃ¡gina_
     * @param resultElementId string o id de um elemento qualquer que receberÃ¡ os resultados do carregamento
     * @param dataArray Array um array associativo dos valroes que deverÃ£o ser enviados Ã  pÃ¡gina carregada
     * @return void
     *
     */
    this.ajaxAppend = function(url, resultElementId, dataArray){
        $("#" + resultElementId).html(this.loadingMsg);
        $.post(url, dataArray, function(result){
            $("#" + resultElementId).append(result);
        });
    }
    
    /**
     * Função responsável por chamar um metodo de um controlador, a sintaxe é
     * simples para chamar um metodo de um controlador no href do metodo vc deve
     * colococar um prefixo definido como "::" (dois dois pontos seguidos
     *
     * @param string url
     * @param string resultElementId
     */
    this.callControllerMethodFromAnchor = function(url, resultElementId){
        $.post(url, {}, function(result){
            //alert(resultElementId);
            //$('<div>'+result+'</div>').insertAfter("#"+resultElementId);
            $("#" + resultElementId).html(result);
        });
    }
    
    /**
     * Chama uma função do controlador atual, para ser executada
     * @param string functionsName
     * @param string resultElement
     */
    this.callController = function(functionsName, resultElement){
    
        var resultElementId = "";
        
        if ($(resultElement).length > 0) {
        
            resultElementId = $(resultElement).attr("id");
            
        }
        else {
        
            resultElementId = resultElement;
            
        }
        
        
        
        $("#" + resultElementId).html(this.loadingMsg);
        
        $.post(document.URL + "." + functionsName + ".exit", {}, function(result){
            $("#" + resultElementId).html(result);
        });
    }
    
    
}

sf = new SF();
sf.loadingMsg = "<img src='../media/images/admin/loading.gif' alt='Loading...' title='Aguarde... Carregando' />";


$(document).ready(function(){

    var functionPrefix = "::";
    
    $('a').click(function(e){
    
    
    
        var href = $(this).attr('href');
        
        if (href == undefined) {
            href = $(this).attr('name');
        }
        
        
        if (href.substring(0, 2) == "::") {
            href = href.substring(2);
            
            var pArray = href.split(",");
            
            if (pArray[1] == undefined) {
                var _resultId = $(this).attr('id');
            }
            else {
                var _resultId = pArray[1];
            }
            
            eval('sf.callControllerMethodFromAnchor' + "('" + document.URL + "." + href + ".exit' , '" + _resultId + "'  )");
            
            return false;
            
        }
        
        return true;
        
    });
    
    
    
    
});


