function ListaUsuariosViewModel(data, teste) {

    var mSelf = this;

    mSelf.ModuloId = data.ModuloId;

    mSelf.Template = data.Template;

    mSelf.Data = ko.observable(new OpcoesListarUsuarios(data));

    mSelf.Init = function () {

    };

    mSelf.Ordem = 2;

    mSelf.CriarUsuario = function () {
        //verifica se a guia de edição de usuário está aberta
        if ($('a[href="#cadastro_usuario"]').length) {
            abrirDialogModal(null, "Editar usuário", "Já existe um usuário em edição ou cadastro.");
        } else {
            $.ajax({
                url: urlGlobal + "Autenticador/Autenticador/CriarUsuario",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "GET",
                success: function (ret) {
                    if (ret) {
                        var usuario = ko.mapping.fromJS(ret);
                        var ferramenta = vm.GetFerramenta("FerramentaCadastroEdicaoUsuario");
                        if (ferramenta) {
                            //verifica se a guia de edição de usuário está aberta
                            ferramenta.Data(new FerramentaUsuarioCadastroEdicaoOpcoes(usuario));
                            ferramenta.Data().Init();

                            //cria a guia de Cadastro de usuário
                            newTab('cadastro_usuario', 'Cadastro usuário', 'glyphicon glyphicon-pencil', $('a[href="#usuarios"]').parent('li'));

                            //configuracoes treeview
                            configuraTreeViewBonsai('#checkboxes-bonsai');
                        }
                    }
                },
                complete: function () {
                    $(".loading-inlog").fadeOut();
                }
            }).done(function () {
                slideAdjust();
            }).fail(function (obj, type) {
                if (type === "parsererror") window.document.write(obj.responseText);
            });
        }
    };
}

function OpcoesListarUsuarios(viewModel) {
    var mSelf = this;

    mSelf.Lista = viewModel.Data;

    mSelf.TextoFiltro = ko.observable("");

    mSelf.ListaFiltrada = ko.observableArray(mSelf.Lista());

    mSelf.CodigoUsuarioEdicao = ko.observable();

    mSelf.FerramentaEdicaoUsuario;

    mSelf.BloquearUsuario = function (usuario) {
        abrirDialogModal({
            resizable: false,
            height: 190,
            modal: true,
            buttons: [
                 {
                     text: "Sim",
                     "class": 'botaoSim',
                     click: function () {
                         mSelf.Bloquear(usuario);
                     }
                 },
                 {
                     text: "Não",
                     "class": 'botaoNao',
                     click: function () {
                         $(this).dialog("close");
                     }
                 }]
        },
            "Bloquear usuário",
            "Confirma " + (usuario.Bloqueado() == "T" ? "desbloquear" : "bloquear") + " o usuário selecionado?");
    };

    mSelf.Bloquear = function (usuario) {

        $("#dialog-confirm").dialog("close");

        var param = {
            'codigoUsuario': usuario.Codigo()
        };

        $(".loading-inlog").fadeIn(500);

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/BloquearUsuario",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            data: param,
            success: function (ret) {
                if (ret && ret.Sucesso) {
                    abrirDialogModal(null, "Bloquear usuário", "Usuário " + (usuario.Bloqueado() == "T" ? "desbloqueado" : "bloqueado") + " com sucesso.")

                    //altera o usuário para bloqueado
                    usuario.Bloqueado(usuario.Bloqueado() == "T" ? "F" : "T");
                } else {
                    abrirDialogModal(null, "Bloquear usuário", "Erro ao " + (usuario.Bloqueado() == "T" ? "desbloquear" : "bloquear") + " usuário.");
                }
            },
            complete: function () {
                $(".loading-inlog").fadeOut();
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    }

    mSelf.FiltrarUsuarios = function () {
        mSelf.ListaFiltrada([]);
        if (mSelf.TextoFiltro() != "") {

            var filtro = [];

            ko.utils.arrayForEach(mSelf.Lista(), function (usuario) {

                if (usuario.Nome().toLowerCase().indexOf(mSelf.TextoFiltro().toLowerCase()) > -1 || (usuario.TipoUsuario != null && usuario.TipoUsuario.Descricao().toLowerCase().indexOf(mSelf.TextoFiltro().toLowerCase()) > -1))
                    filtro.push(usuario);
            });

            mSelf.ListaFiltrada(filtro);
        } else {
            mSelf.ListaFiltrada(mSelf.Lista());
        }
    };

    mSelf.EditarUsuario = function (data, evt) {

        //verifica se a guia de edição de usuário está aberta
        if ($('a[href="#cadastro_usuario"]').length) {
            var param = {
                'codigoUsuario': mSelf.FerramentaEdicaoUsuario.UsuarioSelecionado().Codigo()
            };
            mSelf.ConsultaUsuarioCodigo(param, data, mSelf.GuiaAbertaUsuario);

        } else {
            var param = {
                'codigoUsuario': data.Codigo()
            };
            mSelf.ConsultaUsuarioCodigo(param, data, mSelf.AbreNovoUsuario);

        }
    };

    mSelf.ResetarSenha = function (usuario) {
        mSelf.CodigoUsuario = usuario;
    }

    mSelf.ConfirmarResetarSenha = function (data, evt) {
        var param = {
            'codigoUsuario': mSelf.CodigoUsuario
        };
        $('#textoSenha').val("");
        $(".loading-inlog").fadeIn(500);
        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ResetarSenha",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            data: param,
            success: function (ret) {
                $('#textoSenha').val(ret.Objeto);

            },
            complete: function () {
                $(".loading-inlog").fadeOut();
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    }

    mSelf.AbreNovoUsuario = function (usuario, data) {

        var ferramenta = vm.GetFerramenta("FerramentaCadastroEdicaoUsuario");
        if (ferramenta && usuario != null) {

            mSelf.FerramentaEdicaoUsuario = new FerramentaUsuarioCadastroEdicaoOpcoes(usuario);

            ferramenta.Data(mSelf.FerramentaEdicaoUsuario);

            mSelf.CodigoUsuarioEdicao(usuario.Codigo());
            ferramenta.Data().Init();

            //cria a guia de edição de usuário
            newTab('cadastro_usuario', 'Edição usuário - ' + usuario.Nome(), 'glyphicon glyphicon-pencil', $('a[href="#usuarios"]').parent('li'));

            mSelf.UltimoUsuarioSelecionado(data);
        }
    }

    mSelf.GuiaAbertaUsuario = function (usuario, data) {

        var usuarioAntigo = mSelf.FerramentaEdicaoUsuario.GetUsuarioSelecionado();

        if (mSelf.CodigoUsuarioEdicao() == data.Codigo()) {

            activeTabChange($('a[href="#cadastro_usuario"]').parent('li'));

        } else if (!mSelf.ValidaAlteracaoUsuario(usuario, usuarioAntigo)) {

            abrirDialogModal(null, "Editar usuário", "Já existe um usuário em edição.");

            activeTabChange($('a[href="#cadastro_usuario"]').parent('li'));

        } else {

            mSelf.FerramentaEdicaoUsuario.Cancelar();
            var parametro = {
                'codigoUsuario': data.Codigo()
            }
            mSelf.ConsultaUsuarioCodigo(parametro, data, mSelf.AbreNovoUsuario);

        }

    }

    mSelf.ValidaAlteracaoUsuario = function (usuario, usuarioAntigo) {

        usuario.Supervisor(usuario.Supervisor() == "T" ? true : false);

        if (
            (JSON.stringify(usuario.AplicativosUsuario()) != JSON.stringify(usuarioAntigo.AplicativosUsuario()))
            || (usuario.Nome() != usuarioAntigo.Nome())
            || (usuario.Login() != usuarioAntigo.Login())
            || (usuario.Supervisor() != usuarioAntigo.Supervisor())
        ) {
            return false;
        }
        return true;
    }

    mSelf.ConsultaUsuarioCodigo = function (param, data, functionCompleted) {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/EditarUsuario",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            data: param,
            success: function (ret) {
                if (ret) {
                    var usuario = ko.mapping.fromJS(ret);
                    functionCompleted(usuario, data);
                }
            },
            complete: function () {
                $(".loading-inlog").fadeOut();

                //configuracoes treeview
                configuraTreeViewBonsai('#checkboxes-bonsai');
            }
        }).done(function () {

            slideAdjust();

        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });

    };

    mSelf.AtualizarListaUsuarios = function () {
        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ListarUsuarios",
            dataType: "json",
            type: "GET",
            success: function (retorno) {
                if (retorno) {
                    var kojs = ko.mapping.fromJS(retorno);
                    mSelf.Lista([]);
                    mSelf.Lista(kojs.Data());
                    mSelf.ListaFiltrada([]);
                    mSelf.ListaFiltrada(mSelf.Lista());
                }
            },
            complete: function () {
                $(".loading-inlog").fadeOut();
            }
        }).done(function () {
            slideAdjust();
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.RemoverUsuario = function (usuario) {

        if ($('a[href="#cadastro_usuario"]').length && usuario == mSelf.CodigoUsuarioEdicao()) {
            abrirDialogModal(null, "Remover usuário", "O usuário selecionado está em edição.");
        } else {
            abrirDialogModal({
                resizable: false,
                height: 190,
                modal: true,
                buttons: [
                    {
                        text: "Sim",
                        "class": 'botaoSim',
                        click: function () {
                            mSelf.Remover(usuario);
                        }
                    },
                    {
                        text: "Não",
                        "class": 'botaoNao',
                        click: function () {
                            $(this).dialog("close");
                        }
                    }
                ]
            },
            "Remover usuário",
            "Confirma remover o usuário selecionado?");
        }
    };

    mSelf.Remover = function (usuario) {

        $("#dialog-confirm").dialog("close");

        var param = {
            'codigoUsuario': usuario
        };

        $(".loading-inlog").fadeIn(500);

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/RemoverUsuario",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "GET",
            data: param,
            success: function (ret) {
                if (ret && ret.Sucesso) {

                    mSelf.AtualizarListaUsuarios();

                    abrirDialogModal(null, "Remover usuário", "Usuário removido com sucesso.");
                } else {
                    abrirDialogModal(null, "Remover usuário", "Erro ao remover usuário.");
                }
            },
            complete: function () {
                $(".loading-inlog").fadeOut();
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.UltimoUsuarioSelecionado = function (usuario) {

        ko.utils.arrayForEach(mSelf.ListaFiltrada(), function (user) {

            user.ItemSelecionado(false);
        });

        usuario.ItemSelecionado(true);
    };
}

$(document).on('click', '#botaoAlterarSenha', function () {
    $('#modalConfirmacao').show();
});
$(document).on('click', '.openResetSenha', function () {
    $('#modalConfirmacao').hide();
});
$(document).on('click', '.openResetSenha', function () {
    $('#modalNovaSenha').show();
});
$(document).on('click', '.close-modal', function () {
    $('#modalNovaSenha').hide();
    $('#modalConfirmacao').hide();

});
$(function () {
    new Clipboard('#copy-button');
});