function ListaAplicativosUsuarioViewModel(data) {

    var mSelf = this;

    mSelf.ModuloId = data.ModuloId;

    mSelf.Template = data.Template;

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

    mSelf.PermitirAcesso = data.PermitirAcesso;

    mSelf.UsuarioLogado = data.UsuarioLogado;

    mSelf.EmpresaUsuarioLogado = data.EmpresaUsuarioLogado;

    mSelf.Ordem = 1;

    mSelf.ItemSelecionado = ko.observable();

    mSelf.Init = function () {

        //Permite ou bloqueia o acesso as abas de Usuários e Aplicativos.
        vm.Perspectiva.PermitirAba(mSelf.PermitirAcesso());

        //Setar o nome da Empresa e do Usuário logado
        vm.Perspectiva.UsuarioLogado(mSelf.UsuarioLogado());

        vm.Perspectiva.EmpresaUsuarioLogado(mSelf.EmpresaUsuarioLogado());

        vm.Perspectiva.ListaAplicativosFavoritos(mSelf.Data().Favoritos());

        eventClickApp();

        if (vm.Perspectiva.PermitirAba()) {
            eventClickTab($('.slider-tabs li a'));
        }
    };

    mSelf.RemoverAplicativoLista = function (aplicativo) {

        if (mSelf.Data && mSelf.Data().length > 0) {

            var appUsuarioExclusao = ko.utils.arrayFirst(mSelf.Data(), function (appUsuario) {

                return appUsuario.Codigo() === aplicativo.Codigo();
            });


            if (appUsuarioExclusao)
                mSelf.Data.remove(appUsuarioExclusao);
        }
    };

    mSelf.AtualizarListaAplicativosUsuario = function () {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ListarAplicativosUsuarios",
            dataType: "json",
            type: "GET",
            success: function (retorno) {
                if (retorno) {
                    var kojs = ko.mapping.fromJS(retorno.Data);
                    mSelf.Data().Home.removeAll();
                    mSelf.Data().Home(kojs.AplicativosHome());
                }

                tilesAdjust("#home");
            },
            complete: function () {

            }
        }).done(function () {
            slideAdjust();
            eventDroppableFolder();
            eventDragableTiles();
            eventRenameFolder();

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

    mSelf.AbrirGuiaUsuario = function () {
        activeTabChange($('a[href="#usuarios"]').parent('li'));
    };

    mSelf.AbrirGuiaAplicativos = function () {
        activeTabChange($('a[href="#aplicativosInlog"]').parent('li'));
    };

    mSelf.MoveAplicativoAreaFavoritos = function (codigoAplicativo, tipo) {
        var modulo = vm.GetModulo("ListaAplicativosInlogViewModel");
        if (modulo) {
            var aplicativo = mSelf.ConsultaAplicativosFavoritos(codigoAplicativo);
            if (aplicativo) {
                abrirDialogModal(null, "Mover aplicativo", "Aplicativo já está na área de favoritos.");
            } else {

                var param = {
                    'codigoAplicativo': codigoAplicativo
                };

                aplicativo = mSelf.Data().GetAplicativo(codigoAplicativo, tipo);
                if (aplicativo) {

                    $.ajax({
                        url: urlGlobal + "Autenticador/Autenticador/SalvarAplicativoFavorito",
                        contentType: 'application/json; charset=utf-8',
                        dataType: "json",
                        type: "POST",
                        data: JSON.stringify(param),
                        success: function (ret) {
                            //Adiciona o aplicativo nos favoritos
                            vm.Perspectiva.ListaAplicativosFavoritos.push(aplicativo);

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

    mSelf.ConfirmaRemoverAplicativoFavorito = function (codigoAplicativo, nome) {

        abrirDialogModal({
            resizable: false,
            height: 190,
            modal: true,
            buttons: {
                "Sim": function () {
                    $(this).dialog("close");
                    mSelf.RemoverAplicativoFavorito(codigoAplicativo);
                },
                "Não": function () {
                    $(this).dialog("close");
                }
            }
        },
         "Remover favorito", "Confirma remover o aplicativo " + nome + " da área dos favoritos?");

    };

    mSelf.RemoverAplicativoFavorito = function (codigoAplicativo) {
        $(".loading-inlog").fadeIn();

        var codigoAbaAtiva = $(".slmenu.active").attr('codigo');
        var tipoAbaAtiva = $(".slmenu.active").attr('tipo');

        var param = {
            'codigoAplicativo': codigoAplicativo,
            'codigoPasta': (tipoAbaAtiva == "2" ? parseInt(codigoAbaAtiva) : 0)
        };

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/RemoveAplicativoFavorito",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(param),
            success: function (ret) {
                var aplicativo = mSelf.GetAplicativoFavorito(codigoAplicativo);
                if (aplicativo) {
                    //Retira o aplicativo dos favoritos
                    vm.Perspectiva.ListaAplicativosFavoritos.remove(aplicativo);
                }
            },
            complete: function () {
                $(".loading-inlog").fadeOut();
                eventDroppableFolder();
                eventDragableTiles();
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.ConsultaAplicativosFavoritos = function (codigoApp) {
        for (var a in vm.Perspectiva.ListaAplicativosFavoritos()) {
            if (vm.Perspectiva.ListaAplicativosFavoritos()[a].Codigo() == codigoApp)
                return vm.Perspectiva.ListaAplicativosFavoritos()[a];
        }
    };

    mSelf.MoveAplicativoHome = function (codigoAplicativo) {
        $(".loading-inlog").fadeIn();

        var codigoAbaAtiva = $(".slmenu.active").attr('codigo');
        var tipoAbaAtiva = $(".slmenu.active").attr('tipo');

        var param = {
            'codigoAplicativo': codigoAplicativo,
            'codigoPasta': (tipoAbaAtiva == "2" ? parseInt(codigoAbaAtiva) : 0)
        };

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

            },
            complete: function () {

            }
        }).done(function () {

            var aplicativo = mSelf.GetAplicativoFavorito(codigoAplicativo);

            if (aplicativo) {
                //Retira o aplicativo dos favoritos
                vm.Perspectiva.ListaAplicativosFavoritos.remove(aplicativo);

                // se a aba ativa for uma pasta
                if (tipoAbaAtiva == "2") {
                    mSelf.Data().AtualizaConteudoPasta(codigoAbaAtiva, tipoAbaAtiva);
                } else {// se for a Home
                mSelf.AtualizarListaAplicativosUsuario();
            }
            }

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

    mSelf.MoveAplicativoPasta = function (codigoAplicativo, codigoPasta) {
        var param = {
            'codigoAplicativo': codigoAplicativo,
            'codigoPasta': codigoPasta
        };

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

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

            },
            complete: function () {

            }
        }).done(function () {

            var codigoPastaAutenticador = $(".slmenu.active").attr('codigo');

            if (codigoPastaAutenticador == 0) {
                mSelf.AtualizarListaAplicativosUsuario();
            } else {
                //atualiza o conteudo da pasta
                var tipoAplicativo = $(".slmenu.active").attr('tipo');
                if (codigoPastaAutenticador) {
                    mSelf.Data().AtualizaConteudoPasta(codigoPastaAutenticador, tipoAplicativo);
                }
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.AlterarLocalPasta = function (codigoPastaOrigem, codigoPastaDestino) {
        var param = {
            'codigoPastaOrigem': codigoPastaOrigem,
            'codigoPastaDestino': codigoPastaDestino
        };

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

            },
            complete: function () {

            }
        }).done(function () {

            var codigoPastaAutenticador = $(".slmenu.active").attr('codigo');

            if (codigoPastaAutenticador == 0) {
                mSelf.AtualizarListaAplicativosUsuario();
            } else {
                //atualiza o conteudo da pasta
                var tipoAplicativo = $(".slmenu.active").attr('tipo');
                if (codigoPastaAutenticador) {
                    mSelf.Data().AtualizaConteudoPasta(codigoPastaAutenticador, tipoAplicativo);
                }
            }
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    }

    mSelf.ConsultaAplicativoHome = function (codigo, tipo) {
        return ko.utils.arrayFirst(mSelf.Data().Home(), function (app) {
            return app.Codigo() == codigo && app.Tipo() == tipo
        });
    };

    mSelf.CriarPasta = function (codigoPasta, tipoAplicativo, nomePasta) {

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

        var param = {
            'codigoPasta': 0,
            'codigoPastaPai': codigoPasta,
            'descricao': 'Nova pasta'
        };

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/SalvarPasta",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(param),
            success: function (ret) {
                var novaPasta = ko.mapping.fromJS(ret);
                novaPasta.Objeto.Tipo = ko.observable(2);
                novaPasta.Objeto.Apagado = ko.observable();
                novaPasta.Objeto.Nome = ko.observable(novaPasta.Objeto.Descricao());

                if (codigoPasta && tipoAplicativo && nomePasta) {
                    mSelf.Data().GetAplicativosPorPasta(codigoPasta, tipoAplicativo, nomePasta);
                } else {
                    mSelf.Data().Home.push(novaPasta.Objeto);
                }
            },
            complete: function () {

            }
        }).done(function () {

            slideAdjust();
            eventDroppableFolder();
            eventDragableTiles();
            eventRenameFolder();

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

    mSelf.RenomearPasta = function (codigoPasta, descricao) {

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

        var param = {
            'codigoPasta': codigoPasta,
            'descricao': descricao,
        };

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/RenomearPasta",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(param),
            success: function (ret) {
                var novaPasta = ko.mapping.fromJS(ret);
                novaPasta.Objeto.Tipo = ko.observable(2);
                novaPasta.Objeto.Apagado = ko.observable();
                novaPasta.Objeto.Nome = ko.observable(novaPasta.Objeto.Descricao());

                var codigoPastaAutenticador = $(".slmenu.active").attr('codigo');

                //pasta renomeada está na home
                if (codigoPastaAutenticador == 0) {
                    var pasta = mSelf.ConsultaAplicativoHome(codigoPasta, novaPasta.Objeto.Tipo());

                    //substitui a pasta alterada na lista de aplicativos da Home
                    if (pasta) {
                        mSelf.Data().Home.replace(pasta, novaPasta.Objeto);
                    }
                } else {
                    var tipoAplicativo = $(".slmenu.active").attr('tipo');

                    var aba = mSelf.Data().GetAbaPorCodigoETipo(codigoPastaAutenticador, tipoAplicativo);
                    if (aba) {
                        mSelf.Data().GetAplicativosPorPasta(aba.AplicativoPai.Codigo(), aba.AplicativoPai.Tipo(), aba.AplicativoPai.Nome());
                    }
                }

                var idTab = 'aba_pastas_aplicativos_' + codigoPasta + '_' + novaPasta.Objeto.Tipo();

                //verifica se a pasta renomeada está aberta
                if ($('a[href="#' + idTab + '"]').length) {
                    $('a[href="#' + idTab + '"]').text(' ' + novaPasta.Objeto.Nome());
                }

            },
            complete: function () {

            },
        }).done(function () {

            slideAdjust();
            eventDroppableFolder();
            eventDragableTiles();
            eventRenameFolder();

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

    mSelf.GetAplicativoFavorito = function (codigoApp) {
        return ko.utils.arrayFirst(mSelf.Data().Favoritos(), function (app) {
            return app.Codigo() == codigoApp
        });
    };
}

function ListaAplicativosUsuarioDataViewModel(data) {

    var mSelf = this;

    mSelf.Home = data.AplicativosHome;

    mSelf.Favoritos = data.AplicativosFavoritos;

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

    mSelf.CodigoPastaPai = ko.observable();

    mSelf.CodigoEmpresaSelecionado = ko.observable(0);

    //armazena a url do Autenticador externo
    mSelf.UrlAutenticador = ko.observable();

    mSelf.RemoverPasta = function (codigoPasta, nome) {

        abrirDialogModal({
            resizable: false,
            height: 190,
            modal: true,
            buttons: {
                "Sim": function () {
                    mSelf.ConfirmaRemoverPasta(codigoPasta);
                },
                "Não": function () {
                    $(this).dialog("close");
                }
            }
        },
            "Remover pasta", "Confirma remover a pasta " + nome + "?");

    };

    mSelf.ConfirmaRemoverPasta = function (codigoPasta) {

        var param = {
            'codigoPasta': codigoPasta,
        };

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

                $(".loading-inlog").fadeIn();
            },
            success: function (ret) {

                if (ret.Sucesso) {

                    var codigoPastaAutenticador = $(".slmenu.active").attr('codigo');

                    if (codigoPastaAutenticador == 0) { //Atualiza conteúdo da Home

                        var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

                        if (modulo)
                            modulo.AtualizarListaAplicativosUsuario();


                        //valida se a pasta removida está aberta
                        var aba = mSelf.GetAbaPorCodigoETipo(codigoPasta, 2);
                        if (aba) {

                            var idAba = '#aba_pastas_aplicativos_' + codigoPasta + '_' + 2;
                            removeTab($('a[href="' + idAba + '"]').next('button.close').parent('li'), $('a[href="#home"]').parent('li'));
                        }
                    }
                    else {

                        //Atualiza o conteúdo da respectiva pasta
                        var tipoAplicativo = $(".slmenu.active").attr('tipo');

                        if (codigoPastaAutenticador)
                            mSelf.AtualizaConteudoPasta(codigoPastaAutenticador, tipoAplicativo);


                        //valida se a pasta removida está aberta
                        var aba = mSelf.GetAbaPorCodigoETipo(codigoPasta, 2);
                        if (aba) {

                            var idAba = '#aba_pastas_aplicativos_' + codigoPasta + '_' + 2;
                            removeTab($('a[href="' + idAba + '"]').next('button.close').parent('li'), $('a[href="#aba_pastas_aplicativos_' + codigoPastaAutenticador + '_' + tipoAplicativo + '"]').parent('li'));
                        }
                    }
                }
            },
            complete: function () {

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

                slideAdjust();
                eventDroppableFolder();
                eventDragableTiles();
                eventRenameFolder();

                $(".loading-inlog").fadeOut();
            }
        });
    };

    mSelf.VerificarExclusaoPasta = function (codigoPasta, nomePasta) {

        var excluirPasta = false;

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/GetAplicativosPorPastaAutenticador",
            dataType: "json",
            type: "GET",
            data: { codigoAplicativoPasta: codigoPasta, tipoAplicativo: 2 }, //Tipo = Pasta
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno) {

                    var kojs = ko.mapping.fromJS(retorno);

                    if (kojs.Aplicativos().length === 0)
                        excluirPasta = true;
                }
            },
            complete: function () {


            }
        }).done(function () {

            slideAdjust();
            eventDroppableFolder();
            eventDragableTiles();
            eventRenameFolder();

            $(".loading-inlog").fadeOut();

            if (excluirPasta)
                mSelf.RemoverPasta(codigoPasta, nomePasta);
            else
                abrirDialogModal({
                    resizable: false,
                    height: 190,
                    modal: true,
                    buttons: {
                        "OK": function () {
                            $(this).dialog("close");
                        }
                    }
                },
                    "Remover pasta", "Não é possível excluir a pasta \"" + nomePasta + "\", pois existem aplicativos e/ou pastas vinculados.");
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.AbrirAplicativosPasta = function (codigoAplicativo, tipoAplicativo, nomeAplicativo, e) {

        if (e.target.className.indexOf('folder-function') == -1) {
            mSelf.GetAplicativosPorPasta(codigoAplicativo, tipoAplicativo, nomeAplicativo);
        }
    };

    mSelf.GetAplicativosPorPasta = function (codigoAplicativo, tipoAplicativo, nomeAplicativo) {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/GetAplicativosPorPastaAutenticador",
            dataType: "json",
            type: "GET",
            data: { codigoAplicativoPasta: codigoAplicativo, tipoAplicativo: tipoAplicativo },
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno) {

                    var kojs = ko.mapping.fromJS(retorno);

                    //recupera o código da aba ativa para ser usada ao montar o conteúdo
                    var codigoPastaAtiva = ($(".slmenu.active").attr('codigo'));
                    var tipoPastaAtiva = ($(".slmenu.active").attr('tipo'));
                    
                    var abaAtual = mSelf.GetAbaPorCodigoETipo(codigoAplicativo, tipoAplicativo);

                    if (abaAtual) {
                        mSelf.AtualizarAbaLista(codigoAplicativo, tipoAplicativo, kojs, abaAtual != null ? abaAtual.CodigoPastaPai : codigoPastaAtiva);
                    } else {
                        mSelf.AtualizarAbaLista(codigoAplicativo, tipoAplicativo, kojs, codigoPastaAtiva);
                    }

                    var conteudo = "";

                    // aplicativo do tipo Autenticador
                    if (tipoPastaAtiva == "3") {
                        conteudo = mSelf.MontarConteudoAutenticador(kojs);
                    } else {
                        kojs.CodigoPastaPai = abaAtual != null ? abaAtual.CodigoPastaPai : codigoPastaAtiva;
                        conteudo = mSelf.MontarConteudo(kojs);
                    }

                    var idAba = 'aba_pastas_aplicativos_' + codigoAplicativo + '_' + tipoAplicativo;

                    if (codigoPastaAtiva != 0) {
                        var idAbaAtiva = '#aba_pastas_aplicativos_' + codigoPastaAtiva + '_' + tipoPastaAtiva;

                        dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="' + idAbaAtiva + '"]').parent('li'), conteudo, codigoAplicativo, tipoAplicativo);
                    } else {
                        dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="#home"]').parent('li'), conteudo, codigoAplicativo, tipoAplicativo);
                    }                   
                    
                    eventDroppableSlide(idAba);
                }
            },
            complete: function () {

                $(".loading-inlog").fadeOut();
            }
        }).done(function () {

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

    mSelf.urlExists = function (url, callback) {
        var http = new XMLHttpRequest();
        http.open('HEAD', url);
        http.onreadystatechange = function () {
            if (this.readyState == this.DONE) {
                callback(this.status != 404);
            }
        };
        http.send();
    };

    mSelf.AutenticaAplicativoSistema = function (UsuarioAutenticador, Url, logout, appExterno, UsuarioGis) {
        var param = {
            'UsuarioAutenticador': UsuarioAutenticador,
            'Url': Url,
            'CodigoEmpresa': mSelf.CodigoEmpresaSelecionado(),
            'Logout': logout,
            'AppExterno': appExterno == undefined ? false : appExterno,
            'urlRequest': window.location.host,
            'UsuarioGis': UsuarioGis
        }

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/AutenticadorAplicativo",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(param),
            beforeSend: function () {                
                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {
                if (retorno.Sucesso) {
                    var urlLogin = retorno.Objeto;                            
                    window.open(urlLogin, "_blank", "");
                }
            }
        }).done(function () {
            $(".loading-inlog").fadeOut();
            slideAdjust();
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.GetAplicativosAutenticador = function (codigoAplicativo, tipoAplicativo, nomeAplicativo, url, evt, data) {

        var param = {
            'codigoAplicativo': codigoAplicativo,
            'url': url
        };

        mSelf.UrlAutenticador(url);

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/GetAplicativosPorAutenticadorNovo",
            dataType: "json",
            type: "GET",
            data: { codigoAplicativo: codigoAplicativo, url: url },
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno.Sucesso) {

                    var kojs = ko.mapping.fromJS(retorno.Objeto);

                    mSelf.AtualizarAbaLista(codigoAplicativo, tipoAplicativo, kojs);

                    var conteudo = mSelf.MontarConteudoAutenticador(kojs);

                    if (conteudo) {

                        var idAba = 'aba_pastas_aplicativos_' + codigoAplicativo + '_' + tipoAplicativo;

                        dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="#home"]').parent('li'), conteudo, codigoAplicativo, tipoAplicativo);

                        var itemFavorito = {
                            'CodigoAutenticador': ko.observable(codigoAplicativo),
                            'NomeAutenticador': ko.observable(nomeAplicativo),
                            'ListaFavoritos': kojs.AplicativosFavoritos()
                        };

                        //consulta se o autenticador já possui lista de favoritos
                        var itemLista = mSelf.LocalizaItemFavoritosAutenticadores(codigoAplicativo);
                        if (itemLista) {
                            vm.Perspectiva.ListaFavoritosAutenticadores.replace(itemLista, itemFavorito);
                        } else {
                            vm.Perspectiva.ListaFavoritosAutenticadores.push(itemFavorito);
                        }
                    }
                    else
                        abrirDialogModal(null, "Abrir pasta", "O autenticador selecionado está vazio.");

                } else {

                    var LoginExterno = vm.GetFerramenta("LoginAutenticadorViewModel");
                    LoginExterno.Data().Aplicativo({ Codigo: codigoAplicativo, Nome: nomeAplicativo, Url: url, Tipo: tipoAplicativo });

                    newTab('autenticador_externo', 'Login - ' + nomeAplicativo, '', $('a[href="#home"]').parent('li'));

                }

            },
            complete: function () {

                $(".loading-inlog").fadeOut();
            }
        }).done(function () {

            slideAdjust();
            //eventDroppableFolder();
            // eventDragableTiles();
            // eventRenameFolder();
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.AtualizarAbaLista = function (codigoAplicativo, tipoAplicativo, kojs, codigoPastaPai, tipoAbaPai) {

        var aba = mSelf.GetAbaPorCodigoETipo(codigoAplicativo, tipoAplicativo);

        if (aba) {
            mSelf.AbaPastasAplicativos.remove(aba);

            if (codigoPastaPai) {
                aba.CodigoPastaPai = codigoPastaPai;
                aba.TipoAbaPai = tipoAbaPai;
            } else {
                aba.CodigoPastaPai = 0;
                aba.TipoAbaPai = 0;
            }

            mSelf.AbaPastasAplicativos.push(kojs);
        }
        else {
            if (codigoPastaPai) {
                kojs.CodigoPastaPai = codigoPastaPai;
                kojs.TipoAbaPai = tipoAbaPai;
            } else {
                kojs.CodigoPastaPai = 0;
                kojs.TipoAbaPai = 0;
            }

            mSelf.AbaPastasAplicativos.push(kojs);
        }   
    };

    mSelf.GetAbaPorCodigoETipo = function (codigoAba, codigoTipo) {

        return ko.utils.arrayFirst(mSelf.AbaPastasAplicativos(), function (aba) {

            return aba.AplicativoPai.Codigo() == codigoAba && aba.AplicativoPai.Tipo() == codigoTipo
        });
    };

    mSelf.MontarConteudo = function (viewModel) {

        var conteudoHtml = "";

        //opção para cadastrar nova pasta       
        if (viewModel && viewModel.AplicativoPai.Tipo() == 2) {
            conteudoHtml += "<div class=\"new-folder\" title=\"Nova Pasta\" onclick=\"CriarPasta(" + viewModel.AplicativoPai.Codigo() + "," + viewModel.AplicativoPai.Tipo() + ",'" + viewModel.AplicativoPai.Nome() + "')\">";
            conteudoHtml += "<span class=\"glyphicon glyphicon-plus\"></span>";
            conteudoHtml += "<span class=\"glyphicon glyphicon-folder-open\"></span></div>";
        }

        if (viewModel.CodigoPastaPai != 0) {
            conteudoHtml += "<div class=\"up-folder\" title=\"Voltar pasta\"  onclick=\"MoverParaPastaPai(" + viewModel.CodigoPastaPai + ",2);  \">";
            conteudoHtml += "<span class=\"glyphicon glyphicon-arrow-up\"></span>";
            conteudoHtml += "<span class=\"glyphicon glyphicon-folder-open\"></span></div>";
        }

        if (viewModel && viewModel.Aplicativos && viewModel.Aplicativos().length > 0) {
               
            ko.utils.arrayForEach(viewModel.Aplicativos(), function (app) {

                if (app.Tipo() === 3) //Autenticador)
                    conteudoHtml += "<a codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\" onclick=\"GerarAbaDinamicaConteudoAutenticador(" + app.Codigo() + ", " + app.Tipo() + ", '" + app.Nome() + "','"+app.Url()+"', event);\">" +

                        "<div class=\"tile draggable " + app.Cor() + " tile-text\">" +
                                "<span class=\"" + app.Icone() + "\"></span>" +
                                "<p>" + app.Nome() + "</p>" +
                                "<div class=\"folder-return\" onclick=\"MoverItemParaHome(" + app.Codigo() + "," + app.Tipo() + "); return false;\" ><span class=\"glyphicon glyphicon-arrow-left folder-function\"></span></div>" +
                            "</div>" +
                        "</a>";
                else if (app.Tipo() === 2) //Pasta
                    conteudoHtml += "<div codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\" onclick=\"GerarAbaDinamicaPastaAutenticador(" + app.Codigo() + ", " + app.Tipo() + ", '" + app.Nome() + "', event);\"" +
                                        "class=\"tile folder draggable\"><span class=\"glyphicon glyphicon-folder-open\"></span><p contenteditable='true'>" + app.Nome() + "</p>" +
                                        "<div class=\"folder-del\" onclick=\"RemoverPastaAbaDinamica(" + app.Codigo() + ",'" + app.Nome() + "'); return false;\"><span class=\"glyphicon glyphicon-trash folder-function\" title=\"Apagar pasta\"></span></div>" +
                                        "<div class=\"folder-rename\" ><span class=\"glyphicon glyphicon-pencil folder-function\" title=\"Renomear pasta\"></span></div>" +
                                        "<div class=\"folder-return\" onclick=\"MoverItemParaHome(" + app.Codigo() + "," + app.Tipo() + "); return false;\" ><span class=\"glyphicon glyphicon-arrow-left folder-function\" title=\"Mover para home\"></span></div>" +
                                    "</div>";
                else {//Aplicativo

                    if (app.FlagAppSistema())
                        conteudoHtml += "<a id=\"app_" + app.Codigo() + "_" + app.Tipo() + "\" codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\" onclick=\"AutenticaAplicativoSistema(" + app.UsuarioAutenticador() + ", '" + app.Url() + "', event, false, false);\">" + //href=\"" + app.Url() + "\" target=\"_blank\">" +
                                    "<div class=\"tile draggable " + app.Cor() + " tile-text\">" +
                                        "<span class=\"" + app.Icone() + "\"></span>" +
                                        "<p>" + app.Nome() + "</p>" +
                                        "<div class=\"folder-return\" onclick=\"MoverItemParaHome(" + app.Codigo() + "," + app.Tipo() + "); return false;\" ><span class=\"glyphicon glyphicon-arrow-left folder-function\" title=\"Mover para home\"></span></div>" +
                                        "<div class=\"folder-wrench-pasta\" onclick=\"AutenticaAplicativoSistema(" + app.UsuarioAutenticador() + ", '" + app.Url() + "', event, true, false); return false;\" ><span class=\"glyphicon glyphicon-wrench folder-function\" title=\"Reconfigurar acesso\" ></span></div>" +
                                    "</div>" +
                                "</a>";
                    else
                        conteudoHtml += "<a id=\"app_" + app.Codigo() + "_" + app.Tipo() + "\" codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\"  href=\"" + app.Url() + "\" target=\"_blank\">" +
                            "<div class=\"tile draggable " + app.Cor() + " tile-text\">" +
                                "<span class=\"" + app.Icone() + "\"></span>" +
                                "<p>" + app.Nome() + "</p>" +
                                "<div class=\"folder-return\" onclick=\"MoverItemParaHome(" + app.Codigo() + "," + app.Tipo() + "); return false;\" ><span class=\"glyphicon glyphicon-arrow-left folder-function\" title=\"Mover para home\"></span></div>" +
                            "</div>" +
                        "</a>";

                }
            });
        }

        return conteudoHtml;
    };

    mSelf.MontarConteudoAutenticador = function (viewModel) {

        if (viewModel) {

            var conteudoHtml = "";
            
            if (viewModel.AplicativoPai.Tipo() == 2 && viewModel.CodigoPastaPai != 0) {
                conteudoHtml += "<div class=\"up-folder\" title=\"Voltar pasta\"  onclick=\"MoverParaPastaPai(" + viewModel.CodigoPastaPai + ", " + viewModel.TipoAbaPai + ");  \">";
                conteudoHtml += "<span class=\"glyphicon glyphicon-arrow-up\"></span>";
                conteudoHtml += "<span class=\"glyphicon glyphicon-folder-open\"></span></div>";
            }

            if (viewModel.AplicativosHome()) {
                ko.utils.arrayForEach(viewModel.AplicativosHome(), function (app) {

                    if (app.Tipo() === 3) //Autenticador)
                        conteudoHtml += "<a codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\" onclick=\"GerarAbaDinamicaConteudoAutenticador(" + app.Codigo() + ", " + app.Tipo() + ", '" + app.Nome() + "','" + viewModel.AplicativoPai.Url() + "', event);\">" +
                                "<div class=\"tile " + app.Cor() + " tile-text\">" +
                                    "<span class=\"" + app.Icone() + "\"></span>" +
                                    "<p>" + app.Nome() + "</p>" +
                                "</div>" +
                            "</a>";
                    else if (app.Tipo() === 2) //Pasta
                        conteudoHtml += "<div  class=\'tile folder-not-draggable\' codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\"  url=\"" + viewModel.AplicativoPai.Tipo() + "\"   onclick=\"GerarAbaDinamicaConteudoAutenticador(" + app.Codigo() + ", " + app.Tipo() + ", '" + app.Nome() + "','" + viewModel.AplicativoPai.Url() + "', event);\"><span class=\"glyphicon glyphicon-folder-open\"></span><p>" + app.Nome() + "</p>" +
                                        "</div>";
                    else //Aplicativo

                        if (app.FlagAppSistema())
                            conteudoHtml += "<a id=\"app_" + app.Codigo() + "_" + app.Tipo() + "\" codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\" onclick=\"AutenticaAplicativoSistema(" + viewModel.CodigoUsuarioAutenticador() + ", '" + app.Url() + "', event, false, true);\">" + //href=\"" + app.Url() + "\" target=\"_blank\">" +
                                        "<div class=\"tile draggable " + app.Cor() + " tile-text\">" +
                                            "<span class=\"" + app.Icone() + "\"></span>" +
                                            "<p>" + app.Nome() + "</p>" +
                                            "<div class=\"folder-wrench\" onclick=\"AutenticaAplicativoSistema(" + app.UsuarioAutenticador() + ", '" + app.Url() + "', event, true, true); return false;\" ><span class=\"glyphicon glyphicon-wrench folder-function\"></span></div>" +
                                        "</div>" +
                                    "</a>";
                        else
                            conteudoHtml += "<a  id=\"app_" + app.Codigo() + "_" + app.Tipo() + "\" codigo=\"" + app.Codigo() + "\"  tipo=\"" + app.Tipo() + "\"  href=\"" + app.Url() + "\" target=\"_blank\">" +
                                "<div class=\"tile " + app.Cor() + " tile-text\">" +
                                    "<span class=\"" + app.Icone() + "\"></span>" +
                                    "<p>" + app.Nome() + "</p>" +
                                "</div>" +
                            "</a>";
                });
            }

            return conteudoHtml;
        }

        return null;
    };

    mSelf.AtualizaConteudoPasta = function (codigoAplicativoPasta, tipoAplicativo) {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/GetAplicativosPorPastaAutenticador",
            dataType: "json",
            type: "GET",
            data: { codigoAplicativoPasta: codigoAplicativoPasta, tipoAplicativo: tipoAplicativo },
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno) {

                    var kojs = ko.mapping.fromJS(retorno);

                    var abaSelecionada = mSelf.GetAbaPorCodigoETipo(codigoAplicativoPasta, tipoAplicativo);

                    //seta o codigo da pasta pai
                    kojs.CodigoPastaPai = abaSelecionada.CodigoPastaPai;

                    var conteudo = mSelf.MontarConteudo(kojs);
                                        
                    if (abaSelecionada) {
                        abaSelecionada.Aplicativos(kojs.Aplicativos());

                        atualizaConteudoGuia('aba_pastas_aplicativos_' + codigoAplicativoPasta + '_' + tipoAplicativo, conteudo);
                    }

                    //if (conteudo == null)
                       // removeTab($('a[href="#aba_pastas_aplicativos_' + codigoAplicativoPasta + '_' + tipoAplicativo + '"]').next('button.close').parent('li'), $('a[href="#home"]').parent('li'));
                }
            },
            complete: function () {

            }
        }).done(function () {

            slideAdjust();
            eventDroppableFolder();
            eventDragableTiles();
            eventRenameFolder();

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

    mSelf.AtualizaConteudoPastaAutenticador = function (codigoPasta, tipoAplicativo, urlAutenticador) {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ConsultaAplicativosPorPastaAutenticador",
            dataType: "json",
            type: "GET",
            data: { codigoPasta: codigoPasta, url: urlAutenticador },
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno && retorno.Sucesso) {

                    var kojs = ko.mapping.fromJS(retorno);

                    mSelf.AtualizarAbaLista(codigoPasta, tipoAplicativo, kojs.Objeto);

                    var conteudo = "";
                    conteudo = mSelf.MontarConteudoAutenticador(kojs.Objeto);

                    var abaSelecionada = mSelf.GetAbaPorCodigoETipo(codigoPasta, tipoAplicativo);
                    if (abaSelecionada) {
                        abaSelecionada.Aplicativos(kojs.Objeto.AplicativosHome());

                        atualizaConteudoGuia('aba_pastas_aplicativos_' + codigoPasta + '_' + tipoAplicativo, conteudo);
                    }

                    var idAba = 'aba_pastas_aplicativos_' + codigoPasta + '_' + tipoAplicativo;

//                    dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="#home"]').parent('li'), conteudo, codigoPasta, tipoAplicativo);

      //              eventDroppableSlide(idAba);
                } else {
                    abrirDialogModal(null, "Abrir pasta", "A pasta selecionada está vazia.");
                }
            },
            complete: function () {

                $(".loading-inlog").fadeOut();
            }
        }).done(function () {

            slideAdjust();
//            eventDroppableFolder();
  //          eventDragableTiles();
    //        eventRenameFolder();
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };

    mSelf.GetAplicativo = function (codigoApp) {
        var modulo = vm.GetModulo("ListaAplicativosInlogViewModel");
        if (modulo) {
            return ko.utils.arrayFirst(modulo.Data().Aplicativos(), function (app) {
                return app.Codigo() == codigoApp
            });
        }
    };

    mSelf.GetAplicativoHome = function (codigoApp, tipo) {
        return ko.utils.arrayFirst(mSelf.Home(), function (app) {
            return app.Codigo() == codigoApp && app.Tipo() == tipo
        });
    };

    mSelf.RemoveItemFavoritosAutenticadores = function (codigo) {
        var itemFavorito = mSelf.LocalizaItemFavoritosAutenticadores(codigo);

        if (itemFavorito) {
            vm.Perspectiva.ListaFavoritosAutenticadores.remove(itemFavorito);
        }
    }

    mSelf.LocalizaItemFavoritosAutenticadores = function (codigoAutenticador) {
        return ko.utils.arrayFirst(vm.Perspectiva.ListaFavoritosAutenticadores(), function (app) {
            return app.CodigoAutenticador() == codigoAutenticador
        });
    };

    mSelf.GetAplicativosPorPastaAutenticador = function (codigoAplicativo, tipoAplicativo, nomeAplicativo) {

        $.ajax({
            url: urlGlobal + "Autenticador/Autenticador/ConsultaAplicativosPorPastaAutenticador",
            dataType: "json",
            type: "GET",
            data: { codigoPasta: codigoAplicativo, url: mSelf.UrlAutenticador() },
            beforeSend: function () {

                $(".loading-inlog").fadeIn();
            },
            success: function (retorno) {

                if (retorno && retorno.Sucesso) {

                    var kojs = ko.mapping.fromJS(retorno);

                    //recupera o código da aba ativa para ser usada ao montar o conteúdo
                    var codigoAbaAtiva = ($(".slmenu.active").attr('codigo'));
                    var tipoAbaAtiva = ($(".slmenu.active").attr('tipo'));

                    mSelf.AtualizarAbaLista(codigoAplicativo, tipoAplicativo, kojs.Objeto, codigoAbaAtiva, tipoAbaAtiva);
                    

                    kojs.Objeto.CodigoPastaPai = codigoAbaAtiva;
                    kojs.Objeto.TipoAbaPai = tipoAbaAtiva;

                    var conteudo = "";
                    conteudo = mSelf.MontarConteudoAutenticador(kojs.Objeto);

                    if (conteudo) {

                        var idAba = 'aba_pastas_aplicativos_' + codigoAplicativo + '_' + tipoAplicativo;

                        var abaAutenticador = '#aba_pastas_aplicativos_' + codigoAbaAtiva + '_' + tipoAbaAtiva;

                        if (codigoAbaAtiva != 0) {
                            dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="' + abaAutenticador + '"]').parent('li'), conteudo, codigoAplicativo, tipoAplicativo, mSelf.UrlAutenticador());
                        } else {
                            dynamicTab(idAba, nomeAplicativo, tipoAplicativo == 2 ? 'glyphicon glyphicon-folder-open' : 'glyphicon glyphicon-globe', $('a[href="#home"]').parent('li'), conteudo, codigoAplicativo, tipoAplicativo, mSelf.UrlAutenticador());
                        }                        
                    }
                    else
                        abrirDialogModal(null, "Abrir pasta", "A pasta selecionada está vazia.");

                    //eventDroppableSlide(idAba);
                } else {
                    abrirDialogModal(null, "Abrir pasta", "A pasta selecionada está vazia.");
                }
            },
            complete: function () {

                $(".loading-inlog").fadeOut();
            }
        }).done(function () {

            slideAdjust();
            //eventDroppableFolder();
            //eventDragableTiles();
            //eventRenameFolder();
        }).fail(function (obj, type) {
            if (type === "parsererror") window.document.write(obj.responseText);
        });
    };
}

// gera aba dinamica quando o conteudo for de um autenticador
function GerarAbaDinamicaConteudoAutenticador(codigoAplicativo, tipoAplicativo, nomeAplicativo, urlAplicativo, evt) {

    if (evt && evt.target.className.indexOf('folder-function') == -1) {

        var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

        if (modulo && modulo.Data) {
            //tipo aplicativo == autenticador
            if (tipoAplicativo == "2") {
                modulo.Data().GetAplicativosPorPastaAutenticador(codigoAplicativo, tipoAplicativo, nomeAplicativo, urlAplicativo);
            } else {
                //tipo aplicativo == autenticador
                modulo.Data().GetAplicativosAutenticador(codigoAplicativo, tipoAplicativo, nomeAplicativo, urlAplicativo);
            }
        }
            
    }
}

function GerarAbaDinamicaPastaAutenticador(codigoAplicativo, tipoAplicativo, nomeAplicativo, evt) {

    if (evt && evt.target.className.indexOf('folder-function') == -1) {

        var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

        if (modulo && modulo.Data)
            modulo.Data().GetAplicativosPorPasta(codigoAplicativo, tipoAplicativo, nomeAplicativo);
    }
}

function AutenticaAplicativoSistema(usuarioAutenticador, url, evt, logout, appExterno) {

    if (evt && evt.target.className.indexOf('folder-function') == -1 && evt.target.className.indexOf('glyphicon glyphicon-trash') == -1 || logout) {
                
        var codUsuGis = $(".glyphicon-check").parent().find("input").attr("value");
        
        var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

        if (modulo && modulo.Data)
            modulo.Data().AutenticaAplicativoSistema(usuarioAutenticador, url, logout, appExterno, (codUsuGis && codUsuGis !== "" ? parseInt(codUsuGis) : usuarioAutenticador));
    }
}

function RemoverPastaAbaDinamica(codigoPasta, nomePasta) {

    var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

    if (modulo && modulo.Data)
        modulo.Data().VerificarExclusaoPasta(codigoPasta, nomePasta);
}

function CriarPasta(codigo, tipo, nomeAplicativo) {
    var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

    if (modulo)
        modulo.CriarPasta(codigo, tipo, nomeAplicativo);
}

function MoverItemParaHome(codigo, tipo) {
    $(".loading-inlog").fadeIn();

    var param = {
        'codigoAplicativo': codigo,
        'tipo': tipo
    };

    var codigoAbaAtiva = $(".slmenu.active").attr('codigo');
    var tipoAbaAtiva = $(".slmenu.active").attr('tipo');

    $.ajax({
        url: urlGlobal + "Autenticador/Autenticador/MoverItemParaHome",
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        type: "POST",
        data: JSON.stringify(param),
        success: function (ret) {
            var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");
            if (modulo) {
                modulo.AtualizarListaAplicativosUsuario();
            }

        },
        complete: function () {

        }
    }).done(function () {

        var modulo = vm.GetModulo("ListaAplicativosUsuarioViewModel");

        if (modulo) {
            // se a aba ativa for uma pasta
            if (tipoAbaAtiva == "2") {
                modulo.Data().AtualizaConteudoPasta(codigoAbaAtiva, tipoAbaAtiva);
            }
        }

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

function MoverParaPastaPai(codigoPasta, tipo) {
    var idTab = 'aba_pastas_aplicativos_' + codigoPasta + '_' + tipo;

    //verifica se a pasta pai está aberta
    if ($('a[href="#' + idTab + '"]').length) {
        activeTabChange($('a[href="#' + idTab + '"]').parent('li'));
    } else {
        alert("Pasta pai fechada.");
    }
}