// ActiveMQ
//var amq = org.activemq.Amq;
//var topicMQEventos = 'topic://TempoReal.Fcv';
var carregandoFCV = document.getElementById("ajax-loader-large");
//carregandoFCV += "<div style=\"margin: 0 auto; width 100%; text-align: center;\">";
//carregandoFCV += " alt=\"\" height=\"64\" /></div>";
var poolingTempoReal = null;

function VeiculoTpl(fcv, bla) {
    var retorno = veiculoTemplates.VeiculoAtualizado;

    if (fcv.PosicaoAtual != null) {
        retorno = veiculoTemplates.VeiculoAtualizado;

        if (typeof (fcv.TerminalInicial.SaidaRealizadaString) === 'function' && fcv.TerminalInicial.SaidaRealizadaString().length > 0) {
            if (fcv.PosicaoAtual.DistanciaPercentual() > 0) {
                retorno = veiculoTemplates.VeiculoCumprido;

                if (typeof (fcv.PosicaoAtual.VelocidadeMedia) !== "undefined") {
                    var velMedia = parseFloat(fcv.PosicaoAtual.VelocidadeMedia());
                    if (velMedia >= 5 && velMedia <= 120) {
                        if (bla) {
                            retorno = veiculoTemplates.VeiculoTempoDecorridoNovo;
                        } else {
                            retorno = veiculoTemplates.VeiculoTempoDecorrido;
                        }
                    }
                }
            }
        }
    }

    return retorno;
}

function veiculoTemplate(fcv) {
    var content = $("#" + VeiculoTpl(fcv, true)).html();

    if (fcv.IdentificadorVeiculo)
        content = content.replace("{identificadorVeiculo}", fcv.IdentificadorVeiculo());

    if (!fcv.Placa) {
        content = content.replace("<p><strong>Descrição:</strong> {descricao}</p>", "");
        content = content.replace("<p><strong>Placa:</strong> {placa}</p>", "");
    }

    if (fcv.PosicaoAtual.DataAtualizacao)
        content = content.replace("{dataHoraAtualizacao}", fcv.PosicaoAtual.DataAtualizacao());

    if (fcv.PosicaoAtual.Kilometros)
        content = content.replace("{distanciaKM}", fcv.PosicaoAtual.Kilometros());

    if (fcv.PosicaoAtual.Percentual)
        content = content.replace("{distanciaPercentual}", fcv.PosicaoAtual.Percentual());

    if (fcv.PosicaoAtual.VelocidadeMedia)
        content = content.replace(/{velocidadeMedia}/gi, fcv.PosicaoAtual.Velocidade());

    if (fcv.PosicaoAtual.ChegaEm) {
        if (fcv.DentroTerminal()) {
            content = content.replace("{classVeiculoTerminal}", "");
            content = content.replace("{classChegaEm}", "hide");
            content = content.replace("{classVeiculoProxTerminal}", "hide");
        } else if (fcv.PosicaoAtual.DistanciaPercentual() > 90 && fcv.PosicaoAtual.ChegaEm() == 0) {
            content = content.replace("{classVeiculoProxTerminal}", "");
            content = content.replace("{classChegaEm}", "hide");
            content = content.replace("{classVeiculoTerminal}", "hide");
        } else if (fcv.PosicaoAtual.ChegaEm() > 0 && (fcv.PosicaoAtual.DistanciaPercentual() > tempoRealVM.PercentualCalculoPrevisao())) {
            content = content.replace("{classVeiculoTerminal}", "hide");
            content = content.replace("{classVeiculoProxTerminal}", "hide");
            content = content.replace("{classChegaEm}", "");
            content = content.replace("{chegaEm}", formatTempo(fcv.PosicaoAtual.ChegaEm()));
        } else {
            content = content.replace("{classVeiculoTerminal}", "hide");
            content = content.replace("{classVeiculoProxTerminal}", "hide");
            content = content.replace("{classChegaEm}", "hide");
        }

    }
    return content;
}

function veiculoTitle(fcv) {
    var returnTitle = "";
    var content = "";
    if (fcv.Status() == "3") // Status finalizado
        return returnTitle;
    if (fcv.PosicaoAtual != null && typeof (fcv.PosicaoAtual) != "undefined") {
        content = $("#veiculo-atualizado-mobile").html();
        content = content.replace("{identificadorVeiculo}", fcv.IdentificadorVeiculo());
        content = content.replace("{dataHoraAtualizacao}", fcv.PosicaoAtual.DataAtualizacao());

        returnTitle += content;
    }

    if (fcv.Motorista() != null && fcv.Motorista().length > 0) {
        content = $("#veiculo-motorista-original-title").html();
        returnTitle += content.replace("{motorista}", fcv.Motorista());
    }
    if (fcv.Cobrador() != null && fcv.Cobrador().length > 0) {
        content = $("#veiculo-cobrador-original-title").html();
        returnTitle += content.replace("{cobrador}", fcv.Cobrador());
    }

    return returnTitle;
}

function onClickVeiculoSinotico(codigo, evento) {
    canvasCollection.funcaoClick(codigo, evento);
}

function onMoveVeiculoSinotico(codigo, evento) {
    canvasCollection.funcaoMove(codigo, evento);
}


function precise_round(num, decimals) {
    var retorno = Math.pow(10, decimals);
    retorno *= num;
    retorno = Math.round(retorno);
    retorno /= Math.pow(10, decimals);
    return retorno;
    //return Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals);
}

$('.dropdown-toggle').dropdown();


$('body').on('click', '.accordion-toggle', function (ev) {
    ev.preventDefault();

    $('.accordion-toggle').each(function () {
        $(this).addClass('collapsed');
    });

    $(this).removeClass('collapsed');


});
//$('.accordion')
//  .collapse()
//  .on('show hide', function (e) {
//      $(e.target).siblings('.accordion-heading').find('.accordion-toggle i').toggleClass('icon-chevron-down icon-chevron-right', 200);
//  });

function filtroResponsivo(largura) {

    //Largura da janela
    //    var janela = largura;

    //    //Exibe/Oculta Filtros
    //    if (janela < '980') {

    //        //Mostra a coluna de Filtros
    //        $('#aba-filtro').click(function () {
    //            $('#filtro-box').show('slow');
    //            $('#filtro-box').css('display', 'table');
    //            $('#sortable').hide();
    //        });

    //        //Oculta a coluna de Filtros
    //        $('#filtro-box .titleList .icon-minus').click(function () {
    //            $('#filtro-box').hide('slow');
    //            $('#sortable').show();
    //        });

    //        $('button[name=btnCancelarFiltro]').click(function () {
    //            $('#filtro-box').hide('slow');
    //            $('#sortable').show();
    //        });
    //    }
    //    else {
    //        $('#sortable').show();
    //        //Mostra a coluna de Filtros
    //        $('#aba-filtro').click(function () {
    //            $('#filtro-box').animate({
    //                width: 'toggle'
    //            });
    //            $('#filtro-filtro').hide('slow');
    //        });

    //        //Oculta a coluna de Filtros
    //        $('#filtro-box .titleList .icon-minus').click(function () {
    //            $('#filtro-box').animate({
    //                width: 'toggle'
    //            });
    //            $('#filtro-filtro').show('slow');
    //        });
    //    }
}

$(window).load(function () {
    //Recebe a largura da janela
    var janela = $(window).width();
    //alert(janela);

    filtroResponsivo(janela);
});

//Mantem selecionados o select multiplo
$('.select-toggle').each(function () {
    var select = $(this), values = {};
    $('option', select).each(function (i, option) {
        values[option.value] = option.selected;
    }).click(function (event) {
        values[this.value] = !values[this.value];
        $('option', select).each(function (i, option) {
            option.selected = values[option.value];
        });
    });
});

tempoRealVM.AbaSelecionada = ko.observable("0");
tempoRealVM.Filtrando = ko.observable(false);
tempoRealVM.ExisteFCV = function (Codigo) {
    for (var i = 0, len = this.FCVs().length; i < len; i++) {
        if (this.FCVs()[i].Codigo() == Codigo) {
            return i;
        }
    }
    return -1;
};


tempoRealVM.BuscaFCV = function (Codigo) {
    for (var i = 0, len = this.FCVs().length; i < len; i++) {
        if (this.FCVs()[i].Codigo() == Codigo) {
            return this.FCVs()[i];
        }
    }
    return null;
};


tempoRealVM.btnFiltrar = function () {
    /* Eventos na tela
    */
    LoadingOn(function () {
        tempoRealVM.Filtrar();
        //exibe o botao que aciona a aba de filtros
    });

}

var scrollLast = 0;
var indiceAtual = 0;
var qtdPorPagina = 30;
var buscaPaginacao = false;
var lastDateSearched = "";
var filtrosSelecionados = ko.observable();
const ordenacao = {
    value: ko.observable("alfabetica"),
    options: [
        {
            text: "Alfabética",
            value: "alfabetica"
        },
        {
            text: "Maior Atraso",
            value: "maior"
        },
        {
            text: "Menor Atraso",
            value: "menor"
        }        
    ]
};

ordenacaoSelecionada = ko.computed(() => ordenacao.value());

tempoRealVM.processaFiltroFinalizados = function (arrayFinalizadas) {

    if (this.FCVsFinalizadas == undefined || arrayFinalizadas != undefined) {
        this.FCVsFinalizadas = ko.observableArray(arrayFinalizadas);
    }

    var array = [];
    for (var i in this.FCVsFinalizadas()) {
        if (FiltraFCV(this.Filtros.TerminaisSelecionados(), this.Filtros.LinhasSelecionadas(), this.Filtros.VeiculosSelecionados(), null, null, null, null, this.FCVsFinalizadas()[i])) {
            array.push(this.FCVsFinalizadas()[i]);
        }
    }
    this.FCVs(array);
};

tempoRealVM.Filtros.ShowFiltros = function () {
    var retorno = true,
        data = tempoRealVM.Filtros.DataFinalizado().split("T");

    if (finalizadosSelecioando()) {

        retorno = this.DataFinalizadosVisible() == data[0];
    }

    return retorno;
};

tempoRealVM.Filtrar = function () {

    // Validar data do filtro se for maior que a data de hoje!
    if (!ValidarDataFiltro()) {

        LoadingOff();

        return;
    }

    if (this.Filtros.StatusFCVSelecionado() == "3")
        lastDateSearched = this.Filtros.DataFinalizadoSelecionado();

    var connId = poolingTempoReal ? poolingTempoReal.GetId() : "";
    isDoingFilter = true;

    var url = urlGlobal + "Operacao/TempoReal/Filtrar";

    indiceAtual = 0;
    tempoRealVM.Filtros.Indice(indiceAtual);
    tempoRealVM.Filtros.Quantidade(qtdPorPagina);

    window.scrollTo(0, 0);

    //    var data = tempoRealVM.Filtros.DataFinalizado().split("T");
    //    data[0] = this.Filtros.DataFinalizadoSelecionado();

    filtrosSelecionados(this.Filtros);


    worker.postMessage({
        url: url,
        data: JSON.stringify({ filtro: ko.toJSON(filtrosSelecionados), connectionId: connId })
    });
    //$.ajax({
    //    url: url,
    //    contentType: 'application/json; charset=utf-8',
    //    dataType: "json",
    //    type: "POST",
    //    data: JSON.stringify({ filtro: ko.toJSON(filtrosSelecionados), connectionId: connId }),
    //    success: loadDataAjaxFiltrar,
    //    complete: function () {
    //        LoadingOff();
    //    },
    //    error: function () {
    //        isDoingFilter = false;
    //    }
    //});
    //}
};

function loadDataAjaxFiltrar(resposta) {
    $("#content")[0].scrollTop = 0;
    tempoRealVM.FCVs(ko.observableArray([]));
    if (resposta != null && resposta != "" && typeof (resposta) !== "undefined" && resposta.data != "") {
        var data = JSON.parse(resposta.data);

        //tempoRealVM.RecarregarFCVs(data);
        try {
            $('.menu_titulo .icon_fechar').closest('.menu_bloco').hide();
            $('.menu_titulo .icon_fechar').parents('.menu_titulo').parent('.menu_bloco').prev('.icone').removeClass('active');
        } catch (Exception) {
        }

        $('#sortable').show();

        var toJs = {
            vms: data.vms || data,
            totalFinalizados: data.totalFinalizados,
            habilitarIndicadores: data.habilitarIndicadores
        };

        var novasFcvs = ko.mapping.fromJS(toJs.vms);

        ko.utils.arrayForEach(novasFcvs(), function (fcv) {
            fcv.PosicaoAtual.IndicadorTempoAtraso = ko.computed(function () {
                if (fcv.PosicaoAtual.DiffPrevisao instanceof Function)
                    return formatTempoDeAtraso(fcv.PosicaoAtual.DiffPrevisao());
                else
                    return formatTempoDeAtraso(fcv.PosicaoAtual.DiffPrevisao);
            })
        });

        tempoRealVM.TotalFinalizados(undefined);
        if (toJs.totalFinalizados && toJs.totalFinalizados > 0) {
            tempoRealVM.TotalFinalizados(toJs.totalFinalizados);
        }

        if (toJs.habilitarIndicadores) {
            inicializaIndicadores();
            BuscarTodosIndicadores();
            tempoRealVM.HabilitarIndicadoresOperacao(true);
        }

        tempoRealVM.FCVs(novasFcvs());

        if (finalizadosSelecioando()) {

            //$(".btn-filtro-opcoes").removeClass("btn-warning");
            //$(".btn-finalizados-selecao").addClass("btn-warning");
            //$(".dataFinalizado").css("display", "inline");

            if (tempoRealVM.TotalFcvsVisiveis() != tempoRealVM.TotalFinalizados()) {
                buscaPaginacao = true;
                setaScroll();
            } else {
                buscaPaginacao = false;
                retiraScroll()
            }

        } else {
            buscaPaginacao = false;
            retiraScroll();
        }
        canvasCollection.resize();
    } else {
        tempoRealVM.FCVs(ko.observableArray([]));
        tempoRealVM.TotalFinalizados(0);
    }
    isDoingFilter = false;
    LoadingOff();


    //supergrid = new Slick.Grid("#myGrid", tempoRealVM.FCVs(), columns, optionsSlickGrid);
}

tempoRealVM.FiltrarPorData = function () {
    tempoRealVM.Filtrando(true);

    // Validar data do filtro se for maior que a data de hoje!
    if (!ValidarDataFiltro()) {
        tempoRealVM.Filtrando(false);

        return;
    }

    tempoRealVM.LimparFiltros();
    CarregarFiltroFinalizadoPorData(tempoRealVM.Filtros.DataFinalizadosVisible());
};

function processaScrollSinotico() {
    if (tempoRealVM.TotalFinalizados) {
        if (tempoRealVM.TotalFcvsVisiveis() == tempoRealVM.TotalFinalizados()) {
            return;
        }
    }

    if (buscaPaginacao && !isDoingFilter) {
        indiceAtual++;

        filtrosSelecionados().Indice(indiceAtual);

        var connId = poolingTempoReal ? poolingTempoReal.GetId() : "";
        isDoingFilter = true;

        var url = urlGlobal + "Operacao/TempoReal/Filtrar";
        $.ajax({
            url: url,
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify({ filtro: ko.toJSON(filtrosSelecionados), connectionId: connId }),
            success: function (data) {
                if (typeof (data) === "string") {
                    if (data.indexOf("UserName") >= 0 &&
                        data.indexOf("Password") >= 0)
                        window.location.href = urlGlobal + "Account/Login";
                } else if (data != null && data != "" && typeof (data) !== "undefined") {
                    var toJs = {
                        vms: data.vms || data,
                        totalFinalizados: data.totalFinalizados
                    };
                    var novasFcvs = ko.mapping.fromJS(toJs.vms);
                    tempoRealVM.TotalFinalizados(toJs.totalFinalizados);

                    if (novasFcvs() != null && novasFcvs().length > 0) {
                        //                        for (var i = 0; i < novasFcvs().length; i++) {
                        //                            tempoRealVM.FCVs.push(novasFcvs()[i]);
                        //                        }

                        tempoRealVM.FCVs.push.apply(tempoRealVM.FCVs, novasFcvs());
                    } else {
                        buscaPaginacao = false;
                        retiraScroll();
                    }

                    if (tempoRealVM.TotalFinalizados) {
                        if (tempoRealVM.TotalFcvsVisiveis() == tempoRealVM.TotalFinalizados()) {
                            retiraScroll();
                        }
                    }

                } else {
                    buscaPaginacao = false;
                    retiraScroll();
                }

                isDoingFilter = false;
            },
            complete: function () {
            },
            error: function () {
                isDoingFilter = false;
            }
        });
    }
}

function validaNecessidadeScroll() {

    retiraScroll();
}

function retiraScroll() {
    $(".sinotico-fim-lista").hide();
    $("#content").unbind('scroll');
}

function setaScroll() {
    $("#content").scroll(function (e) {

        //console.log($(".container-fluid-tempo-real").height() - this.scrollTop - $(this).innerHeight());

        if ($(".container-fluid-tempo-real").height() - this.scrollTop - $(this).innerHeight() <= 0) {
            if (tempoRealVM.TotalFinalizados) {
                if (tempoRealVM.TotalFcvsVisiveis() !== tempoRealVM.TotalFinalizados()) {
                    $(".sinotico-fim-lista").show();
                    processaScrollSinotico();
                }
            }
        }
    });
}


tempoRealVM.LimparFiltros = function () {
    var self = this;
    if (!tempoRealVM.Filtrando()) {
        LoadingOn(function () {
            limparCampos(self);
        });
        LoadingOff();
    } else {
        limparCampos(self);
    }
}

function limparCampos(self) {
    self.Filtros.TerminaisSelecionados([]);
    self.Filtros.LinhasOrigensSelecionadas([]);
    self.Filtros.OperacoesSelecionadas([]);
    self.Filtros.LinhasSelecionadas([]);
    self.Filtros.VeiculosSelecionados([]);
    self.Filtros.TabelasSelecionadas([]);
    self.Filtros.TiposAlarmesSelecionados([]);
    self.Filtros.MotoristasSelecionados([]);

    self.Filtros.StatusAlarmeSelecionado("5");
    self.Filtros.StatusAlarmeSelecionadoMobile([]);

    if (self.Filtros.StatusFCVSelecionado() != "3") {
        $(".btn-filtro-item-temporeal[value=painel-filtro-status]").trigger("click");
        self.Filtros.StatusFCVSelecionado("1");
        self.Filtros.StatusFCVSelecionadoMobile(["1"]);
        self.Filtros.EstadosFCVAtivaSelecionados(["0", "1", "2", "3", "4", "5"]);
    } else {
        $(".btn-filtro-item-temporeal[value=painel-filtro-status]").trigger("click");
        self.Filtros.EstadosFCVFinalizadaSelecionados(["0", "1"]);
    }
    $("input[name=chkTabelas]:checked").attr("checked", false);
    $(".ajax-typeahead").val("");
    $(".ajax-typeahead").keyup();
}

tempoRealVM.AtualizarFcvPorAlarme = function (data) {
    var self = tempoRealVM;
    var indexFcv = self.ExisteFCV(data.codigoFCV);

    if (self.FCVs != null && self.FCVs().length > 0) {

        if (indexFcv >= 0) {
            self.FCVs()[indexFcv].Descricao(data.Descricao);
            self.FCVs()[indexFcv].QtdAlarmesPendentes(data.Resumo.qtdAlarmesPendentes);
            self.FCVs()[indexFcv].QtdAlarmesValidos(data.Resumo.qtdAlarmesValidos);
            self.FCVs()[indexFcv].QtdAlarmesInvalidos(data.Resumo.qtdAlarmesInvalidos);

            if (self.FCVs()[indexFcv].BtnInformacoesExtras() > 0)
                self.AtualizaModalAlarmeFcv({
                    fcv: self.FCVs()[indexFcv],
                    Status: self.FCVs()[indexFcv].BtnInformacoesExtras()
                });
        }
    }

};

function copiaObjeto(objetoSrc, objetoDst) {
    var metodo = "";
    try {
        for (var metodo in objetoSrc) {
            if (ko.isObservable(objetoDst[metodo])) {
                if (objetoDst[metodo] != undefined) {
                    if (metodo == "TerminaisEmInconformidadePlanejamento" || metodo == "PontosOnibus") {
                        objetoDst[metodo](ko.mapping.fromJS(objetoSrc[metodo])());
                    } else {
                        objetoDst[metodo](objetoSrc[metodo]);
                    }
                } else {
                    objetoDst[metodo] = ko.observable(objetoSrc[metodo]);
                }
            } else {
                copiaObjeto(objetoSrc[metodo], objetoDst[metodo]);
            }
        }
    } catch (Exc) {
        console.log(metodo);
    }
}

// Adiciona ou atualiza FCV
tempoRealVM.AdicionarFCV = function (data) {
    var self = tempoRealVM;
    if (isFiltrando(data, tempoRealVM.AdicionarFCV)) {

        var novaFcv = data,
            indexFcv = self.ExisteFCV(novaFcv.Codigo),
            ultimaPosicaoAux = null,
            parado = null;

        novaFcv.PosicaoAtual.IndicadorTempoAtraso = ko.computed(function () {
            if (novaFcv.PosicaoAtual.DiffPrevisao instanceof Function)
                return formatTempoDeAtraso(novaFcv.PosicaoAtual.DiffPrevisao());
            else
                return formatTempoDeAtraso(novaFcv.PosicaoAtual.DiffPrevisao);
        });

        if (self.FCVs != null && self.FCVs().length > 0) {

            if (indexFcv >= 0) {

                //Exclui informações de alarmes relacionada
                infoDetalhesAlarmes[self.FCVs()[indexFcv].Codigo()] = null;

                novaFcv.ExibirInformacoesExtras = self.FCVs()[indexFcv].ExibirInformacoesExtras();
                novaFcv.InformacoesExtras = self.FCVs()[indexFcv].InformacoesExtras();
                novaFcv.BtnInformacoesExtras = self.FCVs()[indexFcv].BtnInformacoesExtras();

                //Atualiza FCVVM na Lista
                //novaFcv.FcvStatusIntegracao("btn-danger");
                //self.FCVs.replace(self.FCVs()[indexFcv], novaFcv);
                //                for (var metodo in novaFcv) {
                //                    self.FCVs()[indexFcv][metodo](novaFcv);
                //                }
                copiaObjeto(novaFcv, self.FCVs()[indexFcv]);

                var parado = VerificarParado(self.FCVs()[indexFcv]);

                var ultimaPosicaoAux = PosicaoFcv(self.FCVs()[indexFcv], 90, parado);

                canvasCollection.recalcular(novaFcv.Codigo);

                var objetos = ko.isObservable(self.FCVs()[indexFcv].EnlaceAtual.PontosOnibus) ? self.FCVs()[indexFcv].EnlaceAtual.PontosOnibus() : self.FCVs()[indexFcv].EnlaceAtual.PontosOnibus;

                canvasCollection.atualizaTempoReal(self.FCVs()[indexFcv].Codigo(), ultimaPosicaoAux, parado, verificaPosicaoPrevista(self.FCVs()[indexFcv]), objetos);

                atualizaTerminalInconformidade(self.FCVs()[indexFcv]);

                atualizaPopUpFCV(self.FCVs()[indexFcv].Codigo());
            } else {

                novaFcv = ko.mapping.fromJS(data);

                self.FCVs.push(novaFcv);

                var parado = VerificarParado(novaFcv);

                var ultimaPosicaoAux = PosicaoFcv(novaFcv, 0, parado);

                canvasCollection.adicionarCanvas({
                    ContainerID: novaFcv.Codigo(),
                    TipoVeiculoID: novaFcv.CodigoTipoVeiculo(),
                    UltimaPosicao: ultimaPosicaoAux,
                    Parado: parado,
                    Objetos: novaFcv.EnlaceAtual.PontosOnibus()
                });
            }
        } else {

            self.FCVs([]);

            novaFcv = ko.mapping.fromJS(data);

            self.FCVs.push(novaFcv);

            var parado = VerificarParado(novaFcv);

            var ultimaPosicaoAux = PosicaoFcv(novaFcv, 0, parado);

            canvasCollection.adicionarCanvas({
                ContainerID: novaFcv.Codigo(),
                TipoVeiculoID: novaFcv.CodigoTipoVeiculo(),
                UltimaPosicao: ultimaPosicaoAux,
                Parado: parado,
                Objetos: novaFcv.EnlaceAtual.PontosOnibus()
            });
        }
    }

};

function ordenarPorMaiorAtraso(a, b) {
    if (a.PosicaoAtual.InconformidadeChegada() && a.PosicaoAtual.PrevisaoTotalMinutos() > 0) {

        if (!b.PosicaoAtual.InconformidadeChegada() || b.PosicaoAtual.PrevisaoTotalMinutos() <= 0) {
            return -1;
        }

        return a.PosicaoAtual.DiffPrevisao() == b.PosicaoAtual.DiffPrevisao() ? 0 : (a.PosicaoAtual.DiffPrevisao() < b.PosicaoAtual.DiffPrevisao() ? 1 : -1);
    }

    return 1;
}

function ordenarPorMenorAtraso(a, b) {
    if (!a.PosicaoAtual.InconformidadeChegada() || a.PosicaoAtual.PrevisaoTotalMinutos() <= 0) {
        return -1;
    }

    if (!b.PosicaoAtual.InconformidadeChegada() || b.PosicaoAtual.PrevisaoTotalMinutos() <= 0) {
        return 1;
    }
    
    return a.PosicaoAtual.DiffPrevisao() == b.PosicaoAtual.DiffPrevisao() ? 0 : (a.PosicaoAtual.DiffPrevisao() > b.PosicaoAtual.DiffPrevisao() ? 1 : -1);
}

function ordenarPorDescricaoCrescente(a, b) {
    return a.Descricao() == b.Descricao() ? 0 : (a.Descricao() > b.Descricao() ? 1 : -1);
}

function filtrarPorMaiorMenorAtraso(filtro) {
    const self = tempoRealVM.FCVs();
    if (filtro == "maior") {
        self.sort(ordenarPorMaiorAtraso);
    }
    else if (filtro == "menor") {
        self.sort(ordenarPorMenorAtraso);
    }
    else
        self.sort(ordenarPorDescricaoCrescente);

    tempoRealVM.FCVs(self);
}

tempoRealVM.AtualizarPontoOnibus = function (pontoOnibus) {
    var pontoO = JSON.parse(pontoOnibus);
    var self = tempoRealVM;
    var indexFcv = self.ExisteFCV(pontoO.CodigoLinhaTabela);
    if (indexFcv >= 0) {
        var ponto = ko.mapping.fromJS(pontoO);
        var enlaceAtual = null;

        if (ko.isObservable(this.FCVs()[indexFcv].EnlaceAtual))
            enlaceAtual = this.FCVs()[indexFcv].EnlaceAtual();
        else
            enlaceAtual = this.FCVs()[indexFcv].EnlaceAtual;

        if (enlaceAtual.Codigo() == ponto.CodigoLinhaTerminal()) {
            var listaPontos = enlaceAtual.PontosOnibus;
            if (listaPontos != null) {
                var temPonto = false;
                for (var item in listaPontos()) {
                    if (listaPontos()[item].Codigo() == ponto.Codigo()) {
                        listaPontos.replace(listaPontos()[item], ponto);
                        temPonto = true;
                    }
                }
                if (!temPonto) {
                    listaPontos.push(ponto);
                }
                var novaFcv = this.FCVs()[indexFcv];
                var parado = VerificarParado(novaFcv);
                var ultimaPosicaoAux = PosicaoFcv(novaFcv, 0, parado);
                canvasCollection.adicionarCanvas({
                    ContainerID: this.FCVs()[indexFcv].Codigo(),
                    TipoVeiculoID: this.FCVs()[indexFcv].CodigoTipoVeiculo(),
                    UltimaPosicao: ultimaPosicaoAux,
                    Parado: parado,
                    Objetos: enlaceAtual.PontosOnibus()
                });
            }
        }
    }

};


// TRATAMENTO DE EVENTOS
// Adiciona ou atualiza FCV
tempoRealVM.AdicionarConjuntoFCVs = function (fcvs) {
    var adicionado = false;
    for (var fcv in fcvs) {
        novaFcv = ko.mapping.fromJS(fcv);
        this.FCVs.push(novaFcv);
        //canvasCollection.adicionarCanvas({ ContainerID: novaFcv.Codigo(), TipoVeiculoID: novaFcv.CodigoTipoVeiculo(), UltimaPosicao: typeof (novaFcv.PosicaoAtual) === 'undefined' ? 0 : novaFcv.PosicaoAtual.DistanciaPercentual() });
        adicionado = true;
    }

    if (adicionado) {
        //tempoRealVM.ordernarLinhas();
        this.FCVs.sort(sortFCVS);
    }
};

// Remove FCV
tempoRealVM.RemoverFCV = function (codigoFcv) {
    var self = tempoRealVM;
    if (isFiltrando(codigoFcv, self.RemoverFCV)) {
        var indexFcv = self.ExisteFCV(codigoFcv);

        if (indexFcv >= 0) {
            //Busca a FCV
            var fcv = self.BuscaFCV(codigoFcv);
            if (fcv.Status() != "3")//Finalizada
                self.FCVs.remove(self.FCVs()[indexFcv]);
        }
    }

};

tempoRealVM.RecarregarFCVs = function (data) {
    var self = tempoRealVM;
    if (isFiltrando(data, tempoRealVM.RecarregarFCVs)) {

        var novasFcvs = ko.mapping.fromJS(data);

        ko.utils.arrayForEach(novasFcvs(), function (fcv) {
            fcv.PosicaoAtual.IndicadorTempoAtraso = ko.computed(function () {
                if (fcv.PosicaoAtual.DiffPrevisao instanceof Function)
                    return formatTempoDeAtraso(fcv.PosicaoAtual.DiffPrevisao());
                else
                    return formatTempoDeAtraso(fcv.PosicaoAtual.DiffPrevisao);
            })
        });

        self.FCVs(novasFcvs());
        //self.ordernarLinhas();
        self.FCVs.sort(sortFCVS);

        //self.Filtrar();
    }

};

function isFiltrando(data, callback) {
    if (isDoingFilter) {
        //setTimeout(function () { callback(data); }, 1500);
        return false;
    }
    return true;
}

tempoRealVM.AtualizaPosicaoFCV = function (data) {
    var self = tempoRealVM;

    if (isFiltrando(data, tempoRealVM.AtualizaPosicaoFCV)) {
        var indexFcv = self.ExisteFCV(data.CodigoFCV);
        if (indexFcv >= 0) {
            for (let prop in data) {
                if (data.hasOwnProperty(prop)) {
                    if (self.FCVs()[indexFcv].PosicaoAtual[prop]) {
                        self.FCVs()[indexFcv].PosicaoAtual[prop](data[prop]);
                    } else {
                        self.FCVs()[indexFcv].PosicaoAtual[prop] = ko.observable(data[prop]);
                    }
                }
            }

            var parado = VerificarParado(self.FCVs()[indexFcv]);
            var posicao = PosicaoFcv(self.FCVs()[indexFcv], 50, parado);
            canvasCollection.atualizaTempoReal(self.FCVs()[indexFcv].Codigo(), posicao, parado, verificaPosicaoPrevista(self.FCVs()[indexFcv]));
            atualizaTerminalFinal(self.FCVs()[indexFcv], parado);
            atualizaTerminalInconformidade(self.FCVs()[indexFcv]);
            atualizaPopover(self.FCVs()[indexFcv]);
        }
    }

};
tempoRealVM.atualizaAlarmePorFCV = function (mensagem) {
    var self = tempoRealVM;
    if (isFiltrando(mensagem, tempoRealVM.atualizaAlarmePorFCV)) {
        var alarmes = mensagem;
        var indexFcv = self.ExisteFCV(alarmes.codigoFCV);

        if (indexFcv >= 0) {

            self.FCVs()[indexFcv].QtdAlarmesPendentes(alarmes.qtdAlarmesPendentes);
            self.FCVs()[indexFcv].QtdAlarmesValidos(alarmes.qtdAlarmesValidos);
            self.FCVs()[indexFcv].QtdAlarmesInvalidos(alarmes.qtdAlarmesInvalidos);

            if (self.FCVs()[indexFcv].BtnInformacoesExtras() > 0)
                self.AtualizaModalAlarmeFcv({
                    fcv: self.FCVs()[indexFcv],
                    Status: self.FCVs()[indexFcv].BtnInformacoesExtras()
                });
        }
    }

};

function sortFCVS(a, b) {
    if (a.DescricaoLinha() > b.DescricaoLinha()) {
        return 1;
    } else if (a.DescricaoLinha() < b.DescricaoLinha()) {
        return -1;
    }

    if (a.IdentificadorLinha() > b.IdentificadorLinha()) {
        return 1;
    } else if (a.IdentificadorLinha() < b.IdentificadorLinha()) {
        return -1;
    }

    if (a.IdentificadorTabela() > b.IdentificadorTabela()) {
        return 1;
    } else if (a.IdentificadorTabela() < b.IdentificadorTabela()) {
        return -1;
    }

    if (a.IdentificadorJornada() > b.IdentificadorJornada()) {
        return 1;
    } else if (a.IdentificadorJornada() < b.IdentificadorJornada()) {
        return -1;
    } else {
        return 0;
    }
};

function verificaAdAt(diff) {
    if (diff > 0) {
        return adAt.atrasado;
    } else {
        return adAt.adiantado;
    }
}

function formatTempo(milissegundos) {
    var duracao = "{0}h{1}m{2}s";
    var year = 0,
        month = 0,
        day = 0,
        hours = 0,
        minutes = 0,
        seconds = 0,
        milliseconds = milissegundos;
    var dt = new Date(
        year,
        month,
        day,
        hours,
        minutes,
        seconds,
        milliseconds
    );

    duracao = dt.getSeconds() + "s";

    if (dt.getMinutes() >= 1) {
        duracao = dt.getMinutes() + "m" + duracao;
    }

    if (dt.getHours() >= 1) {
        duracao = dt.getHours() + "h";
        duracao += dt.getMinutes() + "m";
    }
    return duracao;
}

function formatTempoDeAtraso(milissegundos) {
    var duracao = "";
    var year = 0,
        month = 0,
        day = 0,
        hours = 0,
        minutes = 0,
        seconds = 0,
        milliseconds = milissegundos;
    var dt = new Date(
        year,
        month,
        day,
        hours,
        minutes,
        seconds,
        milliseconds
    );

    if (dt.getMinutes() >= 1) {
        duracao = dt.getMinutes() + " MIN ";
    }

    if (dt.getHours() >= 1) {

        if (dt.getHours() === 1) {
            duracao = dt.getHours() + " HORA ";
        } else {
            duracao = dt.getHours() + " HORAS ";
        }

        if (dt.getMinutes() >= 1) {
            duracao += "E " + dt.getMinutes() + " MIN ";
        }

    }
    return duracao;
}

var alarmesTemplate = null;

function showModaAlarmes(o) {
    var nomeDiv = o.tipo + "_" + o.codigo;

    if ($('#' + nomeDiv).length == 0) {
        if (alarmesTemplate == null) {
            alarmesTemplate = document.getElementById("tplAlarmes");
        }
        $('#alarmes').append("<div id='" + nomeDiv + "'></div>");
        setFcvInfoTerminalDialog($(idDiv));
    }

    $('body').data("codTerminalAux", o.codigo)
    $('#' + nomeDiv).modal('show')
}

function navegarSlide(obj) {
    if (obj.Slide == 1) {
        showInfoTerminais({ isTerminalInicial: true, tpl: 'terminal-inicial', CodigoFcv: obj.Codigo });
    } else if (obj.Slide == 2) {
        showInfoDetalhesVeiculo(obj.Codigo);
    } else if (obj.Slide == 3) {
        showInfoTerminais({ isTerminalInicial: false, tpl: 'terminal-final', CodigoFcv: obj.Codigo });
    } else if (obj.Slide == 4) {
        infoDetalhesAlarmes[obj.Codigo] = null;
        showInfoDetalhesAlarme({
            Codigo: obj.Codigo,
            Status: 2,
            Atualizar: false,
            Elemento: $("#sinotico_alarme_pendentes" + obj.Codigo),
            funcaoElemento: obj.View.InformacoesExtras
        });
    } else if (obj.Slide == 5) {
        infoDetalhesAlarmes[obj.Codigo] = null;
        showInfoDetalhesAlarme({
            Codigo: obj.Codigo,
            Status: 3,
            Atualizar: false,
            Elemento: $("#sinotico_alarme_validos" + obj.Codigo),
            funcaoElemento: obj.View.InformacoesExtras
        });
    } else if (obj.Slide == 6) {
        infoDetalhesAlarmes[obj.Codigo] = null;
        showInfoDetalhesAlarme({
            Codigo: obj.Codigo,
            Status: 4,
            Atualizar: false,
            Elemento: $("#sinotico_alarme_invalidos" + obj.Codigo),
            funcaoElemento: obj.View.InformacoesExtras
        });
    }
}

tempoRealVM.AtualizaModalAlarmeFcv = function (data) {
    var elementoId = retornoBotaoAlarme(data);

    if (elementoId) {
        //var codigoFcv = data.fcv.Codigo();
        //var $elemento = $(elementoId).parent().parent().children('.detalhe-sinotico');

        data.fcv.InformacoesExtras(null);

        // VAlida se modal esta visivel ao usuário  e atualiza informações
        if (data.fcv.ExibirInformacoesExtras()) {
            showInfoDetalhesAlarme({
                Codigo: data.fcv.Codigo(),
                Status: data.Status,
                Atualizar: true,
                BotaoAlarme: elementoId,
                funcaoElemento: data.fcv.InformacoesExtras
            });
        }
    }
};

tempoRealVM.eventoClickBotaoFcv = function (data) {
    carregarFCV(data);
};

function eventoClickBotaoFcv(codigo) {
    var fcv = tempoRealVM.BuscaFCV(codigo);
    if (fcv == null)
        return;

    carregarFCV(fcv);
}

tempoRealVM.eventoClickBotaoAlarmeFcv = function (data) {
    var elementoId = retornoBotaoAlarme(data);

    if (elementoId) {
        if (data.fcv.ExibirInformacoesExtras() && data.Status == data.fcv.BtnInformacoesExtras()) {
            data.fcv.ExibirInformacoesExtras(false);
            data.fcv.InformacoesExtras(null);
            data.fcv.BtnInformacoesExtras(0);
            return;
        }
        //$("#div-botoes-extras" + data.fcv.Codigo()).find(".btn-alarmes-info-extra").removeClass("btn-warning");
        //$($("#div-botoes-extras" + data.fcv.Codigo()).find(".btn-alarmes-info-extra")[data.Status - 2]).addClass("btn-warning");
        //var codigoFcv = data.fcv.Codigo();
        //var $elemento = $(elementoId).parent().parent().children('.detalhe-sinotico');

        //        if ($elemento.css("display") == 'inline-block') {
        //            infoDetalhesAlarmes[codigoFcv] = null;
        //            $($elemento).slideUp('slow');
        //            return;
        //        }

        //var leftButton = $(elementoId).position().left - $elemento.parent().position().left + ($(elementoId).width() / 2);

        //$elemento.children('.arrowUpDetalhes').css("left", leftButton);

        //$elemento.slideDown('slow');
        //$elemento.css({ display: 'inline-block' });

        data.fcv.ExibirInformacoesExtras(true);
        data.fcv.InformacoesExtras(null);
        data.fcv.BtnInformacoesExtras(data.Status);

        showInfoDetalhesAlarme({
            Codigo: data.fcv.Codigo(),
            Status: data.Status,
            Atualizar: false,
            BotaoAlarme: elementoId,
            funcaoElemento: data.fcv.InformacoesExtras
        });
    }
};

function eventoClickBotaoAlarmeFcv(codigo, status) {

    var fcv = tempoRealVM.BuscaFCV(codigo);
    if (fcv == null)
        return;

    var data = { fcv: fcv, Status: status };

    var elementoId = retornoBotaoAlarme(data);

    if (elementoId) {
        if (data.fcv.ExibirInformacoesExtras() && data.Status == data.fcv.BtnInformacoesExtras()) {
            data.fcv.ExibirInformacoesExtras(false);
            data.fcv.InformacoesExtras(null);
            data.fcv.BtnInformacoesExtras(0);
            return;
        }
        //$("#div-botoes-extras" + data.fcv.Codigo()).find(".btn-alarmes-info-extra").removeClass("btn-warning");
        //$($("#div-botoes-extras" + data.fcv.Codigo()).find(".btn-alarmes-info-extra")[data.Status - 2]).addClass("btn-warning");
        //var codigoFcv = data.fcv.Codigo();
        //var $elemento = $(elementoId).parent().parent().children('.detalhe-sinotico');

        //        if ($elemento.css("display") == 'inline-block') {
        //            infoDetalhesAlarmes[codigoFcv] = null;
        //            $($elemento).slideUp('slow');
        //            return;
        //        }

        //var leftButton = $(elementoId).position().left - $elemento.parent().position().left + ($(elementoId).width() / 2);

        //$elemento.children('.arrowUpDetalhes').css("left", leftButton);

        //$elemento.slideDown('slow');
        //$elemento.css({ display: 'inline-block' });

        data.fcv.ExibirInformacoesExtras(true);
        data.fcv.InformacoesExtras(null);
        data.fcv.BtnInformacoesExtras(data.Status);

        showInfoDetalhesAlarme({
            Codigo: data.fcv.Codigo(),
            Status: data.Status,
            Atualizar: false,
            BotaoAlarme: elementoId,
            funcaoElemento: data.fcv.InformacoesExtras
        });
    }
}

function retornoBotaoAlarme(data) {
    // Alarmes Pendentes
    if (data.Status == 2) {
        return "#btnAlarmesPendentes" + data.fcv.Codigo();
    }
    // Alarmes Validos
    else if (data.Status == 3) {
        return "#btnAlarmesValidos" + data.fcv.Codigo();
    }
    // Alarmes Invalidos
    else if (data.Status == 4) {
        return "#btnAlarmesInvalidos" + data.fcv.Codigo();
    }
    return;
}


function retornoDescricaoAlarmes(data) {
    // Alarmes Pendentes
    if (data.Status == 2) {
        return "&nbsp;ALARMES PENDENTES";
    }
    // Alarmes Validos
    else if (data.Status == 3) {
        return "&nbsp;ALARMES VALIDOS";
    }
    // Alarmes Invalidos
    else if (data.Status == 4) {
        return "&nbsp;ALARMES INVALIDOS";
    }
    return;
}

//Controle de informações detalhes de alarmes abertos;
var infoDetalhesAlarmes = {};

/*
value.Status == 1 = 'Alarmes Pendentes'
value.Status == 2 = 'Alarmes Finalizados'
 
exemplo: showInfoDetalhesAlarme({Codigo: codigoFcv, Status: 1, Atualizar: true});
*/
function showInfoDetalhesAlarme(value) {
    //    if (infoDetalhesAlarmes[value.Codigo] != null && typeof ([value.Codigo]) != 'undefined') {
    //        if (value.Status == infoDetalhesAlarmes[value.Codigo].Status && !value.Atualizar) {
    //            return;
    //        }
    //        else if (value.Status != infoDetalhesAlarmes[value.Codigo].Status) {
    //            return;
    //        }
    //    } else if (value.Atualizar) {
    //        return;
    //    }

    //infoDetalhesAlarmes[value.Codigo] = { Status: value.Status };
    //var nomeIdPrefixo = value.BotaoAlarme;

    //var $elemento = value.Elemento ? value.Elemento : $(nomeIdPrefixo).parent().parent().children('.detalhe-sinotico').children('.sinotico-container');

    var descricao = retornoDescricaoAlarmes(value);

    var urldetalhes = urlGlobal + "Operacao/Detalhes/BuscarAlarmesPorStatus";
    //var urlImages =  urlGlobal + "Images/loading.gif";

    $.ajax({
        url: urldetalhes,
        data: { fcv: value.Codigo, statusAlarme: value.Status },
        beforeSend: function () {
            //$elemento.find(".gradiente-item-conteudo-data").html("");
            //$elemento.find(".ajax-loader-large").removeClass("hide");
        },
        success: function (data) {
            if (data.indexOf("UserName") >= 0 && data.indexOf("Password") >= 0)
                window.location.href = urlGlobal + "Account/Login";
            else {
                //$elemento.find(".ajax-loader-large").addClass("hide");
                if (data != null && typeof (data) !== "undefined") {
                    //$elemento.find(".gradiente-item-conteudo-data").html("<h4>" + descricao + "</h4>" + data);
                    value.funcaoElemento("<h4>" + descricao + "</h4>" + data);
                }
            }
        }
    });
}

function atualizaPopUpFCV(codigoFCV) {
    // Valida se a pop-up esta aberta e atualiza conteudo
    if ($("#modal-fcv-conteudo_" + codigoFCV) != null && $("#modal-fcv-conteudo_" + codigoFCV).length > 0) {
        atualizarFCV($("#modal-fcv-conteudo_" + codigoFCV), codigoFCV);
    }
}

function ValidaSubGrupoSelecionado(valor) {
    if (tempoRealVM.Filtros.SubGrupoAtivas().length > 0) {
        for (var i = 0, len = this.FCVs().Filtros.SubGruposAtivas().length; i < len; i++) {
            if (this.FCVs().Filtros.SubGruposAtivas()[i] == valor) {
                return true;
            }
        }
        return false;
    } else {
        return false;
    }
}

// 1 = Enlace vigente
// 2 = Inconformidade Chegada

function atualizaTerminalInconformidade(fcv) {

    var visivel = false
    if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1") {
        if (fcv.EstadoAtiva() == "3") {
            visivel = visivel || ($.inArray("3", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
        }
        if (fcv.InconformidadeEnlacePlanejado()) {
            visivel = visivel || ($.inArray("4", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
        }
        if (fcv.PosicaoAtual.InconformidadeChegada()) {
            if (fcv.EstadoAtiva() == "2") { // InconformidadePrevisaoChegadaAdiantada
                visivel = visivel || ($.inArray("2", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
            } else if (fcv.EstadoAtiva() == "5") { // InconformidadePrevisaoChegadaAtrasada
                visivel = visivel || ($.inArray("5", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
            }
        }
        if (fcv.InconformidadeEnlaceAtual()) {
            visivel = visivel || ($.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
        }
        if (!fcv.InconformidadeEnlaceAtual() && !fcv.PosicaoAtual.InconformidadeChegada()) {
            visivel = visivel || ($.inArray("0", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1);
        }
        fcv.Visivel(visivel);
    }
    //    if (fcv.PosicaoAtual.DistanciaPercentual() > tempoRealVM.PercentualCalculoPrevisao()) {
    //        if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1" && $.inArray("2", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1
    //            && fcv.PosicaoAtual.InconformidadeChegada() && fcv.EnlaceAtual.SaidaRealizada()) {
    //            fcv.Visivel(true);
    //        }
    //        else if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1" && $.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1 
    //            && (fcv.InconformidadeEnlaceAtual() || (fcv.PosicaoAtual.InconformidadeChegada() && fcv.EnlaceAtual.SaidaRealizada()))) {
    //            fcv.Visivel(true);
    //        }
    //        else if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1"
    //            && ($.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) == -1 )
    //            && !fcv.PosicaoAtual.InconformidadeChegada()) {
    //            fcv.Visivel(false);
    //        }
    //        else if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1"
    //            && ($.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) == -1 && $.inArray("2", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) == -1)
    //            && !fcv.InconformidadeEnlaceAtual() && !fcv.PosicaoAtual.InconformidadeChegada()) {
    //            fcv.Visivel(false);
    //        }
    //    }
    //    else {
    //        if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1" && $.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1 
    //            || $.inArray("2", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) > -1 ) {
    //            fcv.Visivel(false);
    //        }
    //        else if (tempoRealVM.Filtros.StatusFCVSelecionado() == "1" && $.inArray("1", tempoRealVM.Filtros.EstadosFCVAtivaSelecionados()) == -1) {
    //            fcv.Visivel(!fcv.InconformidadeEnlaceAtual());
    //        }

    //    }
}

function atualizaTerminalFinal(fcv, parado) {
    var terminalVermelho = "terminal terminal-vermelho";
    var terminalVerde = "terminal terminal-verde";
    if (!parado && fcv.PosicaoAtual.DistanciaPercentual() > tempoRealVM.PercentualCalculoPrevisao()) {
        if (tempoRealVM.PermissoesUsuario.VisualizarInconformidadeTerminal()) {
            if (fcv.PosicaoAtual.InconformidadeChegada() && fcv.SinalizadorTerminalFinal() != terminalVermelho) {
                fcv.SinalizadorTerminalFinal(terminalVermelho);
            } else {
                if (!fcv.PosicaoAtual.InconformidadeChegada() && fcv.SinalizadorTerminalFinal() != terminalVerde) {
                    fcv.SinalizadorTerminalFinal(terminalVerde);
                }
            }
        } else {
            fcv.SinalizadorTerminalFinal(terminalVerde);
        }
    } else {
        fcv.SinalizadorTerminalFinal("terminal terminal-cinza");
    }
}


function DesabilitaAlarmes(habilitaTipos) {
    // Desabilita tipos de alarmes caso opção selecionada "Sem Alarmes"
    for (var i = 0; i < tempoRealVM.FiltrosDisponiveis.TiposAlarmes().length; i++) {
        tempoRealVM.FiltrosDisponiveis.TiposAlarmes()[i].Visivel(habilitaTipos);
    }

    if (habilitaTipos) {
        $('#chk_todos_tipos_alarmes').removeAttr('disabled');
    } else {
        $('#chk_todos_tipos_alarmes').attr('disabled', 'disabled');
    }
}


function limpaBackgroundBotoes(codigoFcv) {
    var id = "#slide_" + codigoFcv + '_';
    for (var i = 0; i < 7; i++) {
        if ($(id + i).hasClass('botao-indicador-selecioando')) {
            $(id + i).removeClass('botao-indicador-selecioando');
        }
    }
}

function showInfoTerminais(value) {
    var fcv = tempoRealVM.BuscaFCV(value.CodigoFcv);
    var cssSelectorForPopoverTemplate = "#" + value.tpl;

    var $elementTemp = $("<div id='" + value.CodigoFcv + "_temp'>" + $(cssSelectorForPopoverTemplate).html() + "</div>");
    ko.applyBindings(fcv, $elementTemp[0]);
    $("#" + (value.isTerminalInicial ? "info_terminal_inicial" : "info_terminal_final") + fcv.Codigo()).children('.info-term').html($elementTemp.html());
}

function showInfoDetalhesVeiculo(value) {
    var fcv = tempoRealVM.BuscaFCV(value);
    var content = veiculoTemplate(fcv);
    var dataOriginalTitle = veiculoTitle(fcv);
    $("#info_veiculo" + value).children('.info-veiculo').html(dataOriginalTitle + content);
}

tempoRealVM.ChamarRfid = function (data, event) {
    alert(event);
};

tempoRealVM.TotalFcvsVisiveis = ko.computed({
    read: function () {
        var total = 0;
        if (tempoRealVM.FCVs) {
            var array = tempoRealVM.FCVs();
            if (array instanceof Array) {
                for (var i in array) {
                    if (array[i].Visivel instanceof Function && array[i].Visivel()) {
                        total++;
                    }
                }
            }
        }
        return total;
    },
    write: function (value) {
        // NADA
    }
});

tempoRealVM.Titulo = ko.computed(function () {
    return "Total de FCV's (" + tempoRealVM.TotalFcvsVisiveis() + ")";
}, tempoRealVM);

//tempoRealVM.TotalFinalizados = ko.observable(0);
//ko.applyBindings(tempoRealVM);

tempoRealVM.Filtros.DataFinalizadoSelecionado.subscribe(function (value) {
    tempoRealVM.Filtros.DataFinalizado(value);
});

tempoRealVM.Filtros.StatusAlarmeSelecionado.subscribe(function (item) {
    if (item == "1")
        tempoRealVM.Filtros.TiposAlarmesSelecionados([]);
});

tempoRealVM.Filtros.StatusFCVSelecionado.subscribe(function (item) {
    if (finalizadosSelecioando()) {
        preencherFiltro(tempoRealVM.FiltrosDisponiveisFI);
    } else {
        preencherFiltro(tempoRealVM.FiltrosDisponiveisTR);
        if (item == "1" || item == "0") {
            // FCV ATIVAS
            tempoRealVM.Filtros.EstadosFCVAtivaSelecionados([]);
            var array = [];
            for (var i in tempoRealVM.FiltrosDisponiveisTR.EstadosFCVAtiva()) {
                array.push(tempoRealVM.FiltrosDisponiveisTR.EstadosFCVAtiva()[i].Value());
            }
            tempoRealVM.Filtros.EstadosFCVAtivaSelecionados(array);
        } else if (item == "2" || item == "0") {
            // FCV INATIVAS
            tempoRealVM.Filtros.EstadosFCVInativaSelecionados([]);
            var array = [];
            for (var i in tempoRealVM.FiltrosDisponiveisTR.EstadosFCVInativa()) {
                array.push(tempoRealVM.FiltrosDisponiveisTR.EstadosFCVInativa()[i].Value());
            }
            tempoRealVM.Filtros.EstadosFCVInativaSelecionados(array);
        }
        else {
            tempoRealVM.Filtros.EstadosFCVAtivaSelecionados([]);
        }
    }
}
);

tempoRealVM.Filtros.EstadosFCVAtivaSelecionadosMobile.subscribe(function (item) {
    if ($.inArray("2", item) == -1) {
        // FCV ATIVAS
        tempoRealVM.Filtros.EstadosFCVAtivaSelecionados([]);
        var array = [];
        for (var i in tempoRealVM.FiltrosDisponiveisTR.EstadosFCVAtivaSelecionados()) {
            array.push(tempoRealVM.FiltrosDisponiveisTR.EstadosFCVAtivaSelecionados()[i].Value());
        }
        tempoRealVM.Filtros.EstadosFCVAtivaSelecionados(array);
    } else {
        tempoRealVM.Filtros.EstadosFCVAtivaSelecionados([]);
    }
}
);

tempoRealVM.Filtros.VeiculosSelecionados.subscribe(function (item) {
    if (item.length > 0) {
        tempoRealVM.Filtros.TerminaisSelecionados([]);
        tempoRealVM.Filtros.LinhasSelecionadas([]);
        tempoRealVM.Filtros.TabelasSelecionadas([]);
        tempoRealVM.Filtros.TiposAlarmesSelecionados([]);
        tempoRealVM.Filtros.MotoristasSelecionados([]);
        tempoRealVM.Filtros.LinhasOrigensSelecionadas([]);
        tempoRealVM.Filtros.OperacoesSelecionadas([]);

        if (finalizadosSelecioando()) {
            tempoRealVM.Filtros.StatusFCVSelecionado("3");
            tempoRealVM.Filtros.StatusFCVSelecionadoMobile(["3"]);
        } else {
            tempoRealVM.Filtros.StatusFCVSelecionado("0");
            tempoRealVM.Filtros.StatusFCVSelecionadoMobile(["0"]);
        }

        tempoRealVM.Filtros.StatusAlarmeSelecionado("5");
        tempoRealVM.Filtros.StatusAlarmeSelecionadoMobile([]);
    }
});

tempoRealVM.Filtros.LinhasSelecionadas.subscribe(
    function (item) {
        if (item.length > 0) {
            tempoRealVM.Filtros.VeiculosSelecionados([]);
        }
        //    if (lastElementPopover) {
        //        lastElementPopover.popover("destroy");
        //    }
    });

tempoRealVM.Filtros.LinhasOrigensSelecionadas.subscribe(
    function (item) {
        if (item.length > 0) {
            tempoRealVM.Filtros.VeiculosSelecionados([]);
        }
    });

tempoRealVM.Filtros.OperacoesSelecionadas.subscribe(
    function (item) {
        if (item.length > 0) {
            tempoRealVM.Filtros.VeiculosSelecionados([]);
        }
    });

tempoRealVM.Filtros.TerminaisSelecionados.subscribe(
    function (item) {
        if (item.length > 0) {
            tempoRealVM.Filtros.VeiculosSelecionados([]);
        }
    });

tempoRealVM.Filtros.StatusAlarmeSelecionado.subscribe(
    function (item) {
        //tempoRealVM.Filtros.VeiculosSelecionados([]);
        DesabilitaAlarmes(item != "1");
    });

tempoRealVM.Filtros.TiposAlarmesSelecionados.subscribe(
    function (item) {
        if (item.length > 0) {
            tempoRealVM.Filtros.VeiculosSelecionados([]);
        }
    });

tempoRealVM.Filtros.StatusFCVSelecionado.subscribe(
    function (item) {
        //tempoRealVM.Filtros.VeiculosSelecionados([]);
    });

/*
 
tempoRealVM.LimparFiltros = function () {
this.Filtros.TerminaisSelecionados([]);
this.Filtros.LinhasSelecionadas([]);
this.Filtros.VeiculosSelecionados([]);
this.Filtros.TabelasSelecionadas([]);
this.Filtros.TiposAlarmesSelecionados([]);
 
this.Filtros.StatusFCVSelecionado("0");
this.Filtros.StatusAlarmeSelecionado("");
this.Filtros.StatusFCVSelecionadoMobile(["0"]);
this.Filtros.StatusAlarmeSelecionadoMobile([]);
}
*/
function validaVisibilidade(visivel, status) {
    return (visivel && status != '3') ||
        (visivel && status == '3');
}

var mMetodo = "header";
$(document).on("click", ".fcv-clicavel", function () {
    switch (mMetodo) {
        case "header":
            $(".fcv-clicada-header").removeClass("fcv-clicada-header");
            $(this).children(".row-fluid.show-grid").addClass("fcv-clicada-header");
            break;
        default:
            $(".fcv-clicada-border").removeClass("fcv-clicada-border");
            $(this).addClass("fcv-clicada-border");
    }
});


function CarregarFiltroFinalizadoPorData(dataReferencia) {
    $.ajax({
        url: urlGlobal + "Operacao/TempoReal/CarregarFiltroFinalizadoPorData",
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        data: { dataReferencia: dataReferencia },
        success: function (data) {
            if (typeof (data) === "string") {
                if (data.indexOf("UserName") >= 0 &&
                    data.indexOf("Password") >= 0)
                    window.location.href = urlGlobal + "Account/Login";
            } else if (data != "") {
                tempoRealVM.FiltrosDisponiveisFI = ko.mapping.fromJS(data)
                preencherFiltro(tempoRealVM.FiltrosDisponiveisFI);
                tempoRealVM.Filtros.DataFinalizadoSelecionado(dataReferencia);
            }
        },
        complete: function () {
            tempoRealVM.Filtrando(false);
        }
    });
}

//tempoRealVM.Filtros.DataFinalizadoSelecionado.subscribe(
//function (item) {
//    waitForFinalEventDataFinalizada(
//    CarregarFiltroFinalizadoPorData(item), 2000, "CarregarFiltroFinalizadoPorData");
//});

var waitForFinalEventDataFinalizada = (function () {
    var timers = {};
    return function (callback, ms, uniqueId) {
        if (!uniqueId) {
            uniqueId = "CarregarFiltroFinalizadoPorData";
        }
        if (timers[uniqueId]) {
            clearTimeout(timers[uniqueId]);
        }
        timers[uniqueId] = setTimeout(callback, ms);
    };
})();


function ValidarDataFiltro() {

    // Validar data do filtro se for maior que a data de hoje!
    if (new Date(tempoRealVM.Filtros.DataFinalizadoSelecionado()) > new Date().setHours(0, 0, 0, 0)) {
        // TODO: trocar a mensagem pelo resources
        alert("A data selecionada deve ser menor ou igual que a data de hoje");

        return false;
    }

    return true;
}

function checkQuantidade(v) {
    if (typeof (v) !== "undefined") {
        return v > 0;
    }

    return false;
}

function verificaPosicaoPrevista(fcv) {
    try {
        if ((!fcv.PosicaoAtual.InconformidadeChegada() || VerificarParado(fcv)) && !fcv.PosicaoAtual.InconformidadeDePlanejamento())
            return -1;

        if (fcv.PosicaoAtual.InconformidadeDePlanejamento()) {
            var pos = fcv.PosicaoAtual.TerminaisEmInconformidadePlanejamento().length - 2;
            if (pos < 0)
                return -1;

            var termIni = fcv.PosicaoAtual.TerminaisEmInconformidadePlanejamento()[pos];
            var termFim = fcv.PosicaoAtual.TerminaisEmInconformidadePlanejamento()[pos + 1];
            var dataSaida = new Date(termIni.SaidaPrevista());
            var dataEntrada = new Date(termFim.ChegadaPrevista());
            //var segundos = (dataEntrada.getTime() - new Date(fcv.PosicaoAtual.PrevisaoChegada()).getTime()) / 1000;
            var segundos = (new Date(fcv.PosicaoAtual.DataHora()).getTime() - dataSaida.getTime()) / 1000;
            var dif = (dataEntrada.getTime() - dataSaida.getTime()) / 1000;

            return (segundos / dif) > 1 ? 1 : (segundos / dif);
        } else {
            var dataSaida = new Date(fcv.EnlaceAtual.SaidaPrevista());
            var dataEntrada = new Date(fcv.TerminalFinal.ChegadaPrevista());
            //var segundos = (dataEntrada.getTime() - new Date(fcv.PosicaoAtual.PrevisaoChegada()).getTime()) / 1000;
            var segundos = (new Date(fcv.PosicaoAtual.DataHora()).getTime() - dataSaida.getTime()) / 1000;
            var dif = (dataEntrada.getTime() - dataSaida.getTime()) / 1000;

            return (segundos / dif) > 1 ? 1 : (segundos / dif);
        }
    } catch (Exc) {
        return -1;
    }
}

function PosicaoFcv(fcv, valorPosicao, parado) {

    var ultimaPosicaoAux = 0;

    if (typeof (fcv.DentroTerminal) !== 'undefined' && typeof (fcv.PosicaoAtual) !== 'undefined'
        && typeof (fcv.PosicaoAtual.DistanciaPercentual) !== 'undefined'
        && fcv.PosicaoAtual.DistanciaPercentual() > 25 //Verificar necessária para saber se o veículo está a caminho do terminal final.
        && fcv.DentroTerminal()
        && !parado) {
        ultimaPosicaoAux = 97; //Veículo já está no terminal, então o valor da distância é irrelevante.
    } else {
        ultimaPosicaoAux = typeof (fcv.PosicaoAtual) === 'undefined' ? valorPosicao : typeof (fcv.PosicaoAtual.DistanciaPercentual) === 'undefined' ? valorPosicao : fcv.PosicaoAtual.DistanciaPercentual();
    }

    if (ko.isObservable(fcv.TerminalInicial.SaidaRealizadaString) && fcv.TerminalInicial.SaidaRealizadaString().length == 0 && !fcv.DentroTerminal())
        ultimaPosicaoAux = 0;

    return ultimaPosicaoAux;
}

function VerificarParado(fcv) {

    var parado = ko.isObservable(fcv.TerminalInicial.SaidaRealizadaString) && fcv.TerminalInicial.SaidaRealizadaString().length == 0 && fcv.DentroTerminal();

    return parado;
}


tempoRealVM.abrirDialogfinalizaFCV = function (fcv) {
    $("#dialogFinalizaFCV").dialog({
        autoOpen: false,
        modal: false,
        draggable: true,
        resizable: false,
        width: 500,
        show: "blind",
        buttons: {
            "Confirmar": function () {
                $(this).dialog("close");
                finalizarFCV(fcv.Codigo());
            },
            "Cancelar": function () {
                $(this).dialog("close");
            }
        }
    });

    $("#dialogFinalizaFCV").dialog("open");
}

function finalizarFCV(codigoFCV) {
    $.ajax({
        url: urlGlobal + "Operacao/TempoReal/FinalizarFCV?codigoFCv=" + codigoFCV,
        type: "GET",
        success: function (data) {
            data = JSON.parse(data);
            if (typeof (data) === "string") {
                if (data.indexOf("UserName") >= 0 &&
                    data.indexOf("Password") >= 0)
                    window.location.href = urlGlobal + "Account/Login";
            } else if (data.Sucesso) {
                alert(data.MensagemSucesso);
                tempoRealVM.RemoverFCV(codigoFCV);
            } else {
                alert(data.MensagemErro);
            }
        }
    });
}

function PesquisarRFIDPorOperacao(codigo) {
    var ops = tempoRealVM.Operacoes();
    for (var i in ops) {
        if (ops[i].Codigo() == codigo) {
            return ops[i].PesquisaRfid();
        }
    }

    return false;
}
