var parametroSistema = {

    obter: function (nome, callback) {

        var p = null;

        if (this.existeParametro(nome)) {

            p = this.obterParametro(nome);

            if (callback) {
                callback(p);
            }

            return p;
        }

        var async = typeof callback != 'undefined';

        global.ajax({
            url: '/Comum/ObterParametro',
            type: "post",
            async: async,
            data: {
                nome: nome
            },
            success: function (data) {

                p = { Nome: nome, Valor: data };

                parametroSistema.adicionarParametros([p]);
                
                if (callback) {
                    callback(p);
                }
            }
        });

        return p;
    },

    adicionarParametros: function (data) {

        if (!data) {
            return;
        }

        var self = this;

        $.each(data, function() {

            if (!self.parametros) {
                self.parametros = new Array();
            }

            if (!self.existeParametro(this.Nome)) {
                self.parametros.push(this);
            }

        });
    },

    existeParametro: function(nome) {
        
        if (!this.parametros) {
            return false;
        }

        var p = global.where(this.parametros, { Nome: nome });

        return p && p.length > 0;
    },

    obterParametro: function(nome) {
      
        var p = global.where(this.parametros, { Nome: nome });
        return p && p.length > 0 ? p[0] : null;
    },

    aplicarParametros: function(region) {

        if (!region) {
            return;
        }

        var $region = region;

        if (!(region instanceof jQuery)) {
            $region = $(region);
        }

        var parametros = [];
        var parametrosPai = [];
        var nomes = [];
        var self = this;

        $('[parametro]', $region).each(function() {

            var jsonData = JSON.parse($(this).attr('parametro'));

            if (jsonData) {

                jsonData.el = this;

                var $elPai = $(this).parents('[parametro-pai]');

                if ($elPai.length > 0) {
                    var jsonDataPai = JSON.parse($elPai.attr('parametro-pai'));

                    if (jsonDataPai) {

                        var parametroPai = global.where(parametrosPai, { nome: jsonDataPai.nome });

                        if (parametroPai && parametroPai.length > 0) {
                            jsonDataPai = parametroPai[0];
                        } else {
                            jsonDataPai.el = $elPai[0];
                            parametrosPai.push(jsonDataPai);
                        }

                        jsonDataPai.parametros = jsonData.parametros ? jsonData.parametros : new Array();
                        jsonDataPai.parametros.push(jsonData);
                    }
                }

                parametros.push(jsonData);
                
                if (!jsonData.naoVerificar && !self.existeParametro(jsonData.nome) && !global.isInArray(jsonData.nome, nomes)) {
                    nomes.push(jsonData.nome);
                }

            }
        });

        var aposAplicadoCallback = $.proxy(this.aposAplicado, this, parametrosPai);
        var callback = $.proxy(this.aplicar, this, region, parametros, aposAplicadoCallback);
        

        if (nomes.length > 0) {

            global.ajax({
                url: '/Comum/ObterParametros',
                type: "post",
                contentType: 'application/json',
                data: JSON.stringify({
                    parametros: nomes
                }),
                success: function(data) {

                    if (data) {
                        self.adicionarParametros(data);
                        callback(self.parametros);
                    }
                }
            });
        } else {

            callback(this.parametros);
        }

        
    },

    aposAplicado: function(parametrosPai) {
        
        if (!parametrosPai || parametrosPai.length == 0) {
            return;
        }

        $.each(parametrosPai, function() {
            if (this.parametros) {

                var visivel = false;

                $.each(this.parametros, function() {

                    if ($(this.el).css('display') != 'none') {
                        visivel = true;
                        return false;
                    }
                });

                if (!visivel) {
                    $(this.el).hide();
                }
            }

        });

    },

    aplicar: function (region, parametros, aposAplicadoCallback, data) {
        
        if (!region || !data || !parametros) {
            return;
        }

        var $region = region;

        if (!(region instanceof jQuery)) {
            $region = $(region);
        }


        $.each(data, function() {

            var valor = this.Valor;

            var p = global.where(parametros, { nome: this.Nome });
            
            if (p) {
                $.each(p, function () {
                    this.valor = valor;
                    parametroSistema.aplicarElemento(this);
                });
            }
        });

        if (aposAplicadoCallback) {
            aposAplicadoCallback();
        }
        
    },

    aplicarElemento: function(data) {
        
        if (!data) {
            return;
        }

        var $el = $(data.el);

        if (!$el || $el.length == 0) {
            return;
        }

        var valoresEsconder = data.valorEsconder ? data.valorEsconder.split(',') : null;

        if (valoresEsconder && valoresEsconder.length > 0) {
            $.each(valoresEsconder, function () {

                var valor = this;

                if (valor == 'undefined') {
                    valor = undefined;
                }

                if (valor == 'null') {
                    valor = null;
                }

                if (valor == data.valor) {
                    $el.hide();
                }
            });
        }

        var valoresMostrar = data.valorMostrar ? data.valorMostrar.split(',') : null;

        if (valoresMostrar && valoresMostrar.length > 0) {
            $.each(valoresMostrar, function () {

                var valor = this;

                if (valor == 'undefined') {
                    valor = undefined;
                }

                if (valor == 'null') {
                    valor = null;
                }

                if (valor == data.valor) {
                    $el.show();
                }
            });
        }

        var valoresDesabilitar = data.valorDesabilitar ? data.valorDesabilitar.split(',') : null;

        if (valoresDesabilitar && valoresDesabilitar.length > 0) {
            $.each(valoresDesabilitar, function () {

                var valor = this;

                if (valor == 'undefined') {
                    valor = undefined;
                }

                if (valor == 'null') {
                    valor = null;
                }

                if (valor == data.valor) {
                    $el.prop('disabled', true);
                }
            });
        }

    }



};