function FiltroLinhaViewModel() {
    "use strict";
    var mSelf = this;

    mSelf.Ativa = ko.observable(false);
    mSelf.Edicao = ko.observable(false);
    mSelf.Inativa = ko.observable(false);
    mSelf.Filtro = ko.observable(false);

    mSelf.limparFiltro = function () {
        mSelf.Filtro("");
    };

    mSelf.Ativa.subscribe(function (value) {
        storage("ativa", value);
    });
    mSelf.Edicao.subscribe(function (value) {
        storage("edicao", value);
    });
    mSelf.Inativa.subscribe(function (value) {
        storage("inativa", value);
    });
    mSelf.Filtro.subscribe(function (value) {
        storage("filtro", value);
    });

    mSelf.filtrar = function (array, prop) {
        return ko.utils.arrayFilter(array(), function (linha) {
            var ret = true,
                filtro = checkValue(mSelf.Filtro(), "");

            ret = mSelf.Ativa() && mSelf.Edicao() && mSelf.Inativa();

            if (!ret && mSelf.Ativa()) {
                ret = linha.IsAtiva();
            }

            if (!ret && mSelf.Edicao()) {
                ret = linha.IsEdicao();
            }

            if (!ret && mSelf.Inativa()) {
                ret = linha.IsInativa();
            }

            if (filtro.length > 0) {
                //ret &= linha.DescricaoLinha().toLowerCase().indexOf(filtro.toLowerCase()) > -1;
                try {
                    var regex = new RegExp(filtro.toLowerCase(), "gi"),
                        desc = linha.DescricaoLinha().toLowerCase();

                    ret &= regex.test(desc);
                } catch (e) {
                    ret &= false;
                }
            }

            return ret;
        });
    }

    function init() {
        var ativa = storage("ativa"),
            edicao = storage("edicao"),
            inativa = storage("inativa"),
            filtro = storage("filtro");

        if (isUndefined(ativa))
            ativa = false;
        else
            ativa = ativa === "true";

        if (isUndefined(edicao))
            edicao = true;
        else
            edicao = edicao === "true";

        if (isUndefined(inativa))
            inativa = false;
        else
            inativa = inativa === "true";

        if (isUndefined(filtro))
            filtro = "";

        mSelf.Ativa(ativa);
        mSelf.Edicao(edicao);
        mSelf.Inativa(inativa);
        mSelf.Filtro(filtro);
    }
    init();
}
