diff --git a/swad_system_config.c b/swad_system_config.c
new file mode 100644
index 000000000..404532ff6
--- /dev/null
+++ b/swad_system_config.c
@@ -0,0 +1,484 @@
+// swad_system_config.c: configuration of system
+
+/*
+ SWAD (Shared Workspace At a Distance),
+ is a web platform developed at the University of Granada (Spain),
+ and used to support university teaching.
+
+ This file is part of SWAD core.
+ Copyright (C) 1999-2020 Antonio Caņas Vargas
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+#define _GNU_SOURCE // For asprintf
+#include // For boolean type
+#include // For NULL
+#include // For asprintf
+#include // For free
+#include // For string functions
+
+#include "swad_box.h"
+#include "swad_config.h"
+#include "swad_course.h"
+#include "swad_database.h"
+#include "swad_form.h"
+#include "swad_help.h"
+#include "swad_hierarchy.h"
+#include "swad_hierarchy_config.h"
+#include "swad_HTML.h"
+#include "swad_role.h"
+#include "swad_system_config.h"
+
+/*****************************************************************************/
+/************** External global variables from others modules ****************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/***************************** Private constants *****************************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/******************************* Private types *******************************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/***************************** Private variables *****************************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/***************************** Private prototypes ****************************/
+/*****************************************************************************/
+
+static void SysCfg_Configuration (bool PrintView);
+static void SysCfg_PutIconToPrint (void);
+static bool SysCfg_GetIfMapIsAvailable (void);
+static void SysCfg_GetCoordAndZoom (struct Coordinates *Coord,unsigned *Zoom);
+static void SysCfg_Map (void);
+static void SysCfg_Platform (void);
+static void SysCfg_Shortcut (bool PrintView);
+static void SysCfg_QR (void);
+static void SysCfg_NumCtys (void);
+static void SysCfg_NumInss (void);
+static void SysCfg_NumCtrs (void);
+static void SysCfg_NumDegs (void);
+static void SysCfg_NumCrss (void);
+static void SysCfg_NumUsrsInCrss (Rol_Role_t Role);
+
+/*****************************************************************************/
+/***************** Show information of the current country *******************/
+/*****************************************************************************/
+
+void SysCfg_ShowConfiguration (void)
+ {
+ SysCfg_Configuration (false);
+
+ /***** Show help to enrol me *****/
+ Hlp_ShowHelpWhatWouldYouLikeToDo ();
+ }
+
+/*****************************************************************************/
+/***************** Print information of the current country ******************/
+/*****************************************************************************/
+
+void SysCfg_PrintConfiguration (void)
+ {
+ SysCfg_Configuration (true);
+ }
+
+/*****************************************************************************/
+/******************** Information of the current country *********************/
+/*****************************************************************************/
+
+static void SysCfg_Configuration (bool PrintView)
+ {
+ extern const char *Hlp_SYSTEM_Information;
+ bool MapIsAvailable;
+
+ /***** Begin box *****/
+ if (PrintView)
+ Box_BoxBegin (NULL,Cfg_PLATFORM_SHORT_NAME,NULL,
+ NULL,Box_NOT_CLOSABLE);
+ else
+ Box_BoxBegin (NULL,Cfg_PLATFORM_SHORT_NAME,SysCfg_PutIconToPrint,
+ Hlp_SYSTEM_Information,Box_NOT_CLOSABLE);
+
+ /**************************** Left part ***********************************/
+ HTM_DIV_Begin ("class=\"HIE_CFG_LEFT\"");
+
+ /***** Begin table *****/
+ HTM_TABLE_BeginWidePadding (2);
+
+ /***** Platform *****/
+ SysCfg_Platform ();
+
+ /***** Shortcut to the country *****/
+ SysCfg_Shortcut (PrintView);
+
+ if (PrintView)
+ /***** QR code with link to the country *****/
+ SysCfg_QR ();
+ else
+ {
+ /***** Number of countries,
+ number of institutions,
+ number of centres,
+ number of degrees,
+ number of courses *****/
+ SysCfg_NumCtys ();
+ SysCfg_NumInss ();
+ SysCfg_NumCtrs ();
+ SysCfg_NumDegs ();
+ SysCfg_NumCrss ();
+
+ /***** Number of users in courses of this country *****/
+ SysCfg_NumUsrsInCrss (Rol_TCH);
+ SysCfg_NumUsrsInCrss (Rol_NET);
+ SysCfg_NumUsrsInCrss (Rol_STD);
+ SysCfg_NumUsrsInCrss (Rol_UNK);
+ }
+
+ /***** End table *****/
+ HTM_TABLE_End ();
+
+ /***** End of left part *****/
+ HTM_DIV_End ();
+
+ /**************************** Right part **********************************/
+ /***** Check map *****/
+ MapIsAvailable = SysCfg_GetIfMapIsAvailable ();
+
+ if (MapIsAvailable)
+ {
+ HTM_DIV_Begin ("class=\"HIE_CFG_RIGHT\"");
+
+ /***** Country map *****/
+ SysCfg_Map ();
+
+ HTM_DIV_End ();
+ }
+
+ /***** End box *****/
+ Box_BoxEnd ();
+ }
+
+/*****************************************************************************/
+/************* Put icon to print the configuration of a country **************/
+/*****************************************************************************/
+
+static void SysCfg_PutIconToPrint (void)
+ {
+ Ico_PutContextualIconToPrint (ActPrnSysInf,NULL);
+ }
+
+/*****************************************************************************/
+/******************** Check if country map should be shown *******************/
+/*****************************************************************************/
+
+static bool SysCfg_GetIfMapIsAvailable (void)
+ {
+ /***** Get number of centres with both coordinates set
+ (coordinates 0, 0 means not set ==> don't show map) *****/
+ return
+ (unsigned) DB_QueryCOUNT ("can not get centres with coordinates",
+ "SELECT COUNT(*) FROM centres"
+ " WHERE centres.Latitude<>0"
+ " AND centres.Longitude<>0");
+ }
+
+/*****************************************************************************/
+/********* Get average coordinates of centres in current institution *********/
+/*****************************************************************************/
+
+static void SysCfg_GetCoordAndZoom (struct Coordinates *Coord,unsigned *Zoom)
+ {
+ char *Query;
+
+ /***** Get average coordinates of centres with both coordinates set
+ (coordinates 0, 0 means not set ==> don't show map) *****/
+ if (asprintf (&Query,
+ "SELECT AVG(Latitude)," // row[0]
+ "AVG(Longitude)," // row[1]
+ "GREATEST(MAX(Latitude)-MIN(Latitude),"
+ "MAX(Longitude)-MIN(Longitude))" // row[2]
+ " FROM centres"
+ " WHERE Latitude<>0"
+ " AND Longitude<>0") < 0)
+ Lay_NotEnoughMemoryExit ();
+ Map_GetCoordAndZoom (Coord,Zoom,Query);
+ free (Query);
+ }
+
+/*****************************************************************************/
+/****************************** Draw country map *****************************/
+/*****************************************************************************/
+
+#define SysCfg_MAP_CONTAINER_ID "cty_mapid"
+
+static void SysCfg_Map (void)
+ {
+ MYSQL_RES *mysql_res;
+ MYSQL_ROW row;
+ struct Coordinates CtyAvgCoord;
+ unsigned Zoom;
+ unsigned NumCtrs;
+ unsigned NumCtr;
+ struct Centre Ctr;
+ struct Instit Ins;
+
+ /***** Leaflet CSS *****/
+ Map_LeafletCSS ();
+
+ /***** Leaflet script *****/
+ Map_LeafletScript ();
+
+ /***** Container for the map *****/
+ HTM_DIV_Begin ("id=\"%s\"",SysCfg_MAP_CONTAINER_ID);
+ HTM_DIV_End ();
+
+ /***** Script to draw the map *****/
+ HTM_SCRIPT_Begin (NULL,NULL);
+
+ /* Let's create a map with pretty Mapbox Streets tiles */
+ SysCfg_GetCoordAndZoom (&CtyAvgCoord,&Zoom);
+ Map_CreateMap (SysCfg_MAP_CONTAINER_ID,&CtyAvgCoord,Zoom);
+
+ /* Add Mapbox Streets tile layer to our map */
+ Map_AddTileLayer ();
+
+ /* Get centres with coordinates */
+ NumCtrs = (unsigned) DB_QuerySELECT (&mysql_res,"can not get centres"
+ " with coordinates",
+ "SELECT CtrCod" // row[0]
+ " FROM centres"
+ " WHERE centres.Latitude<>0"
+ " AND centres.Longitude<>0");
+
+ /* Add a marker and a popup for each centre */
+ for (NumCtr = 0;
+ NumCtr < NumCtrs;
+ NumCtr++)
+ {
+ /* Get next centre */
+ row = mysql_fetch_row (mysql_res);
+
+ /* Get centre code (row[0]) */
+ Ctr.CtrCod = Str_ConvertStrCodToLongCod (row[0]);
+
+ /* Get data of centre */
+ Ctr_GetDataOfCentreByCod (&Ctr);
+
+ /* Get data of institution */
+ Ins.InsCod = Ctr.InsCod;
+ Ins_GetDataOfInstitutionByCod (&Ins);
+
+ /* Add marker */
+ Map_AddMarker (&Ctr.Coord);
+
+ /* Add popup */
+ Map_AddPopup (Ctr.ShrtName,Ins.ShrtName,
+ false); // Closed
+ }
+
+ /* Free structure that stores the query result */
+ DB_FreeMySQLResult (&mysql_res);
+
+ HTM_SCRIPT_End ();
+ }
+
+/*****************************************************************************/
+/****************** Show platform in country configuration *******************/
+/*****************************************************************************/
+
+static void SysCfg_Platform (void)
+ {
+ extern const char *Txt_Platform;
+
+ /***** Institution *****/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Platform);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT_N LB\"");
+ HTM_Txt (Cfg_PLATFORM_SHORT_NAME);
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/************** Show platform shortcut in system configuration ***************/
+/*****************************************************************************/
+
+static void SysCfg_Shortcut (bool PrintView)
+ {
+ HieCfg_Shortcut (PrintView,NULL,-1L);
+ }
+
+/*****************************************************************************/
+/***************** Show country QR in country configuration ******************/
+/*****************************************************************************/
+
+static void SysCfg_QR (void)
+ {
+ HieCfg_QR (NULL,-1L);
+ }
+
+/*****************************************************************************/
+/************ Show number of countries in system configuration ***************/
+/*****************************************************************************/
+
+static void SysCfg_NumCtys (void)
+ {
+ extern const char *Txt_Countries;
+
+ /***** Number of countries ******/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Countries);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"LB\"");
+ Frm_StartFormGoTo (ActSeeCty);
+ HTM_BUTTON_SUBMIT_Begin (Txt_Countries,"BT_LINK DAT",NULL);
+ HTM_Unsigned (Cty_GetNumCtysTotal ());
+ HTM_BUTTON_End ();
+ Frm_EndForm ();
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/*********** Show number of institutions in system configuration *************/
+/*****************************************************************************/
+
+static void SysCfg_NumInss (void)
+ {
+ extern const char *Txt_Institutions;
+
+ /***** Number of institutions ******/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Institutions);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT LB\"");
+ HTM_Unsigned (Ins_GetNumInssTotal ());
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/************** Show number of centres in system configuration ***************/
+/*****************************************************************************/
+
+static void SysCfg_NumCtrs (void)
+ {
+ extern const char *Txt_Centres;
+
+ /***** Number of centres *****/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Centres);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT LB\"");
+ HTM_Unsigned (Ctr_GetNumCtrsTotal ());
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/************* Show number of degrees in system configuration ****************/
+/*****************************************************************************/
+
+static void SysCfg_NumDegs (void)
+ {
+ extern const char *Txt_Degrees;
+
+ /***** Number of degrees *****/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Degrees);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT LB\"");
+ HTM_Unsigned (Deg_GetNumDegsTotal ());
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/************* Show number of courses in system configuration ****************/
+/*****************************************************************************/
+
+static void SysCfg_NumCrss (void)
+ {
+ extern const char *Txt_Courses;
+
+ /***** Number of courses *****/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,Txt_Courses);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT LB\"");
+ HTM_Unsigned (Crs_GetNumCrssTotal ());
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
+
+/*****************************************************************************/
+/***************** Number of users in courses of the system ******************/
+/*****************************************************************************/
+
+static void SysCfg_NumUsrsInCrss (Rol_Role_t Role)
+ {
+ extern const char *Txt_Users_in_courses;
+ extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
+
+ /***** Number of users in courses *****/
+ HTM_TR_Begin (NULL);
+
+ /* Label */
+ Frm_LabelColumn ("RT",NULL,
+ Role == Rol_UNK ? Txt_Users_in_courses :
+ Txt_ROLES_PLURAL_Abc[Role][Usr_SEX_UNKNOWN]);
+
+ /* Data */
+ HTM_TD_Begin ("class=\"DAT LB\"");
+ HTM_Unsigned (Usr_GetNumUsrsInCrss (Hie_SYS,-1L,
+ Role == Rol_UNK ? (1 << Rol_STD) |
+ (1 << Rol_NET) |
+ (1 << Rol_TCH) : // Any user
+ (1 << Role)));
+ HTM_TD_End ();
+
+ HTM_TR_End ();
+ }
diff --git a/swad_system_config.h b/swad_system_config.h
new file mode 100644
index 000000000..3be9d2064
--- /dev/null
+++ b/swad_system_config.h
@@ -0,0 +1,41 @@
+// swad_system_config.h: configuration of system
+
+#ifndef _SWAD_SYS_CFG
+#define _SWAD_SYS_CFG
+/*
+ SWAD (Shared Workspace At a Distance),
+ is a web platform developed at the University of Granada (Spain),
+ and used to support university teaching.
+
+ This file is part of SWAD core.
+ Copyright (C) 1999-2020 Antonio Caņas Vargas
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+/*****************************************************************************/
+/********************************* Headers ***********************************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/************************** Public types and constants ***********************/
+/*****************************************************************************/
+
+/*****************************************************************************/
+/****************************** Public prototypes ****************************/
+/*****************************************************************************/
+
+void SysCfg_ShowConfiguration (void);
+void SysCfg_PrintConfiguration (void);
+
+#endif