Source: pede_nicho.js


/**
 * Éste módulo es el encargado de la gestión de los componentes de nicho ecológico.
 *
 * @namespace module_nicho
 */
var module_nicho = (function() {

    var _TEST = false, _tipo_modulo;
    var _VERBOSE = true;

    var _map_module_nicho,
        _variable_module_nicho,
        _res_display_module_nicho,
        _region_module_nicho,
        _table_module,
        _histogram_module_nicho,
        _language_module_nicho,
        _module_toast;

    var _componente_fuente;

    var _url_front, _url_api, _url_nicho;

    var _url_geoserver = "http://geoportal.conabio.gob.mx:80/geoserver/cnb/wms?",
            _workspace = "cnb";

    var _iTrans;


    /**
     * Enlaza la funcionalidad de los componentes visuales de las secciones de nicho ecológico.
     *
     * @function _initializeComponents
     * @private
     * @memberof! module_nicho
     */
    function _initializeComponents() {

        _VERBOSE ? console.log("_initializeComponents") : _VERBOSE;

        $("#lb_do_apriori").text(_iTrans.prop('lb_no'));
        $("#lb_mapa_prob").text(_iTrans.prop('lb_no'));

        // inicilizando slider
        $(function() {
            $("#sliderValidation").slider({
                disabled: true,
                min: 0,
                max: 100,
                step: 10,
                value: 70,
                change: function(event, ui) {
                    // _VERBOSE ? console.log(ui.value): _VERBOSE;
                    $("#labelValidation").text(ui.value + "%");
                    _module_toast.showToast_BottomCenter(_iTrans.prop('lb_porcentaje_test', ui.value, (100 - ui.value)), "info");

                }
            });
        });


        $(function() {

            var year = parseInt(new Date().getFullYear());
            // obtnego el proximo numero divisible entre 10. 2016 -> 2020; 2017 -> 2020; 2021 -> 2030
            year = Math.round(year / 10) * 10;
            console.log(year);

            $("#sliderFecha").slider({
                range: true,
                min: 1500,
                max: year,
                step: 10,
                values: [1500, year],
                change: function(event, ui) {

                    _VERBOSE ? console.log(ui.values) : _VERBOSE;

                    var value = ui.values[1];
                    if (value == year) {
                        value = _iTrans.prop('val_actual');
                    }

                    $("#labelFecha").text(_iTrans.prop('labelFecha', ui.values[0], value));

                    if ($("#reload_map").hasClass("btn-primary") && _map_module_nicho.get_specieTarget()) {

                        _module_toast.showToast_BottomCenter(_iTrans.prop('lb_gen_values'), "warning");
                        $("#reload_map").addClass('btn-success').removeClass('btn-primary');

                    }

                    _module_toast.showToast_BottomCenter(_iTrans.prop('lb_rango_fecha', ui.values[0], value), "info");

                }
            });

        });


        function forceNumeric() {
            var $input = $(this);
            $input.val($input.val().replace(/[^\d]+/g, ''));
        }


        $('body').on('propertychange input', 'input[type="number"]', forceNumeric);

        // checkbox que se activa cuando se desea realizar el proceso de validación. (Proceso de validación todavia no implementado)
        $("#chkValidation").click(function(event) {

            var $this = $(this);

            if ($this.is(':checked')) {

                $("#sliderValidation").slider("enable");

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_validacion_act'), "info");

            } else {

                // _VERBOSE ? console.log("no checked"): _VERBOSE;
                $("#sliderValidation").slider({
                    disabled: true
                });

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_validacion_des'), "info");

            }

        });

        // checkbox que se activa cuando se desea tomar en cuanta un minimo de ocurrencias
        $("#chkMinOcc").click(function(event) {

            var $this = $(this);

            if ($this.is(':checked')) {

                $("#occ_number").prop("disabled", false);

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_minocc_act'), "info");

            }
            else {

                $("#occ_number").prop("disabled", true);

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_minocc_des'), "info");

            }

        });


        // checkbox que se activa cuando se desea tomar en cuanta un minimo de ocurrencias
        $("#chkFecha").click(function(event) {

            var $this = $(this);

            if ($this.is(':checked')) {
                // $( "#sliderFecha" ).slider( "enable" );	
                $("#lb_sfecha").text(_iTrans.prop('lb_si'));

                if ($("#reload_map").hasClass("btn-primary") && _map_module_nicho.get_specieTarget()) {

                    _module_toast.showToast_BottomCenter(_iTrans.prop('lb_gen_values'), "warning");

                    $("#reload_map").addClass('btn-success').removeClass('btn-primary');

                }

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_chkfecha'), "info");

            } else {

                $("#lb_sfecha").text(_iTrans.prop('lb_no'));

                if ($("#reload_map").hasClass("btn-primary") && _map_module_nicho.get_specieTarget()) {

                    _module_toast.showToast_BottomCenter(_iTrans.prop('lb_gen_values'), "warning");

                    $("#reload_map").addClass('btn-success').removeClass('btn-primary');

                }

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_chkfecha_des'), "info");

            }

        });


        // checkbox que se activa cuando se desea realizar el proceso de validación. (Proceso de validación todavia no implementado)
        $("#chkApriori").click(function(event) {

            var $this = $(this);

            if ($this.is(':checked')) {
                $("#lb_do_apriori").text(_iTrans.prop('lb_si'));
                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_apriori_act'), "info");

            } else {
                $("#lb_do_apriori").text(_iTrans.prop('lb_no'));
                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_apriori_desc'), "info");
            }

        });


        // checkbox que se activa cuando se desea realizar el proceso de validación. (Proceso de validación todavia no implementado)
        $("#chkMapaProb").click(function(event) {

            var $this = $(this);

            if ($this.is(':checked')) {
                $("#lb_mapa_prob").text(_iTrans.prop('lb_si'));
                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_mapprob_act'), "info");

            } else {
                $("#lb_mapa_prob").text(_iTrans.prop('lb_no'));
                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_status_mapprob_des'), "info");
            }

        });


        // deshabilita controles temporales
        $("#chkFecha").prop('disabled', true);


        $("#sliderFecha").slider({
            disabled: true
        });

        $("#nicho_link").click(function() {
            window.location.replace(_url_front + "/comunidad_v0.1.html");
        });

        $("#nom_sp").autocomplete({
            source: function(request, response) {

                $.ajax({
                    url: _url_api + "/niche/especie",
                    dataType: "json",
                    type: "post",
                    data: {
                        qtype: 'getEntList',
                        searchStr: request.term,
                        nivel: 'especievalidabusqueda', // parametro default para nivel taxonomico, Nota migrar a nive variable como en target
                        source: 1 // source para saber si viene de objetivo o el target
                    },
                    success: function(resp) {

                        response($.map(resp.data, function(item) {

                            return{
                                label: item.especievalidabusqueda,
                                id: item.spid,
                                reino: item.reinovalido,
                                phylum: item.phylumdivisionvalido,
                                clase: item.clasevalida,
                                orden: item.ordenvalido,
                                familia: item.familiavalida,
                                genero: item.generovalido,
                                especie: item.especievalidabusqueda
                            };
                        })
                                );
                    }
                });

            },
            minLength: 2,
            change: function(event, ui) {
                if (!ui.item) {
                    $("#nom_sp").val("");
                }
            },
            select: function(event, ui) {
                var specie_target = {
                    "reino": ui.item.reino,
                    "phylum": ui.item.phylum,
                    "clase": ui.item.clase,
                    "orden": ui.item.orden,
                    "familia": ui.item.familia,
                    "genero": ui.item.genero,
                    "especie": ui.item.especie,
                    "spid": ui.item.id,
                    "label": ui.item.label
                };

                _VERBOSE ? console.log(specie_target) : _VERBOSE;

                _map_module_nicho.set_specieTarget(specie_target);

                _map_module_nicho.busca_especie(false);

                _module_toast.showToast_CenterCenter(_iTrans.prop('lb_occ_cargado'), "info");

            }

        });


        $("#reload_map").click(function() {

            _VERBOSE ? console.log("reload_map") : _VERBOSE;

            if (_map_module_nicho.get_specieTarget()) {

                var rango_fechas = $("#sliderFecha").slider("values");

                if (rango_fechas[0] == $("#sliderFecha").slider("option", "min") && rango_fechas[1] == $("#sliderFecha").slider("option", "max")) {
                    rango_fechas = undefined;
                }

                var chkFecha = $("#chkFecha").is(':checked');

                $('.nav-tabs a[href="#tab_resumen"]').tab('show');

                _map_module_nicho.busca_especie_filtros(rango_fechas, chkFecha);

                $("#reload_map").addClass('btn-primary').removeClass('btn-success');

            }
            else {

                _module_toast.showToast_CenterCenter(_iTrans.prop('lb_sin_especie'), "warning");

            }

        });


        $("#show_gen").click(function(e) {

            _VERBOSE ? console.log("show_gen") : _VERBOSE;

            var cadena_ini = _url_nicho + '#link/?';

            var sp_data = JSON.stringify(_map_module_nicho.get_specieTarget());

            var subgroups = _componente_fuente.getVarSelArray();

            cadena_ini += "sp_data=" + sp_data + "&";

            var val_process = $("#chkValidation").is(':checked');
            if (val_process) {
                cadena_ini += "chkVal=" + $("#sliderValidation").slider("value") + "&";
            }

            var mapa_prob = $("#chkMapaProb").is(":checked");
            if (mapa_prob) {
                cadena_ini += "chkPrb=" + mapa_prob + "&";
            }

            var apriori = $("#chkApriori").is(':checked');
            if (apriori) {
                cadena_ini += "chkApr=" + apriori + "&";
            }

            var chkFecha = $("#chkFecha").is(':checked');

            if (chkFecha) {
                cadena_ini += "chkFec=" + chkFecha + "&";
            }

            var rango_fechas = $("#sliderFecha").slider("values");

            if (rango_fechas[0] != $("#sliderFecha").slider("option", "min") || rango_fechas[1] != $("#sliderFecha").slider("option", "max")) {
                cadena_ini += "minFec=" + rango_fechas[0] + "&maxFec=" + rango_fechas[1];
            }

            var min_occ = $("#chkMinOcc").is(':checked');

            if (min_occ) {
                cadena_ini += "chkOcc=" + parseInt($("#occ_number").val()) + "&";
            }

            cadena_ini += "num_filters=" + subgroups.length + "&";

            $.each(subgroups, function(index, item) {

                var str_item = JSON.stringify(item);

                if (index == 0) {
                    cadena_ini += "tfilters[" + index + "]=" + str_item;
                }
                else {
                    cadena_ini += "&tfilters[" + index + "]=" + str_item;
                }

            });


            console.log(cadena_ini);

            $("#modalRegenera").modal();

            $("#lb_enlace").val(cadena_ini);

        });


        $("#accept_link").click(function() {

            $("#modalRegenera").modal("hide");

        });


        $('#modalRegenera').on('shown.bs.modal', function(e) {

            $('#modalRegenera input[type="text"]')[0].select();

        });

        _genLinkURL();

    }


    /**
     * Obtiene los valores de la URL necesarios para la regeneración de resultados.
     *
     * @function _genLinkURL
     * @private
     * @memberof! module_nicho
     */
    function _genLinkURL() {

        _VERBOSE ? console.log("_genLinkURL") : _VERBOSE;

        if (_json_config == undefined) {
            return;
        }


        var sp_data = JSON.parse(_json_config.sp_data);

        var chkVal = _json_config.chkVal ? parseInt(_json_config.chkVal) : undefined;

        var chkPrb = _json_config.chkPrb ? _json_config.chkPrb === "true" : false;

        var chkApr = _json_config.chkApr ? _json_config.chkApr === "true" : false;

        var chkFec = _json_config.chkFec ? _json_config.chkFec === "true" : false;

        var chkOcc = _json_config.chkOcc ? parseInt(_json_config.chkOcc) : undefined;

        var minFec = _json_config.minFec ? parseInt(_json_config.minFec) : undefined;

        var maxFec = _json_config.maxFec ? parseInt(_json_config.maxFec) : undefined;

        var rango_fechas = minFec != undefined && maxFec != undefined ? [minFec, maxFec] : undefined;

        var num_filters = parseInt(_json_config.num_filters);


        var filters = [];
        for (i = 0; i < num_filters; i++) {

            item = _json_config["tfilters[" + i + "]"];

            filters.push(JSON.parse(_json_config["tfilters[" + i + "]"]));
        }

        _procesaValoresEnlace(sp_data, filters, chkVal, chkPrb, chkApr, chkFec, chkOcc, rango_fechas);
        $("#show_gen").css('visibility', 'hidden');

    }



    //    No utilizado
    function getQuerystring2(path, key, default_) {

        _VERBOSE ? console.log("getQuerystring2") : _VERBOSE;

        if (default_ == null) {
            default_ = "";
        }

        var search = unescape(path);

        if (search == "") {
            return default_;
        }

        search = search.substr(1);
        var params = search.split("&");

        for (var i = 0; i < params.length; i++) {

            var pairs = params[i].split("=");
            if (pairs[0] == key) {
                return pairs[1];
            }

        }

        return default_;
    }



    /**
     * Asigna los valores obtenidos de la URL y configura los componentes visuales para regenerar los resultados.
     *
     * @function _procesaValoresEnlace
     * @private
     * @memberof! module_nicho
     * 
     * @param {json} sp_data - JSON con la información de la especie objetivo
     * @param {josn} subgroups - JSON  con el grupo de variables seleccionado
     * @param {boleano} chkVal - Bandera si esta activado el proceso de validación
     * @param {boleano} chkPrb - Bandera si esta activado el mapa de probabilidad
     * @param {boleano} chkApr - Bandera si esta activado el cálculo con a priori
     * @param {boleano} chkFec - Bandera si esta activado el cálculo con registros sin fecha
     * @param {integer} chkOcc - Número mínimo de ocurrencias en nj para ser considerado en los cálculos
     * @param {array} rango_fechas - Rango de fecha para realizar los cálculos
     */
    function _procesaValoresEnlace(sp_data, subgroups, chkVal, chkPrb, chkApr, chkFec, chkOcc, rango_fechas) {

        _VERBOSE ? console.log("_procesaValoresEnlace") : _VERBOSE;

        var spid = sp_data.spid;
        var discardedPoints = d3.map([]); // considerar arregle de puntos descartadas
        var computed_discarded_cells = d3.map([]); // considerar arregle de celdas descartadas
        var allowedPoints = d3.map([]); // considerar arregle de puntos permitidos
        var idreg = ["Estados"]; // Módulo por desarrollar
        var type_time = 0;
        var num_items = 0;

        $("#nom_sp").val(sp_data.label);

        _map_module_nicho.set_specieTarget(sp_data);

        if (chkFec) {
            $("#chkFecha").prop('checked', true);
            $("#lb_sfecha").text(_iTrans.prop('lb_si'));
        }
        else {
            $("#chkFecha").prop('checked', false);
            $("#lb_sfecha").text(_iTrans.prop('lb_no'));
        }

        if (chkVal != undefined) {

            $("#chkValidation").prop('checked', true);
            $("#sliderValidation").slider("enable");
            $("#sliderValidation").slider('value', chkVal);
            $("#labelValidation").text(chkVal + "%");

        }
        else {

            $("#chkValidation").prop('checked', false);
            $("#sliderValidation").slider({
                disabled: true
            });

        }

        if (chkPrb) {
            $("#chkMapaProb").prop('checked', true);
            $("#lb_mapa_prob").text(_iTrans.prop('lb_si'));
        }
        else {
            $("#chkMapaProb").prop('checked', false);
            $("#lb_mapa_prob").text(_iTrans.prop('lb_no'));
        }

        if (chkApr) {
            $("#chkApriori").prop('checked', true);
            $("#lb_do_apriori").text(_iTrans.prop('lb_si'));
        }
        else {
            $("#chkApriori").prop('checked', false);
            $("#lb_do_apriori").text(_iTrans.prop('lb_no'));
        }

        if (chkOcc) {
            $("#chkMinOcc").prop('checked', true);
            $("#occ_number").prop("disabled", false);
            $("#occ_number").val(chkOcc);

        }
        else {
            $("#chkMinOcc").prop('checked', false);
            $("#occ_number").prop("disabled", true);
            $("#occ_number").val(chkOcc);
        }

        if (rango_fechas != undefined) {

            $("#sliderFecha").slider('values', 0, rango_fechas[0]);
            $("#sliderFecha").slider('values', 1, rango_fechas[1]);

        }

        if (chkFec != undefined || rango_fechas != undefined) {

            _map_module_nicho.busca_especie_filtros(rango_fechas, chkFec);
        }
        else {
            _map_module_nicho.busca_especie(false);
        }

        _res_display_module_nicho.set_spid(spid);
        _res_display_module_nicho.set_idReg(idreg);

        _componente_fuente.setVarSelArray(subgroups);

        var groups = subgroups.slice();
        _componente_fuente.addUIItem(groups);

        _res_display_module_nicho.set_subGroups(subgroups);
        _res_display_module_nicho.set_typeBioclim(type_time);


        if (subgroups.length > 0) {
            // asegura que si el grupo de variables seleccionado tiene mas de un grupo taxonomico agregue el total
            subgroups.forEach(function(grupo) {
                if (grupo.value.length > 1) {
                    grupo.value.forEach(function(item) {
                        num_items++;
                    });
                }
            });
            // asegura que si existe mas de un grupo de variables, se calcule el total  de todos los grupos
            if (subgroups.length > 1) {
                num_items++;
            }
        }
        else {
            _module_toast.showToast_BottomCenter(_iTrans.prop('lb_error_variable'), "error");
            return;
        }

        _res_display_module_nicho.set_discardedPoints(discardedPoints);
        _res_display_module_nicho.set_discardedCellFilter(computed_discarded_cells);
        _res_display_module_nicho.set_allowedCells(allowedPoints);

        _module_toast.showToast_BottomCenter("Generando resultados a partir de link", "info");

    }


    // se ejecutan los modulos necesarios para iniciar el proceso de obteción de epsilon y score y visualización de tablas, histogramas y mapa
    $("#get_esc_ep").click(function() {

        _VERBOSE ? console.log("get_esc_ep") : _VERBOSE;
        var num_items = 0, spid, idreg, subgroups;

        $("#show_gen").css('visibility', 'visible');

        // Configuración de TEST no actualizada. No se puede utilizat hasta el momento. 23-05-2016
        if (_TEST) {
            // 58390 - panthera onca, 46920 - Lynx rufus
            _spid = 49405;
            idreg = ["Estados"];
            subgroups = [{value: ["Orden >> Artiodactyla", "Orden >> Carnivora"], type: 0, groupid: 1},
                {value: [{label: "Bioclim >> Temperatura media anual", level: 1, value: "bio01"}], type: 1, groupid: 1}
                // {label:"Bioclim >> Rango medio diurno", level:1, value:"bio02"}], type:1, groupid:1}, 
                // {value:[{label:"Bioclim >> Forma Isométrica", level:1, value:"bio03"}], type:1, groupid:2}
            ];
            num_items = 5;

        }
        else {

            if (_map_module_nicho.get_specieTarget()) {
                spid = _map_module_nicho.get_specieTarget().spid;
                _res_display_module_nicho.set_spid(spid);
                _VERBOSE ? console.log(spid) : _VERBOSE;
            }
            else {

                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_error_especie'), "error");

                return;
            }

            // agregar validación para estados
            idreg = _region_module_nicho.getRegionSelected();

            _res_display_module_nicho.set_idReg(idreg);

            subgroups = _componente_fuente.getVarSelArray();

            type_time = _componente_fuente.getTimeBioclim();

            _res_display_module_nicho.set_subGroups(subgroups);

            _res_display_module_nicho.set_typeBioclim(type_time);


            if (subgroups.length > 0) {

                // asegura que si el grupo de variables seleccionado tiene mas de un grupo taxonomico agregue el total
                subgroups.forEach(function(grupo) {

                    if (grupo.value.length > 1) {
                        grupo.value.forEach(function(item) {
                            num_items++;
                        });
                    }

                });

                // asegura que si existe mas de un grupo de variables, se calcule el total  de todos los grupos
                if (subgroups.length > 1) {
                    num_items++;
                }

            }
            else {
                _module_toast.showToast_BottomCenter(_iTrans.prop('lb_error_variable'), "error");

                return;
            }

        }

        if (idreg[0] == "Estados" || idreg[0] == "Ecoregiones") {

            // obtieniendo las ocurrencias de la especie y los elementos eliminados
            // _res_display_module_nicho.set_allowedPoints(_map_module_nicho.get_allowedPoints());
            _res_display_module_nicho.set_discardedPoints(_map_module_nicho.get_discardedPoints());
            // _res_display_module_nicho.set_discardedPointsFilter(_map_module_nicho.get_discardedPointsFilter());

            _res_display_module_nicho.set_discardedCellFilter(_map_module_nicho.get_discardedCellFilter());
            _res_display_module_nicho.set_allowedCells(_map_module_nicho.get_allowedCells());


            val_process = $("#chkValidation").is(':checked');
            min_occ = $("#chkMinOcc").is(':checked');
            mapa_prob = $("#chkMapaProb").is(':checked');

            var rango_fechas = $("#sliderFecha").slider("values");

            if (rango_fechas[0] == $("#sliderFecha").slider("option", "min") && rango_fechas[1] == $("#sliderFecha").slider("option", "max")) {
                rango_fechas = undefined;
            }

            var chkFecha = $("#chkFecha").is(':checked');

            slider_value = val_process ? $("#sliderValidation").slider("value") : 0;


            // Falta agregar la condición makesense. 
            // Cuando se realiza una consulta por region seleccioanda se verica que la especie objetivo se encuentre dentro de esta area
            _res_display_module_nicho.refreshData(num_items, val_process, slider_value, min_occ, mapa_prob, rango_fechas, chkFecha);

        }


    });


    /**
     * Inicializa las variables globales del modulo nicho e inicializa el modulo de internacionalización.
     *
     * @function startModule
     * @public
     * @memberof! module_nicho
     * 
     * @param {string} tipo_modulo - Identificador del módulo 0 para nicho y 1 para comunidad
     * @param {string} verbose - Bandera para desplegar modo verbose
     */
    function startModule(tipo_modulo, verbose) {

        _VERBOSE = verbose;

        _VERBOSE ? console.log("startModule") : _VERBOSE;
        _tipo_modulo = tipo_modulo;

        // Se cargan los archivos de idiomas y depsues son cargados los modulos subsecuentes
        _language_module_nicho = language_module(_VERBOSE);
        _language_module_nicho.startLanguageModule(this, _tipo_modulo);

    }


    /**
     * Método llamado después de que el módulo de internacionalización es configurado correctamente. Se inicializa el controlador y los módulos de mapa, tabla, histograma, región y variable.
     *
     * @function loadModules
     * @public
     * @memberof! module_nicho
     * 
     */
    function loadModules() {

        _VERBOSE ? console.log("loadModules") : _VERBOSE;

        _module_toast = toast_module(_VERBOSE);
        _module_toast.startToast();

        _histogram_module_nicho = histogram_module(_VERBOSE);
        _histogram_module_nicho.startHistogramModule();

        _iTrans = _language_module_nicho.getI18();

        _map_module_nicho = map_module(_url_geoserver, _workspace, _VERBOSE, _url_api);
        _map_module_nicho.startMap(_language_module_nicho, _tipo_modulo, _histogram_module_nicho);

        // un id es enviado para diferenciar el componente del grupo de variables en caso de que sea mas de uno (caso comunidad)
        _variable_module_nicho = variable_module(_VERBOSE, _url_api);
        _variable_module_nicho.startVar(0, _language_module_nicho, _tipo_modulo);

        var ids_comp_variables = ['fuente'];
        _componente_fuente = _variable_module_nicho.createSelectorComponent("variables", ids_comp_variables[0], "lb_panel_variables");


        _table_module = table_module(_VERBOSE);
        _table_module.startTableModule();


        _res_display_module_nicho = res_display_module(_VERBOSE, _url_api);
        // enlazando los modulos que tienen interacción en los procesos
        _res_display_module_nicho.startResDisplay(_map_module_nicho, _histogram_module_nicho, _table_module, _language_module_nicho, ids_comp_variables);

        _map_module_nicho.setDisplayModule(_res_display_module_nicho);


        // se envia url con direccion a servidor zacatuche
        _region_module_nicho = region_module(_url_api, _VERBOSE);
        _region_module_nicho.startRegion(_map_module_nicho, _language_module_nicho);

        _language_module_nicho.addModuleForLanguage(_res_display_module_nicho, _histogram_module_nicho, _map_module_nicho, _variable_module_nicho);

        _initializeComponents();

    }


    /**
     * Método setter para la variable que almacena la URL del servidor.
     *
     * @function setUrlApi
     * @public
     * @memberof! module_nicho
     * 
     * @param {string} url_api - URL del servidor
     */
    function setUrlApi(url_api) {
        _url_api = url_api
    }

    /**
     * Método setter para la variable que almacena la URL del cliente.
     *
     * @function setUrlFront
     * @public
     * @memberof! module_nicho
     * 
     * @param {string} url_front - URL del cliente
     */
    function setUrlFront(url_front) {
        _url_front = url_front
    }

    /**
     * Método setter para la variable que almacena la URL de nicho ecológico.
     *
     * @function setUrlNicho
     * @public
     * @memberof! module_nicho
     * 
     * @param {string} url_nicho - URL del cliente en nicho ecológico
     */
    function setUrlNicho(url_nicho) {
        _url_nicho = url_nicho
    }

    // retorna solamente un objeto con los miembros que son públicos.
    return {
        startModule: startModule,
        loadModules: loadModules,
        setUrlApi: setUrlApi,
        setUrlFront: setUrlFront,
        setUrlNicho: setUrlNicho
    };


})();


$(document).ready(function() {

    // verbose por default es true
    var verbose = false;

    // 0 local, 1 producción
    var ambiente = 1;
    // 0 nicho, 1 comunidad
    var modulo = 0;
    
    if ($.cookie("url_front")) {

        module_nicho.setUrlFront($.cookie("url_front"))
        module_nicho.setUrlApi($.cookie("url_api"))
        module_nicho.setUrlNicho($.cookie("url_nicho"));

    }
    else {
        if (ambiente === 0) {
            module_nicho.setUrlFront("http://localhost/species-front");
            module_nicho.setUrlApi("http://localhost:8080");
            module_nicho.setUrlNicho("http://localhost/species-front/geoportal_v0.1.html");
        }
        else {
//            module_nicho.setUrlFront("http://species.conabio.gob.mx/c3/charlie_dev");
//            module_nicho.setUrlApi("http://species.conabio.gob.mx/niche3");
//            module_nicho.setUrlNicho("http://species.conabio.gob.mx/c3/charlie_dev/species-front/geoportal_v0.1.html");
            
            module_nicho.setUrlFront("http://species.conabio.gob.mx");
            module_nicho.setUrlApi("http://species.conabio.gob.mx/niche3");
            module_nicho.setUrlNicho("http://species.conabio.gob.mx/geoportal_v0.1.html");
        }
    }

    module_nicho.startModule(modulo, verbose);

});