function TrocarVeiculoModel() {
    "use strict";
    var mSelf = this,
        currentDate = new Date();

    // observables
    mSelf.FiltroJornada = ko.observable("");
    mSelf.FiltroVeiculo = ko.observable("");
    mSelf.VeiculoAtual = ko.observable("");
    mSelf.Mensagem = ko.observable("");
    mSelf.DataExecucao = ko.observable(currentDate);

    mSelf.VeiculoSelected = ko.observable(null);
    mSelf.JornadaSelected = ko.observable(null);

    // observables arrays
    mSelf.Jornadas = ko.observableArray([]);
    mSelf.Veiculos = ko.observableArray([]);

    mSelf.MostrarMensagem = ko.computed(function () {
        return mSelf.Mensagem().length > 0;
    })

    mSelf.JornadasFiltradas = ko.computed(function () {
        return filtrar(mSelf.Jornadas, "Descricao", mSelf.FiltroJornada);
    }, mSelf);

    mSelf.VeiculosFiltrados = ko.computed(function () {
        return filtrar(mSelf.Veiculos, "Identificador", mSelf.FiltroVeiculo);
    }, mSelf);

    mSelf.Data = ko.computed({
        read: function () {
            return mSelf.DataExecucao().format("yyyy-MM-dd");
        },
        write: function (value) {
            if (value) {
                var date = new Date();

                value = value.split("-");
                currentDate = new Date(
                    value[0],
                    value[1] - 1,
                    value[2],
                    date.getHours(),
                    date.getMinutes(),
                    date.getSeconds(),
                    date.getMilliseconds()
                );
                if (currentDate.getTime() < date.getTime()) {
                    currentDate = date;
                }

                mSelf.DataExecucao(currentDate);
            }
        },
        owner: mSelf
    });

    mSelf.JornadaSelected.subscribe(function (value) {
        var desc = "",
            veic = null;
        if (value) {
            desc = value.Descricao();

            veic = ko.utils.arrayFirst(mSelf.Veiculos(), function (item) {
                return item.Codigo() == value.CodigoVeiculo();
            });
            if (veic != null)
                mSelf.VeiculoAtual(veic.Identificador());
            else
                mSelf.VeiculoAtual("SEM VEÍCULO");
        }
        else
            mSelf.VeiculoAtual("");

        mSelf.VeiculoSelected(null);

        mSelf.FiltroJornada(desc);
    });

    mSelf.VeiculoSelected.subscribe(function (value) {
        var desc = "";
        if (value)
            desc = value.Identificador();
        mSelf.FiltroVeiculo(desc);
    });


    mSelf.LimparFiltroJornada = function () {
        mSelf.FiltroJornada("");
        mSelf.JornadaSelected(null);
    };

    mSelf.LimparFiltroVeiculo = function () {
        mSelf.FiltroVeiculo("");
        mSelf.VeiculoSelected(null);
    }; 

    mSelf.Salvar = function () {
        var send = null;
        if (!mSelf.Data) {
            mSelf.Mensagem("Selecione a Data de Execução!");
            return send;
        }
        if (mSelf.JornadaSelected() == null) {
            mSelf.Mensagem("Selecione a Linha/Tabela/Jornada!");
            return send;
        }
        if (mSelf.VeiculoSelected() == null) {
            mSelf.Mensagem("Selecione o Veículo!");
            return send;
        }
        send = ko.toJS(mSelf.JornadaSelected());
        send.CodigoVeiculo = mSelf.VeiculoSelected().Codigo();
        send.DataExecucao = mSelf.DataExecucao().format("yyyy-MM-dd hh:mm:ss");
        return send;
    }

    function filtrar(array, prop, filter) {
        return ko.utils.arrayFilter(array(), function (item) {
            var f = checkValue(filter(), "");

            if (!f)
                return item;

            return item[prop]().toLowerCase().indexOf(f.toLowerCase()) > -1;
        });
    }
}