function FerramentaFiltro(filtro, gridInlog) {

    var mSelf = this;
    mSelf.FiltroInlog = null;
    mSelf.Functions = null;

    mSelf.Init = function () {

        mSelf.Functions = new FiltroInlogOverrideFuncions();
        mSelf.Functions.Filtrar = mSelf.Filtrar;
        //mSelf.Functions.Limpar = mSelf.Limpar;

        filtro["DataHoraUltimoPeriodico"].DataItemPersonalizado = ItemFitroDataHora;
        filtro["VelocidadeDisplay"].DataItemPersonalizado = ItemFitroVelocidade;
        filtro["TempoParado"].DataItemPersonalizado = ItemFitroTempoParado;

        filtro["StatusIgnicao"].Formatter(mSelf.FormatterIgnicao);
        filtro["StatusConectado"].Formatter(mSelf.FormatterAVLConectado);

        mSelf.FiltroInlog = new FiltroInlog(filtro, "filtroSetores", gridInlog, mSelf.Functions);
        vm.Perspectiva.Filtro(mSelf.FiltroInlog);
        mSelf.FiltroInlog.Init();

        if (vm.Perspectiva.CarregarFuncoes())
            HabilitaFuncoes();
        else
            vm.Perspectiva.CarregarFuncoes(true);
    };

    mSelf.Filtrar = function () {
        var lstColunaSelecao = mSelf.FiltroInlog.RecuperaFiltrosSelecionados();

        if (lstColunaSelecao.length == 0) {
            vm.ShowMensagemAlerta("Não há resultados para a pesquisa solicitada!");
            $(".loading-div").fadeOut();
            return;
        }

        mSelf.FiltroInlog.FiltrarOld();
    };

    mSelf.FormatterIgnicao = function (value) {
        if (value == "L")
            return '<span class="green"><span class="icon-switch"></span> Ligado</span>';
        else if (value == "D")
            return '<span class="red"><span class="icon-switch"></span> Desligado</span>'
        else
            return '<span class="icon-switch"> Desconhecida</span>';
    };

    mSelf.FormatterAVLConectado = function (value) {
        if (value == "T")
            return '<span class="green"><span class="icon-checkmark"></span> Conectado</span>';
        else
            return '<span class="red"><span class="icon-notification"></span> Desconectado</span>';
    };

    mSelf.Init();
}

function ItemFitroDataHora() {
    var mSelf = this;
    mSelf.Data = ko.observable();
    mSelf.Hora = ko.observable("00:00");
    mSelf.DataHoraCheck = ko.observable("Maior");

    mSelf.EventoLimpar = function () {
        mSelf.Data("");
        mSelf.Hora("00:00");
    };

    mSelf.EventoFiltrar = function (gridInlog, filtroInlog, funcions) {

        var data = new Date(mSelf.Data() + " " + mSelf.Hora());

        if (data == 'Invalid Date') {
            vm.FecharTodosMensagemAlerta();
            vm.ShowMensagemAlerta("Por favor, informe uma data para filtrar.");
            return;
        }

        var lista = ko.utils.arrayFilter(gridInlog, function (item) {
            if (item.DataHora() != null) {
                var dt = new Date(item.DataHora().replace("T", " "));
                if (mSelf.DataHoraCheck() == "Maior") {
                    if (dt >= data)
                        return item;
                } else {
                    if (dt <= data)
                        return item;
                }
            }
        });

        filtroInlog.AdicionaItensFiltrados({ Data: data, Opcao: mSelf.DataHoraCheck() }, "DataHoraUltimoPeriodico");

        return lista;
    }

    return mSelf;
}

function ItemFitroVelocidade() {
    var mSelf = this;
    mSelf.Velocidade = ko.observable("");
    mSelf.VelocidadeFinal = ko.observable("");

    mSelf.EventoLimpar = function () {
        mSelf.Velocidade("");
        mSelf.VelocidadeFinal("");
    }

    mSelf.EventoFiltrar = function (gridInlog, filtroInlog, funcions) {
        if (mSelf.Velocidade() == "" || mSelf.VelocidadeFinal() == "") {
            vm.ShowMensagemAlerta("Por favor, informe a velocidade final e inicial para filtrar.");
            return;
        }
        if (parseInt(mSelf.Velocidade()) > parseInt(mSelf.VelocidadeFinal())) {
            vm.ShowMensagemAlerta("A velocidade inicial deve ser menor que a velocidade final.");
            return;
        }

        var lista = ko.utils.arrayFilter(gridInlog, function (item) {
            if (item.Velocidade() != null) {
                if (item.Velocidade() >= mSelf.Velocidade() && item.Velocidade() <= mSelf.VelocidadeFinal())
                    return item;
            }
        });

        filtroInlog.AdicionaItensFiltrados({ VelocidadeInicio: mSelf.Velocidade(), VelocidadeFim: mSelf.VelocidadeFinal() }, "VelocidadeDisplay");

        return lista;
    }

    return mSelf;
}

function ItemFitroTempoParado() {
    var mSelf = this;
    mSelf.AcimaDe = ko.observable("true");
    mSelf.Tempo = ko.observable("");
    mSelf.TipoTempoParado = ko.observable(1);

    mSelf.EventoLimpar = function () {
        mSelf.AcimaDe("true");
        mSelf.Tempo("");
        mSelf.TipoTempoParado = ko.observable(1);
    };

    mSelf.EventoFiltrar = function (gridInlog, filtroInlog, funcions) {
        var valido;

        if (mSelf.TipoTempoParado() == 3) {
            $("#tempoparado-data").val() != "" ? valido = true : valido = false;
            mSelf.Tempo($("#tempoparado-data").val());
        }
        else {
            $("#tempoparado-time").val() != "" ? valido = true : valido = false;
            mSelf.Tempo($("#tempoparado-time").val());
        }

        if (gridInlog.length < 1)
            vm.ShowMensagemAlerta("A consulta não retornou resultados.");

        if (valido) {
            var params = {
                listaGrid: ko.toJS(gridInlog),
                acima: mSelf.AcimaDe(),
                tipo: mSelf.TipoTempoParado(),
                tempo: mSelf.Tempo()
            };

            filtroInlog.AdicionaItensFiltrados({ Opcao: mSelf.AcimaDe(), Tipo: mSelf.TipoTempoParado().toString(), Tempo: mSelf.Tempo().toString() }, "TempoParado");

            return mSelf.ConsultarFiltro(params);

        } else {
            vm.ShowMensagemAlerta("Preencha corretamente o tempo parado.");
        }
    };

    mSelf.ConsultarFiltro = function (params) {
        var retorno = null;
        $.ajax({
            url: urlGlobal + "SetoresShape/SetoresShape/FiltrarTempoParado",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(params),
            async: false,
            //beforeSend: function () {
            //    $(".loading-div").fadeIn();
            //},
            success: function (data) {
                //$(".loading-div").fadeOut();
                retorno = ko.mapping.fromJS(data);

                if (data.length < 1)
                    vm.ShowMensagemAlerta("A consulta não retornou resultados.");
            }
        });

        return retorno();
    }

    return mSelf;
}