function ViewModel(perspectiva, data, codigo) {

    var mSelf = this;
        
    mSelf.Codigo = null;
    mSelf.Origem = null;
    mSelf.MostrarMsgRdAdicionada = ko.observable(false);
    mSelf.MsgRd = ko.observable("");
    mSelf.Modulos = ko.observableArray([]);
    mSelf.Ferramentas = ko.observableArray([]);

    mSelf.ModulosLaterais = ko.observableArray([]);

    mSelf.Perspectiva = new window[perspectiva](mSelf, data, codigo);

    mSelf.Conteudos = ko.observableArray([]);

    mSelf.ConteudosRodape = ko.observableArray([]);

    mSelf.Breadcumbs = ko.observableArray([]);

    mSelf.MensagensAlerta = ko.observableArray([]);

    mSelf.Titulo = ko.observable("");

    mSelf.UsuarioLogado = ko.observable();

    mSelf.EmpresaUsuarioLogado = ko.observable();

    mSelf.Init = function () {

        mSelf.Perspectiva.Init();
    }

    mSelf.FuncionalidadesCarregadas = ko.observableArray([]);

    mSelf.LoadingOff = function () {
        $(".loading-inlog").fadeOut(500);
    };

    mSelf.LoadingIn = function () {
        $(".loading-inlog").fadeOut(500);
    };

    mSelf.FuncionalidadesCarregadasAtualizar = function (nome) {
        var todosOk = 0;
        ko.utils.arrayForEach(mSelf.FuncionalidadesCarregadas(), function (func) {
            if (func.Name == nome)
                func.Carregado = true;

            if (func.Carregado)
                todosOk++;
        });

        if (mSelf.FuncionalidadesCarregadas().length == todosOk) {
            $(".loading-inlog").fadeOut(500);
            mSelf.FuncionalidadesCarregadas.removeAll();
        }
    };

    mSelf.CarregarFuncionalidades = function (funcionalidades, onSuccess) {
        ko.utils.arrayForEach(funcionalidades(), function (func) {
            mSelf.FuncionalidadesCarregadas.push({Name: func.url, Carregado: false});
            if (func.url) {
                $.ajax({
                    url: func.url,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    data: func.data,
                    type: "GET",
                    beforeSend: () => $('.loading-div').fadeIn(),
                    success: onSuccess,
                    complete: function () {
                        $('.loading-div').fadeOut();
                        mSelf.FuncionalidadesCarregadasAtualizar(func.url);
                    }
                });
            } else {
                $.ajax({
                    url: func.url,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    type: "GET",
                    beforeSend: () => $('.loading-div').fadeIn(),
                    success: onSuccess,
                    complete: function () {
                        $('.loading-div').fadeOut();
                        mSelf.FuncionalidadesCarregadasAtualizar(func.url);
                    }
                });
            }
        });
    };

    mSelf.GetModulo = function (identificador) {
        return ko.utils.arrayFirst(mSelf.Modulos(), function (modulo) {
            if (modulo.ModuloId() == identificador) {
                return modulo;
            }
        });
    };

    mSelf.GetConteudo = function (identificador) {
        return ko.utils.arrayFirst(mSelf.Conteudos(), function (conteudo) {
            if (conteudo.ConteudoId() == identificador) {
                return conteudo;
            }
        });
    };

    mSelf.GetModuloMenuLateral = function (identificador) {
        return ko.utils.arrayFirst(mSelf.ModulosLaterais(), function (modulo) {
            if (modulo.ModuloId() == identificador) {
                return modulo;
            }
        });
    };

    mSelf.GetFerramenta = function (identificador) {
        return ko.utils.arrayFirst(mSelf.Ferramentas(), function (ferramenta) {
            if (ferramenta.FerramentaId() == identificador) {
                return ferramenta;
            }
        });
    };

    mSelf.TrocarPerspectiva = function (novaPerspectiva) {
        $(".loading-inlog").fadeIn(500, function(){

            if (novaPerspectiva != null) {
                mSelf.Perspectiva.Destroy();

                delete mSelf.Perspectiva;

                mSelf.Perspectiva = novaPerspectiva;

                mSelf.Perspectiva.Init();
            }
        });
    };

    mSelf.FecharMensagemAlerta = function (index, data, evt) {
        mSelf.MensagensAlerta.splice(index, 1);
    };

    mSelf.FecharTodosMensagemAlerta = function () {
        mSelf.MensagensAlerta.removeAll();
    };

    mSelf.ShowMensagemSucesso = function (mensagem) {
        mSelf.FecharTodosMensagemAlerta();
        mSelf.MensagensAlerta.push({ Mensagem: mensagem, Titulo: 1 });
    };

    mSelf.ShowMensagemInformacao = function (mensagem) {
        mSelf.FecharTodosMensagemAlerta();
        mSelf.MensagensAlerta.push({ Mensagem: mensagem, Titulo: 2 });
    };

    mSelf.ShowMensagemAlerta = function (mensagem) {
        mSelf.FecharTodosMensagemAlerta();
        mSelf.MensagensAlerta.push({ Mensagem: mensagem, Titulo: 3 });
    };

    mSelf.ShowMensagemErro = function (mensagem) {
        mSelf.FecharTodosMensagemAlerta();
        mSelf.MensagensAlerta.push({ Mensagem: mensagem, Titulo: 4 });
    };

    mSelf.OpenSobre = function () {
        window.open(urlGlobal + "Sobre/", "_blank");
    };

    mSelf.TextoDialog = ko.observable();

    mSelf.ConsultaUsuarioLogado = function () {
        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ConsultaUsuarioLogado",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            beforeSend: () => $('.loading-div').fadeIn(),
            success: function(ret){
                if (ret) {
                    var usuario = ko.mapping.fromJS(ret);

                    mSelf.UsuarioLogado(usuario.UsuarioNome());
                    mSelf.EmpresaUsuarioLogado(usuario.Empresa());
                }
            },
            complete: () => $('.loading-div').fadeOut()
        });
    };
}

function abrirDialogModal(options, titulo, mensagem) {
    vm.TextoDialog(mensagem);
    
    options = options != null ? options :  {
        resizable: false,
        height: 190,
        modal: true,
        buttons: {
            "Fechar": function () {
                $(this).dialog("close");
            }
        }
    };
    options.title = titulo;

    $("#dialog-confirm").dialog(options);
}