function VinculacaoConfiguracao(app) {
    var mSelf = this;
    mSelf.TabelasVinculacao = app.TabelasVinculacao;
    mSelf.Aplicacao = app;

    mSelf.SelecionaVinculacao = function (evt) {
        var codigoVinculacao = parseInt($(evt).attr("CodigoVinculacao"));
        var codigoAppVinculacao = parseInt($(evt).attr("codigoapp"));
        var codigorTabelaVinculacao = parseInt($(evt).attr("codigoTabelaVinculacao"));

        $(".loading-linha-" + codigorTabelaVinculacao).addClass("loading-linha");

        $.getJSON(urlGlobal + "Controle/Configuracao/CarregarCamposVinculacao?codigoVinculacao=" + codigoVinculacao + "&codigoAplicacao=" + mSelf.Aplicacao.Codigo(), function (data) {
            var vinculacao = ko.utils.arrayFirst(mSelf.TabelasVinculacao(), function (item) {
                return item.Codigo() == codigorTabelaVinculacao;
            });

            if (data != null && data.IsSucesso) {
                if (vinculacao) {
                    var result = ko.mapping.fromJS(data.Resposta);

                    vinculacao.CamposVinculacaoFilhoDireita(result.CamposVinculacaoFilhoDireita());
                    vinculacao.CamposVinculacaoFilhoEsquerda(result.CamposVinculacaoFilhoEsquerda());
                    vinculacao.CamposVinculacaoPaiDireita(result.CamposVinculacaoPaiDireita());
                    vinculacao.CamposVinculacaoPaiEsquerda(result.CamposVinculacaoPaiEsquerda());
                    vinculacao.CamposSelecionadosPaiEsquerda([]);
                    vinculacao.CamposSelecionadosPaiDireita([]);
                    vinculacao.CamposSelecionadosFilhoEsquerda([]);
                    vinculacao.CamposSelecionadosFilhoDireita([]);
                    vinculacao.AgrupadoColunasFilho(result.AgrupadoColunasFilho());
                    vinculacao.AgrupadoColunasPai(result.AgrupadoColunasPai());
                    vinculacao.Descricao(evt.innerText);
                    vinculacao.CodigoVinculacaoTabelas(codigoVinculacao);

                    vm.Perspectiva.Configuracoes().RegistraEventosVinculacaoCampo();
                }
            } else {
                $(".save-notification-tabVinculacao").fadeIn("fast").delay(3000).fadeOut("fast");
                
                $(evt).parent().parent().find(".sel-val").find(".txt-val").text("SELECIONE").addClass("txt-default");
            }
            $(".loading-linha-" + codigorTabelaVinculacao).removeClass("loading-linha");
        });
    };

    mSelf.SelecionaCampo = function (evt, e) {

        var codigoVinculacao = parseInt($(evt).attr("CodigoVinculacao"));
        var codigoCampo = parseInt($(evt).attr("codigocampo"));
        var tipo = $(evt).attr("tipo");
        var campo1, campo2;

        if (tipo == "pai") {
            campo1 = "CamposSelecionadosPaiDireita";
            campo2 = "CamposSelecionadosPaiEsquerda";
        } else {
            campo1 = "CamposSelecionadosFilhoDireita";
            campo2 = "CamposSelecionadosFilhoEsquerda";
        }

        var tabela = ko.utils.arrayFirst(mSelf.TabelasVinculacao(), function (item) {
            return item.Codigo() == codigoVinculacao;
        });
        if (tabela) {
            if ($(evt).hasClass("dropped-item")) {
                if ($(evt).parent().parent().hasClass("list-megaselect-right"))
                    tabela[campo1].push(codigoCampo);
                else
                    tabela[campo2].push(codigoCampo);
            } else {
                if ($(evt).parent().parent().hasClass("list-megaselect-right"))
                    tabela[campo1].remove(codigoCampo);
                else
                    tabela[campo2].remove(codigoCampo);
            }
        }

    };

    mSelf.TransferirDireita = function (data, evt) {
        var bool = false;
        var tipo = $(evt.target).attr("tipo");

        var CamposSelecionadosEsquerda, CamposTabelaVertical, CamposTabelaConfiguracao, AgrupadoColunas;
        if (tipo == "pai") {
            CamposSelecionadosEsquerda = "CamposSelecionadosPaiEsquerda";
            CamposTabelaVertical = "CamposVinculacaoPaiEsquerda";
            CamposTabelaConfiguracao = "CamposVinculacaoPaiDireita";
            AgrupadoColunas = "AgrupadoColunasPai";
        } else {
            CamposSelecionadosEsquerda = "CamposSelecionadosFilhoEsquerda";
            CamposTabelaVertical = "CamposVinculacaoFilhoEsquerda";
            CamposTabelaConfiguracao = "CamposVinculacaoFilhoDireita";
            AgrupadoColunas = "AgrupadoColunasFilho";
        }

        var campos = ko.utils.arrayFilter(data[CamposTabelaVertical](), function (item) {
            return data[CamposSelecionadosEsquerda]().indexOf(item.Codigo()) > -1
        });
        if (campos.length > 0) {
            ko.utils.arrayForEach(campos, function (c) {
                var value = $('#CdCmp_' + c.Codigo() + '_CdVinc_' + data.Codigo()).val();
                if (c.Identificador() != value)
                    c.Identificador(value);
                if (c.Identificador() != null && c.Identificador() != "" && c.Identificador() != undefined) {
                    data[CamposTabelaConfiguracao].push(c);
                    data[CamposTabelaVertical].remove(c);
                    data[CamposSelecionadosEsquerda].remove(c.Codigo());
                } else {
                    AlertaIdentificador(evt);
                    bool = true;
                }
            });
            mSelf.ConfiguraAgrupamentoColunas(data, CamposTabelaConfiguracao, AgrupadoColunas);
        } else {
            AlertaSelecionaLinha(evt, "Direita");
            bool = true
        }
        if (!bool)
            $(".alert-megaselect").hide();

        vm.Perspectiva.Configuracoes().RegistraEventosVinculacaoCampo();
    };

    mSelf.TransferirEsquerda = function (data, evt) {
        var tipo = $(evt.target).attr("tipo");

        var CamposSelecionadosDireita, CamposTabelaVertical, CamposTabelaConfiguracao, AgrupadoColunas;
        if (tipo == "pai") {
            CamposSelecionadosDireita = "CamposSelecionadosPaiDireita";
            CamposTabelaVertical = "CamposVinculacaoPaiEsquerda";
            CamposTabelaConfiguracao = "CamposVinculacaoPaiDireita";
            AgrupadoColunas = "AgrupadoColunasPai";
        } else {
            CamposSelecionadosDireita = "CamposSelecionadosFilhoDireita";
            CamposTabelaVertical = "CamposVinculacaoFilhoEsquerda";
            CamposTabelaConfiguracao = "CamposVinculacaoFilhoDireita";
            AgrupadoColunas = "AgrupadoColunasFilho";
        }

        var campos = ko.utils.arrayFilter(data[CamposTabelaConfiguracao](), function (item) {
            return data[CamposSelecionadosDireita]().indexOf(item.Codigo()) > -1
        });
        if (campos.length > 0) {
            ko.utils.arrayForEach(campos, function (c) {
                data[CamposTabelaVertical].push(c);
                data[CamposTabelaConfiguracao].remove(c);
            });
            data[CamposSelecionadosDireita].removeAll();
            mSelf.ConfiguraAgrupamentoColunas(data, CamposTabelaConfiguracao, AgrupadoColunas);
            $(".alert-megaselect").hide();
        } else {
            AlertaSelecionaLinha(evt, "Esquerda");
        }

        vm.Perspectiva.Configuracoes().RegistraEventosVinculacaoCampo();
    };

    mSelf.ConfiguraAgrupamentoColunas = function (data, CamposTabelaConfiguracao, AgrupadoColunas) {
        if (data[CamposTabelaConfiguracao]().length > 0) {
            var str = "", i = 0;
            for (i = 0; i < data[CamposTabelaConfiguracao]().length - 1; i++) {
                str += data[CamposTabelaConfiguracao]()[i].NomeAmigavel() + ", ";
            }
            str += data[CamposTabelaConfiguracao]()[i].NomeAmigavel();
            data[AgrupadoColunas](str);
        } else {
            data[AgrupadoColunas]("");
        }
    };

    mSelf.RemoverTabela = function (data, evt) {
        mSelf.TabelasVinculacao.remove(data);
    };

    mSelf.AdicionaNovaLinhaVinculacao = function (data, evt) {
        $.getJSON(urlGlobal + "Controle/Configuracao/NovaLinhaVinculacao", function (data) {
            var cd = 0;
            ko.utils.arrayForEach(vm.Perspectiva.Configuracoes().ListaAplicacoes(), function (item) {
                ko.utils.arrayForEach(item.VinculacaoAplicacao().TabelasVinculacao(), function (t) {
                    if (cd < t.Codigo())
                        cd = t.Codigo();
                });
            });
            data.Codigo = cd + 1;
            mSelf.TabelasVinculacao.push(ko.mapping.fromJS(data));
            vm.Perspectiva.Configuracoes().RegistrarNovaLinha();
        });
    }

    mSelf.SalvarVinculacao = function (data, evt) {
        var vinculacao = ko.mapping.toJS(data);
        var alerta;

        delete vinculacao.AdicionarScript;
        delete vinculacao.ConfiguracaoAppScript;
        delete vinculacao.ConfiguracaoAppTabela;
        delete vinculacao.ConfiguracaoAppVinculacao;
        delete vinculacao.MsgErro;
        delete vinculacao.RemoverLabelErro;
        delete vinculacao.RemoverScript;
        delete vinculacao.SalvarScripts;
        delete vinculacao.ScriptAplicacao;
        delete vinculacao.TabelasAplicacao;
        delete vinculacao.ValidarCampos;
        delete vinculacao.VinculacaoAplicacao;

        ko.utils.arrayForEach(vinculacao.TabelasVinculacao, function (item) {

            delete item.AgrupadoColunasFilho;
            delete item.AgrupadoColunasPai;
            delete item.CamposSelecionadosFilhoDireita;
            delete item.CamposSelecionadosFilhoEsquerda;
            delete item.CamposSelecionadosPaiDireita;
            delete item.CamposSelecionadosPaiEsquerda;
            delete item.CamposVinculacaoFilhoEsquerda;
            delete item.CamposVinculacaoPaiEsquerda;
            delete item.ConfiguracaoApp;
            delete item.ConfiguracaoAppVinculacaoCampo;

            item.Identificador = $("[codigoAppVinculacaoIdent='" + item.Codigo + "']").val();

            if (item.Identificador == "") {
                $("[codigoAppVinculacaoIdent='" + item.Codigo + "']").addClass("cmp-erro");
                alerta = true;
            }
        });

        if (alerta) {
            $(".save-notification-notok").fadeIn("fast").delay(3000).fadeOut("fast");
            return;
        }

        var params = {
            vinculacao: vinculacao
        };

        $.ajax({
            url: urlGlobal + "Controle/Configuracao/SalvarVinculacaoTabela",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            type: "POST",
            data: JSON.stringify(params),
            success: function (data) {
                vm.Perspectiva.Configuracoes().CarregarAplicacoes(mSelf.Aplicacao.Codigo(), true);
            },
            error: function (x) {

            }
        });
    };

}