function ProjetosViewModel(lista) {
    var self = this;

    self.ListaProjetos = ko.observableArray(lista);

    self.ListaProjetosFiltrada = ko.observableArray([]);

    self.Filtro = ko.observable("");

    self.ProjetoFcvSelecionada = ko.observable(null);

    self.ProjetoEntidadeExclusao = new ProjetoEntidadeExclusao();

    self.Filtro.subscribe(function (value) {
        self.filtrarProjetos();
    });

    self.textoMensagem = ko.observable();

    self.filtrarProjetos = function () {
        var selecionados = ko.utils.arrayFilter(vm.ListaProjetos(), function (fcv) {
            if (vm.Filtro().length >= 0 && vm.Filtro().trim() != "") {
                var linhas = [];
                ko.utils.arrayForEach(fcv.Linhas.$values(), function (linha) {
                    if (linha.Descricao().toLowerCase().indexOf(vm.Filtro().toLowerCase()) > -1)
                        linhas.push(linha.Descricao());
                });

                return fcv.Descricao().toLowerCase().indexOf(vm.Filtro().toLowerCase()) > -1 || linhas.length > 0;
            }
        });
        vm.ListaProjetosFiltrada(selecionados);

        aplicarEventoClick();
    };

    self.clickItemFcv = function (viewModel) {
        self.ProjetoFcvSelecionada(viewModel);
    };

    self.getEnlaceSelecionado = function (enlace, event) {
        if (!self.ProjetoEntidadeExclusao.EditandoLista()) {

            var mesmoEnlace = self.ProjetoEntidadeExclusao.CodigoEnlace() == 0 || self.ProjetoEntidadeExclusao.CodigoEnlace() == enlace.Codigo();

            if (self.ProjetoEntidadeExclusao.Exclusoes().length > 0)
                ocultarListaEntidades(self.ProjetoEntidadeExclusao.Exclusoes());

            if (self.ProjetoEntidadeExclusao.Entidades().length > 0)
                ocultarListaEntidades(self.ProjetoEntidadeExclusao.Entidades());

            self.ProjetoEntidadeExclusao.CodigoEnlace(enlace.Codigo());

            self.ProjetoEntidadeExclusao.Exclusoes([]);

            self.ProjetoEntidadeExclusao.Entidades([]);

            var exclusoes = [];

            var entidades = [];

            if (enlace.EnlacesExclusoes && enlace.EnlacesExclusoes.$values && enlace.EnlacesExclusoes.$values().length > 0) {

                exclusoes = enlace.EnlacesExclusoes.$values();
            }

            if (self.ProjetoFcvSelecionada && self.ProjetoFcvSelecionada().EntidadesDisponiveis
            && self.ProjetoFcvSelecionada().EntidadesDisponiveis.$values && self.ProjetoFcvSelecionada().EntidadesDisponiveis.$values().length > 0) {

                entidades = self.ProjetoFcvSelecionada().EntidadesDisponiveis.$values();
            }

            self.ProjetoEntidadeExclusao.Entidades(entidades);

            self.ProjetoEntidadeExclusao.Exclusoes(exclusoes);

            self.ProjetoEntidadeExclusao.EnlaceSelecionado(enlace);

            if (!mesmoEnlace || (mesmoEnlace && !self.ProjetoEntidadeExclusao.EnlaceAberto())) {
                plotarListaEntidades(self.ProjetoEntidadeExclusao.Exclusoes(), "#FF0000");
                self.ProjetoEntidadeExclusao.EnlaceAberto(true);
            } else {
                self.ProjetoEntidadeExclusao.EnlaceAberto(false);
            }
        }
    };

    self.ListaExclusaoCopia = ko.observableArray([]);

    self.criaListaCopia = function () {
        self.ListaExclusaoCopia([]);
        ko.utils.arrayForEach(self.ProjetoEntidadeExclusao.Exclusoes(), function (item) {
            self.ListaExclusaoCopia.push(item);
        });
    };

    self.refazerOriginal = function () {
        self.ProjetoEntidadeExclusao.Exclusoes([]);
        ko.utils.arrayForEach(self.ListaExclusaoCopia(), function (item) {
            self.ProjetoEntidadeExclusao.Exclusoes.push(item);
        });
    };
}

function getProjetos() {

    $(".loading").toggleClass("hide");
    $("#txtDescricaoFCV").attr("readonly", true);
    $.ajax({
        url: urlGlobal + "api/Operacao/ListaExclusaoConsulta/Get",
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        type: "GET",
        success: function (data) {
            if (data != null) {
                vm = new ProjetosViewModel(ko.mapping.fromJS(data.$values)());
                ko.applyBindings(vm);
                $("#txtDescricaoFCV").attr("readonly", false);
            } else {
                vm = new ProjetosViewModel();
                $("#lista_fcv").html("Nenhum registro encontrado.");
            }
        },
        complete: function () {
            $(".loading").toggleClass("hide");
        }
    });
}

function aplicarEventoClick() {
    //evento ao clicar numa FCV encontrada na lista das pesquisadas
    $('.item_fcv').click(function () {
        $('#busca_fcv').hide();
        titulo_menu = 'FCV ' + $(this).text() + ' (Enlaces)';
        mudaTituloMenu(titulo_menu);
        $('#detail_fcv').show();

        btnVoltar();
        popoverEditarItens();
        cliqueEnlace();

    });
}

function limparListaProjetos() {
    vm.Filtro("");
    vm.ListaProjetosFiltrada([]);
}

function deletarItem(item) {
    if (!vm.ProjetoEntidadeExclusao.EditandoLista()) {
        exibirMensagem('Deseja excluir "' + item.Descricao() + '" da lista?',
        {
            title: "Excluir",
            resizable: false,
            height: 190,
            modal: true,
            buttons: {
                "Sim": function () {
                    var parametro = { Codigo: item.Codigo(), CodigoProjeto: vm.ProjetoFcvSelecionada().Codigo() };

                    LoadingOn();
                    $.ajax({
                        url: urlGlobal + "api/Operacao/ListaExclusaoComando/ExcluirItem",
                        dataType: "json",
                        type: "POST",
                        data: parametro,
                        success: function (data) {
                            LoadingOff();
                            if (data) {
                                //limpa as entidades do mapa
                                ocultarListaEntidades(vm.ProjetoEntidadeExclusao.Entidades());
                                ocultarListaEntidades(vm.ProjetoEntidadeExclusao.Exclusoes());

                                //Apagar item da lista
                                vm.ProjetoEntidadeExclusao.Exclusoes.remove(item);

                                plotarListaEntidades(vm.ProjetoEntidadeExclusao.Exclusoes(), "#FF0000");

                                atualizarListaExclusaoMenu();
                            } else {
                                exibirMensagem('Erro ao excluir o item.',
                                {
                                    title: "Excluir",
                                    resizable: false,
                                    height: 190,
                                    modal: true,
                                    buttons: {
                                        "Fechar": function () {
                                            $(this).dialog("close");
                                        }
                                    }
                                });
                            }
                        },
                        complete: function () {
                            LoadingOff();
                        }
                    });

                    $(this).dialog("close");

                },
                "Não": function () {
                    $(this).dialog("close");
                }
            }
        });
    }
}

function salvarLista(modelExclusao, popover) {
    LoadingOn();
    $.ajax({
        url: urlGlobal + "api/Operacao/ListaExclusaoComando/SalvarListaExclusao",
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        type: "POST",
        data: JSON.stringify(modelExclusao),
        success: function (data) {
            LoadingOff();
            if (data != null && data.Sucesso) {
                //permite que o usuário altere o enlace selecionado
                vm.ProjetoEntidadeExclusao.EditandoLista(false);

                popover.popover('hide');

                var listaAtualizada = ko.mapping.fromJS(data.Lista.$values);

                //limpa as entidades do mapa
                ocultarListaEntidades(vm.ProjetoEntidadeExclusao.Entidades());
                ocultarListaEntidades(vm.ProjetoEntidadeExclusao.Exclusoes());

                vm.ProjetoEntidadeExclusao.Exclusoes([]);

                vm.ProjetoEntidadeExclusao.Exclusoes(listaAtualizada());

                //plota a lista de exlusão do enlace selecionado
                plotarListaEntidades(vm.ProjetoEntidadeExclusao.Exclusoes(), "#FF0000");

                atualizarListaExclusaoMenu();
            } else {
                exibirMensagem('Erro ao atualizar lista de exclusão.',
                {
                    title: "Atualizar",
                    resizable: false,
                    height: 190,
                    modal: true,
                    buttons: {
                        "Fechar": function () {
                            $(this).dialog("close");
                        }
                    }
                });
            }
        },
        complete: function () {
            LoadingOff();
        }
    });
}

function exibirMensagem(mensagem, options) {
    vm.textoMensagem(mensagem);
    $("#dialog-mensagem").dialog(options);
}