function ListaAlarmeModel() {
    "use strict";
    var mSelf = this,
        o = arguments[0] || [],
        RegrasOrigens = regrasOrigensTratamentoMassa;

    mSelf.Alarmes = ko.observableArray(o);
    mSelf.IsTratamentoMassa = ko.observable(false);

    mSelf.TipoAlarmeSelecionado = ko.observable(-1);
    mSelf.TipoAlarmeSelecionado.subscribe(function (newValue) {
        var isVisible = true,
            isMultiTratamento = typeof (newValue) !== "undefined";

        ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
            isVisible = true;
            item.MultiTratamento(true);
            if (newValue) {
                isVisible = item.RegraOrigem() == newValue;
                item.MultiTratamento(isVisible && isMultiTratamento);
            }
        });
    });

    mSelf.TiposAlarmes = ko.computed(function () {
        var tipos = [],
            i = null;

        ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
            i = { Text: item.Descricao(), Value: item.RegraOrigem() };
            if (Contains(RegrasOrigens, i.Value))
                if (!Contains(tipos, i.Value))
                    tipos.push(i);
        });

        return tipos;
    });

    mSelf.MultiTratamento = ko.computed(function () {
        var tipo = mSelf.TipoAlarmeSelecionado(),
            count = 0;
        if (tipo == null || typeof (tipo) !== "undefined") {
            ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
                item.TratarIndividual(true);
                if (item.Selecionado() || item.RegraOrigem() == tipo) {
                    count++;
                }
            });
            if (count > 1) {
                ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
                    item.TratarIndividual(false);
                });
            }
        }
        return count > 0;
    });

    mSelf.TrataEmMassa = ko.computed(function () {
        return mSelf.IsTratamentoMassa();
    });

    mSelf.NaoTrataEmMassa = ko.computed(function () {
        return mSelf.IsTratamentoMassa() == false;
    });

    mSelf.AllChecked = ko.computed({
        read: function () {
            var tipo = mSelf.TipoAlarmeSelecionado(),
                firstUnchecked = null;

            if (tipo !== null && tipo > 0) {
                if (mSelf.Alarmes().length == 0)
                    return false;

                firstUnchecked = ko.utils.arrayFirst(mSelf.Alarmes(), function (item) {
                    return item.RegraOrigem() == tipo && item.Selecionado() == false;
                });

                return firstUnchecked == null;
            }
            return false;
        },
        write: function (value) {
            ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
                if (item.RegraOrigem() == mSelf.TipoAlarmeSelecionado())
                    item.Selecionado(value);
            });
        },
        owner: mSelf
    });

    mSelf.TratarAlarmes = function () {
        var tipo = mSelf.TipoAlarmeSelecionado(),
            selecionados = [],
            status = "P";

        ko.utils.arrayForEach(mSelf.Alarmes(), function (item) {
            if (item.Selecionado() && item.RegraOrigem() == tipo) {
                status = item.Status();
                selecionados.push(new TratarGrupoAlarmesViewModel({
                    Codigo: item.Codigo(),
                    CodigoLinha: item.CodigoLinha(),
                    CodigoTerminalOcorrencia: item.CodigoRegistroTerminalOcorrenc()
                }));
            }
        });

        if (selecionados.length == 1) {
            var a = ko.utils.arrayFirst(mSelf.Alarmes(), function (item) {
                return item.Selecionado() && item.RegraOrigem() == tipo;
            });
            a.TratarAlarme();
        } else if (selecionados.length > 1) {
            a = new AlarmeViewModel({
                Codigo: -1,
                CodigoLinhaGrupoAlarmes: -1,
                RegraOrigem: tipo,
                CodigoRegistroTerminalOcorrenc: -1,
                Status: status
            });

            tempoRealVM.tratarAlarmeModel.tratar(a, selecionados);
        }
    };

    mSelf.addData = function (data) {
        mSelf.TipoAlarmeSelecionado(null);
        if (data != undefined && data.length > 0) {
            var newItems = ko.utils.arrayMap(data, function (item) {
                return new AlarmeViewModel(item);
            });
            mSelf.Alarmes.push.apply(mSelf.Alarmes, newItems);
        }
    };

    mSelf.PodeSelecionar = function (regraOrigem) {
        mSelf.TipoAlarmeSelecionado(regraOrigem);

        var a = ko.utils.arrayFirst(mSelf.Alarmes(), function (item) {
            return item.Selecionado() && item.RegraOrigem() == mSelf.TipoAlarmeSelecionado();
        });

        if (a === null)
            mSelf.TipoAlarmeSelecionado(null);

        return mSelf.TipoAlarmeSelecionado() === regraOrigem;
    };

    function Contains(array, search) {
        var contains = false;
        for (var i = 0; i < array.length; i++) {
            if (typeof (array[i]) === "object") {
                for (var x in array[i])
                    if (array[i][x] == search)
                        return true;
            } else {
                if (array[i] == search)
                    return true;
            }

        }
        return false;
    }
}