function FerramentaUsuarioCadastroEdicao(data) {

    var mSelf = this;

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

    mSelf.FerramentaId = data.FerramentaId;

    mSelf.Template = data.Template;

    mSelf.Nome = data.Nome;

    mSelf.Titulo = data.Titulo;

    mSelf.Init = function () {
    };
}

function FerramentaUsuarioCadastroEdicaoOpcoes(viewModel) {

    var mSelf = this;

    mSelf.Nome = ko.observable();

    mSelf.Login = ko.observable();

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

    mSelf.Codigo = ko.observable();

    mSelf.ListaAplicativos = ko.observableArray();

    mSelf.AplicativosSelecionados = ko.observableArray([]);

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

    mSelf.Supervisor = ko.observable();

    mSelf.LoginValido = ko.observable(true);

    mSelf.UsuarioSelecionado = ko.observable(viewModel);

    mSelf.GetUsuarioSelecionado = function () {

        mSelf.UsuarioSelecionado().Nome(mSelf.Nome());
        mSelf.UsuarioSelecionado().Login(mSelf.Login());
        mSelf.UsuarioSelecionado().Email(mSelf.Email());
        mSelf.UsuarioSelecionado().Codigo(mSelf.Codigo());
        mSelf.UsuarioSelecionado().Supervisor(mSelf.Supervisor());

        return mSelf.UsuarioSelecionado();
    }

    mSelf.Init = function () {
        mSelf.Nome(mSelf.UsuarioSelecionado().Nome() == null ? "" : mSelf.UsuarioSelecionado().Nome());
        mSelf.Login(mSelf.UsuarioSelecionado().Login() == null ? "" : mSelf.UsuarioSelecionado().Login());
        mSelf.Email(mSelf.UsuarioSelecionado().Email() == null ? "" : mSelf.UsuarioSelecionado().Email());
        mSelf.Senha(mSelf.UsuarioSelecionado().Senha() == null ? "" : mSelf.UsuarioSelecionado().Senha());
        mSelf.Codigo(mSelf.UsuarioSelecionado().Codigo() == null ? 0 : mSelf.UsuarioSelecionado().Codigo());
        mSelf.ListaAplicativos(mSelf.UsuarioSelecionado().TodosAplicativos());
        mSelf.Supervisor(mSelf.UsuarioSelecionado().Supervisor() == "T" ? true : false);
        if (mSelf.UsuarioSelecionado().AplicativosUsuario() === null)
            mSelf.AplicativosSelecionados([]);
        else
            mSelf.AplicativosSelecionados(mSelf.UsuarioSelecionado().AplicativosUsuario());
    };

    mSelf.Salvar = function () {

        if (mSelf.Nome().trim() == "" || mSelf.Nome() == 'undefined') {
            vm.ShowMensagemAlerta("O Nome do Usuário deve ser informado.");
            return;
        }
       

        if (mSelf.Login() == "" || mSelf.Login() == 'undefined') {
            vm.ShowMensagemAlerta("O Login do usuário deve ser informado.");
            return;
        }
        if (mSelf.Email().trim() == "" || mSelf.Email() == 'undefined') {
            vm.ShowMensagemAlerta("O email do usuário deve ser informado");
            return;
        }

        if (mSelf.Codigo() == 0 && (mSelf.Senha().trim() == "" || mSelf.Senha() == 'undefined')) {
            vm.ShowMensagemAlerta("A Senha deve ser informada.");
            return;
        }

        if (mSelf.ValidaCaracteresInvalidos(mSelf.Nome())) {
            vm.ShowMensagemAlerta("Não é permitido caracteres especiais no campo nome.");
            return;
        }

        if (mSelf.ValidaCaracteresInvalidos(mSelf.Login())) {
            vm.ShowMensagemAlerta("Não é permitido caracteres especiais no campo login.");
            return;
        }

        if (!mSelf.ValidaEmail(mSelf.Email())) {
            vm.ShowMensagemAlerta("Digite um email válido.");
            return;
        }

        //if (mSelf.ValidaCaracteresInvalidosSenha(mSelf.Senha())) {
        //    vm.ShowMensagemAlerta("Não é permitido caracteres especiais no campo senha.");
        //    return;
        //}

        var lstApps = [];
        for (var i in mSelf.AplicativosSelecionados()) {
            lstApps.push(parseInt(mSelf.AplicativosSelecionados()[i]));
        }

        var param = {
            'Codigo': mSelf.Codigo(),
            'Nome': mSelf.Nome(),
            'Login': mSelf.Login(),
            'Email': mSelf.Email(),
            'Senha': mSelf.Senha(),
            'Aplicativos': lstApps,
            'Supervisor': mSelf.Supervisor() ? "T" : "F"
        };

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

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/SalvarUsuario",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(param),
            success: function (ret) {

                if (ret.Sucesso) {

                    var modulo = vm.GetModulo("ListaUsuariosViewModel");
                    if (modulo) {
                        if (ret.Objeto) {
                            var lista = [];
                            var objRetorno = ko.mapping.fromJS(ret.Objeto);

                            ko.utils.arrayForEach(modulo.Data().Lista(), function (usu) {
                                if (usu.Codigo() == objRetorno.Codigo())
                                    lista.push(objRetorno);
                                else
                                    lista.push(usu);
                            });

                            if (mSelf.Codigo() == 0)
                                lista.push(objRetorno);

                            modulo.Data().Lista([]);
                            modulo.Data().ListaFiltrada([]);
                            modulo.Data().Lista(lista);
                            modulo.Data().ListaFiltrada(lista);
                            modulo.Data().ListaFiltrada.sort(function (left, right) {
                                return left.Nome() == right.Nome() ? 0 : (left.Nome() < right.Nome() ? -1 : 1)
                            });
                        }
                        else
                            modulo.Data().AtualizarListaUsuarios();
                    }

                    //remove a guia de edição de usuário
                    removeTab($('a[href="#cadastro_usuario"]').next('button.close').parent('li'), $('a[href="#usuarios"]').parent('li'));
                }
                else
                    vm.ShowMensagemErro(ret.MensagemErro);

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

    mSelf.ValidaLoginUsuario = function () {

        if (mSelf.Login() != "" && mSelf.Login() != undefined) {

            var param = {
                'login': mSelf.Login(),
                'codigo': mSelf.Codigo()
            };

            $.ajax({
                url: urlGlobal + "Autenticador/Autenticador/ValidaLoginUsuario",
                contentType: 'application/json; charset=utf-8',
                dataType: "json",
                type: "POST",
                data: JSON.stringify(param),
                success: function (ret) {

                    vm.FecharTodosMensagemAlerta();

                    if (ret.Sucesso) {
                        mSelf.LoginValido(true);
                    } else {
                        vm.ShowMensagemErro(ret.MensagemErro);
                        mSelf.LoginValido(false);
                    }
                }
            }).fail(function (obj, type) {
                if (type === "parsererror") window.document.write(obj.responseText);
            });

        }

    }

    mSelf.ValidaCaracteresInvalidos = function (valor) {
        var regex = new RegExp("[`´~!@#$%^&*()+={}|;:'\",<>\/?\]+");
        return regex.test(valor);
    };

    mSelf.ValidaEmail = function (valor) {
        var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        return re.test(valor);
    };

    mSelf.ValidaCaracteresInvalidosSenha = function (valor) {
        var regex = new RegExp("[`´~^*()+{}|;:',<>\ ]+");
        return regex.test(valor);
    };

    mSelf.Cancelar = function () {
        //remove a guia de edição de usuário
        removeTab($('a[href="#cadastro_usuario"]').next('button.close').parent('li'), $('a[href="#usuarios"]').parent('li'));
    };

    mSelf.SelecionaTodosAplicativosChange = function (data, evt) {
        mSelf.SelecaoTodosAplicativos(mSelf.ListaAplicativos(), evt.target.checked);
    };

    mSelf.SelecaoTodosAplicativos = function (listaaplicativos, checked) {
        if (listaaplicativos) {
            ko.utils.arrayForEach(listaaplicativos, function (app) {

                var codigo = JSON.stringify(app.Codigo());
                if (checked) {
                    if (mSelf.AplicativosSelecionados.indexOf(codigo) == -1)
                        mSelf.AplicativosSelecionados.push(codigo);
                    app.AplicativoUsuarioSelecionado(true);
                }
                else {
                    if (mSelf.AplicativosSelecionados.indexOf(codigo) > -1)
                        mSelf.AplicativosSelecionados.remove(codigo);
                    app.AplicativoUsuarioSelecionado(false);
                }

                if (app.Autenticador() == 'T') {
                    if (app.AplicativosImportadosOV() && app.AplicativosImportadosOV().length > 0) {
                        ko.utils.arrayForEach(app.AplicativosImportadosOV(), function (appimp) {

                            var codigoimp = JSON.stringify(appimp.Codigo());

                            if (checked) {
                                if (mSelf.AplicativosSelecionados.indexOf(codigoimp) == -1)
                                    mSelf.AplicativosSelecionados.push(codigoimp);
                                appimp.AplicativoUsuarioSelecionado(true);
                            }
                            else {
                                if (mSelf.AplicativosSelecionados.indexOf(codigoimp) > -1)
                                    mSelf.AplicativosSelecionados.remove(codigoimp);
                                appimp.AplicativoUsuarioSelecionado(false);
                            }
                        });
                    }
                }
            });
        }
    };

    mSelf.SelecionaAplicativoChange = function (data, evt) {

        var codigo = JSON.stringify(data.Codigo());
        if (evt.target.checked) {
            if (mSelf.AplicativosSelecionados.indexOf(codigo) == -1) {
                mSelf.AplicativosSelecionados.push(codigo);

                if (data.CodigoAutenticadorImportacao()) {
                    mSelf.AplicativosSelecionados.push(JSON.stringify(data.CodigoAutenticadorImportacao()));
                }
            }
            data.AplicativoUsuarioSelecionado(true);
        }
        else {
            if (mSelf.AplicativosSelecionados.indexOf(codigo) > -1) {
                mSelf.AplicativosSelecionados.remove(codigo);
                data.AplicativoUsuarioSelecionado(false);

                if (data.CodigoAutenticadorImportacao()) {
                    var codigoAi = data.CodigoAutenticadorImportacao();

                    var appPai = ko.utils.arrayFirst(mSelf.ListaAplicativos(), function (item) {
                        return item.Codigo() == codigoAi;
                    });

                    var appsFilhos = ko.utils.arrayFilter(appPai.AplicativosImportadosOV(), function (item) {
                        return item.CodigoAutenticadorImportacao() == codigoAi && item.AplicativoUsuarioSelecionado() == true;
                    });

                    if (appsFilhos.length == 0) {
                        mSelf.AplicativosSelecionados.remove(JSON.stringify(codigoAi));
                    }
                }
            }
        }

        if (data.AplicativosImportadosOV() && data.AplicativosImportadosOV().length > 0)
            mSelf.SelecaoTodosAplicativos(data.AplicativosImportadosOV(), evt.target.checked);
    };
};