function FiltroInlogOverrideFuncions() {
    this.Limpar = null;
    this.Filtrar = null;
}
//data: objeto filtro gerado pela classe FiltroInlog.cs
//target: id da div principal do filtro
//GridInlog: instancia do objeto GridInlog.js
function FiltroInlog(data, target, gridInlog, functions) {

    var mSelf = this;

    mSelf.Itens = data;

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

    mSelf.Init = function () {
        if (functions)
            for (var func in functions) {
                if (func != null && functions[func] != null) {
                    mSelf[func + "Old"] = mSelf[func];
                    mSelf[func] = functions[func];
                }
            }

        $("#" + target).filtroDDS(mSelf.EventoFiltroDDS);
    };

    //carrega todos os itens 
    mSelf.CarregarItensFiltro = function (limpar) {
        ko.utils.arrayForEach(Object.keys(mSelf.Itens), function (i) {
            if (i != "__ko_mapping__") {
                var item = mSelf.Itens[i];
                if (!limpar)
                    item.ListaItensFiltro = ko.observableArray([]);
                item.ListaItensFiltro(mSelf.MappingListItem(i, limpar));
            }
        });
    };

    //Atualizar Itens
    mSelf.AtualizarItens = function (data) {
        ko.utils.arrayForEach(Object.keys(mSelf.Itens), function (i) {
            if (i != "__ko_mapping__") {
                mSelf.Itens[i].ItensFiltro = data[i].ItensFiltro;
            }
        });
        mSelf.CarregarItensFiltro(true);
    };

    //mapping dos item para tipo da tela
    mSelf.MappingListItem = function (lista, limpar) {
        if (limpar != null && limpar) {
            if (mSelf.Itens[lista].TipoFiltro() == 0) {
                mSelf.Itens[lista].ListaItensFiltro.removeAll();
                mSelf.Itens[lista].CountChecked(0);
                mSelf.Itens[lista].Pesquisa("");
            } else if (mSelf.Itens[lista].TipoFiltro() == 1) {
                if (mSelf.Itens[lista].EventoLimpar)
                    mSelf.Itens[lista].EventoLimpar();
            }
        }
        if (mSelf.Itens[lista].TipoFiltro() == 0) {
            var ListItens = function (valor) {
                this.Item = valor;
                this.Visivel = ko.observable(true);

                var IsSelecionado = ko.utils.arrayFilter(mSelf.Itens[lista].ListaItensFiltro(), function (item) {
                    return item.Selecionado() === true && item.Item === valor;
                });
                if (IsSelecionado.length > 0)
                    this.Selecionado = ko.observable(true);
                else
                    this.Selecionado = ko.observable(false);
            };
            return ko.utils.arrayMap(mSelf.Itens[lista].ItensFiltro(), function (item) { return new ListItens(item); });
        }
    };

    //evento de auto complet pesquisar item
    mSelf.AutoCompletGenerico = function (lista, data, evt) {
        ko.utils.arrayForEach(mSelf.Itens[lista].ListaItensFiltro(), function (row) {
            if (row.Item.toUpperCase().indexOf(mSelf.Itens[lista].Pesquisa().toUpperCase()) > -1) {
                row.Visivel(true);
                return;
            }
            row.Visivel(false);
        });
    };

    //evento de selecionar um item
    mSelf.ChangeItemSelecionado = function (lista, data, evt) {
        var item = mSelf.Itens[lista].CountChecked;
        if (evt.target.checked)
            item(item() + 1);
        else
            item(item() - 1);

        if (item() == 0) {
            var elemento = $("#filtro-" + evt.target.parentNode.parentNode.parentNode.parentNode.className).next();
            mSelf.EventoFiltroDDS(elemento);
        }
    };

    //evento chamando pelo filtro dds
    mSelf.EventoFiltroDDS = function (elemento) {
        if (elemento[0] != undefined) {
            var item = elemento.attr("data-item").replace("item-", "");
            $("#checkbox-" + item).attr("checked", false);

            //limpa todos os itens da lista
            if (mSelf.Itens[item].TipoFiltro() == 0) {
                ko.utils.arrayForEach(mSelf.Itens[item].ListaItensFiltro(), function (item) {
                    item.Selecionado(false);
                });
                mSelf.Itens[item].CountChecked(0);
            } else if (mSelf.Itens[item].TipoFiltro() == 1) {
                //limpar filtro personalizado
                if (mSelf.Itens[item].EventoLimpar)
                    mSelf.Itens[item].EventoLimpar();
            }
            mSelf.EventoFiltroDDS(elemento.next());
        }
        return;
    };

    //seleciona todos os item da lista
    mSelf.SelecionarTodos = function (lista, data, evt) {
        //seleciona todos os itens
        ko.utils.arrayForEach(mSelf.Itens[lista].ListaItensFiltro(), function (item) {
            if (evt.target.checked && item.Visivel())
                item.Selecionado(true);
            else
                item.Selecionado(false);
        });
        if (evt.target.checked) {
            mSelf.Itens[lista].CountChecked(mSelf.Itens[lista].ListaItensFiltro().length);
        } else {
            //limpa todos item filhos
            var elemento = $("#filtro-" + evt.target.parentNode.parentNode.parentNode.parentNode.className).next();
            mSelf.Itens[lista].CountChecked(0);
            mSelf.EventoFiltroDDS(elemento);
        }

        $('#btnFiltrar').prop('disabled', false);
    };

    //evento limpar geral
    mSelf.EventoLimpar = function () {
        $(".loading-div").fadeIn("fast", function () {
            mSelf.Limpar();
            $("#" + target).filtroDDS(mSelf.EventoFiltroDDS);
            $(".loading-div").fadeOut();
        });
    };

    //evento filtrar geral
    mSelf.EventoFiltrar = function () {
        if (!$('#btnFiltrar').prop('disabled')) {
            $(".loading-div").fadeIn("fast", function () {
                mSelf.Filtrar();
                $("#" + target).filtroDDS(mSelf.EventoFiltroDDS);
            });
        }
    };

    mSelf.RegistrarFiltroDDS = function () {
        $("#" + target).filtroDDS(mSelf.EventoFiltroDDS);
    };

    //retorna todos os filtros selecionados
    mSelf.RecuperaFiltrosSelecionados = function () {
        var itens = $(".lista-b li");
        var filtros = [];
        ko.utils.arrayForEach(itens, function (item) {
            filtros.push(item.attributes["data-item"].value.replace("item-", ""));
        });
        return filtros;
    };

    //Aplicar filtro default
    mSelf.AplicarFiltroGrid = function (filtro, data) {
        var resultado = [];

        if ($("#filtro-item-" + filtro).attr("class").indexOf('desativado') > -1)
            return;

        if (mSelf.Itens[filtro].TipoFiltro() == 0)
            resultado = mSelf.FiltroArrayGenerico(filtro);
        else if (mSelf.Itens[filtro].TipoFiltro() == 1 && mSelf.Itens[filtro].EventoFiltrar)
            resultado = mSelf.Itens[filtro].EventoFiltrar(mSelf.DataGrid());

        if (resultado != null)
            return resultado;
    };

    // FiltroArrayGenerico
    mSelf.FiltroArrayGenerico = function (campoLista) {
        var tiposSelecionados = ko.utils.arrayFilter(mSelf.Itens[campoLista].ListaItensFiltro(), function (item) {
            return item.Selecionado() === true;
        });

        var tipos = ko.utils.arrayMap(tiposSelecionados, function (item) { return item["Item"].toString() });

        if (tiposSelecionados.length > 0) {
            return $.grep(mSelf.DataGrid(), function (veic, indice) {
                if (veic[campoLista]() != null)
                    return $.inArray(veic[campoLista]().toString(), tipos) > -1;
            });
        }
        else
            return mSelf.DataGrid();
    };

    // Atualiza contexto filtro
    mSelf.AtualizaContexto = function (limpar) {
        ko.utils.arrayForEach(Object.keys(mSelf.Itens), function (i) {
            if (i != "__ko_mapping__") {
                var item = mSelf.Itens[i];
                if (item.TipoFiltro() == 0) {
                    if (gridInlog) {
                        var values = gridInlog.GetDistinctValues(i);
                        var linhas = ko.utils.arrayFilter(item.ListaItensFiltro(), function (iList) {
                            return values.indexOf(iList.Item) == -1;
                        });
                        ko.utils.arrayForEach(linhas, function (iList) {
                            iList.Visivel(false);
                        });
                    }
                }
            }
        });
    };

    // formata template html
    mSelf.Formatter = function (item, valor) {
        var template = item.Formatter();
        while (template.indexOf("{value}") > -1) {
            template = template.replace("{value}", valor);
        }
        return template;
    };

    // Eventos Override 
    mSelf.Limpar = function () {
        mSelf.CarregarItensFiltro(true);
        if (gridInlog)
            gridInlog.ResetarGrid();
        $(".loading-div").fadeOut();
    };

    mSelf.Filtrar = function () {
        if (gridInlog && gridInlog.Data) {

            mSelf.DataGrid(gridInlog.DataFiltrado());
            var lstColunaSelecao = mSelf.RecuperaFiltrosSelecionados();

            ko.utils.arrayForEach(lstColunaSelecao, function (itemFiltro) {
                mSelf.DataGrid(mSelf.AplicarFiltroGrid(itemFiltro, mSelf.DataGrid()));
            });

            gridInlog.AtualizarGridFiltrada(mSelf.DataGrid());

            mSelf.AtualizaContexto();
        }
        $(".loading-div").fadeOut();
    };

    mSelf.CarregarItensFiltro();
}
