function DadosMacro(modulo) {

    var mSelf = this;
    mSelf.Modulo = modulo;

    mSelf.Ids = {
        ComboOperacao: "ComboOperacao",
        ComboMacro: "ComboMacro",
        ComboRegional: "ComboRegional",
        ComboServico: "ComboServico",
        ComboSetor: "ComboSetor"
    };

    mSelf.CodigoConfig = ko.observable(null);

    mSelf.IsRegistradoMacro = false;
    mSelf.IsRegistradoMacroArvore = false;

    mSelf.Operacoes = ko.observableArray();
    mSelf.OperacoesSelecionada = ko.observable({ Codigo: null, Descricao: "Selecione" });

    mSelf.Macros = ko.observableArray();
    mSelf.MacroSelecionada = ko.observable({ Codigo: null, Descricao: "Selecione" });

    mSelf.MacroArvores = ko.observableArray();

    mSelf.RegionalSelecionada = ko.observable({ Codigo: null, Descricao: "Selecione" });
    mSelf.SetorSelecionado = ko.observable({ Codigo: null, Descricao: "Selecione" });
    mSelf.ServicoSelecionado = ko.observable({ Codigo: null, Descricao: "Selecione" });

    mSelf.HabilitaRegional = ko.observable(true);
    mSelf.HabilitaServico = ko.observable(true);
    mSelf.HabilitaSetor = ko.observable(true);

    mSelf.Init = function () {
        mSelf.CarregarOperacao();
    };

    mSelf.CarregarOperacao = function () {
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/CarregarOperacao",
            dataType: "json",
            type: "GET",
            success: function (data) {
                mSelf.Operacoes(data);
                RegistrarCombobox(mSelf.Ids.ComboOperacao);
            }
        });
    };

    mSelf.CarregarMacros = function (codigoOperacao, handler, valor) {
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/CarregarMacros",
            dataType: "json",
            type: "GET",
            data: { codigoOperacao: codigoOperacao, todas: true },
            success: function (data) {
                mSelf.Macros(data);
                if (!mSelf.IsRegistradoMacro)
                    RegistrarCombobox(mSelf.Ids.ComboMacro);
                else
                    RegistrarClickLinhaBombobox(mSelf.Ids.ComboMacro);
                mSelf.IsRegistradoMacro = true;
                mSelf.MacroSelecionada({ Codigo: null, Descricao: "Selecione" });
                mSelf.RegionalSelecionada({ Codigo: null, Descricao: "Selecione" });
                mSelf.SetorSelecionado({ Codigo: null, Descricao: "Selecione" });
                mSelf.ServicoSelecionado({ Codigo: null, Descricao: "Selecione" });

                if (handler && valor)
                    handler(valor);
            }
        });
    };

    mSelf.CarregarMacroArvore = function (codigoMacro, handler, valor) {
        $.ajax({
            url: urlGlobal + "EditorRD/EditorRD/CarregarMacroArvore",
            dataType: "json",
            type: "GET",
            data: { codigoMacro: codigoMacro, todas: true },
            success: function (data) {
                mSelf.MacroArvores(data);

                if (!mSelf.IsRegistradoMacroArvore) {
                    RegistrarCombobox(mSelf.Ids.ComboRegional);
                    RegistrarCombobox(mSelf.Ids.ComboServico);
                    RegistrarCombobox(mSelf.Ids.ComboSetor);
                }
                else {
                    RegistrarClickLinhaBombobox(mSelf.Ids.ComboRegional);
                    RegistrarClickLinhaBombobox(mSelf.Ids.ComboServico);
                    RegistrarClickLinhaBombobox(mSelf.Ids.ComboSetor);
                }

                mSelf.IsRegistradoMacroArvore = true;

                mSelf.RegionalSelecionada({ Codigo: null, Descricao: "Selecione" });
                mSelf.SetorSelecionado({ Codigo: null, Descricao: "Selecione" });
                mSelf.ServicoSelecionado({ Codigo: null, Descricao: "Selecione" });

                if (handler && valor)
                    handler(valor);
            }
        });
    };

    mSelf.SelecionarMacro = function (data, evt, handler, valor) {
        $("#" + mSelf.Ids.ComboRegional + " .box-sel").removeClass("disabled");
        $("#" + mSelf.Ids.ComboServico + " .box-sel").removeClass("disabled");
        $("#" + mSelf.Ids.ComboSetor + " .box-sel").removeClass("disabled");

        $("#" + mSelf.Ids.ComboMacro + " .box-sel").removeClass("cmp-erro");
        mSelf.MacroSelecionada(data);
        mSelf.CarregarMacroArvore(data.Codigo, handler, valor);
    };

    mSelf.SelecionarOperacao = function (data, evt, handler, valor) {
        $("#" + mSelf.Ids.ComboMacro + " .box-sel").removeClass("disabled");

        $("#" + mSelf.Ids.ComboOperacao + " .box-sel").removeClass("cmp-erro");
        mSelf.OperacoesSelecionada(data);

        $("#" + mSelf.Ids.ComboRegional + " .box-sel").addClass("disabled");
        $("#" + mSelf.Ids.ComboServico + " .box-sel").addClass("disabled");
        $("#" + mSelf.Ids.ComboSetor + " .box-sel").addClass("disabled");

        RegistrarCombobox(mSelf.Ids.ComboRegional);
        RegistrarCombobox(mSelf.Ids.ComboServico);
        RegistrarCombobox(mSelf.Ids.ComboSetor);
        mSelf.IsRegistradoMacroArvore = false;

        mSelf.CarregarMacros(data.Codigo, handler, valor);
    };

    mSelf.SelecionarRegional = function (data, evt) {
        $("#" + mSelf.Ids.ComboRegional + " .box-sel").removeClass("cmp-erro");
        mSelf.RegionalSelecionada(data);
    };

    mSelf.SelecionarServico = function (data, evt) {
        $("#" + mSelf.Ids.ComboServico + " .box-sel").removeClass("cmp-erro");
        mSelf.ServicoSelecionado(data);
    };

    mSelf.SelecionarSetor = function (data, evt) {
        $("#" + mSelf.Ids.ComboSetor + " .box-sel").removeClass("cmp-erro");
        mSelf.SetorSelecionado(data);
    };

    mSelf.DesabilitarRegional = function (data, evt) {
        if (mSelf.MacroSelecionada().Codigo != null) {
            mSelf.HabilitaRegional(mSelf.SelecaoCheck($(".check-regional")));
            if (mSelf.HabilitaRegional()) {
                $("#" + mSelf.Ids.ComboRegional + " .box-sel").removeClass("disabled");
            } else {
                $("#" + mSelf.Ids.ComboRegional + " .box-sel").addClass("disabled");
                $("#" + mSelf.Ids.ComboRegional + " .box-sel").removeClass("cmp-erro");
                mSelf.RegionalSelecionada({ Codigo: null, Descricao: "Selecione" });
            }
            RegistrarCombobox(mSelf.Ids.ComboRegional);
        }
    };

    mSelf.DesabilitarServico = function (data, evt) {
        if (mSelf.MacroSelecionada().Codigo != null) {
            mSelf.HabilitaServico(mSelf.SelecaoCheck($(".check-servico")));
            if (mSelf.HabilitaServico()) {
                $("#" + mSelf.Ids.ComboServico + " .box-sel").removeClass("disabled");
            } else {
                $("#" + mSelf.Ids.ComboServico + " .box-sel").addClass("disabled");
                $("#" + mSelf.Ids.ComboServico + " .box-sel").removeClass("cmp-erro");
                mSelf.ServicoSelecionado({ Codigo: null, Descricao: "Selecione" });
            }
            RegistrarCombobox(mSelf.Ids.ComboServico);
        }
    };

    mSelf.DesabilitarSetor = function (data, evt) {
        if (mSelf.MacroSelecionada().Codigo != null) {
            mSelf.HabilitaSetor(mSelf.SelecaoCheck($(".check-setor")));
            if (mSelf.HabilitaSetor()) {
                $("#" + mSelf.Ids.ComboSetor + " .box-sel").removeClass("disabled");
            } else {
                $("#" + mSelf.Ids.ComboSetor + " .box-sel").addClass("disabled");
                $("#" + mSelf.Ids.ComboSetor + " .box-sel").removeClass("cmp-erro");
                mSelf.SetorSelecionado({ Codigo: null, Descricao: "Selecione" });
            }
            RegistrarCombobox(mSelf.Ids.ComboSetor);
        }
    };

    mSelf.DesabilitarTodosCheck = function () {
        $(".check-setor").parent().removeClass("bold");
        $(".check-setor").removeClass("icon-checkmark");
        mSelf.HabilitaSetor(true);

        $(".check-regional").parent().removeClass("bold");
        $(".check-regional").removeClass("icon-checkmark");
        mSelf.HabilitaRegional(true);

        $(".check-servico").parent().removeClass("bold");
        $(".check-servico").removeClass("icon-checkmark");
        mSelf.HabilitaServico(true);

        //mSelf.IsRegistradoMacroArvore = false;
        //RegistrarCombobox(mSelf.Ids.ComboSetor);
        //RegistrarCombobox(mSelf.Ids.ComboRegional);
        //RegistrarCombobox(mSelf.Ids.ComboServico);
    }

    mSelf.SelecaoCheck = function (elemento) {
        if (elemento.hasClass("icon-checkmark")) {
            elemento.parent().removeClass("bold");
            elemento.removeClass("icon-checkmark");
            return true;
        } else {
            elemento.parent().addClass("bold");
            elemento.addClass("icon-checkmark");
            return false;
        }
    };

    mSelf.ValidarDados = function () {
        var retorno = true;

        if (mSelf.OperacoesSelecionada().Codigo == null) {
            $("#" + mSelf.Ids.ComboOperacao + " .box-sel").addClass("cmp-erro");
            retorno = false;
        }

        if (mSelf.MacroSelecionada().Codigo == null) {
            $("#" + mSelf.Ids.ComboMacro + " .box-sel").addClass("cmp-erro");
            retorno = false;
        }

        if (mSelf.HabilitaRegional() && mSelf.RegionalSelecionada().Codigo == null) {
            $("#" + mSelf.Ids.ComboRegional + " .box-sel").addClass("cmp-erro");
            retorno = false;
        }

        if (mSelf.HabilitaServico() && mSelf.ServicoSelecionado().Codigo == null) {
            $("#" + mSelf.Ids.ComboServico + " .box-sel").addClass("cmp-erro");
            retorno = false;
        }

        if (mSelf.HabilitaSetor() && mSelf.SetorSelecionado().Codigo == null) {
            $("#" + mSelf.Ids.ComboSetor + " .box-sel").addClass("cmp-erro");
            retorno = false;
        }

        return retorno;
    };

    mSelf.LimparCampos = function () {
        vm.FecharTodosMensagemAlerta();
        mSelf.OperacoesSelecionada({ Codigo: null, Descricao: "Selecione" });
        mSelf.MacroSelecionada({ Codigo: null, Descricao: "Selecione" });
        mSelf.RegionalSelecionada({ Codigo: null, Descricao: "Selecione" });
        mSelf.SetorSelecionado({ Codigo: null, Descricao: "Selecione" });
        mSelf.ServicoSelecionado({ Codigo: null, Descricao: "Selecione" });

        $("#" + mSelf.Ids.ComboMacro + " .box-sel").addClass("disabled");
        $("#" + mSelf.Ids.ComboRegional + " .box-sel").addClass("disabled");
        $("#" + mSelf.Ids.ComboServico + " .box-sel").addClass("disabled");
        $("#" + mSelf.Ids.ComboSetor + " .box-sel").addClass("disabled");

        mSelf.DesabilitarTodosCheck();

        mSelf.IsRegistradoMacroArvore = false;
        mSelf.IsRegistradoMacro = false;

        RegistrarCombobox(mSelf.Ids.ComboMacro);
        RegistrarCombobox(mSelf.Ids.ComboRegional);
        RegistrarCombobox(mSelf.Ids.ComboServico);
        RegistrarCombobox(mSelf.Ids.ComboSetor);

        //mSelf.DesabilitarTodosCheck();
        mSelf.CodigoConfig(null);
    };
}