function EntidadesExclusaoModel() {
    "use strict";
    var mSelf = this,
        novo = null;

    mSelf.Lista = ko.observableArray([]);
    mSelf.Add = ko.observable(false);

    mSelf.ListaAtiva = ko.computed(function () {
        return ko.utils.arrayFilter(mSelf.Lista(), function (item) {
            return !item.IsApagado();
        });
    });

    mSelf.ListaSelecionada = ko.observableArray();

    mSelf.TerminaisAdicionar = ko.computed(function () {
        var enlaceEdicao = null,
            fora = [],
            filtro = null,
            lista = [];

        if (vm && vm.Enlaces) {
            enlaceEdicao = vm.Enlaces.Lista()[vm.Enlaces.EnlaceEdicao()];
            if (enlaceEdicao) {
                fora = [
                    enlaceEdicao.TerminalInicial() != null ? enlaceEdicao.TerminalInicial().CodigoGrupoEntidade() : null,
                    enlaceEdicao.TerminalFinal() != null ? enlaceEdicao.TerminalFinal().CodigoGrupoEntidade() : null
                ];
            }
        }

        ko.utils.arrayForEach(mSelf.ListaAtiva(), function (ent) {
            if (ent.Forma()) {
                fora.push(ent.Forma().CodigoGrupoEntidade());
            }            
        });

        if (vm && vm.Terminais) {
            filtro = ko.utils.arrayFilter(vm.Terminais.Lista(), function (t) {
                var contains = ko.utils.arrayFirst(fora, function (codigo) {
                    return codigo === t.CodigoGrupoEntidade();
                });

                if (contains == null) {
                    return t;
                }
            });
        }

        if (filtro) {
            lista = ko.utils.arrayMap(filtro, function (t) {
                return new EntidadeExclusaoModel({
                    Codigo: -1,
                    CodigoEnlace: 0,
                    CodigoGrupo: t.CodigoGrupoEntidade(),
                    Apagado: "F"
                });
            });
        }
        return lista;
    });

    mSelf.ListaVisivel = ko.computed(function () {
        return mSelf.Lista().length > 0;
    });

    mSelf.finalizar = function () {
        for (var item in mSelf.Lista()) {
            if (mSelf.Lista()[item].Forma().infoWindow != null)
                mSelf.Lista()[item].Forma().infoWindow.setMap(null);

            mSelf.Lista()[item].Forma(null);
        }
        mSelf.Lista.removeAll();
    };

    mSelf.removeItemLista = function (item) {
        var term = ko.utils.arrayFirst(vm.Enlaces.Novo.ListaExclusao.Lista(), function (terminal) {
            return terminal.Forma().Codigo() == item.Codigo();
        });
        if (term) {
            term.remover();
        } else {
            abrirModalMensagem("Erro", "Terminal não encontrado na lista de exclusão.");
        }

    };


    mSelf.mostrarExcluidos = function (mostrar) {
        var ativos = mSelf.ListaAtiva(),
            mapa = mostrar ? map : null;

        var clickHandler = new Handler({ eventName: "click" });

        var terminaisEnlaces = [];
        ko.utils.arrayForEach(vm.Enlaces.Lista(), function (item){
            if (terminaisEnlaces.indexOf(item.CodigoGrupoEntidadeIni() < 0))
                terminaisEnlaces.push(item.CodigoGrupoEntidadeIni());

            if (terminaisEnlaces.indexOf(item.CodigoGrupoEntidadeFim() < 0))
                terminaisEnlaces.push(item.CodigoGrupoEntidadeFim());
        });

        ko.utils.arrayForEach(ativos, function (entidade) {
            if (!terminaisEnlaces.indexOf(entidade) > -1) {
                var terminal = entidade.Forma();
                if (terminal) {
                    terminal.setMap(mapa);
                    terminal.setCor("#FF0000");
                }                
            }
        });

        if (mapa) {
            clickHandler.callback = function (e, term) {
                var entidade = ko.utils.arrayFirst(ativos, function (ent) {
                    return ent.Forma() === term;
                });
                if (entidade) {
                    mSelf.editar(entidade);
                }
            };
        }
        vm.Terminais.setFormaEvents([
            clickHandler
        ]);
    };

    mSelf.botoesEnable = ko.observable(true);
    mSelf.editar = function (entidade, irPara) {
        if (mSelf.Add()) {
            return;
        }
        var array = mSelf.Lista();
        var rightClickHandler = new Handler({ eventName: "rightclick" });
        for (var i = 0, j = array.length; i < j; i++) {
            if (array[i].IsEditando()) {
                array[i].editar();
                array[i].Forma().setFormaEvent([
                    rightClickHandler
                ]);
                if (array[i] === entidade) {
                    mSelf.botoesEnable(true);
                    return;
                }
                break;
            }
        }
        if (entidade) {
            entidade.editar(irPara);

            rightClickHandler.callback = function (e, terminal) {
                var arrayItens = [];
                arrayItens.push({ Texto: "Remover", Click: function () { entidade.remover(); } });
                vm.MenuContexto.show(arrayItens, e);
            };

            entidade.Forma().setFormaEvent([
                rightClickHandler
            ]);
            mSelf.botoesEnable(false);
        }
    };

    mSelf.toggleEnabled = ko.observable(true);
    mSelf.toggleAdicionar = function () {
        if (mSelf.toggleEnabled()) {
            mSelf.editar();
            var aux = mSelf.Add(),
            clickHandler = new Handler({ eventName: "click" }),
            enlaceEdicao = vm.Enlaces.Lista()[vm.Enlaces.EnlaceEdicao()];

            mSelf.Add(!aux);
            mSelf.mostrarExcluidos(false);

            // remove os eventos de click
            vm.Terminais.setFormaEvents([
            clickHandler
        ]);

            var naoAlterarCor = [
            enlaceEdicao.TerminalInicial().CodigoGrupoEntidade(),
            enlaceEdicao.TerminalFinal().CodigoGrupoEntidade()
        ];

            ko.utils.arrayForEach(mSelf.ListaAtiva(), function (ent) {
                if(ent.Forma())
                    naoAlterarCor.push(ent.Forma().CodigoGrupoEntidade());
            });

            vm.Terminais.mostrarTodosTerminais("#808080", naoAlterarCor);

            if (!aux) {
                clickHandler.callback = function (e, terminal) {
                    mSelf.addTerminal(terminal);
                };

                vm.Terminais.setFormaEvents([
                    clickHandler
                ]);
                mSelf.botoesEnable(false);
                mSelf.toggleEnabled(false);
            } else {
                vm.Terminais.mostrarTerminaisEnlace(enlaceEdicao);
                mSelf.mostrarExcluidos(true);
                mSelf.botoesEnable(true);
            }

            vm.Enlaces.permiteAcaoListaExclusao(false);
        }
    };

    var cont = -1;
    mSelf.addTerminal = function (terminal) {
        var enlaceEdicao = vm.Enlaces.Lista()[vm.Enlaces.EnlaceEdicao()];
        if (enlaceEdicao.TerminalInicial() != terminal &&
                    enlaceEdicao.TerminalFinal() != terminal) {
            var aux = ko.utils.arrayFirst(mSelf.TerminaisAdicionar(), function (t) {
                return t.Forma().Codigo() == terminal.Codigo();
            });

            if (aux) {
                var isSelected = !aux.Selected();
                aux.Selected(isSelected);
            }
        }
    };

    mSelf.adicionarNovos = function () {
        var selecionados = ko.utils.arrayFilter(mSelf.TerminaisAdicionar(), function (ent) {
            return ent.Selected();
        });
        mSelf.Lista.push.apply(mSelf.Lista, selecionados);
        mSelf.toggleEnabled(true);
        mSelf.toggleAdicionar();
    };

    mSelf.cancelarNovos = function () {
        mSelf.toggleEnabled(true);
        mSelf.toggleAdicionar();
        vm.Enlaces.Novo.fecharItensMenu("ListaExclusaoVisivel");
    };

    mSelf.salvar = function () {
        var toSave = null,
            lista = ko.utils.arrayFilter(mSelf.Lista(), function (ent) {
                return ent.Codigo() > 0 || (ent.Codigo() < 0 && !ent.IsApagado());
            });

        toSave = ko.utils.arrayMap(lista, function (ent) {
            return ent.salvar();
        });

        return toSave;
    };


    mSelf.cssBtn = ko.computed(function () {
        var className = "btn";
        if (mSelf.botoesEnable()) {
            className += " btn-info";
        }
        className += " btn-small";
        return className;
    });
}