function FiltroDemandaViewModel(filtro, gridInlog) {
    const mSelf = this;
    mSelf.FiltroInlog = null;
    mSelf.Functions = null;

    mSelf.Filtrado = ko.observable(false);

    mSelf.Init = () => {
        mSelf.Functions = new FiltroInlogOverrideFuncions();
        mSelf.Functions.Filtrar = mSelf.Filtrar;
        mSelf.Functions.Limpar = mSelf.Limpar;

        filtro['DataAberturaDemanda'].DataItemPersonalizado = ItemFitroDataAberturaDemanda;
        filtro['DataTerminoDemanda'].DataItemPersonalizado = ItemFitroDataTerminoDemanda;

        mSelf.FiltroInlog = new FiltroInlog(filtro, 'filtroDemandas', gridInlog, mSelf.Functions);
        vm.Perspectiva.FiltroDemandas(mSelf.FiltroInlog);
        mSelf.FiltroInlog.Init();
    };

    mSelf.Filtrar = () => {
        const lstColunaSelecao = mSelf.FiltroInlog.RecuperaFiltrosSelecionados();

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

        mSelf.Filtrado(true);
        if (lstColunaSelecao.indexOf('DataAberturaDemanda') > -1) {
            mSelf.FiltroInlog.Itens['DataAberturaDemanda']
                .EventoFiltrar(gridInlog, mSelf.FiltroInlog, mSelf.Functions);
        }
        else if (lstColunaSelecao.indexOf('DataTerminoDemanda') > -1) {
            mSelf.FiltroInlog.Itens['DataTerminoDemanda']
                .EventoFiltrar(gridInlog, mSelf.FiltroInlog, mSelf.Functions);
        }
        else {
            if (mSelf.FiltroInlog.VerificarFiltro(lstColunaSelecao)) {
                //FiltrarOld é a funcão default do componente filtro, caso a mesma foi feita override
                mSelf.FiltroInlog.FiltrarOld();

                vm.currentMap.toggleMarkers(false, 'demandas');
                ko.utils.arrayForEach(gridInlog.DataFiltrado(),
                    (item) => vm.currentMap.toggleMarkers(true, 'demandas', (marker) => marker.Codigo === item.Codigo()));

                vm.Perspectiva.QtdDemandas('(' + gridInlog.DataFiltrado().length + '/' + gridInlog.Data().length + ')');
            } else {
                vm.ShowMensagemAlerta('Não há resultados para a pesquisa solicitada!');
                $('.loading-div').fadeOut();

                mSelf.Filtrado(false);
            }
        }
        $('.content-sidebar-menu').hide();
    };

    mSelf.Limpar = () => {
        mSelf.FiltroInlog.LimparOld();
        vm.currentMap.toggleMarkers(true, 'demandas');
        vm.Perspectiva.QtdDemandas('(' + gridInlog.Data().length + ')');

        mSelf.Filtrado(false);
    };

    mSelf.Init();
}

function ItemFitroDataAberturaDemanda() {
    const mSelf = this;
    mSelf.DataInicial = ko.observable();
    mSelf.DataFinal = ko.observable();
    mSelf.HoraInicial = ko.observable('00:00');
    mSelf.HoraFinal = ko.observable('00:00');

    mSelf.EventoLimpar = () => {
        mSelf.DataInicial('');
        mSelf.DataFinal('');
        mSelf.HoraInicial('00:00');
        mSelf.HoraFinal('00:00');
    };

    mSelf.EventoFiltrar = (gridInlog, filtroInlog) => {
        const dataInicial = mSelf.HoraInicial() ? mSelf.DataInicial() + 'T' + mSelf.HoraInicial() : mSelf.DataInicial();
        const dataFinal = mSelf.HoraFinal() ? mSelf.DataFinal() + 'T' + mSelf.HoraFinal() : mSelf.DataFinal();

        if (!mSelf.DataFinal() || !mSelf.DataInicial()) {
            vm.ShowMensagemAlerta('Favor preencher a Data Inicial e a Data Final.');

        } else if (dataInicial >= dataFinal) {
            vm.ShowMensagemAlerta('A Data Final deve ser maior que a Data Inicial.');

        } else {
            const url = `${urlGlobal}DemandaTarefa/Demanda/CarregarGridDemandaPorDataAbertura?dataInicial=${dataInicial}&dataFinal=${dataFinal}`;
            $.getJSON(url, (data) => AtualizaDemandas(data, gridInlog, filtroInlog));
        }
        $('.loading-div').fadeOut();
    }

    return mSelf;
}

function AtualizaDemandas(data, gridInlog, filtroInlog) {
    if (data) {
        const itens = data.Data.Data;
        gridInlog.AtualizarDataBase(ko.mapping.fromJS(itens));
        filtroInlog.AtualizarItens(ko.mapping.fromJS(data.Filtro.ItensFiltro));

        $('[type=reset]').click();
        filtroInlog.RegistrarFiltroDDS();

        const item = gridInlog.ProcurarItem(0, 'Codigo');
        if (item[0]) {
            gridInlog.RemoverItemGrid(item[0]);
        }

        vm.Perspectiva.QtdDemandas('(' + gridInlog.Data().length + ')');
        vm.currentMap.removeMarkers('demandas');

        if (gridInlog.Data().length) {
            vm.Perspectiva.SetoresMapa.PlotarDemandas(ko.mapping.fromJS(itens)());
        }
    } else {
        vm.ShowMensagemAlerta('Não há resultados para a pesquisa solicitada!');
    }
}

function ItemFitroDataTerminoDemanda() {
    const mSelf = this;
    mSelf.DataInicial = ko.observable();
    mSelf.DataFinal = ko.observable();
    mSelf.HoraInicial = ko.observable('00:00');
    mSelf.HoraFinal = ko.observable('00:00');

    mSelf.EventoLimpar = () => {
        mSelf.DataInicial('');
        mSelf.DataFinal('');
        mSelf.HoraInicial('00:00');
        mSelf.HoraFinal('00:00');
    };

    mSelf.EventoFiltrar = (gridInlog, filtroInlog) => {
        const dataInicial = mSelf.HoraInicial() ? `${mSelf.DataInicial()}T${mSelf.HoraInicial()}` : mSelf.DataInicial();
        const dataFinal = mSelf.HoraFinal() ? `${mSelf.DataFinal()}T${mSelf.HoraFinal()}` : mSelf.DataFinal();

        if (!mSelf.DataFinal() || !mSelf.DataInicial()) {
            vm.ShowMensagemAlerta('Favor preencher a Data Inicial e a Data Final.');

        } else if (dataInicial >= dataFinal) {
            vm.ShowMensagemAlerta('A Data Final deve ser maior que a Data Inicial.');

        } else {
            const url = `${urlGlobal}DemandaTarefa/Demanda/CarregarGridDemandaPorDataTermino?dataInicial=${dataInicial}&dataFinal=${dataFinal}`;
            $.getJSON(url, (data) => AtualizaDemandas(data, gridInlog, filtroInlog));
        }
        $('.loading-div').fadeOut();
    }

    return mSelf;
}