function ViewModel(data, clienteBus) {

    var mSelf = this;

    mSelf.ClienteBus = clienteBus;

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

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

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

    mSelf.Perspectiva = new SinoticoVeiculosDetalhesPerspectiva(mSelf);

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

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

    mSelf.Init = function () {
        mSelf.Perspectiva.Init();
    }

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

    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",
                    success: onSuccess,
                    complete: function () {
                        mSelf.FuncionalidadesCarregadasAtualizar(func.url);
                    }
                });
            } else {
                $.ajax({
                    url: func.url,
                    contentType: 'application/json; charset=utf-8',
                    dataType: "json",
                    type: "GET",
                    success: onSuccess,
                    complete: function () {
                        mSelf.FuncionalidadesCarregadasAtualizar(func.url);
                    }
                });
            }
        });
    };

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

    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();

                mSelf.Perspectiva = novaPerspectiva;

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