function TratarAlarmeViewModel() {
    // fields
    var mSelf = this;

    mSelf.IsMultiTratamentoAlarmes = ko.observable();
    mSelf.LastData = {};
    mSelf.CodigosAlarmes = ko.observableArray([]);
    mSelf.StatusAlarme = ko.observable();
    mSelf.Edicao = ko.observable();

    mSelf.Justificativas = ko.observableArray();
    mSelf.JustificativaSelecionada = ko.observable();

    mSelf.JustificativasInvalidacao = ko.observableArray();
    mSelf.JustificativaInvalidacaoSelecionada = ko.observable();

    mSelf.Observacao = ko.observable("");
    mSelf.Status = ko.observable("");
    mSelf.StatusSelecionado = ko.observable("");
    mSelf.Status = ko.observable("");
    mSelf.ConnectionID = "";
    mSelf.Valido = ko.observable(false);
    mSelf.Invalido = ko.observable(false);
    mSelf.CodigoAlarme = ko.observable(0);

    // computed observables

    mSelf.Abonar = ko.computed(function () {
        var retorno = true;
        retorno = retorno && mSelf.StatusSelecionado() !== null;
        retorno = retorno && mSelf.StatusSelecionado() === "A";
        return retorno;
    });

    mSelf.Penalizar = ko.computed(function () {
        var retorno = true;
        retorno = retorno && mSelf.StatusSelecionado() !== null;
        retorno = retorno && mSelf.StatusSelecionado() === "A";
        return retorno;
    });

    mSelf.DecisaoValidar = ko.computed({
        read: function () {
            var ret = "I";

            mSelf.Invalido(true);

            if (mSelf.Valido()) {
                ret = "";

                mSelf.Invalido(false);
            }

            return ret;
        },
        write: function (value) {

            $("#tratarAlarme").removeClass("JustificativaValidar");
            $("#tratarAlarme").removeClass("JustificativaInvalidar");

            if (value !== "I") {
                $("#tratarAlarme").addClass("JustificativaValidar");
                $("#tratarAlarme").parent().css("width", "530px");
            } else {
                $("#tratarAlarme").addClass("JustificativaInvalidar");
                $("#tratarAlarme").parent().css("width", "258px");
            }

            mSelf.Valido(value !== "I");
        }
    });

    mSelf.DecisaoPenalisar = ko.computed({
        read: function () {
            var ret = "F";

            if (mSelf.Abonar()) {
                ret = "A";
            }

            return ret;
        },
        write: function (value) {
            mSelf.StatusSelecionado(value);
        }
    });

    mSelf.btnFinalizar = ko.computed(function () {
        var retorno = false;

        retorno |= mSelf.DecisaoPenalisar() === "F";
        retorno |= mSelf.DecisaoPenalisar() === "A" && mSelf.JustificativaSelecionada() !== null && mSelf.JustificativaSelecionada() > 0;

        if (mSelf.DecisaoValidar() === "I") {
            retorno = mSelf.JustificativaInvalidacaoSelecionada() !== null && mSelf.JustificativaInvalidacaoSelecionada() > 0;
        }

        return retorno;
    });

    // functions

    mSelf.Init = function () {

        mSelf.DecisaoValidar("I");
    };

    mSelf.Fechar = function () {
        mSelf.RemoverAlarmeCache();
    };

    mSelf.Cancelar = function () {
        mSelf.RemoverAlarmeCache();
        mSelf.JustificativaInvalidacaoSelecionada(-1);
        $("#tratarAlarme").dialog("close");
    };

    mSelf.TratarAlarmeIndividual = function (data, evt) {
        mSelf.IsMultiTratamentoAlarmes(false);

        vm.FecharTodosMensagemAlerta();

        var editarAlarme = false;

        var codigoAlarme = data.Codigo();

        if (data.Status() !== "P")
            editarAlarme = true;

        //remove a class da selecao da linha anterior
        $("tr[class=row-fluid-error]").removeClass();

        //Insere o css para a linha selecionada
        $("#alarme_" + data.Codigo())
            .addClass("row-fluid-error")
            .siblings()
            .removeClass("row-fluid-error");



        var paramsTratarAlarme = {
            regraOrigem: data.IdentificadorTipo().trim(),
            codigoAlarme: codigoAlarme,
            editarAlarme: editarAlarme,
            connectionId: vmEventos.TempoReal.GetId()
        };


        $.ajax({
            url: urlGlobal + "Veiculos/VeiculoDetalhes/TratarAlarme",
            dataType: "json",
            data: paramsTratarAlarme,
            beforeSend: function () {

                $(".loading-inlog").show("fast");
            },
            error: function (jqXHR, textStatus, errorThrown) {
            },
            success: function (data) {

                if (data) {

                    if (data.erro) {
                        vm.ShowMensagemAlerta(data.erro);
                    } else {
                        if (data.MensagemTravaAlarme == "") {
                            mSelf.LastData = data;
                            mSelf.CodigoAlarme(codigoAlarme);

                            if (data.ExisteConvocacaoParaOAlarme) {
                                $("#modalAvisoAlarmeConvocacao").dialog({
                                    autoOpen: true,
                                    modal: true,
                                    draggable: false,
                                    resizable: false,
                                    show: "blind"
                                });
                            }

                            else {
                                mSelf.ModalTratamentoAlarme();
                            }
                        }
                        else {
                            vm.ShowMensagemAlerta(data.MensagemTravaAlarme);
                        }
                    }
                }
            }
        }).done(function () {

            $(".loading-inlog").hide();
        });
    };

    mSelf.FecharModalTratamentoAlarme = function () {
        $("#tratarAlarme").dialog("close");
    };

    mSelf.ModalTratamentoAlarme = function () {

        mSelf.CodigosAlarmes.removeAll();

        mSelf.CodigosAlarmes.push(mSelf.CodigoAlarme());

        mSelf.Edicao(mSelf.LastData.Edicao);

        mSelf.Justificativas.removeAll();
        if (mSelf.LastData.Justificativas && mSelf.LastData.Justificativas.length > 0) {
            for (var i = 0, len = mSelf.LastData.Justificativas.length; i < len; i++) {
                mSelf.Justificativas.push(mSelf.LastData.Justificativas[i]);
            }
        }

        var justSelecionada = (mSelf.LastData.JustificativaSelecionada === -1) ? null : mSelf.LastData.JustificativaSelecionada;
        mSelf.JustificativaSelecionada(justSelecionada);

        mSelf.JustificativasInvalidacao.removeAll();
        if (mSelf.LastData.JustificativasInvalidacao && mSelf.LastData.JustificativasInvalidacao.length > 0) {
            for (var i = 0, len = mSelf.LastData.JustificativasInvalidacao.length; i < len; i++) {
                mSelf.JustificativasInvalidacao.push(mSelf.LastData.JustificativasInvalidacao[i]);
            }
        }

        var justInvalidacaoSelecionada = (mSelf.LastData.JustificativaInvalidacaoSelecionada === -1) ? null : mSelf.LastData.JustificativaInvalidacaoSelecionada;
        mSelf.JustificativaInvalidacaoSelecionada(justInvalidacaoSelecionada);

        mSelf.Observacao("");

        if (mSelf.LastData.Observacao && mSelf.LastData.Observacao.length > 0) {
            mSelf.Observacao(mSelf.LastData.Observacao);
        }

        mSelf.Status("");

        if (mSelf.LastData.Status && mSelf.LastData.Status.length > 0) {
            mSelf.Status(mSelf.LastData.Status);
        }

        mSelf.StatusSelecionado("I");
        if (mSelf.LastData.StatusSelecionado && mSelf.LastData.StatusSelecionado.length > 0) {
            mSelf.StatusSelecionado(mSelf.LastData.StatusSelecionado);
        }

        mSelf.DecisaoValidar(mSelf.StatusSelecionado());

        $("#tratarAlarme").dialog("open");

        if (mSelf.StatusSelecionado() !== "I") {
            $("#tratarAlarme").addClass("JustificativaValidar");
            $("#tratarAlarme").parent().css("width", "530px");
        } else {
            $("#tratarAlarme").addClass("JustificativaInvalidar");
            $("#tratarAlarme").parent().css("width", "258px");
        }

    };

    //Tratar todos alarmes
    mSelf.MultiTratamentoAlarmes = function () {
        mSelf.IsMultiTratamentoAlarmes(true);
        vm.FecharTodosMensagemAlerta();

        //carrega os alarmes selecionados
        mSelf.CarregarAlarmes();

        var codigosAlarmes = mSelf.CodigosAlarmes();

        if (codigosAlarmes.length > 200) {
            vm.ShowMensagemAlerta("O número máximo de 200 alarmes que podem ser tratados em massa foi antigido, total selecionado " + codigosAlarmes.length + " alarmes.");
            return;
        }

        var editarAlarme = false;

        //status alarme vem da selecao da aba
        if (mSelf.GetStatusAlarmesMultiTratamento() !== "P")
            editarAlarme = true;


        // verificar se o contexto está vazio
        if (typeof (codigosAlarmes) === "undefined" || codigosAlarmes == null)
            return;



        var paramsTratarAlarme = {
            regraOrigem: mSelf.GetTipoAlarmeSelecionadoMultiTratamento(),
            codigosAlarmes: codigosAlarmes,
            editarAlarme: editarAlarme,
            connectionId: vmEventos.TempoReal.GetId()
        };


        $.ajax({
            url: urlGlobal + "Veiculos/VeiculoDetalhes/TratarAlarmeTodos",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(paramsTratarAlarme),
            beforeSend: function () {

                $(".loading-inlog").show("fast");
            },
            error: function (jqXHR, textStatus, errorThrown) {
            },
            success: function (data) {
                var json = null;

                if (data) {

                    if (data.erro) {
                        vm.ShowMensagemAlerta(data.erro);
                    } else {
                        if (data.MensagemTravaAlarme == "") {
                            mSelf.LastData = data;                      
                            if (data.ExisteConvocacaoParaOAlarme) {
                                $("#modalAvisoAlarmeConvocacao").dialog({
                                    autoOpen: true,
                                    modal: true,
                                    draggable: false,
                                    resizable: false,
                                    show: "blind"
                                });
                            }

                            else {

                                mSelf.ModalTratamentoAlarmes();
                            }
                        }
                        else {
                            vm.ShowMensagemAlerta(data.MensagemTravaAlarme);
                        }
                    }
                }
            }
        }).done(function () {

            $(".loading-inlog").hide();
        });
    };

    mSelf.ModalTratamentoAlarmes = function () {
        mSelf.Edicao(mSelf.LastData.Edicao);

        mSelf.Justificativas.removeAll();
        if (mSelf.LastData.Justificativas && mSelf.LastData.Justificativas.length > 0) {
            for (var i = 0, len = mSelf.LastData.Justificativas.length; i < len; i++) {
                mSelf.Justificativas.push(mSelf.LastData.Justificativas[i]);
            }
        }
        mSelf.JustificativaSelecionada(mSelf.LastData.JustificativaSelecionada);

        mSelf.JustificativasInvalidacao.removeAll();
        if (mSelf.LastData.JustificativasInvalidacao && mSelf.LastData.JustificativasInvalidacao.length > 0) {
            for (var i = 0, len = mSelf.LastData.JustificativasInvalidacao.length; i < len; i++) {
                mSelf.JustificativasInvalidacao.push(mSelf.LastData.JustificativasInvalidacao[i]);
            }
        }
        mSelf.JustificativaInvalidacaoSelecionada(mSelf.LastData.JustificativaInvalidacaoSelecionada);

        mSelf.Observacao("");

        if (mSelf.LastData.Observacao && mSelf.LastData.Observacao.length > 0) {
            mSelf.Observacao(mSelf.LastData.Observacao);
        }

        mSelf.Status("");

        if (mSelf.LastData.Status && mSelf.LastData.Status.length > 0) {
            mSelf.Status(mSelf.LastData.Status);
        }

        mSelf.StatusSelecionado("I");
        if (mSelf.LastData.StatusSelecionado && mSelf.LastData.StatusSelecionado.length > 0) {
            mSelf.StatusSelecionado(mSelf.LastData.StatusSelecionado);
        }

        mSelf.DecisaoValidar(mSelf.StatusSelecionado());

        $("#tratarAlarme").dialog("open");

        if (mSelf.StatusSelecionado() !== "I") {
            $("#tratarAlarme").addClass("JustificativaValidar");
            $("#tratarAlarme").parent().css("width", "530px");
        } else {
            $("#tratarAlarme").addClass("JustificativaInvalidar");
            $("#tratarAlarme").parent().css("width", "258px");
        }

    };

    mSelf.RemoverAlarmeCache = function () {

        if (mSelf.CodigosAlarmes && mSelf.CodigosAlarmes().length > 0) {

            mSelf.ConnectionID = vmEventos.TempoReal.GetId();

            var tratarAlarmeVeiculoVM = ko.toJSON(mSelf);

            $.ajax({
                url: urlGlobal + "Veiculos/VeiculoDetalhes/RemoverAlarmeCache",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "POST",
                data: tratarAlarmeVeiculoVM,
                beforeSend: function () {
                    $(".loading-inlog").show("fast");
                },
                success: function (result) {

                    mSelf.CodigosAlarmes.removeAll();
                },
                complete: function () {
                    if (!mSelf.TratandoAlarme())
                        $(".loading-inlog").hide("fast");
                }
            });
        }
    };

    mSelf.CarregarAlarmes = function () {

        mSelf.CodigosAlarmes.removeAll();

        var listaAlarmes = mSelf.RetornaListaAlarmes();

        if (listaAlarmes) {

            ko.utils.arrayForEach(listaAlarmes, function (alarme) {

                if (alarme.AlarmeSelecionado()) {
                    mSelf.CodigosAlarmes.push(alarme.Codigo());

                }
            });
        }
    };

    mSelf.RetornaListaAlarmes = function () {

        var listaAlarmes = null;

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes) {

            switch (moduloGridViewDetalhes.GetStatusAlarmes()) {
                case 'P': //Pendetes
                    listaAlarmes = moduloGridViewDetalhes.Data.Pendentes();
                    break;
                case 'F': //Validos
                    listaAlarmes = moduloGridViewDetalhes.Data.Validos();
                    break;
                case 'I': //Invalidos
                    listaAlarmes = moduloGridViewDetalhes.Data.Invalidos();
                    break;
            }
        }

        return listaAlarmes;
    };

    mSelf.GetTipoAlarmeSelecionadoMultiTratamento = function () {

        var tipoAlarmeSelecionado = null;

        var listaAlarmes = mSelf.RetornaListaAlarmes();

        if (listaAlarmes) {

            var alarme = ko.utils.arrayFirst(listaAlarmes, function (alarme) {

                if (alarme.AlarmeSelecionado())
                    return alarme;
            });

            if (alarme)
                tipoAlarmeSelecionado = alarme.IdentificadorTipo();
        }

        return tipoAlarmeSelecionado;
    };

    mSelf.GetStatusAlarmesMultiTratamento = function () {

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes)
            return moduloGridViewDetalhes.GetStatusAlarmes();

        return null;
    };

    mSelf.TratandoAlarme = ko.observable(false);

    mSelf.FinalizarAlarmes = function () {

        vm.FecharTodosMensagemAlerta();

        mSelf.TratandoAlarme(true);
        $("#tratarAlarme").dialog("close");

        if (!mSelf.VerificarAlarmesSelecionadosTratamento())
            return;

        mSelf.ConnectionID = vmEventos.TempoReal.GetId();

        if (mSelf.Valido()) {

            if (mSelf.Abonar()) {
                mSelf.StatusSelecionado("A");
            } else {
                mSelf.StatusSelecionado("F");
            }
        } else {
            mSelf.StatusSelecionado("I");
        }

        var mensagem = "";

        var tratarAlarmeVeiculoVM = ko.toJSON(mSelf);

        var validarAlteracao = true;

        if (mSelf.LastData.Edicao) {
            var json = JSON.parse(tratarAlarmeVeiculoVM);

            if (json.JustificativaSelecionada == (mSelf.LastData.JustificativaSelecionada == null ? "-1" : mSelf.LastData.JustificativaSelecionada)
                && json.JustificativaInvalidacaoSelecionada == (mSelf.LastData.JustificativaInvalidacaoSelecionada == null ? "-1" : mSelf.LastData.JustificativaInvalidacaoSelecionada)
                && json.Observacao == (mSelf.LastData.Observacao == null ? "" : mSelf.LastData.Observacao)
                && ((json.Abonar ? "A" : "F") == mSelf.LastData.StatusSelecionado || json.StatusSelecionado == mSelf.LastData.StatusSelecionado)) {
                validarAlteracao = false
            }
        }

        if (validarAlteracao)
            $.ajax({
                url: urlGlobal + "Veiculos/VeiculoDetalhes/FinalizarAlarmes",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "POST",
                data: tratarAlarmeVeiculoVM,
                beforeSend: function () {

                    $(".loading-inlog").show("fast");
                },
                success: function (result) {
                    mSelf.TratandoAlarme(false);
                    mensagem = result;

                    var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

                    if (moduloGridViewDetalhes)
                        moduloGridViewDetalhes.NovoFiltro.CarregarFiltro(true);

                    mSelf.ResetaGridAlarmes();
                    switch (moduloGridViewDetalhes.StatusAlarmeFiltro()) {
                        case "P":
                            moduloGridViewDetalhes.Data.HabilitarContadorAlarmesValidos(false);
                            moduloGridViewDetalhes.Data.HabilitarContadorAlarmesInvalidos(false);
                            moduloGridViewDetalhes.Data.Validos.removeAll();
                            moduloGridViewDetalhes.Data.Invalidos.removeAll();
                            break;
                        case "F":
                            moduloGridViewDetalhes.Data.HabilitarContadorAlarmesInvalidos(false);
                            moduloGridViewDetalhes.Data.Invalidos.removeAll();
                            break;
                        default:
                            moduloGridViewDetalhes.Data.HabilitarContadorAlarmesValidos(false);
                            moduloGridViewDetalhes.Data.Validos.removeAll();
                            break;
                    }

                    mSelf.JustificativaInvalidacaoSelecionada(-1);
                    mSelf.JustificativaSelecionada(-1);
                }
            }).done(function () {

                //vm.ShowMensagemAlerta(mensagem);
            });
        else
            $(".loading-inlog").hide("fast");
    };

    mSelf.VerificarAlarmesSelecionadosTratamento = function () {

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes) {

            if (!moduloGridViewDetalhes.MultiTratamentoChecked() && mSelf.CodigosAlarmes && mSelf.CodigosAlarmes().length === 1)
                return true;
            else {

                mSelf.CarregarAlarmes();

                if (mSelf.CodigosAlarmes && mSelf.CodigosAlarmes().length > 0)
                    return true;
                else {

                    $(".loading-inlog").hide();

                    $("#tratarAlarme").dialog("open");

                    vm.ShowMensagemAlerta("Nenhum alarme foi selecionado!");

                    return false;
                }
            }
        }
    };

    mSelf.ResetaGridAlarmes = function () {

        var listaAlarmes = mSelf.RetornaListaAlarmes();

        ko.utils.arrayForEach(listaAlarmes, function (alarme) {

            alarme.AlarmeSelecionado(false);

            alarme.IsMultiTratamento(true);

        });

        var moduloGridViewDetalhes = vm.GetModulo("GridVeiculoDetalhesViewModel");

        if (moduloGridViewDetalhes) {

            moduloGridViewDetalhes.MultiTratamento(false);

            moduloGridViewDetalhes.MultiTratamentoChecked(false);

            moduloGridViewDetalhes.Data.HabilitarBotao(true);
        }
    };
}

function fecharModalAvisoCancelar() {
    vm.GetModulo("GridVeiculoDetalhesViewModel").TratarAlarmeVM.FecharModalTratamentoAlarme();
    $("#modalAvisoAlarmeConvocacao").dialog("destroy");
}

function fecharModalAvisoOk() {
    var IsMultiTratamentoAlarmes = vm.GetModulo("GridVeiculoDetalhesViewModel").TratarAlarmeVM.IsMultiTratamentoAlarmes();
    if (IsMultiTratamentoAlarmes)
        vm.GetModulo("GridVeiculoDetalhesViewModel").TratarAlarmeVM.ModalTratamentoAlarmes();
    else
        vm.GetModulo("GridVeiculoDetalhesViewModel").TratarAlarmeVM.ModalTratamentoAlarme();
    $("#modalAvisoAlarmeConvocacao").dialog("destroy");
}